From 16ef709eb5ae5c9223bd3dbce0dd19c3e0b60b35 Mon Sep 17 00:00:00 2001 From: imi415 Date: Sat, 27 Aug 2022 22:17:11 +0800 Subject: [PATCH] Updated to new project structure. --- .gitignore | 6 +- .gitmodules | 3 + CMSIS/CMSIS.yml | 1860 - CMSIS/CMSIS_v2.yml | 2011 - CMSIS/Core/Include/cmsis_armcc.h | 894 - CMSIS/Core/Include/cmsis_armclang.h | 1444 - CMSIS/Core/Include/cmsis_armclang_ltm.h | 1891 - CMSIS/Core/Include/cmsis_compiler.h | 283 - CMSIS/Core/Include/cmsis_gcc.h | 2168 - CMSIS/Core/Include/cmsis_iccarm.h | 964 - CMSIS/Core/Include/cmsis_version.h | 39 - CMSIS/Core/Include/core_cm7.h | 2736 - CMSIS/Core/Include/mpu_armv7.h | 272 - CMSIS/DSP/CMSIS_DSP_Library_MIMXRT1052.cmake | 8 - CMSIS/DSP/Include/arm_common_tables.h | 378 - CMSIS/DSP/Include/arm_const_structs.h | 66 - CMSIS/DSP/Include/arm_math.h | 7361 -- CMSIS/DSP/Lib/GCC/libarm_cortexM7lfdp_math.a | Bin 5331020 -> 0 bytes .../BasicMathFunctions/BasicMathFunctions.c | 63 - .../Source/BasicMathFunctions/CMakeLists.txt | 16 - .../Source/BasicMathFunctions/arm_abs_f32.c | 146 - .../Source/BasicMathFunctions/arm_abs_q15.c | 132 - .../Source/BasicMathFunctions/arm_abs_q31.c | 132 - .../Source/BasicMathFunctions/arm_abs_q7.c | 134 - .../Source/BasicMathFunctions/arm_add_f32.c | 145 - .../Source/BasicMathFunctions/arm_add_q15.c | 126 - .../Source/BasicMathFunctions/arm_add_q31.c | 108 - .../Source/BasicMathFunctions/arm_add_q7.c | 109 - .../BasicMathFunctions/arm_dot_prod_f32.c | 163 - .../BasicMathFunctions/arm_dot_prod_q15.c | 120 - .../BasicMathFunctions/arm_dot_prod_q31.c | 115 - .../BasicMathFunctions/arm_dot_prod_q7.c | 139 - .../Source/BasicMathFunctions/arm_mult_f32.c | 148 - .../Source/BasicMathFunctions/arm_mult_q15.c | 143 - .../Source/BasicMathFunctions/arm_mult_q31.c | 119 - .../Source/BasicMathFunctions/arm_mult_q7.c | 119 - .../BasicMathFunctions/arm_negate_f32.c | 145 - .../BasicMathFunctions/arm_negate_q15.c | 126 - .../BasicMathFunctions/arm_negate_q31.c | 132 - .../Source/BasicMathFunctions/arm_negate_q7.c | 126 - .../BasicMathFunctions/arm_offset_f32.c | 147 - .../BasicMathFunctions/arm_offset_q15.c | 121 - .../BasicMathFunctions/arm_offset_q31.c | 128 - .../Source/BasicMathFunctions/arm_offset_q7.c | 116 - .../Source/BasicMathFunctions/arm_scale_f32.c | 159 - .../Source/BasicMathFunctions/arm_scale_q15.c | 144 - .../Source/BasicMathFunctions/arm_scale_q31.c | 191 - .../Source/BasicMathFunctions/arm_scale_q7.c | 129 - .../Source/BasicMathFunctions/arm_shift_q15.c | 201 - .../Source/BasicMathFunctions/arm_shift_q31.c | 181 - .../Source/BasicMathFunctions/arm_shift_q7.c | 175 - .../Source/BasicMathFunctions/arm_sub_f32.c | 148 - .../Source/BasicMathFunctions/arm_sub_q15.c | 126 - .../Source/BasicMathFunctions/arm_sub_q31.c | 108 - .../Source/BasicMathFunctions/arm_sub_q7.c | 109 - CMSIS/DSP/Source/CMakeLists.txt | 223 - CMSIS/DSP/Source/CommonTables/CMakeLists.txt | 31 - CMSIS/DSP/Source/CommonTables/CommonTables.c | 31 - .../Source/CommonTables/arm_common_tables.c | 57215 ---------------- .../Source/CommonTables/arm_const_structs.c | 486 - .../ComplexMathFunctions/CMakeLists.txt | 16 - .../ComplexMathFunctions.c | 46 - .../ComplexMathFunctions/arm_cmplx_conj_f32.c | 161 - .../ComplexMathFunctions/arm_cmplx_conj_q15.c | 157 - .../ComplexMathFunctions/arm_cmplx_conj_q31.c | 137 - .../arm_cmplx_dot_prod_f32.c | 233 - .../arm_cmplx_dot_prod_q15.c | 154 - .../arm_cmplx_dot_prod_q31.c | 153 - .../ComplexMathFunctions/arm_cmplx_mag_f32.c | 188 - .../ComplexMathFunctions/arm_cmplx_mag_q15.c | 162 - .../ComplexMathFunctions/arm_cmplx_mag_q31.c | 130 - .../arm_cmplx_mag_squared_f32.c | 184 - .../arm_cmplx_mag_squared_q15.c | 161 - .../arm_cmplx_mag_squared_q31.c | 129 - .../arm_cmplx_mult_cmplx_f32.c | 194 - .../arm_cmplx_mult_cmplx_q15.c | 136 - .../arm_cmplx_mult_cmplx_q31.c | 137 - .../arm_cmplx_mult_real_f32.c | 169 - .../arm_cmplx_mult_real_q15.c | 182 - .../arm_cmplx_mult_real_q31.c | 148 - .../Source/ControllerFunctions/CMakeLists.txt | 37 - .../ControllerFunctions/ControllerFunctions.c | 37 - .../ControllerFunctions/arm_pid_init_f32.c | 75 - .../ControllerFunctions/arm_pid_init_q15.c | 95 - .../ControllerFunctions/arm_pid_init_q31.c | 92 - .../ControllerFunctions/arm_pid_reset_f32.c | 54 - .../ControllerFunctions/arm_pid_reset_q15.c | 54 - .../ControllerFunctions/arm_pid_reset_q31.c | 54 - .../ControllerFunctions/arm_sin_cos_f32.c | 146 - .../ControllerFunctions/arm_sin_cos_q31.c | 110 - .../Source/FastMathFunctions/CMakeLists.txt | 51 - .../FastMathFunctions/FastMathFunctions.c | 37 - .../Source/FastMathFunctions/arm_cos_f32.c | 122 - .../Source/FastMathFunctions/arm_cos_q15.c | 84 - .../Source/FastMathFunctions/arm_cos_q31.c | 84 - .../Source/FastMathFunctions/arm_sin_f32.c | 122 - .../Source/FastMathFunctions/arm_sin_q15.c | 77 - .../Source/FastMathFunctions/arm_sin_q31.c | 77 - .../Source/FastMathFunctions/arm_sqrt_q15.c | 144 - .../Source/FastMathFunctions/arm_sqrt_q31.c | 144 - .../Source/FilteringFunctions/CMakeLists.txt | 128 - .../FilteringFunctions/FilteringFunctions.c | 127 - .../arm_biquad_cascade_df1_32x64_init_q31.c | 94 - .../arm_biquad_cascade_df1_32x64_q31.c | 458 - .../arm_biquad_cascade_df1_f32.c | 495 - .../arm_biquad_cascade_df1_fast_q15.c | 250 - .../arm_biquad_cascade_df1_fast_q31.c | 296 - .../arm_biquad_cascade_df1_init_f32.c | 91 - .../arm_biquad_cascade_df1_init_q15.c | 96 - .../arm_biquad_cascade_df1_init_q31.c | 95 - .../arm_biquad_cascade_df1_q15.c | 363 - .../arm_biquad_cascade_df1_q31.c | 247 - .../arm_biquad_cascade_df2T_f32.c | 523 - .../arm_biquad_cascade_df2T_f64.c | 443 - .../arm_biquad_cascade_df2T_init_f32.c | 211 - .../arm_biquad_cascade_df2T_init_f64.c | 86 - .../arm_biquad_cascade_stereo_df2T_f32.c | 285 - .../arm_biquad_cascade_stereo_df2T_init_f32.c | 86 - .../Source/FilteringFunctions/arm_conv_f32.c | 816 - .../arm_conv_fast_opt_q15.c | 366 - .../FilteringFunctions/arm_conv_fast_q15.c | 663 - .../FilteringFunctions/arm_conv_fast_q31.c | 558 - .../FilteringFunctions/arm_conv_opt_q15.c | 362 - .../FilteringFunctions/arm_conv_opt_q7.c | 360 - .../FilteringFunctions/arm_conv_partial_f32.c | 676 - .../arm_conv_partial_fast_opt_q15.c | 387 - .../arm_conv_partial_fast_q15.c | 700 - .../arm_conv_partial_fast_q31.c | 618 - .../arm_conv_partial_opt_q15.c | 386 - .../arm_conv_partial_opt_q7.c | 390 - .../FilteringFunctions/arm_conv_partial_q15.c | 752 - .../FilteringFunctions/arm_conv_partial_q31.c | 634 - .../FilteringFunctions/arm_conv_partial_q7.c | 753 - .../Source/FilteringFunctions/arm_conv_q15.c | 696 - .../Source/FilteringFunctions/arm_conv_q31.c | 581 - .../Source/FilteringFunctions/arm_conv_q7.c | 700 - .../FilteringFunctions/arm_correlate_f32.c | 893 - .../arm_correlate_fast_opt_q15.c | 345 - .../arm_correlate_fast_q15.c | 614 - .../arm_correlate_fast_q31.c | 601 - .../arm_correlate_opt_q15.c | 341 - .../FilteringFunctions/arm_correlate_opt_q7.c | 388 - .../FilteringFunctions/arm_correlate_q15.c | 696 - .../FilteringFunctions/arm_correlate_q31.c | 682 - .../FilteringFunctions/arm_correlate_q7.c | 800 - .../FilteringFunctions/arm_fir_decimate_f32.c | 703 - .../arm_fir_decimate_fast_q15.c | 595 - .../arm_fir_decimate_fast_q31.c | 390 - .../arm_fir_decimate_init_f32.c | 105 - .../arm_fir_decimate_init_q15.c | 106 - .../arm_fir_decimate_init_q31.c | 105 - .../FilteringFunctions/arm_fir_decimate_q15.c | 595 - .../FilteringFunctions/arm_fir_decimate_q31.c | 387 - .../Source/FilteringFunctions/arm_fir_f32.c | 715 - .../FilteringFunctions/arm_fir_fast_q15.c | 332 - .../FilteringFunctions/arm_fir_fast_q31.c | 324 - .../FilteringFunctions/arm_fir_init_f32.c | 81 - .../FilteringFunctions/arm_fir_init_q15.c | 137 - .../FilteringFunctions/arm_fir_init_q31.c | 80 - .../FilteringFunctions/arm_fir_init_q7.c | 81 - .../arm_fir_interpolate_f32.c | 914 - .../arm_fir_interpolate_init_f32.c | 106 - .../arm_fir_interpolate_init_q15.c | 106 - .../arm_fir_interpolate_init_q31.c | 105 - .../arm_fir_interpolate_q15.c | 479 - .../arm_fir_interpolate_q31.c | 481 - .../FilteringFunctions/arm_fir_lattice_f32.c | 453 - .../arm_fir_lattice_init_f32.c | 70 - .../arm_fir_lattice_init_q15.c | 70 - .../arm_fir_lattice_init_q31.c | 70 - .../FilteringFunctions/arm_fir_lattice_q15.c | 506 - .../FilteringFunctions/arm_fir_lattice_q31.c | 505 - .../Source/FilteringFunctions/arm_fir_q15.c | 332 - .../Source/FilteringFunctions/arm_fir_q31.c | 288 - .../Source/FilteringFunctions/arm_fir_q7.c | 323 - .../FilteringFunctions/arm_fir_sparse_f32.c | 341 - .../arm_fir_sparse_init_f32.c | 93 - .../arm_fir_sparse_init_q15.c | 93 - .../arm_fir_sparse_init_q31.c | 92 - .../arm_fir_sparse_init_q7.c | 93 - .../FilteringFunctions/arm_fir_sparse_q15.c | 341 - .../FilteringFunctions/arm_fir_sparse_q31.c | 357 - .../FilteringFunctions/arm_fir_sparse_q7.c | 341 - .../FilteringFunctions/arm_iir_lattice_f32.c | 354 - .../arm_iir_lattice_init_f32.c | 77 - .../arm_iir_lattice_init_q15.c | 77 - .../arm_iir_lattice_init_q31.c | 77 - .../FilteringFunctions/arm_iir_lattice_q15.c | 396 - .../FilteringFunctions/arm_iir_lattice_q31.c | 356 - .../Source/FilteringFunctions/arm_lms_f32.c | 533 - .../FilteringFunctions/arm_lms_init_f32.c | 81 - .../FilteringFunctions/arm_lms_init_q15.c | 92 - .../FilteringFunctions/arm_lms_init_q31.c | 92 - .../FilteringFunctions/arm_lms_norm_f32.c | 564 - .../arm_lms_norm_init_f32.c | 92 - .../arm_lms_norm_init_q15.c | 98 - .../arm_lms_norm_init_q31.c | 97 - .../FilteringFunctions/arm_lms_norm_q15.c | 297 - .../FilteringFunctions/arm_lms_norm_q31.c | 311 - .../Source/FilteringFunctions/arm_lms_q15.c | 262 - .../Source/FilteringFunctions/arm_lms_q31.c | 283 - .../DSP/Source/MatrixFunctions/CMakeLists.txt | 16 - .../Source/MatrixFunctions/MatrixFunctions.c | 53 - .../Source/MatrixFunctions/arm_mat_add_f32.c | 232 - .../Source/MatrixFunctions/arm_mat_add_q15.c | 149 - .../Source/MatrixFunctions/arm_mat_add_q31.c | 139 - .../MatrixFunctions/arm_mat_cmplx_mult_f32.c | 631 - .../MatrixFunctions/arm_mat_cmplx_mult_q15.c | 340 - .../MatrixFunctions/arm_mat_cmplx_mult_q31.c | 283 - .../Source/MatrixFunctions/arm_mat_init_f32.c | 76 - .../Source/MatrixFunctions/arm_mat_init_q15.c | 67 - .../Source/MatrixFunctions/arm_mat_init_q31.c | 72 - .../MatrixFunctions/arm_mat_inverse_f32.c | 1127 - .../MatrixFunctions/arm_mat_inverse_f64.c | 673 - .../Source/MatrixFunctions/arm_mat_mult_f32.c | 534 - .../MatrixFunctions/arm_mat_mult_fast_q15.c | 483 - .../MatrixFunctions/arm_mat_mult_fast_q31.c | 374 - .../Source/MatrixFunctions/arm_mat_mult_q15.c | 357 - .../Source/MatrixFunctions/arm_mat_mult_q31.c | 196 - .../MatrixFunctions/arm_mat_scale_f32.c | 221 - .../MatrixFunctions/arm_mat_scale_q15.c | 170 - .../MatrixFunctions/arm_mat_scale_q31.c | 164 - .../Source/MatrixFunctions/arm_mat_sub_f32.c | 226 - .../Source/MatrixFunctions/arm_mat_sub_q15.c | 144 - .../Source/MatrixFunctions/arm_mat_sub_q31.c | 139 - .../MatrixFunctions/arm_mat_trans_f32.c | 284 - .../MatrixFunctions/arm_mat_trans_q15.c | 182 - .../MatrixFunctions/arm_mat_trans_q31.c | 146 - .../Source/StatisticsFunctions/CMakeLists.txt | 16 - .../StatisticsFunctions/StatisticsFunctions.c | 53 - .../Source/StatisticsFunctions/arm_max_f32.c | 271 - .../Source/StatisticsFunctions/arm_max_q15.c | 148 - .../Source/StatisticsFunctions/arm_max_q31.c | 148 - .../Source/StatisticsFunctions/arm_max_q7.c | 148 - .../Source/StatisticsFunctions/arm_mean_f32.c | 166 - .../Source/StatisticsFunctions/arm_mean_q15.c | 114 - .../Source/StatisticsFunctions/arm_mean_q31.c | 110 - .../Source/StatisticsFunctions/arm_mean_q7.c | 112 - .../Source/StatisticsFunctions/arm_min_f32.c | 268 - .../Source/StatisticsFunctions/arm_min_q15.c | 149 - .../Source/StatisticsFunctions/arm_min_q31.c | 149 - .../Source/StatisticsFunctions/arm_min_q7.c | 149 - .../StatisticsFunctions/arm_power_f32.c | 175 - .../StatisticsFunctions/arm_power_q15.c | 132 - .../StatisticsFunctions/arm_power_q31.c | 121 - .../Source/StatisticsFunctions/arm_power_q7.c | 136 - .../Source/StatisticsFunctions/arm_rms_f32.c | 176 - .../Source/StatisticsFunctions/arm_rms_q15.c | 134 - .../Source/StatisticsFunctions/arm_rms_q31.c | 124 - .../Source/StatisticsFunctions/arm_std_f32.c | 188 - .../Source/StatisticsFunctions/arm_std_q15.c | 161 - .../Source/StatisticsFunctions/arm_std_q31.c | 147 - .../Source/StatisticsFunctions/arm_var_f32.c | 234 - .../Source/StatisticsFunctions/arm_var_q15.c | 164 - .../Source/StatisticsFunctions/arm_var_q31.c | 147 - .../Source/SupportFunctions/CMakeLists.txt | 16 - .../SupportFunctions/SupportFunctions.c | 48 - .../Source/SupportFunctions/arm_copy_f32.c | 152 - .../Source/SupportFunctions/arm_copy_q15.c | 96 - .../Source/SupportFunctions/arm_copy_q31.c | 98 - .../DSP/Source/SupportFunctions/arm_copy_q7.c | 95 - .../Source/SupportFunctions/arm_fill_f32.c | 151 - .../Source/SupportFunctions/arm_fill_q15.c | 100 - .../Source/SupportFunctions/arm_fill_q31.c | 98 - .../DSP/Source/SupportFunctions/arm_fill_q7.c | 99 - .../SupportFunctions/arm_float_to_q15.c | 244 - .../SupportFunctions/arm_float_to_q31.c | 252 - .../Source/SupportFunctions/arm_float_to_q7.c | 253 - .../SupportFunctions/arm_q15_to_float.c | 166 - .../Source/SupportFunctions/arm_q15_to_q31.c | 138 - .../Source/SupportFunctions/arm_q15_to_q7.c | 146 - .../SupportFunctions/arm_q31_to_float.c | 159 - .../Source/SupportFunctions/arm_q31_to_q15.c | 134 - .../Source/SupportFunctions/arm_q31_to_q7.c | 110 - .../Source/SupportFunctions/arm_q7_to_float.c | 179 - .../Source/SupportFunctions/arm_q7_to_q15.c | 143 - .../Source/SupportFunctions/arm_q7_to_q31.c | 121 - .../Source/TransformFunctions/CMakeLists.txt | 116 - .../TransformFunctions/TransformFunctions.c | 60 - .../TransformFunctions/arm_bitreversal.c | 229 - .../TransformFunctions/arm_bitreversal2.S | 216 - .../TransformFunctions/arm_bitreversal2.c | 99 - .../Source/TransformFunctions/arm_cfft_f32.c | 629 - .../Source/TransformFunctions/arm_cfft_q15.c | 332 - .../Source/TransformFunctions/arm_cfft_q31.c | 254 - .../TransformFunctions/arm_cfft_radix2_f32.c | 470 - .../arm_cfft_radix2_init_f32.c | 197 - .../arm_cfft_radix2_init_q15.c | 182 - .../arm_cfft_radix2_init_q31.c | 179 - .../TransformFunctions/arm_cfft_radix2_q15.c | 689 - .../TransformFunctions/arm_cfft_radix2_q31.c | 337 - .../TransformFunctions/arm_cfft_radix4_f32.c | 1200 - .../arm_cfft_radix4_init_f32.c | 156 - .../arm_cfft_radix4_init_q15.c | 145 - .../arm_cfft_radix4_init_q31.c | 141 - .../TransformFunctions/arm_cfft_radix4_q15.c | 1809 - .../TransformFunctions/arm_cfft_radix4_q31.c | 827 - .../TransformFunctions/arm_cfft_radix8_f32.c | 285 - .../Source/TransformFunctions/arm_dct4_f32.c | 448 - .../TransformFunctions/arm_dct4_init_f32.c | 131 - .../TransformFunctions/arm_dct4_init_q15.c | 130 - .../TransformFunctions/arm_dct4_init_q31.c | 130 - .../Source/TransformFunctions/arm_dct4_q15.c | 381 - .../Source/TransformFunctions/arm_dct4_q31.c | 383 - .../Source/TransformFunctions/arm_rfft_f32.c | 309 - .../TransformFunctions/arm_rfft_fast_f32.c | 320 - .../arm_rfft_fast_init_f32.c | 344 - .../TransformFunctions/arm_rfft_init_f32.c | 139 - .../TransformFunctions/arm_rfft_init_q15.c | 158 - .../TransformFunctions/arm_rfft_init_q31.c | 160 - .../Source/TransformFunctions/arm_rfft_q15.c | 380 - .../Source/TransformFunctions/arm_rfft_q31.c | 292 - CMSIS/Driver/DriverTemplates/Driver_CAN.c | 321 - CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c | 228 - CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c | 127 - CMSIS/Driver/DriverTemplates/Driver_Flash.c | 137 - CMSIS/Driver/DriverTemplates/Driver_I2C.c | 148 - CMSIS/Driver/DriverTemplates/Driver_MCI.c | 219 - CMSIS/Driver/DriverTemplates/Driver_SAI.c | 125 - CMSIS/Driver/DriverTemplates/Driver_SPI.c | 151 - CMSIS/Driver/DriverTemplates/Driver_Storage.c | 115 - CMSIS/Driver/DriverTemplates/Driver_USART.c | 150 - CMSIS/Driver/DriverTemplates/Driver_USBD.c | 161 - CMSIS/Driver/DriverTemplates/Driver_USBH.c | 225 - ...SIS_Driver_Include_Common_MIMXRT1052.cmake | 8 - ...iver_Include_Ethernet_MAC_MIMXRT1052.cmake | 10 - ...S_Driver_Include_Ethernet_MIMXRT1052.cmake | 10 - ...iver_Include_Ethernet_PHY_MIMXRT1052.cmake | 10 - .../CMSIS_Driver_Include_I2C_MIMXRT1052.cmake | 10 - .../CMSIS_Driver_Include_SPI_MIMXRT1052.cmake | 10 - ...MSIS_Driver_Include_USART_MIMXRT1052.cmake | 10 - CMSIS/Driver/Include/Driver_CAN.h | 382 - CMSIS/Driver/Include/Driver_Common.h | 69 - CMSIS/Driver/Include/Driver_ETH.h | 85 - CMSIS/Driver/Include/Driver_ETH_MAC.h | 308 - CMSIS/Driver/Include/Driver_ETH_PHY.h | 141 - CMSIS/Driver/Include/Driver_Flash.h | 207 - CMSIS/Driver/Include/Driver_GPIO.h | 81 - CMSIS/Driver/Include/Driver_I2C.h | 217 - CMSIS/Driver/Include/Driver_MCI.h | 360 - CMSIS/Driver/Include/Driver_NAND.h | 420 - CMSIS/Driver/Include/Driver_SAI.h | 308 - CMSIS/Driver/Include/Driver_SPI.h | 247 - CMSIS/Driver/Include/Driver_Storage.h | 419 - CMSIS/Driver/Include/Driver_USART.h | 341 - CMSIS/Driver/Include/Driver_USB.h | 92 - CMSIS/Driver/Include/Driver_USBD.h | 273 - CMSIS/Driver/Include/Driver_USBH.h | 417 - CMSIS/Driver/Include/Driver_WiFi.h | 659 - CMSIS/LICENSE.txt | 201 - CMSIS/RTOS2/Include/cmsis_os2.h | 756 - CMSIS/RTOS2/Include/os_tick.h | 71 - CMakeLists.txt | 365 +- LICENSE | 7 - MIMXRT1052xxxxB.mex | 837 + README.md | 6 - SDK | 1 + arm-none-eabi.cmake | 7 +- board/board.c | 69 +- board/board.h | 76 +- board/clock_config.c | 875 +- board/clock_config.h | 281 +- board/dcd.c | 45 + board/dcd.h | 25 + board/peripherals.c | 64 +- board/peripherals.h | 13 +- board/pin_mux.c | 560 +- board/pin_mux.h | 100 +- devices/MIMXRT1052/MIMXRT1052.h | 52543 -------------- devices/MIMXRT1052/MIMXRT1052_features.h | 744 - devices/MIMXRT1052/drivers/fsl_adc.c | 395 - devices/MIMXRT1052/drivers/fsl_adc.h | 427 - devices/MIMXRT1052/drivers/fsl_adc_etc.c | 464 - devices/MIMXRT1052/drivers/fsl_adc_etc.h | 368 - devices/MIMXRT1052/drivers/fsl_aipstz.c | 51 - devices/MIMXRT1052/drivers/fsl_aipstz.h | 134 - devices/MIMXRT1052/drivers/fsl_aoi.c | 214 - devices/MIMXRT1052/drivers/fsl_aoi.h | 186 - devices/MIMXRT1052/drivers/fsl_bee.c | 303 - devices/MIMXRT1052/drivers/fsl_bee.h | 254 - devices/MIMXRT1052/drivers/fsl_cache.c | 602 - devices/MIMXRT1052/drivers/fsl_cache.h | 457 - devices/MIMXRT1052/drivers/fsl_clock.c | 1535 - devices/MIMXRT1052/drivers/fsl_clock.h | 1759 - devices/MIMXRT1052/drivers/fsl_cmp.c | 371 - devices/MIMXRT1052/drivers/fsl_cmp.h | 321 - devices/MIMXRT1052/drivers/fsl_common.c | 83 - devices/MIMXRT1052/drivers/fsl_common.h | 292 - devices/MIMXRT1052/drivers/fsl_common_arm.c | 233 - devices/MIMXRT1052/drivers/fsl_common_arm.h | 660 - devices/MIMXRT1052/drivers/fsl_csi.c | 1417 - devices/MIMXRT1052/drivers/fsl_csi.h | 746 - devices/MIMXRT1052/drivers/fsl_dcdc.c | 920 - devices/MIMXRT1052/drivers/fsl_dcdc.h | 760 - devices/MIMXRT1052/drivers/fsl_dcp.c | 1461 - devices/MIMXRT1052/drivers/fsl_dcp.h | 580 - devices/MIMXRT1052/drivers/fsl_dmamux.c | 91 - devices/MIMXRT1052/drivers/fsl_dmamux.h | 189 - devices/MIMXRT1052/drivers/fsl_edma.c | 2803 - devices/MIMXRT1052/drivers/fsl_edma.h | 1018 - devices/MIMXRT1052/drivers/fsl_elcdif.c | 388 - devices/MIMXRT1052/drivers/fsl_elcdif.h | 765 - devices/MIMXRT1052/drivers/fsl_enc.c | 593 - devices/MIMXRT1052/drivers/fsl_enc.h | 458 - devices/MIMXRT1052/drivers/fsl_enet.c | 3934 -- devices/MIMXRT1052/drivers/fsl_enet.h | 1993 - devices/MIMXRT1052/drivers/fsl_ewm.c | 140 - devices/MIMXRT1052/drivers/fsl_ewm.h | 218 - devices/MIMXRT1052/drivers/fsl_flexcan.c | 4670 -- devices/MIMXRT1052/drivers/fsl_flexcan.h | 2194 - devices/MIMXRT1052/drivers/fsl_flexio.c | 433 - devices/MIMXRT1052/drivers/fsl_flexio.h | 700 - .../MIMXRT1052/drivers/fsl_flexio_camera.c | 215 - .../MIMXRT1052/drivers/fsl_flexio_camera.h | 230 - .../drivers/fsl_flexio_camera_edma.c | 248 - .../drivers/fsl_flexio_camera_edma.h | 130 - .../drivers/fsl_flexio_i2c_master.c | 1260 - .../drivers/fsl_flexio_i2c_master.h | 485 - devices/MIMXRT1052/drivers/fsl_flexio_i2s.c | 903 - devices/MIMXRT1052/drivers/fsl_flexio_i2s.h | 560 - .../MIMXRT1052/drivers/fsl_flexio_i2s_edma.c | 445 - .../MIMXRT1052/drivers/fsl_flexio_i2s_edma.h | 201 - .../MIMXRT1052/drivers/fsl_flexio_mculcd.c | 1295 - .../MIMXRT1052/drivers/fsl_flexio_mculcd.h | 685 - .../drivers/fsl_flexio_mculcd_edma.c | 564 - .../drivers/fsl_flexio_mculcd_edma.h | 153 - devices/MIMXRT1052/drivers/fsl_flexio_spi.c | 1330 - devices/MIMXRT1052/drivers/fsl_flexio_spi.h | 702 - .../MIMXRT1052/drivers/fsl_flexio_spi_edma.c | 474 - .../MIMXRT1052/drivers/fsl_flexio_spi_edma.h | 207 - devices/MIMXRT1052/drivers/fsl_flexio_uart.c | 1009 - devices/MIMXRT1052/drivers/fsl_flexio_uart.h | 581 - .../MIMXRT1052/drivers/fsl_flexio_uart_edma.c | 407 - .../MIMXRT1052/drivers/fsl_flexio_uart_edma.h | 178 - devices/MIMXRT1052/drivers/fsl_flexram.c | 374 - devices/MIMXRT1052/drivers/fsl_flexram.h | 477 - .../MIMXRT1052/drivers/fsl_flexram_allocate.c | 86 - .../MIMXRT1052/drivers/fsl_flexram_allocate.h | 87 - devices/MIMXRT1052/drivers/fsl_flexspi.c | 1157 - devices/MIMXRT1052/drivers/fsl_flexspi.h | 864 - devices/MIMXRT1052/drivers/fsl_flexspi_edma.c | 364 - devices/MIMXRT1052/drivers/fsl_flexspi_edma.h | 148 - devices/MIMXRT1052/drivers/fsl_gpc.c | 103 - devices/MIMXRT1052/drivers/fsl_gpc.h | 231 - devices/MIMXRT1052/drivers/fsl_gpio.c | 179 - devices/MIMXRT1052/drivers/fsl_gpio.h | 344 - devices/MIMXRT1052/drivers/fsl_gpt.c | 127 - devices/MIMXRT1052/drivers/fsl_gpt.h | 509 - devices/MIMXRT1052/drivers/fsl_iomuxc.h | 1242 - devices/MIMXRT1052/drivers/fsl_kpp.c | 203 - devices/MIMXRT1052/drivers/fsl_kpp.h | 180 - devices/MIMXRT1052/drivers/fsl_lpi2c.c | 2433 - devices/MIMXRT1052/drivers/fsl_lpi2c.h | 1318 - devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c | 612 - devices/MIMXRT1052/drivers/fsl_lpi2c_edma.h | 158 - .../MIMXRT1052/drivers/fsl_lpi2c_freertos.c | 125 - .../MIMXRT1052/drivers/fsl_lpi2c_freertos.h | 107 - devices/MIMXRT1052/drivers/fsl_lpspi.c | 2284 - devices/MIMXRT1052/drivers/fsl_lpspi.h | 1156 - devices/MIMXRT1052/drivers/fsl_lpspi_edma.c | 1052 - devices/MIMXRT1052/drivers/fsl_lpspi_edma.h | 301 - .../MIMXRT1052/drivers/fsl_lpspi_freertos.c | 127 - .../MIMXRT1052/drivers/fsl_lpspi_freertos.h | 107 - devices/MIMXRT1052/drivers/fsl_lpuart.c | 2259 - devices/MIMXRT1052/drivers/fsl_lpuart.h | 1062 - devices/MIMXRT1052/drivers/fsl_lpuart_edma.c | 479 - devices/MIMXRT1052/drivers/fsl_lpuart_edma.h | 184 - .../MIMXRT1052/drivers/fsl_lpuart_freertos.c | 386 - .../MIMXRT1052/drivers/fsl_lpuart_freertos.h | 155 - devices/MIMXRT1052/drivers/fsl_nic301.h | 308 - devices/MIMXRT1052/drivers/fsl_ocotp.c | 406 - devices/MIMXRT1052/drivers/fsl_ocotp.h | 211 - devices/MIMXRT1052/drivers/fsl_pit.c | 146 - devices/MIMXRT1052/drivers/fsl_pit.h | 334 - devices/MIMXRT1052/drivers/fsl_pmu.c | 55 - devices/MIMXRT1052/drivers/fsl_pmu.h | 671 - devices/MIMXRT1052/drivers/fsl_pwm.c | 935 - devices/MIMXRT1052/drivers/fsl_pwm.h | 987 - devices/MIMXRT1052/drivers/fsl_pxp.c | 1048 - devices/MIMXRT1052/drivers/fsl_pxp.h | 1458 - devices/MIMXRT1052/drivers/fsl_qtmr.c | 612 - devices/MIMXRT1052/drivers/fsl_qtmr.h | 439 - devices/MIMXRT1052/drivers/fsl_romapi.c | 162 - devices/MIMXRT1052/drivers/fsl_romapi.h | 565 - devices/MIMXRT1052/drivers/fsl_rtwdog.c | 148 - devices/MIMXRT1052/drivers/fsl_rtwdog.h | 425 - devices/MIMXRT1052/drivers/fsl_sai.c | 3818 -- devices/MIMXRT1052/drivers/fsl_sai.h | 1586 - devices/MIMXRT1052/drivers/fsl_sai_edma.c | 738 - devices/MIMXRT1052/drivers/fsl_sai_edma.h | 286 - devices/MIMXRT1052/drivers/fsl_semc.c | 1357 - devices/MIMXRT1052/drivers/fsl_semc.h | 912 - devices/MIMXRT1052/drivers/fsl_snvs_hp.c | 573 - devices/MIMXRT1052/drivers/fsl_snvs_hp.h | 649 - devices/MIMXRT1052/drivers/fsl_snvs_lp.c | 1359 - devices/MIMXRT1052/drivers/fsl_snvs_lp.h | 721 - devices/MIMXRT1052/drivers/fsl_spdif.c | 849 - devices/MIMXRT1052/drivers/fsl_spdif.h | 753 - devices/MIMXRT1052/drivers/fsl_spdif_edma.c | 598 - devices/MIMXRT1052/drivers/fsl_spdif_edma.h | 192 - devices/MIMXRT1052/drivers/fsl_src.c | 49 - devices/MIMXRT1052/drivers/fsl_src.h | 602 - devices/MIMXRT1052/drivers/fsl_tempmon.c | 198 - devices/MIMXRT1052/drivers/fsl_tempmon.h | 126 - devices/MIMXRT1052/drivers/fsl_trng.c | 1945 - devices/MIMXRT1052/drivers/fsl_trng.h | 235 - devices/MIMXRT1052/drivers/fsl_tsc.c | 260 - devices/MIMXRT1052/drivers/fsl_tsc.h | 524 - devices/MIMXRT1052/drivers/fsl_usdhc.c | 2480 - devices/MIMXRT1052/drivers/fsl_usdhc.h | 1701 - devices/MIMXRT1052/drivers/fsl_wdog.c | 214 - devices/MIMXRT1052/drivers/fsl_wdog.h | 305 - devices/MIMXRT1052/drivers/fsl_xbara.c | 229 - devices/MIMXRT1052/drivers/fsl_xbara.h | 183 - devices/MIMXRT1052/drivers/fsl_xbarb.c | 126 - devices/MIMXRT1052/drivers/fsl_xbarb.h | 82 - devices/MIMXRT1052/fsl_device_registers.h | 36 - .../gcc/MIMXRT1052xxxxx_flexspi_nor.ld | 271 - .../gcc/MIMXRT1052xxxxx_flexspi_nor_sdram.ld | 274 - devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld | 225 - .../MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld | 228 - .../gcc/MIMXRT1052xxxxx_sdram_txt.ld | 241 - devices/MIMXRT1052/gcc/startup_MIMXRT1052.S | 1077 - devices/MIMXRT1052/system_MIMXRT1052.c | 249 - devices/MIMXRT1052/system_MIMXRT1052.h | 129 - .../debug_console/fsl_debug_console.c | 1356 - .../debug_console/fsl_debug_console.h | 290 - .../debug_console/fsl_debug_console_conf.h | 160 - .../utilities/debug_console_lite/fsl_assert.c | 50 - .../debug_console_lite/fsl_debug_console.c | 1877 - .../debug_console_lite/fsl_debug_console.h | 224 - devices/MIMXRT1052/utilities/fsl_assert.c | 50 - devices/MIMXRT1052/utilities/fsl_notifier.c | 209 - devices/MIMXRT1052/utilities/fsl_notifier.h | 237 - devices/MIMXRT1052/utilities/fsl_sbrk.c | 53 - devices/MIMXRT1052/utilities/fsl_shell.c | 1070 - devices/MIMXRT1052/utilities/fsl_shell.h | 292 - devices/MIMXRT1052/utilities/str/fsl_str.c | 1554 - devices/MIMXRT1052/utilities/str/fsl_str.h | 66 - devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c | 49 - devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.h | 117 - {components => lib}/.gitkeep | 0 source/main.c | 19 - src/main.c | 29 + xip/fire_rt1052_pro_flexspi_nor_config.c | 66 + xip/fire_rt1052_pro_flexspi_nor_config.h | 267 + 546 files changed, 3316 insertions(+), 325949 deletions(-) create mode 100644 .gitmodules delete mode 100644 CMSIS/CMSIS.yml delete mode 100644 CMSIS/CMSIS_v2.yml delete mode 100644 CMSIS/Core/Include/cmsis_armcc.h delete mode 100644 CMSIS/Core/Include/cmsis_armclang.h delete mode 100644 CMSIS/Core/Include/cmsis_armclang_ltm.h delete mode 100644 CMSIS/Core/Include/cmsis_compiler.h delete mode 100644 CMSIS/Core/Include/cmsis_gcc.h delete mode 100644 CMSIS/Core/Include/cmsis_iccarm.h delete mode 100644 CMSIS/Core/Include/cmsis_version.h delete mode 100644 CMSIS/Core/Include/core_cm7.h delete mode 100644 CMSIS/Core/Include/mpu_armv7.h delete mode 100644 CMSIS/DSP/CMSIS_DSP_Library_MIMXRT1052.cmake delete mode 100644 CMSIS/DSP/Include/arm_common_tables.h delete mode 100644 CMSIS/DSP/Include/arm_const_structs.h delete mode 100644 CMSIS/DSP/Include/arm_math.h delete mode 100644 CMSIS/DSP/Lib/GCC/libarm_cortexM7lfdp_math.a delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c delete mode 100644 CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c delete mode 100644 CMSIS/DSP/Source/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/CommonTables/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/CommonTables/CommonTables.c delete mode 100644 CMSIS/DSP/Source/CommonTables/arm_common_tables.c delete mode 100644 CMSIS/DSP/Source/CommonTables/arm_const_structs.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c delete mode 100644 CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c delete mode 100644 CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c delete mode 100644 CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c delete mode 100644 CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c delete mode 100644 CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c delete mode 100644 CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c delete mode 100644 CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt delete mode 100644 CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c delete mode 100644 CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_CAN.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_Flash.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_I2C.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_MCI.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_SAI.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_SPI.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_Storage.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_USART.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_USBD.c delete mode 100644 CMSIS/Driver/DriverTemplates/Driver_USBH.c delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_Common_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MAC_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_PHY_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_I2C_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_SPI_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/CMSIS_Driver_Include_USART_MIMXRT1052.cmake delete mode 100644 CMSIS/Driver/Include/Driver_CAN.h delete mode 100644 CMSIS/Driver/Include/Driver_Common.h delete mode 100644 CMSIS/Driver/Include/Driver_ETH.h delete mode 100644 CMSIS/Driver/Include/Driver_ETH_MAC.h delete mode 100644 CMSIS/Driver/Include/Driver_ETH_PHY.h delete mode 100644 CMSIS/Driver/Include/Driver_Flash.h delete mode 100644 CMSIS/Driver/Include/Driver_GPIO.h delete mode 100644 CMSIS/Driver/Include/Driver_I2C.h delete mode 100644 CMSIS/Driver/Include/Driver_MCI.h delete mode 100644 CMSIS/Driver/Include/Driver_NAND.h delete mode 100644 CMSIS/Driver/Include/Driver_SAI.h delete mode 100644 CMSIS/Driver/Include/Driver_SPI.h delete mode 100644 CMSIS/Driver/Include/Driver_Storage.h delete mode 100644 CMSIS/Driver/Include/Driver_USART.h delete mode 100644 CMSIS/Driver/Include/Driver_USB.h delete mode 100644 CMSIS/Driver/Include/Driver_USBD.h delete mode 100644 CMSIS/Driver/Include/Driver_USBH.h delete mode 100644 CMSIS/Driver/Include/Driver_WiFi.h delete mode 100644 CMSIS/LICENSE.txt delete mode 100644 CMSIS/RTOS2/Include/cmsis_os2.h delete mode 100644 CMSIS/RTOS2/Include/os_tick.h delete mode 100644 LICENSE create mode 100644 MIMXRT1052xxxxB.mex delete mode 100644 README.md create mode 160000 SDK create mode 100644 board/dcd.c create mode 100644 board/dcd.h delete mode 100644 devices/MIMXRT1052/MIMXRT1052.h delete mode 100644 devices/MIMXRT1052/MIMXRT1052_features.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_adc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_adc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_adc_etc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_adc_etc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_aipstz.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_aipstz.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_aoi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_aoi.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_bee.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_bee.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_cache.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_cache.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_clock.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_clock.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_cmp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_cmp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_common.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_common.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_common_arm.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_common_arm.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_csi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_csi.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_dcdc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_dcdc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_dcp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_dcp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_dmamux.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_dmamux.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_elcdif.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_elcdif.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_enc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_enc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_enet.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_enet.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_ewm.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_ewm.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexcan.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexcan.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_camera.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_camera.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2s.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2s.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_mculcd.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_spi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_spi.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_uart.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_uart.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexram.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexram.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexram_allocate.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexram_allocate.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexspi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexspi.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexspi_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_flexspi_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpio.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpio.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpt.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_gpt.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_iomuxc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_kpp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_kpp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.h delete mode 100755 devices/MIMXRT1052/drivers/fsl_lpspi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpspi.h delete mode 100755 devices/MIMXRT1052/drivers/fsl_lpspi_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpspi_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpspi_freertos.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpspi_freertos.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart_freertos.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_lpuart_freertos.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_nic301.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_ocotp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_ocotp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_pit.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_pit.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_pmu.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_pmu.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_pwm.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_pwm.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_pxp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_pxp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_qtmr.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_qtmr.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_romapi.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_romapi.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_rtwdog.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_rtwdog.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_sai.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_sai.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_sai_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_sai_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_semc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_semc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_snvs_hp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_snvs_hp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_snvs_lp.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_snvs_lp.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_spdif.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_spdif.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_spdif_edma.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_spdif_edma.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_src.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_src.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_tempmon.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_tempmon.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_trng.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_trng.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_tsc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_tsc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_usdhc.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_usdhc.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_wdog.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_wdog.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_xbara.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_xbara.h delete mode 100644 devices/MIMXRT1052/drivers/fsl_xbarb.c delete mode 100644 devices/MIMXRT1052/drivers/fsl_xbarb.h delete mode 100644 devices/MIMXRT1052/fsl_device_registers.h delete mode 100644 devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld delete mode 100644 devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor_sdram.ld delete mode 100644 devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld delete mode 100644 devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld delete mode 100644 devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram_txt.ld delete mode 100644 devices/MIMXRT1052/gcc/startup_MIMXRT1052.S delete mode 100644 devices/MIMXRT1052/system_MIMXRT1052.c delete mode 100644 devices/MIMXRT1052/system_MIMXRT1052.h delete mode 100644 devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.c delete mode 100644 devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.h delete mode 100644 devices/MIMXRT1052/utilities/debug_console/fsl_debug_console_conf.h delete mode 100644 devices/MIMXRT1052/utilities/debug_console_lite/fsl_assert.c delete mode 100644 devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.c delete mode 100644 devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.h delete mode 100644 devices/MIMXRT1052/utilities/fsl_assert.c delete mode 100644 devices/MIMXRT1052/utilities/fsl_notifier.c delete mode 100644 devices/MIMXRT1052/utilities/fsl_notifier.h delete mode 100644 devices/MIMXRT1052/utilities/fsl_sbrk.c delete mode 100644 devices/MIMXRT1052/utilities/fsl_shell.c delete mode 100644 devices/MIMXRT1052/utilities/fsl_shell.h delete mode 100644 devices/MIMXRT1052/utilities/str/fsl_str.c delete mode 100644 devices/MIMXRT1052/utilities/str/fsl_str.h delete mode 100644 devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c delete mode 100644 devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.h rename {components => lib}/.gitkeep (100%) delete mode 100644 source/main.c create mode 100644 src/main.c create mode 100644 xip/fire_rt1052_pro_flexspi_nor_config.c create mode 100644 xip/fire_rt1052_pro_flexspi_nor_config.h diff --git a/.gitignore b/.gitignore index bf5f803..ee1fbdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ +/board/*.bak +/build /cmake-build-* -/board/*.bak \ No newline at end of file +/.vscode +/*.jdebug* +/*.jflash \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e537b8d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "SDK"] + path = SDK + url = git@git.minori.work:Embedded_SDK/MCUXpresso_MIMXRT1052xxxxB.git diff --git a/CMSIS/CMSIS.yml b/CMSIS/CMSIS.yml deleted file mode 100644 index a1cf64e..0000000 --- a/CMSIS/CMSIS.yml +++ /dev/null @@ -1,1860 +0,0 @@ ---- -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 deleted file mode 100644 index 3ecdbc9..0000000 --- a/CMSIS/CMSIS_v2.yml +++ /dev/null @@ -1,2011 +0,0 @@ ---- -## 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_armcc.h b/CMSIS/Core/Include/cmsis_armcc.h deleted file mode 100644 index 59f173a..0000000 --- a/CMSIS/Core/Include/cmsis_armcc.h +++ /dev/null @@ -1,894 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index e917f35..0000000 --- a/CMSIS/Core/Include/cmsis_armclang.h +++ /dev/null @@ -1,1444 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index feec324..0000000 --- a/CMSIS/Core/Include/cmsis_armclang_ltm.h +++ /dev/null @@ -1,1891 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index adbf296..0000000 --- a/CMSIS/Core/Include/cmsis_compiler.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index 3ddcc58..0000000 --- a/CMSIS/Core/Include/cmsis_gcc.h +++ /dev/null @@ -1,2168 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index 12d68fd..0000000 --- a/CMSIS/Core/Include/cmsis_iccarm.h +++ /dev/null @@ -1,964 +0,0 @@ -/**************************************************************************//** - * @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 deleted file mode 100644 index f2e2746..0000000 --- a/CMSIS/Core/Include/cmsis_version.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************//** - * @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_cm7.h b/CMSIS/Core/Include/core_cm7.h deleted file mode 100644 index 6cc7898..0000000 --- a/CMSIS/Core/Include/core_cm7.h +++ /dev/null @@ -1,2736 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V5.1.1 - * @date 28. 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_CM7_H_GENERIC -#define __CORE_CM7_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_M7 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (7U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT 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 __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 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 FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#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[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status 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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* 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_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP 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 */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET 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_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#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_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ -#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ - -#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ -#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ - -#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ -#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ - -#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ -#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \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 */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#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 */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* 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 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << 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 /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#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 */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug 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 - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \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[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t vectors = (uint32_t )SCB->VTOR; - (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; - __DSB(); -} - - -/** - \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) -{ - uint32_t vectors = (uint32_t )SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __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) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/* - * Optimize the Data Cache functions, for the endless loop issue. - * More details, see https://github.com/ARM-software/CMSIS_5/issues/620 - */ -#if (defined(__GNUC__) && !defined(__OPTIMIZE__)) -#pragma GCC push_options -#pragma GCC optimize ("Og") -#endif - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - -#if (defined(__GNUC__) && !defined(__OPTIMIZE__)) -#pragma GCC pop_options -#endif - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ - - - -/* ################################## 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 */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/CMSIS/Core/Include/mpu_armv7.h b/CMSIS/Core/Include/mpu_armv7.h deleted file mode 100644 index 66ef59b..0000000 --- a/CMSIS/Core/Include/mpu_armv7.h +++ /dev/null @@ -1,272 +0,0 @@ -/****************************************************************************** - * @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/CMSIS_DSP_Library_MIMXRT1052.cmake b/CMSIS/DSP/CMSIS_DSP_Library_MIMXRT1052.cmake deleted file mode 100644 index 33319aa..0000000 --- a/CMSIS/DSP/CMSIS_DSP_Library_MIMXRT1052.cmake +++ /dev/null @@ -1,8 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_DSP_Library component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/Include -) - diff --git a/CMSIS/DSP/Include/arm_common_tables.h b/CMSIS/DSP/Include/arm_common_tables.h deleted file mode 100644 index 6a4337f..0000000 --- a/CMSIS/DSP/Include/arm_common_tables.h +++ /dev/null @@ -1,378 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 80a3e8b..0000000 --- a/CMSIS/DSP/Include/arm_const_structs.h +++ /dev/null @@ -1,66 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index eb37f82..0000000 --- a/CMSIS/DSP/Include/arm_math.h +++ /dev/null @@ -1,7361 +0,0 @@ -/****************************************************************************** - * @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_cortexM7lfdp_math.a b/CMSIS/DSP/Lib/GCC/libarm_cortexM7lfdp_math.a deleted file mode 100644 index ab7cf2426020b64a3f26535e272e7f3eb3521883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5331020 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%0D_wBxb=!4U~1HI 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%0DZOPKAl=qRRTvKq50Hw;3tI0Uk>1CBpKoTz9 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 z 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

QbohJ@HmaigeE zUJg?J>2cLvUpr}wTf24X-M!TucD1`Fv11(D#N2%))!k04gUWihPF{SyP5D^qn%AQUk zOexK8X)ICxy`eEenM%3dA%r{S(`zBJD6*9DS3($38rx|erK?SdL<-wV?Mu<59C<0k zEK2QT_B9!C?>VtYAJSaD>Q`spMbyO}&&NU&vUZwt|G+YtFfKpmZ^}S4ONO^LJ`khjK zk@ioCzChE?(|#zs&QW`wrEx-OJVW)MtT`=2ca0G9DF>@*|CGQ}^f|^SX&h2gPtf|u zX+M;;$LM@;R0s>o)+1D(Dj^t3>0uhr!gJ650=C&2}N~7gIY>JhsvC zv6aSc5iLtuzD0=2&D8&!Xdjf|jnrlvXzUfze2VXSI#;cuG8EAI6o<96y)`r*S5yD5 z5@IH0#Y!Re@oAZSAtWhG9`!{ojh`GLUS-pGqmV2bUzxP+3_2#$sl6yhY1C$^G~QC^ z_)4a6l_Z1`g-N77Nf2UtJhf*W9ZRva4T@O|)jOKbXHiu5NE+)ALi`G+W0x{}1U>1?;@&)gAj2G>3FcGzObV< zULeGw`9hqYN9Sx?A>9W^;{ntjgvKaC{ca<~fVB{Rtf-80=sZu6o=wMqC7ll}gitr9 zW6+Gow<+yw7WIV*)x($`jp(@{O`l2gXV7xfg-|x2zR{=kr_tD*O52-4=LubEo5@0a zn?!v(kP5NCyN@-7Rz zCYJ7JrDblhD7ndE=?xZIjV#{OvnapLg1$2sEKZ%EIvi&)_85znBUJV(7R+JV_dym%Dp@S6p!E*0sNc^b zaUY9`duh4dw2fWV9y@7&Wh}OoQXNWId?}`~ZDWD0EPA%kemAoqn`rt57F!EhSgvQ$ zS-_%TEsN=ESUg=t{j!pUCZGBtk3~=}3$Yw(^DL@wCQJ9C(XweQbW>T}N@fw9#6pNnM$FPWxW+55H;$Q^TDV)WNFly&e7Mu_kdxBUPFK2NlfQ7F=^{Fq5)yr6@ z`LHxhiw7RmS4&v*y3rVLrM_`tvD1n6xtPV-Mbs7!G!E=pc-m3f=d*~M$Kuyq zS{77R!eWCB3q@-dJLb^1n$4opg2fbb7RODg|7WqNF{UyY(Y9u?m^FjNIRk1peHLe? zvM|)6_Sa>hKbb|jK=kCV<*inqDiw^-BUMUKAkYya4CV3cx)><){(h@F@WXPY7UpT!5`d z1$a{>fc{|t(hkzLDg<;C8S8Bg+Mt8A$c^7ofyffIB_{{O3*m;U&N_ z4{Bp~YFk$UzBp6eodlTYNd4nLZD%h4eM1Na=25%bQeT0lGXm_grh3ky(x-X{%7bc!>c&D0E`rOcPQ>&C{W-nE-g|hR@{nz6ezC6 z6XFSRPl$)O6L)uacTaAv1o-C1JiBw|$jn~ZnWIkKxI1*?WY>+2O*dxN-RN0%qi){K zTT`(H<8JO4c5_+3o0GcT{Grp$Hmz=c*63z|S~rtbx*4L}&DVF`G`{Jk;8i#A|8?W{ zyc^r6-RL~-=EcKquHEnE@ZD}U-RWlGt!_r&6g1bnsl3`v!sTu}{_e)$LO0LOb#wkq zH#<*tv*<)O!~W`~^+-4Ahr01R*v-d3y1Bcrn?rlL`RTWAM(*mSWqUV?Tf4E}ES}Y` z-3ZGQzpU?O%(`xxeirLqCDygFoBPYV*}Jq`#E5hwU(ikRJn`Ag>E^+#Zho85&D0+S zuPNPxPU=Q$LO18eb+ckjH$6vnlQO&;lc8cAgT>khcGJ7RpzqU-Vef7(^z3HIcLiPD z3WDVd-boegl_(g~p&+kSfqAoni;W8A*DGkKQQ%Ug;C6+Am1PP#iWPVjD!7}k;HO*# z?O6)kG8AIZu3%w`g6c#CR`Ci>#VVK(tspHzfl8Qytsx4!0~L4%D7faQV7iZjEKda= z+!g%lD)=}nuys^$%wEADTLoXN72L2?FvVO!qKSehMhX@fD9F)O@J2_$axDdg>I#%p z#k@X<`}blUZxt+iEpYx*@Z!0GxlaY{BL#OJC>VcFLEs&Qc+V*K;iiyvUBRxa3hFP3 z`CU}7=)8i2Gh%M16bv{a#*Zo3c0@txp9-EG5Np{l=DtTfr{5IR>{RgIb_El+DsbN< z_@JODr&+@yRV_)SI%jH~@%EcL0&dqi? z?JaWdHOZ0H%XwTYr@Knd(+WA?O2xHU^a}($PmE^^yi9?gCg@TGeWKtKFZjg>zEN`0 z!sYA^l@k^uXWbV$u6}an_{cH#lncK@Id5F#NS)+dbC8QOhn#(%cw(CED-l|#r$T=c|Su={xrdR zikSaIIVt1hOdliX)<`)a!{iJbA{V}Lavb}K_5UDeYcDw(-(}=?%a|jV@lTfwzYZC_ z+GOl*mZ8-kBezz@v}zd_D`Ys7%4jZWg4fgd1v`^s?il2PR@<40E+e>uz0c94-^E8~YxGJdg?aobFWow1A}0~sUr zWbDup^=>p}d{&cD@$kH-7;!+$QZm$#?s9){y@f^ z^)htU%J5t*50KL4D@E!h<*U1tUanI5 zI!hVoAZ3WHl;PG=Mp{T2Wh!N~k!bqj{-c0tNg1IoWvGf&e7B|ae=8O7ep0?a7xQ}} zrQ@NL#(Pq#?no*AM@rTWDM?qQL|l^Me?f}NSt-`1r05@)qH znIxrqoRqTBQes9(aULo~Ymk(C{iPi1BV~OrDO109(WASIQfU{Von2V8b@8IPi_;BV zY^d#GVpSJiWnH8fci~ddg>r5e7qYt8nBK*>lrCBlx`>JG!Yrzbd*NOD9@52(Ktbcz zCH#;D+@p&-u3c<%7WfWb)Y^36ZzcGcck!1=7xN7Tu5K5R+FfXA2)U|VEL0Y-w_Sw2 z>O$p37l)sAG3`+o)%V04?g%;mh`HV9qW9GX_>D5MLc^<5lY+r{YBU8JlKGM09+V^J49=Zm?`?&9AWT`Zc` zMa3k6J6`Y}(?$Q0T?7v8;`X2}=Jf9(?}si_dv@{bHwmqB307Sa4t7ZB-73MOQNp=8 z3B#);1eHs;Rw7}1p@fKB2{*GOOiUN|$r5fPNEjO{AvjXP-(eDl21~?yQNmxo5_)(^ zuy&KM>$8Lg2Z`7VOITqoA>CZUT@wjo3?+E!N;sq~p+jAQmWqUBN)q9xD&fjY34NYR zFn=uJmj@Cu{}pm?Nre4Xz^+PIb4fz-c?lQKNKl-Rpm|Kf?86fL4oKLuPeRFW5^nF5 z@WVCpOW}-AUhyPTrP?YoWO2 zcJf13C$G{v>5<&Y)A&y0(Vg6j=%h8IQ=BI{sq*XOw09>t?w#y+=_JOn6YM(iw(ew+ zMW=Wdbu!klQ^ewR@=dFgf7ClE|Io>y_nkz&?qv0Uono&ia2|E?=3Xc5w>vp|vy-H2 zovgduDPli58F99gCntrhV?xH^PVtO7nZB|N1`+mcR3FBJ2g+e!A!PS*U`iT>nHy2cBdF`amh=w#&3PHqnDB%yC7b9;-me(#`2 z(ZL#N2bvun)U|Z5rLhCU+78+(JJ?y)foV|(9eEw>%I?4>$stg9Y9lJaq3M`f~?k96LB?+rek64&-JXY&RA%^gGDc>0q{I2me#;z+0(< zZ*Mx-_Ob(&XC0(H>R|l+4o=?bz~W{HmDf6$ce#VB7dmh{(?QdT4wfG4;N~I0_m2)5 z_jIsmw;12vf$ioFDmHfT<1ZZ?|5?m$We2HCI~ce~tZ7~cPiA%C`C|w5lRKC(p@XAi zI#3(YLHLjkqysuw*tbK(&xtvHYZv(>+Ub&V<-@wnPeeXgePR+X?h*r_!sP!S3y>_}tD>hjyOYv}0k}PNZo& zwT5C$ubm~@?d(@?=hlaIG~c!3_Ntwf=Yr?sc7{A?XW_r?BBrOE3)kCuak(9%3+;HH z5jZCVkE8AMI@Hd@KZJ}u?d;ms&Y5lP+}+g9hYjtRuWiS3RXfqk+sRwpPUHM`zRhlD z_>6XboZ8N^iS459TRZzkwj;8oacy8b5Bj$Ax>q|I-`X&iw_z)3!>z3i|E4y=>)J@D zY9phpjr^iE%JSN%$!eo9t&O&%HoD^4kVm!gEv$_m!EN*kXyXST(LCDd<07t(ZS=Mk za4Rux*2Y&ufv?+!L`%@C2|mhgRKIPb^ko})&)P_T)JFWhHo|VV;rG8bT(7qA>F+j- z&b6U_s*P8FwQ>J&8&?jrabj;9dv>?6aeJHC6SOgHV;e))2^p)}s9)Yj&f+#A=eOZL zyA9LnZ75A?tQg|3Pgp@VGU zZb1txa$0CfZ^0?Kh0F0R%!+QIIIIPOpcW4Lw=medg-Ev+o;tUP7^W8Lty{1(Z{dis z7}IYdR9o;-Z(-ht7V_V=p!%`}@qlT0*n-7fQI!5x3q5YM;BvWzlNVYTc%}v4<1Jh` z(!%hAEd=as;qTqzetV11LAP*zLkok}w&3wo3x6$Zq35C&Z0EM{`^*+vr?v=Pa0_e4 zwoovlh37+Bm_DF|@E-(Sj}~DQY!>g)X1269Q`*$b^SWlHR5jyQ+RWj?W?FNaQORg# zZb~zu@y+}d-AsE}GarJQnd#q*zgIK+-I}R#YUYVuv)HpWV{O*V8lz_7b(=Y<)huc& zHjDW8W=6be#^OaY%bzq8a=)3qcbX~qUo%&(HY2&%%*(UQ3_aP5!BN5c&t{zWHM9D+ zW|1SOnH`&(N!rlNp|#EA|J2OcWkTk{X0FW@{AV%(_ZkfZlcyq&=@t5sM`cuO}MHy@uN}`8n2r~Y>?ppxQW7h zP3*qigwKs8W?gAQ{X!Fp(@k7F-bC`@Ce|Jhy!SLQa90zzw>FVW6Tkk_gw5(E2Cr!1 z*5W2I=Lx)7O&CvW;`_uV&W>#&Y(x_?hcxlJe-q`so7nQb5es=E-#Z&Q+1iMILnC8r z8o6EGNMcbV^YR*bnb}BwN+UldG@=^aNJUs9>w_B6@@u5VvyqLijc7YIQf<>H&NYpw znKV+W-zefC8+onXNTzZlv)?vy_rFFWo-{J*K_h4HH1hd>jVP`(vg4wlKhsFj@kZt! zY2?mo?My@Px#AQ(<9djF5GqaH=QyU4M&`8fQjcgg- z$eTfpMD=Z?Z?8tSe{JB6w1J5B26{C&KwSe*DjV=EX`my&fu-3ETup1hI6hchF@r4!)YPoFF}8(fzbU8)c@ANm>ps+n;W>ip#hCGVm>PyC|=S) z-vtdUn%%%3KQ?f0QUgX~8weiJK-u61`t%nvdN;81TRm4~^(c4LW8Yj)Y+XIomG$%~ zt!HLIJ-=qxb0V#t2Z{CQ#MJXSyq=h#ddmFjQFzuf+O?jAj`eJ@sTVO?^}>Eo&l|mZ z47KWUQLQKZeLY#P>P0g?|Sx}75q=sbM1(baX`@SsYh#P zJ*Hd4d^XnOxwf95pM=b%^`tJSCvUcp{iEPFsh*ax^+-n4(>=JJp8f0T+q<5D-|845 zt7CXa9V46T7+qJ#n94fFmWY-wT9)Xi)-fufjuFvy3=OMeP+*;iWv`=`M;%|C>yX;j z(PmXgy=fg426YtZ)RC@UN1SpUp>OK&c~OVc<2o$v)$#FG9ZJ{hcyg(Z|DCJj%*i_b zI9kW%gLSOjTgQxDLeADYdQd0MZFS=RqE4)(4$lR3n9r``!;f|1vk`P->)17-junIJ znAA_qrB@ww-L<52)#BY&i*aKu|JBrTvAmXDMYSx-tz}q7Ev-qlq{r6c8BvQ)a4rA( z*K*LSmKCnG40o)h=~FH7=C#-v)$&@mmeZQGtW&9F^gA*3UoFv3YB9TC%l+H6?7LCR zoXfRzpQ|P9WG%KwYk6|8mi>EcnYpVL$re#FcVjJvYiqgwQ!VS4)-q&4Ed{e`ahz7m zqlvZb7*orb;kA?vtmSi`S|0YOWt*agVUil*<5z=aeGS*DYWS(N21R}iVOcdOrPi=7 zp@z}X0w=Tv(=Rog^QmFBdkxi2H8|J`8p|3MnbgprSA&yQ4cAp`Sn$4v+LtxhJgwpU zgBpIkQ$xXx8uTvLaNv9mgHP2Eb+m@(2Wwcfw}zITHP~*c;nYSUYi$j2E5+CnF_-x@ z)Xc0Ab{R2`2{rT_U4zHa8ZHc|VayLTM1HI0uB@6_9o3{YRr8{@nk5z0V$W4A^b6Ij z%&4X)shan()vSo97WTSo-uP9s*t43<&(%D!uV$uoHL<4E+%%|Wv`#g?YSo-js^>^U&?-iMsS@v*DweuciChI$?6MI!=2e_As-pg5756l%_^w>V z`!`jLcu|GHBf;-(6?QkPSaP)r&kI$oJzYi6u_`wISw+-d!DCky@ms3cv$2ZgHC60i zSw+fXah)gnGX#7}6$#@6-bjHzSkUzo^gXMDEw>U+NhM2LE3vDuWO`L4h9#AZ%&$Z# zvyvVumE4c3q#>e`bHSBl`Bk#pvy!0Cl`OZf#LB9YF{YKg)32mUtCGvAm1MuGWc$lX zyq;7t^L`~7w<`I1t&*#M3;HvaY&u?v)1gYn?ynU7hLzN8trR+~O8nMV^5ai}*OE#a z=T&lWW+lE;Dw#6AlK)0lQaQMio&73t=vm3&?h0;5DoARn5W1-f)G8}zEUw_Uyb2sL zD(IJ7!G+igLc%MU98@8EF)K)OuV9gL1#fLDD7L5&@#qz(>sC;$Q6X%s73jRFpze7E zJgN}+Xey}rUj@Hh5xmb=2w&q0RvfM1^??d9f3INnjtc(WR3T#XD;T-Df-}o1_`IM3 z#jFZ;OcV4IDkvIN!Tg~W-05FIV6O`Lel2HjS2?<^$8rW~l(S2@oVTw9{||x+w3pGZsZ7|S%D7NghE_ot!C7V0r<5@+zD%40%lKb# z8Tx)@gn0@VZU?lSIeE#u?HGCbCliTn#?VsBr@pt)ttn=WKdDidd!G9C^qLwi6O z&b`Zs`dTVtjZ2ZVmNKNFlv!1!tSc#He_kmUGfH`sREklS-){Q%cjYQd$R;(%!q2&aWj%xR*7OpZ5=*F$E}=TKgtCAVio8n5aVa6qzJvs;5+Y1W2-GXVOS1&0 z4<%T=DZ$`*3F;3^czvgY2RBN%ajAqeXG=JEyo7CsO89wS3G;WAFmX!>q6#${_*@uehv9Fl?oyB-$f5zrA6qs6>+Vhhz(Um3@s_5IJXGb^dep)7O^k7h^e7PH24?c z?^(qA&qe%cSHyHn0W&JX=VK8s)rZ?V3Jzqrl$s&}F z6tVY@B1ZjIME2Gqj5Zc=YK`EtqKNW^MOe=+60zq+%$`sr-W5fB8eGKrzD3OFA?711 z#H78DV~vH3sV*e7q!5+7LUv>n(le3jC}2cU0p8gK z98WFadt3ol5d~}yDxk)v0A;rV7C9D>XkEY!(*lO*7vQ8>z;7Q4sC!+&yJrQ=dQd>< ztpZM7D?oOk0G(3>EInF4>>mZ3`>g=QRsq{sz``{JgfB1PuZ0D)%qrmR)B+}rFTiy~ z0b2(Zkn@9>&$oQOcIBhdn$Pt5eB3MY*;14*@`U7bE;XOlxO|>RU?~c=CgKwJ^?fG`DL=WjuF>k`S|zGXHBnsycK!;)R~7{Qyz z6S>mzFw4keVp1O3(RmCB&Et)K9$!83xa*upgH0ai&GX1L$YZZ|9^oo^ta+P<)AKy0 zJ7M=W+jH9yO=(ICeBoJi9#B{+5T`);z{-6#Rb9qitCpXBOm+pfw&ZereXh{SE`QI1&pE<&oFn$wIs7p*hmVtU z$QhHvq+vOn?4N^K&m2nR*-Y=q=4@j&=2h7g7iTjyH(Q+9vN4R$COaaVQ9;@4^U3Ce zYc^5#+4Qi=W}R`i_^oE+q?S#^yKE-^m(8D#vQfU1P3ZM(p##Zg(dlf?9L*NK3)#f% z&PK5%nbmASu8To;($RG545r{`H)4}>ny6CW-;Kt z82cxSeOI!$buJ6-<5_tAnMKB)ED_6=#pqwNSh+TfKUQRMb72;$v$C+Cl10?mEXsyu z@wI;z<9lVXLXpYu9ht(XA(LlSndla0@;N7y$ka><;xcIq&!m4~CR4mKS>ck&cDqde zvdH9yVJ6SDGlh*MQ@qDA@q8v|?q`zuPbL*tGHE}TNv{)`3_m1j_hzzSM6 znZg#3$+3l*oS!B5Ov&WlSix&pChz-aqTVwTJ$VME?HO1%WZ+PlflE;ap4l1rreug5 zk{QAeIYanOWf0++L8NmAQ8pPwn~A0`nx^P0i?LT3gg?nZ#FY~GzYP2@WeA;g25!eP za5|8I?Qa=aY|X%MLk8NbGlab>L!22hcsxCW+Y>XmJSu}zgEKhTCqw81(%I0J&hnOY zX4R%Mt}LAa`RT$=olZkSI)#zxBnG96+&$?yxu#=epN^7cI`@szxuBEIAF6`>Z94Ox zr!)FNI^X|Er}j!ZY3I@jIG&F6pXsRVN$20~=^Q7WO>5Gbw>({Z$J1$>kxup`fj2rG z(;?~n*H`fTp2l`*8gpCI=wFvcZCM(z`Dxf?r135>jlZMP*czP1bl)_-xu%h4pN6+( z8d^qa+|Ws5hpHHRn}+;Z8tM1baQY{WS69+FelAVqND(~$Orz-cG(5JY@qS|(Cw@+2 z*|Ic|OC*h~=|axLG#-sg$*1crmXO)c4rDTqs5gr^zlQH@unf1GqDcGFM<6n}Q_){`|i;_7q zJDH9t$!LyEX34N*;`$|Xu}3mJWJwscCW)AdB$CRKxRjqnkBlVr6OvdOnM71z5+}Wr zX#bofKBFYzUzCKqeiGX?lgL#{;`+-ZzCTJ5Y0{IJc|A#-X_MG`GKq{sNnF?~=(Z>E zA4v>blZ45#Bo@q1!e@FCTP6y5Ba=8bD2a;RN&K%n5ot#v|1~Bupehl~qC_TSCt{wQ z$lRDjoI?^>;g^W7TO#Wn5(%+PWUEmk(b|dZR!Jn`bs~G8CX#$Nk$wM5B;{{$J)KC> zkwo_FPb7Y4BD*#v616swEh`cUUXaKyGZXQil*sbYi8u~UWOkoKOur@|ilw36lt91g z1fCTq(3zdUwUh)(V-h$Vnn1i?0=OrL{YV0Htr9RWN?@>#z*R{QwvYtQJWU|wZUVpl zF9FxT6PS8BLHOV#pxBqd<(&y+{+ht%wFx*cPhi4=1YXZbplMe=+)8dH;B%J>o^|P#kuxaeS+d<4{=~j(KtPNEi3o|6r z#9{C;PWU{>@ypvdK0J#f?_M19Z^rT9QXEmI;~0H3jE0xM#d5t7)uZD zSP}mb%Nv_mqD^BNpcl(-^;neO#S-^i^dH0udt@x{F2@piCYD~uV&RWip6rUncT+4K zYhziuB9+#XO$@6|W4NRngT7h}F>hl;{<9e7-H+kO%^2QXioxS_45de67`i`( zbvp&_uQ6z?i6L-V3^ns&7&$$L^%G*aI3fnM0Wo;@jG;&tO`o=C7S%;_pe&jPdC{1p zMH3bmO?6l_0|TO2;t|asj?vt)isqwHG(OtVK%pK=O`j=qR2LlqEtqo(Jd?XWx3mN@|tR6z9G=d&25y+||Xf2MQ zCOd-SydS~dn-Op+f~BV; zn06$BVf!NZwmpJ|jS=Lnjv!`91YUC@u$UTw>R3TLG(w!=BiQ#XoVAj0W;TU0xGJ2^ z!f*;R!--4`$0;%#?Z9vzd4+SvIh<{u!dYMv&ajW+w5x=Z^*S8?C*c_X8!mFt3Y-h! zY&sFnj6cKa{d+iNTfzzZB^-;DVtipZCufH9%cO9|j|!(_U^pqggbaBY@7ltI&rTTY z%fc9&7e;exnDA=~!#p&M2YzAfa|>gReHdTO!${W;!%icNr|-i!@It^Jgdx8fM&hL~ z%ua`K`$!mD_Js+%Oc<3L!|+}m#@i)f9GVlxtf^tNj|n4mNEm8;!Z`jllzE+@bTot# zQW46Bf=~`;gz{rTD0ShXcm#y<#3Pigj-d>;3MIoZ6eF!r5kn>DUWU^6FckM&q1?X` z$}eX_`F=E%u>GOD*%``?UqczNCY1Q4p{UFa<@afV$GA`uh6*`-L)rB$g#MBcA{#?^ zRT%<>A#`Vi;FA!-orn;Ydt?lpsHcpuEi7Xs%&FjY5$QM(k( z>eIm#9uDT!UcqyFFv%N&`FB+?6BY*(I4hX5lY{wTbTGDqg4x|Wn0k2-s%=3msS6^x zG>DtIK@3d|!Z{{L_^$;~=M%(xmmucY1`%!=#A)3i6ske!z6oOa(;yQ54dUZg-H_vjrhr8zlbogP1!%h`=9%I50kl>R~}V=@-QC?}1oL0!8d+pm_HM za-uMhri?&dBm|0hi9jp@0$J`6NT@>~`z-@0HVEW~W+009fxLea$e0HL=Vl;_F9qUv zDv+&*14-Hw$kAJ>#Gq#&(_~-x)bfP|HDCB# z{Dqa-U+_-)!n&w0dDX5SY)w|`;T#xFRn`oi4BU$C6@g~^k@pgZad!v=lfeXlR{kO%OfHGr0y04|jT zP?#OS!Q=p9qXO6%6o7|U0CSxKFtQF{m~j9vwFBr-4&d*X0pvUkVArhx{4WQv;7owX z_YuH=eS+Wi0ID_w@aL)k!WIRvbXEYylLF{JDu90n22k8HfZZ~GJX`#kTI0|AVt-n* z{5h87PiUk+^8@`wUSxlf7u=tdR{n$=3YeBZYD)gJz3}Jo1AqK)`ZMK{KQB)CQ+CLo zt$X~j+3HW<_5NI1=}+_mf9B5c=j{Z4Du(;BrN2KG-~IR|@#A=tA3l|Sj4JfwW`-Ye z@qWw>_Y-+l{K$3lV}-pRAI$wI*Yo2Sbw9M<`ce1Pk4<;|(7WzO<9R`u1kDyY4oAB!iN%kA0YZ$A`05eK0=jL-tW0k)zm$-*@=%cB2o$t9+0y z@?rTbAFfRD!F;5^8Q>%G!uYUN>dm8OZxM^&O+}$M6EeNoliQy{U2&Fne!y zn|t#_&l_hoZwlXdGvui^8~*hcxqrQdzmhkx$Gqv<@6GI;-Wz>^^vp3IB)WOJA&C;U9Q>*|S`ttYmoo+7usCs`_6Zx7bV-Pzdc&ZZi7 zwidgyJoeP(&+XHmE0GwGi{WA*7XcZ@%?S^G01ls{Aa;xo?o zKlAv1pV@iwGh?@Vc`Gqy3#+z57Ng|{m^nLG4>@#OR+;wKpb!Ud2 zcP9CmGaCDy*}ub?;TuK&Cuh_aI`jJsX9iAiCT5s3Z~8j3`KuG(+norgbK+j9lgI_^ zL_?AjHjz%8`QpSx4=2*?olr4%Vym7L-KtJ_ymsR1V<)EHb|U+-6RM}3*nHTDuHT(- z+#=}KIWcOv6VY>>csSLGMPr;O8svm}FDEw19BFNK#Inkf1BH(C%y7gt&XLohjtud2 z6mf5kT>0e4SYt=Rv>dsq>j!f7oa5g$}b(JF{7dhfT z!;!NS9O*yY5tqJ>9Qx`Y;wKz1t8-v$sROmy4yYzMuq@Jn^Z*C$xjQi4-T{9z2TtfZ z@KwbD(^n2`eB?mUKMp*-uXHwgXouJJ5HO0~P}u zSl`2eY>7R$8toZWVUKm5y@+|SCo|ff8$tH;@v_I*(Vmr-_QdJib4J~s&NucbKe1=p z9eX^l*t7GDJ^6?2`QILUdTzBxd!0R^zBoQ}#n@DPa!1>9WstqlL)oJwwPSp<9X6GA zVqa+|baQs>kF}#P*p92-c1WD;cxh$F5JNlkHSC!A&JO3NcKrOW9U)ik*mc&9v?F%> zwbzcat#(}b#g3NccHEz5$JeQLyc%Oi|G{>s_OfH7%og2dTM;K=i%EekKc?Ga8Eebz z5L;}#ZJFn6i=CCNh;y*TUPD~piT+bt=KgETr>nNiJZp=^5nHD2wZ&+wE#rT&MQ6D! z!{^zG_q;8A$Jp{>kS+3_w)`u#p|Qz^zbkDh%C`}91Z+r(v0+=V4PU%$Sm|Vgy`>FP z4Q$X>w-K=@HavY|L+foDE?lu8=d=yG58DvFanEv{SK0klr`r=Qd%@nYSpD-T&iJtvF@%LA2;@YiQ zTxX4Di8UQr)*Mc>#y8xWiT>6+cD1I!#+vme));GB)2(F9@fX(k-?L`I4QuY7wv*xd{)_4xKW@v9~F3YS4ZMG7hl@)gitcXvuVrHxr zkAkg8^|E4~lNHY_t;o=~V!pb#e`7`ZV=Ly~w&L++E0RuGG5wGg|Ndr0)Fvy&ud(9l z5-S2`Sutpm6(>emiP$hJ6kjdb-C>DAoh8*JmaNLQ>O z^4z$3+!-8^q3uc*Ha8cI+8x;$xURsE{KNcd_ zy#=2xit*zX%s61dnVlAxY_uTnCkw_cwBX=$3)IJ15I@9%zCT#7Np3E3+L+^2WlnQ} zIrGxZIU8$^VX!%AUgivRGG~*eIS=&BMZB3gm9Nd2_}HBNx6FlJ$XwJnFc)eX8D-1!`YN;R;H*KnBuB#Dsq#U z((%}ovA0e6`LZcTPMPxHPgC@Fo8t4Usi@&*O6MX|M$I&3`2(uB1K zP1v`~go~K)Xq5@-3r(<^Zi3G^6Y=?&P}JLmR+%wBv=}qC%9wct#;i><=C>GQjt3cY z-P4#S4#wilVT_@!G4?9P_`WnI>VYxo|1+lag0aY(V2pgfF@1L!GjfA5Q&t)?f4(s* zrx~+hj4?X~8S_U^WB%$g61rO>u9X{cC)bF_$ws`4G(suB2n{zQbZw0=HZc-)1dOmz zGQ#n>5iWO)@VI7#&sihsLb}+YO1R zH6*;)kkCv+g5wSO5^9LQk0IX9hIm*R;$mQkqq-qBZw#?`Y>3e-l#T(u$_6;RFu>@Z0V>xGczVu&8%GT|xz~W-w;J%vIs+CgGhqB2!DF%k z9U}yNKLe7!>J!kek8Q0!TE+T2%hcyeygq-1>a)>DU%Vgm8DXW5LSLV9HGQG)*T?gb zKF0s(^XhMXuAb26j|2Mryi=bk8};e+lRnk+1>Q7$+{WnhagaU_dg^ncOAi|Lm|m_& z?_519lk|v=(8JDO4<%PUuGr|Y%UDmGbM@%|UXSXhdPLpP!}^LIFHh@n`j8&$f74^a zCOtY=>yf%h59b+rydST}`Js9u(Xbxl<+`*r>k?n7E8G=yd77%rp=eze2kO$tLzehwMUobTLk`EU2>M_;xJ2>ClhtqJ6x9^ z`|8rF_()jmN3^Oxa<1?rE7CvGGxj4XK_4;m{KyT5kNjf(k^Z_L$^7sU%l|%d^S*%H z_(g87pc$;g5icDkJL*tsuEQr?9j>V8u=u48t@m~Cydh}L>#+8i4vM`x1a8&g**YDB z12;Y9=nyhVhZiG6zn>1@y0r;x)8st7q)e=6} zT1?ubMf_$h9<9-0!4fTUXKL|of)=ZWX;J=z7MgNRHnwO|SE-3!z9w5zHEE906g6Ko z+2*cEi>b3O&Z?|oM)Q+`mZK6S2WQ$t;w20nw0F;sGFuioS_ESG&C6eRzvt+ zYw-Im4I2K|K;?u63lE6#9U8*_U4ySFD4opI;Y`FvEJt$WqU+oH}t zYt`wqR2`#P>MWh8PQ);Ej`mR(Iz=^}x2Q3)N=^JW)c847P3XAP`0I-r4Q^^YwN+z? ziJI_HQDgCYHIWNPjohWSqdXMr02)702LMvb(AYMkt$ zMop(Gcj{I7TB6FkELBD%sES%us^Wd6ij$Knt1MN8&z&mUR8>iMsmj3zs^r~J<;;0i zk%LN=>w8sc-J;69wW`RMsPcT4D!nJF@^+Z2sI9Dus$7L(Eh=bMsxT^Fg^wvJjEz!3 zFF=LyZYt>8h^w*aYYO-~G5$n_(YIC5x}+lN%&MSzK!rg&Rd}~SMbz|A;l(@^x~Hgc zf0PPs{Z+W}?E^LKA2?V0LDU}kz@dx}B*lJUNAL%NJwLF<;R7yaADH{`1E$I!81v$T zIJbSE=d};qKl6cxLmxyP#Sdit`a#qr5i|=wuwwcLY{q_I!r%|6^!y<7Z_51Bpe*t< zDRVGenTP~sR)s0^$w!&7&dR*8RHjo;nG34Qq`g#T(*tE(ZYVS5yfVs1l|}9?F}6jS zlr_q%U!siNOl3w*Q0CcCWommX^QTOSpe7~eRw$vFtAspBiSrRk!gi{}N*5)e$5f)1 zp%Pcrl}LH5#Og;%7~d4Ii%MMnONqpNN-W=|gzh>)yHtr&vy}*)sKl({O1$f%M4kLS zzqh={x$-^3^564M%6n2H-?Kd6J({lXY5nw`KaAevsv*YTzURi{_r(A6p8s=n-f=yB ze;m(>kP<>xsZ>aWs6O}gE?JS$K#?Nf6iLWvkai(Tk`XCnRFv#>k`XDgl8n+W?Y;Z_ z&g1vTd7OL3-Jkop_ni0p{d#I_4W^(C!Bnz3m<$&O(?$JY>X;eKZ4SY7XIwB19Ue>$ zlEIYL6-473f@ptP5M}=gBK6NfUow1YK&mgzyXQ-eH+|`Rv@d0z@}=%z zUz+aaOV+Nw6yoSh&o=r}m6G8 z7?Jx4Cs9bMK&GM$AG;fl8=uH}l z-eeN%O*+z3Y1S1_T5+87q7QhI|7K6RwA_>H zK6}!aNuE?Cdv(#+{tUWJ0H)uQFy5vUC4H$ ztB>6%@roPWJ?=(N4!F^a&2E&w+>J8lx>5EdH$Io(M&Fwb(2qX{=;zx5^!pA^Q9K3k z&Vodkb z8U6j7%e|lcIdj>)V;^VI?<2bp`)KXMePkTFk3`4z(TsijXp-$dk~Q8(60`SF-S~Z! zFS(Dh>i5!%A0ldoOvPi_MgjBmT?GTTiaoQrH0zMIq!?k2JQ zZpvA;o8onMlb15Dm)=cN+ICUL-(8gXeizr^*+n~}cM*bj(Xc(c=+A~-l(=XYd1&pT zrDJ!|sD4~`zS@OueRm=E7cOKJ??TcME|h!7g<>3B$kEh=X6n08n~DpuVJ_s~zLRqb zcalujPWpO(C!M*plhz;ENfTUmQi1hOidnpq$G7gJ$qGBEsNYVCt#KyXTxXh)=1jlh zo#||ZGg){!ldPjNWtuuupuRI1s5(=}FlS0>-$71AJGdt64*Ge22ZdeQL5q)Y#_^sV zbjNxJ*)QHfV`uK5tg$=jaK9ZitHz0nzB|#W7f!S=-iew{Ink9vPGsufMB>#>bW6{P z)~j&#@h~S!Y1>X43%Apt%Z>Isl+v(Qs?X+gYcIsKUo$IA-C*v{Osjkm< zim2K~x;fkE58FoGH@1;-_%?duxs4p`x6z6wk$2pLCr~@%K z2Qs&FpmNSJ_L%EH!zMX!-y;XoZrn<*e{Cg;H(ROn_Ey?=b}RMw-AbpNw(_|p&Ns$Z z(pTTg^;&qJE_*5{v8U}H?Wy@8=NHG?)4*f)6uQ@*M%&oar6u+}rre$q73@j7zdb#y z`Hw_g-~Yvn|M>O$kNc4QN5)+1KXWT*7_a`1KI;BQE0uXZl$Tq#P-ejvT9&be-llA! zg%`H)*v2i~hh+;rvfM(m7i^(h(>UXJ)E0{A2IbH zs+-As80Q(cZ6d3}P4xQxCepgMiH{{VaX$Daa^AIxzFTpgvC$^FHhmLG%WtB+Vq4B9 zwIzcuwiNf&mZair$@zpWeLi4Ib2i&jH0W&>v_Y#@5EfsWnWK)K-?NcrFf+G)Rm9`@Iit?hZ zXl$?*S?#u>GwZGByO9-*(6k~`c`G_DwxstJmNejtB^f-mB+sjsbpN;|)$O+=^-Y$v z$=H(4YFpB$ah5c2fF%jF>&P{C9o>Afj`DA=Be_%SxZQ0Xx!bR!#Fe~m-a3+1T1SS1 z*U_G)wRHLSTKe*4E%ixS%QYF-l8w(=3faDv9-FVFQqfu(K4mQlGHc1PeGTWla^~^- zHB@$Y4ar3DO>8DLIzwPrNvhZ!lQnUQY18Ld8LMve!~$jjc0B37DF{5&&CRW#%8Ff*!X zH080XrZnu0DJk7HrP*gpX`#0%t=VQuTg^=Qx2h=xsF>1eX;Zq=x|;43tme9gt10Ww zYWi`0HI?|SrurSLscX$@8bGT_MtwDn9ln|-cdnwT#j8j=YZd9;Uqyz|t9VQo=Oyo2 zMdntk$a29dvYxhzHjP|G|MjdShq9IYTC60eM=QxWb|vjR%9ATk);ulZbu)O|Xx>MH z_pMw(|9x3Oo1U&9>#Hls^7smF!(2ftY*%n5!wNE-wSx2%R?zHzD`;A^2~Ey1p|Q+_ zWUrf$WS9wcyO~hKW)mu1W2$_oa!OfDhEa=YwEtqN-m#d{*6?~P zCP%f!B$8cB!#WmGVc{Z5dB2GK?=B*X3yVlKU=cMtFQV6L7ttwNM4QzYk=F1$jpUgcaJlgFD|5xfQ6jT%Nfq=7ScL{g`}vlkSd2Sq&uBPWUX|m)!;AdVc}UiC#c0feYxq%L3YG zxq#*xE}$k2-Y&O*c6Aw&W{DyF%QB?v_YG-Fv>{ClGNe2gLyE98q?Lw-G-#?JrE#u_ zN0$LLB60Em-G=GE`$Y25 zL~jF$++2t>EQ#_Ah=MhU=E)J2b%G*_K?|}#b@#yMi9sAALCrfsm)3!n8SrIwQ1ozK z-ziW-k-%eE1X^%Upnn$xIvF6){G9^juNBCj1kz9!=%cJat{oyCry$~bq9U@n%NfxZ zM0CYp#N%s3RJKM$K@gFenuy-Yh{&N`pCk+Q>1u{P8Kvmc-}Cz9<)=>yJM`(Hg+7@J z`c$i`Pe+F7lS-Q&u>w6>_fC%*lJ)4wIX#-}t4B|^>yfFs9#!b;@i`Pd8YQhq@h!SU z`MUHiU6&k_bgBD{E`@pPlJYiPx^JpWOZ0RpZ?Z0JAEL|cuJgH{-+UVPWl*l-5`ubeD70PorUf#s(jptJQthuDFFqf|Noy)a?=WzYJIW*zf96EP( z4vjoMheG$wp}{tD$ba!1>YXu%4vd~d_2SvItztG6ews~Ik7v`T*x9t?=xlnvXEx2= zFq>`|&87*{XH)pd**w-*n>%^)TJ-Cc78xXJ(bWho8gxjD zob0tIdxaLw($S)biCWYmsYUDRIL|tF290?!gWPY-pdVo~XukUlIukfPUCjHY19-ojTZS& zr^_BKb6wcr_#uzsbqI%DkUGDN<9u!$$0ftIz4|X z6)H|8O{uBeH&26J=4sH-mm0J-UW4CX{m z8oEcB^wukLEpTOuoT^N(oXdT8GQ~tqrcA%d)Z#RmCUIuBv1l^w zQJG9pLnqVgW+kfrtwbZ=C~+NjC9*rML`M!OQIfq9<*ZPmuDMEF^Gk^qN-EK|T17hk zU6GQRB7ME4NUbLnx$c@G>Delh^%6xoq@_sFqZNsXCsBU+Bf)GnSL+p1~ygtUifqWhc?#j)^p-a3UFIOeE_&6Y0RYiFDFuA|-5_NUu#N^1rHy z)T%U*WCl+pwZ;jApA%^9%L&}RGJ&%kCU8xM36x|vfopqCpgipfJdR@m_3bx-9=#?!+QVIJz z$@z~X#U0~F(_$RyiN?_qm2qS~bR5|>E0EJ~1+MLBK+?vJ727st?ufH5@6c?^wS!}(Og7#gd}lQd5)qiO7)(KP1GXc~QMG|8VH z%^7KWnTO&`s-{h&|nLIULm8ZH8d8*tiPsP^q^k<rnoHCN8MU1402S;+fpOMtpWF%+Ijil0XBk6m;k(6FFf*yVyLD!y+pvWsD zDB#!#+Uq)k>^6*`)kY%-(?-y=5hG|!mmCc!mgDipa`Y!fjxx^6(LG-|y0l%6j+)8Q zUOhRonJh<32FuaRM$R$+Ih^{u98Q%thtubi!|Ad6aEjSHoZBRZlk=?MWIlE{&F?du zKP$4-_p>aOKa%CTGP0BuEK8?$$`O#e;-Ec*f5%NZ5YX(7)CYwhS9r?!|3Xw zVRTq?7_A>QjOO-8lT4{JRc1-k%X`ukbwQf;`b%@aE@@J=kft7eY5JxtO$kG!$+u}J zS^XMHTCaxEfP|s+Gkho|c?>0gyP;&cY$(_5A4(DmoTc7pD7VcHA@|Qi$mH=5nixBT z>Vt<++O8oKZaIXu7!0A=>O-iX>=3S@GMFwG45r<02a`e4U>bIYGt|8XQ~cJ!ncYgQy~95G9`1nSd9V(L~e3T^deMw5aC`sM{l4Rh_%NCNvM7&)^ zl0-u#`M1abdh}}m*KQp^vl9kTefR*n>>I~{ncU}6^j&=P>h5FNK|%-F?Z#sxS2#^ra;A zzO+fUFAZ<+LoW;Z(4Mz_XmU~?`V!fPe7yS5%&mQ>U_~D~F}DwiCiJ1o{(b07wFE8v zCP58PB`Ere1T8xzL9KfvD0aOBtymyI?HUqvdAJ0fZxo|8O$@`6Vnl2bqg+dj`Qlz2 z`Phq}7ke?)xfkxDUc4L93;AC?*b?7^WcMC)FYUq7F+Dg{-i<#Gx}g@>ja_TH@kpf` z63ty$`l<^j!n^Qoa~Bk5b-`Am3sK`;iDX~9PtHT!CI{441!zVrTJgycUc=Tu_$)k-XIt%T`^1 z@fEmURgODP%JK9_IbK_qBTKCu-&)J?`%M{&BFa#?r3|&&WoYVChW1aT=)P16371mz zMJWbImtx@W5)4Wxfs_YN#(bHx00)*AL-Ii}`Ue!Fk3}(hCl{l$p$M%niqH^Rgld~2 zlxY^>Z+9W`G7Itfd?7Nn6(VhZAs!7Z#O?2YaW(EQ&h7n+6GngGEB6=s3Jc(vT!0OS z3$S8k0WhHeTGjbbe3}p0qxle9=A%|EAHQ4w;QgCFco^{qSGW8@nD!rd_W6UYpMJyi z(r@VR{0$Z1H>8LDM(fXC_;d3Y-njij;*wtom;VK~(x2FP?{KM0H&r zvRNMP9M8ik>pbk8mIsT@ADENDxrS$dpmFODe4hIQN&SByO;Tbwaqu2 z)%*sh?ynFsze48xR}?yaMasOd@Rj@uvz#xOeDw<&_IyFA;TIg2{elezpP_#HGnx;6 z#*5{jaZKSe)>eLk(xXqP3jBn7Yd+zS$|o#p%7*mIY~+Mx}F&`z2_rpGCv~a z{6`$v_7VE?KcZLiBhqp{!0+k@EOPyTfeSw1o$Ln$7i3}S?JNvBl!dp;vk;(=1*6JL z^m&vC7MKZ-HJQ*+$wXu0d)!KU4~MY#P_liGUz+a`(Vc-6nHd;xJ_FAjGq87F2Bu18 z;P1D0h`jO+%lEv4gyB2flX(Zn{I?i)>n%QdzJ<@Sx6mH@7A58BIQ<|UivrToVxEq; z$>}g}c!Rz#-XQtJ8`x}ogCW!3;9=)$Y{_^HnX|9)Wb13#&*jVgU*qwYSFnqHg(16M z;VxcbgY+x(`~4E}@h`F3{UutLyhN1zOBj}>q4aJVj`*fQ(=-jACZ)l(_60^ge}RX` zUchqw3v{Tz!1=aR=%%M4FCrCgTT(GvI~DgOQel?OPO4k!|HlaW`Us;hKSJEDN0?2IkS6^I ztA0Pk@A!vsbbpBEB@f{({}4k;A0YDX11S1FK>X?lm_6wMp4HsPqG$K<;plx>Sl!2O zwfnGZy@$%z_uz8s9-24bgZs>T=uX;n_J+TM3waFaf8QC1AkV1neu1N7?;&to4t_8?$)KQHsZvx|9V?erUnj<^A-EjO@t)(sShufzD`b=otTJUPF`2HCW}xAvG}$DxPsTVjPFs(Qz;LfYF99&^)doqUq)&8Wh~r$8CSF}qfc)vY_nqV{Cq4Fw#8!q zyjXl45DTquF*tfT2Bo`VU_dcAFCByCUze~l{t~XcU4q1tORySs33rO4F(@S(o4lj( zaAh>4Cq!dQ)kQphd=WCi7xCZPi~PNP5z93+j-!F>2R#1x!G z^{um*cknFymYv1NF=sKR{0!{wpFyJE8MK<70e3n=aBU<$J&VMcW0BZo6^ZL=k*IAs zjk&K+!!!Ie(m0bri1!cpNQ;wr*W{2&a90b#H<55qa7 zFyz#QLY9SMc}OS%*M}laJrrH7CouQT3I05sz>Uo(P^fhRV|$OoH0wByoIj2<$Kz<% zIS#D>$6^091W~ae`0Nsbfe3+UXb5)yJchU%$B?)G7^D{+gTaVna4kHFYe`3ucjzdF zm>h*j;V5=i9KodrN5Fk&AYpz4GnI~DQ(Z8^o(CiKSTJg=f-zn_7|U9N;PyHQap6Ju zvMC7S89|ud69~)9K=_{vM3O@we$5TUfc}A)`6U4BV*=p6GXS?m0mvO30Es+*Xk7P) z={|qB8~Gz}K{NLtwz(ceoXkNKCU|1}QctWc@j$4z2i}eMK%d9%&|Tw>T@7xye%uXzG~6JU zegI4C4#2Z_Ka$SxN0H8cjQqL}i(U5Nz>s~oaeXg-812Qtzpl_Z=nDHWt_Z)k2dS&~ zpt^cD#vIuVBh}s5nYIgOH}1mA4i{9NcELz(7l=OY#Fp(laa3|Ak}o?W2hQmFxdW39 z?10gT9oU-Wgd@wHkWjuIAN;nXcG7kXd$tWTEVp50vm>0t9C2*ABW}KPK>B|UD3WkM z?}e>U(A|o;Irdn!+aBAb?csa#KSVA14|fZ@NN}PRi=0sWQw=Srg)RO8m~62#*4O9 zcz$XX9&4?_{mhlPXQhccZl#{kO=3m>ch)GA9la>u*gjh>Lc|qI9V6f%XRUwd_I!= z<|A~{e7HQFhgIw5VMdb0>2q<-ZZ7=dvRP;{6lk?MXTxS|=zf8r)4*jz4ea@&js@=O7(PlJf0Na4 z+e8fqE2hBMe+uLkr=a+$Dw5Wz!m~*QOF~s3H%$e<)0J`EP8qve5qM)U0*CA6pcf*CW;Hq7dNmwdZHHr0mn?on z%JT1jSuFV|1MxN)JQyGY=h$IT7KS13hcrU>N@Jm{G&&N7;`WlEuqz${`NKo-USS9h zJs6CcW`j{&BZbpPq_9L)3LP&7A>MirHnb1K(1?L}rZo^dG9@wIK@wSgCE*!802+D& z@FS-`0(bYv9O?cjywMLQ7WRYw-@d5u?2CxeePM9752{x7!I^&&SP&?IY9$G1dWr>~ zlwKjHvPV!;>JdCFyM@fqE@AxJPQkgiLwGi~Lm2AZF08-WCfxYdDzwVA3JaFC2%$dB z!p}!df@*!EuuH8`cw*Ba^oy()Og_{J5&i3g-}<$JvTKd7ExuYvDy$Nk$5aWrtN#gy zf+~eHRw49nEf*GRmJ7lEl?fS9rNZE^CBm}7CBjj|Vj;t=NEnn{C@e1jEBH%H~B2Jv%Q7Bd%Q#)c-^Y!pJDWZ25V?!S|ft`S`35T7O2ktae7Y zZxboJJAGRCnH3>a_lppE^-c*gd%^|9nfD?ktv*UtSQ-}~U zHAFbS`IvCy>`~!C_7UNgN>0snamCv*-AF;@=>cjOKVFTFj4FSTw$k@W$g{{22dJb$kseSMFhFlx6j#m`01 zZg3W0yF)Pkuw5|M-zIFl=^$(!y;ay5@Skv?$xiUvyjcjywiQAI8{uSvwQy$a2H`@G zl@QaiPPn>dt#JLbg%HmzjfuBRh1=s+3rR;-3dwCILbCmGA^EE@XUH!VZYM1k5+^JY z;*S{#H#!W3I0pkEHV48*BSAQKM_-7Tq$iv>K3_P}r6c%mn=2g5oh|HJq%An#ohjHW zX$c!cH3f^FX~J@+se)mix-f5vnlSyosxVnuMUX!^Sr{T#6vR6w35`D|2xUvh3qKwx z2$?Elh3Da;g(L}iA!g@D;pA^Q!FSnkVb3EO!EVYh!7O5^VAywvFmsobFfo6iAZ;Qk zbUp4bRH*e6zMt+Ryy_<**cNw-=BIXuWTRR|<@=jNsb=+}(=%#BPJ{o649dzxqh1z^ zDlh&OJ$L^j3S0A2WH&2UG*|kYNV4*iDEIXT(T$k*BDaHYMN2GSi$>2$6P3y^(Y>lC zBA>SpMXRpd6OB83M^v%?w&1RgwJrSkd3OXi>aRlxXk9vm!zFv`BJP zxG1~+gy>AxF_G2uV~u=FH!3ZH<4f2Zjns1lPGG9y=aQGttk1mrAY6f zndsGQ6Ol>PB2ms|5^Y?sD=Ha2TjZ26UDW73MdUVLQPf*ER^)$ughp#H`WJ z^AhP7SS#z7>J8TaHmgW4za~lVv$>~UNv6EsFBxN92?+_}DfQV0F}lQJ<`yMJHP7d4 z6XP4t>vhDq!}G-cVg&Hq@k=jO@?15h7sGg7=-i9fy<&DzzZbiBzFw*qBX};K+k=E2 zG5dP82f92D-O~fsEoLSLyv%c{VLgcN60`JQ-5Abuznk6I*(qiQ2fC5gA!a=byD^04 zPvyF?teqd%-!6E!iJ8vrE+n>!S+i#sKDLNiig6dpn#FAQ=q@xjiJ4YuC)yjutTv?+ zO$}mp%excB^u9P@Td{9gohn4sunY+fDZJn;_c=gcvQ*T z6+5t{f}eM7I|h`Cne(%DTrB0=KiZCICH%UqYe!NM-#?!-)hHCRy-jU6S0HBd(%K-A zFJ_%5+F<=#%${4fA?c@>`Als?`wuZ&*xrhHx%~XoTd^ZY%s!lI#hI^S7QVR^k3Wl< zrB*9GXN%c{o)+YP5VPXdk4Y(5~X4%E{V8_KQ_D(%s9u>2FhwJe) zNX(2^)FZ*4pYOPOob(a1#)>*Pd-3ymPzM7~F}vhnhe2*)w%@D{Z};-!P^^RJZZVru zTZ<_>#Z3IP7H_wU*^eW&uyqi#yX$IEy+zDUsMf+|lbCI9szIf-m@Q7Lft3}%9-%cz zT_a|FHr8OAnV1z!t%37OF-vW)#)D;if9cg|Ud+!sq8b`TVz$|?8WtpGMl-9iPoM9% zw+bQi#B6X@70%BVv$}ItxTqy&-yEuNW}28inOlV*HGZD`s^F~5ugm9uFrLKk+ogXP zKTgaxIR8V5yqGQ0|A#AbVm4FiA1sH7+4$T_^c&277jc!iIzY@?_f$gEhu;r_N@R5R zvTwsGv7)_~z5ZQ+w@tn5L3{<~)%CI)ZWXxrua`wFu0Tg=FFP@^0w#sM%&({%r+@b{ z_hdfboZHKGd6h%zYcF#!DaV|Ty=;?0Io4$KGOLO*IKS>?77xncncB-%`Iq7FlU`+0xoltWM}P2r+@v$;<3Ff<>p^Lmg{BN z2mYdMXfLZ>^cOEBd)cs&d|q6lmuVFhV18#0Gv#yRrA<9-pH~5bYkJr@lL9D}_pnrj z0^IrA!^$i2q4Tqc$vn(Q%GVyI8;}o`4?WD@JRc$HJ?x}XKB`iA|GGagc-+HkpZ~$p zlpZ!Qn%BRvGpvWHp85^1BRy>6=HCeL z?O|uMe#6(Zhkfb!g}rBIR6X6)*g1;@fSwe_OK5+zmUJKhsh53g_zYn z%>3(5SQ+!Qg_%W@AJ^Pu5O)5QX(9Jyj8Q;U! z9>{~~s2&!#C=bu1dsyp;JdBs@Va7#2;M&{GE++rLi`H(|==B5r>bm)J{R5)%ZWcT4 z2X+*6v#!cqgy(j%b&qm!JG-0R3(Uofx7}>Snp|Y0b~9JyT)cbO&2k#P<9SjyoB!fF zZeHixJ@Fk!FLks28^6QuOgGyx?K@_LcC+stIcN#&W`^%_knGjXZb#-|^Zsr&!9E9r zc6PJlvvY9GzMF~r|$yIvaxbe7yI({BNFs^{bg=%nAOEJcYnlE z^)B{@J|cKx7YiHq5o}}^TlnV#ss?wl&V&yb)~Ac5czl3*TPNFL`~mZ7I+^;I4-kqw zSy@>Y^zu5{wfkAn%y7LS}L&ds3f?GuJwqe`+SIE_AZh zCo&-y-pM9z%tTsHC##*7iLHk^*^AEi=izZ93Tkhxdpw?_}e3 z-b2>7lXdiekAvuBxnDEzXLcuhbU6b$8lCL??hN=(>|}=xGLSK%lWmpBK!2%DwkrP} zbb33O-mQ1AY3g8V2jB5Ac?XkU{thSqbg)4R?{MKu2kWYMi;HhNSi{4&IQ^`HRR+F= z-<=Ltyyh(&uXV5jmA5d8>R|az=@=Qt%P-UM+rNVqo=nGi_YPLRDIF_!cCcElbadEt zu=d_JIKQrg_51h++9n-r_{BGPVbH-Q?|6fSb351^{WnO}=wQZ!-(cp%4z?-pHO|U) zFpnFr(JI-&P9J!UWnJy;?&8-tUDwXOje3pm#qF%Ma^;q@pdijV->H3hT@^7UP$Shpdfto25c3 zrHyTvoC?#pHukK6A?$1$Q%qxcbF7U8hA}jF@%3#PM(k;0>$MoB*|)KGz0aX%*~aF7 zd=7)e=QAMrn(%5Hs{jHTvt$Yfnx2^2Kqo)}7q?IiWev0#nt?b9Tr%<`n%AD1n z;_As(*1zou#`(9h==3KD-rvgfBcGt!v6cO@e}csuTG^qwPjF^MD^nWq1o_m;GQK^= zIPF&Edi60@tF$u3y^rA`-^xB2J;sGWt;~1CW8Cd*Ve^U~;bnCTt4n!=^!yeU@5{@d zT9|{`Biw!2!qg@|!i9S+>|et}cwTE^$!QO<`fLkxJNXdfkG3$Q%@2|9*}{g;dWbX5 zEv!i5A(q&-um_(Wpk{Ro3yFDvBMVyC)?E)UVNMHMVDJFfR9l#m>;rC7Z(;rZ-p9p3 zEv!80K8AEQv+Tq7;ZoJi9){l{cQ>(`RVmn6)5N3{Q=p#T#MJBWAn#)nTmIq> zd{Ud(uCP0pl-$J5ZMuVdF-`3C%sZfyO{_`c4$^#@n9Ap5=zIT*z6{@tSAWsRhrm|lq4(}*~D^uli=0AiA^$3LSl0x+o7C3(d0|S)YnT+)!?02OcHDY(yh#2u?(E-$v$a zm57kW23Dhy2!)~sw!1R{mp(VJw)Y9#cHO{yq7rZ-xq%Jak$|>K4J=xefOVk_Y?gEa zZhJMbcYos1<=nvRZpVW|@tDNnczBpJu$WcxNYrm&3l-z>ZE6FnuD^+awtCmI>0@p{-KCzjS6oNo#(MVd@pYUusb^6~uVbEmJ=?wEI=*Stv*pvT!(mK4 zQ}4NkM#*|6_3;{9Tk2R%^fgo!*RgLd*RcLe9ZNO1hSV2z?Dp_$7?)JXE)~UL=fyg9 z`feN^9jjv}{NvE>UdN8EiNj1so==H`&DuJ4yzMId7S^$dcUKXuUB{x&T}85D9ZTGP z6;FoMF{aP+?ppSBD6jul%c}ldLG+JWHZbW5eA8>0n)em%pHRz|nO=d`pFcI3Rbmjro&~h#kI_F{$*Irsbz6emrLps%2?#&*6`nVEOg)0uni3{IF(Yv?!1ga$)y@LBq9cy$7`6Q zeGGPZ)UXVl7{of%FwH?R_-IkXBJ(bx(XfW~O}K=iS~YC#5NS#Eta6pE|anwQZS_^F!xI2Db5&#IY?eKg+OtY#HD(TI$!X8Q(3!^W?g4g7f# z6L(d!3ketT&AOV+J#-P?#?|c0%8O9Zsb;Q<7m+%-nvHI}fYmb9EcMj|Ndk!MMe{8t=Imo#DV?#R6B5(aaCY5y-=NI#G z^jVl`^Y&e5(Ptv>zu+vcOY!wbo`q3MCDSiEgWSKB%=8hron}=sr=w?3^01N}u|9*1 zS1MV;j5EkOQOQ0_oWX35O4juy5-05|+0?j5l&!90)(0Y?EvjVU#*x^oR>?k$i^OfY zN;ahSGzxku*vc2DF|e|No#wXIDc>qs!GEVAO08fs=ADLddQl~M91F(}r*dX$6OJ`&%USu% zaJ)AtXFmPHp);+VDSkhRbEC@H%Nr-rBrapyJWpcLzcMy*R>oc_oTDR+94cdpPGQ*XP{wv44F0BNOm}z~PUx4hfhC~`RV`zA4?+sCC0drL}LN7Hdw%qnGF>Bmu}P|Esnd$D`}QZ~f-IC^VJn1aD^c;=R{ z86%FP_C*O>TowYW_!4IKI0R2ml`y}M5R5!j!fx1xzY*;#8o9sJRk&B^Gld^ z-Z3amE@9gek74DI5_a`4w=Fjpvl6poIPs^LX-qkW*z{tyr{gFRl8RYs)=?y$EoQ@G zjv~&dm^r#0#p&(E?A79<@H8)G%G?gUUR2D2YK}llwV2htID&5JVzx2j2p>-sv22GU z@GL0e^94ts`L2k)7U<%irDM>!I1SWVkSp|5wpFB{j?6o6!RjsV`ea} z>KC!T{ez*PQpBQjgAh2hhzSWn_}5&>ioAlb=uaU#W)_6AZwi_2lpqw|Dr8k1ftVaw z$S!{f#0IZIW)mBTqgxBvq^@k_CQJ+$z}>_G*rPTdzib@^;sj}P8` z&u7k`eK3IKv%7IV(2L7wz3x762+3zFSNhRc;hewfTT^M%_F2OZGT)XQY+=9Ei6WpEP4#C~sUDI``4nc!E!QI_q zfUmyn`JOtucl1iB zk-)<{n&;XGTsnD2dyE=^7CY|fsp2DWcitWKzGUz3hu_f^!-nHzyE~er$Z+^nyQ53b z4Z}?DJ6dw^Fg(k8N8JU6A@KKY?Qmu&hCRHknFb8Sp_8}ugy&Ga-F{mqo*aVQ^KNUs zzC(avx3yTFA!y$AwkAJ57`>|8)_1)IV`%By`Y@-R1Ms+QKmQEEz#sAYyvHDPxficL zvkyYu*m%w69tgiJ@oGd2MCzz`?U8LDZVimrO-Bb{Rf~9i+id{al#f@*Isn;=$Lm7v zkJxna`nzj?bpLcqyJzW-ls9kbW3wNYnYXk{*M2Cu_LhF}=!fl-Z|MxPFG}{hrM_MJ zVp)S*de@^bQia{pd1fDU&v#23ckP4YNpET4EPasu2w z8}W;7s%kH!9d%QWcI$ zjJ|V2*Y)Uuf$kgnK1UC9*lX*YCzuLu8CLsRta zj_LVs=$yRWQ7!2WEpe(Fem}pir}}rp#ltB-+f)Z;=1DL{OkI9P*)5Yc3lq? z>WU<7uIr5RT`<1lb?r5*3;q_ruFZ>eL7#Njwch2@_{%-3dK9U(y{boMw@2kkS2Y~%;f%PdPhYizSDmXmbzwVX47jS! zO6~AA`&Iq^p)HR6x}v(gEu!vS(WvmYXcTirdwp*Mj}2F}@wzrRIpvC0uh#|xdS20L ze_JDGy(?OOYisNeyrP|(wnp`wS9D_X*0}cjvhLZ_3eE0c))#GB;abdP^-A9g)i+$$ zK}T9*-;~RGzDrBw?0H%Jv$aJ3x|elTObeU{xU9MRv_R$@mvyCQ3p+b{Nqys*W7geE z8aJdlVysKruUK=uU3*E3UTua9_G0ouB{gQ6=X$GlvNh9wzMOEKR+Gbi)glD;= z;bBct>Dxsu|GWu8Ze7%h^P8Zc>!Q}J*aS&eUes+Rrri0^$~FFdV_y!GwZd3Dh^(EjTc>tagw^ZNNy9qj#aPP4D6gKP2U zv~s;V_~1IHk%{Uc$;xwja%XL%A9GG~wW*Cv9nR_C47HJ_@;QBI*214+=d?-BT6mG_ zoZiY?3vsW`YUi^xvEl4l{WrWOhVD44>q^x`<*2jT=ynaH>UUN>rqw`fgR^?uQ3FGQ z&g#xr;V7KrtVS&f$H^aYIx;*Q9pdA3;IHcV5gn&Pw^YaY<#9T-d3B^79j6=8RL6w2 zaeDqpHT)_cr%5BKp-bU7t(d18&L)e~S#ee2_3Vtk7+w{lPoB}5rK{rHrZZ~Zse&w1 z&uG|;DySE6Mq{K3Ce=KnP2N?;fih?G`-;lAli`f6t5X@j-=Ef2i7Lb6(rGQcyAlfR zIjvvXRYJ+Rr}eUj{W{>ZMjxw)f{jk=?g15%Iry~hEm{%3vY*zN>lG0H{gmFBQ~`T$ zp3aJNHXIh-nTz|`9gmFqo?ktDmo~QI(+j2Pb z=cGn>ltZU`C-uv*viPYdb;`i97{BtQmMUHrsUlBm{7u+Dhm$&QD)6h^No`>OT?(F5 zpLc?@iBD?ARRXU^C-iqcL1fGc{gPC0e$5H}x!*vxaVIoQR|5?@oX`@v4NR+eLK~cQ zBD(MiojS^i$4O7fz6*;acJi?GU*>T+w8;Y-wW3|KJP+U3|t3|v*v3_l=e!3Hae&b^G+^i6U zbcoe`6+-Z}Lac838jP)lVs-PTU^Gt>s|Q*HBhjN{dND&VR=JPqcXtp%S0B?-1A}lX z@|Z@H2tvKK$Mn$cK--vgOg&}=qGtYMI;27%^lyy5`5J(d_hPii<^W7LWAtas0K8Zh zqjNI_z!(vuVX^+0(jrFR4)(`+M~rSS<&U(vV|3VkKUDbX)`oNa(C4OGomKs?=%8DD ze*5C!0=N3^^u@)2_He3$FCI2@YttOQcopE*$T%Oo@o?+D(LQ+o(b8`LK8U|)Y2_E* zIKI=;Rm;4wd8VbQ>v>~hPfJH7_eM)w^pN;S8F-blG^$q_d`N9+nZjkT^TkoUaicW4 zoII*CrK4M(+p`O>h)AJxL&N}+v+qndbYDg0OdsJ>}a3bP6v)hAg?!CoWjtJ7Xs zc~|wnQC`U7Qq3Fah1p9~tG_IXe?wHquPBMmO;qC=l*I8M)dHzY!ZWMt7%hQbpG^JG zzXT3mG__~R68O2p)Nl8SBXEYPGv*aXmk3k+!i!^WbyFYzD~3bGOi4q<-i5ie_Rb=>mBXcjI~9TJ zYqajjQv{2yMC+$Zh0$|&v{ss27|vPIx)z0zxM#Fx`dSF?@MxX7wGf7uh*ppGg-|j@ zv~J8<2v;5-(drip+V|lj`g1}-WLkMd4;lrrZp0BC`?&!8njg{TTMFP{$Pq2qt^k6v z9nrv?1+eYYVGX*FAD$NvYo&?#F=6{*Z72EheClDH_9Y)GbUmywTk~Ol<-?k)Lq0q# zbXc3`&WGZO4r}x!PjtF_NJ~!f#IhrYbbUEb#4S9eK0or}%YZ|AVrO1tuYX7*y5xng z&mr~9pBEL=9nyQ(^Puj_gSu^I9yB^}P$yT(g9d94YTv)P5gvI^yB)}F?{+MU_Z>ES+2-8CC7nENz)!E6XvvQPcuvtrhuecF6( zRy?i0PiNQ6ia?)zdOdko3{SgHOCHSv*YmwPbx0O`JGNJU`ei}MReN>NYY#LUu~!qX z_rS2Gdv!@`4=f7Ys}*v3U}vVi`u$R7Sa0@d^t8-4eQJ+RubdfY*X_|B|1#lZXqVI>@x@vVs)Hu6aueHbs&rQ2EXZDPEIc~Rh zyO;sn+w9iUQ!^mKxm!ajXF#DGyLIos^tkeAm&%d!7;%1=UbnMp`M2!Skv{1WJzvl~uA_ZE#-=-x(Q=s~pZQAfla`>#@rct|+BV*(? zz11T*o;Tm7ekGIRaL_hg^fVbJWZI?~)+9st>#aJcbuy$nu~m!aNrt1Vw(5x+NzrHc zRvk1iDe^SlszLRVLVdStk_<`FBJEbacP0rwJ>8qojcm3&5!?)UAs5w>vDhO-n31+#Py#f z@4QJnhyEwU%5BoR`+iHg+?%wi?{8`NWuuPT_DkBG->B{qzohG?jaq2^Pw6^#qpmLa zQ`)z*r8_HrNaNs*`ZMc zrhk?3^)~3m)L$jM)CO%e>5HUEzClwa|01#X*6YQwpJni&^?ESTXDKpgy}CwylDLTV zdjG$V5>a`*799RjlI35okv~7kq95z@@8Azo^zu4g^6kBB+qzC04ty`AC#=)bU*5@v z*6Xxz|96r*be)ENdMlGMuhWRWZ{^*qwQ7ENBXwfeYMDN7Wb^X18vXvY{28=XyY_x9 zHR`U_fcLLtPRX^JxA!Z#l4PwGdH+%}+*zaHy>@EgLJZ&=FhX zrBJ>V+R`Up7Jgf-P z!ka77=F?K`*zbyrKC@JF{N)X# zwODgkIVXu?7HgMtXXV`D#d@{jS((>&v9`SvCylBv*0detBxAwFdgJvOiT$xiWBQ+w z{udYNx!Fg( zDU0?m)To0eB`UZCBF9+Pi<7HIvX$E0et1=@T@jLglyK*#2Ykz3#9>zUPV$#s6d`j>V~!}as^ z$N@_xkC?CR%Ug1=!F=^PdsH5H%~y{mMCR3EMSKr~NRc#-w@r zWt=HZThG&x8BJ*&G*62ybxE6a^Ync&m$Z01S8wi#mbypg>LWx;x!H3yUEC4z>N-~& zH#s61%g$BzL=dhf7Ge^JwcSx2To1-yP4oTM~b96`cL*m+Edxy|rJCubHj)I`5Z=p|f@Smwl41?rdE)cAso4 zHe0u4+9&cSO7E`NE9b66sdt&Z(qv1Nu8iIzcOs+g^Vc3}(IiTr+}thK%0%g*F1w|A zvMAm5ZI>L1pQYA>T~cuOEd7>smyDk@OKYy%DUVvs(wKmq;tZUn&5!MnnQ3OJM}r-5 z`@u|o{b;)sJ~&gK_S-I?I4l~s`cbmkA&D4d3w@JE8Gd1hJtrGfdhVH4f zRob{_Xy0pFWXzlyTDS8SS>APq*89F$_F{(io4i?$XPu$@b8VK3ucm9xt()YAHC>k* z_UnS_TH*Xgxzc00rfR!UPFI+&A3ko7BRQw*k8vAh{kv&eDEkJP7CTLQY+5f7OQz{f z$9k#KXPS08w@&g_nWkCVu9G);rs<%wKrCGVigI^1u$%&9S1BTp=o zqy;DIh8D}D_qR#!IEE!f$)W<6qNsU1hwQ2Ao8CzqbzCUYckqb=JO&u1>qpuTm z+^+?aCT@a`p1nXyubQCCODvG^ffMx3(fQIoe1b}o`7$v71hwAHlks21Yp03xWX9?7 zS}NZ>nZ07XW;rldX7wMhp0(%7lxpL(`m;GQ%5%If95qLJej2AKa?Ft?C&%f+owG%j zjnnXIv&FOTIL-esN`6!xr`d-^$@$#l)F(@ntb9LKyKkE%5wT{+zsir7LOX_Q z@cnTzr}1!|H)5Q8|2s^x<{l>vHV)H+2gl0#I>U5Cqp|Yt`%vxpd5n}* zc7G|EuAhF3>L)Yz_SH&P`pT>3ef5T&H#d^>)m=^d$b`*(^up5Ka=dOI4ZPn=et+++ z_X_or5-WS_`OZD1W|iKWY-ozK@Wh^LlCdzz7-R?4{L*c9+OUJ#~S0lR;B@ zs#mgZ(!sZ3V1RT%?Bvcy^ZPxCkxMv6Bqz7ojb;b`;-S z5gPxggWNsZT~|0d$e7OEb<^1Pk~e*K{c)z9?AY5)XJu(8AS|^=-s^ zV^{t0uC*+y)m1lzwwApF5MxGX4c*>c z1_pH2nLnDzx?7#JRHbGTH@cH%jA|+`i*{1SohI@(uA^=((L~bp>!|GqHkJ%IJ8HX_ zMv_W9=!T4qes5FJWk!g{<$=e*q!aw^Jjfo+NiybtXf~X|8A#67t|Bq)$P>d zXPVeAZFS<6+VUx+t5y5nbM@mtYC8`Y{Tttz(AimNM0~I-|LMt6ovI z`#0AkD=Nsr8_o2@=kjuRL^I7*y}axx*i84WC?{)AG}Q%P%F48erfP+km55AD)qgeY zb7d2K{aqwW^CtSHwn+Tn#u~W6ki}~oYwRDV)T!23mo;+ApEr%vwcR1>W;fEpDI8Kh zxRG9N9VR#88|vwUq0(`5Lrs-AR9+Qss585VNS9L$v{h`d-0smp`{xUmYMC48r6EDG zeSdu&awSkwH?Oaqy#uB7-+H=iN`P!xQ&00e^|yb{_4HvmfAM-%U?(P_4Jlk$7-uzTp4-SrM8BZEF-Vd*48PL zO3S^SwY1Q)QgWt2ElpCnlhh#s(za|(ZQP-xlzv=8n;k15A1Bt( zwS`N_4zC&-GQPNUI3I5R{)e@J>hzw3t zU6-FLEPvKk)6%|$Wkl6#nrv<%`TVM?7Wr0C+Rv=2Gny5YGk#V7U;HU0uT@b;!2&XN zNEID5A-`PCQ$^Ff$|re_R@VEq^GVD0mG#eFPg#(>vUbenDW^77(yXKN%BLEYG~LrY zlI?v(tz9FJ_|2)PH+ScjNdCChOmq)vqyGrT3h&x~_Cq@eL}g z%NAsj*EgVd6J?PV!=POvJS5x`>b#y=-W?TfRz9;#YcG0qTPC}cB-%S?CfT{suyckP zB{QMD?rWUVCp*m_yDrxa7L<4iDlJS#6G+=5< z+2|FbBYvfjV`qakV?+x3eiN*(Zzq>$nS#}$R&sf>CrHO?GI`T5NDbd)^7LDvmRn=@ zQx*ld*Dehc$@>oe`Y7t3 zu`9X1P8s^wh}h_-vF-mD`KtTr+?xLxaj$&!d+=|g?{r^%U+|Za$=g?lr~heey5OTr ze||R{eSNg0WV;pT;N?V7%HWDW(rD;mP zGMsC@v_^rKM(;{qS}@xSWBJpPIz7#EBX*+wn&_GF)E3be{QkuFd#Z%ic=y=w=w3q8 zJbPs1Pg_D;-+O2j-Bw(y-FRRWtyNr4T)c1Oe^*T7&)hRSW);)%$L|{de2VEY>yGjC zVo_b_x@{cqTT~MrjyG0%6xDzGZyEje7SVZoZyIGA7E#@O!$|(Mu#Vbw-8eqKuwL1D z%@`eASas)BBj83MExYTA@nCQvZM6HcF)3#uO|tirQQ~kxt+fB55!0-o<~?-5X!5Io zPK`cqJY7;iXC6Ig^mG=`60v8EcenFvlhbiV_YwKk^THY9e%|~#^xA2oj+sv*?wm3X zwaTYo9-lPw{Pk3iHz$lCD?Ih&m*d6-*nj>TYZSPjS3jqWHM)<^YtQ$O89Vdm)uEm- z#=E0=G+#-#QM_#)Z5Cu1%@XBNuL?(viK}w!oH}Z3FPB?qw=#|M4{~X-9xmf$WG<~g zJlgnMAeUyFcEm{U&Z)hY9yYSK%c-rm9Wrty&Z$q$gGP?kIW+0T14f4OIrQM8{YIjP z*){36ea4%}?D{nIKI3wM?AkitUSqG7O?wCIF=n*QrrE3SHrgl3rj6R{GW=F$Rj)xi zjo)Rn>cSa2jHCCn=+gDujgh0XXs~WGg7Rn4t~a(C&(%ZyKW;JRwf4}tX}1{0-^@C_ z*kGHH`V>y6TRGil`m>x@0o8THK7wT6F- zjQafZ8e{vf47x1K8l%vX4EiEqwJ|3wgPv`;%J}bQdaXKWrO|FkdTqXFg<<7LuPLIJ z8@Ugr)9Uw@8NC{()51xX8Rpltx}exnBjx^qefs_t=M<5G4)Cs9kpkrr z*_3+l-fZJyL`toZX0{QZCZ!Gzjxz3VPN7DJS;qZpDRgnvOykz`wE2jsMxP|fG<^FMqvq z6r4zh9UNmU+WgP_^)AwQ`0THlrFf)KpvYfy`q5EF<92_{LjEI-u`B*FU#}l-th@c& ze3pBd;mY~j%rbk35!dLK*+11_xpfi#hRKcVqR?&*rv1-Hdt%KAFkCbTPhv z`e@D`(%G2j^UDwCtPv4nG7qm6D7JO%h7i?qXZvECw zy}gw&ddVB}S6EBq&h^)3{!`5jpDeGr zMxkUc%)6@^7}d%>H$#H!8=XfyGmoFGYYaQ|)ST3@jxq7e6LZ9$TE-OLC+3EQHH~pS z9-B!6Y8V4HJu>HCsBW};^3ZJFvzlQPcxX0ESJlYU@_{*KTV>8jW>t+7{2HFMlse`EKptLE{Q zen#SKS52dVuTj1374t<(A7je2%jOxgjNv|U$$T)NwDB?VC9`yyQbsPhXl{R2(g+=L z!R)ZQgi&|zd9zNd;zrwd=gi)@iy2)?o-yLuWi$4{Dnz4IE=5}h;?f6r~ya-J|9RxTsu zpyTG|sX2|qyJF2cjdK_sUmr8Q3THP`7CUA-KV~)7wv92zT3L*crEc?Il!p;}%`*44 z&umoBWSPr@G8reskD6xcj0PsCndN?ZW4rywRr}K!*?zgq4l~jkg92S<%g$+x3%#Pv z>E%)z1veitKj%qh^mu&OjQWwn*yVZH?07x7@utZkv)BG)Mxi+e&7Jd;8g$lZ>J@ScjM#L6VyF7AMTff;%-0*?(zk8d^Jr(Xbx8&SpUJkh9 ztXF@d*}izZ^V75qW;@TD&gsY3n-{WOcNX}!&fK2qs&jkjI`dch%g&&FYs~}cFFFrw zU1L7Zc;4yzbhSA;>sjaee5=i=dCoYqG+kw;D0<2{eD+H7lkW-V-7_o9T4iIMp~+U5 zx$4F^XUcN3Q3uO;Z_qL`@lbUZ-?h~Aob7T(yj)^#*?Ppesn8O0pBPx>!%er`3*tafyP^XP)9rf2&3 z&WRVMm>pZqbyiC?#q``Y+nK!lWV2fGD5q=aB=c#@na*B&CYoOlOn2saJ;5B5Wtual z@C37azbVd6EytS|uS{|#nLp0l95T_l^xRnU%kuF~?-XOrJt@XHT^M6N>O00+d2pne z=IChWyf&lFpp_$>b1sfFtBfD&oK${uzq z)A>8uAk(92cc(RQfH|pp7w3p){me&oJ376a^fimLYUjLhvbR~YS8L~>&|YSX@hzO` zH}^2>t!(OCk}JaWKHA8ce`+`L)8qQiCBM3u%hT6&riFsJ~Hh5aeIkI$HbA0g%&e&zG&1JpHI+LVtWiCHrI73FZFejvSI6J;=W;SjY z;+)c|shPnQ=v;rUvAHvkzw@v(GQ%Q$oX58}Ft@%e?L6gK-%Qce%NaYPu30^BxjT*Xn8PqvbWG)J zxW!>^$eY4>H&>Xs=vGo^n<*jYfTf9@@jrshfw6xbwYvtIH(LC1MBnf?GyM7LC|K3c z%)RNOBl3Wc`Mc#?$E~8?=AJw+9i`@%Hp@PF;uw^yl)3uA1ILm6CCyuN?l^utDsDa> za?{~kznFQp>s3cPcM)?^`-_h0zJ<-4ozFUUtt@Cp_CMvgkfDHSO^tOtADPd*zSVO4 ze3REacHQMj-ZGClIqhLbnz&qMk?{SFG>)9+qB*-A$v0;=pFG*__?aV{nX>#A$McC< z%%mGPI4*w8Y+ld4*0HZ+CUacWO2_Og8O)SfmpQsuNN;vry~ttgPHQd+o$p9fAdR{C z)@;Y+nW@a#<7YbN{Yhcg51Zzw-y^yC=KCZ^n%hauHr9BDR!?GXn={7I<4_`V!`%^% zQnmlOHf|o|7*OiBtL2nFj=iaVxMD|icf5T1#r1GpM@P0}A6;n?<%Oz_Zdo6>+Sjb$X!G%&tKVJ2QS&kzamUW`7hHYg3px7dJL@|2(9_}j`;_a(e>ojbZX9<^WrNBCjagRO}j{}nsn8aC`#*o35eUF%~% zhNXP4(^WqBW!PBPHdpNn55m4J+Uzt9?ig^!*-F>#$m1xcGu+qmCxcusD2^+X_uIpOiwPA;bN4ehRUl#VQ$qd)?&HY{o6+V{42*v|TOT=$=QhV4pI z-SyKqYuM(P3a%ul(}XRxk4nFHCJvkEAM836_c65FD<9XeYY#%JtSRYAKk{N|-sXi} z<6^APH<>+M@#}Yo9yp!dm96;N&|zaTxdN-q4-E}V;|fkXIrP(qq%NmxP-u;MzoV~g zZymbDdKVpXyK3k^pGVPMD*1=jTzM_J<4e!bs0^p0ea@r_Jv-7B9d+(wNRqcZquY(T z7~RK&)4A3+u+aN;P1oW@5kWp%i!j$MR>mv-hYJmBjNo?c)t?fzl8TQ;r&f`zZ2g7g!ehxgy%uw`A~RX6rLZ2=SkuDQh44JoQF{lTa6T2DSB2+S;dxeg zz7?K#h38-4d02Qp7M_=d=V#%0T6n$|p0|bPZ{c}dcs>`N*KM?S!uefzo)@0)h39?Y z`Cs@vAbdU$J}(HLAB4{n!siR&^M>&GL-;%*d_ECAuLz%CgwHd==NsYkj_~DL^v-I&QFB%6ybbDIByZoUxf1* z;e19ouMy5~g!3HXd`CF%5zc>v^C01TNH{MN&X0uiB;kBXIBycppM>)$;e1LsuM*C$ zg!3%nd`md*63)Mb^DyCjOgJwS&d-GNG~s+rIByfq--Pox;e1XwuM^Jig!4S%d`~#< z6VCsH^FZNzP&h9X&JTt2MB#i#1z=ds{?7M$0D^ILG93(j}Jc`rEs1?R!wd>EV;gY#o>o(#^H z!Fe+{e+K8#;CvdKSA+9waGnj$x50TgIR6Ic;oy86oR@?1b8wyx&ey?tJ2-y_=keft z9-P;M^Lucf56<_&c|SP+2loNsegNDTfcpb*p8)O`zn6A>e)l+?Rm+6L6nmGglJ!E8xBb+`oYP7;rxW?rXsP4Ywe}el^n{%D89|iZN;Qkccr-J)caNi2U5kYMH@FW6_v7Hc9NeFS`*d)>4({8*{X4ji2lw;fz8>7)gZq4NzYp&F z!Tmp&2LST{U|s;s4}f_BFkb-X4Z!>Xm`AYL0}1&AFs}gS7r;CNm~Q~{4q*NP%tL_r z2)lcfke2}S6JVYK%vXSU3ow5H<}tv02AJ0X^BZ8E1I%}Tc@HrE0p>x#d3&jjY1z`PTfe**JR_U}I-9|h*6!2A@Lrvmd;VBQMMU)lWbggh3Q&jRyWV15hC zbAkCTFz*HCzrZ{gm=6Q*|8M}m1tFh2?ADZzXt zn70J;mtY*;b2}I z%#VY4axh;G=FP$UIhaQW^XXt-9n7zTd3G@04(8p#{5zP32lMe@ULMTPgL!%|Uk~Q( z!Tdd##|QKIU|t{0?}K@MFy9a6{lWY{*aran0bpMM><@r_0`wn3L0qjG7{Rprx0rn@rJ_XpX0Q(kT{{rk|fc*@xuL1Tqz&;1q z?*RKAVE+T`gMj@IurC7kN5DP_*e?P5CSd=>W_2a>QNVr**jEAjD`1}m?6-h@7qI^V z_F=$&4A_?e`!isl2JF{>eH*ZU1NL#ieh%2z0sA{(p9k#sfPEjZ{{!}cz^FgZC$Rqn_MyOj6xf#n`%_?_3hY;beJikk z1@^JPeiqo*0{dHFp9}1FfqgHq{{{BJzj(ZGHh*jEGl zYha%Z?6-k^H?aQ(_Tj*O9N3ow`*UEQ4(!)~eLJv!2lny6exBVuP3Y@^{XMYH2lo5G zz8~2C1N(qrKM?E-g8f0TPiT9868eQ;-w^B{f_+4=p9uC9!TuuHX9W9=VBZn!KZ1Qo zupbHbCBgnA*rx>hm0;fz>|cU?Ot7B`_BFx&CfMf$`<-Cl6YPJ2eNeC;YI}$h`l4We z6zr3N{Zg=R3ieNJS4To073`;ieO0i(3iesSek<5_1^cgH9~SJ#f_+)AKMVG0!G0~+ zw*~vRU>_Ik=YoA*u)hoTdBJ`!*!KndzhEC2><5E=VX!|8_KCrMG1xZ-`^R7(8SE#6 zePyt}4ECA9ezWZsOXxd;{b#Tb4fdnKzO?;5PUugAeQK~@4fd_U{x#Ug2K(7yUmNUi zgMDtW-wpP?!TvYc2M7D%U|$^UkAr=3uwM@L&B6XT*hdHZ>0n`}<&@AME#oeSfh35Apy& zJ^;uI0QmtRPXOc#fV=^aKLGLwKt2J;D**WgAkP5g8-Tn6kbeO35I{Zx$V&kE2_R1a zHiKLPS6 zKt2V?s{r{GAkPBiTY$U^kbeR4FhD*A$jbov86Z!?W}PSSH9+2m?e$9FZ-6`wn@yR( z=Ky&fAiu*teZD<|Xh!Kwb#Q4*_{1AYTOJjez_SkVgXYNkCo+ z$S(nTCLrGg~)O{1uSL0`gfvUJJ-?0eLPU-v#8o zfczJb2Ltk9Kwb>O{>P62c`_hh2IS3v{27o(1M+D=UJb~v0eLnc-v;E}fczVfhXe9) zKwb{W&jEQlAYTXM?ST9pkjDe^c|cwd$nODpJ{a~tz7NRz0r@{54+!J~fxIA)9|ZD* zK)w*j8v^-5Add*-6M?)UkY5Dyj6l8-$UCy<`w9FbkcR~Fkw9J&$WH=!N+4eeFFpw7p^20!$7|0g`d1D}d4CIl4d@_(%X8V{E_+=o^4CI@Eyfcu0 z2J+BAJ{rhN1NmtnPYvX&fxI=4zXtNyKt3DDYXkXhAkPhL{>OI%d2b;94dlUrd^nI7 z2lC@Uo*c-R19@{Ge-7l)fqXiUR|oRzK%O1Qw*z^1ApZ{J;emWSke3JY^FW>+$kzjT zdmw)g8<1bKrXe-Pvmf_y@d zR|xV8L7pMVHw1ZyApa2LA%c8Fke3MZ6G5IL$X5h;iy(gy(Bgl6I zd5<9f5#&LFd`OTN3GyRBo+QYZ1bLGne-h+T+AQh>J|)Pj1o@R9&l2QYg1k$Re+lw1 zK|UtP%LMtEAWswIYl6H@kiQA?I6*!q$m<08ogmK>g=Pmuo!@<2g8D98&1`Jo_B z6y%HA%>4x3D99fLd88np6y%kH{8Er-3i3@s-YG)=$3F#ms30E|N0J zD#%|2d8{Cx738&o{8o_X3i4e+-Ydv|1$nR_9~R`rg8W#JCkygrLEbFLp9OieAfFcG z)q?z5kY@|>Z9(2G$iD@7xF8=F9VvtV^@`^!zF~~Cp`Nkmc7~~&= zJYv9}V)PLB2G|n+EyQAded4Q-i!}kY5e*tTE+(d~1+*4f3x+9yZ9w26@>aKil?r zCh)XDzBb6)2Kn0{j~nE3gS>8#-wpD-?RjYe-y7t8gZyuh2M+SVL0&k>4+nYTAYUBh zjf4DgkVg*k$w6K@$S((Z<{;l3=84dFmiv9ptU!_y73oAdem7 zv)e!C1YSGHZwGnqAm1J2z1umO1pYh7g9rKWATQo_Ve-{>PsO zdGsKk9^}=7{CbdQ5Ay9n-aW{_2YL7)A0Oo9gZzAurw{V=LEb*d-v@d8AfF%P^@IF= zkmnEb{XyP8$o~g@0H7ZL^aa=~-voaE=o0|_0-$dI^bdeO0?xzXSAnfPN3q_W}ApKpzO`2LXK{pg#okiGY3)&^H45M?fD5 z=qCYvC7{0q^qGKu6VP`8`cFU~3g|}xeJP+n1@x(aeihKS0{T}#9}DPb0evl?zXkNU zfPNRy_X7G~Kpza~hXH*tpg#um$$)+t&^H76XFwkf=%)dFHK4!7et#$UY(T#a=)199 zXM6tNe*^k(KtB%X%K`m4pic+%>wvx;(7yxvctAf7=<5OfJ)qAA^!tFmAJG2;`he_x zOoAT>^aX+bAkZfS`h{%YdV+5V^bdhPBG69+`iek*5$H1l{YIeg2=pI;J|xhO1p1Od ze-h|Z0{u#$Zwd4-fj%bC&jk9KKz|eHa{~QNpzjIvKY>0d&<_RrqCkHX=#v8dQlM`N z^iP34D$q{_`l@j1fBq^o|DVqa@Binw0)1DY{|fYBfqpE|mj(K>K%W-q*8+W8pnnVW zae;m=(ANd}yFi~8==TDBU!eaB^nrnXFwhqU`oln<80Z%RePf`14D^wKelpNk2KviD zpBd;k!?6GP&OrYe=tBejXrM0*^rwM7HPEjH`qn`I8t7xQpMMhkY@n|V^tXXNH_-0} z`rbhQ8|Z@r{cxZ!4)n)?J~_}Y2m0nf{~YL}1O0TMuMYIrfj&FXZwLDBK>r=+!$ZDS z34T1#mk0XuK%XAy*8_cfcFr)tzX$sGKtCVo>jV9LpwAEV`+>ec(EkVe06{+>=nDk> zfuK(i^b3N%LC`-4`UpWkA?Pav{e_^<5cC^@zC+M|2>KB1yk~+R5%eX3{zMGPli*VX z{feM(5%e#DK1R^b2>Kd9e((02;@ zPeC6l=tl*8sh~d<^r?b=RnWHz`d2|8E9hqheXXFs74*4+epk@<3i@9`A1vsH1%0ug zKNj@Kf__=hHw*e_K_4yXrv-hrpug63ktO(SLBB2Ny9NEXpbr=H%Rj|YA7pkE&J&4d1V z&_@sY=|NvT=&uKT_MqP$^xfmc?f;PZ_dlf0@CRG$*P7-2And6<*_O;)>Hrdxw`hukA=? zt+KCq_BF}Ah9SAt%f8y#S0kjbs@a!eUp`1_6}GSJ_LUl`tUr><`XH&TC-!y2zTzZ} zrS`Q)(pu~7Ymub0rrXzONpJPHug;ReYHnY(B%@W%z5*qaRouSvNM#LE) zdTC#GjI7p0`#NT1vkn;9tu6Mo+{j_gHga0y?Q4jU%Ze~^TQ;rAs&C}6DjRvNFvHU- zZC?e9d^Y_kzm?J`VEu9yu--WfS`VFttZUA~)+uKZ%Vl3XokguR&SKUAXK`zavxGI$ zS<>p`^s+iSOIc0qtA?|*1!oz{-|1}?b^2JjoW52%r=OL`>2G~@1X#};fmXaD$U5f; zw%m>oYo8<3+T;kcmO32PEQiw?>oBZA4zap9%37@)<*d4n@>V5B1uMi+(JJMrWaV>I zwmckFt>lhs*3Yo&)|;?!>p@rz>q=Nn>ttAM>quA~Ye!gJYjs#XYkpV*YjRjaYeZNh zt9Mvqt3y~*t8rK}D?F^ZC1EWszpz$Tk+9ZQ&ak#t+OT%kztHy9r_hepv(Qe~t|3I4IOM%3>{*HgbuU3 zLWf)VLPuJeLq}Q3LnE!9A!DpJA>*tEArq`CArq~WA(O2mAycd!A=9kYAv3J`Av3MX zAyL+dkU3WGkhxZekoi`VkcC!w$RZ0NODw;TWmeIU6;{rWl~%ft)z-h@wbtk0_15#? z4OV>cChL6g7Rw#H&DtNl!`c+Q(^?k1+lmU_YmE!uZw(GUXmt-hY_$%Kw(13&R^?!| z!h$WUba0GSAUM{_5`4l+8GOq66?DdW7j)Ko6m;IY7Ie`%9dy}p1zojv1zoq+1>Lk3 z2E|*`g6>$Og6>)Uf*x3%gC1GUf}U8lf}UIDf?isIL9eY6L2s=*LGP`MK_9K8L7%N} zf#0lGfj_LffxoOvf&W>@1OHlw0u#Bn1txW`3QX>v8<^5PDKNErcwjnrufPoM_JNt) zjRLc{s|RLtOJEMSZ(uHWk-)s}oPqh=X#)$m{{<9we-0?>eil%|9UtK3J|9rp?GEs9 z?+@^EZw?4_FAE5EM+Jns#|Jpwg9F4J5m3(ECZK}5en4e+m4K>lM?ko{Oh8R{!GJpM zYytJ$sRA0h|MPF`{@~xt{lve8`-XpOcbtDa_fh{2?mhmU-5dP7x|jGzxM%wJa*y%v z;~wbW-`&lBkh`V-5O-bw;qFTQquinXk?vCdEjhM zz^6=17a!l47CwP7b$mi%D*8BLLVOTY%BOrxexFJ)S$wL-r0}T`^UJ$-%scOTF^{|( z#a#Dp8gs_GWsG{aiP_`bK4yb==a|Lb-C|~V_lz0i-6v+CcmJ4f-h*RWc@K-J=RGQ> zviF#nu>Ygzu7jgU8a9CU%(}aKvYYi}BkM9)aChf8Tn?8U`a`+_ zB!RdVBRM-Wg*K-W{U~-WS6QJ{Us^{wwCY`FKo=`E*RR z`CLqq`C?3(`AQ6Gz8>?)d@JU<`EJZv^TU`!=BF_`%+F(@%&%jXn%~C!Vvdg)Z%&RG zY)*^un6qLm=DZlSxhO_xE{UO<%VL1JDyG9!8&hxk6jN$yj>$5$#l)F9W1gA1V{Vyx zV=kDW*rO&~>~0e=c9V%3yTZhboonL8PBsZ+hnu9aeN4*O2vcCJ&ZLc%nvAhbQ%Ee% z6dv1cw8u6X-LVx$BsSmJKQ`GoDE5_cSnPe{sMssUaj~b2lVbN9r^RkF&Wc@YoD;j) zxFB|>aY^i0%-Rgt)VM zO57nmGj4~T8~3|j6!)867B^cT5H~>|6gO0Fi1Qz&9v7w$j|(UL4Yt)U5E7y&S%hOGYOV&+~d!?HlcV9Oz?uu@4+-cpixC6S?aocrKaqD%P;+E*P z#m&;~j2o}p8#h>YFwUdxuD#pP;W z$0ccF;$CVKg z<3hDiyhe+U7i%f;bS*O;qvgeS1&QMugXHn$L4omkLAvzEE=_K238r9@Siof2_F{|F7m&{NI}U@kcaI;&*9Y#Bb8P zjbEWjh@YoPjh~{)iXW-TkME}`iMMOY<4u~Hc%|l3JWtaSPttV8|4{eDx2r)yof?-= zswO97shJ7!YF@%~wK(C9TA6T3tw}hkHYDs*TN1XZtqJSY?u5naJ_)nbkqP6~!x9Fo zM<;mI6BEMJ(-MNzvlArh`3X$*(gdt}WkPr0`h@1dO$n8O+Y<@{cO|3+?oW6dcqHL* z;K_s=f#(v=2VP1z8hAZnci^3b&4G^+Rt5f-upsbF!nDBngwcU136X(W39i8Wgy6uE zguuXx1Yuxp0xhsH0SatO_!7{S&=Am@P#%Cu%nu+XrUcLvUk7j#9|njMuLmd-&jn}_ zj|3PKcLjtdZVa#|t_biZ&I{<5I5l8!;;4X;i30-0CprVBCYl3gB?bh{OB4hwNu&m> zOoRf~Cw@_FPHa#`Czh-BB<8CQCZ?#4CB9ajPJF1kka%5nHSwJ4R^k!WgT!5`XNj9s zuM=0Q;u7bpQWB@BvJywD3KAn#rHL+8Wnze`K2fb|P86v+6X~jNi5L}>^i@enYEsgY zDwUk1LZv7vO{qwFtJEYtQ5utOD#Ma4C>=@1l)j|B$^l7Rl|z%(C`TtPQcg;mshp8C zUO6Xeh;mVqPq`u~T)8eur`(hzQ*KXUEB7Q3ln0Z(D~=_#D$XR;DgH?+Ra{TXR@_NS zP&`h0p?HyWPw_VCiXtiLj3OiHkRmT>r=lcjgQ6m7xuQO4o}xKvs-h!ll;T^`00orn zR1lLx6!c`Zf|o2(NRsIaRWe4QOYW8jCpXKj$yIW9a*@1Wa)x|xa;$t*@-z8_5-Hd(o-q-q~}wvO0TAzk={-@EPa&nhxA3t zCTUE{Drs`c0%=yt3~6D?Sm}q9!P1%({{apu;nMaLy|gDqE`?ILQerAe%1Hew;iq;= z^ituB^c>;5 z^d#YL>92)r(;o>prQZ4Jk9;{+!% zh6v7QAcAWdHo@Htli+DafZ$DrNRXJp5M*ZH1ce#j`DGbx{JM;K{^yJ`epg05|7S)j zpO6{DXJ$U*3p4NXm6=!gy38|tOXd;2BXc*uPv%zs;LNrBF_}yGQ!;<$&(55}Uz9nD zzcMqD|9hr~zdbXIzc*9QKa#27pU&j-FJ)5sH#0H(hnd~H7nv=*xXfB!TIPFRUS=Mz zG&6-)llhj{l=+m`nR$ozBl9v3pLK>u&pN{6XYJ-GvbOTHS!;Qgtff3h)*N1+tSP)9 zS)+MlvIg;{WO;eNW<~H8XBl{_vsAo|SwdcP7M-^*3&%T}^__bztDSo#>m&D0Ryp@c zRw4IIRysE^D~_9$^@3ZJ^?+NRb)EY$>pZtD>o~V3Yd;s09nGa=Z{TvXS8}D<3%Q!? zSzL4W1gpb+IFJL)jy9_3TNxO7<_g0`{U@ zI(tm~}ljn{_`one{vuWyR(`Wu@ibW##8yWtHWg zW7X##W3}e)WA)@lvoLuZS=78$EMDFsmOO7ZOP4p96`D7i<;okx>YwLh4bQW&Cghn} zv+^{og?Uoe$~-P>Lmq_{orhuV&+B0x&ue3z&-=){o>$I%kXOWfk(b4c%S&XY=e=PT z<~?DS=iOm`%)7#D&pXHbo_Caq%iqVO=SMSz`5T$4{MAfD{$gfC{;y1L{uJh*{4vbY z`9qjf^7}C7&yAlMz!u zV5AoOq~{lO(aQ=x)9VZB=xqgM^zQ|QbX;L3ol%%b7Ztvt2NXV~n+osJZH3q9Na1<< zkirx6afJuz(+hXe=NE3JuP9tk-%z-m9$mPAzQ1r5{Y2p;`h~(#^c#hP=#L8f&|eoi z=t+eZdUm0XUQ(!}*Axorp9`7vuZ2W9Tm;dnMcp)hQ7cVZ^pR#Ls-T4zy`y=Ha%h8! zQfOm}VrbKfp3~+PJ)kWwx=D*FxuxB zrj2{oL!I%iox0#%19j!QD(c2}rPQ78@~8*jrBhG8i>F?G_nLa=-4p7wcXz2V@2*kP z-d&&;ygNxPe|MPr>D?Y`$Gh#+AMZ9$iN&j_oZ=-^S@B$|ws;0Lw0Hv5T|AN+Sv-(B zsu-b8Ep|}n7F(#xiuKf}Vik3Jv6#BAm_t2LOrc&Z#!_z<_fj4gcT(OIH&arI>nM4} z<&+P_MU?vDY)X4^3Z=I=hC(QLL1C3VqDV__Q-VsaP%I^XQ`{vdD3K+HD5FaDP^Oe@ zqs%SYKv`C@ni5sAloDMskFvjHCgnuQM9M!UqbRpZ22-At^rgHlaZyrB!YTPBCQ5mU zhVrRIPU$S+Q+}2(D5O#%g6@0Fe+zbHLIjxYU_oK?DmTwJ=DTvNJ^{JC^F zxuFfIh68zx} ziT2?cN%-LbDd59RlKI1BlH*FX`70(WKu#Y$ip0SVxNfu!6Mz z!y?kj4|7PDK1?Uw{xE^`?87Kh?1#amj1T=tMIYRxst;CD^M_zk_XiybQ>G%(%OoUG z8IPncqmx3)h$LqjL>f@`jX0{TgE+OUnK-Ykp18cMg1Diqgt)UTk9epogLtMaiFl># zE%9F23*w8i$HauPJH+g=>%`Kse~5KuXNaw3$B5s{4iX9Fdx-4v?L=AmCZeu<9WlIo z1<_Z&h&ZHt4sm?>4C2i4NyJ6vqls(EhZ47z4_YsekJBSy`!-zM_jl?JA8sgh> z1<^l5Ar_W%h?V6uVpBPR__Z7&Vk*87=oOs=QAIOBUE%LktEeQnDoP2F6$OOR6)@>6|V`KDxMK`RXiXZsklWrS8xyH9l!}9d{E9t<@``9e zL&avomx}cSsB$HNTDgQEsGLU#sGLPGS5753E5{QCRE{K!svJz1TG@{J-)kYB_3P76wj=lkC#->#s^hT!-rK* z#Cxkp;|Es{!;i0y#LuekgI`?j#;>ck;@cXI__>Tr3rfw=NoIj*r*jO(i9;V^Yf9KDW$6W8H!nmPy< zTK666t?R-Lu4}`NuWQE6s{4ptQdf;#Uss0RURR7gP*;FGRhNyuQkRCkUzdn|Sr>y% zs(X#it@{sKR`&?oPd#>{^(V2R^?zYK^#`$o>-S>E*YCv6 zs^5lPQojkizCH@Oy?!af8>H5XkEA{iR_v>e4U)4{?Cf85G=GBkGme-HOHr5Zt zcGX8>F(3P486Q1Z$wvn^=wmoG>|+Sl_tAhI`Y{MQ;bQ=H_D31^w~r$1?;p9?9Uqz4 zLmw&FvmXiA>mM=LM<0J+-hAxAq<;K@Dg4-qsruN2Y5w>T)AO+!ga1^HVSg&c$UhZg z^q+Du)=!z3zMoPsBR(ZyrhJOQ%=`2jv*Ocp%%)F|F}pwA#~l518*|~)znEK}u3(;i zx`2uObQY8O=_ID)(@{*_r$dX%!)naHhUJ*C z4NEXH8x~*|H_XATZJ34G)-VmTzhM&QRKqyTm4;E6`whb|uNnqnk{kMC@*5CLMS~mD z)L_SSH-uwwjUgCjqY)!*)M9jvftZL!C8kfK6f?Y0h?(5T#msGFVpcR#F`F8RnB9#y z%+W>&bD^;pzSYPk<|%$H2|aBjKLrVKDylAei%c z0Ic}j7dC$O!S>HCxc_H6JnC}LWY(e$kx&Y^=s*XMz*v<(^{IL z1uYHG>Xv$FYfBCEXG#Y3&~qwLx$EDkgfF@)W7u!G^+I>G_Ca>w4n7iw5Ih2^uN|?(7x8o(8<<+pv$f2 zq5G|8p;xV^pybx$P=4!CsIv7i)ZBUi>S_HGBDC#+IBkDGineIT*!Dlj(Y6H|(6$j8 z-4+E+Z(9c~YFiDhZCe3tYg+~#Xj=lEZd(XlZJQ50XqyAQX`2nDw#|eJ+onO)ZBw9@ zwu#X9w($_LeGJ5F9|ft}hePJ}p^&S65Hzqo5*pjy51Q592U^nZh1R#bp&jiG=uo>2 zI@=xr{o5W2J#G(y-nN^djCKQ5+^&Oa+ci*odm!|)T?tV-Xf&NR^6nF4w`lK|mM0^od!1IjNk!1M(L&M&V)u;dxItxO(P6J=pNiekQ1enxy49w~J3oP$C0ycFW0=v5ofMZ?z z!NsmW!JV!>;Ca_>kl6JH$nDw*%DbXLW7js&-St0!`?>|NzHSEcuN#5k>jq%|8U^}) zT@OZoT??jvT>}<T?Wp4T?(#!T>>6`T?Ejt3qktV1>oJ+d7$>| zT+sIQSMc-eY(VM$1qi!m0(JKc5ZXN*c)O>9q1{u!#O}#pPWMExyn6!J)IA>T?j8q@ zb&mlTyGMgN-J`(s?vWs|dpOAL9tO(0hl0lLA)vc^Fu?T;0_>hhAnzFfj6MBPdI4r z2?O9;D4>3`0MWM)p!pUI!oHb-@0$q>`(^}_{N{c$fEC~LVDmQ}*z-*bj(-aR|9sPc zyWiB{rC-vwK#>0}091Taf#z>Y(Bnt=t^l0xa-jS!113M`cPWVcE&*e|i@_|vCErCL z>bnr^@H_ln0M32qgByNNzVkrrcP{Wx{Xyw>4*2NT`JD~mUKXJHNqU(;>le|>0Db&M z^wPmpzxlm1u-b2HFBRjhKmVNqh~F^3$$srEL0B-(?-#$Ne!oLF z@Q2?Kzw;0t-1K|q7Y7kQw%>cdPY@Aw`C(uZVERe@^e`D%{rbTaFw$=tOa%-5*1$Bd z&2K+U2dDk6!VK`x4~3Z^&F>w|0yTbZFdO`UIe>!U00D*z)P5EW4|p+rFw}1%MgZnu zgkZVfCX5K|#)!c&zl#_NxPy^`7Z@2x^vlD@K{-YNnlMVx?T5#z02>ejHeW z9}lAN6TlAqL~s~C8JxpU0XOhd!4v#+5R0DyGVwD(DgGBwkDm=X@xKCyFc;7X^MIJJ z0B8vdK{#O%=tEcnh7*>8DTHNU9$`6HMOX>85LSUd32VR!!dh^dupZnaM1fa?4Ir7Y z5fl(MgG#~{@R{&G@Qtty5Qx!$OWX;R#6N(UxEnZ$d%!^ApI|I;KbS>40G1FBfhgh; zu!Hy)I7~bS&Jj<5e~Bl-6XIzQLp%#IiGPC<;(1U{ya+mo{wI}m1<*)WfrxY+1d(ol zFw!l6knVtCq`P1;={}fCdI(mK9)r!Kr(h51KX9D%0{laI1@4kwgBK(eB$8r49w`o# zlM+A^DG79wQUIQu2H4~bASY)5BRL1y$$4M^xd4nN7lG;IVz7u@3f7W8fbHaRaDZG1 zPLr#_HF6zzNd5>=asx;sH-RGZXHY|K1+CuPw4@HlLK&{yh22uqs+F=^8vDQzaCr_F|}v^h{;+I(mvZ6P$3 zwgj3_TL!J7t$?=DRzrW%)RwzXq+L`^QuC+t5DxJ?IquA#{cQ z1iDXu2EC%cfKuqMp#u6_sFEHBHPaKJZ}b$1z(|KUj4VjO$c2oI0?5I52Mu79LZcaF z&~!#6w2)B)t!30h+ZYYdenvBNiqQ&PVRS$b7+uh7Mh}$2=!FUx5M0T?!p#f<{Eb0| z2}~NyVKQL_lLH%>0@%(J!vmNycr;T9PiF?g3z=GY4bwk9Wt!oAObdL983A8m+Tr_5 z7yOFpgOizk;e6%*xPmzdZek9Ddzd3(JZlWhW=(+QtjVx}H66CGX2JbfzrrI~^Wmwi zMeqXFZ}4i?3V17PHT)-QJ$!<-0lviA0^enAgI}VHR+wVODczVYYJTVE*JTz#Qi; z!TiHrj=95Kjd{*pk4fNe#N=?dVm@%AF`u}*FkiU)Fc9w$hQ>RJ5%Er9G`zEzP~HWM zmv;p-g!eCIJnuH<7v6o$Qr=@s6z@4^2k$lJ5HALEhL?c3#!JCGpKLC54AB4ThH(;OeL$ERYaBK$Ofi32Hur>U?*j9cdwwFH?OA?I4as}hC zO2H(oNiZF27tF@?7tF(s5-i3}6D-5d7p%sv5=3FQ2sUB&2)1F533g&H3ie`e2@YbP z3I4*y2~J`&1?R9Of{WNX!BuRV;3oEm;2xGNe1zo*|HG<;ud!xf4Avn`#10UqVMhtG zvD1VF*agC3>?&ayc8jnYyGQsDdra7jy(nzM-V%0Up9#NXV}%edQ;5fv2r0N)Arsdo zr-ov>S&P@5iylM{qLn37lSh z78fDDi0dQ1h8rfng_|V4kNZ{p1h-850{6T4EpCT60e488iaR6D!d(;R;~t1haIeMX zxMXn+E>HXkS1xYBHHbTLUE&@bECG0$1cw(%$auAciML32c(+81A1G1c$4WH#84?42 zp~Qk;BeCMQO5FIpl0Nw3l1ThT$uRsa$!PpD$wYjtWEwt0G8<0GU;@QCyzewg$eexmdeezx>FeyQ{hK1%usA1(b4e?a;M ze@YsUzamY+-;-wHUr6)u3DOdLj*URsN(e z1e=UY=qD2sM#z+e$ubSWzbZ^vCJQC}F0&JM%DjX_vVMd!vcZI_vXO-QvhjqMvZ;hb z*(^e?Y#!l*Yzg6`Y$c&Xww~})wwXYdM-zDRJp`rvAi*dJVg2F-kMd2eZQ4AoiQw$|;Q;a6= zQ%oYBP|P6yqnJayrC3CKs#rmcQLH1TD>e~}6x)eaiao?;#X(}X;usODJVRtC{~?N$ z*NJN79b$;`G0~-bL5x(sC5~1m5vM6Li1UsUo#0b);TpFo~eDlGrLYNv7&Y(y0cM!c?P3UeyHB zVAXWeIMp1|4AmmiLe&b=YSlW@X4PiWZdEktFV$Ys->So;>#7r^hpN9xuT_^xNvfNq zT-5{82h}rDz3L6AU6nxkp-LkW19C~6fMSw7pq!)&s3V03G?Tmmout75-$>&EVDgLr z5_w?&le{W`Pu?6LBkvASll{9q$masW$kzfK*;a!$Z_a%sRca$Ue| za%;ds^7nw{WPIQ{GAnR1SrWK|92EE`*%Ek!><&Cdjto3c9vygq(d0yZn^76nJ zFvRl1@ zazwq2a#p>Ea!q}Ra$kLd@1nlBK>)DONwCRI6W5KC5FW-RcwyMw3mUX^JR9 zO*th%Q%5mrnkhC-C#A2ZmoiL)rB2XLsIxR2>LQJpx<;d-ZqeweyEPW-5sia-R)bKl zY6ep8YerIEXeLnOH8ZH0nz__>nkCdK&1!0sW&`!BW;+!Q+C!xV9j5YwPEwUY7pR7y zYt)FKyHsD$6YAig*VM5=@zm)->D2i_dDN9brPPfl}TTb7sTTlN(x0QZKw~KyScaVNrcY=Ofcb@)Kca8p5 zcbA@`drHsKy`g{5CDQA3nedU(dqinbfLbBuG0Uc8}$T+RnKJj^g_m9 zy^=9TuVYNpTNv~74#qNlA4ZgZFk_p34C7Dz6vk2gY{uXEMT~3um5lrP-x)9T+Zl2C zy^IX~5k{f@G^0X)iSbE)lhL7n$mrF-U=R#(45lHCAvWYO0u7}Mlc9!TGc+*}LnmX1 z;Rj=^0neOnpfl$g_{?Pn1vAQ^Wo|QAn131^%%g@r%yWhz%xi`*%zK6@%>N9(GGh&k znQ4aA%mTwkW|<+HS#Q|KY%?5Xelwh7VvSdrG~*qn!1#ozG`?Z#jfu=~V;0k6EMi6) z%b6pMADNSlZOqxm9_C^rhPB#AVQn^YS$`O%tb;}k>!i`lx@feqZW?{8N5(;{SH{t- z1mk2@rg1i_$he4AXFm7aZ7^7Le#(gZj=@^S)I>!>4uCi37yDX#WDJ#N+vb?5b z)<9D>Ym}*&HQ7|fnr&)eEjD$qR-1ZRn@o82P7|Gdz$9RwFe%v=OnUaercm|+lZ*Yr z)Sn$^8qQ8PO<)(8X0Xdl^V#*L_7W(Mc5S;#qUR&g$w4V;_i zaLyyMhx5uD$w@Ge#Q-kX{bAnqrOM-hiYl1P{&B0Xe&R`z*K(L&9 zB3Q>g9~{cP9_-@Y3+~VTFL*dNCU^ojC3qG$H+UhpBzPsaI(P%OF*usr8N8p{8+@FL z4>`}Jhg|0hLLP9HAuqVPkT|X-B%SLFDdhGIDd!Fi`N$m`($1Y0@|`;;1jkz%Lg%ds z5%M;NsCYX=47~jz5xnCeUf$m!gLv0MM)U55OyNBZnZrXvmhzH9*7CAKw({PE?B-R3 z9N~QmIm2rUxy!hT_M;OxBH`=x0HF=vP5YC@lOMN)`SL zZp z!r#I!2-k$&5N-;4B-|19TKH#JlJKvv9O0R;QsJerTH%eb&%y^`-NNT#7}47>nkYF; zAj%3;iHgFEqVh1Ss4ffIxet`Vlrmgb!aJqJ^&%@xnKXWZ^qS>hOaiQ}}67 zc=%%fmZF>%)JDwuBSKe}r?y`@?18 zW8qry+3-;DrEs_SW_YCdLHH=~^YE$Sx8ZZeN#V=HS>aLQ!tm|lvhaQ4+VB(Nrtpj6 z&hVS!@8OTdn20xGN<@m79g!y%MSKt|BkIMvh<0&EM6cKuL6G<&Sdz#HsbqLWkYrqh zMKUeIE%`MfQnDywlw?K36v_ICxst6B%Orn9L`n8XL`#lF?3bL0I3f8b;vdP4h+C5T z5ly*L$x5wJvMOt|?349?ti^g#)@8jU`(eE;!`Yt6D7IJ`+m z)+96AzRDtOu-s*%$@|)b^1-$M`AC~tKEdXYPq+1x|7sf{Uu2ssUvB$VzRvcWe6uY| z9&L-3@3rlhAF`d4pRiq$pR?VTU$#Ay-?YWb@7pru&um5V*S0EoyscTDYU`Hg*f5GB z8(mRm6DewJYDI%BMA2q*D!$qVD1O>TDRB0w3aWjcf^A=}5ZX5=6!x78js1|qWIv+_ zvtLm-?DrIi{e>dZo}d_J&sL1JmntUP>l8EXt%`Z}?}{aMf^wyutz2)HDYw{l${qG_ zQlGRA&EnPk7I%&VKC3i%s)Q-_AgJYV? z;+U_pIad0QeBY$%=h&qh>^Pzt={Tnv@3^j->UgO7#qnA--;ttP;>cI6bd;;sI~r7* z9bZ(@4k%!cgBozqAqY6;2naaiFb7<8I0LRa1_a!4j0$+*m>TfRF)!e?V?{u$V`D(F zV^=_?<48ch<6Js%E$$hkRixN~>lSm)8e$%_l>)LsPQh6hT`IBm@cJ;?=op5F1tqQ>Zj4TMrw?%DH@Awp2q50p>er3 zX%N>gO{D9HW~l3L%_!Hun(?m3nkg<+Gs~5xnd>UlEOJ$8mbscWt6e>sC>Jhhvx^n9 z-6aj$?a~G9cZCNXaUnq`TtkD-x+Vr)bj=RB>iR9{rYkDwo@+Bb)`ihFxaiszmss2B(r9~Jq1vA=uNLbb ztR=a}Yw7M;TDE(MR^VQ*mAbcURqg}YAonS)!F@#=;=ZqqaKF?#-AP)XJJ){}d6{;Q zyFokL{Y5+44eKVj>AI;bicU=>sGqQ>(;qv={CBT=(f7o>vp)e z>vp>j==Qr$>yEgu=#IPZ>(01e>CU^8b(h_Fx_{l}y4&tX-2-=*?ui?tf8l26-?%0E zICqdf$sMLocl-3&?xFeu_XK^hd$#_A`!{`+`*(evdxyT!eMsNpKCAC^U)OiLAL)DD zZ}hMyRgd=+>dBreJ;T$i=XiSb0uSCG^{@^8l%7HD(Hrz0tHJE)YY6p>FxWg(3@*<+ zgU_?V(9g5UFwnExFwAq*Fv@emFwS$!Fv;`OFwGNd_{EcHnCmGqEcDbFmU`L^D?C39 zYdmD*?;gH!vnRl~%@b_g>2VqNcm^8xd&U|MduAGsc@`T_dDa@wdA1oZdiEQycupDr z^;|LD_S`q#_q;Mb_9Pqs^W+;}c`A%=Jx#`VPq#7IgEOUjn5Jxx)RgbhncjIKOz%B? zOy!>8rfSb*Q@v-dsnN5-)Z*D>>hSC~ef1nQee+x}{q)>2VZ6^w1aF*);>|MAy`?6$ zx8B6}c9_IoV3v8QW|dcH)_B!so!4SEc|B%}cd$9aJKk*f{$h4}mzoi8l)0aGhk2m) zka>vrta*g@x_ONEk$JoqHBa`YnWuS+%(J}J<~iOL^L+1j^I|V4_%|;vc%@eryvAz| zj`BK#H+mz3w|d6}Z}-j!{=>T{c#n5&@P6;M;6vX1!GC#A1)uO<4L*78>d6A3E4KDs-rC zTIdMhg3!^vHKF5t{|lYy+ZQ^;cQSOk?{er&-~G_pzE`1heaWEX`L2eY^gReW?Ryh;&X*c?-d7m*kFPrHimxT?n(uqq4IeT5mX8;H*QW}RTTk>)R0?@9+Ff@|_J&@%3bWV?aK(y z^A(2|_-ez8eC^>SzMtXmeUylDpD?1*r;e!hSt9Cu-iVLBArTF}2@y@cUn5$4%Ocu* z8zVY=yCS-Le?@frE<}9u-HPb-`E!g&d<2YSM_`fn5qRWN1QGcXK}IlE8p5zL5Q&wA z=&T$h!pcMXSOv%ks|cB5l_K-4a%7cNiEOb3Ab(ob$O&r@a@ndw?pY1UOREVTFYycH1=Mr)>s8wa-F?_SuNW{woq{ zpNshH^O2$Ug~%lPB4mzz39{V&8?wp14B2g8fgH21LN3}@BX{g;k>~dHNTNLo$+d4l z%IzDGM*C)@+rHJmi1$B)<=BqM9npxvu@kX7{y_RWb|a%5dywglKaoX_eaKqJ0c5-5 zAacNQ7&+rOf?RVPMIJehA*ka7lI}Q(ymOpFY8_{gHpf}yr{iyg;yjNCofijh$Ty+rJ;SI7X@Yh<+R4Kl-pB8yyak#(+EWV#juPkt+##>qzhsc?Tln%!kc zkGmWpc*+rurvg!WDiM>X3UT^Hda9AJo*HD9rxsb_7v-r#c6jQM!+z&HACViLPskI$ zSWg3zayA_;yuer0}*z8}a}KOFJ{Vfo4Z49HK!?l-`1wBHQBMSko2{CWL8 z{@i{ae}2D@KgZw4pXcx6&-M55=llEkbN+q&dH+8C+1@`?jczVR(mBnPPC^dn@k37{s@b!3ePpq{8RNasj^j;=d^G|vI( z!in3FSsMYmGkz^H=$OAlAYu`6?LI)WE=@z-LjTd|&i5Rr=^k2UJ(XeO=d6#eS zL@at|!v^2(i&*sHr{8@33q~(Zo$XtO;Lyh@<9*yCIJC$$*cV!dLn$}iz65_K!DvZ{ zFZU!Kz4m8-Z(=7NWqs%Q#*QbT`vInP#kHxX#)3d4MF?`|5ZJ3GbONu{IRv=QF9f6>v}t$n;hr3|#GHQams z8Utm{)p|Esnds;Ou{SZEiQXJc_wJp{Le(!IZ)_6_ePQnOtl7y%mtUy&oKbMlewmp<{lzraJ2%Kr6C8pKE4453P=ChSnK*n z7=eE6c;^ZiThVRH(p@gO4fWQet|w|cYX0?+>$=&2jxD|BVmh7Z&537RO#@x1Gy8zc z|KdY?hi!Ke7JJaI32R*gwt7*0zeTPu$9?GGSJPdx`v~fv8M&UP_d$t|`@7N_`=X*y zyK5Z1KlO_b~Wv1&Nlaw5Tb@x};r4F9?FS@lS?<>+l^q-r#p&bjD}{ACRK>Bv#% zi;H8?NcL{$m6~yA#o>)kjA;V;lC|7fux29q?(nZp89E8IvnM)>Xj9O_BSV~onN!hc z9Ix}{y=mzCqZVf@ZU!33S35_}nCbsNfpg^3S!lV4;*8yIWq7I(NH7m=w7)9rQUt$I8nA34GzENxIStrdg|$E zM{vw<=m^gNN05CvI_&K>$B{cL&?5uaI#%jdq3X1Sj@ZkqQE2RR$DY8osJ>{FBj)lt z^xVw;j%B(ibViNMvG30B=;EaYhuppqjc=DZ0%JCzzinhW&WzfE&c)yyJIl7B|Ni;a zUb%7`>f<)rAK;_WfOBQ`j&nQENkO^xfBpRwrFRqTS-HE=htB8r#jEz9C9${d>o|X+ z6GmRNcRtyN2E03JubF-T?KgL~eK772`uOukyX@X!bo0jL_PI0uLQfIq*k!b1DEa6_ z``|an(JbXqd-dv*Xwz-4z1?sc{ly(>UtN6$H6*L;^Ddl2hfNaNlV+Yr<7z1ObBc@T z@ijkfRh9psD5l+Z=K5uHz+bhtxD{7XRba7gru#ZNK;QZ^h@GW=IYt#Pev56_lAfWP z^Jmy@+u5dKIJuAw{p|a-dh#cDn+b}t5KwCxb=_Ywdkv@eXNJ>*P~aY5mr*>C$#H7t+lne5q&&KVjaZ# zjDF~(TPe0yboEi#>YLGyt_lAVQT9hCT9xxLqWM7=`g+y-h$R)>D3OyLF^T;hMIZhj zOXnCKXS=T9cZ_5vGqH_HCQjSbwr$(CZMR=-+x8%~ZM(74eckKWKh|;Vwb%Ex&ER?O z`?}8askYObK^=dJCVuI(We20$-SE8Ai}!5R!7H~rjj80STDo88G)E~=b7rtr{EVlDz4M&PPWw&Ro{?#oeKSBs;X6!I+^X$SIG^Ab^01^sCxXRXQx1O6V;p9 z-ktiaFjIN)96LGxvQXK-FzK|-z*==;f=;JyD{NKETRZ#~2iU8A->>oeXXm6kIkM1? zyU#@xRiEOwIoDNn;&z1Jgu(8r-@{aXH(z+FR@Qy+n_%RlI)D3#-=@8OD&G+|{MeP9 zRihfu__faJs>;28z;AAJcU8^UEq>mEdZ~7IEcaXaqmSzFi`jk#UHYqZW{mf9dN)ud z5fApe?>$6y>T5T@6K{v9jxY1@%jz^zB`~-1yZLRjiXCR?7ubKCYS&Jo-}HzHsx6*v zzEh`9R@G!z`Kn5$s;VyJ`Ci;HL$z{9l5dROY}Ja^P~WYO=Bg@Q|METFXMw6_;X7Ym z+9K6<^GCjATbHU1MPK#pZni>YbmWw8?e|qGH*7yf^VX^~^&5Tf3OA_oUM}^$^lp>t z=;E2ab+fmsKH7}+{Vv&|TADJzxBS;G)%^?pzK7QDRV^N^^gXILpn5B^@vY51q&gI! z?;Cjis48zC-#7Hz-}p#EZmDK(ec*Ha>Rr{NZdZI(uY91|)q29`Yrn^;+@E`VR+>Fi zCGOqebGY_}YTCdhK7#1is#U@nK7U`mQ^_Mn`}8^cQ8nazf1mmdUsRH*U3}!zzpEBo zyZKz~|4TKlz{+R0he{RoLhci3u2p4k#d}Z9iB**@3ij5`NKkF}`Qh!9maMwd{@VL~TAFHB=zZ@anVG70moIxq=jEtw zFFN79yDT4f#q9AuS6`&+&)MKDVwb5}Vi$WC$SPGM?@#x3v9DHj-8kAiymOuE&!GO^ zi6a_Sxh7q_2Q6$--7R(XHrdmzYW->DJ^BWtu01FBF8%_XUz{UPP&=8X2=__FH$S@KD!5A z(F1JN?^-W=jo9I!K9qREOYzZJ-ST#i*OF>iwf^Z1ULtP~b>#9TUXpd*YLB5ayf%FB zQ+qp)@#@jiMV-tY;I*iKceQhV7q9A*z0_t}H?Pc;zUp@mti9Y_2dZlh>3gMbAEHiK z!uP6(9Ijq6yv1|2(`fZgk4jIU-Q(0d<++}VQYNao4GEsjU8br#r-gV{UYennseXD6 zXr8UU^!Tl3)2#XGz|#*sr2&i7cQ;@4Jb?RIT<4tfoO*4gdgjo5o~MOt)jfSTdD?H= zpboKI=4o8MSWv;BJVLb3)dmhvJnqeUtzKew!y~!roqDb8tjEer zpVVH$gB~-xd{aMUwt75G{;7^>Ug0r*mrDJyc8^=+=YPe!f# zmsN%8#hFF!6L4S5@a#1AVHFkX(%dNbt8c2+Lkl(T12@;J7nFW>AKtrJ-K*-k`%_`N zIjjQui zcgr{v4c}*^`>;0_nukcsqR!Z8gu^QZoo>?)eAOIZwAQWR=T8mq+(Ng47L{h=+C-2*k-N=LeV+YzeSXxh*1 z&hJRg;31vel6i5Os?Dx$^G7FX);_j!>wPs%6Pzq}TUnT;X%_R{N;~IkIK5k3zaJ^q z6t1guO;0P=+<%noI@-5d(<436Rd%9Y^HM*|)v>Ty(=zP0>(K!n8i)PwU3=bVYZc!g zyY}S?w4(a!t{0c-XoI}Yy81`!X&0iS#QAHDpPRd09oJL4 zu1e~9E2gjZbtjH%&4fYPsO^o4^U1@sajG)K-Z`VS-$dDpAI0OfhsVb&25y|9^}i9U zFk{cuMil-~^f*6PJJk2B;;G{z?bF>46$`#D(^iLFRV*93T5D^5TJfV~y|&A;{fg;_ zwrD$j-K-esuv2R;UZL2g*{dy?F-Ot7=#cjAs|gCN__%fed#EDq?P+b)u2k3&6O%9U-}@G5VYXb~$QX1bG0YY8tPEYQqlMYuTNyPwp> z?yX+H-MefTt1E^9yJd~ebM~19jNe=4T)5IYz^XdS`Q3DffSmd9&YIzhfEx+H&ZfOQ z0>%yd>HOZuH{jpTx6bDjxJ$_Ik@E+;o&iIjU30du>K9O8cg8u;d~m?dYX_V^n2!jM z8E$nhupAq3`}9iZ>2{L>+{E*o^%c_t-XEUiEb*BW(3Lyfd3eu-0YCQlb`Bl3ETA{r z&-vuE)d9cuyEva+u_2%r*U~w0&(?q+hh@&QF6|2FA?7(dzuq74{dBXFPw0_=9)^`p zJBv;R{J56uBov$v=xd+kl%TjA5b!L_DR1PBfKi?PIC*cl8<70#gVV3;j{=qqf9iBH z@OeOU;!UTkwQmB>EUH!_z(#|$PD6eL1lT=X=ybLr zG$6r$nvl@IYDQc&DBl_%kHUF=VJXFn4LR zqvtKXKtoZ0V^qCi;P_`>9bb$w54<_@m815#O<+USJx5cqQ{b$NmmME1cMFU|Gqxte zD{xBoUdIi-ode5`Y;t^iwR_+h@8yoJoW6krQfE7+tsWF8I5fdAD1CTfhWAj%ijiXj zwHZAfNB*7^`0Ip^W4_;vz>x0Fjvt@R4JmlEdS`1WMr*YkfI%6ps-{BPt( zhqBd)ujtf;M(Bv0v9^ zMNqA|uKi!*bwO7dmi^7<%|T0x>g~2=?hKj}Rcg0CV1Lk_FIje9UmXn!z87z2b?tOe zkJBM`uZ~;{O5XmiG!nqmN$>F8!|F6sJ3RH zUEYNBpcfV0?4Hfa4f?Od)9%``;-Hs>4tDRiR0cKVo7y!TsS8@0FR`0{ttH5^fNj_K ziV1EmY_$Ctzz-IcmfK#>)D0d{nPdC3SwC1+n`oP5Y!?d0H%duH4AE}R*>=E4Nq{#FZuA3PaqyL|GpVEOM}wx7?f3I3Ak zYpaOb6nwSH#rCIkXYdD+mFpx(Ic+vu?f(m2ySv)v z_sZ+RA8r-eD8Ake?(!$i=7Zo#aD8sH&HSmaf~)y~Honh41iQO`w{c*;2R|JD#-_^@ zRq(9s4{cVw2@0Ng|C-Gooyg!55oc_=EQ=3jHy^Z#2u=m@Ur*QY?jWf3w9|OZF4KIC0JoP(5A+h6|!PvH=D(G1tGQjJZ&1~(vV+Y z9BiH(Gz^LSYihH(**wJFO=>fLtzF2Eg&dm|B`zV??=)GTU+5X~C!@kTF{e|A(lXE5 ze_oG}j2X$+A9DMJB;AOx9<_LAh-sGEno~YH-Y_mLN+XUX{~CX5pwF~J?oHT z^FylZE?bwIEDO2S>y)+IlQkiij_kKS(0y}Aa_koC`pBIji)>a|?_YEvr1z@%)~+4L zLgxRNVqJ3OY)Gu`C~I}+%OPiG_qYBKe>3FjTYu}{n;wKz^E|BcOrM8bnqhBk{p)SW z@pmTH>lb|q2^UMOGo-&mW-Vk}&;1q<())L#Rm+m_kku9yR?ki1LaMgrT5SkP2~i~_ zS&iG39g^=KVKvyVC}iqYwbj_NiV*9z&sJ+6)`fJL`_k&+yw;F=0r#w`Y}lc5-LF`U z$rgsLzj(?@b5AccxqZLYh$Y6M=a+7^D)O)jy%)dA>Pmw{D8K&#s~IY{&_8dcTKS&# z35~WLZDlp9YiO7A1FXzE`-IkUyIHxi28Rl_d0LG~92vT?(!px?%L$=f7nxaU4^I!B zlp(dUm_IKxbTZfKK%b?dS7Vwj+pO1wsz+5>9%eR&4h+k;w9VfcYBxO9GBo5s=(Nx% z%Y$!^hn9~BupE8;TxeS4H%pfzS3;d9ys^~VbUQR6`Jp9$(WB7VIoB<9r@Rd9RD9Ob zX2gfk+I5F5`}O-CDsRUr+)W*N>exEVSAHR(OHGzoHhD#d-g`9Da*StEXixv~mhU|? zL%W0wv2^e$2t7Bmm*t(#<)NdheJvF|YeSbGQCR*M*b-V|ZEZPY3@a?;vw(7Fx{W3@lGh!{R5tkc807Fnw%heeLQY|(UnR#;T?Nei=Y z3&XlT+HcV>Z$+4B;#P~b(hXt#Ijb!m_Sha)@P2_s&hmX>)r+QCINUfIw#00V#fqpi zVS^(FT72bR4m)?SyM<2ATVaEHdRr{m^e}93y_3c7H!s3!URzk$R=y7_TOqeN&_Vjaz z`9r(PF!`R}=637q!-|J|G{3EG3-i){ZfLV}5IePPpFlOXfBj{qU#TPMY7b zG!OqUY`?kvR=aQ?i>>DO6BOZgm8;AhJ9~#8R4*`pc*#F}+LdYMPA$E|@2?qSet*v3 z@VP?=ncD`93O{e(!~DAUr0}jC-sXlkW`<8pb2dLAS{PpN)zbXm))nF9SM|-;maY$9 zwnJ#1Ict0P?AaY=!{YXZhxD&Adp-PE_zOj;nZEXHIA4}+wzkie@RX(mv(O*6!=3WN z%&dDp4ljv>r}6VuxXX{vW?%Y#3eS4>(yT4uXSn?OeY5VP0>XctylS>CF+99*&l$6O z^WwvgZ9HTaUYQpDWcd!Ws$F^E1Lm(Y6YG_QPoJ^G%<5iEc-5p?X0HA%;jHl!%#@L= zh_hpcnK>;HMcf+Q$IO^5k8m5)*{tK1X+-C7O0)D{wh_N4+L^t{bcqO=W@5HupI5|$ zxe~MP&i)azmU7Ih!h1&)uWL5Fx@mAk-Oeggf7{U!`;QfvhK5gyIDa|KbnK2<5sr^z zOv99mBD#JFGVPYRG9o(kr|Grx8zagx-{Ow`qnBDY@eY@)1v6*;LwX|lcH zQzQmrlQ*ruB18T&H3?$}Mb0gknndVCMV=VQGx=bg6glEntMOiktjOEV)y6))MUlrQ z7aIrluZk3Y%rx#dsWH;ZD8cylvVV~wo5PHA_6VYMQdP#hD|%7+y}uYs-kC&Adict? zDZ(admgJ#vK$%Na$L8zC8+E*+{BzG4^E|pniN+i?-ZHjt)W)B?jYBsLjoRk1$++Xj z*eKK6D~t^Sr$&v_pKmOzo*U(KWU6t7)v~CI?W2v)ja(OXdlMRoUE87tSM@Ny{CZ#1 z(dE9z#d*h~mJ}(BP0Y_nqj?qQqrv<6XS>QSED* zjhI2-qs}%|8O=VdiBjz@G`boR7Ij{jVf0!WAH}&CXLNT`dX$k}sL`rh`B8zd{}>sS zlt-EM{cLo(bA6N~_N7tXf%d5Tiyj!c#q*-mTCN#&bCyPbJa^8>e!FqBuiH_h{3z?_ z@!H)+yIowOjpuGMs^04ry{mnNQIB;0=wmnL8_nw0H@bVTX-1Q;42?dMHO9!fd2IBt z1A~nsW=xBAbM0j`{Lj4Twb6b?H=UP9&)Vi@6nJ`l^j`-%BW=_6Xl1mC(dC5)q9wbf zMtx#WL|^vc8GY|}F*+o()lldCjpzsGY7D)cA4a0`-8WJUG`*0PhI%Lu$(E0_IAE)xc*>u z^!t+k3`0aM(fO}V8vZ@Yj!|toU|3|P6EmXscEgts3}Oxl*BSQrv5Z+3zr^s-Z^xMS zyR!{b#(2c^T{p=vC8u+YZ~u{oPd4?Ai8CBvI8bLuj6+E`!Sl zqu>~4r?&>?(_&)o89p&kNK#|sc()DO)wwa>n*KAmw!JK7O2tWocE7rq=XnPVT&mh) zKBa9pFnPg?-IlP+8e_gI(s9tNF-17aIfd<}-jjfmZs<7!}cXJTw%sjb0})w5y)>rD*I`Yev!%hogK zDqj=ZDB~NL7Ho-iwQJY^{%vopsb8JG_4#A5n!#oI{Z^chRnE-ScOHB_cI<`}{ZRV{ zv3@6`^*vcHW8)tM>5t3#80)9`rH}u_;{Vpi|1TE*n?C-TSp2j4_;+IQ@9N{%h{dm^ zk6$wuzqUSpk68R(`uII#@q6pz&k%<{i$4BLarm?8*HsL!_T6R zpD7MMn?8QVIQ*>o_?hGIv+LtEh{J24kJls)uZ=!lqd2@)`gqOa@Y?C)HH^b+sgKt* z4zH~ouW=k+YdK!?IK1|9ya#c3FXVVn;_%+c@gBwDy^`ZSi^F>-$9ouu_fn4cG!E~r z9Pe=)-fKDD^EkZsa(o8j@L7=KGZBZ+h8&-fIDA&*_{_xNvm?i6C?20BIX+YI_-x7X z8H>kfO^(l8JU)AJdd_2DUGMoVkI16Mr6B2MX$Z$p^;H;40%t*l5A;TGxfU`t~GbI6MiwtK>0?ry4 z&YT3CJu;j@2{?;nIFk}^Hpy^CCE%=*;mk_F*(JjnmVmQNhBGYzXPXRXTmsHI8P2=} zoP9E!feAPZWjGTPa5n1Uj7-2;sfRN&0cWQk&d>y$rFuA16L7Zb;fzhdS*wRLHvwm_ z9?swdoW*)LlM`?@>*0(}z*((_GdmGyw;s;$M4aV%IMWkxw(H@HPsCZThciDBXTKhv z0f~4P=;4`=h-ZTyo)L+7R_NiGk%(u99-bkIc$VnlnUaWSiyodaiFnrN;hB?&XOAA9 zL5X-4>EW4_h-Z@?o>7T-R_WoHm567T9-d)|c$VqmnU;uWn;xEViFnrO;hC3+XP+LP zfr)q)O7Tog#IsR~XJjItl~O!26Y=bn;u)HVXQ>p=)I>a6rFh0B;aMxiGdBs(UMZfz zNq81ZDWt-)S&CLo&+;rGG;#sX24|3f)dPx$(Ri#m=TjP zD@rgkCS!J#V1`V_EGfZEnT**|f*CUzv!(>tg0k!R)Pz89W8ExGrY$6wKzjn9)-(tLtKBPr>Z2 ziy1xzv%D^5`V`Fex|s1(Fzf4L=1;-wuZtZZ1-pPQc7hb_2D;c0Qm`xNVrNLf?x2eu zA{D!YE_RAk>=wG%F;cN>=wjzc#qObt9V8XIh%R=LRO}|Y*illktLS29NyYA>iybBv zyNoV&npEsIy4Z12vFqq!=Sjuxql+CV6}ylwcA`}5M!MLMQn4%PVrNRl?xc$yDiynw z4tA{dG1u~M;X>0swd#qOnp9V`{Qm=1QbRP1It*wIq4tLb28OU3S{gB>mvyPOVo zx-{%|I@s~juR{(g!|thr9W)KQs1A10H0-82*iqB4tLk89O~dZ0gB>;vyQ~g&+BEF8 zI@od3utN?j$L_6z9XuVoxEMQmI(Bn0cJy@Y>SFBd>Db-H*x}Q$%Zstor(?GlW5-X& zt}n*UpN`#Mj0_+hS%4UsKsvGkF*1U5WCdbm2I_dzUBm-H97@0^0vJo*dk_==eVq_*6$WFw_P%@CEh>@veAX^b5W640)B1Yztf$T+$ z3?>6vj2M|r2C^A3GMWrzHDY8o8OUzL$Z#@{<%p5#WFXrSA>+wF)+0jZlY#6`R0UEE8Fn2$@(W zvM~`dvP@)UB4lQn$j(H_&@z#wiIAyfB3lz7W6MO=CPL+$J)+a*dmxb(4gbXkXS)d4+U>34L5i-Io zWQ8JRhFQoCMaU4dkR=L{DP|#C6e45HLe?lm=9q=-QHTsO3t6NPnPe8SNg*=IEM%2J zWR_XTE``W2vyf#9k!fZj+Y}<>%tF>FMCO@=>{EygGz(d%5SeHevQZ&2(kx`9LS&{{ z$WDdGP_vMw3X!R1AzKw9W6eg^Dn#a*jqFv33^p5CtPq)OHnLeEGTLlpwL)aJ*~o5% z$Z)ffc#@Wb@g~*Vz zktGX}DQ6>F79wNLM%FAu=A4b}S%?fe8(FjvnRGU?X(2M|Y-H6!WY*cpu7$|3vyo*B zk!j~3+ZG_>&Oz2KK<1r;>|1~gJO^300GW6WvT*@2@*HI40%Ybn$j$}G&~uQb3y`Vj zAX^t8W6wd>E^3_b^0ya1Ve4zhUxGWr~3^#Ww}Imqq>$nbNJs1n3ZQ(Ip7bDdeJC5TIko zMb{ue=a7r;L4Xb-7hQw^okT9W2?08aTyzxzbQZbjE(GW>a?xc7&}rnN+Yq4R$VJy7 zKVYEDxP*0lHZpI@$tswLFZ& z1?X;h=x__rFFu6gLN z3(;ls&}kQ<+vcI;E=1SOL+4$H?wf}WybxVD51n`+x^W&l@D2l;SaKTg*gRS6#u_y*> z!3A?s4EBNx2BR1(1{X|5G1v?)7>#1E8eA|N#b7tMU^t4wa&W%j%{ zQ4IEj3kIYZEC?4&ND0^wE*Oy#up(SABPC!*xL`<1z>;vml$3xi;es(K0c*kqb5a8K zgbN0x1S|>{OiBsZ6fPK*60j;>%#%_QwsKn0|uxRED#4w zP$}3T4j7?QutFR#L#1GcIADlM!4h%66qSN4;(#$K1#83sb5siUhyw zBn}v*Qm{%KFiWLimpEXUO2IO5z%-SCZQ_7&Dg*1p0rOM__K5=qstha?2TW8M*eK4d zyg_APr8r=w%D_%>z)+QerQ(38Dg#@^0b^AL)`|n>stoKE2MksjSS${htTM1!957mC zV6`}4w#vY6almkuf#u?W=_&);#R2102G)xM=Bo_s7Y7Vj8CWn5n6NUiVH_}G=_3PS~*xW4w$rZuxT7HYUN+Y%qEiVD;Ew_A0>cvBB_F zfaPO@>8k+Shg+H_RDktkgZZlf`^N?YSOFH04JNPxY#3 z*7*>EaWP>@Z0DH&=gIEC;kqsuX0&F51jA8{?MK+kl3b2c8FpL#o8QEYO zE5SCh!8lfeb!3BitOWbW1_N0M7LpAnvJz}08;oQnSV=aR$x5)3Y%r9SU@6&PDl5TO zvcXtZg0*CWxvT_x$p(X22^NzLCbJT3CL4@qC0I>1n9WMCn`|(gm0&s9U^*+ocCx{E zR)Y0pgZZok`^g3aS_u}E4JNb_Y$zLyXcbsdHki>Wu%m1+q*Y)^*2C*zhHw|V1)mI6=s1M{tI@P1%~)9SYj5K;=f>vSzwI+f;DD=IsOawm<0y; zFIZ$2nB>1;lUZPt|AJL!fm!|wc9{i+xf(1p3rur0*k%?O=W4LdEHKa2V4qoFpsT?` zv%o}GgNpxB4R)FZhPoOoH4992HP~tv80%`V)+{jB)nKn#V6dyfVzaBhSzy4c!Gg2Egx7!# zXMqu~0V~b|GhPFBoCSuw1}r%XOnD91auyi#8nEUpFy}R3&skv5Yrvwjz@*oJO=p2o zuK}yh0<&HNcAW)=y#_2h3ru?r*mf2e_ZqP7EHLjiVBc9_;A_Cbv%tjHfQ@H?k*@(O z&jK@F19qMThQ0wP5dAVDM|f;LGC|FvNMS#SVq;R3MW1k}O}V8Icng)6{ku;4`0!HreAC1K!{)Wa=d z;F#3IHDTbK)Wbbt;GopQMPcBi)Wc0-;HcEYRbk+))Wcn2;IP!gWntj7)WdCI;JDPo zbz$JV)WdyY;K0QHNstD;4n49Wn$noHNtIT;5aqHbz1u-8#lZ1ug6qY=`D%ju#lQh;f(ypL32TBI#=sG4 zf-Aqf{Vt$No#_e#=uc)f~&^B zS!;s3#=v1~g3HFhX={Sp#=voFg6qb>d253E#=wDVf(ysMiEDxz$H0+mhAYRwnQMkS z$DpxphD*o5scVK?$H1{`hHJ;bxod`d$H2jBhKt9*$!mt2$H38RhO5WG*=vTo$H3uh zhResm>1&4D$H4JxhU>?``D=#z$G`z>h6{+_FR&SIAOlCR8Ll7$XRsOWAOnZ687?6M zr?44rAp^&-1+F0j=dcCtAp-}o1uh~3C$R-?A_GUU1+F3kXR!tDA_Ir91ui24r?CZY zBLl~=1+F6l=dlIuBLfGr1ui55C$a@@Bm+mX1+F9mXR-zEBm;-C1ui86r?LfZB?HH@ z1+FCn=duOvB?AYu1uiB7C$j}^CId&a1+FFoXR{UVCIg4F6)q zDFX+!6)q|RC$$xBDg#Hg6|O1+XSEgXDg%eL6)r0Sr?nMsD+9;16|O4-=d}&)D+33% z4K6GLC$@9WFEjC%PSOGy_Mv9j-J3 zXSyBkGy{ja9WFHkr@9?(H3P@G9j-M4=eiy4H3J8`11>fLC%Xe~HUmey1Fkj$XS)OL zHUo#d11>j{+Nf`XW-QT zgImwQvHu6xo`G}!5AHn!2mc>jdWoF>?|HF^V z!14bF*Pns&|Nr;@MW=(Er|QXU5P!-}ugnp?|-6fG8@6VbS}kvuGuY-rp|unAz}tk3V#X zMeqL{qw_5KJj{A{i$$N05uKm2=<}io_{^fuPyIwKi#|_p@}pVw`I@#dgGHaWDo!bj zK7Si7G_dINm}k#n)917AJ3TgiUXS*(WYg#Od$fX0pXZc0o!RvH&aLdnrq6r)uF-7z z{J++n!KUxShU-h%^!>1L+sLNx%lj{T+4TMK9CC_H->0()SK0LaN?!1YP2V>`%{w-I z|IGLPX4Ci4KpM`b@8{p^$!z+*zHu#J)Ax7M=V~^6pVJ3+u<83fC|1m&@B6tqCLH?y z|H9ukMCU>HHg67{58wH{ICNedyD*GH=SNrD$s9UQ0$$AL(D~xiZ4HOcn;ii=ICTEp z8+VjL=h5SgiyS(ijxM{)q4R2R{Yws=Us-$cH!R^io2VPaq4VwjX|SA2=k>?^!o{y&VQ$& zAG!2Am>8|%((_^B)JQHpFC4Q|x%B)9SW?8L=SkMuFIq6&+LO{ zJbE4pb)0$heA;u)mq*VljY%IKJ-^~^j^NSr?3Ke*9zEYCJzdD7=UtHJIvzd$I3ITL z=y@pYcAQ7g$E2T^c=Wtn)Biq?o}bZyuX*%5Z5sZAN6*)y$Y35lZ*PrH;L-EfA~A-qvy5X908x6-vK!We0rXnFSO;;^Sx7{JD;BSvZdYl^!$HaGKf#} zfNaHhKFtSy<+J%TFBq>{!KeA*d&L$$%@a1O5Atcg7+86hPxFS$>YIF;KSC;=@@XD% zUG<4i^U2V1HJ|1chZRwLnqR(`r15ENvG;BP z&1b8>9v9HOmhN|1K=a$bm-huU&n3CM5zu_M;O-9r&3pIFLj*McUAmAUpn0%|Zmxjl z!wUy11vD?-XloJB{5WN!KuGhXy39aG^JV6ITOrMxPgC55G=Dmd?IxsobX4FVA>c7*JpkmlV32hR#={$0{^LrC**!-}UunvcEl zw+hm{Y%pFer1|-d7Pneso=)tNCZzfLx49aFF(PEXdds|rYoZP{KrZ& z5zXsa=}sb=-ye_k712Cz_@lRo=6e_A2ocTu8CR!>X#V#XE)>x|(0TJ(5$y*Fc{@e4 zFPM%yCZheJ{pWuo+9wXU-4oG%@$Awo{8bdcn04&$BHBNaR|Sb^AIVCN6VZNhXh61z z_LY#AJNS!fKT0}2Kur5m zNA(yn?N5KE&J@!=W$}BdnD#4~(#kB8@c#P?z$C&6i?zDSv1#$ke4gqN7upF69#k4m9dgUU4jjBcc34 zY9o_So*`dpDWQDh;unR4@{a$woh6ii7>w;Fp*%!-eUyaqk;4VkB$Suz@LDXP{G@E_ zdI{wziK^Wa%2#@cPe>?lu^N9_Lix+qtM?_8$Bf8+Eunnoit`T%uC#5_{!_k*gJ`^~}T1t6Q?;~zf%8%TFyGSWd zIwl+-rF?1T&@ocVo9-Q%A*K9jdf*Z%N&_S@+*7rM${*&q*oeSC7A6ky4&@ zq49x~@~tZ0w^GWxzOMQyrTnY*afp=iuxmL9Qp(3(o99X?FY}pDDW&|(_C$-6^0e)0 zz8>Xk{hIalC~w=~Wur&=o8BU&9_4Yy*ZlP;pF12mK#%gex$Loel;7R&JX4SIywOXS z>QTNo@7hK^%KOs8_Ucjo_p9xs9_4|2kE?o=4}O^WP>=G$;1h54C_n7`?WZ2)iPps- zdXz8DF-p{D7#ZcEdopLpC?6foT`HrzbcgFk8Re(^(R*c-r&g{zDWiPV z_rEJL%3I?;Kaf%W8lCb+MtQ8F^@oh|*;I=V8RfM_JrZP;-;SPaV>mCGp)K3Hibr+m0g z&(|*cl)u0D?x#PdpZbB<@)!El7tApJqEG$77;~*Y^$EwUqV=g?5ZR{dQ{NC} zSFBI{Lz;b^KJ^jq4vYcy6DoUM1L`ZT*_j$pfAPu2(SZ64V=He1>Nmca^)#TqHDdn*N z^)D@v?+vJrnW6b@K>bY9r!WKRYvP_J8Bl*yay`$0`kbDpstl;#3E73edj@^axm5x~ z>VGcIG%%z-C}y~gA@xIpyDAN-FRFL+H>Cb3LpH#W`lPnj(T3D7O(>jhNPSaI)M7*G zpB{c$Z%BRAojbb?sh^5Da@>&msxGT98B%{0GvS^g^;vhizA~hK>%QeTL+ZOy{skCP z|J6S?#*q53OihL%^S8g$)zRx1yfD!e7 zo3EWQqCT*7^>ria2VeAmY(#zG5u^7;)E}NK`ej6Y;9zd50zlQH$3{7-$2ssGH_ zHPV>+(By$rjj11P6fZQUzO-BP8e{5DZ(iJCOns`u)FZ~!uZEdlFs8osV)`v(>R)%? zd}d62?9o}DjH#b}XQ?)(zP2?r!kGHog;!FHsn0E)SYS;3?ipFNG4;LU!rF|f|MfW} zG@(A&qqm_6^}~Z3Y)q&x-u_Z)Lj7^b0)G?gll{yFm{7m`C1SJ*_03cEO*f(bS+CP# z6Y8V03)Y!XKOK5$mkIUN;e(HvP=8%mf6;{cY?B9fOsLV*LCe`N`3u=&;h2@-#=eI#+3Se1Mv(~>i3U7S!_yuzkKj|Q|kX8=k78k z9$@(HW2VFhw3+^AO1!}LcXv#QA2>4Ng(>j_bMii$5??TIyT+7wgHEz2Q{oT29;TWS zkI=bWp(*hRgTkv#iC362yWN!dh5c1RGvXOu?J+bXz9CO)Yeu|-%}u2l@ed2#{LP4m zc>Srr8SxRU{-e!^mzW+t&5ZboFOwFT5l>-}xz>#Mii3-Gnh|gDx9o@+@fY*fT`(ga zBeDLL8SxpTwmmZ=UL&~mqZ#oV19z#+i04qZhno@K(SKL68Sx&P);u%fKL&2AG9w-& zpuWY7_>e*C_~yim1eD3mi60rb$jY2}l0O*=bK*;SOzLD#yvh5pKIX)qDEf^sCm!YM z$I0fzrwClk-?~*nBx;gPL%HT)l#KWxX z^v<04nAf*|niDTmAPO-jenx*oygBhS{%Kj}#MeydUuI6c&7vm_=EUEul&~#`$63Bk zVnKY)%y?4^;&ldeakL?|C(8um$lx3*L{jApS=zn`J>f(ESxl zEr<{D2;5*nywFpdJr=|d8ErjoK|ImAsQ)a8FZ$_p*MfMX=It*mh(B_O`fNcwQcru0 z1@TG!H%3|zujC()VnO_psZoIi@l1sa{#p>Vjp%pUlK3s{o~xF`bJ_iTU`c$}qUP6@#Cx6U^xcy9udAyAEr|y^{y4^x z_^{bo>6XNc85tK_5a>Kor$#~9xwkzh86L7 zCqs&@h}V-8)LIe0x8z@k74dvmOvTp3_uch2vL@bd-w<1C;{UqNQd$!a7_hF3HSvLp zL;b9Y7o2-}q&4w_tDa1;CZ2H2m-*Jj7xIEuSrcz~I)1A)@rPyE2ds%lv?xDqO?;wN z!&PhI75{cTuqJ--690`g@r)A5cWdGsC+Y`U6YsdfIL4az#|dWX*2F`KEsCs(k34Hp zV@NR(>B_1|DZlEpku`^zdu_a#i z{-No%#LvE%xyY7y+D*P|ZHce#;P0>{-ga>6AzR{aN4+>}OFXW@uIskM=UyK9$d-8B z6!W*X#P22-eYYi^_rLdnw#4^JcE{Kf@7sS!x-Id)zIsKr!~_L#u_HeD)Rpme#4B$Y zKg*8zWj&pxcEmH!SFg7tzIpl9U3SDfD?E}yZ__mjoF?1=}@F(-k$h!1$&o0@#d>9AF(I?e75quJ@M!*KX2F*pWb)OV|(J&y|doh z6Tcq1>W4k??7FRi_Qbb09geXl-uH zpYQ!n=0H6Ck4_d2#MftibaEix{&8n-2jcGyKXi8>9^c7lkOT4gsV~Mj5U=m>njr zea|}!9f;=-H(BFAe81%MHV5MUtJnt}i2vWP`LqN109T5yIFKJOd)j>m@&&ZPFCEAq z2<`I4fqa5B_tg&M7rd87IFN5}X={=L`3ELBIS%9__zx|2AU~n@WrG9x3ZwK{j^r;4 z*rek~K0`vHkt6vHTz^|f@*N`ob8{sB!MC=PBl!@%WBNFf9})g^m?QZT|JV~9$)55f+c`(_Gb~2la3o(t@7g0r@;9y) zzHua<;~evT9QE!7j3Ig#%&4@$G_r6hdgYngR{B&=7xK4)hjeuz zpUb;*e;4w*jO<3bkngowXR-_VU*qfMxR4L_ENz(!`C+?M8(hd23wyZBh5WG#M~}FW zPnNLkoD2D7XNO&PA>T~v^3a9+v-RB9F65(K&idj)ep;umY8Ud=hMfy{A%87lNumq+ zY{@;dUC3`6FDrE+->qM6tqb{YkKeVskPo+SpFlx=T=ZzUf_%A)<`xR_=fd+H739-x zed(znzwXM$t_t$)+`9KykbmdZF+xE;-lIR06y)cf-8V-;zFukHWeW25K6R{Dkk429 zZKs0#zB`)^E6Dfz>3LQ`{@?Jzs|xY~2j94_AV2W!*p~|O1y683E65*={qRRYKH<@Y zp$hT~pX&j* zCBLz0xScEcj(MeSuH--ZAM4~wK4iU9Z&&goEmcEY$(MXSeVi-#llN<;yOK}IKDN-6 z{K^ok)vn}QHon>7O8(`^{`*|X$2<~y+?D*y;<*=H$=7^canqIj&9tqLUCHNM$$slf ze&@X7-(1P}{3g@7lK;8&zX(_IL9d!7xso4hc`e(Od{K^hsVn)TBd^rDl26)T*zQVx zDd#NTjeOI!BAFZcr+xOBxsi{$y3yW^{M7ap?r!9(mSuK!BY(B~*gkILvljgx>PCKR zt;cvb@?B?Lo8dh&nrvMbR)kv z!K>JfeBauA)o$efE{kn(BOln`j;ka;c;;$}l6>Kmuf|I9hhK1PmE;pAjBr(wUp(o& zuabOYx1=6Q@{cE(4^onk96w{UlKkW+*QY4SSB_4Zt0aGUl<{&U`OKE%HYmw&?sI&n zl6>cnszXZhpLaE$R+0~WS$RcCel%zHT_yR_e@;JBl0O~!^SzRMYLBuXO7g2Sj02VA zTc`JpQj&kIT$ZdPA3Nksj*|TBPajH^;5AySi!*x8!*YEY!(1ZN_g!@(=Fhy%f5Zka5Ayxpr*-up z|39KSuePh!Kj9fI%lkR_5E1T{K_unA&>wHhTA7c8v6`piogsotsC*2=m`Fy7*-6t_> z)FDs0U*dhmDNnj@V${h?o^=0&h3jokx{tzI``DB2rQ4)vt_EnMEjdeVIt)BC1*()|~|BJ(`yK8y)7%020R470*IPr5Hdwx->a?$7XV z;CaFQH$1&V>P7c!82&T%qWd;N_u6>T{Tr_tg%{n&q2BH7MfY=XTDyADeH|M%_4A_p zJM=1tdC`3ysSC$@(fuAVDbu~^zK{Bm3%uz5k3qjyc+q_zDvym`bU(pQ*ZzL1`R zLtb=$NcVN8yy!lW1u6e|(fuNy`rPuO`$qg8Jo2LZM^gE(z34uYXG=bN(fuU%1Alwb zeI)@7!CrKKiQb-QFS^fUe{!-H-EU&)o#RFKon#&=@uK@rf>Nrz=suK0Ws4WxkD|Mi z?M?TkEDIHT)BP!B#s=PWpUQ=K7T$Ef%A98o-gMu}xN4<0-M_M=ODAu-kLBLBp5Fhv zpXK{NZ@RDLK+8yPy1zxyb&@yT=kj;MEN{BsCGF)RZ@TZLq+pdd-Tz{0x!IfUgIP9q zw>RAnlfM73H{BPr=KX1JxK{WU!dlfCIa8=-HuH{EYjJF3{5?z?GS^4FX0zp>fd z@c58Qv_z3H|-bidBX5`_=lx8qmm?L+tP zbZ+nJL-+BF<@WQT`*{wFhWXHaJqfzweCYn3-qLA4bf3>}$vhvr-)EZ6G9S9{M^~`U zhwlGLWVZRh{Wtm2wAY932YOd|)Q9d1(&V1?q5FeMDO_$G`Z{eMGJ6|M<}TL=UG0`_O$w3wuZV(EUaJcF8_;pOG~?+lTHqGR-OS zq5FMfq- zOZPjC3|;6;_dP8=y3&{Kf4VSmqc7bD72dJKm+pts|9rrg?u%Ny>Vz-d9~ESG!I$on z>KuQ~m+qH(bMT%o-8a?6@0l;%KNXVo)|c+1T5|lWFWpZi$2IG8UsYgAurJ+Tb?E;% zy6?Ce`#+B3_KJ|bMOH*p3gAxAd%>4d3*ZzLn99551*#Rb||_-qOGNQU1HP^swG- zD(EeJtXF0gy``6xa<96%^s_R@)-#u$R>7af=F-<{7}wfddRrC^jm)LL<(1IgTzXt9 zyP2CypX<&^mAUk~s;T;#OTTN-wZZ1n^IFq)xViMbGH#ACm)@6EKOb}Hf2~RiG?yOO zZ*{o2^udOoi8YsA*ts6F%%vaJVfTD<>4~jsvfNzyVwD%JGnd|2Ou<%j>5pam?J-wo z|62w;J!CF@vX3?=&81g1cIO3i>6g8$e%)MpW}ZR!%%yLZ_TZ_x^v=c_ri~*7SfBeFP&f^{kZj}5f;*ud+#^dLi%#;*3Yt#-kj&H`4-Zj zTlIIDh4kpIwO(f-eY$T0wpvK9u2$%73+dMxt~qESJv;L=$1S99r+IzOLV9=F{Hqqy zzq2y9Vop3;7beX<^34*&O-WmS0Xbkq^GwqKFdP-dIQ)0v5?+g>7GIh z>F*^Tudt9FU;j(hEv3)*=4M?>>GkuN7+TT)ofuBwfv6Oz`zXKyIr6*XjWwfRA1^+Jbv6SB6 z+bMyT(jPqOA7&{%!Wm96meMD*vYKHjy~2;J=2=R=aGGwhrSuG|eOhHHeZ!ea8!e@G z_+@*7rSuOqQxh$vhZr~Fh@~?7-{wrWQuBG%9pF}>f zl-^<@URg?iaYF4hOX)GTc%ES?ea17JvMi<7s2%&qQu>W2+7((#&#~dha!ctudL~q} zlHTJg4?QdCKOS#vU?n}si;tRHNgwi9Tstf2MJ~7MY$g3jx9^H1rt~ChY%;f!zU0mU zDl6$tcKmB+CH=`2TkNf*N14&b$x8Z^ZN9l$Nw2cc5>G4XS2}k0wUVAC9!#*3zGbt( za4YFurc{o#lK$naEi=pHoiR-n4aWbJa?Eo%a)NSxLXsSTRqf=NY#3nU(ZC z*EfA*CB4stmFZT}|6Eezi64mUce0jV>4Od3t)*XT_s`5)dZz1# z*;q^8^uYmGOYii(uD`YPPoKCBv6dcc!v5jb(nobHa<`UV>YIUH*3wVyv)12Qda8@w zPqdc4>XA;7*3w%&5xP3Htd-gS z_E$5uSxevbMvFbx(tF+MbkJJ*ucPN4vz8ug_K7pr(ueiT1#(Mdmz1=(%SQUTk(VuPq_?}`irPl{yR$F%v5_9{zzg;^(&znnYN(C$dWRixv5|i7 zn%$#qr008ZgSUJ7KHqr;4rJ89Yz2Jq42P^$x zzZ#2eq$k`UYlV&Ug;(BRXCuAgkNdaSNPoCW{7xI`5f_ZzXCr;$i!ywLj&BXQZzKKVpr%i4l-d6d@6%t}NFTXZMK!3_7Jxnw$j&b{b;YP^tMmi9kP}FcB50rY^BF-+wqL8^tn5&zGy4G z?v%1?w$kq&HvYD)^t_ipeqbwo@72ANZKe0^vHq2<^uNF7r`k#nT;uxDR{G$s$G_N0 zFWjuoPh07SKOgtUR(j&r=kjf(FYZ&P)K+@qLp>|0q(5GMu)0cmH-Uy{L&w`sLnFTB@XHp5Cy%O8VyQTsoq-=FkSNe?}uwxvq?=ok8^ zRMJboIhiWyr>{8NUnM>DmhT6vq^}-WcbH0g>(REZD(SEH^&hR09((dKFO~G!+nn-K zNw2+o$^@14+lz`qRm$vtr}*YkD(SmFwVa}o-g~O^OqDYG-+50^oJxA|#&Z^`qz@ml zZkbAY@zMKMtCZRQ&Q@nPsH7)<_U2ZV^yTxO>{KbU|DAuQB&wu8zc2leN_zCIGLNaG zPw)8Uv`TvQsxKE*%ItsVFBw-=(zAC=zp0YGeR#?}mGth1K6$K?{{8nG&sEaH*PcmH zNgv-SF-;}C{FZA!sidF3Yt~nlGW*{pGw`QM`uZQ7{-~t4zur7wCH?*CO-oeL<2Nm+ zP)VP^@yn`e>GhvHR!c4Y{@RP{sio)N!pA@@eg6!LW@_pE``2u(R%ZXZB&4)giwCee zv6EVS0BxkPTD*Xrs$OdG11?pzP>Uz9;*O14e1YbRwQBJOJO=kwi$CB}(_SqeLDic> z)Z!Ba&2UzWSFpg`O|8uSclG!_S}mTz=Ph1p@eMi-@l%U;(4sg{E&jo+y&-Dx5IQ+U zs>Mgpdr51nUk6x-;Jc{{;9>gNGd5(i+^!zOu1S-j478Z zYsAM$Yf(cZUdEs3IvVjaPCnMxh^Jv>)JP+~#(*i!G~#VEeb7oH{>Hi%?KR?Y+!$}9 z5uYRBL|2V6`)}N}q=!cQ4j(%+jd&gd<1IDfd!*jB)rj}esyZ~{f7I#QS0f(Cz8M2G z%Iv>!&S?jYcp+bYIBCQWS=81=Bc8~cVeT67MPAPG)QC4S zh)*)BV~9q)lGg(xG~$=M4UE=^XR>I)6pi>M8M|j_#5?(Rd5%W>lMOH9HR7TC&03^U zX8*evlr7VUmy%d-wMP6DU90sP@l>jI-K-H`<+#~)jd&}yY<((g zXQ|oeKaF@T)p$Z9e#;@%8I5=@#pV|@;=BAYzM>KDWmUWD8u4G=HoUD759WU5`x<5T zzlU$mBaL`5yHk@j;>Rq#`BEdEOshk0G~&yQSdpd?Z^kU*qelFhbHhGsl-d6tpB1NB ze46t$vo+$?^!}KmQD*;pxSY+?D6{`PS}iHmh;Oslvs5GA&30p*M*JK1!YW$vaL!(@ zp%owJ^5QyL@p1x(>1)N$IcH#?6;J2C7frO{>kL}cLMz_RBBwT5W%l1Bq?VypJf4DU zMq2TCI>vO>iq})nrH5Aho{%@awBq?JTwtyh-)BH?Ypr-c``@Xw;{P0tgH}8s_bz?4 z;sfoyKR~O@{+p}|8mtvRsB6ukTJeOub~|gu7qV8nYQ-Bm^~_x>{?PLPPpx=FYYV-! z;u94t@YO1_|0bo4#%qgDT8TJfYhbiSq)U#fo84Xt=nTd&;Kia&L``hBf3``>H% zkVjhasq$7l)rwbD`1H9}{Ho3RueIV?y>WP}72oPie419gE7Qv#wBlb4`kSE@539W6 zSFQM1!(6kp;$SOj#iod@0IsDS1Z2O`SN_Ncv~$y6l=xbYTmz0D<0QL zKb=;5uBPGWzEho-m89^#{24|jlgX$^)C zh4^X3y__MQ+O)bZ5MOQGS2u{aW`A`Ql-Yl?HETT~9$V~qFNn{UXEhGuwbiWd5AoYh zCy$4CZY7(8pv?Z8rTBzEyf?>A;Sm3A^tVWe2Uor?8sfvL{3k=axO(lTLHxKWDKntV z{`a1~d^W_FYuqOe;>``njfePib$2a|^_q`i>3F7(vx_<@A?7#WCen}AT zFZtpPi2t{<*KLRgSbg_hh!0rN@BzdNTsr#^l-Ymt|9(7yc!GW|&mg|we-~aryul@H zUPJuBvRQ8+9%1G5RESTwMfD!y72aL<0pb@f%>D%N3{(4jhWLip*L{U}hpI2%A^xGg z`A>+4_-)oNh>zIvUJk@d{HUJ`@e^%a{y{v&j_V5`zT&QzMNnq{ElxBnh4_oEj^z-K zadEs3;xjs5tW5D55B{o3@f+8-twHe|4TjdD_>P8C>rlMM8@uaLnftw>_<0>Z|RcLo#I{A$Tgw(mkznTC>~~;KV}pkbM8-bDzpEV zv7ap|er8FkHO14^e`-tdHBTj}DcDb&hl$K=C_A zTia7S&!5c(Q+&^Q1r8MN^XfB4ivL-0$cf^CKA!7L@j-ix96|9yTXuD&_@NsL-6)>u z?py8@UsSVlG{qYYaQCG6qY89E@ksqXdQp5*n_WH>uXL-oFU2oi-pZfinbvz1K=Dmm zFAJo2r|0d0DE?_??nH`*x@~s|#YfE?7Dn+>&zFQ#{M1%^A}OA#-ry*Tueu~Vn&Pc) zSRPC9S513Np?IwB_oh;r{kN{`JDuXSIu*~LGW&1ccEv1;=Q_Rp9E$H6aC|Psdws8+ zNAX`X?!{9)*y!O4C_e0(l!X*87M_bKe(dD5B@|Cq>$!~L%dSjWPVr{LhOeafv#Ix1 zQ9Rn`+BFoPcGU5;RA&Eeg4(aA__Z}xY@m3yy^A+eeB1BiHdC4Xx9M?j3zgY_o6_#v zC?4*}<=ZJfF0vCSUhc_3J1Ktd$=$msp02iJH4yv9opQoP>s7l$Z*uV>366wh~n*MAh>_tK7|6z}&^`Y|fA|F(l#olw5s9b0d= zlN2Ag%JNebFWBtHX^J2GJt$e|bRhm%Y9{qD-1f>diuXMEzvmSH*<3Dr?7yaS)t?ma`{drA6#x5fzif&J9`G@n;)5@n_KV_$YYl!={P5WQzbT%$ zttyA&i^o66p?Kq?M*X4q<7YGfP(1Q&A%7`8xnAC1idSBBaxTR$k1xulc;+i6=TUs~ z_W$xI-nl01AH_fa_~jqPL$BwVPi6LBd-HKV#Y?Y@0*ar0?{ERdQ*Yj^km9TVon1)r z)<=9Tr1`noLh;?RLrbX4{$ov2 z36Zr{Ab632M%IrT4w&|$M{!{OSj>_ym zm)+D+nf>R67dk4l|LponM`iY({jzmbX8-y1pN`7xKO2_nsLcNJR)vn0DpmUbe;ry> zVyRAt{=F+PTUo~ssl=Dcy2!s0Pbll5nUy$SSs!hvL?>naeXJ7om9@eBN^%^SWmIB> zvbvO3Vk2dZX@eCc@-Ar>aciU73Td_p7*sX%>1LngEv+9AV-HEf2(l+ZyogXs&d*d9l9G;m7foW zXsfcyPaT3sR^|CD9hQVwrQdhu@r$am`Zpc!@2bk}Uv$X2Se4yB>rm@uRUXSwzP@sf z(e0BC18Y>{<_|jfx2wiV={n4_sm3vBI_w%=jmJ`z^OA|xSoB7R^m)~2ouYjI+p00- zl@2Y=R^!GOI#@rg#tYAMaQ$A5&z|ZKS-CpXAM3E9Wp!pe)Zwssb*A0d;htl4KDw*J z=YZ-wd0U4{v#WFEO&wZqs?KrOb+9>6oyOOc*Wp2RW?j}HJhM6zE-K$oS#=IRuR~&! z8vJoahig4+Fz%ENZ|!Ta{s|ra`PAUrqdL@^R)h79DBsuG8k~7h2fHK6xzj!!JZ{$@ z_v$byy#`nB(qU;~4W=e2uTO)TY`#s0OWkU6=w=;W^sTAab9+7DH$0u+69z?WXH+ zLR*Wqrs!~cWG&u}R-SKoEl!Wr;n$*C>>Q>;<=x8mi8?gCREyq$%JY6%i`jlU*#4@; za3AG$tx=mZH6*^J?>~gYxyZ)#kr} z%IkHeHoNuHA^Aydx>9-FzSU-oTKT$_>TsF04y7&XaErMPwax2rdoLZDI@aOF?mBb~ zsKbR_bTFM&hoK#H&}^*3!R>UgKVFBeTPd&0{W|>IR0pq&I^1KR{CO>{!%_Om&$Y20 ztJcwBhKU~cR@Y(vKs{RN#m*GQ9mq z1x}^uvG_{`F68Uc@lyq^>euD^v2R?S2Jb zEUnAXTNQY{w=Sn&tH7HpbvgTD1yWzv<T%JA3cQ_PkJ{DB@e=AWYpHVlbM?4%f%5f|>#^fp{o%AW%?Ybtw2o04+8 z>C%8-^2%|?t^pVQD#xkO4QTkS96Kj9;E9jrSiZCYty0S|Wp4wXd{GX+D-CG$xExNe z8*tg3a#-gy;LmI2Fs#*(cFLeaZA0Z_a3{<0*R~-a9afG%q9Lm$mg8!0Lz*U(V{d#z zx^67T;_VF?wyGRqXB%?X;&Kds+K}_(%3<-nA>*c(qgiDGMn{*UxP<||Ld)^Cw*j@| z%W-jt0ULRjW3#^j)7_QlHPe7Qoy#$Dg8@emRvv%MfHnJ;qrp7`9#NGe`=bHv&C7AG z*nn@kmt(g#`C`a0gMvST`!^!=P zm{d@Pg-MNAHK$DZd)Z@`!tQ2bhiwX-5T@$ zwKCX;HRio@WoWvvF|Qme!{;51d2oLjPMmMdB|FM6>se#^ZY+btkH$1xS%xN6n=pSt z89ugZ!sD~baL}R&$HkUm($FTX6;=k-_$J&JP=?C0n@}~j40ks+;VsuPEIZzW{T<6N z{C*Q&>Q{!w8BN$#U51pBCS2OP44WG@RnBS4;L)QgEey-hYCuy?YhH%bu}yidei=5! zHf2_gGK^f=lm->0Xmp?{&GJj}G^r`=vrDn$ZBx2rmZE=dQ@W*=qM}YS4t-XNvmKjJ zeXkT@nr3W&trSLX%~*D(6se)j`1nXERxW79^?ORuZ$~q_Y$-*-xn``nx)cYJoAKnr zQjE@0w$Ca>?JCXrBf1n9S~lmD;8FydH)q+nQZ#mK&e&0SCg1@$YJVt?Nj z>{?g?2hSF?{#AnPs20>_mSFj^7F4}0fk|QunmjGRqbn`g^mYj*zHY(%izTR;(}E9= zmtarLmfX0n1ZdxqqqmjdjZI4$tSLd{@Rq#3umrUyw&eJkCD<9)l2xKgV70X+*G(wF z!&5EU+N%WKk6Lo8O9^s6w`7CCC5SI?$r&g?ZWnWx1`m?Rhcc^jdTK z-D1=-YR&bRi?K}8n)6N+L*K16C+sW6s?gT#x3w4z7qn*MRmE7H(3)xS#i)O-HMdMH z#`34F=@eFs+TUBV*tZz*mD+HNdoe1Sw_$I`VoWw`!z8<6zSl&|34@--%FRcyN=M}xu3lAy;PY*{AifCClG`$J zN)arx+Hyol5jItBM`NEN<@ZKA7P%C`qjx)AwlBg3hjyH-E<$s^cI?)x2r<*!@mYr= zB(H79@TNuRexx0%)luGmxz$d2&!G@$Y3OJIoFnsv!%S7DBoF%}2Eh zG3AgUHmkkhfkIAXu*hgYOm~v113;yjXzu>JHp;qyUXw zJJ4uH0USa)aPR5@%!=>8R`CVOd4Y0SIko^9r#movLID~*?!bYb1?c;w12+yWKzMlv zrn3Osnsj8V-UYa0(vi+a1^6?dBd0YjKy$B-+*YdqjP1x%CHe4Q(UCW@^RZ}ON8U-# z$Kk8W?c{tsey!YpBOlqnmHkiWL$9V0r|-*0*LFs9-jt92)<$f-Bp+VGjF>(>ACm)( zxG^*zD`y+g-a8+O8;$tOIUg5~8F6u6<#>0E*v29sA3hjyU#EQhDKui2X8F+7@5Jr3 z@=>>IC+d~_Lkqi34FCBL9Y=NI{j`5DiRi?ZPyWGjQ78Id`v>*TPTYC?AMDO|;;UW% z&_B5oE3N&9f!{l^L%gz9>P%IPvNrF`!Q=m-pJ`_fbN>ep>dYa7{z2u_nXvr_^C_L# z#rPk(ujbvBj z<%cc|?w5zMf-byjt{hLlD{C6%;X>!Gv~Qe;4d}{Q)$$NIvMZ1L%Y{Q&S0;bXMTZ4l z`SWEiine!U*{xhWKGT)e&g5d}o5Y}cK&YAf5V zy0dZ7AIx{^&Su~Kp!@jlZ20;Qp3dyf%D4X@a(#DZo%#cV|GM+e?mswjt2?)@{sX79 z?i@eo4}RozXV>sQh}Y}EPhp_p_IoSE32d^dNpj%-NwmO!B+{KB45z4$8S7fQo>(f0N)j9A!T;;z77$SUo{C$7I>*~pZ+eSTrKu_^2J`h~lFOxdROFXbb?rtDN(IbMV*jS8}{ zexWH_W@h76f+=ezXQT01Q~tP|jp2_?dHY~CmVGwmh7H-cU200NdD$p8Fk{<@Z1grZ z-8+>F;cWFvop8J+8AqkV!I-9+~mU z%b(bsX-4(+pSV(D#-0ED#D|8xS-SZrbX|MXaluctwd>9GlYT0ux@!NXStD|z9Q@uI0{!bi!(3{Ijf8g>b<#FGB;9-%nzW9MR_075L+7D!Q zHs|!iKaj08r_aV8$a6KPX5J4J1)H;e_z#rEne(m350q^-=azxW?c?Sg(ObFyt~o2W zRrXIe=lNoG z$0*y6e8b^oR=mF98v^%OaroSCXn)a)Z-T!eCE1E@BfnwUH!D7{`vz86(W?75{Ap~> z%}u^xM|W%H>Aqq}UuzEd@f8K5thxN9>=)b_4RS$ke);4RJuKkK7r>yBV z^DB%WSTi#4EAD-?X8iE4@GG?D3iVf%*R$cuPG7Ok$cBsRe?>R74JQ|W!KL9g^ve7K z#|bu6KmLMuvuxPl+!q9{w_)1OFZg@dhC7#h!PFZz^oaff-5VR~d3`}#jtx)Se?iq6 zwsbZ7f_bfN`LpF0R5G{a)M{TaZLlpXetkxsw{i_7*77F>H@5 zFRlHIYZq+Uc;;vHNVa9b_|Mq*)s{zweMY5n<#;xq5!gsY!w#SEsGEvTdY{qLPQ|Ey znOHGW#TD-}ksYGqt~;5qpQqyCW0}~wS;ZrpGEsO;#l*RpaJ-}9`iYs?k*4BwmrUg3 zs_3D~gtoSty*g!LQ9Cuu>Sf}&rCRy_sSLDmRCD@=40!pfX>u#prZzCary(Aj{p<5et_Ntu*j|B1Fl{J-?jgM zy{|y?S|70ZCpb4J9TO{)_g<&NLAkV7{c1Y8n2@T(bX4v~1};m-+fn4wsB|0)Blmfv zBQBo2&?g-(TgaPT(_wg=yj?#XziyLP3*O`GJM!53_n7&Y+<5Cf`qZ>z?BVyQ+QyDU z*SyEg-gay?^*!bcvg0T3_fUD+F=60)EViSr(R+CAu;ZSRH0YhNBR-|! z!UH=#yPJl9k9PDtng;y>JLOtX8qVk`*ZQWXVYFc%-W`{Q601J!H7E_69s6)a&oo&1 z_TksYX-J;jhZd#p5V*V#r+s>dvfX`n{_Z=hJl{vTCif0)pY&nNb?*uZxfVAPjWd%VLv+rFG`@D789^<_*^D(?9AWuS7sx9_yRbiS2}ODp@* z>`*Gq68p0Ds#GLi?8~RVWs_G8nmH;8M{pFU6C;C`q6+;!>=^ws^Dy6Fv^o%>Tyxn8|0 zpg+z1-r(`H{&X4i2DMi8=R}h?uuJUEsRnNlbFshjesc=;Kkd)iX(>qg+@CSmQ&6p> zKmGQlpjZ6?9JDkA?nVRHIU)r!YzMH^H3d7I2Jo(J3a+2l-mfvX?m))(dkufXfvo8A z8bMYA8BzB&LWT_F+dr=m>@$$6SFbQ3W+2yIcm>}j1DUz~6+CtfRIa7Gg45}N3>p7Q zxt>0ddmUcEG<_gn_I!obc>`H$@Cr3**|TNgOZ;kWPqTL~@yyJgcGq6w)IfXM?|F$e zp7tED@Fl_`?5PfZ3H$l>G#>U6ZMN96zWGc1J!;QiO<&^1O?%!fd4W}L?71ra1;+fc zr`wGe=u~A84fegj&!&TTckv4x?LLUnp)U|-H;B!Lzd#SSK|Eve0$+m$ad7h&NSHN< zuS%c8b?qRI{_q?%4k)*8JjdC~%KiJE!}r-Bo?iSMb-yZ)4}Ff)C4(5{{2Zg|59S^7 z=P2$tm<^jf$0nP>bS-%Xi=l(L^8GVB9ygdblAggYb})bKd4|FzgV|u=Gc4ROn8p*I zp~>mN)DC@yo%aUQ-t-x|z8_47M$hoy-@)u(kPOor4zzxojAJbwXm~jpJ$gB?>W*aW z>*v7tbCc0#lmn0XCu4Pp1E<<2qsm+ds*RHovEG3Nb(4{H(18bXo}&L%2ab6D6o;NW z@ZagDsQ1l*%QrqnXsH9+O?!$5^@s4_n5Qr@8p7^;is?2(m}vMEPaTy3u4+$VIBp2% zetm-Qm?8Xp?+Gp~9zq;`f@%pvxN7+m3_dx8so_ts?9LFj9`OW^QipJ)#S_%d8N$U) zpP*k=N1iHrjA_jr`6~4>j&*nBpUaQ&k&djg<1zGI9a(SgW2h!LvVq@Y_|9--odJ)r zXq6+&J3q#uy^j1|>oFdjcjUt#kMQl0BlkUegi4xVLa`$Kpg z9Ln0WAHx00P|o*x2*+nbS<>er_+=;qJ3d6O;-P$0?IBv%bE5Ir2dH7_#MyTr;FpCH zA0K#tXM>#BXvqVd9OJ~{!4I%1!iftVA7Em<6VIAFK;KPHOw)gWW=EV@nsXmn*PLkZ z>^{!DaAJp(_c8CA6T7Xw564nvjlPeD^@q{W?LJ<17{-QH_p#P$7)zSohqJ>lrWW2q zZLeWG_2wR~MGoWq3->T-{xCXixrdIMhq1x*dq_Sqj1N5TVOr8K&d}V0;mcv{(&ip+ ze^a)X-$g*_Fb1UGMb-MwEWUad2_2jnzvC_}t(;kF&Rskh?5zA8?!t4dGfV95A}hj~ zfrfVx9q-IXmG7c#qcU8caR+k`J9EyBJE(finNN1#LELj^Hko$^URgR#m-#X z?+$*}9nMP~?_g~E;moXh2anB%v+C#Du(cn~*0*kBm&b6L?7fYeVZ&)1e;X6$4yUdE zZQNfsoaX&+qtk)m>}+%!vn~y1!)mwj^2u=KXWl}WjNyEC^A;xO4`0kx~~hLsBWN1j0^Qz-hkmE7xpc_j_zAs81d#h%#ONn z)4A)gxbDJp8

3zK7%?cZGZ$@MxE*?>RHucLiES7sYrN2B(x{Ps6V`IxvXQH z3aVwg@m%s1B<8!Z_~;e%tu>Ms%dg;l%aIHWzJh3zkz70Y3ToPoz84@s$L z9m&i2m(aL)Bsaadgn4@I3_WoPIc?mjUU>=brtYj9dI^{Ny7RijCA4*O=hUv3FeA{N z-D+II>#6R1k$Dk4m$@td4qrrEf;$`RxQOS+-MM$hMYO-^PBV{-2zuqtbJiDe{F^&1 zn_NU*u{)3CUVwSsQEZcZ0pV>&asGc7aKLmFzb(0d_kBmP?}Q7e?>36-2V4LGNAXjK z3kaGzid`yQ!0M%=81Vi)&Tb#YZ5PiY<=7}b+;|@Uu8-os=<}%maul16IFC+WN71y` zdDs?>V!yiQF}TiXI%l1OTkFwuyK@d+Jx9}J&pG(pji$q#a~MBjv~peI90L4Dv!m)9 zd}2qlTC;N)wP-XyGiE1vgJ2&fJsTcAi4V0iJZ5aSBNzJvnXEDU6=r$xRlg z@Mo$gk2O&CTk6TA?2~A?-IMq4oy7K|o_w_TBswK|^6s3IIQUFC?wFG>&h+FVo0B;3 z&y%YgpG1cmV;K481U5Ar!y%7OK(E^vwmEPD(^O-aHSYwz4jIG$yidSs>=*{CPvB(O z7iQ|r8(Xg?ssy&8FK4a&yM9$pQG4*cP!J@M{(}WSk`QI zRJlGnmfdpyLwd&0&#M{xR#7cW>I!InE-oZsLGW~O-2 z;pbtD`R>J9cMdD(|6aVd^Dy-5cr#-9VPv%QW~-5hajLsFubLjlY>hWP^$uguP;cgb zIRt$#Z^k7Z!qYHs>TNxQ<+HuHBIXbVt@36a=R>I2>CHLDhj8MAw?Zu(g3k?ax_>x` zx-YzW;le?j&h%!Jbq6u(pErZT4x*@<56=%ei1kf;SgGSd^z7`zKII2+)5?c4QVzh) z-iOCe96+YK57U<(Kmak#Qy^?mT3J&w216R~gQI8HvFh^!ssXtX8~ zU5}6B!{9{tCyit9fJAId9>;3!5|R9I95)s1MWw&v*y;IRm{j)Vk;8l8*3g$d=I_Nc zLtpOm+KX*wzHDi;7Z>{Ya$&>0cro0Uzklq(_i?@)c54qxB7J#q`ySMe^JRJL9yD6x z%OTEt&~mpg*L2&1)+c@WqRJk$y5URxwB2a-+?V~%?1p}ZFC$m%MwMJ&ZVudyzm@%X z$!<5^H}qpli`}?m=*R5bT{vXs$I^$pu%wS4t0nG2;BY_In6(Rb_TohrlArQf%bmFK)Q{=`J2B&fa-6n1 zVV>j1hXp(ErNWPkpYFgqeSh{jumfo8&%8Oxb`yW@7`+3FwEi5>dk4A<_2-v5J8)x+ zKWAkoz$3(;2A31?Yr3-Ex&+Kz>d(%h38=l*pZfA{(LrjJ1PqO*>lu(gw+gSyy-;O^DiFy1wQsX^P2 z@c{leZ7brh1@O{{t+??dfH#e|qU?PD?^M}}-oFBPBXtY>%K~`*1sUDObFyj+s@aaGo52=z7&M+ee{6=4RAZEJigrqG`JGTw*~8Q z_hBGgJXw!vseyD&T#s&9fm}3WJzf?D@|??hOs_G4AC1?eZIcPCR%Jb|beurLx9c#f z_XOG=UxysK2^_L;9pZ*f;3%(kXy7%0UY6^yHDm(4>#jqG=@aOgxfY3wC(!xgS{QAb zK)cmzv18u^8c$e@CTAwFKG$N=%?bS7WGxDxP2k<^H5m7C0=L{;gL}UxaKe@~FfN}! z)5tYgtQW*Q`!&dH5yazd*TA-G5Cij9W0_SDTRd8g)c!%dy?Zr`T!I)pbu}iA3u0a8 z)i@F!#QmLD+zgPv2EkSfYv&KW zdS70S5s4Eycg=EGotnt)6PBat^@&ub43PU|B5yZdj{9j7nfzlJw*Q#Ol%!<{DN@!A z%V1L@m@h(>LDwjl_xmox4Z~nwY`zS0dj&J`_flxI!CZQ4DRLcx8N6jF5=RAdV8l}8 z&v7tY4_u0hs9;O}5M?O2SY(qLvqFIL`X4dHBu#W>S6gbms+MmM7n zZp~kW&1NBN|8NniGlaW#E<&hd2wTT4!n4sKTr*@5Oant$)o>A(Mu#xGU?DQ*hVa$H zg|J*1LMvtdBYvB*U+h9WIT*t4Ll&aRxe%%h7sCBk2p1GAz`AE4eEe_$o}`CRf7b$3 z%MRg?*afgG4q@Do1@NsA$}{a3U}>XJX5`Pu@%Evt^Kd?rO+wjY=X_+VLg^4QAJqnh z($`@=n!ANErrmsW^$lhGzj&C3hjRJ-c&KNDa&@Ahn@{0`%ru-Wh~4dcmXvyoXdob!@q!MAZZ9fD@z zefx0MG?)b!lW<Da2r=vxDIMf0{<{jm=~<>=?m^ zA7f$CD}tvM#bSUuf@@7j+-2f zsq-ROvt2ZzRz`5|ohVG$8bO<|D2(18!5dAYFyK@K`(2p?lWP&Y;2@$gb-v;1H@FYH*9ROYIBxZFA zfF^DdD<1kIX89!6ndFZ{n=8Hw|CUIivI3#?XMAKd4aP03S{vJ3Em&+z`Pqq(k)r{h>H9oj!5XD?;AKYyd z#pUn4mG?2C*lwOTE|^F0U{`M(Mih;ocwy7vDDIB(!d%xV8np1jc<(4qy*d^HCr0s& z-&k~riDJ*%V^K0YiZhOm!Q&-SyzVjvTh~XiyvP#)JELfp;EC>sqd2yoC$i5(an5%S z97u}d*5w`;_b`h8_4YvH*HJu|G8(r&M)AUo(Fpq)#gm4k(WD@Xd+varyJ!v@G!pw9qFJ8prhNV_ zTKRm98xp*u*~iKajV4AjCDj%4qNC|Q+ZBIiMe|2TSGX^ZX5c*+TwEK?cOfolkr2&6 z4P6j*Ae#T38G-vJqgmTy1X^B+rdP#qjK3SrL%WCL=(A|$=R6#_@1kk^(-~%8mHSsZ zBjissmzX3Dr&j|~y zmHUqkMM58Cf0v;+J|u?63LSC9Erv_CI^vFZ41MT`he0vykvRkpqGI@W!4TY;8N;K- zLvUqb4E>%s;MnRIHkjmq?OS7brilXfFz?>Zm2#06MM$;-huw8ZxhShA^mZzPb{0{^uv%Lu{2xL4;ikp z%IDPjA;v3~!{78p)d{h5o8A}8BV*~(wl55($8ym1K3E$cOKbl=sJ|kXZEN>PI3M>aS2@x&HFM=kO-sb_J3qglKd#q#Ws36fjQd>I^?AP=E2`;L zrP#E_pzd_65-~{z^=YdrvF%=>8r;50gw9P=GrCrZFTxYmIYCvT`I!WDdvuj3s!UKX zsa4`f_XPDtzbfHb9j~?Hpm(W?9R`gK&a z`l6;v-1s+2y>zfjoclCN-F~7<>`jPLKl-&wtiBYfW?rol@7g2P;J>OwvR9<~@1rWw zeP4vS>v@&QGiT*}$&?QvO9&Qu^z7J8Kj5CTuqeIkpCK!d`zhJd# zfl;4B2df{J8HHOyu-eRO6vm4|>a=M_amE^?)_!Od{+>bVh;DnNa;%_ye!4p7JLHtKl@e|6(wqc||bUwv`XC~kE3SNokeidRSc z)Q_$jh0A0=_0(;n=-k{-b$VnJ-8Obt`_}5$!QEAJeUs??z*k+@)FfQy`l@GIo5br- zU-h|%N!&QqP3_RdBo3BzQ{w_mVuedLby$Q+lz!)nd- z>Z-mo!X#u&SM}W#lZgDai)x=>5?8Cbs1=h<;(hlnYF?>H`0eyo$CyoG-#BkoylWC; zpL?l3ALxJIQZKd90+X1M=%rp+ViFH7c2<8_X%dsIoz?f(nZ%Wjoz+oWOk$|!sdn0F z5Iyw`X#BjBnsUmdPi;D>Ezg^T*OiXyo-6vFmmSq9w@hMF=Z!AMK*eqsz(O!Me$t=EktG(*#W)>%|dZ;Tpn#Esl zd#K%f%;J@ohq@-vES&bbtKA~aqHUJDx;()wJnFlvt$Uh9yOr(Kw+EPobB}iFondBC z?~k_Xuw=8i_jX%#ONLqe;?-7lnq(H=?Qv6ci_Bt9rklFG!Yp*-u-e#W7U5sCQHM@5 zi#pLp{dl%n?7rfvo?c)UHtDK5FExwk&aP^om1c1ZE^6gkvsgIZMP0SYEDWz&tH-vP z#qY~otAA@|VNzPF&Iiq+)$grTzhh>x(%MQ@PMbwg$5!f)-^^lbbxSqn53`6!ZK-D6 z*1zB9&T97GX3=G-vzqmX1ejk!5sJmF5<)r=64P=VB4VlybF>F{CplR@5g}k=ydJvPsVnw;%Ys(&4pL9GY=SdAE^GOx|}< zxzW@n8o&BY>DkgI7RUdlENf#ET`Ddpe|y-(SDVi(YG<41bnjPXrjJd`?f$EB!rvyI zO*p4GhuTE)=Vz6qD4W=F;f(T5yiL@1JEMH3+QfiirA zv5AZoKPjJ8+QiV`epD7(^grkJqw@aSHsL<(s8Tsy|GFO>Q8GTTiG2qTE4}C1#O!*9 z6`zGRF*xy%^7>PoaI8G2oLz1cJ2xLt)_iFbId}IfWoz_b_ua1~ZnTM2nfsJin{6U? z*c8^lAOaDGv?NI`D+r;6d-O7diHla?3GVO>>e6w3q0*>2++w&Ub$DeJY zGO9+Ibj~JD7F8>+ezOVhb-R>#S8Ss2&z*|rb(`4SX{Yk_ZJW3^c83yhUw?cTY**Gj z(!cLx+mx>V+Jw*+4@%S5HnG+Gy;9N8E)IPEopRC9E>1q!swge&;*8%` zWoawB_+`Qt<#8LkIQrRUrLTuw>^!$gS=h-gzHGHg`Q6(trYC)?bn&%|tZCmU69Via z1{;;-A$HN|*#_lwgk2m9-=H*#wTn3g>y_|CyXe1qosul<;>G2)ilvubtao3leA>@0 zhL2dIY#C@5k7s|a92{yFA0Aw-oEd2sUa!AWu8g&dZ{ogEuBX~Xbm=PPMuuH%+wi4w zHQO%2Zmd*(on#lQJy$A63+%!*`3q&+RJ*XuU!i`61KoDS}*!kxwptJ zloN}URZHw5+i|fnX1QIw_tqy$qm_2?xoMHI@hiL7x^Jiy0?pDSa;Jk7tuv$`_aH zqH&Lz%F`=$QDb^v>HDW$6m6ZMEVyYG9qvw7F8pN|`?^k7I^4I5+_Y&*@+eByx+sB zENCi4*;cc%s)ZDzx|)5wReEhtktuSjv=v+>IOx1?y`l&f>XS>w~4(sfI@M@n&|(+FklX#MNV8Ky)h zOR@ds5JgLoV%3zvib$7Y#_t0aEklY4gOill2~xyp{gn+l`rjAaPia3%ibJ3EQKscf z@m`DG%AEo!;;lWEq#`M9-hE5?x>$-ise0?ORDYa)Qj{STQtVGKD9ft!$8UXt@~26P z-#y|LU#k=uvtpH8yA;1Yi&j2=TZ$ohQOYmxN>Tl5gi?RH6yE*9m7w>fczau@GGdk# z7rKQgrL(07Toj~yG)I4&8U-q==Ss1w%wO3)Uy5hfx+@1hmLhC~uX1dW)bp-B%E`r2 zd>GbMIle@S%`3c>L(8N%>FlLcFPGw$%~M&wLW9HTtiwYpXb~(|=z(H|5HD{m;#CRW@#v;?&dDO2xNQe4o=wiQ6p2{L{|Lzgwi3 z+|xC|BDTkFElAI zpn(#*TZ+OR^^~J~^zU=XE5n$5Qj`bQ87}Xa;=3l#3|R-I`0K_K!<9o)xb1&rNIoJ( z+!qfF$B#-e+;-Ps_(}h{rQ9~GIi~+RVs98)oRIqb@0wxCN&WGDblGt9loW$bTr_n4 zMT+nZ=M5#NrEs2k)_^loT+8{z;BZcgO+8K;2K=f&?>&zhW}ep{&$=Uqy%(go{_8=* z)8F*(^ZR`UpG*4lZvJk=(BGvvJEg`@ep&x_C+##Wx+293-))91SEZQV@H@ldKcsNH zy2)_iniTKWY&6{bQ;L5-U1xZ3U4On-d~JAiLyDhJ$D z`t#)G62q~-^ykt3PYm1cNKvukW5Z{6rPyJaXRzMWzs}e>hUEKFghqW}2zj7?->u#^ z)caeCdH3Ek9M`WqkGySI_)vd-46qo+KGL5b^(zc+kM*y&tH^Ldzb2RF8Q%Rz3Uj~& zL&OvP=W;F8a7n*@y>ztUou~TaFk+~o%fI^brr7|4reD|X>uDJIpA^f?2Ez^gIwK;+ zQ2I=NeD8!BYV~X1FZ~VHS}8iFbTvHJulHJaGL$`+V%yQShFkj8{7x&wm^%IE72nLT zN54LP*wE1Jg%rBKK5@E!)qVDff9TiOq1O^)U+O=n6=xG?>eqSBM-$KL*JHMt#E!4@ z*Wvw5i5dDeENxZda{Ze8(C+OFiEe9mNuV2^R z4^3R7U-$mhHgTVRT{p5W;eviW)beP;9sPRor%w|8)vsq;4oG;VUoW&g8egy8+af36 zq#yr#C;$I0{{CJ3^Sk)VqpZ_&{ zJ=E~^QN!0u4PQSsd_C3h^;N^yTMb`-HGDnR@by{4*J}-5zcoJpdp+0i^oi`?JRPYmM*U8sE<~zQ1eE|9ijJ z`2Mf)^FZV0gT~Jbjh`P{_3}5LCmKIrG=AP_{QS}Qd8G04N#p00#?LQ}pJy6B-!y*S zY5e@t_<5-D^HJmHrN+-sji09)KVLO|-fH~()%ba=@$*^Z=e5SqZ;hYl8b9APe%@>R z{MUFM&_w#1^MS_mg2wZM#`A>6^M%IqhQ{-U#`B2A^NGguipKMc#`BDJUU_rA(Rkj` zc>d9N9@2O|(s*9dcz)7&p3-=}(sdCO9@BU}(|BIfcz)A(p3``~(|F#~c>dFP z9@Ka~)OcRhcz)D)p4520)Og<1c>dIQ9@Th0)p%ajcz)G*p4E81)p*|3c>dLR9@cn1 z)_7jlcz)J+p4NE2)_C65c>dOS9@lt2*LYsncz)M-p4WK3*LdF7c>dRTKcMmcK;!*_ z#`_12_Y)fLFErk7XuSW>ct4`?{zT*bipKjFjrTJe?{75T?`XXL(Re?k@%~8T{gTG} zCyn=08t<<(-fwBV|I&Crrt$tvb_QjrX$}?{78U?`pjN)p$Rw@%~uj{j$dUXN~vM z8t<<)-fwHX|JHavuJQg{kk(Aclg*uT)&&(PT4(Ae+L*#FSj57F2k(bzB1*gw(OPtn+4(b#X% z*niR3kI~ql(b%ui*uT-(&(YZ5(b(_N*#FVk57O8l(%3K3*gw+PPtw?5(%5g(*niU4 zkJ8wm(%7%k*uT=)&(hf6(%A3P*#FYl57XEm)7UT5*gw z{}SwHg8faf-wF0V!G0*%9|ilRVE+{Cr-J=eu-^*yU%`GX*q;UawP61i?B|00U9jH^ z_J6^CFxVdk`^8}Y80;s5{bjJ<4ECSFel*yh2K&`u{~GLPgZ*u=-wpP^!G1W{9|!y8 zVE-KKr-S`RFCoace_J#gL!&i}x9AUGcc z=Y`<>5S%B1^F?sp2+kkDc_cWW1m~6D{1TjJg7Zyq-U-e>!Feb+9|h;7;QSPvr-JiU zaNY{eU%`1SIG+XQwcz{~oach`U2xtD&VRvqFgPCu=f&Xs7@Q}A^JQ?}49=gyc{Dhm z2Itk_{2H8RgY#{0-VM&b!Ff119|z~<;QSn%r-So#aNZ8i-@$o2IG+dS_2B#-oack{ zeQ@3n&i}!E0B}D5+!p}%2f%#-aK8ZDHvsn!z0_aDH0 z2yj0F+?N3NC%}CQaK8fFw*dDqzAQ5_g}z$7;rxZ+?N6OXTW_LaK8rJ zw*mKWzFmOK%+!q7)$H09uaK8-PHv{+2z+?NCQ=fHhBaK8@Rw*&X@zbu!F^0{KNH;71ot<=eNJ${6WsR%_dmgXP;fsK+!qD+N5OqkaK9AXHwE`k z!F^P4KNZ|p1@~9MeO7S472J0P_g}$%Sa3fU+?NISXTg11aK9GZw*~ia!F^nCKNsBB z1^0KseO_?C7u@#+_kY2CU~oSe+!qG-hrxYfaK9MbHwO2Q!F^_rJk? zaBx2y+!qJ;$H9GaaK9YfHwX96!F_aaKONjx2lv;(eRgoa9o%;Z_us*NcyK=++?NOU z=fQn?aK9ehw+Hv{!F_yiKOfxJ2lw~EeSUDiAKdo`_y55>0GJN|^8#Rg0L&AB`2sL+ z0Ok+CJOY?c0P_l9egVugfcXY6?*Qf>z&r$)j{x%$V15G3Q-JvjFmD0oFTgwon9l(7 z8eo0{%yWSG4lwTl=0CtZ2$&B6^CDn=1k96w`4TX10_IP^JPMdk0rM(geg(|4fcX|M z?*isuz&s3?j{);CV15S7(}4LJFmD6qZ@@ebn9l+8I$(YW%=3Wx9x(3%=6}FE5SR}F z^Fm;L2+R|K`6B&!{3dS%=8wQU5|~c{^GaZT3CuHr`6e*$1m>T>JQSFZ0`pQ}ehSP} zf%z&hZw2PBz&sY1&jRyWV15hCbAkCTFz*HCzrZ{gm=6QmFpmi46T!S9m|q0*j9|VI%sYbl zM=%cw<|DzpB$%HB^ORt|63knI`Aaa53Fb4wye6361oNC=z7x!Qg85G{4+`c(!MrG# z9|iNIV7?U0n}YdMFpmo6Q^C9{m|q3+tYE$s%)5g5S1=C?=3~LUESR4K^R!^T7R=ki zdHkFFEttoJG`z{@f_YtBYyT#{3+8#jd@q>y1@pgP9vI9AgLz>vKMdxH!F(~8HwN>^ zU>+IFCxdxqFux4unZbNBn0E&A&tM)J%twQHX)r$x=BdGaHJG;s^VeV=8_Z{ed2KMi z4d%JQd^ec)2J_!w9vsYvgL!c+UJr-ONQFuxAw*};4}n0E*B z?_eGt%*TUyc`!c@=IOzFJ(#x#^Y>sLAI#^2d3`Xy59ay7d_S1?2lM|R4*=u?fV=>Z z9{}Eh9|7_tK)wXXn*jL}Addp%Q-Hh* zkY54vEI_^m$h!df7a$J<irUjp(>K)wmcI|2D8AP)uP zqky~=ke>qbR6xE8$XfyVDrS1M+M@z75E`0r@u|4+rGqfV>=#p9AuAK)w#h+X4AI zAdd&+^MJe_klzFHd_cYr$om2LKOheX`9u2o@C}a$6fxIS=-vsiUK)w^m zdjk1SAP)-ULxH>~kRJu|q(HtD$eRNBQy`BDW`DY*x4dkPNyfl!X2J+NEz8c6|1Nmzpj}7Fr zfxI@5-v;vBK)xHudjt7zAP)}Y!-2dwkRJ!~59H&4ygZPf2lDhlz8=Wi1NnO(j}PSYfxJGD-v{#iK)xTy`vduZAP*4a z1A@FjkRJ&01VO$a$QuOtgCLI(!f`G+765#%F+yhMD^-D#%*}`Kut0738ymyjGCk3i4b*zAMOk1^KTa4;JLZg1lIe zAB(f=-tc5WzAVU_1^Kfej~3+9g1lOgUkmbVLB1`>y9N2TAP*Ph_kbV0r@ z$lC?^yC9Dj`-hYq(f8I05e+GHbARij!MT7ikkS7iDr9s{_$e#vz)F7W4k2YK`$ zpC07ZgZz4sXRpsK-tg@~-aW{_2YL7)A0Oo9gZzAurw{V=LEgSTPkh7Q2YLJ;pC9D) zgZzGw=MVDzLEb;e{|9{lpdSGA1%Unl&?f-;1wh{b=pO)m1fZV)^c8^q0?=mw`VBze z0q8#feF&f*0rVw+{shpc0Qwa`-va1g0DTOgp8@nWfc^&1=K%U0K;HxCe*k?DpdSMC zMS%VY&?f=p9S=_fc_TH=K}g& zK;H}Ke*t|kpdSYG#en`8&?f`>WkBBy=$`?7G@zdb^wog=8qjA0`fWhp4d}lCeK?>W z2lVBD{v6P!1NwD9-wx>C0ew86p9l2yfc_rP=L7nEK;IAO{{ekKpdSeI1%dt`&?f}? zg+SjB=pO=oM4+Dt^c8{rBG6|9`i(%}5$HbxeMq1m3G^j_{v^<+1p1Xg-xBCw0)0%N zp9%Cef&M1Y=LGtlK;IMSe*%3_pdSkKMS=b(&?g1@r9j^l=$`_8RG^;<^i_fWD$r*I z`mI3U73jYLeORC$3-o1y{w&a^1^Tr>-xe-idgI>$eO#cQ3-ooN!qWNw{av8X3-o(| zzAw=K1^U21KN#o>1N~v3PYlcd=NAKgW1xQw^pSynGSF8B`pZC{8R$0yeP^Km4D_La zel*aR2Kv+R%KeQ`4fLylzBSOl2Kv}QKO5+41O08F&kgjufxb7;{|5TtKtCMliv#^} zpid6;%YnW*&_4(I=s-Um=&J+$b)e4<^xGk3*&E*-=)VJfc%UB-^yPv6JkX~H`t?BH z9_Zf#eSDyw5A^kc{yxy>2m1X$-yi7z1ATy?9}x5fg8o3zCkXllLEj+g9|V1bpq~)* z6@vak&}Rtx4ME=_=s(o=-`@BTK|dnsOT?>YZ~Td%PZ9Jhg1$x2zXjGEa-;?eX*cF7WB!2ep%2r z3;Jh4A1&yo1%0)kzZUe_f__`jcMJM&^>fl2AFe(hedEUkeYv1N7xd|ZeqGSF3;K6K zA1~*sKN|E&gMMkyHx2ryK_4~frv`o1puZaQS%ZFS(08rBuHX2tK_52g z#|C}bpg$Y*X@h=k(6ZIp`+`edVCP9Q2ukesj=w4v+u&&p{tL=tl>A>7YLy^r?e>bRjKU!$T;eX&8m zj;yOETwlFL__cbXSiiP9T2CC%uMalW6V9(+WMA-b>hH! z;*5Un9Z^r*)304T>WMo2TJNoTZ#n7Zp_i{-5qb%|2I`fpSFT{`qfRW) zYlU7LdOR09^g5u|&pm3z?|R+Q>%Sh)M8lrXM5~_viH>^t>lNMeU(r*qAw8dpRK4m_F-NbZJs*p&_4=;oBe6%XV?7^=3wqt?`L}qi*Q=fnMDt$vMLWHGdfgLY zdMUl`ilkn5#2CG@d;KM*_PQ;sdd=*0ODyVjQ>@hM+g>+x=fZVyxYwWJj9yoJT@&|v z{UK_5T@?-74e_ZhLT_i1sW_b=jN@1Mo3-lxQq-X}%9J|~1zpW~u^pJT$e&rc$<&yPa% zIVuMAIUiX;uj(xX_Hhs4Vuf9Ks;J)9B_`X|3-@aSKh`yUeM&C`Mpzk-r*mt9t)^~%L z-*>%O-gm87-*=7J*7s|%zwcM#WZzZdQr|Dd?Y>`#r+rt5`u#o^&iy_U?fWeg-TN&O zk^MduZ}nR&2K8Gc#`Rk$a{Db1rTyj$d%wA2cE69r;(i~BulmgvoBPcYTECg%Xulca zT)*k!TEF+i-~HYdb^YEJjym6_O@Ev4(s^yc{mmj?=Nk6yUnNHLuMipi%S1u{Qeo_0 zET;7@67zKy^78%#VqO1yv8{ie*rzkmPxj9d7yC~TxBF*_C;c--{Q>F1X+Wy*7?2`- z2PBJ#0b_(1FiH#@FhV2`7%p-K3>C!#1`FE&-IFw6fcRuUKk?;&K4Q~=UZQ$HPjPs_ zTjIh!XYU}xFkgh&!h+um=q>rlR`xAq#!XYDL|wp`HB1_Ur~|d zBi>EwB0fs;5=)aj#hRp!;=3ddu}2>`97}Q&=aXE;jilD%QBq6sGRa9a8`w;=9oR&4 z9q1rJ2R0Ik0~?6``fGO7z?W*~K;7p(uvRtc{^RKbpQsB4K2|>;_)y(2@V>fTcW3S& z_?LQW;4Ssi!0YPmf!EZh1Fx#}2mP)(4Z5hdA9P;z9du5O7<5JzgML;A4mzoh9du01 z(Va-egN~@yK?l`YgZ8V7bVtp~LApO?P_?>i&`$Nxpl#~uLEo!a25nLA4%(zX8?;ev zGn0YX?`T4ns;+mmyPC&mo0s;E>5`?2t)n zuOT_=&>>lB+K};T-jFoixiC(Bd&n5|!yzNpB}0a(tA`9$w+u;AwITi0ABXf&&kgCR zUK=9R2SW^M-H>?IacGR{Iy6%4JTy!V92%^~4GmCx5ACiF8|tH`4fR&@hI*JM1r|_pqDFuwj2HX~V86dBc8J%7I1JyaxD4NvR={bC*GGzGY zO3Lu1%B10om9pU)+uE5#!QDAo~um6;=Y zDho#l<%GKJu*L;mDs2bt8`(97i2BxQ;q#=saq#A#jvth#j@l&}-BWhM}Xj z7*a=lW0*8*ouO>hYJ(iL(lC3}a>FO1mKeSqwaD=8sQHFnqvjY6jhbcnWz=-Tcki7&UsVA#?OdL*eM52IJ^~ zhH0bw8s?4eX;?N|HLMw(VEAryjA8faaKlfdgAKoq_BUJ`?PGW_+RN~KbVq~3n05x2 zF|LMAV_F*g$22oUk8v>c7}LNoXw1vRxG1?@;>u)~#Er?$i93>;Chkvelz1}vb;8Bu z=Lt8HpC&v`ewgqw`EEkfaW@m%jJuZLHSYI>pmFCDV#l3M=r!&{!jN%C6H>+-Qk3AIlAjQjl9TXON=CxKlyM1TQ${6BNEw+X`SP5r?rp&C#_BV>on*1X6a4i-O?Mzd!@gO3rznnE++kPT+j4- zaf8!u#wDj;jmu8I7*~{jHqMlOGH!bM(YSf(`{S0SBkt?;9dTRIx5m|^Z;U&f{&n2x z^p$a!)0f5lmA)wMN&4Kl*Xgt3nvH)i&TYIc&TD*CT;TYUxR~(;aXrURj2k>YGcI|2 zN?i8%QE^4%hs2r2_m7)4zGvLr@rJmi<747hj}MF6JU$?j_Pcfac4#xOpAtoYgM~srSC8mGYhM19AU&W+nEsx2|S{zfBH7~}N^+C+c ztoLF*&a%aPo>dvMHfw6kcUk!{$eIvyBr7fEbk^vY%UMHWZfEt6`6sJK%&V+~m?jgV zVq7N#$9PWgjq#h{6%#qZBSx9v64QS|^O%tn8pothcom&D;lJq82@j)f6YfOMobYG# zf(e(Rmrpnwy=KCR=&ciuMAuB%8+~}fuIOJTd>4Ib!p7)Z6IMq*ny@1J#e`3z9kS;~ zx6b|`xgU{vYMyf~ zs%_52D6gC|QGq$fqoQ*TMTwl<<&2EFo--)w@0>nSwK-~3!`zrCr`*se z_gufIF1cP&LAf4LF}W^LJ#w2z4a{vAH9Gf2WJd1O$o$;$BJBkj3YB4_6Q8o40% zRODy5M!+=B|poko#HWpSg=7@8`~me3m;SvcW`qWQ&Pa zk!>eVjr5wB7a1@yGcs!8xJY&4@W}oXlOjh<>=~IhF)?!D#K_2!i9wN;i9V6jCw7XQ zJJBt2$wa5fRTCW|znSi1w4#NBB%y6%jINSw!5Vk0W|cnjJA{(zJ*%ldKV$lgc9|Pnr@@J}EcC zJ}Et7=A_XP^Cu07ST?C|#A;nzuxV0E#Lh_}5&I`~k2pT5bHuqx?INyDY8i27l4Hb^ zNw33SO?npIB=2E(>%80H9rCV*cgs5;9-4P5JTC7@c+b2&;e+yahL6eH5}uj2E<8VP zWq4WMl5ktz{O}ohv%=@)y%WAP&lLVuUP<^jdHLbn^RmMC=8X&gF>iSInY;nvm-Bjr z-^z;*f0P#SeC!-nTy4NJ{G zAC{YcDy%5~NSHByPuM&8JHlq?ZwgzOzb5SS{1stq@)w6~$)6imo&SE=fqZ+|iTuj2 zU-OH?{>Yygb|*hQ>`DIUu$TFR!yG5~32Qak5Y~QjR9M%^L196YeZpcUcL)=cUBd=U zZXPyba)Yq6$p-u&c5oh4v}%3msD66`EYoE;OsaIdpP?LugsS%Me?^(~ubj_d@0tTo3uQ;9|(i zg3}=z3VsavzF=R7RY{<~U(2(Rp-;k`rP9c*E-9pL=TZC8(8-`3T zd>;H!;p5=Ng?|NqQFt|YUE#06TMJJHR~H@%K2WFyA20kq_*~(J;46izf^Qct4SrNO zKlpj!%;1JoWN?cqmBDUPih@0-^EI%QqZ)hS;D{WWEA(Bml|1wEfKJ*Z)kHK;{VS&&=NQ~LylO*I6@PmK)hG1WgXX{uM?h^g%YQ>QuwW>0MtSU9yVpnU4% z0Nd2t0n?{m379kWT)-z&j|F@_b$`H`sXGHUP2C)@ed?NkJyVwl9GSW>;MCOF0T-se z6Y$4WW5AuMMFEee<_0{UnikNYctk++;sF7!#Uh|XaZG?uaZo@|ao2#T;`RZC;#L8D ziX8(67r*o$UHrs9z4(s*#Nt2vi;92suPi>{Z!bRJ|9)|`|J>p&{)>y(_^&Ab+<#5+ zLjO(0v;B7zzvI8B*yw+xxXAxhajyUQ;#B{u#l!t?7x(vnSgiWj7DxNnFA4N-TH@{B zy2Rbzqr}x<5yDh zm7l3(soy&#^ZaI&%CWyk zrJK5|rK`L5EnU`qNa_6Uqf2LYPcOB1&n+$QKBaVW_wv%r?$**V-KUif>OQ-)XZMdw z^4e7qB)TjIU()QiAmbUJ`tJJak-qM%8M@#?lJyrUb@A=XzzE?}n`ra!2$@lNl zy}tjIZufmv`i-wc*(zVBvL(K5WpjNyl}-2cDYN(nm6iBLmQD0cEKBq4SvJBqsjR>6 z@G{kRTv?QFW?6u5UYVEg)Uvj|Rb?%F?PU#oXOunbHmB@c|zuVKYjBYQ=Mt5si zKCoN!@*dq>%452Dlm~V5D(}+GuiU*`Xt`6jnDU0*)bd)NKIMP=3@X3wGqU_QpVabG zJ`>6h`s9~a`xKXN@u@0b<0H#I^O;e;z-LbROrM42HlJnXWjz8Rt_~Hyc6F*a z-nC7|{;nM=c69Ah@oiWCid9|1DwcGOt@x;`S~0C_p9*u=K^0TGj;zS-no^O{HLGG+ z*GUz9x)xO=cCDxg>uRm=?fPCthprz~wC*~;!lCP@6)(E1sCd+6b;YeN8!Ik#`L5!Z zF1soYciCG})8$CT)-ES1)^s^rvAoNriUnQ%teDy5PKB+@!-~=_|5fC5c~z0#rE%rR zF3l_ZcX6pyx_DGZcJZq8>*8DK*(JErwM$fGlP(FBue^Iy{^Q-h^0xPo%FEuPD^Gi; zRUYx4Pzmq+%J00VR<8A~to+>DR{62_dzCZ2Kd7{M&#Nr+UR;^yy}UBr`>V>4-Ww|W zdvB>!ymwSac%#zK`(R}!@1H7Nynm^5^gdtt((6j)W3L;Px4iCFUh;Ze`Loxv%EMl- zD{H(OS8efXQT4T#OVu(j_p13`ovUVeb*r*?1yvP$MO5W_#Z{$xiK<~FU9%sLr>l z{5#*T^6dOim22nPswSOZSH1LXY<%q5+<42=#dyin-T1Sor}2=dkFnY_z_{5n%(&V! z#<TquztQA5#8~7x%9!n$VodhTG!FKhXzb}(V2trBF$Q{88NEDhMmNv* zjLke}8DDprYkbmak@2ri%Z!&htu&tQ^tJJDr;Wy%PFsyzI_)ri-3i8Jo%S2&bvkOC z-sz;#)ak6TsMAGbcBiYxJ3Mz2l{O>UiDbToQO7~1_d1R+89OGM z3OlBovN~p)#&pax4eVHC5*^D-Q5{Vt|BiN(XUAzKmyWYcjveQkUUXP!de~v9=|+bY zrr$cOHl66O-n75NX48%iKbSUls5Y(au*dXChl8dMI{ajk9Zs3bJDfA+b+~9s?{L*L zqQgy7-wt<8i5(uA!aDqG^65}#^5{^{?9{=*+@M2q^MCDIneVo5YrfjPgZWH*FZ0p% z-OOkoXx`dB%)F+3w0T+k1oOQ1!aS{gAG4`_lDVk;Q1gWLqs(L5k24Q!pJ9HheU3S* zeZJYheUZ6S`!cgjd!yN*z0F+b@vixAkD2D{9&^m+JrF7eoH&h_njgDAHQ#i9ZocUL+I-Tzk!8PoQ_Bu_XUj%+7t2cbc9uo%9WArmy)AZk zUrVWbfMt?M+by#U zZMVYGtKCYmc@L*66m) ztp06VT06CMwYs!zXLV@X(fZuY%lg30$9m1p-}^3W{vdwC1S(|m% zNo~HdrncE)9opsxYp*stt+8!1Yhatb*3NAXT3y>5wK}#rZmo0u+4|7+to6F<1?zd& z->t`7uUhxGUblYldfU3z^`7-J*N4`5u1~DfT%TEuu65Qz*Vooe*M_!Hu8y|;uFY)* zS7%$8tBcLYwXMzFwY{x{YbRShS8v-Bmu|M(E`GL4EX4}F0rmp(wJx#UZC!4=(%NV{-P&S1+*;bITfb}D)Ov<(RqI){#jWSqX1AValdV6tm9<`M zo78%#Ev5D6wjr%o+IqJB$`;dltu3JS2AgN=O*WU-TWt=lf3Q7owbORLRgLYBR=aIy zTkW$QZFR_|wK{6s((0IPb*odhC9O`|K5TW)_I9faw(?fL+wxjnwWYQC(>AQtOK~hHtAA~dt!iy`EnnCkw0v#5*0Q1fTuTT0k1d~SrF?SU=B?44Ui+Fe`5 z*d1HO+v}VS_6N?we$Bb3{hV_j`;X53?V59veT(y8`)cQ5_9f0E?H@XivA^v+&R*`E zX3ujTZ%=d1vJZ96vG;PGWRG>8Y!7rUw0k;FwYxZ%+8vxL?6po+_WMp|`yWm=`&p;A z?MIy6wbwXJw{LcuY5&UU1N&m9IriC3^X$@TfxXmek$s}mr}h-5rS>6C%k4d!R@kGR zzO?&0t+sb`T4QhJwBFvxX`}sFi%s^sEwp@_aKld8}DG zxu=^ zW>M0mS&VdO7AI?)Cdm6u4f1MJRi0`3mOR|Fr>t(;OKxh~M}FC~pZuih06DAaKxu0_ zSQa-ODs!3+m&r{>$bn5qNzrtSjA)uHeVe98kEW^8scE{b-!wx$X_6&xH<=(WHp!7E zn@p7Zn&ioCP4eZsCIxbNlPPk3lOj2-NwG9GDU}6H%49~93OS-lmF(NZDC3)$WpERV z^lD<0ZJJ2w*yL?l=lHJt+wnbl&2hRs=Qu+ib(|?R$60c-<81krszZB00!$v3$$%QyJ;FM0R&vCfhrHCY>EWm-QW2$fpip$lDHI%1aKb z*ka=pV^x!hsBobRwfPIK5OjSk<)0*6g9!(p==;jl&ab=WH79ln>r z4nIgQhi$Tr!*=QDutU~0-YFk6u9nvt*T}PtHF>l#WKHAUa&zN7a#iEKa&hDR@`J_) zq`mP$S2*KQuZk*Xi|HqjPdzqhIBFjn2!eMi=DdM!(7NjV{XJjV{UFdc`&R zT?RI~EIT*4B3&9?l@5BPSsNTXnzp|%Z(GC8S{(5!Pt5t(%vY}r8)vuLz z^!i<|pX)!D2lU#Z*M|Caa)n+C^qNusg*53^s8^<5BkRAE{q#!ED?~5v`mbagy_)D% zSMQblTd!;NUdwZO9o4Hwug!X`(rd9^ALwP*t3GhjlC-mB@*AIHF)oYnvbM<;xuS&i0^-9-km|ng0iq$LN^(*PAS8Kf*>-Fr_ zD|zqLOL;}FU-UYp*Uncjy$r8vWvE_V^=kX- znQW@p%a{Mjhk9Mt>(`h6%AfSY%cpXyUaMa|k)P`I;md!d)T`{}V>wZ;l$Vd>V7=aY z`A|mb)&1q)vV&gEFCWMTFYn8zFYe2~Ufh$H^g8w8uH66Pj@+i#`WJu6`}+WxTi{N4&T$`@Hy5#_JXI;+ph&@rQJMaaB6%^}Ozid{B2;{!#b4JX?23 z9?`3&?xNgO_nZ8(?t=WJ?!25;_p7wkos-3NXJw9FW9!byfpw>)TK9{LsQX!Vt2-q< z>Q2fQb^7b2?zsHt`7wF(`A_n<=ReBh&yUKz&yUFOpC6WMpC6LTo*$HRpC6F#KHo1Z zpYN6V&-cjm=ey;w=a9XhYclqEjSPHVEj^#_lrGPA$i~mN%i7v)@?Px^@@nn(@^tN1 zdAN3q+*P|-ep|aquB`n=E~?!qXVz|z*4p)QYVBH?UAsn(sr_0e)qW+F+Ep^V_Dktg z`-OC`T_Ky-elA}>`%FH5woKl9wnScd_NhGnY_Z()Y?1u_*+RMI*#f!j*?jrYv$^u! zXCKLm|6}N^eNjO9eL>*=J4N8~J6T})`>X)*`;0*C_i4eQ z-=_rIexDGm|1A(KE%F3oi;04+#RNg^Vw|9GF;?(xFqN| zO~6=;6c83E0`J9efx}{$0JBIG=q`o|jxUA?_ACYoWETSjs|$F+?1GUQg8F$aLGiqX;QPFqAbVa#@N`~DaBKdU;KKZW z0{*@_VKu`1R9de(^Ms|6@9Y zpEDiEe>&~Yzdh~Czc>weYTBJ2HSNMDPdoGR(++&xv>o4a+L~`PZNXQYhWLl3QGA7I z6aM;XBmUBqK7V{lhu=M=$*-SM;}=aS^S@6W<7ZDD;Xj=^#J@eYpMPO$4_`2~lh2t_ z;FG7e^6^u$eC*UlzQvR@-)KsTuQs*HJ2dr|r!cj|TR*kHTbi8ZjZaSTx+lkZ^^?QA z;>iKt_sL#f_GB0D>0~?a_GB~f;w0eH$y#32WEGD*S;oUp7V~hE1w6}15f3r>i>E&M zop*ThD{uScC!X}=d*1Ry7H?wW4Xh#XB;=;_aNE@itCG@cxd6@utQJ zyuR@uUeh?9S2pg$gU3C1AIDvJFUOsE_r~pcspB@hq;U&g+&ILej+^p=#}Pb_aRZ*+ zxDF3BuEEn8SK%ESKhE1TeuO7G4%QLl`*?F>yLdxm3cR*4IbPM+W}akBhL<}g#mgL9 zonHIH5+T^8jLk_RmSSM2ga(o@?+)P z^<%}{rO|xu_^6QEJ^F)NKl+thJo<_IV>E}GGy0bMZ1ffP&ge7lrP0USlcV>!(W7^` z5u-P`fumQsZljmDHlrzAIjoNJ3{3Sj)ZetM~K|Y zkzlTP1ke34;?2z*apyi7!EtYlIC7ImY`EMJ3odg6!zGP?H>^jDxXvTGT=Nl4uHlF( zS9RnV_t1zUS7GD;S9)YOcX@a_cVc)ew|96Gw{cjSTROa!`)hb5@#FAP;>+Rr#CyY2 ziK)Y5iAlqQiSfg|iL~L4#E{{ZM9<-dM2F$(M9gq`qTX;(qSCM=asTkI#I3`5iBiL# z6BmcxCyouhP3#(al~_0QG_iQ-Vd9UW^u(N@w8Upa*AnjzT}r$>l$>~KC@C>^NRSvg zl$aPa6qD#N#7eXqq9vk+!V`6e2#Lpsf)e)*`6bE?c_ywMa!FhmbV?i@v`y?Bv`DNS z#3U9Cnk0T7G)T-D)J}XhsFrwVP$}{9;E}{rg9j302X`k%4k{!D4ay~Y3~o%c8(f!& z9$Zb(9b8U0J~*GSZ*VF>Zg4a~YH%Q7aiAw*Y@j`%YoIBiZlE@yc%UNT$3Sty`vFP9 z^MPLp=>y*qt_*xiNE*mah#Pp5KpS|T5Hj#M!E4}Ng2TYA1Zdz|g8smz1eJm0gaZSo z61ENS64npIB`o)I5+?fT3BCQ4gvNeiLRo)M0^IML@TuP;;Z;8_;X%Jc!nJRs6-i()g2o`SCG*aC}5xUVKpB zr+AOP?0CDr*YW7SXYqP{595{k?#A!$yAdzncO`yZUrPK^Z&Lh3FF(GgH$J|xmlI#s zOOF@!hR1*ECB(n(4Tyi(>l1&Y*DXG|*D0RYYa7q*HIFCvn#SXMjpAK;b>gji)#H)9 z$K$nn562(v-50;7cSrn|Ub*-+y&K~fdZgk*=;?}k z+0z<#zo$O#T2E!%xt`*<#2#@Rv*%|VsV6tiujhRnt|v3js^@u}Nzdar&7SnQ|9Wo5 z?e4h}C)<+}x2ETG+(I`mZnQf#uB)3BSKl2OSJE98_p>`V?nAd<+{?A@na8m#l|Xhv0`PqB4ht{l47Sj17im} zePY`>-D0ad9b*eRtz+{#q1fzB!98nLOJ$79cQ9*#}u+!M>_REQ;Y%EtP2 zu8+lauEtn({*E!}oQcuy9E~~F*&nmFvol7nvnfWZvnFP#qcmosBR{6M<7Z4$M{Z0- zM^22m<4sI%$J3a%9rt50I&Q_>?nsTf)NwxMbjRtKxDH+nts^ETw1W}j(?N-G?g)*s z=|Y@ph${o_58UruMxt!P|^%cJUB3!+L}e?K>)k>J)XL z)jDchD<(>&)hKGEMLTM?MI~yeMKP+QWp7kni$YXM%jT$GEmBdRTK;n0w9IoJw~TXc zwG41Bwsdk%wKQ_#TBs_?s1e`ZgLK`T;gnR zIm_A5!sq;Jj^)fXGdLs7;he7KU`|7`FQ=^8l_P3);N&)2aNaeWa-KHpbM7{4aIQ2T zm zmTLaSUTS*Jo@{!}9%#y7w>71+YnraJi<&O5e>NqtKQ?jMubZOSkD6%gv?db!Vp9P7 zRFfw=t_jO#G}*98O&B)5$%yURq{X&vQf8x@4zu-}cC*!*wz3tQWZ1i!R#~!5zgcUW zrdYolhgg%1U9A4bCRS@>6|1_jh*i`Gvwk*yWqoYSVZCmA#d_5En02f14(n3mRo3ao z6jnmxNfxs)o)y-}V)-{xSniD>Ec-@Z7S!m+p=(Iyc5}odct*&YaO$XTm72(_u*JR2X@6ij4PlyBRO*-EA&fs z^YqhoWAuc&K02$el^$MKOAo3mp?lVe=uUNC>6UfbbY$I2x^CS=x=P(G`k}hZ^qqBQ z=(2S@x>Q{heYrN0K3z+o57qk7J8NC(^|ki&vRX5`xE4YGR;x|Vsa2xCtUXA7Si6&+ zRx3-tR4YYKs$Hff*3Qt_wZk+@Z5J)LwvpytTS>##7SOC~f6!31A8GovZ)j?@8MGs{ zcWHZSuhO>GCex&A1+eQ_2Bh=^Bd#LxTw^DCbOH(gauSA}%o{LPZ9*tyI_e4^vn<7K1Dr ze?;0=e~iRbzlk)eejKS;eLM1a^_9p2)n_AjRP!P?S92nzsv{zot3o1Ys(d1ctFVz> zRo0PBRjA0SD*ed9D%HqeRf>_Ht9D1etJ)IztZH54{i;6^H>zeLE>;aioUZDONUUmz z;8c}GL{y0*LaV+;_*P{{xK_Q0u&=rwVODh`!no=}gih7T2<57{h{IL%h+S2r2)Qc% z2?-3ZW|ee`aV3eO zQ;DajRJu|WEA1$IDlruKN<)fFr8;G`;s|B2Vh?4qLXI+6v5wMN@h7~oVmiFCVlce0 zq9goQMP2xpijwfG3Ssz*iZ9_0E8d3Rs(2cHrQ&Y*xr)?qLB-kd*a}`aqk4x4?nLI6Tacs6jmflfEi$S67&)MPAK9yX8yQ8thm@rn7 zOXx3oN9ZWYAT*ZTAyk!ICKQ(>5kw^kguD_4;bRGj@V3N{@Vvx@@UX<1aHqtSaIHj# zaG^wrkW{jtz$@8Ch$)dKFiQT0hL=o-hLjA3;!D~>JxXdqol6QsZA!j}LM87*jZ0pH z>XqCNRWG>~daNWl^k4}ubXN&GRK6rUbYn?C=-LwZ&_Bg?q4UM)(1~LG(7|Gr(5~V` zp)JMRLu-pSgq9Wm3n?g`4f$0(6p~xq5%RvcHsnolQOMKcpCJ#5KZM*Wei?GL_(90| z;_D%&i<3im#k`Q1VonINI6Q<>91ub%b`S9{whQqrMu*^v^+N25RYEL^4~Cc)D})#p z%YVv0mT%%U$rl%mWaLeZ0;fTCML-bELKT#8NxITXbNSrtVF zVTyu-jEg*j^oksU)Qg~?<3$ERhl^B$_7)uq+FrChXiL$CAeo|-z%@lPfqx1I1Lq6d z0w)Tq1BVI=0(%Pc0^16+0~-pT1y&W_4J;|V5-2H53jA3ZADCN64}4!p2+S<>34C7Y z9QdfvBJggZQQ*x&^}s8Iih(JGI|EM_ZVKcTt_H*w&IPavhXW!DI|4|BwE;neg#mtr z-vc}fa{{o1&jaiV(*rCDQv=Y2X95s~@d3Jp^Z@ljLcsAtp8&-|=YV~M76Cg7jRNEf z)dMybDh5au?hIHd*c7l>u#wV)p#R?vbEDX75X3&eP@f?T{yK_=d@;4$91APsL;a2{`3Aix_I zMB#M`!trVa0r=wuZg|B48~nZkQ~b^X9lU(OG5n^2z4-M7;B(^zYw^qZi+=O@qkdEQ zU4A3^b$Qf^Z)ps&Y$$<=lA)>ec`9fbx z{%2oe{%hZ${D;1N`PY3t^OJpD^0~f_`7B?Xe3GwuzMn5DAM11sI>V02Q>3v%w@xCs}^}Zs>^gb_n?0rUZ)BB_(#hWYPd&f!G-W*AoH(i4F zj*#HINfJx%5DCKDU!vjdEm8D#m+bJyN;Y~sNLIY8CDUH!l726gq{YivQsJd95qW7# zK6|N2-gqfV9(w&Jx$bpPa?We7gzL3K!t|1t5WO}_e7s~NPF_+HbFY75L$77As@H<} zpx3lm!E0PB?KLc3_Usc+cy@_&r0zJ&l2$q&jN9}r%0UY`BR+a z`Ar<>`AJOm%n=8Bz7>0Tz7pGeJ`V#VJ)IO2C64Dl0>NO776S$x5RAQpH8i8&s4G1;Z|ldzgx4JP_hP?)u^>cWrT>ySli^U0Gb_epC#*D~dn59}vHE z-y^=~zC)bqE-y}UmlemkZxB=6*NcPQ*N8pbS44L1OCpr}yhz7=Ms&=5LbS(yL?r7z zAo`zsuV~J#Q#9n(Dr$3U5>>g?i6m}SqFlE!QKnn5=#g8#=!Tn6l)g^ri>}v2qpnv(ovs%}wXVsc zLf12*JlB(=ELXlL!!<#4%QaSX0W78ju1pcfl_ny)Qbc~PVIr(+sK~-KNMz*dFH&>$ z5gl^%6e+m6ilkk!qGcCH(YTAPsN2O#RPSOgDt5t$ez+h-IW7p%GZzEV9Ty$ZMHfxc z2^Td{l#8+`+~ugq-$ha6;&M=A<+4wNaM>+VciApF>>@AP?y^NBKM3z& zvxOJ2Z-pnYuZ2~=mYtam;w1pDNK-<|owZ0AJbQ|CD0E$0~F1!s;>;LH@Vo$10b=SZQSbGQ)e z940h(CI}6kLxif%fx-jMc%i(ruW+5Sm+-ffhj7%%RoLl-6V^I82@9MYgx{QOh3}lK zg^!&qgg2ecgegvFA=k-N$aFFm5}k~M-cANWM<-n&`X5ndvX}I5E5^i!BhszvBVc209 z{@^eOzi{Y-?>h9rmmRv`Qw|+)v_l(AacF`49hzVlhX&Znp$5%ftT!y;Bor`xXWGw*V&8ULVFm_v;PTa+5do_*yq7%_Fv%?`!6uh{u9i!{{R#1 zb6_9)EZEWh9SqrL!g}_vVI}*Q@Lv1p@D}@L@EZFJc+T!IJY@F}Znb*=SK8f!MRs@L z&vv)rS9Z7H`*t_st9IAnB)e;HoLwp$X?Gb8vbzMk*{4J8yJT3??kucmcLv^J zcN&(lI|+k*uJEKSAMUZ`!40;FaItLy{KGa5&bEz(pV~&lw``-}3$|>SZ_9$&whWkL zONV`Jsj!o6By46&f%R>}VP#t~yw8>d%h?j)HMXJfyiEu^WD^Xx*#yFsHUY5M#vlG{ z;|IUC@rCc(_`p|fyx=4oPdLuT1CF$Dhl6ZfVK*BW*v1A2o7iAsO&cdz(Z&(pVdDVH z*x18=tnJ_lYg@R-+8VC6wt|bTE#dFh7I3z;IhL`5J>OWY)>If`tr3f!s zD#GKIhv6>ELvWqtLAVeo&+-8L&T>Ee*m56y6DZkoFU+;v12cdKmb+mu%U!So5ZZDl ztYf(YJ_fYgayz^k=%0lGJY%s9?gwhNkcZ2FV2iEr2cYK`a`0WCOBP$;lR!}xvT!&M z-eNP11+uW%1RDaWT5N<50LcSMS!{q8%{Ra!<}z?QP&JUmTpG>=dIR*(d_8;(=qymY z`8t>i6b$4JWNR)3BZ0JljsWd2Ukh&l`eU{ho&@RvYA{;^7Xy6<$_B~+x&?F|2<+E~ z!M=SM?B9pMK7JVN=ZC?*ei-cUhrvF780`0l!M=a^fByp~008|@@@D z5kQOYkDCq5twPh5dS;emtI$Xt#!RJq73wBAnx)mQLUjw?W*5b)kmMZEY;z7c4`2_= zOyS-tbo&+0>~Yd6l!!cU_BCP^@+nO-^Tn=0I{q1Er?gk0wc}Z4dUC5!8SlFpb>ttE zDpzc#DftIEJ*+p2P5%e2YWJ8qF#kcX;R&;+7XKhe*FR>-3jd(qZW;60&J~Eo-eErY zdIg$Wd&Hc`S%Ik6HO(m|D^Sx>r1`?%zmV}q8*|y8f1!(3?&hz#f1#SXAoFVDztCn9 z)%?WFAINAv&OG!;FN@E;Q_yy~G7BG{DQGIa$s(y_63SNXw=h9YLY`lyEn;3wKy6n4EYJ!Qkaf)_ z%Zmx)(AA*bmZYvR=;zo`%R+GeL0P6$Ps-H1a_Vt%4!)aOCyiEFauVd+8WMf(j)5BC8mney0D;XyxSGym4o zcc2gIJn_v^O`{L;kS(-KV)Q~8w`wiP**#F%e_fXK6Wvhd+cC>hwQeZWc*)X{*ad}% z*IRj}cR~}+3RXjv9gs)UA*=OkJD}81b*oI>cIfFC!m2H>4Z0L#WtEoF3OWDJ)v7tC z1?ou&uzJzh3^{F&u==;$1YNiX{-b|?6LkOhX)6b0BXs)R6)VWA0YV|}S^Z?xLxsOy zS{0tHgO1yMvhqu>g*>W+RXa%r!C zqGJAMt=L-*om!E#P8cYI0+aSy2M(4(8#XIhm-m-If~$Jg1>MDvcsFG2&{_o5-gmV2 zsVRis9rdxEDky+FUlFahf6a#qwOH1|ml8(7`9<;xq+uH2KHz>e&!rG7j z6$)!xwqAA1h4h1DY_yMmf%3bz+l&sHIZtgcHtGI zOuui_3%!Jj$6wi~%shuwX`gMD9zTQZ#zZ!rxTnz3$VwaZ@)Ia;xYg$UlgHqCLpJa2 z9zlu&b2gZ<2hb>Cjjh+E`w+W(i|rrvd(el#eYP4!ccFK!O148Gcc4%oeOtYyTTo>k zWGizy4VrUtvZW~AglfusY<;q?Lu5OWZ4LSw^g+zBZ7E8HK4JK_bk{2o{p)$#D~*?+ zHvL<+X#7QJ^=*c2Y}?^j7ay<*BU9Y$8DN2G&WqWMf z(Wjy7NfWlD?32*Fzst6XiYFlNC>gs$m-&!rbh{mPi3@dvD%#10CPJ^8HSD~L;-OKmyIvd} zI-Qhickc-mBLBW;*EF|7CoUI-!b<4R6HPMbw_&*FE^29w$N#{C-z<**3j#;clNz>ONg~L&wll+In+cew10CCf;yXO z?FX~a&>71vKvkwt@!K(bxk?i#bN7<{ati{|IJw>-rq2+vAKB(`a#SCZazEs7a7q{Q z%~Nx5n9+tDjv^eSXEdS4^Og?olj_jFX`F-Zh$;m8_&Yr8QHJ*a3U_$WbR3dD9_^r2 zb`-jQ{-gu;#}P<8dC6h*&0*+-$6W`D+Xtcg+~*EEPwj_<2R=9?Q1(KWCw@6FvAZFB zZ>htg&Q55fO_RgcZQCKomwgUjC*-03HcdOs7t2AHB3B$lPh_EsWg8uj#BYKQYVLAW zaNYn}T>8)P<{@e5_n4OBt8ppF%*oWz<=Yx)?;Bgkl%!S6sf`|v9!@J5E;-mSXWJi) zbUxMbaoums;s4?tkKSCs6!OnF8oSS7{g86)7V|z#hx?G@xv_3cbmp96;f+pA+PXDPcaiNF zbN?+)YdTsmQ6Kg?{pB}dbT=tEoj=%si4N9tdi%8&WBwWAL~yUh+}P~s^me2ILl5?L zx*#aSRD2{j{o7W8`LKcMwEjsU=8!+v>5+CmMlLJasp^{ub85{^ryG_qCc*u&(|GX@ z%>2{0POZ*)nA!QSP63s<7>-SWQ#AH7CMK=M=}74Z%u;`c6TvzM^Uq+^3Hjq4=Je@B zr{{W^n3QTM=aeUld~}pIKqHO$!xOI+(QWlZo|7hJ%xW0(v>e_Z^LBN%LWI8NsP_*S&LQMgk( z_G8*gPv97v_F#Vgy@*>}*@2PPyo1|6xefEt{~4~iT@F)pAqQtrvKeFc?FUZn;|9#3 zp<-NK`g%;z&Ia7@iM5#Z7CpH4gjMtw`UGx|)n9b{on_p<|CZ1;5^0y*m3ef`go4X# z!wgzx&taF6x0C4KX6i1OQ)6gH3c>~FF^pbGwRBlII)IkT#ktr`_n-wGco&`TooMX3 zaFZRkYRD3>OOX0$Z+gv%Yd2J{5$qRV1s4O;K!ZI{{0mFU_pPhBoKmZ7Vfvt9Dn z7o%1Fe0NFzk&kZKU+l7#BSH_F*1P+xS$?iF$h+vElrUFbbsD}8={ox97rrZd@d{c}e%`g?>_s%9H_dfqdkXsR z;uF`j2WQaRWwTuSlun_!hx1%(GWlpjy+YRzokTQbRqJ{!Cl-Cjv(uHR6NR=68+C2W zWTH_qi>_lzG<4D#DYuLV6!g9uTiyO_4@0j!-tV?>HWaOurR;WnF%X@Zr|(un!lPpf zA-50J-sp=pj&2B35A=AOw_D&77xbM0f}4trGdgvW;dX;!kFH)!bbDHCjmEE@bMscV zKx<3iaC>(OgLagC1M5mK;w7ix}7_#kH+njxKW$5(J2S3+!mBI&>I!o z+>S=8pev6Ixh?!UhHm|D&W*a^2wLOl|J;+Y2hqa+WZmtq?M2@`vd8^x?N0RP!^hme zC@7$J9n^6r3>DF%UgQ9Mt(y5{e$&b2j!sL2mCx_ z%-^EAE5kfKn7u+h%Vm3P#5_Yi0$)_M!Q?Tj`rLVsY~A}PBYK*Ll*%1cwfhr~)%`b7 zkBr}WJlk>=m2u#k$HL!>sOHstkLlrLltoXqM_OGHszcoFG5GxiD)Z^EN6!;3Dl=)` zBl&C`s*SM5vzZ))LR)O{Y_MUXDi81V-cz71lhy03FnR4ZWipBe8?R&yqoITKY~S#O~iUmesnx|(H})!`WagJVca`i%tq9k9S;y^0?Yq3q>)5gFr~u!CUhm80Q29qy zy{4izq1?v}yxR6kqohBZdBuHSgKFnFc}e_NOq;BHyx`^Eri+`1UevTXQHQmtUiAf|rbm6wd0od3nwIXn?zLv3$MihbjO5YpP_Dt z5P3aStTz4AQtp-VqRfioMv>`=N52>Oo!In>{Ipl7)-O}n(!XAEncqxx&us9f zD}OfC#O&}s@hHdCX5p~6)$X^Z32)WCzh8K1T1-HA53XdG>hHDm&Zj*z%`L}zd$-;- z^*-t6ecvX{bgMy__pPj}rd|CkZ>wFGOiR*u-p><~P0MUjyuY`dHXWG1;e8GzFx~z1 zk+;m<1k)hbOmEbDwCRtPFW$$oEK}WAVsFV)s%f5krT5+?vZ?P%i}z7Sf~oBD0q?%M zfu^<2;6$GxU(>{6W-?$Qrqul8&kHJ2K9dNd7rhx)G9&jv!hPR z)Ih${M`z(5Qu|qp&-z`W_`Bsb*?B!uCc)SG8&7Jer3MCP90)o zt|!U2zvm}%e+SbS+5Z)pMB@57^?yW8jh^$}-r^()4=cG2Lkd#Ddbmm zF%YR@?&xPh^hMtJG)9*?0PNciVsNYL7c_iuOf*)&P6Oy`REq>+IdSnD^3*H%=bL3yQ2OqrYkBOzx zF+AeSyvdx9V%Vd*$0Dfq`#Uvv#9Pf9t z-bAy2gTJa*W%BB<0Dq~x#AIjOc|0yG--K0p6W{pvm&uRgkMYN^eluB0$i$l*{bX{q z@(X_Zhb$A+e`5Scv)3jTQ5EAh@X^H18phLB>?WUt^q)P35-{D>4a+gHr9u8XBs7!A z4-Wo25#c6rzdilCUWA&^P$B-&y8=uc1XTapQ{EO=Waq9Sf7LsCO|l$k{pCito2Z}o=MN+0Oj15<41kh1m=yQ#2)IzY)?|2> zV!+b_E5;)>>H!xBi^iqVMge9or;RUWmN5afxRS_aX!l^&@C>~ zSmlg);EiOGaqumtz*lKO#;|2UX)OTk--AW*#;6P$&rW zdUDV>a#wX=SlVu5_q}a_&dJ-1H|-w`+!VLjICcL_-~-Znfg4>{5i)x>1UVv? z5Q{sv2a%4KXx^6-9BQ&2 z(KMJBELZ-|=;nul;JbmpjkfTsgEvl08(G-41^Xn98tH8v3_dU2Z`4sg9sJ-*hmlqK z-{70Onv6(6G9mQzY9q7%6hhPvl^WIe9tbIZATc`nR5`@y;7=n}f?mjnJ70{36wx6o z+jES9+HFHLF1|LpblWWiTKm+9;}#Hth`DdHb#r*gj-fQ8P!T(%!8_F`B90fr%TF;< z(M%56tb5uhz3W;C|1Q@^bnSjfoYX^&$k?I~ z^YeJ4t;;nb2M0ZjBA&K~^q6CfVw{IUF5k5^GMJwUIXZ1-l##v?^2i!#Br@9&Dt%ku z=vtpbsOOM|(YA93LoXRA89^#4p;@O68yzUp3;kBM$LM7kIy8HSf>Do@U1+M`W}}ja zZlU-G>x=@C0ioNvRtz82l0$P2FB)EsWQU>yrVLfq@WrPeEwozpsYB&sK+iQvG0f zaa&vHDYs0+qPqj3sQ71wZ~mJO?Z5xP(CF2lP#%2CkgO$5Sl69uhoIu(>&9;H@dvBNpuS-zam2sXU>!n{C~H$^P;pa@ zsH9nLpf_tkG*T!q(8EDQ^!!hQvRC#*RKpj8)wLc({ZH8jWqyIgBiCLT=;eeHH_)CK z=t^^lgVyN=MZP@ZuLCy>7T=sBrcPfp`1$uL5idDou;1w(@$gN)!PdLaiS2|~gF6G+ z#G5)ygKxTdMB6{%28_gf;=DM-;G4LTc>lbg!QD+QM01?Gft*Vpv1^-?!Oj~K#Kama zgY1UiM1`wpgU;Pjr032?29LbAkc>8H8_eF^O%lV(22C|bNY1f}1~@qlQoZ_K18+Mc z624=b!Q=@uQs?DO277WHNFit`gX(b)QqS-o{k{JMkwS0G=}&u5NZqJ$eebgzQgCm- zzSCzOspDLSer4Y|Qh-{ce&@Dpq_&bueJ=VQ2~R1~e?fjuYF#hX4@k`>1w8ty|LDs% zQkU_2eR{iuM5=tPU$mx@G)BnK&pg&lie5<9-*3}PT66A({*JJ5QtHl2`nQr6N&h`L zqyOabny@b#e0{`^&0(&eV)Q*4cZN-vGW3@x4~M0~WPN2BwJ;;gVExtu24Ov7AN}3B zn6PUWuKLZEc42nE?Dda$x`nMnTIf#_{lg00BlRsfVPRKP_4W6iV1@-gP}h&WkPv3D z?U=sL&7`nxrw-`jNH62o z->_}^LcKkgrOD*;U-e{9%ae;cbM*Kz`^ZN6ul4BR$H>`9PxRV+w8(~aclC;Fjmd>a zuIuR-T9CtN7xZ=>aUv^xIjtA7*^6BEFHz5JE{J^HDoXElD}@}MOx5EFIb^32qF(7U z9vQPKK<|3;IkK6Zr(QkfD%mB;SufQ-oy`1cttU}_Mt-z_)?=^BB6n#R>D}tgCF_J} z=^1<#k*{7?(zCx>MwXHs(yJ#okk8HR(rZF>kq;c+s^=y@LKfT0=$ZG-lDX_v-52jy z$aZ%Ybx)p@30M9(sau5wpRDX2)V;B9fB2!bUAkp`$HEaunsnpdYK0RqRl2vMjKiP# z7U`-XEyDk>VO{Nij^SbFb9JA?p5cQJvvpHX28DA!ywn{rqlByEKhpjDj~zZzcUyP% z8#i3sldAhD`fT|7iDca$TB+f=zfb5o4BQEC_+PxP&Ap6pSs9jYj?3F{-^~==3sPUg ze{BiTt@#LtW8{2wlZhqa^|G$IZxrgn&u+BWHT~5d?y}BY7ZEWSZn$Es`)K=gxc;1u zZgk#qxYMwT?x&D-loM@=x*^hXl*;lwy0NczQ%ruy>;85)LizQ2gKqDL8YLv{f4Ybi z1IpnOzjfx1V<>;fQ#uEPwv<`tA)PmVu9OXWT{;;veiYLkO*(5+h?I+Sl{&=->6AY; zg*uDbv6PgoUpf~pPEw4{f6+NtbDpx6kfk#ee1kG>@{y|kUUt%vN|lcIU!Ii?bEAC3lX#R4baHP5*~mbLzW85+>$JMg zN~A_a(Cec*qaB73*F*N}AYGt{(Ouhh27lQ_P)auG%xbzt$a2@}1l+|(G^j6YA74+3 zC~ThAcBIoII?fDhSJcNw9MI|3erI|z;#5NZX*Yk}71=^` z)6SGqjNCe5uU+q`8p(+^*Y>=o7b*3}SX-^pG*ZOZ(e~VD9hvn%7414aHnQZzVeOac z-jO?2cWGBO2S;8`l+$+J6%mP8Sg(D+l@lq?SkZ#cb0hZ-%xQfRo{4nFk7@B1FGv2Y z=+(NVemm07tW`@Y@NuMac8wN%`E{i7p%Sf%A0Hxp&I`3PN54mYpUc&1-&GLl9+0io zW>y(_Nb*8UozfJ!U-h9@@s;jK=Zk4tpFfU7ei*-`HPbj7>Fj()i@WqU^1vIemiu05 zs-jGkRy<-W)h{GcYt(%Ywd8B4)@%9^DpTH1>+?A^suRgoOYWgQH8|H!E9WDM`g)_8 z)}tb8s)jE@tEB}?9eA##6*%fmZJIf*rMVnTl|moXvXP0PhMn1=^-6(5l`7k;<#~Wh zZI+kPayWK|I_$ozc~0#z)!^o|<`(T+)ZDru%@*B9)HsDM%}KpiR1UUL(@F0=^>uQE z=A?EW^?)#6vsqn2EnWPsxlyT{`dQL7ea^Tf&& zwP+$$bK~R^b!cC*W@E=%nzgk+bEs@Htp}X-hyJ>Q_Ui^svp(Y>t>r6GGy9?v&8Qu( zS)%)&S2=17n~8#)1aML<5Ws4UCZn7%LhWGYv3yG%$u5U@U21Of|sR(!m&O zfU%~7G1mZNPX}|L0p@}Z=0pR`4IRvp2AC^4m@^G9cXTj^8elHzU`{o_+|t1uYk;|? zgE`j#b592~paE)u4r)RJ)CL{Yhz6(?I;a^9P&;%`L+YTG=%A+5L2c1Njj4lLql21L z2en5BHK-11kq&B79n>Zr)TlbBRXV6ybx^x>P{Zn=mg%6T)j@63L5-_}TBn1WR|mCE z2R)z;dVvmlLLKx59rTDg=oLEX8FkP*4A4XBpqCh+r_@1jF+h*0gI;5Ro>K?C#{fO3 z4tkLRdQu(qCIj@SI_Omf=vj5pyA067>Y$eypr_SAZ!*2E3RFJXsBRGZT2U z8t`f+@N8A!-Av%&s=&*cz|&QMw=;pqs{*fQ0?$_k-p>RXpbD~p2{J(yWCIgqgeu4i zCddp`kR42rA*vutm>^SBLAEeK#;Agz21=+&{8KerbhzT-D6=V|=WRxn%DkjJ* zRghgwkYTDI%a|b3R6({eLB^?qtYd=AQw7<_1R1CbvXBKbQ59q(3uL4!$VwK-OjVGb zERdn9AWK;wQ&mB>vOvbFfUISK%vAx|%K{m!0^QAk$SqwzELStAMO$fy`F{+0OzDpaNKc1(-kuumKA&f(l>-7GMSyzz!_H5GsHr zSb!;109&vCW2gYuU;*Y(0qns7459*9gaw#H1+WPVFp3Ib6&7F?6~Hbmz%VL+Wmte| zQ~=ws0OP0t)?oqWQ33430t^JsfLvt(CQ=4$#0HF{3|NT`m`NG16B{s;GGHk-U@B$6 zR&2mn%7C@lfVq?bd$9q7DFYT`113`jY{mwRrVLn(4VXvLQ0fQ<77G(n_RR(Oz28^l%Sd|T!RSB>w8!)UAU|BX`S|z}?Y{0lmfOXk` zd6fYBvH=4t0TyNhCRPG$%m$3C1X!5^m{|$1GY2rV5@2Z#U}`16)*QgtN`SRFfVq_b zdvgGTD*+bg047%gY|a6Ut^`<}1DIV2usa7Zyb@q}4q$pE!1f%#_)38FIe__<0Q+;m z8bArG1vp?$paj+i9I!@E0&4{hSTiVrwF3vNA&!H!1n2)OodtAM=f1_`NaID=FG%BAwt{}5@JM&5O{mv_1;=<-FsU|X3qJ(ne+Yk z{_Tx3g$K?SUN~cT;H=?=GlvJx9$q+uc;GDJg)@l<&L&41GnWU>Ufwu^dEhMOjWd}C&Su^?qj})0=8ZF(2hMKZIKz41 zEa#0gojcBU-Z5j9eH_n{yID2~I4C;=vs5j1}?l_xzyERoH_p87IQx3z4D61xus6=c?l>EJ~1)_```@k zhO@j6&h&0L+xy^*?}oF!56=8&n0@$Q2I7iYh!18Wu9%JZU`FDKS&0v3Ca##B_+W|4`wc|n7#O52IGoZj1Oiqu9(gEU`FGLS&a{7Hm;c6_+W

8F+2ldK|c7oi?_pxt~-j` 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%0Aj`FQ1N+*j~Q2O=5dpM%Zj`jQ#k6*xrNL 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°O&P=!+bY>oj>ddt58c6dO=RldI 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�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%0DY)bc2V1hX99P=I3Idt6bbv*Hpf+ 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

8H6!P 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 z z;1?E1db5E?OqaAUDJ( zfGn5CV+g_e-8UlDe>jE7`u!ep45eCtIX;2Dem((Yxjcx0;o)>Ic6P~L&1j6j1B?dy z&)3(|Ud?Y&zxTEw*SB;~X=yxl?95(Gzrp=>*mFs3 zI-gti`sUf^wp({Y`;7C(k8Yn>H`4j*F(;iha`<1%Ps&)o_!DPzhjpDsuTP)+;plMt zGH-2YV>m1RobzdV=*Caey?$S%f8_2P0(CX0t2gJq)$gmEkFMUF1Iz+u0W*LZZ~f(Y zZ`~ssN7g$VA91oaKAM%WKJOFHi>%Fk?$)oIk{dTWC6V>+elbv?xVum9&7s~N;^C6s zo5RC~jqX>rZRNu zZilka+COd%mt0Wht-}V6PhMW_?D_iU`EQ+DHlVDeY+%_No1NO6Pt$Xb+8plPbxYdJ zqAh8o-48R|E?=Lr<=_upx9gTd=QZdl+7g=CbxUZp_hClnnYWMnFw-mAQdnKIr43TU zCCHJP^=W!m;`W0+%uMUKrA_r+pStPKJ)gEdx-PcS%ZjW&zu7^*ul6>M4qsXp+8E6`@)sR08Bw-RnbU3R=J3WT zo5MF0Z^`K9?)T;M=^LY7McKT&U&u@UG?ear*2>#!b7;RS$GrEv6VJYt_Fg)k!Ian; zXkpQ-dA`JiF-^}oeO`FJ!=XGU?fUfT~^aMw=BCXW9=pH zPyXcFl9xYl9)wlwZ@1+8*Lm12#l@QSAnqu%sUri;lb@j zK_nE4m|wl2H2!$k5tK3? zGXo;tT(BbXyupm03gJlaJnkp+IJXxm$)8I#>ET(_JQx3>-P%6|RwVo!{zorE2G?7S znxys4VI{ne@h`2;#MA1KnqK7={sg@AaN5tjJ)kqj$&j>bvzow+Jq3+v*X5D#WR&0^ zEjedW-gC0j)2@!q1f9+4vb3M3od!0Inp9K4^${~kSrm4>JJ7bY8$4$9US`@Y9Up)w zP02KZhfe%CxUCrXXz@1I)^tuTXE)o$`li!HPxc6i#7gswy&h{yCe}|ShO^^nNUUF` ztw4JA1E_VZU%n-?vbk$H)~}-_b6b}$b7K87%@kl!K04|wsLwbF|6-6cZNtN21T=P! z4NkutyzE?-y>HAaaI#COZ>Y#{c28#APh@)bjT9axGAnyB>$1Pd-0XKr9w0J5JBxV_ z6xlAjJ@XD1*(v*5cE$*iai>iy^jf+b8=w9WYc&98HFj_YFiq~_wBe-9xo+&p^s%Ug?eC-7Fi!2gShMn|?SgPN zC!%8&u}LO1J)0Ga&FRd}@`}#DlHo8FXB>rO29*HIK_K$n+>IP}vBvcCL1s^8BbT&h zoCVdhnoIqHpoya{_d2MXANyr`ChFL_yw-{Rs*N(VF0XT9clsltb@@^!c9*F1>|w zfFU5!g6CB3ux!p<#9nCK5&aM<8lL@A_Q#8@jYZ(1QLW1tLe(FnYIJr#6c~F&c_(CZ zzBl%2#!IHXQ?egpCEsYXHy~6rBfE^kZ)a8DyoZWrWv^w6-p%0^94eZfOW3*AD?hrh zhWTMi#-@)gq$zG|OUWyGGF1313xFvZUL#)7Z$pK@A_JymqIkFWie8Hp#@Hm7k{Js$reyA>4w#Z@ zVkhiys-`5iFK z-Jhe-T+FzA@Vea3r*Tt%h~3!5?QjVi)9$ZOmK7^<(@%#)p}BX%lne=6`YZvR|tbtr95oSMQLsOscUJ3h^*sx@htlCkG8T=@UkAefS&FpO~& z{v912gDDw4CPGEs3%jytn3A!r7+XlA*|F0@y;mB2QwsM3#?AKiA&I;w08O9lI;U6ghQ!=c9 zF(q>qC16U1D!ig=+`@-g=D9xOMz`=FGGI!^O5EWV@{>direrMRKDUtHU}7*OV;PUR zh5gxXn3A!j{ML0c8lj%GGJV?K(yWxB(=2_6PZv7vKZ#u$N;?URLRxi;!ITUM_BjoS z$1V%CJI~O|oDAO8Nf=doI2k-SypTk9_$0P6Sxx5XS(TxH2HsTRu1F)0Ji_gCnvJj7izeZ{X$6z;*rUJ11GL$WV zDH-1RTz8M>**P#JQ({OM6x@fSBR$NS@y?r3tBAW7t8{WGdOWmrX@cCU_#$+=6Gw2| zxcPSH>~RfP8E1uxCP4~68Em%DGS}lAWBg>wcIn8>UFy+AE4%QMh1(9e@M9RJ({ zjobhXoxKr?EFSOyC>Q%%JiK`tU|Iat#Si!-{{A$0G@oHGsY51_eXqx)dPD`1=H z@rKscyALzGj^tel`a*;r%V03)5R>&YkedvvKUjH`>Yk0O457zzNF8dVXtw-Bgq}yE zJ!=u^HG%Ex>vrZSya0^z$sEhmAm$BV{2amQNnbUzSKchovtT?;W-!nDV7!gs^t=oI zHX^o{DW}AivzL(-;q-hNGOaLKwIdn&w;2T)TXwD6f%VM-Bb`j6Ps~AJ?2X{;-3`AX zbC54;{_|zSeKqT3B<(X0DUT!a7(#D~FtN`_aNh#w4FqK;KWtLt%>G8!!$>pPzd+`k*Ec6AR_yds01+sk!c8h+d)I0 zHQ+1-)rg?;b~qGz4*ws8;BL-Yjx^JIKS5*-LT^9O^x)6HxduTEWu~yn%DwdNmfWY1 zW*T}gB6pKuL!U$B84_&hdx*S)(3_c=t%N-&g`_>ht){}i=XS)zqfz)ZvTUXfDr^OA zHdCmuJ0jf>dNVV#Nnt5_jO%<{^S^s zau`#OXJ($=bT{W)=HUhSTST5h=vx9oa~9qQ^)3SPu_mV?U)Xrsa$CE(<1k%pYOw_p zUm=)US6xN~#B1H&&$3lf)13ojm;n5IsmVt}ATG~p8^mie@&*w-R3#yEnm|T(r zHadct`XN(>`9FkDmJ&DZ-ewu+fI1qXHw7u;XJ(sMGmH6;ANY(Lr)X-8y zr-krQV8D||{us%R+2qhNq)ZJpnDj=xn7*j&e%7=`rxYv8yD7gj_!2y4LVt5Rx?U%! z8InQrOE=39@1h=|&2AQ-Wcx0uSm=blc4H*)n#A{rp|kKj4E^5iOUdd-4v2mvhKuM=ViJkH8c-4M*|aPY&QSA1aD%Uh zon!TENGnb0*^qW%O3#M0i77o#NY60r;YN)ZLVwIm2l+hSR~SOqWv1^oWB1=;#xCq0 zkeQh|E^lb&evy4MU0ev=iroXVd>eEZ|XaiQ8-&+;jU3NHL3(8D~aQ+4{0*+$Jc9yJb>F$|F{Jza-z}6&F8ZnQ6d} zPj*pWX&zfJaLviC6UsPmB(CH^egd9i#jfcrG^}S<+*Ejo`p>i#HwJZy$f3au&zIJyeBYYc-8v70=qHR%|R{mgxkm*3{(_qi80{BG_$25 z+oR_h1Ar_m~2P@77h(A)OK=rXhG_FtP-JnTVW-N1qaYhTu8NRwfv^-tt-5 zyKI#3B!UrP}=UyN~nC9~tQPU?7*-TWLV4J=?*!06#Q8p7I1lx3oq?&%1 z-*i)Kpz)}g4i^Wb_@9cQDdf9uNEnP6zMqHJ400M}9q^y;J23A<;JXb>2N9k@NO$z^ zV$5Z}U=pViUTl^~%8V5we%_R55uMYgm3Hrj*PaAZ_;V3W_J1{c&hl^~4qi9IpGGi0 zS)ADfz5;vBig1FF|A*i@vk6yN{;~ukw_4)(1S1bwVnu=x5i1Sx7#PS-c+v_TpJ3!= zORPvR@|Go5CKzEr4#K;ZA4)Ltp(R!%82OteRwfwv8UZ;7|FHZ}f)QSCrX7rkSef7` zS&e`Tgm9{fP9-pSFmIS(lpS5*)H@f1hIb#n=W)W$ zbr{=B;#6NAlDA4^0_Or-Cle`R^6`}M1hG17m_7I~;njkX;j<{htCb-f!a>?l9xs0L z{NaQ@o~!;<$gX793^kgLA{>C=IV-~nMn+mCAQ%4aVLcqh4@D_pxuf67aps6_! z;lwl)&3QED9$6%a?l1(>vqh`Z0H4vw8AWlO- z9ga^hVh3VfU0@*AH3SA?-IBmSoRS)dwV}X3tPKYSVr?`~75h-X5p`rkS#^7+QUjFz zjZU%u&BwGKI@%_tHtKdZA&Z-+y$odF2Jo%xYeynFmeF`n(Pl-b~WR?YI()7O|Kb|X#@@rQ(3=# zm{LTN%U=H@2 zy=U4J%YO6kk%yaHQwU~q%b7y3y*Gu>$=1{_ICxVEC-s_ZbgTO>=P+^B37o7$lwftw zAlzrU4*_1Y(YF9uro9@=GBGTx60=i5HdI7ON<8I)pTT_1-Ygb$=?j@5sun0LIkf^2kx0*l#+O|`5Ene zAFs@2gU-tF3`ele6j>SV)?A7zt^&(G{-!^M=yOJ*MQ^YoxKAO8ZzK`i=Ae&JW=7xn zI+Vf-fDgz*bluj^PGt3;o_x5re0n0;e}1MOuKx2AiKZ&}7Y*g03)><@oxi@F>9dI; zav1_wQrIOUzAbULvr+=1zzq!olb0T}b5}s>2$9PWc)Tp$RGuFjK#FT}oNWfawe^goy;hTNgF$BUMC1D+bn2@1vxg0X_m9BP z3L8nwOzO0f+q_|~3A%%o1wr4;XITlJsIyAx9a!#Zpjym#Vm>Q^D`Qpz%urKOnLy^*;tZzuf_Q1&yy zD==obL$;CPhE{{ihu&884Ux;>8n?ctc45QhV-MmjE<VD6dp#1BJd{fA3l%W%}|WMZubw$GIT)TU7im^%J~P=auD(n+95D+Fn=)5p4&+0 zNns!I?TGIx{^36mINfszCL6i+W)?Z}z;(%Gu59KBTx`ajD;ef3bw- zn$;`#yjr)YymE2PlJeS$x`qWX##UWX-%!4|wxRsE(t*XsUNA)#RW!^mp3iHma#1}D zd!eo%F(S4yCX5RY7VPH2gc=0!+ChVKHdb!zi`h6N=2lfB9>q_tDr`!#Y!!pih1E}v z%m+W_;G^y^7}`86FOnDa^4&=9c*OONiAVChwu;4~MYJpo^TO7)a9#l|4Y!4LU^fzp zdKtrD@z=x(hZRJ+BAPiY(ls8*^fKd-u3n>w6?=`v5H2k&F!q4cqDL5eotgW@izB(E zku;h6%`M(;v=kX(B)FPIW*2)g6vLXQ!Ju#(lxcDrnd4n5DU$w3Zjq5e=HuNYU(%7b zZK0(g64@hqL}8>=)XNzbiFkFz(b9tGu;_sW`QWi-2hi?t9Fc+fEHxgV6=}tW<#_uH zi)46*4nt#Mw>T}j6kU^75DrB;d0)G3#4E@@I6n$+w@C6%TIrgEFO|^EPdH_zn@@A6 zG>E!nSR~uaV61Uimo7LjUhBBY^|8&>*Qx`5jnp;SglI9$BO8rKI}2%Eq>J}zHtLX{ z-`D3~S!emLwBY}=&TVHhylfLt;hd;JmSP59e^dCAEd=gR#wS|vk`-iNJ#{Ydt>#i+kol3(sPqx4(+b)~I^%;e zhlS^%4^YR>-Y-_hqs8Fn#k;`%H3m>;Z)x#<@w|9z3=DQx$Ef!N`>Sm}<)hvmE8RYQ zjf&r*yKE<5kp5yNQtce5pY3s*tuIP65HyTeHvzia$we{vaHQ*eEA~A1` zJ4_WjZI#QOH?w7NkEyC`sGoh%s8QxwwU~x!t6{j7mM*JnV5+im@#13_!0PD81@llTR1H>1 zml|WWbyf9^3mY7o9ZlKboxd0xF%FtEGd`+xaNIn!rd(=lpBjit5L zWewF1I`VW zc&TA|vQCUuI*mBXEo>Ag>pWx3^cm%4BgRdbIc-VQ7mmss<~uwmSfvHrG=X3W+# zEM8h!uW`zu%Xh0~{mK{660Yh{J1}rnO&BxjAY5EyrcIkXjn`H^G{D@iG+^APhJ7Ur zQmgCD_{7y#Ufoy&i^{knzV880Jgq$2LyJ8c0CqF~_?(DtS zT=LeYa_v;KofeHpnExYFcfS$S4w^Y}%%mCqnet68*G{jj!!X2ujzdV50&oji^v~K+ zu4!B}Wii@aZ@ZN}y0mUVLse=3B?s&Dagz?3Ibj6G%m19U`gXciMe((M-NR0A8YJAH+!y_tAYJq z(NHEmu}NG^N5^T-V8S*r~Amv5v9mb!5IR_ z?a7~;gU9rl=tQ&ACdNV;>21RKZh>3qwR79M9k61vbEsQjmd7tD$O=23e(Upz9_Ffo zht}~VSss5p2M!N2R$T)$XRx}1{(Ev3CNQG~zQtm>77nKVC`*pxCPkJ6h-qV zRI@Q|eC=hR+K-{AjC_0Gq`8BNc$e@A;Y&i!Ml!un$Qeh{#>ORZwCL%=Il|+FoIs|$@rVvgh`vd9 zpU`}?Mfz)^zY%6)d@+9q;aaIElD zp|QCL`P)Q4Bs8`Y!GA;aCgIfW}3afH=rQ%;8yh?bx z@DbrA;WxtUbgR$U;Deq%qW2e06doyDBs@`gmhf`nEy9O{#%3P$zAf6=$O9e5J;3yj zutIp8@J8X?!aoR$uOR@<=r9w=kk9k zej|Sf=X$P}L@|xTa@CjJKx`_1TiF(K4(<5HBkNmiY1sW#K3p6vP7)`J72-wWWhDAp zA$z6xNBP&uUN8Px{!Owsi!X_)*(^9iR^r_ zlh{ox5(kPWi>Ha>NX%mjiT>uue~!3F{>x?mUgT?@Z1+c%-zNW`#JlBxSoUM$GbGw= zQ~5jMZu$Qyn`2?hB2oVc*)2${hc;rN{71vr+AC#DE$SpJBfTFlh^}EN=uqUb!BU#cYu;iPGOh%okgcXxCA8SCOxX za()BELE6r-$xuM@_kVHM~kP3XOQT3f_RqvGsFe* zSBMvhe^B`B0#d7&CBvJ1&afx^%iTU0tu9tseg$BC1~ zY2w-9ToU~(5HAsL7M~P9B5}_9rx?P2McPsENO8FMJ8_lxinv4kSo~7_TEyQp8xQ^l z7_mx>IBbl$qCLfeakr4&M(iYZ6Gw=A4v5RiC~f3;@howMI9Ig)p{RGh?2E-K#HHdo zalN=vyia^sd`x824$l7{;!bh5xKI2>?;lueeHPXTk~mGY|KTW~FMFYQq4-;I zsmP~>IKDNa{a=U8R|M$4UF1_kv>y|n6JHd+6LIm#>LrWmVjVF@Y$`^@_F_koK}R^h zUSg4Gk>}taCVP~4nph%E7N?2~kHh}viHpPw#NUZmidTya&%|~&ii}A}n^9uOBr#L0 zE&5szjb+!=gg8?EqeQ#@fc}QaE)#zvo-NK17m21_g?5+8ULvj#SBlq*H;e1V4dMgh zU&W`y=R{vC;&s{Yi64lp4u(XNYNd_K7{hIvd4*2#A)JOae-J< zW1^;J#3QQrxcHpNFsEFuzljW1M*BVS1ChZX>Hk9fMm!*fczp@wiDHJxaBcMGijBmm z*h=gt7K?QUQi^aj>NbzLx3~_=uMYQX27{_ec^F@ZR;`l1X zTg2PNjpBWxU9Us^CuF}M`kEJS%6>=uQ2a#vQv6!{Q4I6C9r|VbEV7ZeEe;ZWZH!T}$B2_eyS|C}Ft!-yXBv0ljk0eQ z?-cJAeJzYfWIrW7C%z)SF1{yzApV?2Ml!GOVI1jVJ<&As;LnrYTx>6P6nluhMY|4) zcD{zjsq&v8GH4p-XWDpRh3t#O--%a>rj3Vst7S978r%Dt8K#W~dz1W(w#M?eM7ypD z`(xR5eG|4_-voW_jPF$*!5HhRAqy^tTp|7LOI}Iw#79$Q~=&bx!yhypHWJ6zw`D?3J<^sgC7$i4Tf) z9TR?rs$=;pBBRvN{#3N*%#*Dt{VvImL7#8G02I8m$+ zFA^)o8%6)R<8!jNkvIq2bw|w4t~-JZMaOaM7kTTM^%#tf{yL&vUxeLSb_dmC)H&Ak zuP-vd9PN|EGgOaZ=IB3LWHdS2b{!F9Ksnm}^+U##qrE|7G&$N&ivIP%H)S(!9Lv8D zc~hIVT^|JPdLVd&{EQFB@LCew#t5;#BzTm`%{sD*4T~_+epS*BkPI`w??~-$Vh6m zhlnFd^gBUznK(^;20~-~3h}q{GZY&At3?JqqkWfnFNuB``i%Z(MFu#d{f@{OXSDZ; z5nhjioh;&Kt@VS=WPZSizfoR25vMh?YhF*vlfSvxQS2((a}AhZZ`lLIA>uG`lsHbD zBu*Bmiu1*VVug5-c&T`WxKdmzUMJopt`pab_lujv&EgZ{GvXHU4RO2pp7?>dQ`{|9 ziQkEQq=(xhBKp^<>dMX)8;N;hbFsD9Ui7bH^_D$Z*GF)<&729v&T}B!t-q7ox%y_QiP(j@TVV}31~n~nO-)-*NOUHqde6R>jtYW_7oKN z;oyW-X;U+NvK}tU*i^F~%Q&?{N=Ev*dOT(hny=poWf3G!?UC@a-06$N>6w1s_No9SCW03qYAnSBRUq5mO(Bzkmf*tJdJ@m)>hwP8%1;4*Z$op-Ob-G|Dni&|MU&d>} zexCJi#0us0d4KZDX2B7h@0j6OCY+x*U;6#|UW~lo23hC9LdVHtMw4H5KI~wBD<|SS z4Ilf%&(v6dE0OoxAnUw|{ssmdes%@Qg8i*Se_K(={_wLX*5B>O`)!bQ^06Uz;QzEg z`DM4j5$tb%skfcj9}dY_fA=EKHryXLCG@~P#0{#6WlWEXe!cd65o7~CfAZ_S2nX~2 zbW`8>zC$0^GpFZ}g5#^e`26+9&F62Aw~)tXp9$FXL0>$tqCDZxi}a5b`g4!PbyGNV zkjG}W{@6d~8Q6`S$=Lr&;PWTHKYaC8tG5*6+vQgR{d&-+>e@9gKK-mdRo9-XKQ49g zfFZ@+3#VSkuG2c!FFlv?MhG^EcdWN|e0{1_{g!OVC{8L)S^jp_xTT3N=RyOjU2#rv zLUAg5DW*;3D^ukbN0z7TiX`T3g%*{23-p{i?N8p~_HbcInQC*V{h3>!Oa-Qc>0m0D zy7`lBkyVfGI<`Et>(Nl+uE!HoOquG4;>6{dP)~9?cBweNNeXhIEVo@tXfTCMQ>i6% zsZ!QBc{!`kXi~Q*ySQ^P^{Cnw_kccCO=YT-HI0kTYO*>xb$QxV&Yt@!5?4W+spkt= zDr!Vgy9OrLFUERLy>V|S?dH9q%xg9}QFldy z;$y0!Sv{+weY;gbgy=vdzc*~ROV$B5|Dk?+wz+H5b|qvEFCGQOs!%toQDM*MRXpJB zZJt`y!_YGebqlIhv3$dTFSc?XPKPbq1{EJw{4VsWa-~-_^kY6Dy^g;f?Qn>={JoO? z1&-n?;oy&z-~?T&Kj4c5l1hARFgyY$lDIC_hptTmx|Zy!xS-&>r&kd z7j&r}!;GLyH4t-;>rxe=akv#+zAhE7Y5TfV-=i?DOZ6D$8GaET)pe=9Mgup@OTxY` z6;GYME)_48AFN9?3q$dBsd%&C=XI%g>n@;6mB9`Ix>R#9EMJ#u3d;`CrQ)-wo-S1@ z)b(|#c3`M6U8ab2qO+4fjT1s$YIwFFx=piA{3 zdk*MQ@jgLNm#P`QzkgDf>TS#|u1jU>JFZJb#ruFR)oUF0f2>QzTPHDHs=sr6#dWE+ zaM%awQccC|{{vkrhK&m7Qt?*c;dQC-TP>(d#oq)0U8-|w#&xM)V^?uqssUWNaa}6j z3;j=Zsm8LaxGoiM;~ZX>>S}KExGvQyZl$;`Rcn^Ub*XNr8P}zk59m@+3_Ykz#T(&4U8-AY2Xv|Sag79YsV=4+(51SV z^9$%wjpe2a=u-WY^AG4!9mDWVpKA=m*2j7FbR13Kp1G-e-(+=oT&7&RArQ&f_ zO_ypMI}GYlnOIOzmudnRDX2@;n0@}Tb*cC~L`;|Jcq~9%m&(p10bQz>xHJJ>s`*?Y zhts9v^Bi$qsy5tN`uaLlPR=K68qlTc!!`G>=~9`5RX~^OH*9)gT$ieZ3lz|$;*Ia1 zF4Y~JbwHP@1BVvSrE16hETBu(j`ah&RD5wDs7uwD^#i(8ykTBVmkNKHs_RmjDqT>Q z>U`D+>QW8oJcGJapL3ytx>QGV?+ofv@ja1hx>SE;jsGHDsyxm+C<%rQ%s9 zrb{)0>*}z&R7YVh|5dtFd<-d|OVy1t4(d`d3=4FrUdHH}@R5KTx>O@je{o(1tWqZr z$#L^8X9K4(A5V$vQYC$Z9~Ch{DU+D0M9a9K6kQ1s-a~BW@(B_5SpE$0qKuR7Rro)e z&p6s{zii%0913SKQvQS3zHa~8cObt6>0VZ9=&_cZKB>EnNJcYxL7BWU~R+lw){ z#o6o7-w~KyJ*0ff@VUpC?*!OA>Ep8$?m+WxgUv_0qOW2(-NCiipe=tden{Ur^c|nY z@!f+g11d!q(Kp0=pCJ1*eJp^i6X&}J!+!%QdJD%q)O;@^dnrux@FgEFM%6p0#cwf+fnFH#GLM2)azZ4QyB5hfDF2Lb9LMW5kPk1&xa-h}53 z`sg3I7Drl(vG}*&7b*I8j`Ad1!qymRBc$j%=Bvl0z6gmgvqX28uOWS3B7KC^d_I(; zPPV2+X?T_ssX5i3POigRn50M>7wM+7;E?=Oy0a~PC=+K*063m zu1g@b9EYuk_dcCg8@MdZ-A0vgv_VNLrn|Y?2d|G((X>I+>a9X~BI+y-TohsDX6r1-1H<#n(9Z$a9;f+_$XW@8+^KSDJ z_IO@wPP9)x9_emNJ%CQyzK@dL$Q*^#j#XILo;MIqf@c(xn$sV#()w)vYASF3S@W|{ ziEm=GV-*%!^NZo({Yo`&&qfYEJ2JOD{T#pfYE1(96r7$wk zVH!If10x@qJfwDP%x3Ku!`mI6Zb(=hc1(ZRKKruce`HSZJ05~cgORM`@yPJzr*%9R znb}C~*qF_%E4LYmixmR5%b_XaF7grDx9vdumY4-Gr~uQ>Q!OZhJjG9!7&rY&4&ZDENfy zylm7Or{q-oWUxWEg`3a`-gv_|(C9U!cC5%MYTV_1^sod=KOEJ&QbVb$J3PEBlGxP~ zQR?y-%GaX&Y_A;hN~i!4C6>>@(e|R+`)z#@CAD{s%)|-X6H(%g(C$~@1VIrcGp@%# zD5AtKgdV<#5)J$`;CE%uA6bDSN_2*~p1lqrqQnloHV{#=Ha)lEJ1s7v#52HAK@lYw zaSPF3$?HcVN?tz_QS$onMU;BE?oy11DFhKE znCbYYX8Kh`$*Gs%{BIFas;-zs5uun~5-!voq?Z(xwoy-^pfxlw=Z+Vy`e{Sy`-MO27{!RbX0Y{ zq+b7uUJ`!rI+R5sH}O!XUJ^5#d453wS>+d?(m@k%2qLC3(a5qV6Zw`MPO$aiB$04V z_bL)iEIXR;nvW!2_PqG4G3CKVoMXbPelp?DZ3KT-R+}2YLI7dHt3Rw-F^nN0F7q;n z7d6-q^VKGV{D&KfpWbB8KtR=qOobZ~F$BLz5VQXt6B?qyzAeH&GgKEq=aB^A=6DIh|5~ShAR=2ty%qIkD)jZDRfuz=-%o?6p6||Ba5d$)Dt1 zkxW#CnI4|8u#y>XC7eOri-cZ?*N{w9gqfY55vlaID7FjN4pTD1!FO(c4&+s6U4@kD zd!nIA+AFL1B9*kcLQ!wAwTwn8X>-3o*zouYwk%h0HTe<#&BJ116Y(Sd$-hrrcI+O; z*47YuSKKE%BH@T2w0mw?>@N%(%te7W|C0!&urqg2B{SZJKZ)ad4GBTG2_~z;%udfw zaHC@H->{g&PoZX(WsFImINN7QP<@rOE%v5>pKiz@vS0uH0<`}ZOz|DgSwK5zf# zsm|NKJ>NRm-hOlj_ai3sNbp2}12bf21aChIoc_jQL&YYHi~CYc4GKSgogPToRzyF` zo<#6`Z&Faq@HrwFnU&12Lm26m%uMo()XIg(T#AH!o4CsS*!`Kg)-x7XGINV(EQo#O z*q&K!RPmvV;82EGi?bJ0GUE;9>{)@KoIN`*l(XjshB6{P6o?zehXQe<_)uoW#elFP zZCBR`knqm1@vjTiuoI_!GUsxL1L<~5x@ao0kVbNC7#F~RGR_cc0Wp7t)f-9t-m=4q zrARnIEv{r{t@%e19HUf#{NV;wfKZBdIJaZMKx}#gpWhQ8+PqP;hw`xi5F5fW5?h)c~6)gNZO^T8PZe1J1oUmo1vp$Y{c|4@~bQlTBLTtu!a z9&r4!NOb1mD+Mx3$gf38_Ux!z=^sn1?H^41>gEFNM#73DbWXlMxNIo%WNWx~xd{GG z1zuyp-azm&0J4O)Aj62-*6}cZrLmoDJ#I1Ec;3RcN2MZb zI-IBaYrU*rKcMm9EiQKpMjFGexB$4q%f_pZ#2{_*cKfhhLu3C3$yM-b&n&MwF&8PQ z*W>qoP&FcY;_8iMA$2`%bP^?uFkXNyLX))~qJtlMBZX zbMi!M6D+I8y+k5D%(5nSC9jV6c{g0%cf!b*k$vB4)L2Cv$n7Xtk0hZUX4w=g+3!Im zJOZ9U$_f17ToLkrazciOh5We^{J|P1_6L_3ieO>6?IGZC2QJ3Prx3kNfo&gg>EO0M zsJdHMB^a#Vi5qGUCpQnOUs%0&dYJ;he3rv}mB1C@_<$wnRZ^ ztk1B^T0GMnwEkS4lUNeits~~R$ebtnLx{Mni#rc{`f^>KFIppE-q!?=k(Ai= z-I^thFjF+Z#P0%c;uoJkb;L-x$6tZOlfOUtJLeGixX1Vtm)>7aE`>ia&s2fLCG)2$ zmIWU+~Pq%5S`Nc>V_z1W0&1c}!gGLhIe*gn{%(ILut`s9gn zv(gsuWu)K~TuFZXlxb|ANrXFHhj+83zJ4(5R?iXtFkWCaM838`H9Z z_5)R6!ioLOG+mn`sA~hshtx3SYarvnTqbj~@+dBnlb6sG9j1iS218&4rO27MP1wY3 zQc#uvahojGp}0+EC)gd#&ZGj)p|hQ+KtXXE%)t}4K}XP{N$eAE8D*UXE@fz<>OUbf z3dZ1kNI3Xp9&%_gQPOERSHuZB7>S26M3lmcE6Ph-`O!HBbk{Eeq zkmCvOTr?PqRpmh411^*Jn3xw=wz()|N*z+R!J7HzJWr72d=+@gHYnJCo=JsZ%&Ani zNee@mB-K;4fk23qZT44F1cARoiXc^9L0s7eWzfnot(XsknlSKRBdwSZYWUaq$~N!E z1Ypt=!z+Aco82*G8}zYOx-uWv9MB5Q^wk=juhUFlso`G_C7EV{dar);w|rfh?{_hCE`Y&lWN zHW!9GWgBduyG_{!l15ZUfkq7GM`atzF>w!0r?L%jbE;G>R$PykW{Vjl$~!$~LvQ12sBW+2&=gFH^Q@lo-A( zrfl=V=$(_VY_rX4<|*5t%3V~p!9jM-VwcJ`I2J#{{X{6+*uj|II-D_P z_81&y;pv5xeW4OmLTV!{)RA1M<8ASo^Hiy@rshM6D(_gdXz9sbp=m0FX>z%cCMQ#i zM=d02Fw@a4PEdsukqS?T6b)Af>Y+PG(F{(=^#y3Ew@64lK_e-|ND6U;T@3*m9BdGv z`FW+8{}yE#MDM5K1p@Z}DkM{Y5co$!L}U_#X2#E&IQeM2H#)a_X~DF1WityW&CDw} zbJD!=v&srO=M|jTC9j}t`iug+dpc#}?1J%Ar;IP3GW|?AsW>tlVm1X3NFmGN<2$KA zyKH6wgyv??8b5LN(a>LUB*pUc8Z!T%iN*Z1OpGad{PzmN{7*=~KuqO-R`cawR%WU3 zL+!s$E9R%PUP}JUHC1s0|XIBKGXZSFsBS@ry02^GnodX^L_2nhe)JHCnoHpqjG4e!cmV3}8HCP@d>w53A|EkI2-6>(r;rZA&J3enFOviFHqB>Z7q&u9H4 z(P9sV>nB?@ zO%{x&nd}y#X|llIO?FSwG+E#uB>Mz$1PTA?vd4>M@}Dhxj(CxHsd$aJM!a3TQ~ay= zsJK;pRkYZI$iGh;?uFGY({2!9wayV(9AT5LkpsZSf_z7|VMmA8|>yX;<~#Vka- z!74Xx7PK#=4gYlc&lN9||0>znlGqM6h_}kWQTBb}qa=eUBy1~*Nk;|ipozHC#YVTXc{e;Pr1q$$#1a_ zvA$Nwzf$}o3I8p!Zx{L250}HVS-?kRzohb4#OT`^a**oi1_uX^3Yo?<`IG+I#ac-rXaL~)GD$BL%af^v(kh~+hH7PLEG z<-Rt{?`2zzMU-2NMesWM(e5^t^F<$y|9%qvJ}mN`AKIqPf^v(!2)-r1X|$kxCvEuo z0ucF)%D)%+z7PBPIgJ*+{loShMAK+NyB=ykP#h|b5GRmmXWA?vU+tmoYqKnrT_Ijf zqTkCzzVJi4QoK>zNTQ$n#LeOp;tS$7k+1TwpEt!F@_#ITDSwstotTcdi8vqAW&w|o z-B>h@7Whr01?)gS=F>&&FAgHHT~8rV?{v|$S>XRkZ5EVUEJ(ETwOOuJdtaO74%xmo z%RRKw?g=(sklO{6mJx9CbV($pC!kSMK)sd8FNLu;g9kbvfGHAME=iX z`=R0pk&o2V&yZQTX7M)h&*ERiP2y&eFO##MzlnU2oVJVq=j6|6hBQ^ZsMuEIbM9G@`ZPf<1>-hN@(-?18MK`fqc4@cB+^u`dT0j zWj7aFiyg!+;!)x;A_I}I-{VDJ3uKIJUkhZS?6bu=B15mR{bizQh{ERE^7Q{n{Iht! zxJi6md|Kqo{%rS^_?^h-bm&hJGsL=LuGma$Ar^?8#2#XAaez2T943wuPZLYT$>LP8 zT%0E|FagKOXhEcDoPzJm{zNp*Q}_?a{!vVXkL^;$T(OaOq==WgtlqKW0CA|us1xkx z6!CO%k~mpBTbv^@)D7EJh?j{=M1~(?`D*b-@m7&h09byH_>lOB$jAyT-y;4^{JZ$R z_>uUT$T$>i_pSJYn1nY^=}!~uin(G_F)FqfJBmHUqs3xzuvk;$qf~xh+v6PB=ZOr_ z#qlf?SBh)J8^v2ihKytVd&GxCU;BeWEm+RbHRNaFUa?C2PE6p-vZ$9L))woFO+{bJ zqrL2oVt28ZSR@V&4r}JH`9NheXrFMgLF9eo1^q z+%CQ+GQ0=JvtPvX?`B6thWKE4Td|YaO*}^ICk_=yh^L6AwTpfx$(}5pEzS`aiWTDT z#4E*`8XphK|Csok_@el__?Ea++%4`CzY!Ujl*?;czF?N@x?)4Isn|~JATrbm+m92c zh||Q`;(XE9_PAK~72;BHrMOnSS-efWSA0->OngdwS$s|WK-?+r5x)|@6Y)g6Ek}}= zCNgXbm#@9pRqP@55lzDw^-RMU94h~4@f2~K=xcv41PuGXR9q^q5cwWH%T3!DyhZly zqG=n${}0hrt|OCt}bW_Qxfr^Tn1T z1Jtm*m&iCYw0$iOhN7WeDl!@k?FAy^(9ph8WXKuXH;MlBrw3#+@C?ge6z%#F?7gxX zU54d}Vg`xjWPBO=^F-77g>Bc9K)Zef4pupX$*_KjXxhH8P1_e_pcs~4CNfqG?Q2B_ zfuU_0z98ek(0)c_C>Yvriwpuon_+TD#(E)>M235z-AH7_7uub~eqynB0*U1wD|?*C z@GWdNM`Q#S+LwzA;zHZMp2PSov>y|nCDAX#uh73;wCgqS<7bYQ!)@h&5kH@esA9z7 zVyyZ9KTrPVVn?y7*hB0s4itxo!$iKD!tsq0CyA5Asp5Qbp;#eaBwi|BA=bQJaGm@& ziR;Am;{D<#akKb@_>8zkd_&wWz9)Vl?i6>6RpNIdZ;o@hBVw}1x0>kB6&s1;^gkB2 zvMn-GuHVo9on}L|+v&e*HDIM;!Ya3^6+V-Z@YmTU?%To1ug86#c^*@oSdZ5o{3)VL zdk{aPoW8O*9gXdbJY##X4io3cW5e$oS%-S0>v5gVpZu~Ra0L5%mHpxSfcG$V*9`eEdqU{_f z4?chL%g%u#*x&Y3y=Ow$AAWYk`df;;-v(KyKl*DOaQN9PP!{ZOH~PB{h3pTjC)VE$ z$op-ObdUZ@o~5Dx5q2UW3$f$Y}$$bI{OC5 zd2%8{mh(Ou_4Z!U%7IxMiT$yE&NHwZIa9I!od};l`TgONc(r;rVSGFMN}yj4S`A0` z%!^Myuhr10a}TTj^I8pKun%B5gjU0{4e8KoNMF9Jc=Mhv=ZEs2Z!pveU)5lBXjlJm z#`5&lPF}-RqnorfZG`kyGxj+BdlWaU%r8zWO4`*wsi)Kv9yr3uqk2O6nnpzvnk-As zysFkRXV0S*;ngb`z5c4EKOaOvfNpdusXaq**RkJX_G@sFDiE0I(y!!aGJke)d>0tEsFDsTNb}l z<;=|7o1A$@Riu5h14(7k14*OZPgC8d-(Gm&_)lH8*?}BqdzF(FJrF8ub|5r5{Ap_1 z@9ysZX<9gXAg3sLpf*Y)9nm5!eQ$Dl<=w}9nwHe+K<%RY_qxejx23Ii*3>CVUA?wA z`CtWwvfld>7xspxM4bbfqr(T1oH_^GqR7Dt3T5!4JQ?MgD6gTQPzEgqrwQ~JY99y} zh1PssCvjh`L}&TtIw@;DtK;me<+P~^kNcobc+GA2`b^kYDYx0elW}dzu2AX?Qc-X^6m4~)&d=&7AcUytDAau*)a{iziSHe(n=oKNmx}P3 zCPlAo%ii$UoqMjVU!1hMYjL;Yj>RW^oLiiFd_Gh`!bJ(i=~opy(V_;cXY6sE6N|am zT~-`k+P*kr`R0$PweZ5nKm7P3f(ZQhjD}Jt5|Y1TE#UMvQZMwfP4D=0l!W8q1haeR%1 zcBt|58Ve_3hyjg-aqJ+VvA{^bzQzKtrXQ@a@H==tjfH-w>uW4@!BArw3%yX~uo?^J zW0(Prg{Ef4G!|aK@cvzmg&WXCOk;t!G6EV4lh|KeW1$4Y3}`GcCSX8gfw~s~jRju) z4rna&V%t7aQOM1pZhAmtVJ+JpR%3x8%>j*t_t|qmV_`juho+v7IfSDXp^Q{~PyVFF z0x#^xH5P1r$2Au6IkJ+(i?K(BqLGZ29QS{$u~2}a#WWV$b0Omz3xDCT57Jn8607__ z&{((EfmelxP+BAC3%aOo6(Mo_;~6xAQWws z@jOf88VgiF4`?hL$(0+|SlGt3^?XV_ctg?l*(Gx(I4Lh`Mjc_!bW&cbeU;6(2h3Sc z%2v&{cg6|qDz35cEZ4`Y+3l>W{@Eo{(benfswiVQH+o!S;Y;qBagBu*ERAa{@Xkj- zW8pC_QCwpo#QFY58Vgrphyjg->)3BVW8oXFjDW@hLrMfS7J75WXNHT)&{&vGJD{<^2;4!91>W!qYAg)p`~w;b*RcP9#=>N_4`?iO zX8ZY}x^|&9Iwa>DuEv1I0&nyLH5O*m4rna!xT>bHu#qzeYAmd#BdD=JiGpex3k}%k zFI!__J6B^RB%YAig@W{WF%*>p|JZ=IS3%sFOO=DpiD=Z0R72|I~IC`m@(~vy`H5Rt9Mo?qH^i6^q3&(QM zL5+nmT!BH2g=ws@+#6On`h=TvKWqFKX)G|Peo$k9H|_pIjRl@{Vj2rmxvmbYvA~n( zf0f3k_xDHztVNC+MP-|?n^&K5}c_AiiW`6n)Ox|_*`=>f-)bUw|6mXmjijz@A@EX7Ad zT(I%lWO{ANQN)L)TUi@9ofh0#c#p=bo8{HzL)4eV>dNV~cm{RLV|8nLbt#X)hpfGR z<#bx?MBQ6sb%(h1Iqthrk2jvYam&d&PfsE_t+{irMF#rFSO>j!NaA~pxH?30#Btc_nSV93RIM6%WIX^>o%96gqrd7kP7@}?KZ&M9-g*H$gyK~7q-t= zk#nER9DvJh*732Z#7C~J$n0QK3a_hEkq^yBX*t6eKqrH zc6u7Te?SFW>Y*_BVD&nrHpjx?)6{=OYTJ<=PKM`wSbT@f|Ban; zlYfIs|3oVA3vCT%qqr857L<)5)^sU}HA3HMawve;{F`?3n(ree#h@_ruI) zI1H@gDpdL!$vV!!?9w<(cASq)9#R1tvsocGiFRVzVP_yr_v7?2?2MbCJF0g>YRdxK z1jAvSh@@R26U`#dIGFAinb-ScC_{xwNH&IZkvWG3$FLNc-y^kU6V1OvXXGD7;iG8Z zk(ve_Jxzm-o@POZ!6<(LK*A8S-yx}d<9D=73-2s-$>0TdMI7!VZbT1G=vrM;0CHz0#E{T4je-M5{=4b{zu__IoVU|qW;znp14#a+wgQ|%4mmZ47g0co z1*q$31u(Y|2?fLo%brZ|32TICB-r&Kqy-Z26OI$knD}zC%y43iWk<1VCUin9vg}BL zf0hxAcOZF{xrY(gSvD5=61~)zcq0qpHVJQbrvw*fgvHCQuueu0t1Wv9;VsO`!G)=z zTo8%GX2#z)2(C!5e~y$3zyvpOfn|pizqjlNg1xhHtRrQ-t+dRx7FQ+eRId{D^bV>! zY4O)1YDdVGSk2hhMusIv)Z*(*_JGDmNQlsU-C}04ym>_Gg8h&X?3);f6n5q;s$_=G z;lo&HQT0doCCr@amvGozSk9Ex;zdX<2D;@KIbo);&$`HYTgP^_-d1ojG03vR*jI(M zKg?D_HJea}lZ)Pw4$>b8`T7u?V_?@<$~Mj^1lOCXL2O3m2_%e}cm~M?37Fa984D|! z;eBLOA{dhrdmAwo$pi_QS>zd!N`GBrW=$|wrnn#htwN-rAOY>J)qIgk+C`o(CP+Y= z8wf`ZF$&342)O2c@?gaR*o1m$%uvwGg|Mc)iR)uC62nH5Tagfhnc$B-WC?E_oJ8=o z6L`5Nae>&5i7*eXU?54$u zp3mRZ?4F0$WF)K?ZjkGcctn#NJx&q+LZF5}R{q;XpZxU6(Rxc25)oZLmSYKi!m4&) z8+!NLi`W`x29m!f5u}zFio}TJ_{~_!{75SrPVkqdU&J+a3la})a=n$E=OjWwfcb}! z@Qpz1wCq@dKaEXnff;Wn8B4VH{PSaCCnlZH8(tneFmRTM8;i_fuvZ8n5De&REtui^ zQPzSP9&IodRWieb7Q{@?AF5=A;km5^GZ%QqqDp2iK|%}Sa?c;CWajst5vgQG#-d7p zAIH&O{n+)y7OEe+p0Gk!Z0>$YL9qqe@#A@p2{puzlQVdn@IWxt1@8Fsk+7->?oAjk z!99qZH@+vu&b27P#I4CQoKAGyKkY>4A4_JiA}1GRUZw%SLng^N8(&n3jqEFPkS==w~CjoUChi=NcienYw`g!UPQt%Lue`1+PBzlIDGj4 z=D+mn5j+B+BeA$Lu(WFzV@{g)}OVJGFs zSQE#V(N3Qz;%W@r>5~uTL2!WJb9rG0f&V>sk-j-zwer!#9xqFHeUByvTHm9G0F%8ekKAj$?4jn!ACre$ zk{_&W6ydG=QG_?QQN%jychsT!^?oJrEcb@>GMuNfu2z4zUmrUyoHlU?-U;z*5Ibfj z?0l;}GG3i0RGYkmAZ%BX*#ALMwRz1W(Q8hmGU4D${qe^J=Q_%pVSctfBXKb4Xow2>uaoMy+^T4Ijcr^X6)$|VASf4>>Y{Nmd z7kzp)1KXXB4{V&VJtSf^J!h=X$l;F#wDu;KZEAED4$;Ab^Wd#WFH>+U#xIk`e`Q5n z*4k|~W5-3%8C%G}MbY3oV$(g}V-&T7cn z6uA0nkN$d2tLdG-V@nhcIAeW=`E${JqaC#V5Z%`+3GCJptE#i9Mu4Z#c|P)-vAM;a zhdoI(LI*fbF-7c?AN-5xPdq-aMY;)z2cJJZfed%`=9nu_jG05}O7@UIZWlJJ|J@CP_U&HAyD)6EP8p4mgXjW;dUsWBH6qeiC{q1_8vcv?xcd9O0x$gh_h%!-d>D&yVdmh(4mMcK_hLo0|3Ojh zV*~nLGu>6A^JSXpr#1Y4s2NxPlNuG4tKrTXel)aI^0`LfjrPh|T>X9VxcW={xccvS zeRx$@&2qiC`X2}5>R;!@)gR^-7IKxRgja>~3cW42=9d*%zg|KnV$O%t-SF(ZJZyO8 z=HkFe%Sy;>o|l!7)*ibX!u+F_n^>RzCNW20B0}8<${F{bh4ruvzbb{={dC{OI^B4j1Ru!|_-@Asa_~DrS-m zK>CBo%L~sg45#NoY#^M%%6+iZY2lmEZ)zhvVeYymC1sPQPMI*RWd4kqrPG~~8PiKj z=TDhkGJe*X<<22O>;G%9xes$zEh(RJ=JfGXOD4=IbLLE^Q93CPr%VS=pO%$RS%7f+ zWmCs<#wD?+(516xO`l;W!pv!!MaVtz`0y zIkTMOhK|nb->G|EkHXG{o$@+&?9`)E=T2SnTI2htbbNVfo4nKT=XE}^d&llwPe<(ii8JRMjdd`)bbi6K?yzT1o-=I%SO$OD%(>kPCUrWJ z=F}PE5qkgEnElv`iU$oD0B9GVIiq~aeC*<7W#y&V=SruQ&N{Pn`owdbnJ3PH%}w=d zwEiJD3rw8>%?A6hgR^Ah2}6!88sn5qz>bPT6u(@iPASJ4o5p?p7ZG*8q~zEU$93|y z;j|fAf=M&xOqhxR4>_^_@g<{hHk&mCiXJoO%Uzl)EN_S5}Pt@=A2ojB{OHw@@9KZ>3HU}uT3c}#hfvp z@l$6{nO172yplQ7=aiRDLb&(Rc}~g1xwEJ8j5}@o{CSgb%A0y**YRGp2~*Fqli}H2 zI+b|)rS)_cdLJ=hq_=gdoj%c^KhL7mr_7j8?##nRL%Y~1Xj1u%lF8$zPr|C0S;Wo8 zVWBe&pxTLeA~Zfw7(aKNSvngFURr`vuv0RA5(ZvU&K6h$bFgs!qRuUy#WNL4y#lCz z%${*p$<*<-k4%_7W8OskHa0aCTOr(srrQ^cz5+C7+s$|m#Sdd`k!p*HR`zq7TLs@0 z{^rH;%+)mAhUTr}5}ZUaT(q89I&n(bl+sDwrYObtN}2y{GV`1gD2(VUr?XRn-}e*e zV>6eRVjGpun%Iwrg7swjB3M3e^qd*$U=8Buysew*)5cFl8D_{aILGzxe^g#;p72M_ zm@&0HuWZJwyklog%NsClLMeX#Ps$rMYsSRV^70w8%JX^@@T;KU?5@yO`OS=3ZT{2m z2QTj5;bQ6YAM9ab=}!)K`sK#bZxZ|)j{jKAV6U^kM=Zd9uE6w5jHTZkX1F9*pZj z(c*%^wzy#6HjUTfgTa1J^*)q;kL<6+NV?ZwvY0_)c`a@j+BcG)FNx6KUUo;(;_Sn3 z@x)Ny;)#J4XCMAisy9YFQ#?ytATAP@h|9$5#GAy8;(g*K5{YkiaD3b3|C{)x{2$5w zRNO-%?I+PL0dGNYy{3qnB>as?)M+7`Z-}s7H}NR>2a>2aT=wZIA1{{4Kbu6o^JHJ9 za=!b)eh(LCe?7}_ZTW5z?H^P9r$mdd55L7DLqB{4g#Gz($v&Zt_I%@m{9ffQmXY-m zN%&L6I`Z>95SHi5-&*9GAgte8<$cAP@%2Z@&v!uBj~~bEOxhUlJo(QR`63AYm&slt zT6}%X?^@d64dUG@zgM)l`k2q-vbTs^#lMkg|9A0y`9Bi<_-A}Ag!K-HX?W3r7dU|9Sae65k}z&wJtr;#Vr?%OC8=;_8D5_@PTXQ>-oKkm#qO zXz}%7`|;NJ&Iii}sQw_);_9QnlVq2O6UE6S+D#P~iWi8Nh*y*7XSH~vc&oTUyhnV1 zM8AI(pOXJM@o)0KCB7?uq4Is=ccPQ+%|AuV5Nnf|Pkqti>%(qO8{4(F>h%=|$Uju} z2+`u}quoT6m&-p-tPn2}mxz9x{i|tXeimOJ{X9k++%6s4EIuke zDf)5nUzN?jLhPUa>PXDmh}C7}!`<}Toold#>^5R2(T`(4LN=e#V7t@B@#0zH3~{cw zKs;Z(SiC}9DsB+(5g!sC5uXyD6Ss+f6Ss@+iF^)%Lo6TcC8r<~=yTTV6=qhedJ zQ0yV{sZQ4KFCHfj6-S7th<@CAzMRW;i^WSsK95QNRU+@w)Ar-rUoV??-RWO1ZWQkm z`Jyk&UlLyz-x7Hnl;wVW`)t|u#KvMXu~6(R_7eMu$BD;_d~%-s+r50SMD|2+syI{R zE9R_!o_L9Pxpf4OQXT8H5(`C!;h>){ij${{rQ#HErZ`(XS6nP!B3>>s zIuZN(gZM}BdU2h|cj;Mgqj;bAvgpUr|3daYv1Z(SzSPcs7+Q(MOHIb^Vjr=;I9T-K z<)14143VJ^*w0LHk$8c4mFUOAzgG4Q;%y>d8)rX%5g!mYi%*C(Fi#jNtJQ_LD4TixvzB{zkI%#5Q7q$WTITf0Wo?JWd=cju1~1OT@|I zRB?`Yj#wdHB(4xwitEJn;wEvkxK(^rd`o;++$ruB_le(#KZuN-%jHZJGet&opud$^ zD0UWmiG4)IdSLxC#IwX1;#_foc!79{xI|ngGEM~hyI*`nd|Z59d`Wym+%A41ekOh; zR*5d+NU;9|FmfQ??(^{sGyW#V15Rp8ZR*{do3o%KnG=p~!e3 zoPUCtA!dtyJo`qn{do4RWc%^#JIn4V9xeLu>`#_`hB!f-B2E(-d4%J+MD*j?FOzNh zkSJd(n_)><|31-=XTMeU>*8DDF7XSIF-+LLw#Wb`v|EV`Swg$FSTnBu8S+mM8Lou& z=ZU842>S}z3_HSdKfXOfi_pGT^yAsvbtm}!c=qq9{9|#Kn5^qB>7rdvLOZ*j1X^5s z9P5lb!ugyiGQ0@wN#a=~>M_6w{fk7#5uv?Yw7B-D$4Dad|4C%f5ZZPf34E3|>e+Q8 z*xOa^UoYA#oBsvb&c9w{*N0#?l;6KDWcrKnGY|;t``3l+IuPtrouTVrvXQ)oMAdxe~M_=XJFg)8IZv`SiW3j6b{(PYi-YB+a|kjD2knnV zyWRr(JK2o4!SZa8Avb8Z6d6y0b}z9XiRETg4f;omW#Vr{#?WB-Vv%7qXs;0QGsXIW zX@0N)=xapwxeov=No*}AcAsE?UC>k$LWj2X)WFB=X= zu)hlQ$L}`w$93TMHy(Mv4YJOo^-$(7RG_RpkY~LoF}OcxG3QNwA2VPE=bJpxaW-SW zXioD+jS?A8Sc%94Nc>-lOA|LE;%qiY>Vt-idSbrPUhWi7j zMYxbT68~lViSuH5SoG^{>v8DV^UtduVAH^!@qLF5u4hh9BL&Ad4&(FJA088ljqeTQ zvDs$=HeHJTI{OCbuM5&YR#?0V^@hQjgFJUb&X@gjo`K!SNyq+&S;r>7zw8?IW}*_$ ziT>o*L+tsUJ@Ih0KmBa%`R*ONcD2esAA5dNsm<*$vF8y1eEHi|Gq2mcXZ88dH*lLp zmNi)Qd@dr-uUVCxfEe=EpMRxOr*Z1uWcQsT>g?SSC*m~7|C+mocq*ZRuB;@h3Ynw3@A>=}N zt1Hqg8RLFYlg<{)9ue-3ZMdf7(-rAGi^98(bsKMO*Z9OwugG-wCWpeiGLtlh&iNWc zzQ&NRF+9{S-^MVf$lbNYt-B{2&fNNk{Z3wL#i>n_ki)#&4#d3wfO%hDff(#==i+$m z{E1CgC1);Y?EHr+BC8YDtZ*_`zJ*x%Gp|ctkyVtm_T8!;ce}kq%Mw?l?g~eeyIfG5 zx*~0P!!<5q=cg=p*CecJP>i_wNew55uNgJjY2)nqq{7L^`rUk4@zUa~;`+s2M0~fb z`2qLRFk<01{q~|ChJG4GO#E!8*W}2jX$gp*4^Kj7;eqUCh>$;w(eaxfNI-o3gi8w# z)N>Y2M!U@9?l;`s@6*gs{(*Y6AK2@ryu2-KmAfXbD0NlS;-od_Zv69pr(^f3EB4QpC;A53l(;J8@r9qPu)^cFLL)Ki!$@;9^ERkUxns;HBVW$RrP&2qbB9dPp> z>bGZ`yEX;!@=qxq%XswY)l?ZRMPt z4$p2Ij)?f%Kh7*}w5oIQ2E@`I^l_8odc~n$q2d$w{MfN8R2d>m8?1ah_k~Z=>v%`d z;;%~X99ewMM-FbO{P<%%oRqxtOT^8=!Jj@FXOt^(eDa4+a0)T%XrxU}H#oy?;u@Tr zq10gVm4zgpMW_-=#4r--)^5W*??oWCet+h7pdn)G+wG_C;XrJCo=d~Yk>@f0 z5CiNZw*LDpiSYcE_#GO!p${;3#MbA4LNDS2vGtix+Ky7j)?W!DIg)fsxEto1QjTFE zwm!#@(iJrjTc3U>wKqN(Ni~i2!%li~(v2w$J)RN45D{CS-+G~_lR-6I#MZBaBE(^L zLVYkS#MWoi5bp#aw*G6Vni)xmEP)Rzv?si^m=E!aJYwr}MP=>42V?7}q5BNpvOsKo z<}r`#lCuylUvrFPT#jKPw!Sxj?)Q$;d!c#Mbv`ehinOx6Jg6$FT5- zt*@D9@CrF%>w9M1j9pkn#MbxB+zj5&L2P}`Y?Q$eyojyunR!lae$^+tDT9;w+bM$= zl@VK?d9L+c?0HBEO~lf7GhSrzP+KsItxv5|#MbA6hNBmSoYaevtBcyU$W5KvycuAz z^~bSyTi<8YW}dxo<;Y4By`e-hxcv}Y-wR8hOxZSsQ*XkR#h}kvsq8p)Eod<8z0P6J^Jj#fxYuQsqi4p}k76OSOAwm=-r8!AU4qE; z_xXE5cF8;^<$hVo8K-hw52WxI4Mo#4C}4ru`kon!t zLTvqWX+GJQG8Lg{UdFrZ>gmRxnb|yp7r+r)-}GUltuq#LnVwIv%jNOd`reFUvGu(L zh{e|TR&DQ$Q`yxk*Wf8mG{VL!A&(Ql$ywko6+7m|K$7;Ti-jC^vxN-{t;W>t6!8;pY0J_-zy)O^B!%) z)=#(gLvk+QYD8>(ul}%{Fz3H8l){yR)tqx4%Mn}O9&U_|$>DLu*!nz_!qI0!IlL>% z*!nz1!qF|EoPl&8wtf@LAspSFkTaQG{wb6-4yz^{eJ>%0`#odpx3wC(6R`g2@;1`P zs2$iyW^!<-v;t#Fh&+P|buByrchEppMlA5R=RT{%cHC{_mC&AHw(acCz0eM3oIZG5 z^1p@7m`S{M&Di=IurRs9(V4~8uSAU;JC`7~J`Eh>Ih3hpY<+JHMsm*K@*}ps_6W?8 z3!V^R_qj)+UyH5(DZ6Tg560G~!LB}K(_?)*F=qf~%-H%TVRSg;om6JNMP&{9h^;9V zp(MuB&Y|ctW9#$Vj9ty7ePO7!w;dxnWn7?(LRqXFiYDijanu)wa_k|2X!D%)oHb(W zdrL7ehpUaT^)I*nhUK&aQ!WiPxWk4zCWmpkQxIFw9)Qw!UZ2&*4o` z#?~K-`SXmP(}Nu%w*DFBKy3XU>;bX$If8KXIydKh)VDi>E1+W=g-vo=J^PN0b=X(%!kZQFxJTE19Qo^!c$Fjn8rD0;>U|BHR}S+#;=}D@^#-Bq zUP$@ha87-*UO<1h!RC*t{3Ed32`k9Xh)&!*JEu2SD7VEtUn@_<+ zO%7my`Ff)3FjDjRT@k&%7MF~xeiZ)UilykfIlxuReWyk={aL zME}9IPOeCEoC>7oXTejCYm@hpcES^Vk!xviE`7~#0jL&I^jfaTn6V!=z$v^ZAI=e?ksj zWia{hr^V?%!Iu3ln0FvWH*%SV*5VfY1ojI^7N~y|2GsIi4!plxk0ZJhmt58(wS0&p zlJiM89!2s3^;g8&4Di}~f})R+T3H)8y+HkZ*x2j;IIr#xsK+N7y}ELGf%-I?Ir*M8de(G5ultyo4QppIPpAd<#l%Lb8q@LgoP) z?3j;WzKB%7#%yLCe+bVGB)l?q4nV)81(Mv%C)q1|{1&MSsm&^U)WU!B45T(!z-W$4 zK9Z+8uo0f)U=2XR!#vyqd}1(cpDU4bQ{8kvBWzo5ENY#KRKPkcwRJcbp4nb|j_4+~ zvQIu^=+<#F`3$g)>UXGh8Iq0aI%KY;!BPDMnT<#VY|VDPb1VD0#M50abfX7U)a&63O_VM4+uA%Ii8(xN11@kI2!D69x`)~3fP+M z{2sa1Xou}{6MJmrW-eim+?H3M&E@Qb+wyv3Drs=7-HXgUNCj-ob{)Caw6_BF;FNZc8__7Akmq6lzo`_SG9)(Ok zQd_ps2s*7sJ_VbA&mDJm5wX9s7qP!H;_}bM<8O5_7nZBcoDlfM3EaZ*^9&mfnuX)%X+O-Z)7=lpPY(<)9KQ@N96ya#$KW*0aQrl! zuD9ZBW#RZ~hB-E`AB5vqQ}lyy{4&rF!tvAa`aw8;8cq+_NFU__Fd zDb{&%j+>U|^}?9yDH+u|O?BNtb?8rP<_xOS0pFSFb*k0R2-fd`Rhh{d;&jmx^>Kxu zjvLMl_MeUV$^M{OzqZv#h>xI7J$s&`ZaueEx;O873D#HrSWOI_W6IIIZAsWyZftI< zafAjdvw@aXCgf{u1zLOj*5n-7Z{uK)`#$MhX-y(nj$_ieDlt;EZ`vB|`HoPYWw6xE z3f(^G{zhq)&RF(+6R+uKz2++dy=|^g;(h(F38R`*(AQj{>4UysK>Yn!fd0{mW71AZ zIN7#9hnQDk`{nQGMeC0R<>y-M9EjH6B_6H6>!G6ccdH()|46M8Z74kM8jRN8a}xBqS6Ne3TlIBnkHR69M|sO9Sh0 zIFXA}nd^*VZ$qq$;lwb@jwB`_A^7k>l0Bm`njK>DMmZul$`O_9mw!4jG{PI@=-?=8 zMBc~Han96~3nEG(!EQN>VD}@fdvDky362p_Aqj6zqk?l9$v;okCT|-ovu(j;!wjmG zJK=+4@$;u4gE5ng?1$LOYZo&!8wqiJ5hc7wqe>d9z0#W&GxHP@n>`19jfB9`T`|XF zY{X{}MV1{waIIOt%xGZowW1+*_6Cw1sDtyaH=zi#<17OcLRZ zF8km>y%@MS0mHuCe9I!_gGgA}1QR0S&#z?WG0#{~$;?xpF{_f97d>NkB{Q#i#@x!C z$b623zKAOGpB<`X1_MFIXGbcTN%oAyO0N0|W?A_zP4 zB9+X%t`FyABGs$3ppuyep0Ti!nS9S! zRLKkzS`aNgf2fj~_MWk@k{Mpo!VDKxGIJCXS`hXX@5~ETGSd&qmV+4?iz>N0y^Mt2 ziFhB$(-`pLl+)f>%@?Vp%{?#}r@RVwy6t~w@R(pij|6v83r}8SZ{=QxVFq@-;0_u> ze}O$Op7DR!dk^?3%DnA= z=FB-Kg(L(B1OXwEARv&0fHWh9b_Aq1QPD^VMX3p0B-p#sWD(S3-Bm%w@+fu}>}|nS zSFy3K6|8HEV)~8x1blbj_j%suv(NwC`Q*;`{{8McGxwA;bIyHL#u*vx8}s9g zjPi|z@u`T+MZmd(;M*h25FUy%a=vebIY~kn+&v z4okt*^41p5Hjg7Db&=*%zANY=O@>6(Jj;Azc@_j+r1_oYQPn*8aO0#o3xY1v3?U@y zp}}(!@&sL^$&lzGtKov(hDYxEjWO;QToDrIY-ZuPRx%yhDIpt+9EY52oje->b9xi} zEQToIkH&FC3^lk))~Ty#bd{tApBhFMQX@S<3^Ue@Q=%l`+~%_j<&jGy4g zN<<02?(xJgzBhy>T3R#XTLYY19C;7cA|H7D)|%X6m5m}^vgk;{Z*3HDiq$*nVD%!E zYhV}Rgw6+iO%QmKqZ>Ysan~6e40W8w&Wt|}A4fEdB}o_7s-;O6)~Yj-F05l~FRTmP zqzmhUP|}5UffwgJ)F=eqt@*cmW6_c=p}PIGQO*8#LqHjV=LqX$aI&yY_J!9!Ril%& zr)qR^DpLGY^{CoYb)}nhs;&&#shUSW?lJsMCf)e@o#d(C77h?*tSOWMR4 z@5&<1NP-&-_j#MExfNz2SiUaJ;*8HnKt5t2f@yd#vJ?R~JNKGq1`VD&k&!qbA%eAq zvIL`-B2X*hHt<0NT*i2}^(jIG^`jw1zp<3j#CHhTVbyU)kR5-c2%hRVWk2c-&U&nu zH`aoF`$P>B$}lLCxF>eG#xa1kb0~Ae*a$ z4H89!w_dFgSQj&Jw=y2&foaDQ4;LOgoeQvgXmm8keBXh%ExyFYBy1G^oEv+Ecj2%5 z(O{pzTbmt8b_f5cSqj3zj)ab+Je z0r{sO;LeNSue~Wf#d|)+`5Dodo}!1=LV3Ehq=(jG1V~RoEXMZ*H9v;Gdg(xTw#YR=NBCj z6vfFP;T#`0!?xa+Tk*tMnu$F2QvJ@g13LQApcpJH?97iS`U?WjKj;jjEQ)m^xB-;H zjldg~gDZ%jXmA&ke3KL0;vm^t#J^~WJCFky+6nxLS?v;{mmz5Yht0{;#(~-CWk`Bx z;)Zxy;kZNg4g1$lF9QzNpv|NgI<@;K>@wHcb#f*-6GxZhGMAq-v5S-5<(NF9wdGmP z^Y^ba*_k*59hbTMoJqTxj&)W%F(AU0(|0DV5py2&=nYodaapELWnPF5o=gth&h#=Q z?H1SNxj=VlLB&b0c4{|qa?VqNoKSyB6i;;BGbc|J2kbkSb5Sq_H)}y1o;h@ro^ZO% z+Yn_P=;JM7jljs4P z+kI3iNy9qqGOO-_gLO@ICR(d?{^psv1uDQ{js@3iEj)Pz%Q!SO9^q639*w~gjLX&V zaj*mncO|#_E`)cI{9MCeUD*9#VVvPP1g=uB@bb;jAAu*tU>SlqKeX^;#CQar8ySLS z1maBNRe-0+U|}A9M4)db0;)3#HtBm`sdU zF62eP4E#m-8;$A0Cs!23X3U&lQ8{DwwAg~#ljmcC-73dVA2fUN%mq^_WWm>OPGv<= z;GNuS!raO^(<&#<%EMHk6;*ld7We4Ze!{fb3-adMY_ymcG_OK4(N5@LGm$5zpPhij zPP6CCuIN;O3B)JN@LQTNYvSbTGiFyf|2OKcT2l3&tQXVQPr%&ib^31etOslGpKRfv zTg9m}S?ip+^ULRT|JTqC+2;7#Ace zKJusMLvF-7q_hcjL-O)U2UCZjQ6x3m0CEM9Xt6~R8B!;b2Bm>Ws;@OrLOp{jmlZV} zPYnaN6eT)a2?~ioh9v4OLG6h9bw|=VMDTUtL{cKb&+aub8I%6r;zCqf=JySG7X2qW zHrP7G`qhODKszbsBj>1s_vyeVrH-d`P{$y-tB0>g}dF z{+H#ytB(H#HE_Rr=BuJSl@L&Q*v$*nUY-a9RQ}-C;b-+5^t>&ZrM1E^fARHGhPs8N zCZFpRy^D#=e9~!di%WX;Y@ApAM+XQ3cY%RA4E29Zeimb8?MwJ zL4UilzsGe7dR~f1XC4Gg-NMLW$Dl;5j7nOb^&he?rjv3Cby8aM)KNz#Wju9KI+)bT z?9$rR&WL)8TpWAT2IDY1Bo7-PtuQ)R-9NAjD5a>U)O#t!fwi%kN7ll;Rye}3CKp#r zbtOIO&37XWAhLqwMR_>&6-G>Y1!sU$gVSdyg3Ekj!u)?yY9%oR{r|CQ%D;d#$^nWf zkR|BB8T9`xjG~P&YX(#XlEoxuS1g`CmGTXpyKzHN%Ajix$c34*jJ79!N>wY;vA;;d z#46k^28t8qRlWoY6(;5mn%$ZIAa(F>VU*br{lINq?R5F`C(bnu4HI#L#Kpu}vnHDQ z2Vzu%=<}~BjPegYG8AzgYlV{%_o#D6Liu9uXsnj~@9UILr_2YGmZ)WfVS@i0CyAr= zzg%ABU>!q)RsRoat_1Q?{${6;6gU09t`5t*?mRF3SBbIsl3#W8SN{K@yTZ@?zp1-& z&cCki3SYw2E@7uRjQNRY8nw@RnCD+nccmrz#fK`~{?uLR!j5XmCJ%P@`3;2?|D3u1 z#bO<*pms_&8u>rbP&oqSIbT)}@ffkc$Y=0O=e!ssANY|o#d#v%5Yf-~h~#DBM)5jv zv$$1!LVQ{Li};E7g}6^l!Fsa(L&f&uaPbszw#cXF%)e6HApTyoxqy+rL-xDk=VEI< z9YcDN*jpSb@|hgdPZyVp7m4e|KZy5>Pl~UI?~C7vjWJ$WZ@yR}_7VBond$tkFnOuC zQM^n1So~h(kC>UiK9&tfLtNV1+oMNXAK`)F~fc(OQ4TrOTAUMJoqj={50)-zF@ zBUX!7h&G2P@;xZ~IdPX5!54N|Ph+u-c%(Q$94l6c3&iupE5)0|`^2Y3o1+u$*xa1p zkMh^UOG&nGb8dp2WG@jf5}y$H+coC@LbN$5VGmCC{U?c&#A)JEafNukc&WHXyg|HI z{G<3+@e>mJ_A`;clM5m2Bhim2UV+h07wePoH{9yw#_k#`Y(`wwfyVEjq?9q_HE(=;v-_9kz#XAqP|z@$9n8m z`upN1@&_6zHS+%~f1s6;k>PKz1|;ffAv;fOBY&Wk(pCPR^7ofLP#hW|5#JNP62BG0_`L(iiOppR;s+pBZ&UeA zGX;MBo|4)EM<~6U(oHi3>Bq=#b6vu=xh}!6DtC&~PgA+sVwL=7k*NP-+3S>Ub6%nz z{%(`&Yja*A-+i(Vs-1#-Z!jJC-c!EMN!0Uq@q79C`x^RF#0DgeE1L@w<=e{NLA1Fr z;qNK?XmKEka>GQ^N`XB|=~KnJb7U@-f0=jziE^fu0&~5dzx)r0Pmw5Z znkk@ZrhvPZ{=WE`Xj&=Q4nNBNMfC9NLDrKZW|PR5Bes&ijcA%F$lp`xM~gAhv{F!h zwCv->2_(w#=d+~E#ff}@cFJP;ZB9;Xf18sN={6@Pc(v-ePP|pTUA&t_xrbywCO$`^ zy&d8!;s;9SZ*{r8pUeMuai9FZis`sXWj)zqj@X7o`SxOo*iAe}>?aN+QO^+3=JrJS z6O=whew*VH>tl0#BHiZr1kYtU{Ff>JD)DNSyFvWDc)!vg5}y#C5qFBFm4f#p&Wqae=r*Tu!2% zv&GfodJ@~|RucWXUA$ZVhh#q{K1ZUS9ZLVJ{2z#)i~Kb*>%#@S==J>7w>H6A#t1dl=z~!Q+z{wTjVz? zS^h`SzH|sX!p|jOebJ`Lg56AZOR1jL7dru)b5pDWZLTg1=I>P5T4; zOxfp(7m8PiYs6c{+r|G79}qdS1Ka(p_=)(L_?`Hpn8MFR$Zyl?fH|_8ig{vz*g>?< zZOG5x%CLMdv5&~)Hvr$1u<{*i_X zr)6TkTgAJ@`^3k@?cxjK4)G1~ZSj54KChzQuVjBK{vw9>ITPu1HCCF)-%PBlu~IC5 zSMg}Ek2p{qB90XUEtW~Lr;2mLDsic}T)bRdE#4q<(h~OnKJh{EkK&W!3*rv(4e@R9 zeeq+lt|kj-KVdsZi~U8;G(-PLajY0C4MV%>Oz*s*U^k=qCGEwzlrQ-;$dPNv5VMU zJXSnTJV`7U=ZIC}Qqi6>puO{CUnH&;*NHY`5AwYz`z>*|_=U)Mwrsuld;$3bEtW>I zIS(8C1!6m~yLgm1P#hxG)mWJ+|6I|Yd!XKPWUm(2i8qRW5bqQ1xd_TVE&F-Vo{zx) zj_keS7h+uv70%Pc^=c&^E*>Fr&K{VMI?pD70#7D$GivLJM#irjw|7w)~SJA^gC;Oc)W{Hi(L&QGf z0C9*oLOfoy=U1q&u7=7yr7sYdi)V|Mh*yZ~#0_Ggt?~!iTSR-#h4vniZO^-4KO_4E z(Vla`|E=twM2F9F;7=0+EtMv+?YS4y>uRVJE8Vn#k$#kH(+Gw=Q1%dUtaySLXsJw< z9cZb{lg-(x*sqmhpq+A^?Ayh=#7D(#;-g5ab5>5LT{wrl)C0-}m^DLy_Df=GrLGe-XY0;i* zA^*#=Ulac-ejt7(+H)@C|4B9{gy(j#=UAX=0D~RnFBW@>M~j2SVWK_HLb(%UPZCWN z82(Dx3q{ighTooVf%be0yj=Q0*#oyvh8^l{6l4r6gkBk^PeVGi>BcV|HZN| z7dihM^WP&rC8>Eax5p}15$OFU1s=S(PX&zZpW@(0hGIGY{ozgv7#d{%r#d|l)$T+IKO$l2;> zhxi-?CcS9sLc(e6g)qNFpC6p<}*2BIlZ;Jx=6wbF@zvIpZAd6(Z-F zqkW~wNyBL0CURCe+K-8xSdKO)B_lr&KM^^39R0tDoIj3sBau_c(QYSl0y)~piJT^m z_Nn4D66?u{;^<#0aymHLSBRVuj`mF=CxxT^fXM0KXul+K;y2oV6Zep4htt2&|Fg(R z-e@-z^ToCzr+Q<0smLkZXpa;*iyQ5!A}4aAeTK*h+Gwv7IY%4qn?+93M*BgLQ?Swg zllU5mesdx=`acnW6n_!xH}=yp&6edW5Zj6P7-aR}FtT*Oh>ycYG-1SL(pdL-VV?X2 zVzJm&>>=`Z>Fnn~afmoV93!48P7$YzGsWOJ;xgGQ#B;@!;#zUNc(r()c$2tAyjR>R zJ}f>Xz98-pUlCsy-x5C-KNY_ezY%N1pTtx>mkTtW0?pzarsEvnRQdiZG@kUmm;d4F zPMBvH+XS19k0fmADh9x#LR${Qf9As@FI(#7V;YyX2&oAFC|@!1)NMEUcVJG^n_3>GJ zP=<9pi3a(+GgyMOS#Sh#rhR{i;|#$0AXtL58E_=Gn~e_VVPJAS=nvXmhImj0QKz&B z`54g>q%DS>Twn3z+UnlTjE0D-}Q(G zWe|1dV@Ljg=Oe)qq+J6?a($0a@%Iz!tB(+@@9l`Q495ePSv_#ws#71+w<09xdl6p> zTgU=hn8xs=D7VwUtaj|s$9B2=5h1yM&!B(7xZKC`nTSYvubev{P>2x&fj;Rby?rC zzrT7`&PJ#$^)J}aqW{L!;d}ar4~b>23GEGMAy_xUy0IpE zcgYV~pWaxL1!jO5U^_a{Yzp!W4;PgS?sXb5wYQW2BrP_{V%_k#KL4VQ^~Q~YtlACkI8KoYd$?=)#b6wt45hB({X1x1x}lbux(bZ$cwd)z4(bU;KfhE?u(y< z+_ygo4S2oA*^>HIYU=o!@aCIhMX~Mso`3r7Pr?HZk8Ruce8t+kn`ea9hGWgcq4i$B z?fc&B^A6T;+rHu+=zH=|?4V@?EM%xJCP4K~g{wCDu zHn<9Xya?;M>DGJhhW3-&zV{E|Wl!!q=OQQ|or;{u6}kvDTAuCuE&!vj9n^k4;?6~f zp#5<1qcx$tr}mw*iS4p|=6qt`IoyJlo9%Byt!#;RX>-r(IK5q5h_11h^FMVVG zJ+c1oQQ@!ahx_gc_f20j_|)oeGVg4>vC)P%oo4+TVH7m$-*9znj=pHm9XT5dHk7A& zU%FWhp;2`~#)~znyS=@!=(VxX-i*|@Ylf_JijLlaQLv>n=B#sCpAvKOpO2kX6Fw5$ly`<`>5_!X-c`+8?MmKk%dO@r8NpIB&P)dTOV4EV)*-ecHoIjudXTfG^@miOdj2C{Q>qv5YwZ*ecKMDr zgD;RCfTLaVnGSX+HRUF_LZOJs*N0O~&dH6==7V!L^&MPTy&q8);!-@%he9c5A;nvY zI8>#0mI;L;+i^$hIq*YOYPq>m&Sk+%;SW!1x{9vU2;XUW=iv+*o^eQfmJdhpD-6fG z80|w-Y6x5&C99w*#nrBg9fA%*Yl`o@(|$pXDYrJF z-$@^UeVPC_O?fR@$tI6Qy=+!~XYeI}=Vg4Pt{XhT|4ev4uJJQay0^?Wlm z^Y3Udtt7`cGkl$-lIFe{Xic@Zil{a92%1U13;%k;W$T8vPe+Z^ntF+CcW2u@)BFmY zOnyrlT2sCm&g_Sx(3 zQ>-}sa{OaZ3y{8n0j;S+(KTvKZG)M4VHjl>Hej3$UBhlK3L3)h8Ni|N3~Hv<6s0|+ zHKhX5no`H4HRW5WnN{r918H{1LTl<9Hua#)gx1tLYdJgfG-iHSqqu2igsZqcom+`o zQ#Uj9$wPNxD^qKVZ(gA_6+v%9`30Fp+_=wW9${v?%#Lj6`LqFMc5G0-V3L#eQUkxC zgw~Y50tu}tzt5$aF;?~G2FF?1vdp_cXieFh#9FN>zpDP36S&iNsn0_)_i<#tnI5%1 zkI1ZHC*Ns!B0#Mv6VrJwW0j?j&%Byz^nMnPU}{ZyZ1)2VHfl|=LoC|Z{&71rj`JV= z*e?}Gs?Ve*OVLGNYl>SZ_gvNstto$noZJav*wC7K#MUUB`z6z%HRao>x%|>LwWfSK zBbQ&oPlMK!Up_lGjW)EVzQdg-wWi+Y7J=53pI)4M3TV_6f zYl`oasWr72^r$t(FX&Tis;}iRttlP~{!aQ84JPd*Gub)pBuV8CW z?c5EmDH=G&bFbkRg4UG31;e?mxIv&br4fM^x#E#9t8cm*^_tccA8_S1;$SIr8`5A^ z{N)6-rhGe^OIa*xO^rwIOlyjfhRCdL`&v`uFqCrH8){AQYR0N4q(!YMe?NwEAL0r@ zYl@kvHFY?94Xr6&CUDH>PG-~4n)26TVD2I88nmW(Q4i&h$n6hOYic{{g|=Jn%iPP* zn(`00>A54=9<-)>dv0zw=D#Gc7w3**d(fJiiuO%wY9up2Yigl6pf$x^My)CKz@ygG zCgyi&|5@16orba4n!UkPJ!nn& ztx#*~W>n8!**1mN6m53OY-ml<=BsbB1FfmM;K*IVZ3?X^8rQ{TbSoM#yToKa$%DT2pM*Z=aGC1;_%eDY~R7#q$;h z7}cbp+J;WGaCz_r$3m(3DeRWcF*phls|%V?gL&Z+?+$RPyw~3_=?D*3KnDVqs+2Mm!L+%J{)B39$B6VuI1~R{yHB9&?ok;oTj%mAa&mFE;n_ldKdx zeVgd(({MYoZ-o6j`r5O;zUF%j_Cxf2%6$E-?9Z^@rSCiX`kQYXHpim~1vyv)_tl@Q#zoXE0+>$gJLhvDPbi`p#i?6}9(ZwOZ& zhF4RBHcQ|dVy^Kp#~>7#0M^iKZYh2#W+8q2mZLk&e4Aijg3xB}V#ghBu5&Of<{`A1 zyToxv`2EFB_zAAVA!{|#*1iqotVWugRSAa&LIFGFj%>OetM?@AyXZTP`(%`rn1vqj z>j(vH=o_8G9h-{BhEarqa<1PvTR*<~Z%!Y-+vtvK%yoVp_7n8YFkf@}F2ggmB?xU6 zmpJb6w$fejcC`~io5j$$I=&G%4S&$Um%nY6AlG=ybt}w2Ahg|qp7O#Y)+hy)bY;%IbvbtXL0Z;ExH4c*kzVM!_247rO(E53$yYk?QWvo{eI~Z^GN* zCH$L)Toni%{s?0kB7DnRRE(^h8`$$=>u!ImU?3~_IP2!1UB2+Wg4vm1?QVi~D*`qW z+Z}^qp8e-UY1( z=I{+4_V7u8FwGw z2A_t|F-Wu(J0G5N5wv0~6t<#^S^TH$Ke0GhY$GyVg`5%cO;isL zds7f>6CH_27aH6|gAo~sP{cCYL|s@Dk0Q_hU&}gE-0XXU+RBmtWLCfpPMNAjG+5i^ zh){y6BTKWKYAoTPznAqm>)E$7H|tZ@#w~s$@?Vco#1z}wkHF&FY3xb%WGl*roh>Za zz|HQ41Y4(<5#c*)>&2&t?4iM4P@Lvh7)2}-^nlm6*KxFa4nLpcER@0*=f&^9-C-yG z1qx_IOzylF9yHHF{Jn9y?J>95O}TErLcNh*icn-b)GyS9>)M+qRr}wUu`zDeZuXAr zJ08j75IQmsQ*E6q;hBqoMp>Tzu=5Oidc2#}6do&k0V3xi6fwohT@NdcfO0(K23om~ zS?&bveyWi*nyK8WgC;qX5T2}e?<>qvKGXc3|& z$kp{3Bo`u?Z6i6f82?9x=3Dv#oQqyj@t|nR0!(B)-)XJ#PWKmZ9SD8rHg`R~l<(1- z=J#%f86MUkRO4pwO4HMny?%7lXy7)6*ZE#6nc-Dvq0#AafcO%){jW=xzsnZ|JDEnSE!SgQANN*d1_M=$Dv ze4nIbv4*1;QNL(UN*41uJ!j6WbiBPOk!eVB(peGrgxy=ZPA_KhUJW|Ht?GB+)s&Lj z4!oLDR@;GBQ-&pV;4dj@JQMpJcs;oTZ|v8BT`7@|*@51!+Z*f55Q5Se%wccNgY*3^9)X4G=qDDsLv4o(U6w2C2 zdMjCt?C@kC?#Sx7W1~EYwo`eN=~DUj$v#{U>k5X|^M%AZM4ZlzRHS1)j5rzi&^{Wfx6nRR+ng7-6LdZeUI+Pu^j-Ef7Fsgz5#p^a0e+XgKIPln1s{ zGjfE#9z)2P2(EJiVUH=DCClTCEc5;B?n*yO+<*WPhUIZaw)%d8`v=wERLzJs6FxTX zzi1O=Cv5`U5&H{Pz!pxK%t+c?I5$aji|fENS&2 zyny~`^#_t%RcLJy4A9z2Uj0+pRjw+s5dP{TOYQ2PlC=7plUE;o)1rBx@o)!!wjjYo zXDE9S4ny$`{cYOciI3szsAC@nTGa_SIvavj2pju`)JSf44jAf?VCS$o7rAS2yg280c7&*l^ zmcR8 zhi@#k6R?i!#4(GFg`vqSL1NJ}p2a;65c_LY}2;JbqkLh8>?ZW*&oM<|gYFvzej({2ojx(&&7*dDoE!B+d zMnE?p!UNqS8oZ!$Afxgq1M7pB7UOvc7y$&2@*pWV-D1^l;mi}Zg!$j~9L$t&gBk^K z9rmwy#pnb!9r1)kPat?);qJ$cb9DL_Ic%Lgbce$d`3atfBm%}L*MM7w<8uT8F4zRm zFCMO?@n9q}592)CsU#J2dB2-xjsa%E!R4<5E1}7gF#n_IZ=P^ZLx!j`VoiADnlPVR z^2wW>zF_ktz?BNpEsnad!PeUfQq{r?t`jeyW-!7P42lJvKG?Ymo7=`H6iBV3{Lg)T zuxrC9@S}m1)r_pLevPx!?uCf6ZO02-m67w2&%gZ|buFT|S+S&b#E!%=Rk<=8T$B?n@`ySg zq2pl^FB;-t%0Yn2PpkbtFoo!4 zNZM*)b8^ofn4MmRq&@3~O5xz;7TNg&+u9{WF9Yse18>;n^>@r~I}>{^Y{i-Tz>4W* zNE!hio^1QCWuT?DvU*K;)mr=unypPu>PxaSu@_l{Cxqk^8RI;e1t+qg*09T*Oi8LW z{M*AkDCdP(X1>)}caPA^ki19CvDmWvcdtQ3VV7B%lC&j~or%?Q-DSwNV*i}U&ct>{ z7JGNI7LllfQw#2v8DDQU&Ni@v_Fb1pE>n^=K(aH@e(n34x*O4RS^iq9gZDVLBs&vz zxCsfYx+623NJ$!*Vf*O#I4TZKl0ofZcPqS1*>AH2&I3+QLAj92vjso*qXYGl$9kF@ zJPoLu;)Zxp=3R2#PCFrb8IttG!sg`tB(m2zoPt}<-p1&4m%XCC@? zAiSQGpGOtL6ojb=GZA>i1k1&UUycwAzQBJIe7ua@i@=>3EcD$bAN>y_aPJ2TFM8_` z_*K2D5w1hH3E}q$ysiXGkmp+Xn1^W$cOcw{z|mpX6BP*RcpUz1N$DIb48g*(4hrJ`0I~-%TaVH!lb1A z%=93QBPv*Ug`18r6M@%6UfUSfBJjePyd;mC8&Y|x9fKbHTf1yZ#f1Oy+GVpBmd~A7 zIe*5)ndSC#&(25wYv`9f;ovI=gCQRTeX)*FFUO5E%7d)WjJ!xAFITa&Xh9>BGQ+<# z#2P_RE8;bYL`{*%OD~058MTSLT*v?&hG@Og$YFU<@~M{>Im}yNu|jVF)qFbVHZ~2d zl;}y3hRoRkB0kxjO_qpucHwVEO|EE>JCzM(7J6ya@Pf`6b&L`v6Ou+L(R|e($mv$XBsH&3lyGv8a9JQq_N7wL{j8{WR-j7uYi1rja6pjD z!{>K6qFsX0=Sd7~e{D3h7igosp<4YCS>9F9`GSm|NteA|C+*rww?#noR8LUk~+L!==#O{dPCn9I+z*expRG=!z6GN)CZ)wxqgRB5?TPY%Zx+KV;{JnRR= z%u*URiL}J3H;8)a<0CC0%VnGDMYj~)Zt2~#JTF?PA|fkc0#Bl{1-Rx5G2Ub=8G_oTa1Qix5ELZorng2Wocc0+*ncrxLZa zjG_fp#`4zg<`9mhpy-3XW}o-FYCAuDhD&a`&Kp_nyzJ7ItpD`!6d=Qv$8pvJYh8|d zT6kx%iN-m#hs}>Vq<(QMA)IvN3_R+x@4h@*8GtWQXXr3END9u;^sY#ra zquw-}dbzJy2*Y9_1{S2!>gQqH%`1#F!$~AM{(wqQpH@ARaYQ7u1pmEDtD!rIlTIE_ zKY5)xb%My`%IeZcM(4bIM3+LoF2h?=SQx?sE(ooS9y+AYkp2+SnK}jPptH&krnuH; z)X?&weZ~wdAJ%8spkXnme9`3jb7oB{ubMw`eg$N=pt<#*S71vtGJ0&kegj62cK-V% z*{02$GYQxCWQDQ5Gp6w;g{Hx_Xv)MTSX*CRtX6aA|226w3c_&DFQ~$1nLK9!HqX?V zb0+?VMqBM}9dzP=@}Yx9V<7b#=#=}?ZRJxdD=KErsG5I(h}-`~^|pDPkEANooT*c* zD&{-*vfBa-;)+=nmD4I_PhR589ll_`lj!!C0i(y1$NCH!GIrDecCuSnmgPRLs+jD| z>((VOm)Pil4lpF@W>0bOrM6=J>&$;8{MW@_X&cv-^XDv@TooKZCSYY1S5{1%QjY#D zE-9Ze5zVM`bC0a5?a`0{!;ZzVIAGMM;iGscR-v+4lM* z$Rn0dg+?;_U|k4$fa7@a3{2kug{e7{Pq$TCGXl)Q6ii5mo|TxpajP}_Wg{iDHyW{NW&#Y z4K(1!4jnLTOt6=xA5=1Kf2BCWxnWtCHSX$xC>(W^ViPZ!> z#+j8B)5;g1L!$^&aId{ zW9p2GDgG|3z@VQxN0MH1mvFG~ke@iM>VK@L9G^_``!;yjxGXCpGck7zpUd!h%t1Bf z`edzey+?deIppip8UH3y$K7$;A{yyFpwmz%nwc^*EtHe~{$i^%$Q^)-GYE6^xG)*%D8sEz7^6 zu3T&MjBCw(KwY_`tf&4zzGmn9^kAW_L3!XX#$y(Ii@g9>RMY1?FoPxFoIcZrv!6?2 z8`a*2K;5|~$Q(R>l^q2`_#qg_4|N^zy9gt`^lik{O%8P<+K~8}R7d%{h`q!Enni1w-CY_Uo_OFUoX_XC*!Dsi*8Rb>B}&i<49wj#Ml{6gfbO8NsGI@4c(-Aeu= z#XjORaiMs=xLV}%WY%}L_^9~2__6rC808aBs(>hOFhQFLn}3MgAU;^_(cq z5EqO0irdA%ieHMqiu|!E>p4{HC{7g@h&G=+@?9zWX7NA7C&gFA55#Xp{s5EhG#1;4 z{JAgv14MogoOXq{Ks-<6ZzGxh2XU)t^TWe$^Rk0WQv7@uh`$qU{&l4DSFx<;W$``n z@8Y3&e$MnxB7fdYd#HG_X!E7Rf2Qoq#B0Rc#Ye=K#COFnMHlA+*56RHdCg&Wl|4XQ zC0;MSC4M5N;K!h>XS6s;tP%qqx@y_0#r5K~;!WZv@mcXt;;Z7DVxUj=k!;haLqEQe z?c!%U>{lZ(PwXX{&K$R}6ILY<_N( zv-!EfzbXAA@lz7@e=mEVX!CKyUk}$bu5W!YhlIbC?0m7E{9R;s7fa+~9diUn{N`uOZRr-;?Oq-SV6M9LhZ;|I_k6FYY8!ZkN(Olz)$C z^LC@YpOr6)IO}gD9!8?P&C89r&C8AUY+i2g808zPeB)$KB9T5-G`%^*7s)?%tv|{27h8(0MVrqX=|!@;lGtwjNz^k~944MZ zBL5_jKlNt5V1DoU@-G(8QTjzf0pcq;-MtgCtvAZ$zkePU3&rW;oubXhjqJBvq(qeT87gzIIq8iEsLpDxZ37m7>8v&8enOU0Gq zE#hYJ9+5L+u)RmcZ6YUuq5rSq$Kt2r*W&l0eJ(`)2tTKR8Dh4WD>fIqiao?*L{8Di z@`J@;;#lzn@l=uDYhr#*Mnj$HULSRu|9E5#+^nIgYa#c~<HdkCtHtZYK-cef*_?EUOS@-Rcs(O7F&pUBIk!<{!U^yv6skstC)VQI7}QRo+Orw z)5V$M0&$7BLOfTzM7%;=FJ3L)DE>jbL%dtG$!8INMD|nSbK*|Xo|hp0mh9bPgwHh) z4|Mq&$hPMv@VAhiC$<+miQU9rVm~p^=^G(?j96E%Z@T<5MSBi|c9+OLTRdOnWLoU+ zolE|r7 zS%0OtP&`{aUtBG&6K@cIFK!c`5_gO5i$96@Rj;*|CvrkNw%F0UnX*TGTL{F_lXaR+r+2D7sZ`opv(7;?2p8~;@`#Z#Ggfbu7!5f z`Fsk@5(6E-=CT7FzqYai9lsLUM~TOXF>$asQXDHz5Kk337aQBZK)hUBEp8O!;w|E4 z@jt`|#BJhJ;)^0@IAlA!#CODx#JwVZ{%QHbqD^^M@D2HQi|>n{ieHL9h(C+z zd_IQqSz=@H5V4KeUaYIvS0;adk(1)FzCeF(vFv5yIpPIkpvz~^1ySxA`L7r4xgh+T zW!rN>*bm9xF52@!_+OI!vS`l-;kW05;79WB747*T{NKyw1b*zlJr@Kyc^~c0VjppU zI8qGs`Xt#6YL-Y}uEHSBUGytHoQy%_1ibWPjcg?fD+;FJ=EA{w${P`4-YM z#U^4i(Vp)iy{&9}z6aZ$?}26V_ZRKC9{giupDa!kIf)_LTP0pE-YniO-X%UF20DDt z%6?INReVGIK>S4fR{TM9^;|0=HV_+&oKcbe>n`>d`-+1^d#;Ck_B;=?=Xsz#zXPk4 z?|kuMk#jM!{@X>)zDRqU$cYze|3&2VgS3AXIa4C-`XXmTq;J@H~wZCbGOeF9ScIjcW#{Or*a?iS{_jA@kiS)_vZ^=?t0vo@mdxVB2#pFkR1k zvczU$OVOTdA)h_h0y&8x>l-T8)vH@XKl)|Qt&s0x<>OR@EEg9!8zJrBIn{HrUlKXV zAk%+Kzpfsi-yprd*j#KSa#}&A_Y^s^AnjoyXAPu1S>(ilw9gbdcOdQ6;*H`T#5+i= zCuav_zCVhb2avWscLF&TAnh+j&csC9o-=`Ub?S+E?F z@^i*M`UCws&dosJF%l!EY^L_#ozC-e3{r^93hSo$BPrhy3f0&%g^8QvA)IPGI51?u6Ut%skmOe zTD(rYNxVheEN&6+6}O5Hi_eHJh&#kr#Mi~Q#E->K#V^HgM1FY@)g6uIM0Jzn2+D>3YM@U9YK7=a>``C z9`pBQ6WGkd!1hKX1a%|oqpq7=!6XaBX9|^at&(Ks+des8fRtmB)ydAZ;1! zihTG>EZojqoEj}PW10J#IYIX0=E2w%1QzQWSd;bq|NFS z55Ts8GZ%jBW~-0&v(2Po8w+2s1oh!IZoho%(Z3IaOkj`?8huB0&Z}J#8hzdK z@`}yv|LCCuiR^n z>fdxj+N#@{zFjkAE8M;P-JsR&zpX#ozx6=92IV-exMabJ2x%%SRn@)6fvkh+PyEQ-EMa{qP+LYC)Yto@q=v}p| zCS2Ak7Fx3l%6v|H=gZetIIZ8Vnf~}iv6ZpxSd-XWHBNT^K6h%tKKDXzPd%^IkLUg} zY>(&V?`z;3H9fqiUZmBJ=fD%mD%{uLu(xW$BQm~9%_!IxnVP>Za$(`V#?G?oD3_Jm z{f4{y?#T+Z-q*MxRr_AvnYuCMs`R~HN@U|1_uPf`><*Q_?ls{Ta`t&syF<0FJJk6a z?aR2(+ZS;f?F+XKZ+!EvyRh!ve+Ykie~t5a1o_}cdKS_%knVO!-*Fc-_muTvZ^G(AO#Oqz;Vj z2~Bl3q<&MK+NEE=J*i&bn($GLV(#kbhBbYwzp1$M?N8E6yuI7J^fgU6KEj9ZNZT0Q za5A;?Qkred>3@f_3Tlb%R(N}(87JRU7Hf7@hnUlPL``__Na*Ah?n`g&9`*gs)V)z} zVr<$2e{PWaRVdZ_I>k$?agQ1@;Den`UZ$zyHNTK4X%{xy=jOlJpf<j9A*5g&#&&-~Lgv4I51Z4~lt@@muB%`EJ<` zv9KG%0iE$Y&J27pJ3ctNEfJacRwLX#moJY!H##qcNVP}rd~XBkJ6_hjP~^Fk?? zB15PeE-2v5U`jahXQYHY_@RKuYljz3xd7KYFEw%jYVcB1HlQbg;9WRn60(H&-QGw} z!}g3*9tIkC{TP1$1)+gwudF*VPjL>OE zckEE;XZ(ZK9pfqd>L<1C*26HZJGPrvjBY{eF3R|?s1aIs^gHRL_%{Htddx4ayIHU^ zd0B(j-72_4kSjX_8xvZ0_J!qq%-ia*l1(0qhT5|7JDc<5POZDk;KK%e7$xd69^$uc zp>@X%mCY%SsdZNm)o1dxB(&}rM;p?*^IHsO^1H6ky7SG{%&*ZPwC;Q}Ba?4d(@L8A zW}tP~z$&8F9hG^~ufo5>;Ief?+Y3=6weC2}MP?he-80Rvz{!lUzFsoJnWZQSt-GLc z(+Vn;nUQ%p`*O6*?94;h)7~<3GC3IuwC?<}P4Q!Tm}N3sWHx2lJ~H#1hP-^6)*ask zXU@Q0h1Q+D7sgiqBWoU#M$^k*;bz{% zg4SIgxEsZ-Kk^Jx(oKj zV)pBSG#;Z6zRG-qO+6?xp>?<1TF%a#!^{tB6gSOG=dRgqTZvkCw=wm}L$_fohoE)0 ziM!_ML+#}owC+sj>bcB@=zJ)@U1mQv^n6+;GZR{OenSbZJAVZdT6cb*OEZgc4+gEf zE>^ZI^N-vfuQcdqX1@mIGa;Mzmj-@S{WGU=r|(jqhh%=mk@;r&=eE8hGJjwv-)Yzv zpw`_P%=}))608`sw=%Ei8oi&zBbZuupRu72G}x$h#}2V*WBbR^(wN`zXiPu$%TOfM zXHt{%P}0}B(0;LKldEA53M^tePAwM^i%83*U}r3JCvIdT6cc_5xH;B zhSr^Z0R~!k18GC+&R%dq@JIPFT4m)Wr)-@7-1{rePAK~EuP0C7Fus^@H zOf1J?Tbl{xDIjNOe~v;sm~r~xaXC7$aZ;zM6SeNPV6B?AMS^MF#SzK1a|yKWXy6#n zy^dQ5T6g{y4Ci*^`a|nZBLXdQ#Uo)>-}EfhYg%`ESk=$?N3A;=tm+OHh1Q*KM|1gB zn_73{&^yz*W8_CT)oowvt~Z8C?$gW)tvg=LSXGSnIiZIBehlZ{#TA0q9Wztwt}}ZL ztvg;OsC74&O+)L>UyFgcCKd^;yNj*95xIjvYTa!@z0|t9lj90ncm4r4J(p`otvlbI zo7;)`p>^lmi*rwAd(gTYhW2?z&*iF6>+TeDK&|yT>+U(`fYzPwfYu%7LZa54?||0b5RN@)-TAHHu~YhGsGhyD zZ3?YB+U%6s(7K~NJFo+-yQ|>Ht>iX^)*TIQ^R_(pp>=nw+0eSo93Dur zeXYB9;AnmxR~}k-+_}xmxUHad$5#FJKMx8)>n;neK7}8&wS9ji?U&8-3>GoQKB-BjdqU1;607`5*ByO6w<%-gCf8mVr@ zFIFvY#jmTK+3HZZm$l+oUe0J$AAV@v+4tX8xDmc@PO&5IJhx#S`Rad6&t5hs^}7_R zp9aErxMM_mB>b)Y{}KONyA!!qJu+POfy)py!NrZ_;KflpruNKkhNm8QrsBj9@~g2L zZm)*h5q}urZu$zD?uvd7 zg}sx$EY^37`F?=?Eqz}wUs;1Zl%*EsAqe?D(AUR&5p*0A+ByaNHj~>goB581%{#k- zvF2+^-+So(N`y9xyE<l_8?VkSs;JjU6P2nAQMOR=WgvGxN{_fZH1leo!ZdGu|D&F>GG^xd)6)CyG1pXiwM z-9YPjdIml)AQad%e1qzzAbAw*ZuA|CHF5_vrmrU+A9X?~;BIpVHK*@N*!-nN!ASER zMxTc_m*2x@@_mD?y5r#*j$lf5gBvl|DwzDOgDKe!&ZX;dm=Dsm1R{Tft$x1!j35;7 z=XLIJIUG6NV0Wc2oox=O&mDX^>_PNB$c;ZVi({`h9@FrxW5L|zL(6GN8g#S&p>Fq5}Pp#eQI|WH+8Aogx|Yejg*xL?Ji&mIjOXEGlJ9h7X0Ju zW53MNewi1M^n9X>obSW2+sZtSG7A%Bdi!Nk8{jh+g5Qput>9>m;I!S1e>Wt`9OIYi zha`UYzP09u=^)+*9cZIe@~o> zU=_DQgkPF3Vqq4uiutwq5(GRbU5JY558E?SOoX0&0c*VxZoce17NNsB7^fh@x1Aj> zf>DLYJcN$LsG`#rc-FyMi-4~Ha1(Aojh_AI8zR?pvz}(H+-sYV>sEv!=3%OB!zbb4 zm+w)YJ>vT#*Zyy2EW^z{41>XXwF|jkN3dRffyiex*sCx?2%(6jSQ)2;7joxobzD}JHBBLh>cM+0HS5YQuTe7?Ez67yM7bZ!&Na<`t0a1w%T{YpgU z(%^2r0O34@B9`VmuM+N7)kxbj@56|>_z3xPP~+9ewE@9uybBTjzQAgH3XvxeiddTE zf*QHiXnTn{H8Cwf_HYgg?n~+rzJXv{?Mp;Hr@^fjX^cV$MJ)X|Yvlga)}rk>r^0k| z-K+~(8@E<7~l<-!g>sk*J)?43a`1|i3>2>ysdWC9HvQHab# z=*Tib4|qX74HqNNsbNih+>|Kxb(h27?vR6j>rh}V3o*HbyHLaL30}c$f==qmyC=F? zF%A-TeGBs6fl$OeOttPm2hTGIT5bAq;=oF{C%ak8gR<`;$J+=UnPTOBfc3qVvqAEL zmE(WAhL*e8J6M*3B&!KNJRsOE%}3-g8XP1&5b1_c6qM60?aDKF6qR$32eNsgC8nsi z2t`_>6HHdpD2Val3q+jBAk-}c8NE{0J$GbxC)7Puk4DcQ(6LaDP(5DedYOz~uTUBd z+#&J$b<`|e%S=X(PLIR5CqI#eAfrdaF9R7pmEq0BQCH%c=)DLnyX~mQ*E`Sm=R(wQ0jdY()0NN7;^#ZV#?& zCt12$WjkL4uQ;JwXSGVru5-e>znWc%FM-#^7sUHdXxpXss&|yc?0W7mb=PZusk@^N zCUsZ(zpGvMcOLN0nXfyHe8-a!wChOT%Uc4^1P5OZha1WOL_6g6<>(kIK|lh*his4o zA<7W^JdE|Xgb@Ur`YkOxw(PfKdUkw}1pN*+;@3Q~6j9a(FJT`+oRKVc@CDaBQ?li z?Tb}T3*_cXL71g(7Mm6u{%}$roMZQ2R8MMBp43DR7uPFn``^;MV`2%ipp6W2JOb2E zh{5O{W=bc{M@T5$(O8cFMUXAkjHvw)XF(Ps18Z$r z7-9F}C%A{ubT9_kId0BUbK7{(_QJ>1{TKBmJ84^R7umwqM5Cdk#l^<7Ed;?7q#@O8 z4|n9qZF{y1Lt@_}=VK32hTab2;jg84(Q&Vlj zO7N*xjITDvDPcoc6Eu`8%*Tzgl}_lo0nb=;B*6gbx5aTrcK8Og)DU^aH!9lvfK9)@B9A6aYnxJjiqr$xX(~xS)36W%gsoI1Il$ohM#F^oDqI+&Pp&+;2X>1 zj4+@C(a!gW;*1pf#jIc1zQKD`5%F_`2L{ESd8{Vt z2@c#eXW4S);gDrWaa0cn=t~G`PUSM?p~=w+*J8P7G9-#|VDgAa!+tAy)y{&0tM%mOImwFxg=k zOOg&X=(g1!YL#as9ctrh54DAEy!KFAh;g6}K~~O-^L$@s=lrCLFl<|RP4A6>yO7o> z#1Y9e5C;*j8;l3n4908g8sV2`Nk1e;6h@V;HQXdVaw10|0!7#$rp9O)0!|i-f#nDg zKN~__G{(=jq|pS25U!68S2J=c0*zu}2*rcqtb}JDHhsl5}e@;cOJW+=?%&PP#RKZfGz*JZIUNNjq`^GTVYx!1B)=3ziZ8Sb{^|zc~!9 zwoDD#eFt|Bw+MMYSK1jzZ1tnWZa+%!t1QUCp}~#MaRzfnDNxb7|gyaJfnZU8tAd#3T$DQh*4vP8W$`-iL53aU< zdzHMJd_0PgOg!#KiQRsb7=gBsq4qRWTQBSL>$UU90h{n*t7SaFr+&D0608(af;$A! zFp%d*3xElJ^k6OW6~u3?i9Nz~MiKrYHj-d7*ayTUt9R7F>gAmK_cXiw zXzi8#l%OyUCuFxJ4fXpaxBY+Yy$75WRl5FP)z#gThXDo}B{d8pX@(iHh&rTML`9N{ zisT_ko*CjIAPS;u#z1f#)-~%YhBfP=h`L5}%{d29*R(o{tN-VD>#6Qyl=bf3@W1!| zZhhv=_q^|kbt-ms^?5A&Xx;#Q>_^ktM=LiD6CNrY6E@TUC%HY8@vesRAuBwN^{@v& z$rDt?Gg-vG0`S*;MEc(NsPrxEaY1(cE(z<%{VsIs!uLN|&Tfy`4$~TtVggcjPO`NHRYs#lYK0~V5dPw{3GR9c9S2H zaQjOzSQbV&s_+McYt@H7I@u@DewJq>aX11yA1tmj43$?Q;P6d5kA{Pt3=NKJs<3m+ zIVPR+L^wEgCq^M~;!AxvMw&BKC-zpmgXEbahI^UbxI;sfIYTY`(}LD(nTHnh@#u@; zMQ#*jlzj~K58vg%QLle2%6vSGVt6=?qKq;pj&fpbn*QTh<{Ye)d#{qDI z(Yk_v@ksDN1wv|hxq+LE@CwWjI%=a?fwO-0j8qCP{y{ZvgeT2a2*~~|uJ`FBLN5cZ zpMf{@#awz9i@MC^UsuvOL(bGFJ1%qiIa7O6=sUUeX7ns4&nBVP!_L$iI4*PfIa7N< z)Ev47q&jaoeP_C#dp~6bQ&}N=-|n;{x~}kdKp5S#dUcC)TunEIP?`=dWge0 z#|1eZmqm3p44j@hd2am4wsW_@%ao8JU+C+%^tSUtf`dn;D`rvu?jSYJq3_zln~AyZ zsn?LH68g^6rVo9wmcGCAT;|$Zzj)f28UW8_E?zl)GTiP1N(t@OQI}bDxeQh->`bj| z+PT-uk>~Q1vIYTdFT_g`sl|=(&WM-MpY$q1F9SsDgZxo*@(T8o4Hlu7AuMTVjveMq zosgq0bNSBH6)@~fwbla7A}bc2IsJu~j9}quWh}x}1fDa3Wn9P?_6LXAMM&qqA1vG} zxxc)O@Mg%*4Hj$~ZjE4JoZ(3XZlPcqgw9qV3`O82B3OdU1usH8{|5`>3}X;@A>eJ$ zRD@ue5b|*Y1`Fd1yioFLw;X{RH(0pQIL0p`@D?{%g3H3&@V$?~vp)lGSb0SWFX3^X zlF3W_DCTr`=jYic4&=p}yT71`A%4NYv#_KRh`7oC6kr2Csj_FQaNR8pJcbvvOdN0dlb)}c;eiu zu}CbQGj~p9F(=3$3xN~1Gi%CR7T6n;*kfbzSE;in)=V#%&ZBPf z?CKfS{Bi8A zl$7wZs2P0Y%NhS-XbyYW{SE}Us1Ml8Afip6A1L*}Dyj$OC!r&V7=-bt z{8vvVFeknb)TEXqky1ttJ~z1v@>WHSW7+YB5TMG4ms%7N2ou7Wj^ucYN}#@%#Z29( zhE;9aUX9K*X+9GKv=USjY{&E^E;Orxx}i82%cdfrlF|to@p9+^HaVW18RRWypUbUh z$g=w1(XXM_FZRY?J4DLWt+ekS^$MdJi+4MsDW$rgqZVt>HrB99ENA~%gXXcE{h;z? zqu3T=h3NU1Sc8tx{3;rQy1mMpv?8ID03kI7^|1>jJh;nE#;2t;3MmXo>9d`_^jYIn z!nySo36szOt1fBVx;3T83X)dp9lumsFm1h*&~}(UUSU@gWkde!rNj4BJ^z+KW$+0< z0bPZX*)@U4;0t*}tjtAYE}Gk-1qwA?j$y12IuLr!5k3R zzd_HtJ+EJSeRn`T4%_Vrt0l|(*e#*{9yak~A=$t(U)isu)ED!kDrP?P1JP91#u^kT z`kD9~e12|<43>6g7Ub~7|9&Q~FG!eQ)>0YSeHIAQ!~&bdnnI;7iJcNUdriHCB@kd_ zKO4*6vT3Yoi?9z}Mwyl+v6euWWW#WpU$hW=S99-g98S{>Y#H}fV`U$I$;Kf>d@0;jfdRJeMa}&n9#^oWB<*laZpKZ1?LRx>>$tJOV{83B9 z_UULN5EAgxA{;mO~&?tcp$_}_Ye$39cisU$Q*Vm zfyCc$SMV@in8Z<>>3y>t?zF^Twzu0UfvVyqP-V>ZCZ**5{$-UvsY~@<+{2W~{?};! z{j$IxG@1HPZ0i4X{{D5HKa8QTwN?eSF33enMDf3+$X`m_&m#Z2tlxjGmftUYF6jF6 zGobKBbo_sX3gADZ{b!1SgCH0Jar~+4cK|!8rGVVaDG(Q) ze{2b?URK?%fv_fMf9&b4Rj9yi3=ZbvX%JeJ6 zTf`mW8{(&8TRv<={;uM|;t?Vrmoj~(xKuQ~0{GXr#~R)iYvr(#Op;)0>gZdiZ6>XJhG<0iMXHGQ?z-~k$#kH{`Qsm z7l^CH3&kr$n-?AV9+v&0$lu7a{C8pweiuu-g;*>u5lxs5KXTS<(`rKy!Z+U|NF9cihq^=JJ~;o z9==>;etb)0=KJRUfjIY*1|-TgBN5uk-$5*v z{{Yzsi33TLJ6!2wnUeege()&k#B56U#Ltk={Z6E~3pN4u4;kOsD6ziopXvP}eXi0? z_YdVb;{eN@ES^cCJe zpO{#Gp7ezLoQi<`Zcn10T}Z6YLGp7h0;X5Uf28bD;y4oJrijzUB}zX@wE5IgkIknJ z20DNjE8X+}QIF{Xf?HJ2ZQ@H(R2Y}m(xc1LE>ofI1=MGlSIC`VvYPK$v#=+6bP*6e5Knw?I>sSw1Zoe zj}soSzI(;{#fM0=7tGiGs_ZY6{-3&9(UyHuJnHLmy3tV zKY~R2ljNT&&Xm7K_G0lA67`-go+VzY^vgs}cEJAJDB3*lux*}q@P7JH52rsMpB6t8 z|{?5;;cz^ZiNuR?NcBsOirW@o~=D!N&$8R@sQd&Dcz|S8vdt{bY9( z%fz1IXp!%&vH#=6$>MBrzPMOiCY~amCY~o=C|)9N7ViqPq; zjr^C&=9EJ0{~yJB#rs80FU0hh#J9xvL{2rt^gy4GuVT;+^a(lb5bcA+!Q!DJUwviz zXfeqt7 z$zLLJ5Ec|mT3jZs6gkxu+k0R9MEqQ=6TcVjxe4-T zA+TH{v8mWvv{^6^?;^WY#INS9+(F_Xku#^Uz7Zm4^|GM~|_>uU9__fHXblESD&u_q7u|Q0S z&BbO$BC0gP8rI2Z0$rGJGO=n!0(&?UT3_69M~BfM7jo#MUX!-iIZedgT_Z8cU?M2R+$8yJuQ^ga-`QifcWO224rg*MsQ%<73-^#vLyg{t5OK8s< zk^d2;?+~9AUlHFBcZ!^4lKuXh_^rr$Tl#GpS};#`L$QUJ6g!ArM9vq;@`sAU#nIvf zaf&!ooGboXTp@ClON_!seI@pbV7ahLd&SSQB#91!(qi4Da- zudsz|&XmM_fnH&;?E245%jFMr3lEn)Ts%fRUR)`jD*i@1M_eynBHHs&^y3=YH;cE4 ze-Z=z!bfEX`h_pZ4)hD(mHnY;&q-0gJtqY@t0ULjo{NG_W$!Dt72AuP@satD7RQN` z#2Mmj(VmAQ|65IGYj>)#;O*Ezgi{w?C|;@zS>_eA-J zWCwbOPs@H$d{ul${6OTan`}QrwCA0$8_V8TY$fg|b`(p+9^!%GAtI;nWc|mBlf*y= z(Vl-I-JXAfiii^Zwi>t&yKk*#d>%@)XrQ#LhHR8?UZQ_0617h$T^9kAZ z925O{S$6O|^F7%gi=T<#ihmcQe2$0m_Iwj;DBGTI!fq+Mjo3l#B69XrmLDK;mLuB7 zh@3T*_AJq!U&6NMmtg(pmYg1y`Tro^A>Jc$epIGEEplp9+8>JbbsIT1D${dCPK!#r zNGuV%iJTXe>Aw;=_bKh*`D3N*8RDtpTG5_2BELOv1TU5UGVu@MO=6(q_>AmN#LvY- zK2JkE%|z2}#66BZFND9F{G2n@`YjG4k?#cA6U8cVp=i$ukuP{Yc&_}v6R!|C87k|) zOXPg0w4V|=6DsX@MNW81`&*IkV9?GNIqfO!B9RlG((WUgjw9?NWOH^?rrYyBkQ1EJ zUL`Xqd1NRYIik#Du z{%+y{B--KRr1T#yatcz~6GhHKN}IESlAMT?{Ec{txLLI4he-dU?1#ihMNS{e@^6To zL6r7aA}0~0ZO2;y7`VSS>CRIpZhuZxnw=qF&DG zN&l_l-STr@Px_w}IfEzdcf_3}%5xr1`u{F+woclOL{8XAdw-F0cGB)A;^UsxgVTih z0V5tW7}10gw+Y7j&smf5w-Zan9%3J{pEyK3TpTWr7AJ^P#OdNJvHo+|mGYk|o-1A; zt`~#nu~*B!Ufd$yDsB}Y6dw^E7k7xyif@YViXVy}i*@4nB46_2_;aoqGE>YIgXgy` zWGBUTVyW0etp6OhT>e4g5bGt zVR!0Wh)Y_0;-pDcl?%hE_%UACoQPL3r&UUU(l7H<&n*64QZ+)t(kYodclK<)3K|ln zoQfZ5A`@QbEtyzTQ#E7Kf*Mr&Pb_@D5JP6~%duDw{tGP_MqAq8Kl9-+q%HOHF^$Xq z2$=}Kl&=(d>bJ{x1cN22NEZ+vZJl!2A6H;D9>j5&<84Aeu)UE8K_3uxR-&$^IClg~ zkTwjCaDCsSzN>Ms$ohEBV4bXw@Am~|5OprX4#a22!4jm+gCmGDE#AU$4r66ng0xw% z!|h&v6n&u;qcPNm^{^6rUs=mt+56U3wywn}_alo_$X`5k(>-!!9z-+7!hhwU~ zEr_!W_XjThaYF4?uRf;VjS$YaXb`TYETDyH43CI%JD(w6d0>DXXD$ySg!>nrogP2j z3Z(k?9OBsQ+|0I=4#u@VFhI7+g$#}r+Eb9P9L@ydjS$#w0Rr0$?MBY!*#GdCT7vp; zJGe)_LiF#wRIYTp(1+~ZCz)P;Q6IAB0X=$H_FvYAoHx-L{E0r~h5;9D$*ahyXt*x^ zOtXpuDmqsrDq8to@9PS-mVKN5`0wlT!CWvG%m%Z!e)M$ihWmH*ua4}xKN8=yE#A-+BKN7t zTbIA%W+)hTUwK%oEW{!OZs+!Okrp1}(bD#H(S8j#Imy-=$F(XP)Ucvk#gE_o@MEWn zJ{4^&)~zB6^+qR2Z^KP32hD7?F|*OS#^*bqWuKh4A$OB|z$;F{d95})@ljTrztc~NrP=7oaYLExlMQ6Q+6!iM^ZM#>y5AHtY^n;-a$=qlgA$r}m z-KVb^Q>0&*f(B+pQ?6sXY@a#NHb>BMv;7B9D_deIJj z>$O2{{!5b`Bnp**)@Qg9utb`uv--*L|Fm zwQ11Kib3vy(JvcB2keXv$XYja!iul*Zfv}%^~P76eFwEZzZJHAtMeOiuZ#ED(Qs3% z4P&W0ncI4!yQ?Ce+;o-mL|x|A2=pm4@_*YRa>#EgE~&We^GMd?w>U*k(rM#d)UU2+ z^8s~56S~zEt$b+r8E#M5ZudtJ`~85=o^~#UN>0`n6_HJo@7$IX>BcqTdUURf9C*v% zm!587%9M9ue~5Iuv(8!h2*zZat#6QP+~ALQutlfK_NU*jV4E*~fVSHuH)5Q6V7w6G z2$3EcAMlqE_F2ac>8RTUCz{-`xZ?3f@B#cY7=HTXcmvTs^e7L9%X9-io<9C+Osr1dvyjErw`etq(zuAXQrEdm0l^v}j>QwTDg>1gXz&8zS-EiTe z?k9CBpM)=uuj)gm(yzeD+n;7%nbEwqC<>j*pz)dPXg`^`dG|+Q9wf6MuP?iHu*||d z{-^;um44Y~dGE01a+xjiPG{NvGLudt-qM>+C1*Fwy9-+tI+cub)ZbvuhiB2Gs#)HL zOde({20Mbw7wi$TPleFjZ_#!af4RM)Tf4 zPqHRv`ErSwdF&W;Dmhrvsbt03e5HUvEkHI821G{q6)SZrAAp&c$(3B#ka0HjIlH|m zXb78UFzPO#SRHjL55!7Jr&0x^Q>l(gr_#4F^Cq)jcV^ik3!O@nkGxA}N~iK7Yq=ng zGXX)T(l6UA?_HYPY?P=|c`D8AEni0WBG9S)FbebGmN9+_37yIlIk=DJbuzO<-u0*w zI+cUXOzBkm4W)D{{S`>*RQm1q%R8A>{iWeyR<=BkEkLL8cr#Nvm3~!&^44;rzpOqV zo_7Pc(kt05* z7HwkxxVJQ^atvr}s(l1rF*|QU#Jal?|~H)T#7OCFKduDny-1KmVY_K$eG2rJp_|kr*bh?)hl{4me_}NLZ@kpku?Gb2^D;|ro`euirUel@M zL$bs$xTsS}gH<)-;6kU;x8sQeIC9Xb9E0AOP9-CakXhaKbt;d>u9V;kQ>T(wGgieH zFsM`MZ^vk&hARY}N@k``956*1b;Y`1)WM>)N%AB_`rZV zmD}K_PUW%851mT?fSaDUob5rU(zoX&+A}|NDt&u#VmaG`P9?vf=NUcGpBbQ2xzHTY zsqDfUpi{{nc(~I_oWUH>sbm$VQ^_BRQK!;(K&O&#k5Q-6cR;7I2L}*3mA(TymHe$G zbt-)abSkf44(L?+tvn8$$}3Pkdu3w^ol4s5l-ba!q`fAv1D(p7;7Ii2m_nzL2FIM+ znL3sCn+=^xo)l?VRnV#A#^He^+t;c58jj{X>rkhX8@D+H6{%CnR{i$*I)D{|PUU#C z0-Z{_q({l~7Iv^k@Wi4#&|A1X_=01hpZO^Yo6UW2BqCN9^dw8U2GFTw4bZ9lm?I9I z$_ZvhqES;Z&5VA7-nBXm|6=aJ>=JY;uSG4b`F7TdWP1#$lVo4rWGyO0y>sBAPUUjs za@~x^^h!>$!JY7BoQINurewxzOuoQv%yVfh%Jf*2FBG(KN1-0~AYK9RiZ2F}i@OLP z$lGpU%E1l!9s!>TRUowe0y!l4coyu{^wlz7x#fEp_WktnN33rDM%#dI5Wb{u7gu>e z!}m}h?@^l|w9UgBy93R~d&UFk;|o~sAoINd`!5JZ-=P0)MS~YnHi76j^qo!LuL{_| z&gfQ0grary4Kd#Y*ay@1Fnxy>u-zHxDu1_FbOZZ5)O?4bTOL9YCC}Z%%y%?4;sAtp z^A>4>n*1 zLeXRBmV2a?;Ev5VVv4?JFGt!MPDM}oHc64od?TB1t@)P5-|35+uQ`1W!N<2D+AW6c zDmPILUVP8D?!(zFdw9gdXb~8V8c9Ioe|nCLBY{husuzL z_B*ik_-+6Gd_~Vqx-D*p<3Kq0YQX+?aoFVKy8y!woc4A2$8Y%eC{qmwzy9wKF5|Qx zj;+aW|2tUyZT$NEJTjd2>yc-Bsy?~b!oi^EbY} zEdj(=^FM&U>$&iD;#>X~!MXsU(?S@0E#Ml265iC7J_L{2<@X3tX9!I9rQB9{;%M#i z?ScE4oe9?N%dlQVz#y^RK`7?g|6%O-Yx(@%zZ2X3D>8k8V11zCCEqNtKD0$7iO`va zSuE(s+ZZ<5QD*|`cR$F#gGCykvI7w5Nh1P-Kb4wDgWsVpMr0vE35%2tMzS{F1XScX z{67W3-I@Chi*WO8LSzF%=OEEm?2qv9M^aib7K&O?KK*q+$sbaH;#{#uk?9cxTd{W$ zd7B0Ym+ua+mCh{8Vp=g9sadSX;s1GzeVR{&m-JT3hn34FSWyuoe4(IokUcy?E3KlH z=&1Wm{>v=F5#sNsdePtrO+jQ54UW(fL>3{Gut+dM9O|{G$g}@vv&y>s&UlDwm7R_3 zXREb4BA&MeGgs?c`%%UO**AaTFToy5vG-2BDV4uq2RXy1nVV^}*8 zpmoT8T#aH;XA4ZI0OVgEbb`N}`VqOT6a0D9K1^XJN)h3E2_-C}4wUgC#d$+Lrvtl@ zbYpKJOV@R9cUpsg{Grqc7GiSgW_Zv%3-RN5wzHUp+F(vLc+!PtqrglSVzLT#yA36u z#lZAJ*6!|bx3s%E!aFY-@9vI_;1PSbtw?_d=|}tNP&Gt`2oxufz5w4CJ+AUW*^C8F z8Rl+itMX3IY@AplU%OC1ya848x&Wt<$Tx1T8MmRgkvcb*C+^;+fcTx8MFW>`Ueo#% zsvJD?i?u+K zlg)~F;;(y zhwEvE@=BjBGvVgsK&~$5fE*XuvhtA4H(4s%bq{S!e@+|7)^^2pJh$;4`SZg0`(WGV zvq4;@+nda7L1Wj;57&=NxJPw7Gmm}C#LV&jB(m*W29+?_#`PxY# zFr06{un#vbIqp$$*15mR+X$$9hp-Qqjrv-Ll1Riu(6YuV(m4lep8VL{g#w6j7N-h^ z1sO}&G|ol7L}IBgn3&d6467`5JAIXlddqD8>3#;Lf{$dM$ItpHVMSa$!}^Cw+XH*; zDVW$>t8S}^6G^zhp^g0_)L0BjF7{0XJDqj|+y;iz|4sUeICk&}=A?GyEF6}QQLM9w z{qzV4BtMH-0y6z%!D$WGo#6!Uk08B8w6f?3f~EH^nONv&B=)uFQG{Q76tTni;(xsb z-(91%k%XW9m~d+&YwKmVFLN;?J-^fS^AE3|<1?P#Atl_xBu)I-UU`G0S=Hgu_ z@tNwiwECtJ;DVUF`VS4yh#qAL^$+VmI2n`OS7NO_iZN z2my_qyMmGF2ytiZy67?MqP#bHBuHeW099E|M%p37oiXd8$F7SqUK%70Lu5{1Fv3a5 zgPe@73KBUme8{#(k6@2Ph&#jAMMtcQGR_eTY_2&&*j^61sj~zUJl~Xl({ZWT>TgcR zwzV8t?w#Q_QsZMg3AZZt=(H2LIgkiZ&$FRJoF04?!Wj1~e$$T~lXn{0J2E+zyvc`9 z2hj%sa*@$mM)>Ig#m1LXu{($o ze$SAFkuL2(+1;4WE2a$CV>TEFE1K}9u~;|ek%X_TbKE`x@Z%(2nf6z z$%Ej2kxrz=Q(U2ChXz{_Cxy!>Yu6Sxr6!UVMPqir zGm?vdv&z*g;@C_yrXWCKfw&sMbCySI8F|q6b4Pm8_b;wxgu4?mEv;ol#@W075Y!+*rbsO#{y6~a z!HA6IwZRDir@=1Rtm$2QiPQEcyEc9Pu00%i{axGl1?LP@lisy0%CiBah$41c*bF0d z!VQU7;I;rM{+<);AlwytA@Gz-mLot3h!}#yMaDC2Cpwzoc{)hijJVE9 z*Qd@(c4fvx#u$5rvZ&K!26>DpIabaH;#P|uOWc8g{na&LR{t1>vLKIG|4PyBJnlvO(|>>^MBJJYv|+}hyaU~b0!yOGk`pz~o_BI_-0F3=RMI3ep+>8Ud%i&9+wM=(`zQC!RFSV1#QG z6bt$nZkoN~f-$xoFd9Jtbd>-1*41Ht)9Y6-!iPq2=je6Oqt-?FFoJzU>+4rA!Vx!v zk>e2J&T;Fa$FGYr?w{C@GdQsYiR?4?87ujZI?d<2Xa$|eR^Wm{d+YRCWW?RPJyzO+ zc-%pU(QWQ3>?+g9Y}COxd(6=c29NP^X8ZSUjI*Q6OELs^YyYUvxIsoMJhnz6;OLkF zuoH-~++_%e`s>5$xrW@+t1QpRs{udzNM^s%vh$2(3oMKUw+m};0F|;ml=fD_xgG&W zGV8hL=kll~w9MNv?s~Y3NITPaV#fte{Ad6xe+fdU<1rf%ZpH?@N&Y&s<00R4Z2wK~ zZ=BGXhR?;AC8Y0`Y0tfU=je0`xC~(3{M(yRYY|;T|)60Mx)u11q%SySUWb$M9*dUv#pNM)=WE7b-3>3$aOVB{XH|9O4(yeGHdwM7<4=81}S?CTj2c3StckK zad~|6Lk&9cYL;bR`AFsk~BN!|{;z79Q9F7|PPbm#5Z2udS(&o;q89%?QCngBT@$mn*MB0N6B+?)<)U*WR zXD32;j5!667dLG(j6w2s=Jjz?_|vC9(W6*j>#w?X{nemZ2cDgQl{byb>>q zVop#+ip38}mn>qQr7mUKid26rzX+BUUdncTzqL~aiKeC~0YWLN2>;_pB#v(iHKIeB zG)=^spnt7PVp(ltty`hdwrnp};H_P;3M*9SB-!?iv|`!Xh{-P<>uY;qNWMJDmtR`# zCqPLF>TchiXVn zZDvJ&R0_JE8~47L4@oZ%A4$*7PtpTNGUbSO4@!THYT4yoeqYiZfi#=d`k`v|OXPZI zKrk#L-qq4RsF!w5mD{3S3naHg4_Msu{+{Qzeo7UE>h`l@e^oK8c&Z<#O7-khrS-QC z=6a`BxgF6#&wJZt_q_`-o?M%=tCAh}LyeuS_pkW9Z|sY%VTd;e3TW@DK7UZowpKjv zi@c!e9PiEftgnRKE8})Q(k)4%(k$<^NV22^<*?OnFflY}dm+;yvF6;ny2f&gp@G)5 zxU5Sl{&&T`uoRM3Q~>PSxN%_n!D$gw|?t&^U7wReGzJ>NEqvl8056Gg$nlz2Iz^XTZ2;vxQ#D(m*=e_Du!>xsP z`SN7EM9E1@KCHN_<#@&AR%zi~vApEmWE|Rm@HUTo&vO_}3k?V7_LG?7O@}9i%~0#I zI7`RT02I{xk+~d-Y3Kr%pqA%SwX}$%1swe>Z|&aAV<{+l9R<|T(8VjzD&^BIrM8=$ zDsnq`dHu#*&!L}FLIpJpJx*ZUwFYt5IxIC1CdVofa*o;<*mvwv)s=1%l$Mv`!LkTvqJ=fsE3n=Z7cZKEGt;bIJtq3uCe4~@5>@lNmuWPtrkM`jsH&Vc zegWDaIe3)c-34>lugWR50w`#kea?)zld7FXSQV7V|L)yb&y?!9O$iYO+0)!#lBN@^pWQ8RIZ>js41|Rn}lAD!DP7@e`-uoISqU)^VC0j=>cq z*t-8_RlW3w7F6ihg()3s=FS{HYa;tRds5BZMU#UA%f=VuJax{*s%h1ZhQdF@_NoT< zA0`Cm@7?p3@KYB0Fl*wpY77#zrzbDQK2lv-iBX}Hn4KK`;hs3FlA8i)7{HUMq|AiI%es|yPj;xP#PL>L*)e%M1hI?z6i-5jCQnad){PlF?2_Gj^)Bt*;{-hH z!IOZ!X@c=V!Ov=f4ai^Y-TdEI6O3>6q?f48F>pufp-1`w81r~|h!$Qvd?6KHJe!dq z?eU!O12>lE3*_m=!*luY;yHMoG_-h5x0_UZ=hr}R0BAX-h&uE2pVg7u)EGzaE`-?-w zBSd};!u%7&IbyYVvbaXPK-?f+FWwhs`_$%>fu~MuNPZ7@-e<$(*BkTE-Xmf|d zwx9igAItx}n2Te9`R&zVkiWpDJyhgR&uC8tsEB-;eSA0@@L;Os1@rxz4*GMc9dx(R@ z^TgkYuZkau8QFe4qr^#KwHRoH*<873?|k{!iDQ35IR`BW=*b zDLsOC9*K6E$+o$0;cp{<7x_!Yp7NK=wmEQ-|4{iy%RfduLH_BoXNmLWUnYB{xLW>m zWnUm}kpFVoSBrm;{|?#ri1*9?xa=L`bMn6_+vdha|38xdEBWihzssMAn+A?ouGm~` zEtZJg#G&FaaTJMhwz+aqkIj_}PLsb%`4)=5mVb?GnR1_8@U6iE^Vz zq}yD%sLwRR!0GZYRK69m&lF7?4CQ|>`$iJwOcM;eLw=hR7x|u&{fhFvA?{5J><6af zxQL=}WTx1RMExy9{`!sS!JN1y@^=$W3k>Oj7T75HZBAU&GnO{`$6va!-Wg&IiE>Mo zeun&Ki|gdKxo}a==E4PoIdE@M`a{b9sQ4H01@To9?SD+7y)R^QK0Nj(F4`Qq$X6)a zG{BHvL>uKgipAnV%GX~UDh?Bm5sw!qkf>*hSR*ba(e4=}+B5Ah@M78gVH^FIi&u+( zAW`mK67_Bq9~NIAQSKG-P5JrbHs=3C{?Enl<&WUzlj(7>DT#Xa75OtZ+WU*8Vh`~E z66FsPj}Yt6kvmKI=ZXA98|$^Xa=}$9w?@23yoAJhUr!>RX?%fq%I1&R=zmCjRD6m= zxi?7k?>+G&@mmt*{w~IGOHbRhy}-t@18uJsv{6q|QmiE{i^8p|!0f0g(f@f>lzc!~Hs66J!qb#IsbgwmfDpO^oA6778~JA#iU>|b2W zAyHp~M84kQG2&tp$Ixlw1>zsYN5pr;miVl}{8L2JqJsT`>{rD1#hoJVIIVr$78=nd zBQ}qbzXoCd?4<{AKiM6{GO?#POdKhihB3ol3uztSiNv;s>^A~KsP(uH?B45#?y;;0Q z{DXL}c)$3B__S!B(@_2`+4VJ@^7uIn>4BCL=R2U?Rh%GB5od~X#YN(;#Z}@O@f>lT zc!{`Kyh^-Iyji?W{FAs%d|cciz9_yb?i4>2e-I=5oQL&lBsLW}{{{V>#4@p`XrD8Y zUM|}{U&5X(dx5w_TqUj%&k^}X8QZx;+$>%#UN7Dv-Y#wx9~2)GpAw%JUl!jHO%ogK zeJcA4k#kb8A4iJEh{ubQMEl%}c#Z7E;tDa)VzRkF;Iq%e;EhTTw3hCXy;ZEQvGk(+ zuZs408Sy}4iPOfhzh8-_xsABX&$(c>m@jgQ5Bm3}vD8)R-Nk-lxp=6!H;tuDzU!C(pve?6zgj&ZI+)?@UY*3wvuUp!{*d#^xr3L7wvOC{4dFVP5eaUz^eCT21H6-XPj@66Cv5_O+sEtiyko?EA&-;^X2D@g?y!@m=vl zvA%{AXO3b2T8iz&4q~Zj&tH)5Ald!JVd6;fSn&jLhB#ZS5f_W6ifcuijtT7qT21%J zzg2u#d`t|qnqHLsmiV6dvG|#|Tl`V9=R{~P2lt{JhlJQ%>?jtCJ;ejW{$ilr#2I#2 z&xxWvXM)Yil;}T0JX_o-+Vdu)b805$yFsk4+4P|NkBCo;&xvn|oWFtf)Yo9zkIz}) z544xM$?hc%5G%wZ#Zlr|ae`>inNZ(6*``$w+qCMz)8#))G>v-rH_GNrL+nqWt@N_& z*Twh6o#NM`Y0je@KQpj=T+A06iLJ!8qCG!CetUid_Lcu&(Vi#4Z_krJPJ6`qO>-Vx zB-@@F!CocXo*%*HoJh=HD_$vHE8ZmjQG8TwXxnoc@KD)Dh@4=E>88aF za*iR|%S3z50=rhWX|1DQoI;5C?i4vw5bY<$;Caf2vN>N6(*vy`&H+Tbk!a6PVB7N( zFwjU3G=+vL-!PHW{;>RX(VmmQw&x@ur}bfapee+eeQ4YB5zwB8fcMMKnR}T2y!aZ4 z_2m3L^nWIDrXJd+aSoc6IT&aO1#NJ;;rHx;yvP4@j-Ei_^kM%_^SA(_^$Y&__0_gelPOHac(dED1^)ubHxI& zP;4f)5IczckqFE4$0KA9v5&|fkI-K(4iblpqs1{Ie>B4U6T~Uvba9rrSX?Hq6ze~? zI8*-h;w9o{@pAEM@p^HKc&m7ac#rsq__(-3d{%r>d{z8V{8$V$sSCM1aL#BJY?ptZ zHcRjhKu8|tf2Jr)bBqUuD)r_@55&U@9;4XO2LG84j~8sIpO0x=_D9G>_@#WM$Wy=F z@Q-PtNaxZ80k^JBIRcl@%KdHF6mjNZV0(ul1bsl%`3xPP&Q`DlX}^LaTwi8?JbTK; z=OOrct_w(bJF?u5T^s z`wSbO_2HH$Ro`zB56U3wyiNaOn?;rbR&@V67|!)mAMy9RNV;r_to{a$$H zjnA&Z!Ze0k#US78gZ-IW>gT&(`2zpD$X6a1Ajg@@y$Ip{t(=e^Kkhcc_IMI;Z1#D8 zE$t4$y>wuJ>>C#{I96znK|Y>)vD^GZO_r<69cM5LXbI}$E)?3`oO37Oo-N1(2Kk`L zazLMCdih07mfqcZcC+litjTibRBP~OG+BPLB^N3z8S7rF8?%|ZEFCL~DwnXG-CYCSblWWkO@`7-=DI9Xdhs^6PXD zqTTM)cDvoR-p(Aa^>?TKFl?vi742^595_9?Gbh&iyHnta<(KSk*yh!`=}ZFe_mMBSEWo{n#dZ9tzgyiLEp6M#qf)-2fZ=)aIUgvC$As_rm&qsPL z(%sJ4J8ptb&Jy~jq8_KkZf|YF-Cot1K5#QSI>zkb~GaN5+z4d0N(%LD{>qa;|}f$rYbR z@-Myx>LnNKTXAq*Q9<9jqH^e^I1RB@&`~LHyBF+s+ulvxluNR9#qy7>7=7no8b*40 zUuJmmI`_be!LL1?V~QzIpDB&>%v#%cw_Ef|!ytXj;J@x*8&229pB_=sx8jWt@++ER z-`rABT5;qDBP%X`zi?A@-Blm(ZP9yivhmLwQTG@e)VVEj%sqwBCpg0G7(}M0aY~AI zOz?{~&y8P?ixu{t7C>Y^Q+hW$k|~i`0(W&@B;#SG{0=Utq|9JSG}aj@5h_4HC1shp zGWdAf%Z%-V8obPmbI_AO6eXH*DzZc>(2ZDOqmGQvK{9kw1~Sg))6hx5Rli zJV$z&QBJxa*^PhDLwOsnSd{n3ahsny@;9^&Jrs5*l8<80Lt#AQ6I4e%l=U!74~6dw zX7Qys=%MhtxU9j*0X-D@o$P-2HyE)T=9eDIY}k2&&_(E>oCkLVk{0|H2YM*>GGY;C zf4dOff*uNsMz%8T#^%o>EA>#$f)4}A?{69~9;raytfn?l1x0XB4UJ6@wkgqo@J&P<)$uD65fDh}^cy&_m%QuBL}FfwkLsk88v@Yi|!i55@0jG_NW9 zJuz#lrDpQ+1@%xkSkgmb#n}t-k3lWOqRU`F59N4tje028!ptk>N-k{3I2$q(E27FG8S)Vp<4~<~70?M~XV+J%=ix zhf-{2N)N?vD5ZzuuRux<#c#J?9w*?39*TVxQdFMzJvZaC4F_6PDLoXwszG^wU^iY? zpAXM_lY8bX*`M0_4$nJ;sjoL008kI*ewuIRF2RaHpCON5-epksk z)I(v1ShR`#+vNx(HDFTHt>~h!hr-cGT*rE$hvKi0lfV_o^ib@}7U-ea zi3NHnzMYximps%%@$KA18|H@|ieJ7U@hMjddMK}Fv7?2F2FwpV6hFN*aS2BVdMIC6 zdJkWJ1$rocdY{Cvxz(YE66eEe=%Lt24tgm5siZuyn)O2u#m_$|F^la(55-R(lIX?q z&_nU{Rt`_B<1j)G#m_%HQONe8hr+?39?IEFhaSqE)}Jv69#_;u;h|)DD7Ui#=%Mf! zF+G$^>3|+eEA-IxP?oSt=%Gx&s(REz>A^anhtkP%m>vob1%D%bfZU;tWF|X@jdTI} z6pKEB42AA@@NfqWWu+_Fo?lufmg8=l&V=&K;IOkl_d+|Ear)qKIV!MmQs=}D)I-^V zm1#B!m6;w&EpjC6Tmn558aT!i?{jUShvJVQ6mq!!&_mH4ffl*qu_&u=#&;M@4`nB- z>VtpOL!rT{%DHi%hvM7u#L;M&dMHPucczEJ$al!BZu@#D2V>JDBCHB}D7>1ns*_n1 zdMN&Ogh~rn2zn^YOg)rE>^1aIc$t6(Qi5OhQxC;oiy;XU6oMYg8CKu$#7vNSDA!q6 z$0YdD0`*Y*18#caY_pHiuZGR_>(L*duR z)I(tpJnEs`&m7Q0VHKu_ay8q89*XaP9?D=kpoii+pocP+YXLnJ-vK?8`OE=56yE_o zlzW&1dMJJ?cqEj47OH2jY)qktLYtj38+s_T=LB}3heDNz#59g6^iXJU%qMXhKo8{_ zv!RE=lOheP3VJBqI6RPK`+6v^!_k~)9qOTQ<2GNzv4S27TlL%jG$;f;ltYmPdMI?Y zaCsWAy&F5&ckslbJkX_+!gYj)(nr2pN;dbwzA&u=&@JJkE$X50%m+P`!`U$OP==U^ zi7@$!4(`W3MekZo$G@1%dq?V_@a6B;6iZr>9EKrvk_e8Qw0CHnmaE~S9tywOgC2_M zZmo73aZaoTzk@I1U{o9^q-5NNY65YTSd{6pD8I~$MQ_3XHf{!n(LIo7T7Rls(%sSs zQ%!F{J8r*%zaZN%I4cm^Hl**MM%xfS2VpgRx6ya7<$D%3KascPy{6PtqO2OBZ6?;y zEiZTi^|hzX(22hO4f)pk7}yo`^`LKn`S>)EPZo=|vyDLo%*R{E&*M27_J*5y2gT7*ZiqyG7n{C5jeGA_^2t{A9t)WT!?!z;%%MeTf=I?DAODR;rFfBFS8j*mm+kqzRBsdZ-%|_$W-33Zi4G^ zJM!Iv;P**RzHR#)g46L699jNEXRsXi`Rp~Qpc8*6H?koPK!nar=#mG|ELbNZsMstt z7xiZWe<}OkpxDXCu!6;!1;sYO+F-?s+1g4Jb5rw+xo_rv9~9k!OgA8uFblshuvQ<1 z=Mlg740MA2sQq8dir&dT3LB}@MM!xAnO;NabUKW$5cz_}G8kECHUpuAg;}i2@8N9) zPYVRxHn3v){W;3cWX131b04ybyCYK>f>k^OkqR2D_yk0bM<`)o7PE@0;F*VjacYB1 z^h+=1)BGP<=`eWtqV8&hPW@qAg2+Z1Jz(5~$c+e{OHo6Y?br>W3&+0C4>@|X1Sn74jFCF{_{Oq*K_l?u||&BJ}8qwurVt^qzes> z*+4}4Bb2Z-%XQ_p#ID3`NZWHJz{K1lxp)}oZ@@9ge>6g8rr2Or!J3DFa_q^YC>M2j zKjr4R`GZlDzc(SrY6O38LS!Qi+nW%%5ur271U=yObQaF6o>Rw~y1KEY@N|2e)%^+o zo<)IYScu78UxEj}D7_N@ZbBEhqxNv2#nQvqV(H;)vGn8xl<7({fflEiJ@M%kfxrrP z%--`x^mZb>BRMqse26YY`b2VgT{yr5R{BP=Xy9&uXZ*gLQq2Tb==7SS@;=w$bR2=e z3Jt#u1Xfgrm*c+sBZKz@R8DxA^0+_rHkp+te3cUzkWYCcqnybwy3-g&qr-BJ$Ws}) zG@QQt#h|x6sD~@&*RwsNOhr-8_KZW)^=!{LB3;kJs^>u0{lLRfi4cJZiUaY8{qh^< zc=^rqkBT>RN4f=QC$gv1iI)~Z`9IYY$zA-P>PblTBrIN1PxFL7jP3HXiYHV<8IyCY zq*9=H;>)9S_2o`VQ_3jH7dyt3OZFmz;!CA;538Z{2&tj;3=;6mo3OY^((3HJr?g2Q zm=uhW8p;8Cilg)mmk-2I4lHpF$?cbWT6um@lE*9-9Q=4bev&cMkDJ;_HjY1tn(S~G z$>+fcwG(o9kigRQm!@!FB446~MUNudT66@#(tB4s!4=idN>D2Tf&qkI!6<^CJm4LG zdMXeQg|pt0gpFBE3BTk~;ii8oeX_6RA4T~2haIviaa}3zzg9xZN`UvI6%pzMH{TvhKfkA$ zp*-BIwjc>Du$9olX~i-#U8ZSb{Isw`I>uZPd?)AULoX1wI`NUlxr1fVaqfrUtG(`*S@i|mJv>UfD+4U z8IiHvjBMLV#}N5`rlqxvwDOH*wT!g)jpenBFhDVd=;Zq&wTzVd#vsviP2 zC&6Gl6C*=>V`(iThxBV&DIVeLXhRw3Y|K%D9OBejfNE#=cg+PRd zJF4eqV(_JDmO|BJ&kY9;^gH(4aP;{b?rW6vH=OUI&F_WKdV0fIw5e@496`aE0c~S# zZ9$hg=0SiD7DL)&+a&OC8*sFH}pj|JaP!0kIObM4ZxE(w;3iM-z7;K%Rx*v4AKs1T`TVoS#^Z`#JYl z9F;_-wLCJt+gg;nZ4+lXCd4jpSKfZU*s2Q036t6(G!7**lO^)>qmLE80SZSu0=j~+uNG(sRD+S;7go16A*rDBZ(mOv!O zza`=x?m9;WJ3175PO1%daTrTN7xL<*p$mESuR|B|qqxI!hxV{Dhc4s`BB2ZU0xzYu zf(B7Q3%4DYwg|ltu!e0>)z9q3-0Fi6kmF}|XnzZ(PHZ-cX$#jk)ZNeOAHnmYKq1cOWPtb&vLidsf4F#jlmClAT&1m_V7#-#6)#(s?){Aw-+Wf{ogFdE?| za7Gb46<~N*)H1^39_thw{xO^)AX^h0{H&L2?%x!TKs~7i<+$(+?)k&m1<|2?b%d^N zqj^=j3?WeBVf-Eh?3x5GSV0nx!*G+oqcpr zJ4eW~C#kHx0rsvvL}0Fk^ARgNj`gtFpX3Rug8Yo#^YDa%{XKoF6FNHWlwr3B>GMYV zNIHfG6mJf&FMFZewCYIcHm%yN9g8fJ5U|<=k3Sq$(a`PNF{|L?WgEB0D?+z#xK|Di zFr=ImIuedSW?S$iiR5my$A8{uu7wj9K;s#R<1iyGvgjy+hX!+yJPr^qC;fY^qX`Dj zS%`xb5&vR#GovZZ-Ic`X4EAok884N(~vlRvicK)eqCBVo*1&TpQn;0xA|ygL68`-LZzYg{iQHu28p5jjTlZQ~lccbI0@&p_c*2XW$Ke=ab%t zqAqj!H*4vfA!lkB9n+Z6ZCy}j=}|nR=CZ5juE!tv}9AgkFZwW^rAf9sRRi>gWl5|C1i#aL#e*F0iOh zmVwiA>ENjoUD$KmxtxKKDWTgP&m6juPS?R)zB6^|_1v^GHO`^$a>AR5MenQEkeha< zHht)eoAimsb6NC(`o+`E)Bt!cbMdnBli_wBR7z;Kj=IdMJJn!a!_L&Yrk#7eR(USZ zd}|TV_Fr>@>cAEVJOSW5ZU6a?r`=#V4xJc>Fdc!1Ww1;L`NIBSPhO97?q0zXZ0A?u z<2^^Pa7====L!c4;|x0xI0(VQ8xWp~`OuK3*l&8z!HfLYNdDaat;c@&B?`L?- z0mmH!A&WyA$1>v$V_65pG7o`S>YK6n;d@3Xd(({y8`UPT(P$O*FMJ^$%UFW+c1&O5 znhuX@?Ht4V&8ZZ`ih^p(p$>99>loxMrbf^(>k)FSwj2<}*n4N70TOC*=Q8#7p?U>wS8pGz=f6|_N9*}-Q3E^FGk-1q zupDb)x-!pU$f+xXzCs)(VV&IS*WqXN8}z(C=k-gk?|o1t!gf2tYRU3`a7!qEgH3#A zNVTWT7uG2$^|f@UXq5~39yHapu?7W#I;ds=oA+~5@BdN?m)1@El7Ko=((U^5&WdkL5$f z&8RFoMO-6h*o_`?1^UujC@ba>!Y>xyk zdN1x_`WF9FMSOl)u?Kn;eWal=e)`-6RSsnp2A1{yS9KDS#j_{RTX4{1NQP7{E}q>R zcFpt!vnPR5;h#EhVb9_zWxZ%pET?$lq!|Z6@MQ`d6RRdqKL|7JFYH}eJiGJMc_mZk zC5xv`Sv0X~YH_z@@sZt=#Z%|ZEr!~~jL9fCYsSRt8FQw=Id#FD$u-bwD29#=Sq&d$ zNW%8idBvFbzou&93Tuf8O`(r%qLOpQ?Ia`t5OD6L=mC z`lB#7^!cxQ@cGYh+w;#j>oHEdis9jB%72^Jo`08<9-WME%9W4fc%;jof51@>^5t1g z-g+PwSorAE&`rUCSBrhEmxInna>xgT{y#Bl* zPp_Q6q^bgbkBqCMX>%9AN0zxLFtTzA9O0BLs9aD}G0nKpp-@v*F?H7TS5$A~Ki&u*`h(8w}6JHYF75^lDE7FVt>uWFe z5>FIQ5zi6lh|9%m#Lc3yyNmMp+BnNC7w3vA#A`%jpBCvJmTc_MLVjDau{R4jBjlFX zSv*c0E*g8WNLL|wfq1cat$3Sg?7|}buO+`J?i0TjlkmPA`_WG9B`y&!7oQe)iGLPP zNObd$6wel?h%-cE=M?pgm-MfRZfx5sjZ7#NSLA{kcc_`^873e_HYm@wX)My(Jp^w2=R#_(S5?;$Ovt zG#hb+~ z;xEN*B+7kIK=d&5)0&$6Wfq02X({fB#EAnYQ%9};=e-ZK) z$=k#S#V1AcKN9I)mi!y>Ez$G;!-ry7J|Bi94~c&f|0?oXUB-t+&p!|!siU6HlaS_r zDR`{pJh88MqGR)5J5yDdKd|^Dk5*d8ug3Ya#!olCKokiR;Ci#M{KJ z;$7lH;$z~o;`8Ef#W%$F#69At;um6&|9{c0M6r$7LF_Dc6KPwG>HCT&ibKT_VyQS@ zJVT@f7UsW6Z0<+sKItD4pAw%HJ^w+!mHdvlTihr9N&H-F5N*`W`py4+(D=^&4r|J4L?T&-xw}Ul3mr-w}6$LjQQ{?lA&L0DSG~bn)?arulN(h5n`!$ zwpb=siq)c7S3$iON?t2oC*C3&zr{#*zhtxS0{PdHUl7gu3-s?vrY$1&>s!&!^%2M+ zF;z?#J^wyKB%dUX632Q<+q)jDr9J!9eeu@#Xr5F=Ch@Hf4qFFCOe$W5U0O@I;iRDfbr-?JgxnhmDR9r4z zESmKvl(Sm$IwjMSjrh9wuITv#`be_p59l+=Uy6Sf`J0sG(ykOq zvwmd0==uK{EV)P=C5{#+ij%|&ah6ym&KJ)YSBY1Mo}ZxWCD(~&{S57TQ1avAcJX=f zW$|_KZPBc^A;0G*h<35qPvf5&JVvrvM}yp3av$+{aj-aCH2$fPew<{po(9?Yrv}TV zZ|*l}vGm4IHPT%u*{r8QHtT7iSx*CRQ2b4zSx^EHkSLo__gTyr#977sjGrRT66c5u#iinf z;-%thah+Hv){A$DTSc=jhWgC97}(su(Mw9VOMF}O{2bBP9NQZfJ^w}-lG}+{;;~{6 zv5(ka93l=AjbCb%f2!m&#IwaI;&gG2I8R(EE*H(Z7|Od`vbPRaFPTR1*q?184dPKY z>tLW+_X6LOp62fu|Cwkk-$C})xiYxE1G%->UCb3}^^Wnw#WCUpk!J50KTD*=JIdbr z)s>R35oz*{@wbXJYe(6vSAkDSHvXj{d;X;VDE%kmr{Y)Qw_=FvG{_ebyNSI-TEk=f z>7rS8!fy!L#G}4Sr1?9_^yxufMIs%I;8Cs@Y3q)%x4!g<($U%-^=5quH0w*CSziKa z*N*WGB2C*-j*2vDN4b+o+jW#Zf6+8wN4Zp_1v|>+B5l`EUMSK`9px)UTB@VGSv2cP zkd2>dkf!Pw|E5Tbbd+iHjQpI$csN`~f}9}I^c>}OBCXF+&KGHbj&g}e({q$*QjMgQ zIkHMzM4}$rnxp;-u}-WPX;qH#W_=5!VL8gri8L5T`8|;~<0#Wt3~9{9fuVF)ra3t3 z+l#aaN4Y?xQ8>yci8S~|d6GDlM7wGBjrxV+rQ((1CULWPw|JjO3vSH+rucgj<>K#) zA*Q{F2MqDI)euPx@ik}Id>t=K`W!J&>?;ls`HC#-A0d{CW5fyKWO14}Q=Ba>7MF=D z#f!w%;yQ7?xJkT2+$!EBZWEsnpB8tBFN!ahlmxnaX>*X^k-sV@JCy2jRR-xo=Mffd^FrVLI8t$xb zBzCV22wE4RtS4~|@-{E71d90boy<15o%9t5r7F8VZQg1;b* zMt!Ur73~2Mx_0AuFR|lH5zw58+xV(OSP4d6*ugW~Ehb3C~T<>bN#?`aezJsGT z6xG3BRYFOt+T^uQ9Ne_Z*Xe~er&`gqIU9WkhB>j?RvWFX&Kpka(7oilFaP>os}1lS zHEcjh=lV`1NyP~Vh9wL%`tBtUwRXKrwW@1ZJf*{$Q0Cg!@Nm_3RdnO}kaN)SC$6cr zI&Vl@omv~K3$JNeoV=mMx}@6e*5nSYi$i@w0G<=nnV|Bi=b!(ZCxvtQchx8KDMpHM5|B`Wc(2LHzw zl|)OPI=thVcMHTfki{DVt;^~Vo;>hPPb-fFP2wjX}^8I5c+ncz z5Nd~(osL#-dHV2$r$2f4!Yu~&?m46a+GahQN3ZFoJjKmD&o#E!a7z{$T7H>a%(c%>NnnKRStMAu4`S=y3RhZ-51-?d2Q-O-(ja^tTxm5G#kFN)dssy=Z&Qy z`=A}^yxv!kyy2(TOAVnXtOLV>_JM@ttK0d8yxTD8uB%FJhVLq?=jfeQwv}adw624% zs?7r%vL_cbWUqYo@D(_F%i`mVY$;eapvX^F2c=^}k7l348-AM7b%`=0vnuit%#$7H|zZU8P&K64%L+vT_r zM213m8v9BJ@tZG{a3d1>e1XCE3FPx9EJ3W#4&IAzI-ect4>%X$iU?;{y#D%p3C~h> z9m4Q(bskmz0R100!=Z^ZNsQ8OK?S z`r+fM6e=eLg}}#E8N;Wdsqk@C&2R#;1qQUdm|=QR2nF|AZE7U%?FIva~eioo#Cm(!YIln@W;rohNo!>C-mu){m zQu@B4-zkhQ?;)lz?3{_T@O{PMOJxD{eU**kqqKnp-&YKy4*9-vYxGBdfo8(@l`Dp# zryDWd6(iB-kq5r7T+#D=)y)({-&c>Jnnd2c9tf4`8|r=qMbP&Z@AgJhSogrNTYwei zlgRLW<%<3&ou|R~l`Dp#w=?k|iIFJ%k-_(s8=D%fX43{sOpo?q-XRh*qaB#HP-43% z9|4B%D>rYJ)q+3Cjqj^=NEh9LqZb~P$S_AeMzJ(Zk)BebZ&5zgbPTdD%KJv}eZ`JC z*%!fi%?$|kL~7Gz_`c!|LgV{tF-te&{i7BPv-Dmdd|$au@kf)`?((p?N1PpsvSILj z#le#AD;Avi6MS%24RFN+0lu&38Hc{Fo`M)1#!fCwW0)1~VY3%`72)s<=TvwKCDZrS z3238yUnzrpU#Vg8edS7_=rwHDLt%5u!uQp3R`syNM&DQ0nVM6hmoV|8n#GyXRCaN@ z872C@x{I;Tv^PFU;QOi*kK?cL+AUk16Xi{}@bl5`M(i5>5JkfG)o>#=`o3~2YV>{O zcA(MsmD}b)QQoJ6@2gQJZ(;Ncj>oHM=B{3Lqwg!XsN(1oY{uJab7}O?oSDB%45I12 z>@m?vjD4@gSpa=sy-IOUWQ~cP82u@Gv^SY&FnwS3X1(ugveEYy8^o*`=7X~(qn;ns zh-&Y)+*k(l2_m$frD;D!Zp5aS+%=E|~;|m6m(_J|fn-&bz@fY`09 zAHJ{XS&F`|O3;Zgd|$bjlEN5`deHZko4z>4Nlo8ZZv2SY$;=PmS9FNu%Px)G&S8Y_ zD>wa^SZ~%3-&Y(Q`o6k}@$h|R9`Med7~^?G-&Z`9jPENt7o_hio+HNh6(5zL@2h^O z!T7#f$s*zVYB9R%(D&6?mI2>ayb0!H8{bzv72JdL9a6^~BqOqMI7nO3rhtDp5~Ras zH*T__z__GTdB-yeQEqvhwoQqUpKkNa)t|G_oXog<3`Yg$c``2Qd=7@buXdm_nX^!% z@qP6GQpC))1ir5*;2e+H>>hkyxg+S0{ek_5?<>s+)X0tp{473mCCW9vuej(G8v+%5 zUr}IDd|HFPuUt78E8Q)h7v_N7t+x2~QI;K+0c$I_iD}I}?sLPlYzOUTl z=#SmU4#D>o6VvzA6+8y;eZ{W{`o7`=C-i;g_F_bg!xo0`D}Jft?2GZw0DWI=haSG> zV!Zg#_mz9X&5T{k`r!M@m8)W1m>#~bTzPTqe%1%ySJP3y@qM+H4TA5hg+>A2SA3*_ zzOUEP_`agdMj08tuP9&Q$)4}4yP=59V;A82iUP-c7RL;} zubwnAd|&aRNWl~Z-&Z_1Jdq^3zOTN3qAjmF^nJyH+jaxT3cjyct6P5%XNt)L-&bQ$ z3w&QuB_CJ3ZefDapHaZi6TO|ylg~RB1{po?NGEa*jzhqd1>aW{>;ZgVu>|E3satx`J#kSg6yP3gi{|l(- z`)WB-!S|JU8tw|aUJ|Fih)X#WJ|*eCKE zz+KuQ?Jw~sxzk&W8JuV~w~jxfLAZl=z-0xC4=czs||odzPp9%|B6 zL!M4uHhKqdR=lrG8&1EX?nHdp!;J151Zn3fn=e$^!&BZwx);&cpJC7TQCE`6ydgA! z&v<2j!nT}bbPV2(J^K|TwnwD0&3{03Z(z^ni(K}}M#pDgI$<}iutpjcU+)=xb{n?2zreh<}Ku)0SK}MIs&Ng7*L)}oLYfIguN$41MH0(J`3ZOC>yF%=Oz4H@jJ72Wu zvWNW(*~#q8iBRxui!OY`%u|koVhnbx^KN`hWVFeX=;m1fMGf|2O&%%n3@#4rMU81A zZrUrLxU4a)lvd|Fq`j*#ZL*uT9tz%3cFUF0>O2u?_co>-VYgztw?V~zxC`4Y5x0n1B9Ml?JCiW72OpU31x*j^%1*uC#NLdM{ZJxr zE}QH{2oz%P&LoU9*(X86_b@QXtbGRpXgEKgh-`q~WSxh=TgiIC z_jx4cOB=lyVd~urX%BYvmi6vNz%id6BV<35%v;3WSoc>*^d)xFh8VQGNp0G|w=%kO zXJ%&e+R+2qDErL~8vB*xEzB|z+TjTBW_7nw5LO^?K83*$)*-;xEqaY$K|g^;$AP2B zlLf_Lw|^7a&n!HQ4M!>DVr4Ucs)8F_Yh9<-^nVYsn|1B0D?w0TS)SZaT*0 z%fC|K;PUo!OYGg5nc37aGg7>_Vq5&=zXAL8WWEg1bd-3jx+`{5&=3UZovpi^)B>z@k3@V=#J_3c$NCl_)i~dLtSe7YPA^wr5!SdnDWBD6CMJ>b z_QXr4(;4;meHGU{dV8X9obeC^Z%>TIHz&V_`b3ey`2b#;eg~byyVL!Qx2F#h`fP^= z0=zVRkTBE;cb??YhD95E^Y%}bKOn34R|e~u&DvBC7c@9fHxAtyf(NE zcr(5MZynKqw-W*%umJ;Y`zr_MJa+n%g2=B@?!G&J(7jZXKPl%(PgDQrUh03Fd#NP* zv>;#V>4GWT=v2uUe4q$F!j6sC;Ud`F<&#`P;n!7uOJ(Wqxryo#=ToX@W5#$#RJ~X= zF0`&|D9^2w=Lm{z%8&C9Rp3S7BtDvlC-{wSYCq0GG(FVhBMSe{26s^;@4K1^p7%%Fa-f94XoCORT<1^>or)b1#B>up zgP3oEV+j_06kk$&gMb?@-S{Fgfw2VtBE#-1i{=hf$pr5)!}u?87IxV69zjks>M=yM z2{u}xMJY#Ytsuc(IKf(A+FhqIF}4GB?V*v7?5SD;VJK zq@Xpa)_+>9pFek|VKBF&1Oc=)#3+}Hx&&vFG`D$d;)fyWCX1V!`Z{FD}wXkti`h}oM<%p zutn3UajLkwJ{_own=z%FIl1VLZJo^n&J&Tdm1L_i{k_H`h1)i2-D7VWPNkU%#w`IH zN5E}2yVDeMd*_2&5Rd%Ca1p0sr$Y$*7OQ7?yonl1Oo)r(xbXiJ zj`g|~-XANRC+k)O;l1f*#N3J<*CE2sc3Wo>#n|D#!e7t8WLG~8IM>xLu4llVeoL0t zGazAEys*4cK(S14zngujaaQF{&?U?28IZ8NQ9zD3z0c@zACj$FR?mPtg_kU^XCQ(d zIfzW`NaU+$fYaIZg8>Q4jYkd6W8@${#_oD3TY|L~Up?hdkI?z+DWfE&TTzh1bpCqE zX8Ic)%=9C#cRHYG?@Ta_>5H_SK+rc$n8u3*x`U0M>DY5j*nAxgGC||K;$&CLLS|#f z5xrvt1MW0D1F>dfJI#Er?+Xf;5A%cj5ad@?m~z`47=#+G6F9(f3$`Q9O*&OHQ8 z!|m#thWo6h;a=)9-*-X+kn!r#?< zSwPsO#jhXK$5C_4H`*98L(V29m`U+t+gusk>9S_)3I=#iqi0)<{~HSIE}Q z!h;O`-!S|I_K+*X{|yg4cc%8HLA-M;9y}E2eHSAy$CYzE{u_sK1NNYGdaeJAT60^! zJF*2We9b{sh%o277tb(X(Z*0-w&H#S-tz>uo|hsoCBy7Z(89MkO7adueC?>%Y<@H7 zyu2X;htcqd+RODI)Zeh2fmBo*v?kR0@y*QDayHOJdS|H-c%E_<*=robFMBC@AlwTm z%JeRvUP^XBzYQ9e|E)gY_?znu`r>WK`a^xlL7jB}N|s_bza-ELP8GJCapX3IIn>W$ zH(kYmGHgtnAst6P3v~r89KeaSeumw7gz^>k;{H|-@JkIP@eA`Hc3j>35ZNFEneTY) z2ztHaSGT)p$#s03j>V11$1{09lbm19W`l$S!$Zc>Q!uOP8L8SzTe)&sn~wEd!s^>p z4p(Zwm&TNX51+YQ7n;-)o0LtLXkJ*f6=DE*w*&3-Q~@(8Jg6!B#rZ|3+mJ82b@{UY zmsZ>|Y)t2MAn4y{$}`EBN8Ok6$wAD+id%*~fZ;XkX zuzr&?{wnHK>9<)3W8$i8QvTotrX32v8I7%R9+yl4;nzjZ=&Jr`SKo{sneU%x|!x$&FhZgxg{Fj+qyc2OTe(-f($(>iS`4@41h_ z&Qb6-ek*jvo{K#X`vB~`P9dSCq}InqLNU^{}Cf$xFk!bIRw>%$><|bLyO$Sv6%drcQ;3nNT*ZVtP5u z(w7;_(a_<7^25>lm(6>65$}j2|BTn z8H?zMBH#=Ogxd$4Z1Wi$GNcupU<}D<{X>pk(ndN1vz(JAIs@ta#(8MP>rGx>>ggsU zBYjk(>y~%Uw~eEeO>RU-*WU@Uy(gb8#<|2G_?bw|g`0^5gL>ulqWcgy_%Zpeb@Tbr z-isnA%K4@yH`wIkWv_}~=O#nLo8mr1oD(?4S(A)5rMJo$?fE^~GtZ4!t%&oyh!5t; z1I+b`aXq5EJr8bA9E|Dh$ywAmZ_mr}WKUr?YJz>d;@(3&bP{u++qkBdHK=7PRgIe? z;(R*KI5aV>{?7PhX_eu{eL2r=m(va-lS9`aruu8uoCEW+pzmz5U8*97dX4y4oxS9U zh=_A&p4|`oh%W zI9DX+s{cvObLdUP=|u-5`SkiS#)hjDADoEX=*!B@MLx`e>*CzU$jM7yAhlN@(kriL zUeEkq@*dL?ZinEvWQkqct2d^~(%e9#i_3&yw(&YcKQg_0_wd}!G-Y5ixFqU(Wb#OU zkKV>H4F?kq93{>mbJ=9$PNr2L8J<=0FgKm~S%IXiK(Z6bf-jUnQinitR&XS`#cp(L zY0?eC^h*yU9p9)yG*3_GMz~N(cJ^3Vogi#lk?RV1J>B#@8`I~~QPidtaJA#?wRp1j z&YdNGxpEcYWlU2^O#&Gnj30?R8FPmJqD)`r${k-aTM<{i|s(xImi&_JSMkQ zpcS3Ra0WRG?TkPm!)Qe}qGTve{Fn8!rH^Eq^oyZ!`2Mpd)~a z>gvk5R@s~>HS_UZL8k)c(Q5>_?663z&w&YgSSEYve& z_S`Auv&&}9sajB7QC2m-+A8~=vze;#Q>)A8Po3#`NwF3*Hk-~R{?FYE24T*uO6!PG ztgKi(f4YT%%J0WPuP(2g)^~t6g77l~cMvlwG4gZ(@o)1vQ&usjqIyO}<*I<4bzd`OWtRjLm*ZzG#nl0qoyD^}-zGT5f8PU5<4kb<7ybMF&fqzriWy}KFlOV1 zk9XU5#5H%y?DK}ve^ceGxl?MaMd$=Z5ufg5cUsNdvY9wF;gY4Q7-L#Smn%3qr!Jh& z6SJ|Tsqk%u$fgV5jEebiO;y1G$1qL9wYsdv_;Q&sdjST{`<7`uf@L*s1iW6&pL<@} z>~dB%XUhD!i>B)GE@v;iK9^U|sIho`sF;@J*8GD$X8zmU%eZs0Y6<_MpbfLjXVk!> z75U0jayq@n^{Rtav%1n5 z*@U@sXV+xmD=TYg^_;BXbEZ__-^#Qsd{<4asHvG-U6VDSS3zF>fL``IA$ z(75xTGwtZHM%(C%=7?!+<)TRXqbVWN@!XDN{9*p5{L}PgdOZ8vM?78}Dvl6O5&2vJ z(@z#F#Ts#yc!|grai-rOZWSLCpBA|k$8_(A`^7(tyr;o<&p(Z^iwyY~>5mhKiZjH8 z;w9o*@ec7G@mJyt;z#0_Vh~fB^&c;uByyRJ`U;WDXOu4#*NQiZcZrXSeAR*JjU8d| zW69r$5zH^f^G!_h1aYKj?E6A*o_z(cm;P4qUXgE~F+Uez$P|&Uf>0hLjuOujXNil& zZQ^$E58^@bJCScDv)uM#PjR}qKs0t^k?vZ_w~6#7o8NMPoM=@lQ+sjkrhrRBRt|%jqSa zD4rr3JEtgTj^y*jtHm3{pNo%)FN?ny4~jNkSz)_dh}ojCHwyi5$!o-$#CODfVgeqP zW;x@e#O(yx(xt$3?=hxmZ_i1@ttviPoO z>}{exV_y^eTzX??lVQ9h#C9i>h;JbpJDboO`u{%LwK9{KtyUy;(6h{it+@|~%4 zQa*iqj-zb-K}&FOMX`I&x@}}|2xUQ7x$4kAO0+UCOW8# z{Y?-fB+{jdt)*`-c9q_B^{Ln!Di{kk%6Vv@w>5Tsw$Vqtfhx%3| z@-?@=nWy-^;)&u=(b(HWeq(PF98W#U@$7ESkZkO1vj58G`JK5!vgdc^ddbGlCd%7P z8TmXroA*;j`45ZFEB(vjZ>4`j+$}v{cVa(1`4U0H=ZbetaJy(uS8?76YUJ*QA{C`uceqR8atk-XQ0xZC>D{>kCM!{oLJsj zB+8krcw^TS`uU1KUo>_;p}#`%PsCc1<3XaF$HliqW49A?JE;ZY!JeY=;{y5Tl0Ou) z@E?Kca>U+Z9}&L@O+EP8W{9c{FrqP0SZPKP=-UpDud-SIQ-yC(acY zic7^+;>F@s;%f0Oahv#v__+A2_`JAFd`&d}FVK(Ol0OnZ7C#fe6!{Dlk3%c5z1UIY za}$iu6$gle#9`t|;uw+7Z!urBX#S@_K40=G@pAEMah#Dio`09?CD(~BiaW*K;$HDjqUWFGTgf*6AE918-asacF|n<9tk^^3 z6Lm~KKr9wVh+{?1A4|F93b9f&PqLz%3nX76t`&{x7sTHz`F8Os@mcY8@okas*|U8S zFj!M#U&RFepG7!H zOcyi7V?>&HV7i`So;XnS{H&Bn9x09$&HruWH~+UmnucL{OT_cVtHm|qP2z3hR`D+J zA@MQsX>o^0dl9VXeeq-Qp!lVDSj0V5lRhY>h@L-|=6+VjEB*{|vN%no;Sknu{Mmvu zX+wFLc(Hi7xLRB%)`|7v9is7ri*oLh{E+yR_^kM<_@?-gNE@VV$2TILFEny?QUSJ^w1hB%dUX7tatUi_^q8qFDz*z2{3_C0-%^L^SIwl5Y~tIu7((CEqKWbsgww(T3&k6g___`y`w79K@UT9FXR2nBMb` zLR&YKY37EcbsKW1NW(UiPZw#)hVl}T)@mqw{!VC-hO$|Y0cmxH@`EA`&QLb%Fko}P zCNwm|_?Xy%#5IPdW~k2>&3X!Cvz`K;qI72c1oC91qxl%-TOck|I?tc4SwBHMO~o*s zSvLV`ErzmLKLO2p3HY+~uc;gwg<-mnM6+H3`CG{`trxTvjbC2GoAnWp=3SWoWbrid zOtC_oCDH;6(_bjk2n^-*;sfF%;!`BXk2YSI?lqC7Tqx5t49S~nq+g^#7s{>0=Ke%z zr-kvuL>ghCe3m#$wjW}$qeNV_YP?-gl!g)*(YkhH!+?h$EPh4Po8 z@o$TM(!dJ!X(DZ@Q0^kqoC@Vakrq`b(`E~apD|{KDzN}Mk)7MF>aiC2lM#dYFl@mBE;ajSTjxJ`UQ zd|KQgz9{Y#Uln(Yd&Q5$kHv%H=OS+c^EmiLz7Rs0uY8bv4~|S1`7Rt~zBWK+i8&%) z9iX1C3Xsj$6AGp0>jRAED+DB8BOoV=lf=p5G;yXlTdWf2iz~&8#L4=9oX-B@-1Fv- z^)L8`Xm%6)Ki*43TZ|2c%bbhA|EE48_&kEQ`4#91;^&`LD0$Oh_c-#UYo_5I!afE& z`{8X5qO3t!C-gQit`v&+^0uKo{?1@|ydHVw@fzUeLD2df3Ak?JZC+d@6keEd$F#xk z4_x28&5Ju1iuii>j>PXO%t_Wuy;tw~2zz-DwAS>ntSkn!d2vf1$Cr2OS>|iSl!u>N zjpeOI*vrEr?nZg5;}l--D#XQ?w+-cu!TH1X;b%l+c{d~MW+LEDzmoEbkWxGfy6NZrAp8|985Q8^`#Eu*av1;-bFLOQbl)KdZ18brI4P zdjiOD=Jpi!`1VE6zEtSgK296&c>ES&9QG=}Y&%e1fhT~hlN*WQYTUj-x-n43puuvs zDUao|&bVo0m16#lhR)l(@;HU!)3rnU{^%tFy>xuCX7-$#vUz>-bLaNX%KCdgBJ%t9 zAJ{L8+u!#Q@$^trVE~5&TUT5^W5!2>zohoAD@)+{V69V|I4h|n=d#n=y*)E+_1uGn zg-L6lJ(T4;d1hAe4Kt%_+iy%=m%Ju&UCOmEgLm+PRTo;_OE!n>L#ZME38@96_gfwO z2c5(hGX1MV2a+S9wSn69b-~)efn?{p;<*Q{;R&^8H~3Gu<4|fsU}I5(e~7;>u-58f z9UQzWw0>xb)yc|!vLt-{*oM^Esd-}>vP#D`_^*2Ua4>sJL%Y(k`<#WT`A;8CfRtH! z)o@pzUi$RmQ1<(~c9ewcx58dr!Y0`6&wlujm6E)3Y{^6LxL_f@|Ht;g2@U@9o<;62 zca5fZiEPB!k-F$c`)lVjyQJOvU4@AyZH75@!y5cOoLXPq_y&L5%iH*Blj;f)T6NgT zZnyf?l;Zuv{C@a+unz878LBHPd9q|2T06cWHFDA6;EX3@%dJaWk8g-Xh93A}@!*mt zV-Ftqa7E_h7w`XQ;V`5d*ASV_bZ)B9QBy^bDioK>f7DbVr1CeWVr>ITSQl$T?-pAJ zFJ6hB%uel-T2M25E5-+-laO#DN2c9Q|KMF1gYcF!8vIG8H~4#Bbl9?g8#~!*allR- zcHj>`e&oP@lyqPoO4@SP&W8@!;rz)T?RpnEf_0%o{!ru)jP9HetX=VW?3c-P?Ke6H zE^v}-)9T7*roz9+cZ16IZwmImIkW@H3;^y2q`K zcqiSqx}CK1r2T&T-rb>DNe3! zchHGMb|!Cp^pG8CIrD_c!JXr0BAoK$$@b3LnU73v>3VXgW4rrIzG~OaA6gq&>ad3N zb~g@R@p+eDdZV%E!;~8re8_p1vT1;s6@U03zl2BA9_SoOb$n=lQA1W_d_%iP5%%#7 znP4WE4yH%;?Yj5Fl#+`+v>rG2!p(W*w>#owj;zBEpmk8JG|HwA_<1PCg#`{Cco~C( zhsj+1vqNtpJ)A$#x3|L^4$i>V=J%^Fp#}+@awK*d{X9ItR9t3t8vQ(sr&LXSqo0SJ zxZrrc9aba8pOen7ONZ;je))DtMqB;z?eHs9>vw%Szoy@&|8s_$*xbS~Mhh2VQ(Zco#|x-r16RD-jn< zYdAtlOizCf!CS&}AV+!YCwN=JdZ>Lc$!Jh@pgLc{Q=TOK(wm8h{T*bIwwtXE* z>CeI3oU%i_*O9`oa~PqJ{5h}(nW5gHBorUrhmTNxONLPg{W*jRRHHw7EIJY@NOBtx ziavu1Lj|s@3z+fei>sl6wr;HP=Md_Xlx7N|KL=W$PTYWxj!>Dt;mc?QO3VrM58V%4 z^jQ`#FzofO6~*Hv`lB&q4V@qn&Lr4_K@uZT-rfkEC^0p9fZ||@>CuDeVrYoO%;;+@ zxlm%eC?BZ{4V9Q>wcyuT$PSGR`B6u7B93ZkR3gJ1^~*R0rD2K={W)C1=u=I{Ap4?! zq&!ygMKH*IG1{Gu)TYbu=dc;It+qqwgeJ3eGu}UH!7xkbU9eDD&>aGQ^mlAYd3d^s z4Mk1ErgY$7$)5uYPF#o&?y4c+=X1L7=RkKQq0oZR&mczM$46*k8pEvU8pbX1D#GF6 ztV`uhzL}x>LfPmf{W*m0Z=nqI=MZ|pn+f#i5PDEjD2ks^R_LMdZ~(^Lqgfo!hb6lH z972zzxlSokqhp!)QRU5y?xwiij1v7h{Fvf1?Vm#PeDLS6fkpkg{hy4O6XoK6==o?1 zu90VVjo!pQy%6qYMAx4~=w(&p`f~`qq7JzJ96~!)@1STG7WLb-J|=Hr^p_luSJQ?W z(e>vLdP7AOM+fqtzpcEb(d&4WewX+O+Dd;8FR+pCwJ1U&`g1siiT6a7;JCxSe6*T9 z+MCQXnEo7o$BN$9WTQU^9&2XJFdv*P8JF^ddK?#)mcpo3vyro_KQ!4F;^@TAW4Z9> zpwlJxFb4zv9BwmR@W)dIlPBoZ}jKD zN<#4G;Kt_}tM(!Ib1)0m*?nVous-;6aN`HWx^NWW&mqW#U-)z2g)Ibs4(_F-FvbUS zL-6O|rZ0}QV1D>>aN|eB4p4?ahlt5v8asx=2!9T4`Z2Mcl;O{TgF}A~Z79Q^!$YRM z6JtEDLh$FnQ_1*qSi%C~&w=NN@#nyp5d1mN;F`qhjV-0)GzX))cJx&*lihpMyJs z{#YIR4}T7t5vY+J5BOPpW&z4g4h^wG`&krQ8G=6t3bWw;78%j`D@R7VdHM$M~Q@2>u+HnEo6b77c$6{Fs1dbGRDCvsGqH;m?6G z8)anpbD&)5$@J$C+Tcsr07a|^tA{@a3LNwH7@H9MIoxSv_;cV@oq{O}{v3F4cp^z| zb1<~r=e!3+TV8cS@aMpT+qMNq0{$FWt6TpkUMBc+@FNNQIZ)Nk=4HUlZcMPRp$YhT zqRY<%`v?tPx47OO5;+HthiDoAzYE8(2k_^>D&tV@}}YM%!coONVRM=JPpVDa?cumx#S zZh|hsJns(|4%?v#_^Ar`e}T`|>AuCONnMgKx`?rSOHmW8j!n8oDFQ_~+X+41kJ0~IS$11};$3Tx7hd%cx^F?NLU@OYJ=D zoq46ROO5VD$oF9HQneT^8jNZ;O6L0sU8<%)mBG@!!2$RJdlw9neX2PGy;1J5*gK;v z%N}hSG7s{3)bVu*dyLUN3Av8C3goxPv|)o^!Zf10nl7{iZjVj57gdbJ1UMdhmkJ9m z8h8{MAo0F)=cUX!-slQ2M{}_sdns#}V04|sDBeEJgeM?w4ED~B(Y0bZiy_aa?m3oo zx@pyB$Q!BSgGu%oM)xA*=dpLCX9O<%x|{t(v@aChUdP8CMDND#rn$hR$%1G<6Q%P9 zlja-5^Hg%v++ou2Vr4%UUFN0X?c#LoZkjhu8qO5^rRZiaO#$L_nWj72(+S5CzxtSF zPt?>i5pkz89#g*$relv^Ac^lrUk96=c6u(hV7fBQp+%lFyK{2OBqzCT@@c^|dz_t$ z;qm>SIr2E$)&nq5nJt^yuWsGajyGrBCU%6_7S^pBZF}RYnPDFrq1Eg5@%FukM0l^b zgC8XiPD)BTxn+}e>|?qje>)u9EEB*n>=~b)D6m_;fT&PCMT5I?pV*(P3&H)w=i*M#;aI0<*BW5pmpO zKGH}y=c9$o3$F9$8{!maIEQ>4a~O8L51PQ+oY06Md3iMvNOY7f3p!Y+Bf6U4SfbDb z#}h@!PwSf`%Zf9wg;;Ff`Hq8y@K|EL37$jq6u1z#CPt-np!v0T$|70PWkZu?CZrRq;=3V=M)CERHbtX{w8> zHr-S^p5U!Al(lIE12nZ|s%1dcZdwsMvf526;;MCHYe!-La~c)ic0Wz{IH)-w5Vs8<46oj$t;#Wc1p@gv~c*gx*hbs2FaR1`Rf* zn`NCDt)Mwwpf3_uVaE*MAzx>LXAoSZ!7y%H!2oY7I@aQ<`qNRzPu%)OYy%%wnB+nU zIyQo4nHk>MD2I%>;#V8xNIm<*`2lx_c3e)Ntpbcxp%&cdi zpDWC+Z<^rz3xCAMZz1<4(P;$x8NewK%nmWAGo-YsfJWo=xI}3?a@=rV75YN#A(U2- zGY_VJDUHM)gf-n7$PAy3J><$53regoV$J6(*^Zl!!(ECINwwCD31%w-gV(8k4740$ zx2=9}m@!n|C_C1orXhyVG`_F~7Ci8$!$tLp!X0DEKxlmVWc z7-){*2X2ty+qK9_ASuhQGM2O5(-Uoqo6bmLHfFKSS;PeyOm4#M+o_5||W~dO2`S7~^Gt+D*+ACK*53 zH%~T)-qXR85rTWMCs<33mDhR-`?2GyLAbq|XB(U59MZ;w6uO$hJCoqk|1c$Po6E>q z5CYaRtDti|gPifUbvkGJgNo_Xrk=qkOw1(WY3z=*%r@7Tmt8%+0TcM|X=OpL*960&`4ixHX*&o~rjHbkLxYz{+s${+hW?D0mIDf0jY zt#P&f@wI;MVDZ-mj}!mC>4HzV)NRG*${WS6nc$=TFG$*XIg#77JFLv&(l)0*)z-B6mtQz zn~xg9KT6LYH3n~`LH|iy9K*b3#rM$ti_{at{$LZN(z9+O5`~7kH=MjDtJ6ruuoW2zr(E)oW>^W|Oyef`p z58owlOsap;+~?HeCskF?ol#vrCky5;Dr&O2E*{XY+oTzl3$o@L+bg(ZpH(5dE0YFf z9bs%`5+Zw5&aJHIMT;ks;MQ^W0vO+%Q$BU(tjY@O-%)nWlA3?9+}X3HOoGwOW^Esk zTacUY_26Hu;i#kHnkDg`eZZ1Nb90{Gv)_s7=bD8uEL{xULRux$u! z*jX}>#sZU!^+P8-5vKbf)5N3A2orD?=F$eBB=8hOJ5_d|ixZuQ;)Xe4l#kL9f{Vx= z*2Sqm$&^xQrdlOK*u{(gFpeOm5WL-Oc^hk-6_s?zfct7L&X859NOC z$lP0%`!(hM>GyNHjYB>(F6wMq#)FAY>~ah08Ek19y=57Pws(d(pfh1&(#e>}L(8MH z$n8n{-hnQ?0{AooV!HfZ8lD3Q#~t4z07;90ez0>{ouV+@3zt zn5$fC=VlrsvQBU?rlOfyp|zNgXiBTo0_h`hn8xrRIl)Ps4@%N0(2CQnL!eb&Al=M8 z#6*#{F(N(B9N>7Z652sD$Qd=LU3}x5xw(VP5U{N?IfFB%2SUzNj>RLe#u@5?JeaMR z*;&p{VDz%Fs-9Um6IfYq)24Ku8%Gc3qm3AcT>KQb?aBpnCX`pfRHJ80Z1LQx3fO|1 zTUkb+Nt$+>(Y@Sm|XDT{J2eG1cfi>B7d9vFhInkkYDN)p0e} zY**(!eK@NU#!)M$R+vh0Hn0qo4ArUtBa5c2JEiL6~ctTSHraHPdEIn^g%riSx^=jIF_= zT9s@%7CafN#=CZ2|8=91|D4gtDeQ=A+|jcZ=}sw{nWQ<|A2bk2+lTJNSX4cWCThQD z9Fn#u|GtIDqnVuLq+as>g00B8l{2!AxF#OeI%N6ms+r|SwGsJ`SOISOT_|Ic3p9)W zd7F~BUsg8L;^%Bmv;R5vCB3tcXF9J4JTody^A=PtsHvD{u0${aSy@w6F?H7TS#YGugB8AD;W4^9SrqRyi|VGm}H}k>P)s zjY&Qu-?ZWXN8ILMnJIpAu*eg?Iav3N-yE#f#BX?TGG4_0UbDc|sB_Gd@QotkTQms> zIaXRTIo+h--){cLr%g#?|FP*Lgr&&%*~;|-tPh}>YzggMu|zUMq>W79Q=CM&Y<4t|GSRf7+>C%t!D?~nhOPLQ`k#~z9iC>Btm_m#v(Divm1F@;TxhakTR9jqL`=Drq@oh1HbCKm_h@Hjb#Nnc`k$`j+k{5^FJczA>Lw-bAb zOT^2?r^Q|3pT!e!iDUke;@RR9afY~5Tq#~6ns@z?zgF_i;x_RO@k8-Tu@$aStoK;a zyqgcXh%%0Si8zu(Ta9f-uw3$V66wu5`Oq(reyQ}vHY4JZ`=3Rcs*^-YH`-#Vk zLrApW*k(lfQ>7m-y|K**{S@hENN?Whhkl{-#wH`=D$eO z+$KIIJ}K@HUljL=e-b|z8${k^W4i-lvgp}TGd7zMpDle)F;6^E94hj@2Fsf!o+r)~ z7mLe8KIG2yp6#^jB%9v@(0jJhek%Po@j;P~Dl)(MeE@za`GEMT_=U)uqfC#*E<^Lk zIph?{ZACtG%5=wye2kW|XFKf#$-K2l{Rq+g?tna5GGC)${A_WPxLGv6KM=n~@;&1H z;^X3W@kMc`_@?-dXnwDtypJTC-z|_EB=fc&+Y=IbE0!`{uan1!=JyTc?vnZV2jlyT zCy2%32$AmC@e}b=ktaIS z`NdXZ8<7tIGrq4lL>wlL6i*e;5YHB;i8IA{qGwa>O3BxV8^s&N-Qr&HfcR&zLHtH+ zZc~kqVYB_MM7}CPneQr)-Njt7zj%UJB$kMyMZPY_{FB7V;w*8FxKQNdvrK=Xc&Ydk zajjS<){A$DTg7|D2gF~APl?o$fuK;e}TA6Tq#~AUM2F$Wu|{d{Ehg!_^#;LO4~2_6Y;S4o#@#{ zOXTldl-p8_iJe5g^Tc@b!W5VuVw-M!#m?E|m+lU=R zKHJXp{lpVR&o&yLZD+h^8*Q@WX(FFWxKg}G%-8q2X&;ugyx*_? zl+73TTbiF6zh0FK=b^dNDyA%$;VzvjTs~z=b;ZJX8!%X3jTg(|t7k?vTL%fDGTPK*neVci?sNuXV%@AtuH^~ zHVm8DI^vV*@N>az&C@ZC+p*X=H~wBa&V%Ol^0$$YaQU}Y*VnCZ0cOK*;$}4owL6*nrz49(V*vo^UwG8F0 zWh+J=ZyAJiS!hrzi%S*-1I^(9VH3{<%hoo_1AGk43e7cVd zVGoWG+Prj)R~fh@{zvS$6cpt39gxNC@7r&g>^{R8aL?g*`z_bpwV}kfrele-HmM|W zR?cO=Z3wNr_p3KLMONTYC^CBg zx@1^xaeT+O-ZXmu%l1nR{@r(EzI@=+>Z^(?Gk;?ZExx40zb?2Yu-3OB|0`b)-fWTpb{&~>X=abYJ+u`ucXJ!D@tBCyuEw*%+PVCHTWZ;zE2*0 zqWiX@)RKEk#+G~xTOz?>qwa1~azcY|i+z0G2H)AwAHLZBa@Q3li5r~_iC_D^4sYC9 zIC8(0nD|*rVmGA9Z}9cF`9Px2SrgjO;vU~&`|HdN9ibcf*(=A}8#C9i9UE5$Hu?@k z?9ic*FTWvF8p<#DDind?hQo=U7krgG$vUt%ui&dlsr6Zk)d^NU@*9$u6?~N#i5*V- zGH~F-;{u_`5nozKr;^)>20VUEQP0QiPF5#> z57a`eB>M6uZvLJ9qp_A42}T+LbBBQc7XTjUTQpDK2@$9Kk*xCT%>S z1Qu~-(gsQhHc&#aff6c(J)Bb5>?!?p*GnJvF1ZypPoBX^;a-CMHrGia7el%MC&Wtc zY|zO8nG-m8b{lb89U-VT)j{;P3D`uk^^-wVD#7OwsNmypLlur)8O zK3@X=A^6Wl*ndhUuZ}){fQGdF6R02EdW}&f@c)s2Kg*htc`H?+Kz~Y8aq{|SweH6J z6Hsm-t7R#}A*2uFq;omT&-eKPJzG{Y+#OvAxDnpGnQW9==Dv&4q4Jt{v zBhruIb5LT!oh_-i5{Khs0Yc_=VcJMZxFvi8H_vekd}-y+d39ik2ctIKQP? z4RURygbP%oKYAyc87@e28xV?)HDbCeMxr~AKU~n(6^)IQaG#{1P{QH@2I@6blgO8F z$3kWLh70oZC?Y4^Kg9PVqTN{cz_8c90W9x$iT-FGWDTDnF%*4_i3drHMCl4Fe4@nE zDF4le2TM$kMwoYq#LVab<}H-iF8V0*4waZ?waCH%hwSjkP+z2rK8vFl9+k*2N1flb z;nFZgzEL0jobsurV~~B(;g|&Bv63%>k%RkCHy4#mmti9%6HQxfhtCPEX6a_Uf7F6u zmVOc#E(^Lt;E(P_OTy*h>r8AY%7%rfbl_mgMhXi~yd59hRYSnP6#{IeoX>d|UJ#-= z{%9#XxiF1kR`e~Ky~wKwhi5p-PJIF;&kWxe;$jJHq=fHpp$xQ<5`Ms&3AB+Ceo#^< zI+g8uC~Qt;*hsmQRXr@xwUH8jB<&Zb=2T-)CH$!JW=8ih?{+gvw2^WV#b?@oissQq zN*a&juiNt-f7nZi&g0-dA1yLs*Jy|py%0Xfh^~#4@XM;mwUH8jMICT$q=a{>-a%3R z<_!Nf&HT;JE{vv8d^N4c6y@4T3BRGDila1)AAVbTOQR0D68>Fc2OL@2NI8SC@3p7~ zXd~qnihCk=n%IfP>PvWUGS6VzNI8)ey|2ke8!0^2%$i|7I9oCv;0N_MF6SdEg;A~E z#+Y>VhbQ|&9G%#FjudR9=yZv7QM2yTTA~ggEf-;083?c#|T5Gj3IHQIt z4i~9XwN|b3T&)UDb*yNuC|Jv2HG|xaB!r2f-^dB(L_0~lEIO}sU#dJ+nE74QaDG1Bjp(?z>zWvIS5Az zzpzgRM+$lHg(IbsX@DbTl30A|q5U}({7&K>r$8r($il(sNtDS8H6giNn?EERpaD~= zOn(+2$WM>MHerPLBcPDgpQBJFGnS9x$l!bRz6 z;7Fl>IUeP$!enry_$?TUI&5KZr09r1j;y#BV)CtdpFblR94WkE6g>&5WN@U&-6JG5 znNh)!;>+PEnKP2Xks?3Ucx0GDPY=Y@Vz=3v42~31X++sh;I4>sq};@);7IZNF%-R< z6#_>JjmeR60ZR>z6#h(*Bc&U&21kltixJV&m|lP*g*PUW!IAPd^c)AbvzNh<;!n7l zQEuLl42~3Eu8rb+-%18YiZ3sY{+juLBV`%#=ZYR3OapMF{6ZAqNU359;7DN!gd^o* zT7V;kNeD;EHs%SA6kh?3lyOvmBgI#MBV{pb0ge=30gjYwX#tKDUjdGkZL|PKik}NP zQXWF`ES0n=I8rFHP$GjPh4KwXCPzv#I8uHOMU*d%B!eS`0!IR0CP)TH%9|pCBZaFv z1xZRdQaF)RZo4}f94TB0+HuuM21g1zw;eg|lEIO}T>bpXHzbk3kun3hfFp&fJe$ja zjBX4tQVw|`PV_vRlh4eB38Lp6t`v^JGvSf6z-7YohGcN0aODF>${w~jI8qji2#yp| z`rv%bMYIkVqllh;EQC%6)=} zrXG$AoDo?q{sA)*rkscpI>#H?CrlZcmCdwBn8Mp6&Iwt$Z%cF#rjWYIsm$_{k$5I^ z$hV77Kl@mo%i%R61oN=p!o@5JQwGN98wphfTxT-=*n_fNM4S(K7ImK>4|{MnOT?$E zw^Nr#-4M}@M8e0yb>{i5JydiXAzw}1GpLR|tObk5Cyo2z3Ry+FB8%zq9F1RR6|$Q4 zaiV)0@|)DPg0Ve9bQ#F*Gw6gc<#jFKD% zVPKcR6{fJ6M~m(z$c@x}#%3Cm`Des@0rF$iEu!66(ftOcx*M*LPf6^tt!PIwlxL~q zlRtZ0HV4w5A-_xA5wsgGx*XW1!*!hr1HJ`N$XAc-t5O+ZAOenoD}0Mp^mQjg9tUT2 zU4ei1$79?bWsLI?a$Y=!ue%O12fEdjUCX<1ejfKqjFuQ9IdI)14_{|>-2%&W+#vET z?-$D+w2E8$I;-omuskAe`Jh-1gw-)|OJ8So-44rHam%e@$vscU!TB}xb==?L3^=QM zdraE3@YwSIO8V+s-G(H3lpy3I*l-WhBAPI;=P{h*X&9r7ZS`Vw>d^x@?D`_^*eFq3 z!YBu>m;n;4HzaOEivQeCkMAqEa@X0ePw$qAXp5m827@7RJ z+!_&k-vN#0zX2XsZmZc1t*V$1i_Wbp`07h>34$g68zF6g(`cI{+6er&8;Y(p(YS*J z-+U=%fJEB{=_QHQoyBIfWch!GL`~meivAId_!5j1om9}@P+-ydiVL^6C}Lzr3l=|w z*=k!&Ozab{1C|&mK6k$0E*QlOkaBRZiwSTj{&rX~T9UA5Alg($`x^hwg261f9)E+d z5}svn#k_RxnT&#LhO`Mzn}BJgTZ6cI?DVc-8f>{IVDJc|F+j5ZE2Lc#t%O;pAX-Si zLq#;nmU|EKW~XG^2A-C1#ZyeSLm>@@!{LQ$F>*?e!3=c1u-n;g6gig3v*s`DG!arU zn4Bg%jdQ#YzNE06{dO`1MCRgEK9>fsVH0~QU3Q9}!0Ubjew;Tnj@;67UrXv}??Vdi zgRt&9ueQ{Js*GzFgfa?)L?Gi6gi*BZ$6dH0?jMtqIoOU^)CYENBxNv#BNp`oL(Q8> z8ML$d%${9mxo;(T7a+*$&xGXHmF@aN%tlIb6hVu&3UK3~u9+6;cyP}n2YQn9B&mT% zLLHP$*?z!>Lsp+;W&2TjoD|zWK8O0$PS)``z0u}rN*1K{=|OvP`D8Fd{1kS9J+4sW zTtjM~t=vD7KJ8nGh3B*MFsGcB7T;ydCC`wbcS}#wY8AIc(P@coUJ}eiOzVF+vr(#j zQkd=1El7pL#n~>+8E4-QlN#MDz$Pm$)sY$-L2N=2y{V!T1tvpk{f6_0pQI1#Ow z*=L-?$ zFKeWSnSy{~^YU<6USpsHo0qdFd`B!EN_}Yk^eY$m)Uq8l6MARBVXhF) zgcAy&I(Yn69A{cFQG3)t4#q>75d-KL3FkV{`RB2xm~&Ndknq%WlUO%|8tHiu4tm0q z;ysPo;XpHG%sEs{BXcqr3UQ$~bt;;re6fOzeT`Avw+qRLy({LC|1iw-0 zY^ezQDsD(&tt2#oz{_seYOou*PCN(a;Tb!qjp*fkKm%|t#NZeLY9o5PNyy0rGP$_c zLR+RqKVMJatY8dK8<`10Y9liRkS>S+=@MZqfukNv=yy{XaU~cfRUA*?1m_}2^!s7W zmgV$pfx~aa7NIbr@Bkdzg}`Z!-=i(^W5TkCkm!Q(NKB3pqQKU2ap#@55{?5kNE}3Y z16O82+5{v&k4D3>;ihN;N z>f#&Key0%)c+&_e9b%-4{6@1ZwX+sk2c=Z2iu^_{SDeT&TK1hrG~nbooRP-LZ+4Uhlg?lhVEYxX25QQ&l91{C}n zGO%>|YxsrD%kHn)w}>*{QhtU0y9SK27IovVa@g9-+dPTGp_UHRrAF(B@>+;6KdHGn zwRAY=iksV1Y=ARM&!HiQH4kLzI*iZX-$P4yqlN^=sS}~8nl~$9I35xhO%X8-E|!Qb zN5p0#3<;VCl<}!yhe2KL_&-x9W0=jt-xQvn8d;L$KZjbnz*uo?DtOuzP=-?-JCJHI zQ#EEtRb-Q@cen)btX7J}n?t4;%!B8~Mm7mp4z+ZF5;!&${5cFLUE8slViue!hA}g; zN!2@C0(l5UTpajm(}U+J<}jn~YA85*%t5`;Z7@n8{pJjfJ!X!ej{5uH_`_!o{^-$t z0LOL599&uG`oSFqXAUm;bfe&SzGjY-;isDl$92FQXTndn7>=iN=HNu9y8(`;Zsv&h zHQIs=Y(~(*;b{nCeY9vJ5En{)^T9j0r7 zf)2mrcwhW1n8FvQpo2e7L5E>uDCnS83Ob%3;`2lgqY0zxNee7khJvo#r=V-w$&0z* zlWPwaEH5k1%PjTU_5j%&RJKn$ml5mibI~P}l};$pq+z%Yvb6e*2 zCO=&s8Mi2f+_1YU4U4w>b$u+{31K1E>lk*Mz=P-JwrV+8_}q}ln)xt7D)0NLbPC6^ z2ZYIt7EdbYkjQ-`a;kgDe7g_@8R!$9A(>?NQzu65HI#kBxpsolP8jeGVYEwO^}JNu zCaWFV6|8;5?xGlp?LcUkS{g1!IXv)}WeS#}HNlwHX^@wc2X!Z}6N12Ompae|CtkWc zSD4XSDY@MYl&mDjiz4-&pr*?h;Po8fWt4hpMP5d^7ws;IXOeC&XjKkwyCuaQc-x}A z4`=Z`LFk+X#fY97J2*OP@6NZq6!O85XO8r91&OkyqDTc^&qLBKV7#-XHIXRB&;`rw zi4%)K4(Fb44=_Y>B?z%u^~i(Llb@o-7y;}yuU*(}1F2Om2Cj|IkYru(He zz)S9inTL<#Ats>YvK zIk<9|^}mLh?u^;tS8w1!#p=GMo0&6rW!YudcI z4RzJi8jb-Elr_J!udt;3vy^plPBDC(G`+mPq5H!QhY7m0W`te;Gy|9XN>)|Zqo{Lg zs)U=Ws@`X`TQr@liU~e5pXknf50PM$EA0!j8PmZsJEy8S`HLKeCelooOmArTH zp#vVin(Da=YE5TVEv%`l$M}@yCCi?SNc6$1`swuz)?pd&29G-qOlHEZ_@6<9Hx@&u zIUAmE<|X&h+HPfF8W^{0`2$DQ@16oOf)d z|4hz1ws&*RJNelQa^7JE@>UP7|M5-???RD#hws%8TPpq#=iOkn<4atOccLQiEK;7L zI9IV=@jS%~6)#u3M)6j~&5FFs!}Ok1+^YDF;>U`gD>}FXLwmz{*G6UG%7MN}p&Ke-!D5X43u}YD5X{bL}@e;-LiklSg zSA16SkBU1K|E?Iq6+Y7w&KO{4m4_>iR}`)ngwI!bh2oux4=O&d_`YIm+$~`GT^0G_ zEaeG`(-gUjH}&T!u2%em;@gT}De@aO+D8?;DB=|t(GOExrg*91^@_hzd`R&HMZSQ_ zbpNXO55<2k_Z>e#VtSV=PZa-6@qR_w zb{O&O6hD4P#j_L*=iSd$UaNSO;wHr{iuWo$sQ859%ZeW=?orIeb1;^>vtqg8c*W_8 zixig=F*eRu{3#K2xmNK8#hZvo_YRfsQv9vzA6NNl#phN3y2@`UzNh+~Du1T9PxXB3 zm-#zbn2AY55Pbfa4_?qIIihm*^AK|n^{(n{dUeyby9rQMASiUe34lhfJ zEZla`w^ebolzt6n(nV0Vn_hp7HUmB%Xb9bj_3R%!T|s-LSU+;{NvtzVXBrQ$_I z#9KpzyH54o&69S*fd~H$r) zif<5+&O3^qD()qsUQQMq>K|52B|@L8a%;r`BGT!u;YX_e7{v<3k&2^S<#FY3$T#~P;-J6Qr6+cw`tKuHT{fgfxrtr}p0(Qr-Ptn$Apa<_Pv?_R}+6dzOEtw{l^ic=M5DGFCQ>=vrLMDYT}pDC_Zyj-zSk)M>aJew5d`V#VQRsNmgKVk6lW7_hTk>B%D7H)jtT9vOG*iQ+mU(!EjTTNL>?f(7 zpV>10JjIoY7b;##L^;>0e5K;`s^@pOj4#*QK)JpKKBIcM&PM!KRF>;(g#St7%XK#7 zJsQsMZ<$_Lk)PmFZm-yxi1fOv+)J@s_547W_Qxq=*%fV8L&c93KUHi}{8|yOy!!2{$d4A-A8CpQU+=_J-&wJn zVo${qMefYZbOtF7QyigKsW?V)g5tr~M>ADFTd`KLL2-rRD#erad_I@;!RDWW z_MC?5soeF0#DDrZuX)gJDf-A9A@vLanmAN#fz9u6Pr@7~j1(~VX|)Dvz!q}p;5Vct0K-k* zwPv|S!I?PlT4!TG6q&*X!lnfL@LC(Ac*_~%#vCRM&i`ilqQEQC{Ct@o>p`3cXX3zX z?Ju;f7(IHJu(Kcs(<>Rx?-%{_@Y5VmZzcRD4!l;|F8*hL^z$%b%is^DHwfvKpbgnB zC}upp%L8%XwKkz6PcWSm2wM$*FumHbe*Kspo5$351NjP7I4eG5$J0XAYAd;{@$4Lit`ZMnGfNyR?6KSuAms z_U%_z(zm3~k^N$^5>fmAOG`@n^@FagtY2Aw(f=^F?8XU_;bFLCui8?0QReD-y9W&l zug$OMytLb}q;)wJXXLG&l~-~4%=4{h_Qb60t5#RESUq~@2WM}edF#xq)!S!vx~}CF zIalUh^};94&+szC?gi&xjs@)Q&A|Z?~J8yzZ`wn_6E! zENPdM0jApFY3n+zProX4ZOXdj^(ziocBIkj4F1vH&JD@y+}6jzcl_YURex@~@_@5= z^lruK11xh-08bw&327S~4hyZfALy6$)O+J9eB z8@{IP(4_TNx1mj;qNH_Wn?gt5w99c~>%(iPiLJ|AKY7-meMg`o!ig;JagF2<3c^#ZG;>;ki2M1=AfNF4Q-EZ*>&sk){k7U zb4SB@2SWCa=;)nW7mwIEICAr@NaQwXA_tPPS0V0sp^u{X?)s(JzTc2_&E0!q;gtvM z#ZT;sIiq*}v3AhT5!NcSdThV@xs8$!+lg;xULCwY{6+cD!KlyOyFQe-e{S&Bvvv2Z zNMDbZb;dPi%^r^yU3DOQ#$(ZC)=%4vZ%RuWyz8UI$5uQRy>HhJiS_Zqp|Bg*ls21o zzE$L~R%x(`1gt`bwTi$h6t`k-%;|!iA1}0apT7d_IyUji5_pY*kvaV-Sz&G2X=jeRCdmP;S=lHGq>6UOQ(FY z?OoWXtWVn$N}GgO_R%TpmVbW79Xabefz5ZN>s*_I9z1Nl!; zZ_T+5quxo|^KEHCMOL4?hg|XqmW$ZsL%KaOXg59_?ha<(PS$SQwz`koTCp=^AD=X8 z8%AqJ#vVI^W&eEm_)jAC_)o&ahX98F_iP)zGc7M?{fuGLhUKh_?sk(>w&q-G56qd_ zXNtFV{7k!d{S*l&j=JFNBgz&=x!e}3+rYj!-k z$8s~a-o5{P9eIy^lzZKn3V+`G?4#TpwpL8tF?#p6eL8l!=cDQh_A~i`v%n9WGIDvW2(~J|C@6;so1}r#%JJ8RYgy00G-b!Hu`~*HB@KH`+ z?lhHNh@u2IfhVGo!3iuc?2r?f)VAORX4DYx@`4liGbBY$;G3aCn_diUCjBAajWwLW z_&h~8feVm)I=4syCouhBxXZ>{#Q{#>dr-^(C-4XnQ17f6|$z(=Eu$_cCy{uNH( z>zLIcoWMS@@gbbR|6moLkX9lm@YNKbYELFgasubEAD?OOp;5^R%o9p*0{0NHTRQh0 z1t&0Rn4N++C$OJUoDL~b{&BRl zY~(*)&tTfrASjbTt+>mQ&k4-di7sKf0Z!mzHU>C>@7 z)1n-~K~CV;SSfG)~ z-~|2!qkyK~CVl%sRjc%rYO26Zi?}$qCHO`N#?E zPq>*;A$|rYurDV#fqi*#^g-qaPT(2HpDTKt6L_I0zzIB(B@S`|-@vH_PGBY>oWM6R zPjCYJ3UC4+Lj^d2eFZpyxdQ?@fqexyfoIbKoWQ;UoWSqUq8TUf%}Ac5k~Re=Fl81> zWN-pg=3@(y4JYugp@@=2gq*+>I1;X7n}HMfF_FOu%teucL{&~;P9&9mPT((~XvbBD zoWShdc2}^izzNJ;{rtn2DG~{sz~>_uZ~{}6XLA{l(TxGt0)8*ViLPA1I&Db*?K1|a za14%vC~1Kcn6DL(6PPO>IDt=N#^3~=A|g0}dvSC`Li@ffM*8*pUJF2^ePH4_#6kTE+nlFewzh5LI62Y5Z>!bKcEL zcmrmn0X~x>@qHuvG{7HZWiu_(0FPo0f6mI`oe-xW zEBYi$_F-0wKS_9QRGvit#n`v*w7A4_J~CpSl_XCbcVu~dvoqiBg4Aq$Xv;!zzegVS zWtl!<@Q_0K#z9p9*SRlSZ)i3%+60-yxbtU>KP;PN?}9{l+qd&aD3Lu}bUF0Gb>0kP zyFzq)^_s6;bbcB6*~hhb2|)!&hTCrzvN7!AvzT5DV3$UZ@I zeB{q9CxtM$Qd9-#(!Zm$LKs}xlBtm~eF&To2A?RMwFn~l(+g1m%N`{K;rqkuspE^- z_Gr<40Qq6+_Oby+w`GCf#dv-R&L<2WlleTdI03_&@9`G03qbozT@u{4(2+!Voa8zh z8a|clvIz9PqT!Ick(ya^p=!mB{tMiDRH66m31XFpvBS4-3z4g3pCq~|kS9_19x7~~ z)P_-Ch5RyHR}K{WWU=eYO+M^X#9zoq>h?tObI0c$j6Yd)l65|A^YJa%!hGsZl@^!} zc^-A_6MK^A_~z;baNVxJ7+EL-NZRqY*>~Z_UiZhKy$Qj5k+u6h5I%tC9SXNW$j4(J zzEawQQHoxK=5$DWNLBPUggfE6iNePa_)2A0xT3#9m;}!R3cQQPmm)8O>)8v!5{?M@ zzYIR-U8m!j23n%?D8g+vD9(cCUsFPEYfVpj{%emR}*QHss62pv8~*3AV853>*Vyre$%|=M z!ZM{u_2ee$=joEyEePAla4c9{rb^F)*V*QDvR{J7Wu!8UPv>PvMot+&>~mgmWJdR~ zF*}@B9a$R6=Pf|U>rN^MW8YbrM$R9d3?|a|OeXn;FO<)sx25PuqpZ%GzTPU`Md=2o zgUtk7c1GD^%V~6yIiIY4+Y#*c3w5w>XSw>k1&BRXOI9*;1Iy{#j-qxz-J&}Mk2(-JC4vryyFSSigyCRPj}6O&FNv07xI*2 z75;<9im(D!|8aRm&_f%~m;@a@&Z z9C!wZ^o1vP3M`TS)ywIb4u>)k_?%hv^sEqJ{?bNzVtyg6ULG#bYox$}h$%fhpF)ZJ zPzw7c6mjWc|HMNn@U=^cOHYenCkjr3?;{gf$a6JLFB6CYIRJgMw>!W6$! z*TpL<+_9`~%rEwJ2UqI4<*bwz+Yb#C`?}>Uwie6}4HWFU<^?;bSarx1)O!|@5Amfa z^sp#G;u~mQ8k&NbFjEeOnPQkQQwoM1d@vp8Lqs+q{mpG`6vhd1r6L#w6U`9#SBZQw zK~9yeNrYBN4_$fRa#nyN6~umg8+ZjA@~FHGc!&Cl_rdwhwV_7(AC1eAM*8_?uOFV) z$g+L_ha?FcSCSPytSj^c-jl%uC2+e9G-*R4J-jyrVR|Dy{d{3&BRzc07a_Cbgo>yW zj$v?9;6NrzSS8*G1Z}Y~@XCRe)<1O0HRlp$I=uV{;~8%~7=!8O6ZD8LW4cq~t*kU_ z0Y8y;%Q`QF9W~4iJi-&g1%Uu6>DmPY_Ss|e$R*4bBp+$g;L7heiZs%I3rw5CrG&B~ z9R`=9g}*m5)5Ykj2f2WmZnmwHO)rC`HPOWo68#Io?_BoY_hw_d*JOjD$$@7~=q4T* zg6ISJ@5tdBm}w`t0lIhKFkT2Bz+ru9XryPiFHCQw=WAb>*+@@{OwakVg)WpY_Tcw` zK(;v7s$ClA_Juwl1>pMz$bmoyUf zvelMhoUgTs#&!7nP9eA!%Flj4RHGNj(85d8LAWH*}8Yg>~! za5uwwU~mQ7FulBmiY0(>FB~YRZCR=w_Vt8E;TQvK!}QAM2w)p#qkja4*aW}*5!(!7 zLSQGCY1=h<>(z*g9ohXyUpM{euGG z^z%}+1$g~IFWh+%sfG(XeOUrdVGcnVe}@U9p1)_oyg5!;=)&Arq;=3-^DDCjNg!3i=_pOeTC-t!*fg6;%mzmb zA0)?%;l~OULk^QAmobDDa5{DK%;+?-Mn+wE@DnN4J__=CGDEK!6ee^S{blzq=vAxH zGz}JV3nzyXdWey!S=)fod`T~nkjdAPJVR)qKs%rWI0gYYx-h{KU2saG%}+_BVSIk1 zCneHE0-K$^YucUuL}C+7NvTdGJkcbVDUGVj7<*KXte}>|&>YCizs+>56kq~@Evjvu zo5*-VBD47Fh|#Rk{WyDv;O>$P7WO-MSVcAwjm$W~gRA#NlKmLMtKuD-$a#!O0K+60 z4}Nzwj5qml2@k-vz*mdOA9YUtrm(ED{P^dF^QnJb%qFm;bb-F(&kGLue*?U92qtWR zOSaN*uCu(s%4?*!5iZMDVS&Yo(dfcXdBPX}EJE-TM)(7q##@Yd6t}`@y!nV%>&G({ z;+_SpJ)MUdjOfxxFB>BwVq{?3`01c*a3FQR4dEOKMAnL&@}`E4RThtd8HLbQa9G&m zdB*SS1zQ&5nyJx6tiOl5kHSQ1WI32FG?uS1i5T3AvCssEm7Tx=5W>aS-pk%w!y#>d3 z=3r|w%Y)qYkbCjvr~7gKcp&9G?tq4CudsKa4zBZ$4ZJ9>MzM z;G`u_&^?lTssM!oi9eAZp1&24Q%Jfj%YwArzkm)(t0 z3@op?F|S2?FTKFaa_2zrwl4NsfS@AFJDXKyhp&Qgct30pih2cat}f z{I+TCFV7+6s(aE%uN6`|mYl%3ZbPxxjlNcHLyW#+-#1J{V;+3Pv=gRUkl*Hby}?ae z*vT7O?Dg*D74?pJrN!P*|3A56QHY`LLNSl#f)17iJ9_}=W8Ku16bB3}f*|y|r3oL% ziQSZ#2>_l*CfQos>*A)5M6rh^n0aS0l|z_$QwOxnZ7Hn0dEn%YAsz~n$AXA2sRwWg zdZPf15^--2#n2|{?rZ0O+13jeAVcu|Pr}m7-|$ zTrWZsaKE}<2lq{q5Q8we6*|Et(`yg+YH+?HazC*HC<2L$Q7#K<^m1>9re~*#uynUtwjXf-sd!C9G<`fGirze4 z@c`uLzG2x&Gh~O|ht9EEdYxI60~6jE@r`z&in2SC;-TZb0(s75ch_q zwsI3A&$DyA{BV}nzQoJ#$^T_&O^nh)FTJ}T{SPk7?-dBkZF~3LrEI#M?(;6&I@R5> zloct-%|SBRUfBr}yR(}NFgZzOi_?~46I^Vkn->?bt#{fEY8;ZWyC z{D`Qt6!M{^WMS^jUPyIk7GvzTB!_ht2k;`ly-k$$S1 zny32WQm}3(g*$O1fbN>ZgVPG+zB`xM7>-xk?5fh1)O@(ij*Xm1#^enck}bn-1_wkP zi-MIQ9SqwD>jX;-yl~gnx%9=*Z{bKjMklnbP9h<<7ajvWOwQ!YfenXuzD)h(4qmH# z533RfeltGg4n9kAbFCVZ4>{G{yqqo3tbIuSojWowSV1%bhU^}9fLDmYfO&$E>7d-0 zC|+0!-dW~LYyg@q;%)*1cq$f6t`srI&sj*bTMQAy?ib-$af|~f*?mojrL_({F>!NC zP=(%7Cn0SU()ef(#vxXiu`J{UAsZO3YyLwJ_ zT}kQW8T0DS>N9!hiQ|tSU)9&g$-~BvnLMU$-kBf+hEO@J+B%~C#nNxdm z^=wS(1+zJZPO6+Y_Y9!YS=TR|h3UR%T3v8`nK27pioy3Er&9*m@|=I3N4aKhP2Cx1 zqd0Z5xXfX#!wP8C&zx7+5c8{8H_fj#rSGCnt~v}`yD)G6^CZf`2`)V{w`LK#WnlwW zLo{LaVxbJ5-LJgbXA%c1vaGdOL#0m}=2%ti;D44t8TIfN<>~eFs%C=vTpC_d_#aJ| zj0>|NXAjrzoH4iI?AjWvP101;=PlrhfhmC>AAj}uZW`rg3qXR9oxfQ4(W^xgGiKFH zXOmaYuE9^-jCq`4_}MGN)T*zVwit}*Lox4WF!!1o40W!LO1f^Maemd*oF%giKaN;r z=2Xu{lE{OgBj*4|VZq!M!3G?R7u8-k|FE+StPHgy`sWsE5*G!M$7jIfkef_+; z`dI&7WhJHkd(AKJHK+Q_d3D`ma%CE$vb3zUPpn&A4Q5q+P50PoxQgx7zt>b0XxhwJ zUCqK-W*o1+L((=t%wgKC`8OL&9fe#QZ8!c{y;no+5%Mv-buZt%cg8asq zavLJwawNj2r|SDC4pyvC*C&-l_TiO_8^GSq{UsoTG9_#lDJz70*!Qtv$xO zP;spyZ|PBgm*T^U&ntec_@!bPLyY!EDGE0mghaHm1$ zD|@tmSMgKDuN8TlkKw%(k5(M1c&g$|#j6yB>kRSkR{8geygkYEG8KC%4p8Jv#SEXM zDDNynUaayxiccuMuP7X0uoF%&UujyuTZ>M@i&T3DZZxo7sbCT zdKmD`r=?<{qHt_MKV0RL6l)auqC4YVpm?R?t%~<4{$6o5-|B?@*@{0^yh`y_#U~YC zR^@J?19mUW&&ko~ZZ}#W{-SDqgC1z2dJFA5wf#@jb=eiZ-4TGQSpz1&Za0 z!xh&k{!;NB#ZMIZ?l#jIuQ*k)UeRzZFIRc3;?;^bC~j1|UGV|MKPdi9@ms}AtX0fc zxRZd#sys?@uHsU~RYZ)9ixe**q7IFU!mSMXHp)ovZq*B?67&zM{u$K^w=(owRsXi? zgJsa`mlpf6YbK-CXb9H)4) zVvXV~#l?!kt&DWeql|ooqY1KbD+8}k{RXucZe{5IP4)Mv{yxQL75|_p+)YTAZ?m(W z+Z8`k6mDhcg~JIb98SO-#G!puv5R64#ok1?qf|ataj5D?sXR{c6xB~t6fP(DmuR@* zP(EM7f1!HebV50Y0a44g`H5xukv0lT^CL)~+RR1%@D~aeE;Y0=s=P~dT)!R6QV|b=w zv7&GoL(hZlj-Nw841YnM`BC3mQ65b~E>yX@B2SrV2Wl2UzUM*tWJR8vQ?6E=sW@A) zUU8A)GR2jOKU2I^ag*X5ioa33U-4>QItJDkgnnG{j=)-rnpa$Tn;Sv zw~DDezl5Br$dA}4cUA1I*hi5cPceL!Vy$9>;yH@T6)#e}L~)&>obMu?MwM?;yj@ZD z8bLT|G??Ebiq9*)r1-Ytdy0J1j`lkh`Oz5VFBQL0ba?&?eX=4sF(~t;2_j#EB7#*y zQ1&!|T%vNhqMUa_KU(FJ73Dk}`hz)v4Y%)AYIl?3t%|=59dQ_^?9sV--(QT&TE2k)Ikf{>6%G6t7UcLGeaK!>xO#%J(Vq6JnF8%KY$;>CI3yT)OjBHe9;PRF>-m*nbzNuI$l*@L#I^ z4{_=~sdmpQzNGky;ya4l6?Z6-BZK88=>)M!k)P00c6prvOi|2Gj4HNM?5x;L@nFtf zej>_rDiy~oo}xHKak?VEAEo^{igJAf`R6LjUNn$zQhAf&9g1?Dgz%44-lzDb;x~%& z)jaG{d3^)SRLoP1DRxyXQY=^OuQ*U~sNyKaaf+uZ%JmrXnW6HTit`m0D6UXkrFeEJrw!tWun&I8U)&ak=98ikB&_Q@maAPQ_;wpI3Za@jXSk-bDVXybc8B zDz;Yaq*$nExPHr2=9k5cC)caM(^RffoS}H8;sV996;~*(QoKxYog%+eX8Lz1%HBbc z<$4x)Fh{Ul-$K7t?fFqNOpGaZRV-30Q|zZWM6p7VUq>^( z>`4SXPvr{~Z&BQ&$Ssh4xg@((XL0p?~4Z!@uis?k?^HrAXTZH#gxm2;gqTwo*>s#0fS22*E zf-~KzinA2wC|;oWGsV@4mn-t?amK$}QLbMhKdkZ#irW--DDG0+tN4YYT(2U&T(1IU zj~`%fUe5uKQao0X->6f6y5bDQGZpI;7b?o$KCr(;Wqz*C_`g)-m+6%6Q+!(SIYoY$ z&hSqa_bGm37doS ztqeh_hw&Z<*`&>&6$m&XON|0yL*d71fi(z@$D>E#x)%yQ)54IGdoC>3c(`DC&tp&w zFqH~~)dc+TT1gl*4`Y6s!=zCSMKIs~!^mRc=ga(94`KtHi36|o6dEc7~J$@?8VJi36|oR5#2M z7F-V#b_L{MdRx$-G-G%oKfrh?_W59P~(j^*RWNv6Kf!H;gQ1;{ZB>6IA)X!0VOIl$n>u!}+2 z3VuE}WqM4Xc?O1&bv4ExnlOHt^cW{-_bkfyR@^F)FZhZ3{Y(7BN0js{kMa0ne&Qw$ zZcGb*4tK+P7`1wRvU~JpTfB?r?Y4$h%yibSJg4U{cirQAGTk(Z{=+7wy6<*QaPtGBg##(B3#!h0e~(=F#nd)>Vi_IhW4w+3v)k+-eV zHp43-t2+$qIP8RBp*7)kZPs61;a%e#aQ2pdjPMZu5k~zdpk8b1JfYe>qBeE zh1>DG=PDX1teDj)>55mItSxTETTRxOl#1sMJXKabGi6UC1-Fw?b=@A9KaV+`z|Ykyl>O4KlgD^ zJA3`w)Ld8(+i&l6_GLOP?qVG`t;pCDv6J^i+|s5%)>h zU!_&Dqy=D!Ep5tpu+LX1Y3&X;2U2$JIx1yfW=cU*#^%zdw9Rb~IQv7pc9w_sWrhlx z(ke@vQYtSS!jzbbpF&F7^V{yK2w%P6*G~VQ6-PBW?d$<1=!NV9&K`Hy`+eMfnXbEH z@3#B)*yv9uoV3SDI`%84X!++|?o36KD9L z6%Kr%lDk)A3Lozidn`M1>#z5p7w@0q9V06CR$Q{9ZAE3pJ{dn>d<3@L($Tv!Q(`;H zD$>^56?rqsxElfEZUl_GkxDRPR}O*OyX~PJ(<;{NNW<@fKkq|!B_?m$8l08!1SAq% z4IqPK_d=)+;n?kj#V&LWetHrdyS&d7Iv*=W=!n+S8P)Ol=sWaV#0TH5+?IEe${CUC z68Ls6rd7x*rBwrCk8X3lsFDs)wVi35(RvG25wDQa@mO3!v)XiLe158AxOZnG4=q*oKBX)04MKkCa}pn4MAXnvqHSH2~J){4ZX>*JKJ@DpPam}(Z-J40Bt7y zp^2~sCokJGi*JgwPVOBUkL1(KU;<8F`kg~KdAFdL0Zv}wA}xz^@^bgPLpXV5E4~79 z^8OXsq`Z%RvtTE6L*5@CMRM};!>x4Q8c$Ae^70Lm04FaWgakNwc^^B#$@@oED8b3g z9nS)syzLk_!O7c!aR((If!dP?_AbU9tYXY+5rZDf(#S|9?9$tySHa0kKUyTc2Raj+ zycAt>^76hPIC)ty$WHne%41bt1yaoy5W;VNrOM#sZHb}@CojK&_uKpQ7W6Z9zQq#Y z+4M6bZUvTn z2q!Neijb4{ER<0>c{Rd6!^t~c+A}TvTxRt^vM*+2S52K^CI2q_Y03EzPTnR~@d;@q z_Qg7iPqml3v*6_ATQcC}?TgZqlXoXe{haXHItAU*zd(}U77M#3GnewaIayK@?$?GRIEd3Q0Bf-i021n-GDgDs13z{3f zjP?Oe-fYU?H2v7abZmgMB+R1!{Jb{;u-IY)$( z_g7Salb5$Pg_HL)CJ9bn_K91t-HRU2G{MPRCl^N|ou)qs55vIBXL}h|fm`!okZ?D3e(^dDj~mi~8eiMsV`-Yvk5{L3xy`MTg`74jv7v+tc&ppFUSD1u<%2bH@?MGjxuQo0Gr>!ptXo6@PG0amH0R{Kh8E!DWfH>4`&;G- zPF`ODPF}JdkdxO}fRlGFYXMGPUja_u6|?{+ude_n?=!S$#>x8{l4q%;O~J`anS~M= zoV=9pHL~I4eIJS_Id90xOM%_j#5MpY?;erC$;(BNf+VG!yqriX`<%R73EK5yRB-aL zbKCKuB{_MStDislttApTdEbL6IC-hcv$+h&=*9pe#kCjWM9;H1`OI9HE&56LpTaS? z5*|ql+__^|190+k=a}~x3fTPvs<*|V*?QOCZQruJ7b?K1ig7iY-J@)LfxJA*4R26WY`NAm(dYREZkT+7thyC`jY?gfhTAXLNogM0ii;nv^ zKSABCFa|*{?Jhxq`Hn?rZi)+nUY@e#AqtzWkc|O?UfOXL9zY!%1O&a*@!i@YxWYmt z3W8qhWT_~1Sx`` zm%0cBG9RKArXxNGda2_>K|Uxn1icYtaT3NjU;Zp)7l5Gm0P^?(GB@4qA_Tq6H6MZPvmI1~^Rz4Y?| z)i8#0sDPqZ!e6ET6e&{;!cK)Ne2(>*D7q7Ick2YWLOw;eC$?hQr$Xk#p+fEoZJ(OG z1KDwdNd6P(q3 zH~#TGIzPsPl3XU9i||=bH;LivtnLwX_`0~|3sI)s8CHB6`K8!gG@(nmA*XlMW6S@I^sQ<&7FiaZjF4Mlbu(NkO&Hi~8nll=^N7Un!RXY3!43cIRYez>sISA| zRk)rEkZ8Lhedb4-k7%1D+C>sAeH)|Q0Ii3Lx^P8nAasPMJ%v>e%Hb)4>&Yl(uR?>~ zVE$X+as5hM&?3w{wUT$C**dr_d(|})xKCr9nY1eu&;1Shh6zG>L)u| zC%N*gc7$+CC%dU!G5hm7At%MnU?Tm`#6Kt17mfh8bgJ7%^wUsWC(YMeM;?WB&-ub` zXS>HB(|%nkerczPAiUE}b{bdKBk-NA#?#uO)S~Q_&9Y2e9rtueOw`G8PO%8HGV2R8N~mVH9nT`YTEmasQZ<%#nWd zqCT*DBPoL^9KEO?czoYX%AlQf#O&F1mitzccRPZt6eh%JFXvmfHGrSf2vPPE2ypwc zdJucj41NA1Q8uo>e!dTau7evXo%Ma$dW|{joC(rKJ zoILx8=H%J^o0DfB8B8#i%H)oU+HOW_s?Wwv#nI`_$hijuqmaN`CLtG6EGgExf;eBJ zzcZ1qE`wHkyLjaNWdsm?=1l~A*D)6XAW0*X!yY7;gNTe9vi8|y8tEekDnp2ASk?Rx z`j~!@W6fmaLa)b2Ah_8Gli@(R=?D$)VhA9oz6UI}P9udCa4;mSh6ADGJJn)N!XtRq!*|k=^li(-WqFMhn4g%^^J*}Z z!gdo%4_hZ5mxAB;NGwnc(=Z1WuB{YqJfR5=Ic{D~&)1?KM?m3yJw1*oG(B4A%?B5H z^YTEU{m?+6H!lwq+7AsBdUK-CHnQMxP?0&2FeofyD>$?*L3Zwjn%EW&q`1o(>0v3s zzGwwomhnv)O_(Vn!%PWHm?+pL+?t_+4#;lQFyU{P)B zbON1gEn6moq1@N=gM=k;$YBgWUcFlVL~_xgv|~7^>F37`)^;A=C@P(nfkX^1(frm;n3`Mvs0#e{P;?RH&LItYx%-h7w(ZV>+p{v+!n*0dF>@ zyfNZ~x9>3uHPT=OT!J?{kkWj~jKL*nobO4;X*7N2aZxJ>nQlXen_dGscB0FKL)-Kh zghXe3Z!V@AH5YazPpdFB2AggI!%hw}HrdNKsPq5B!)0*;71rs5 zjpCg^;B|v*HG~@JdC}JsUKj6agza#yb##!6AWw4e)G&11UD)UO40xYNW@n z$&#gknoMF%-hl&&DPcPtD(lxIB4wVyTKobI(`0cYJvaJ7Z6iGo_(EMHJumt~LnA#O z`ohA-&*0e$ho3dVH=?g~8tF-q>Wv{}z~NffX+#<1aIJnoU3rG75Thw>3pc6l>@2LO#ag^URzqv*Sc(jm*JAE1wJb`g*U`>JYhQ=DsM|gK1ZauA%*>L zXgz}8vkkV)jbo7+iM7iL8|mfph6dm?xl%(w(oOGm5^@URMmQnq=0dmG*AqBzl%$(p zE_tMHHIoDBa$Rja7C(s1NAUruISfCt!K!}@Q;^uEU?+GR0E(qD28(&4)IdOsofQ=m4Xhn{krEp*{=cM=7^vM#8 ze-Yymq^;jPU{FRTyn&0pCU8~=QFd8gV)9PlHgXz6zv(SQ^Ba7LPRe!M4b8Lyv8t;a~c z@y`(@2X3HkGJ}iS2xFS19`@M~i7=kP2FJ2iNz8!5$q7N1#7d0>FtZ?V<$!w_@%%HI zPn^cR8YN&3Qeae=<0Md6f33eml<{hz066}O`&IIkfBcTK?ZKa!?4A#$Urm`h_KMR$&nt6fVe0EH7iW!_;3-5;cm) zW)u*opNHG$atXkRZe$bD$jq_%!8No54nvI4AI`OwdX4l<^7V;=j5q1Q+9V_8pb#%m z1)_0bB946ZbK}^Qa{BmmY8Y%kK8$+P;P&OFTdpevLQ!|*ZagmUEuuK5hYK3VSZI}b87u_5_s>n>mBWdL1kWV{ z%J?a{>oERALjvn^L`)w=l(6NWEx{{C#AYIo!UfF( z%6OI_&UTidW$94H5o{K7QEX(W{KMG`D>|I$#C3SX7=BK+gfg7!*nw1QnW`~Esv?^N zyu&4s?z&Q}6@g+g4_=BNS}bbm0wr)jbnBn%29&Pt*i4Zx(VAiyGb1O8WkLc8M^H!ob8tM7IjoF`$1Le!A^&{K+;4e~{_Of|e3!Co|@jLbn3W zjARqfgs(&x2Z0&S=7vGg&ZNO~%+NF8)R{Dxju|Q@oERJz{963S4G_%M1pohRfKb}^ z|CtRCyyP6u29taHA=uL(C+4*!U%K7Vi@9L(HoG5WQ%H8xi~a2kvfb2JCu~YkUkoPm z%wm7zgKQT(@@?IDFpO_?(3|@k1P*R>pw!`I*zthu=iKUm+~C~m07T;4>)>5)V$9#{ z;G-pEV$XE1^@KbeMB+~@0W~_J<+=WL2iz;c-|hfJ;xVXEh+Gydjir@+407FBLXysH z4_fMG1`&523E>S{Ikz=n-g)je?gY>>w|6e{AmKQr5NO<2rP(3J{klFDW*A7#JBHmR z5TU!dtyN2zksIg32&ruKQ|S~g&K?jZ3w=DPoI@h_k;tj;_4DmQq%qJZmq#+m z?%R&E1FHS&bM3^|39{?LAzLS;6r+M(s%`t*Clq_dZbmV-O91D5W*0BDeYhCq@Ie2b z3C!+?R$VO3lEaM{kX^)mPqtG?X-unJN261gy%j^~Ms6ykalf`*0TD z6NJJp;2s{Sv4f+tv)%c&m%?F=Eey~#NocTm*-}xY0nQA zEKr=!t8W-TbJh%U;_FTfwSDWY*{VYdLhm0>XATJ1&E_7{W>$moT(*{wLSQF}su>Gd z66^uO+)d^_8-EFj+y4jdWe^`2{~5a)3?6qJ2ni9>LQ1K9^5(aqnr;lTovzdx4#^S3!@#=?(LXH|Xoz6Z1G zYR;(Qb~fXNkN>~D3qrGUC3Xj30cEQATPvJV(=Z)_m;2sePl@T%t$%F;54q66i;z__ zE&j(&8dde&7698!EZ{B~x{=00?2QBdeunx1^$nOlXI0Iv#wHw?OTnq+Z&$#*aAbEM zZr*}j1pJwZeLJwXg}>)TvweO3v$j~OmQdr+b9e!MT8&sP>8qMe`F5@w)bK7P>?xx$Q}w9ZDHi<;OR5(qLSAuTai2? zl-m&bNeU50>|5&lC=OPvP~^Q^hVyMD;u(sw6_+UTtu%&Ts<>8hgW}DKcPrkf_@v@i z#dj3>xRdGeE+P^4YX#F3+bWtp6ojJ}c1NgwsN!hF8pZjFS1IxiBh%+yM&jd&Zzz7C z_?hAX#n!l!NBgdd{S?nsT%^c5ezdznaiikhijOO9Q{-LS|HIyyz(-Y`{r}#~OeWie z1OhV%=tx+VC1FQF!Xg5q0^(XQge)YOO%hg7aaXkN+N!Ns_kF9@YSp^$t-JQs+Pb#Z z3e~DDTCM-z@43G_a}xrwt$kbnFZc7A`JU&T=PdW!bCjao2}1Z5l*Py9^$0p8j&{#x-)@iFlg z@e`5fDD}IFeZ_y(m%=Ypj;*g_w#pY6KyR? zlw)g1qWpsuzfk(MlIulVQxf`XC9f0D6lprhc3vi4CEg+4CED7OD96^6g#IrS|2&EK z*CoFx+8UFH|48zuVgzxlFI&tf@#!hKkGQL7J`4;tCE9h3;%^XdB@urg3BAW8Kd%ZL>Af$0qWI5Av?E&Jm6I#RNtDw^+*vGD`e<=C#qS~R zrFgDA$aWp5c-o(`o_fVMi^~;%wB+N&?~5@(UfH%I9U6;G>KwtuPED7KI&f34(o;u$2)&$~t1zEXZu z{7j5?^WuAm#o{#aAaR*U15}ptu}FJT%G}s)JT@9}8!=*-7!zV|vA;N2EEPwK^TY$i z_C84J6yG4)YALAyNXf^GCyQr`=Zm+C_B#goelGbT@oDi{@pbV{@jdYa@l)|LF_XVD zP;QPG7r9&(<2fsYEED$<_ZH`i2a6S={SHDt&cI;)72+}C@#0zHdEyVnABi`Kw~1VT zg5|v~as~$F_r#CHPsJ}phrf5Amo3J`9^ww7{mz1(?~7!V;>U@5iZjJ|;(?->4xSs|1; zWHqUh>Q0>*AZ@d*TOTd!Hmc@wwk&(f37CC^;ea7P&qN^-D#rO+tC8Xg>cSua$g? zc)ECzc!_v}c#HU)_>#zl1zG;*Vo!uAn~y-ye$Rqa6mP$45uPjgV9|c(B3v!GPFyDX zzDbUee7tyt$fdVf?~lbh#rwnu#izt)#FxcaMK0XJatg$_$ORD@&-E9{0pf6Rq_~^7 zhq$LWQ=BIrC@vH$#9FalY!O$A>%;8^LIMrEU}B&P3$cu#ew3kB3H{~{&C`DaZhnyah~`cv0SVb&37ZpX_4&v zDp@D_1kqNgS0)#Xe#`kxS!H zuT&f@P7$Yz_Fe;eb0r@t9wyd_4PvXfN<3aXSv*5LNA!J@Y><4Fc%68Mc$fHq_=xzl z_^kMf_?qbZCiy~g2+va7@2F_+RUmhhyo0!-I8fYG93hSoxug-xJ4CD#8^qP(QR1oM zcf||EABxwCH;RvlPlzvzuZmngiS>Uja>X&q5s`~2QRc#9M3Ey|;m$?-PWpNLhPC zt`$Z39g!xixpo-kSH(9;=y3%x#(yGm zu`tTnBG(I}Tr6_QFv{b^nc_a;d=lkWN?syz5isVn_Zr~w(mO}-7l>T(i+b0KT=a|b zBO=%RqWr4JHN7Z*ByJ{A|Cf@vW(?D_NW^o+FUq|{uI)v+M4T$_CGJZi-~N*A{R#9B zQ#=>{Vt%e#MV=s@BA!Vi|9O(XFK$pg7Xf3w+r)>&$3(9B#q{5Z?~*9*eaV}|PZe)# zf=}+ajkfYc)EC&c%FEvc!hY4c!T&;@gDJh@nP|C@oDi_;;+Rw z#COCG#ZSb|;um6;-n-cU=r~@q1m|%p5|d&-(d_t;P8&Yz(ISa#|Nd#3;^&C%-#;x- ze63h7HjAy|I`IVY6!CPi{d=iP6@P_zjd+82i+H>EQ}G`0aq(&KS@A{D<^f=Te=Yev z@dNQg@e^^g_=QNf4D2tOfRq0&pHGWorMoxIoZZ*L~!%tMt^g+)#I2Z!`( z^RZ$v-_QA*pH|&Y@0A^JU+JLU3g`vv?LEhFxELktWqsTavK1e{Yy_Q6!yG5cfHpsk z*S=tR@1TML#IZd5OiGn^GQxfy1fBfhcrL|w_cuT7ctixt`-J6Te_0;7Csp2s2>W>u zbOw~-++oAD`Dy1v4we^2M^TOC;c+=t-jxV5PYFKU293w>_IBkl{T6(Jdc!B<`G^^` zF^!*lMMXQ;K(EXfK!3d4g>bNad1#;Ce|TI-weLxU(GAUjZSSGH5xxMjPHtqNTbBlXaI4wLqbDgvEbv+Z)Gkix$1R=&g!}{}AcA`Cj`A#@UR{@cJn1(!ojI{n*3v{5`R{ysr#5lXE3P zT1T&AJ9(@5Sp}|NACAyU`d<&WxN_NAM zazaP2tbRrO>nidPBX(e`hIFfAxD-1TDk)lvFcw*#VU5FAxNpy|5S1B@pjpvj$l!)t z{ML;O$!7~g{NE+A%)(jSkeXTT#;-s^b~tiXXdV)C_+~S5OUC=3!Yr8St$z|6p zMktT^At#mW)1y~X*c)! z7^+>unc?fG<7VAtIhg)DDv$QCo-3dm`b2bi)*vwd7ZD_sc4HWI6qXphpbku{WH<#1?_CS>F8_rI? zCh8X*oAm=2C$TLPB^KllW=r>w zSd_mL^G=eO$Um7Cl}YTKPruC3$r6)JS03vuH##e8XS5){6@xFjcMiks^}aZm(b?G) zLvWFh&xtwFeRH^DkTde>Ts1mZ@(CGE?qx_Rg|_W7oZg&|mY(HC7iJyB(yhM_>&h@o z=XAVid8XF|;ruU=H(HT>yrpL4vtiN2JF>IP=}l&s1?SSgJwK`;6JFHtgWWB-0Zq+{ zF3;i|#C*Pxj;<)Q`G~0K6E=ILUl9%uM_s`f9Kzb@9a&{)2A$qSf6`SM==3Ifr#})3 z%U3$lpGwNg|D5f*E89-s;=KGY`}1yzp3|G?&k8R_E3k}z{zp{4M|l(ZTy7)!P!4+u zPH*zpagQJAV}BnMC-aZxVSP+KaQfxn!Ond$Mt>u4dXqne`}9=yEE9(mmM>rIM1QG@ zJf}C&XS4&J)0^nCs&_*E(=6(R!a0_=EI*6li-n6!oLX33kD^{tQPcA2i8=bJ^3Kk` zl_UMN94;mdw;TD{O#MyQa&#KJvE;u)@vXcIEcM|0mE5Cu@_7cs=}mq;D|%OhtqQ*b zc&wSVyM3`Ay7S?>JL7R&mLe&_q#mc>kPQk)7iDCzcjEi9+{GDcloMae&VbXK2W=O^ z@!v2VPH#LpEB-T945v4qoEN79izuAlcw?;~&Y7Z7IKBBBx|~jLMpGY7Z@l!9IA^{^ z;q;~uyGN%tGg%*;-gxQb;{0bK3a2;4mOddqm48M!=i(JkeFo!tl9m(9M6^SPB{4^D4>fxSxb?R8$X*v;bE9k*)By$K8X|8?Oh$ak}q{ z!s(4h1Zw1tXNFmP;-@GtKRU_H;*(nZLLU4ww<`r)m*P(|E1ceVa%P;b)1z>Dvly+T z)0mvTI|QdURHoCL19)8F z^oF+yI=wlbRiBj6#oLP+@eM2wPH!%-^5(>E1fy_z^EmV}Fb??7WE4(syc4cAK8W?f z>5V5h$GP}d^fX^y73V)6Q8>Lh9QB9j^yV=t!0FAA76GR>M{#G*@LCWmzSNDM#8V4S zZ&;)`y?Kmv!s(3{0jD=_@MMD18!rM*Z$9N-!0C+_0jD=-F$B(%A$x%-}&6nx)CVF8;^e2djb5=nVPH!mi@IAyngVUQwO7GBR(5>P{o^bxiVA6zU{r;LA;(iD8Cv z>9r{fPH*@q*`X78{!|Bb7jNx@ZtC~6&x`oRjMBc(zW|;Ar z;n(rqGnxH*LGGz&L3|hF$o_3X(L*3R{ZiDP{YF98PoRbev^b~8X20pn=Kd!8t%5?9 zg;OZbfAq88F6ef>WiN=og$8H8Q_$5OYjHhZgFerG*Vj+b{Z01oe6hEa)r-adz98bD zExFI2kgE~s%LDsW$cbD4p*Rn{m(#x&6I?f!f5knCpmq69PULQ?)MCu#4DQW%sciIB zCOMJUsq#Cj4DHQ$sTANSSSiOi5&p6)=Cv`Wv^V3WGSXN1%8B55;S_VCdCutGjF-wm z2zu>xoyc_RbU~NojPK0^>G1Eg)IKex4m}g(Ozh1B>1;^pM4iYP)OiD)kTbbA6QuJ{ zN~enxxs5udZ1SGHnIN6tr*zOcFH@%sBOzyIZze#8hd&3MZhIbgA{>jwf5B18**C#> zsSNd1hC30?!Y;lG2R3J3g7H$B?%Q4ofgWI(!K5`Y*$Y@O&*kpL?-5!3632Hl-7BBEO{0diGyUf(gb|sf`0$)MitHv%2}3R zyi^)|74+XisyxN?ZG&`I^* z27f4(q|Vhmp64W(;JU@Tu^%qbsao8N?YKy1W${iN9hc|?EN;aC z%DGJETJd{0adWQHSylW)To7}v)A>{UG<)SHohik4b8Ot^pA*lZg`7@p$EzE5pG}Hz z*Y4`Ycr=?ToKbBmI9@S?i}`9L=e}NymkR$JG?lSVq=YI>Jh2|?#dxVy`YO*jk^QNH z|393Z$9pkeDkmdoeRwCvJO4i{&gS^~MK2~uhkp~A&d;H95p@n=gP-rk1nE5E>qK$A zxQ{xVJdpEBFD6LmV_ygV8%N%v4ky^;{JIwtq!Y*c9j~q~P9zgTaTVMAW-lg4XEy|G z&vDx9LX~wa<`2CXFO`M93Xb|dRJoUXwW$~5an#Rb+dd9<)fs+|?+Ew-lzr?S0 zaw3aZViCJ-2RFeKl*o0)a(elqU0JRS<~fgfI8`TSCpW}38qLX8*je7lF%QUsg%Kz4s;Vtket>_&MKk6HGyW{FoiRpv?$B2`Sbe$g+Z28raWOZh{Fa_qu@2Mbvqg!@Sl_FabJz z27CrV+Y3A&NA9B%jo5M;+}=!4L7xPb-lozi9I;2Z38p}aqp>Gm2B%8Og3#wZ9>(Qv zf+?=s&*d~fcQ;P9$6uQK!sfn*#QyNgxO;zw1|TYl&wyQ+HlZsYrw_zu9^?27?M^J@ zBQ-6cX+cU6sHzB@GwTI9o-4Z_S^BI4z>+Xy_xEAF?>eLrh4=0qLb^{dd z=j7(@ksCq*kpa$3oH3bQ5W@hhIzssq(Cg?l%MuxH@!4_Loa4Ze5GOj|sWMm~)*+kO zjq!OqqqyN{QLI}Vef;!J>yJaDyRbsM=QICJ^tz*h3*~jk92QZrYs$luG`e+n2BLjM z-Q9tCUZve5wh!M*Ur^Rx7!Sok&rFl@cm(U&Oz5NNaEY6Shcgs(K0uRgZeFw~(qk6_^$PIDGnY~j`{ z(l21%76mXB%PI$z_TNH@4aIWk)^6<}V%l!f36s*nrL^rPoveTk&LwZ_4X`8G9sb60 zf?H6wcj(SsWXW*`Wc3xNa<>J|%bJ!ft7u5p)YVtFBnPb;H)imHC5_9I ztxZk!ElI3LlB{l6TwPUFUA16bazsh#xS>ak8ro2?v}xG_Bo1xFQYk~LD;C$KR^4o< zsI0APtp2x@-LksnUo5x2Zt;R8m6h$99%+K&QN_x~5`zeQSB^>gMW}VYM6!SQn}afB!)U!7j6@ z@^CMdQb8;m^=mCdoS7PbU0<69_DB^}z4U6RWkA#XDOh)qiVoko{?wQG?CwnST z9g|s#6(K|LQCZjrYj&>W+I_`bBhttfJt=2rCL*yu2$rITZb>*NcHPRRmhzg4%GRc3 zEptbfmX9tS!A4K1Yn@lUVrFAi^{V-7cj<_6j=$(#2gxHxq*o1E)zn5}UIRRBHfwhHpDR#YKaZ4+faKf@~Soh3UCQC11 zHg&fJ2ee@Er3IDs6%7^3N=g^hG%Y)P_2n=^3fg_Oxu6Xf;r2YmR47`wk+6d z>eMzJgBE+;(u&2qTH7UI*Rj4D7jCO*Y;iC^n+~t5#&E8vXXj7BIB?3hSk4a(ZNd3s ztAAO41oz)N4$Q|T#A=(CFLUW9>FttMI-+!Ba?rBs`s#|7>cPqH-~usp z+|b2X*RHZQxvY9c9ao!5juMD`3zOJIB4y&9Et>GeZt!TqgtYt^GAP(znZF60}U@zE!LAP(Q z(4RHYI<13~2aZO)h1cq^)K*#X~1MKA9GaMCm zcnQ?u#NYKgRat?Zt+wQweYH7}$}3vXDGk+jieX8x=`&~ViPN(Rw~Drx5VkVdD_BR) zhN7)s=C!@tG6$8ANm^Qb3dLxiD}OF8 zTRdI3a-z4+UE4JigY}~V+xuYLh|yk;Eat6hf4ijFDvSQL*LIN?nl?)=b}#~Uy=#Bq zP=1@8v@WGmU{Af>+;X+X^u>gG$)y{EE$5KH#UdDG1HilBf0Ii)`Ue0)yC_%65#g{9;oJm(6Rbs>9<$UEA{PAYs1(eTD<8)r{sEm+c#&qcu=^G05< zg}kn^PTuKom@)Pjb0x^8#dw?w-i~<8R&TiyXQ1a(w~%sM4l;eWSl+n2r5aB;b_?K1 zgnQdcJb0{V#X}DsekxY+K2lykW>kgUUV_cDD<9j36g)K7HI{2c29@m6Yx41?-=U1YS(MEjRExWv`rK!BOq7l!gXap}A*77z_nzqoTf33mk&HF)M!Ojkj zllLsT#X_DPXzFyZ3)8li>D+o&wkEju)>~c^y_G#X$jWEbt*`glK?eV<*4quM+BCrfM*PJ6JL_xEtP&1e_WE4Ns?W;1WdGdBR4d zt$^x{R9kDAdl9^b;Ca2Vvf4XW@MP4C8+lC~ekOQ3g^OoRQ%5_le&Mym`^C}0v9QFt zmh#F~SoxUG;59fKzGbVD;!T(nT$7aVSNx6dQ6}dnj?X+Ha$@+T(8(ERxXyp$8l*k_ z1{=c;_hDQrF8!W}QK6JIf~OF&ne8cMq~mpWU<>gDaA3nc-GIdM@Q-L<3)zhEbVSI( z%fY}F!m6XeEreP1J0Sw^Htc;E*CZVsP{7}g7Vk$6RFG#R(X}_wDQ~d`5oE>dX zG!&P_CkM@BpK;wFyy~zujW{+k@P9Y{@-yNO03-W51Bv}fbjJ|Imx`0bX(Hd~vmE|? zM&cEZajCdUJW4!GJV(4xyjr|L{Hge`_>%ah_$Tob(boP!{dwqYwj&|-6ZuCwh67LWn z7U|KH<-R3;B)WL>#rQ&Tgjgo-Cmtp?h(8do6**;)<@{2N;FO|VB#sa#i*v+su~9rq zNalLqvc%68+_@wx%_`dkLn1cb&`gRa^5p69N z#Ltp^sJK*IBd!-O7H<$a50&NqQal2GU{O9=JYD>Oc!T(aXlsT*|M!yrD)zThST=Q7oc+u7jg?y~!D@9x56Y(1*7vLJnd?UpJ#ns{uMO!NqdhbfkMwt1A zinc~2!Yz_75bqLS7hT+vn9tTM0B1^W5RVj36>Y6X=v^uK$KnIxGvezajjdRIu{d3< z6K%~yq~9vpZ1f?U?LBC=_Fx%qEG(x|JVHEAyi7a%PGLi)+P8#Ye>V z#V)wfGT$ii5V2M~UA#qnN&H;gsfU+;xHy)?wQhHD5{Yw!{{@lv94+#BmgSa-2a1P^6=Jn`jCj1bUOYp*K)gu2OuS0GN4#HrOngdwQ+!w4D1Ibz z`U2aVEf$L1MNVa4`cQGSI9|kU2Xm)A+eqqhBmMqc#ODOa75YlvzHFT7Pqu`#?g!%*6w$g_fYz+H=gc=K0$Y;el?6jIJlt;ZQB{& z)Wai^ZSD1##%&-zI3%6wl|ZL`y&S*(#$(8B2tK&I+L)$1dzg2;amv_nrXK5?gOA?^ z1kEV+3o2>z(`G{smbU=qeIEr-mE*}TZvn!79t55GIIhEfX9Ut317Ygjj2{m(0~!6` zQltgz{bY>i@0#^8-mjOx5&S#|I-7TJoFoI<{Iu1OgXQ(Zj~iYmSRQWYsq)T3*w2HY zlfVI|p1=8Nrz0X*9{$lxm51APs=Uh(_VcieK`8H)4*KO1qy@{HhVpov*gl+!sq$_@ znB|q=!|f}~PkWvfYGWEdcZt5lZa2-Sl@zbLaoT1wz0Nl+p;1n zSXx%}4IGhnHr9W|#lW|*=GvvcjWz9a+t^t5V5?+fJr+Bawz2L()v@?$Yhz7QaW_OO z7vIL3zCnB&>n=#$(#HBtw8pow&PAtmZezU=Z4TI2_hA768|wi$7kwM+Cz!T{jWz8u zBDCBJ{RExl+gSI(9;R%pX)>@?8*Bd93D{V_hJFaxSm)uG{i8P4uc5@0jrDBSowl() z4Z9n#u|5FJ4A@v7i+u^$SjX6ww2gItwlr;H-Jf~WHr5BQqO^_mA?UcR+gQ^|Ctzc} zBMxTJ#`%hjE zEAIa5HrAY2`?YPXv$%_C8|#xWIs-P=`|+@D)y8@NEBa<^toyP*wrXSjG>22##`+kJ z^t6pN*ToFjSieCrZDV~D_vo9jvF37&+pw`-#LfuVSii%1w_#&V>&2jrH7A;H%f|X7 z4)lPH^-$Iqu(9Uqut6K^;XJSb8*8o(9kj6?!4o)OW6jlRgErPH*^L1k>uEgk0yfsm zm>#gP=6Th|#`+3Y5VW!8y1{L1tmE9Jpp7-nO#jPmtf%lW`8L+SK%b;-tnFG7u(8f! zj|FV3f6x8jnvL~+I6PaovA%@|CtzcJ1&jWAHr8C#GiYNynw@@p+Q#~?92Wr_>$yCx z0UPTjtok3Yv2NmC25hXSu)b~BSf9-LwrOMiJ??DK#`<)gT0t9YdWvdeV|^1(uAq(e z|8OsYHr9tROVGypXFPwtAsg#U*{9!(jWw@2DI4oW?5qD38|(A92WcDYuBmKOkfQ>bmt!Zmx{StDvwXxj*;x1X#U4%;-wbE>DcqKg^{Xhd6C3L)4DC*AtUsX2wr#AR z$G&u8WBohqc4s!$uj4H0%*Hy4I^Teeb$1-C&TOowV$7A%Y^?vl{YlwaZ)B^sVq?v}!P7R@ z$KryRwy~xwjI@pQPdGNVZDYL?3;UOCte5k|`qyo&X~EZ-jdc?n+=-3#F}Rd=W@Ak! z2j75=brp-*wvF{&JZn-m*4MIa+qSX(IS>B7Ze#rpYwFC#dJem@GaKto+{vxlSch>B z57=058|%$H6Vf);1-$rlW@F9eY63Ra{aH`i#`-thk+hBV^=xw5#+rYNe{CD< z3@UeKWBnr@q_mAS|99@p#(D^|bYf%uFx%akjkTFicV=U~3lD#1Hr6v)U1v7d3AVd4 z8|$C(%9FOSp3MW?iH-HuylQk}V@;nyo!VGGMWt`V#`;+{sWThviM*_KW@CLL2T|I_ z`g`o?PHe1qXFqphV{Ho>bY^3HEzgC{Y^)FDi0#bAnrm|fZLGh-Ub(w(#m0I<2R7Cd zJFv0#?5X)rr`cHZIoqAIrHyr27d~3Q2{p5^J{!H`PVV{!Wd2F%;xmBH-0qaNHr4~6 zunimQ2oA)RC>LkPb{lK_tFqn3I$*~xyX*fSY^?j^G{|sTvq=7lOH1x8ZLFCJ8|$Fb zx5LKzDLgTRw%b^LJ-hJ#UK{Ju(f`dh)(`%JHr8WgYfT&L!pu;%8;KRe#=5m*8|zqR z_lP@UyKVKq&9=Iol}#IikTC%xsqGfl+byiMdcnVDVZGf_db_2xzYd0P6@|5}XHcYMCU0Qt8TwGqZTU`g&ZTc2kU6*gSt!}pz5@r+Oh0b={ zYIK6OZ>w#!-DS3FTaBximbPeXTa9>Zeev0DTkSa8ZL9GLINx!$+g5x1u-&%W>xb>O z)m}erx2^X2fksfgPHeZW_WEJFZ8iDh`ynYWI@Ajk7xJ#=HnX<2Q2Sl_a#Y<=ds>v}pnC#Ij{cpj`5EjnRiXno&` z#TEB{ka61Pd+)@c^oB{;rSHtV12D62Z!5p;7woFd*Q=XV1`YVArZ3wNU6sLpdKPpu zGGNsQgd^slS zYfQcoUoeHf4N;NsPw}0}dG&562aSL!^ju~;7BMh|W;n`az-S7+4nh{)O>-(<_SJ}m zDfG*T%pS$?wcQx+%!JZz45JRY zoAzo9$A&O*M6M@h#mv}pM3E=v#rDJzgDJEp`tGLRw1SGzQOgm^sl(St_}IRo?!MS@ znnIrh#y&x7U<&OO;Ka^nZM#Vf$LN9)X(7-89#0i#@`6_s+4k+tBN1BTb5jIok612kW@58z>%wzfmTUMUwwJaR_1q-Xl z9%HFlF*XeDrrBBMZaNZX!8x?h;YT$@!m}a3-So`>O`+F-u|CYZqL5)$#8;khH?4|r zcsS|`xNsazp+Ck>$=$Rv$lbK`%K* zHLUp_jp9VCjCmijUV^*nSXbtKq|Z5+qnc5ij6F&5u|BpyTXDbGA?)lYV{cjNpx9kJ za8G4_X=2LVv{zBe-L$s@DRg`M|Iq1ij}Q`r}AH|_0^6Q`q4nnEwP zT?of_XGJiD_T;Si$6or5o}3pq6I8gH_VO3Ru|A8LLf?cb&U823jpf7Lw3l8IcPYaZ z`e92S6^Fw`Glllj$HlXm4tLWuC(bCI5Z}Obm_mD(lCpS$GTcpj`qSbMVkc+{?WNC% z4`M&T-Sn?5|Liyysi7&fr#~l7_uVvwX6K-r?S?5d1)SsYN_GHDp}igq$GQ9mO`$a+P$PFd5@zuUEUD(1 zLf_4zcIUx_yJ-q6>RQS$h4$pk_-mA53T^jVxR1?Y;7KT}*`B-Ud~{=c9D5z^rq@A( zMcu)yFopJxV>o^eTM1KWD%0IG7louLG;b4hHyvU+OrgEKm=XUi_X6&wmsxpp;`dV@ z?xv5lrXC!BpXo4#_D;Ck`0eObnnHVWbDWE7(%rNtuZp)YKTM%_v||o;)4aUW-SjYv zfV=7U*kYJMvjri#o4%971g6j|!rV>2ixiqddl7IqeHAre3hhO}-87y=%@o>;fV=74 z7y(mgF9PnS&tbb@3hmYMwCm(7L?LXI^=VH}W}{4wdh#B=?7N$;Lqz=d+y$6IQ(&Jj zWdXaa7?3)UD9F0W!kA8%i zZ}w%+w)vKV?kt72&99^O>|1@gz-*Uq^Ti@3dMk>}{&7Kst7!Ihxdy8{!7~!UW4vuH z9YYtx5#PlA3~@#}llrk??jBv)uEX#-lyPi~JE=R{#&{Zv^kakFGK+f{^8NS}(-Gg~ zZfxTpA-;=G|DMb`rR%u}XPoT}7yxo*&4Hf3y@B+%H_)9IUGA)K`i|(wj$-!=a$T*p)B8DqRc${b>Lo)ZunAu75Nf$K-%Blz<|HKL7n^C!^Ik>=}`$1 zZ$B7Lk{tIP`Qb|<9$xqes<_U4e7D(lgap5P1T|>V(XrpX-ljN@Na91kdt`qLdp03{ z0o$|*@s+l;3GoX%tBi$uyLZ-{^zOCtsoXX;0@rYCIMubW+~5|J`LGpo=<<8J_qavGzo|CP8B^ZkY}m+e z)jvKJ*Sp4e4uX7lO=;Ih0Y7Qwo--VC*;DR$lnYFy#_o6?>e7xDaWb1vJPlgnJ_2Jx$ux)z;=Brd$@84^ZD%3(kP$ID6zIh$Go^AOue?hj%a=-p>ouPLO8|WD@;6AUx+3b&<@f{b7p5(0$qd3Q*|^pRMexh10J8~ zr>dO(7vUNz;E2abdrq`My*cmRfl9lVk^?q62lc(@{2%c?iILpew6fB_n$ypocVe^i z9XJKuEjfr?G2h$_!;5HgGF%PsDObZuxDTzYZfSw<*W|dNZM+T-{%8GmZZTICe<7td zJ`uL_12iQ+8JUw6nHxPgb57>m{KU7yFHmZS5cqHO1LXZu@P1Fw4^Z&GKK?)0@x=&_ zc9@&m?x_N+uk$*kiK)oi7oQxwjI$p?_%oD03Fy10P=xCMlY5f*8EZdJpu}-Ny^$i{ zFHtrhKj1!+`TL0RhloqWMsc}#ym*Ruo_LvfwRo5KbMYzh6>+2ZnYa_)im?7+;vV8G zagn%GTp=DWUMk)!-Y5Q9{7TH{Zz0sfg?`B)B43MBo+Tb4)`}~|lg0DJE5zHyhsAfr zk41QWw(`xF59&!uHXlBa7f9v;du+$CqWSKD{Fvl-#ZSZ#eh5;(tGKgRB61BerXML@ zC|)DpDLyK`B)%i=h<7>6KUAD3?jtS~8$`ZLr#@c^l0Ou06z>&(A-*nd6u%T>80gI3 zM;t0n6!#U&#b%L9Av0gUsK-)qlDMB(F0K{Vix-L4i7$!oil2&H`h@j#7yFB&#XZFX z#Ahb= zKyiUsDRQM*mUpJOLA+V~rMOA_LJZ@Y#Ccy_hn37D(Z-#`VsQ|O@<&P@D^5`SUXu3~ z=P3R=lFP+LahbT1M7bxCsQ(tpw~M$8Sv-cl*FKTgZR#gPdjkWxpX5Q}1hGuqOWa%J z3t5)4SgaEp#FNF-#B;<8#7o4>#OuVH#D~Sl#b?A9#6OCE68|dxO$_n+i1tNAoJLLt z#=5`%5G~#BpP9U_LBELc`RV@orhJd^?zeq@9DALwDZOnVfYTq(KHfG;^x^CAzd?q1 z47pJ+_*Rg|kQ<*3a0)tQ_;72+d@PpV10U+}LwOE9e%S~*_4xb@=Z(MlX|oX#EN>Oc zI~Zex<*_Y(c?%Hs^C0L9%tQMyp8U;Ex{>Fac_8>mN_GO`c>=*W5H+=m5vKe%=_xP%#RA3td9!9zunlhreI@u zO+m^0jp3yQqY5@gmk!)CV9orE(L?8K%v?HPQ~#y&H)ig(a?`*yb2df}9kA(gq(zoq zGi3#0syAJ=lqoAv*K5yRiSnMBe$cJsrr(bG+;M;Vz_qegZaR6*r_a5QxaFI|OK$`7 zzrS+Rk~RG{UA^=TN@qQa8riPX*sd_z<)AgY6^xpL{VgbAo0e?4d^fhI0DHfD)8&Vj zZOl59ZCtYHO6*ntr4Dq8kUntJNlRDYQ-(0xdBcCjkz+Rzine_G+&v$;d6AF8k-tDX=92|CyBBx4DD=nULhiX47cZ<0UA$n&jEk?z zIvy>12qh+;buTWR9{Q*tBl1x}Xx`?6Ja>EsB*cWKZcgUS+uS>EDn9czC%^<)1QzA} z;khxcd-3RLBd59N7JV2B=RE6PO> z@$@Tx|IqYN(|@}$v}T{*Pn>@D?=f8MHt+(jq24(Xc6p7=-Fy&@yrRGS|Q3B>jo{ZB6b0nuBS9*@*G*l6)Wgg9u z45J9Ig;bCBY`=Rub@J> zi&>5QoEq26tpDH~Nlx-f&5^u`1*GRl_Mn)aBN@Zq2j)n2ZOxISuaWc| zN$c4BT1Xjz#PfhY~~hoB>AG?pO_=bNg9DU zlCQ9;tDkt}C@a2Mm9 z{^R1CCG z*5*i#K)L2F#^y+xtDV3c$s3q8Fh}w+7X9_+NY-%N1m;NonOTod&yl3#@!%ZE?o1EN zkzB>919K#=V|jr&l6)x~oFmDn;@}*~uUKASj%0u82j)mlW_oarBp+(q%#oxE?>2KJ zS5hN5M{)q`49=0XIr_mll8;jZ?qX7NB>%+S4$hGr#Ig4c&5_)dg$L$H()ss4IY*LL zozxsjOpw~f9LYPN`c2J|+=+XTo+J4_J100tG85^TBRLOM?)X1wRl7NoQA8b+yc?bF zB>Ah-P1-wer_W|Y1?EWRp%{OTWEV~x^d?G1!kla9O_$t^5O2I~rc0iWVmMv$cqDSV z(x@0NSFTFrqi}bjt3|cZLT>J}csS;K$-~_K49-T} zG<^C!jJ$5S+x=AJ<%_pt8Mz0GSmbtRdw7R^nvvI{D7V6k?2o6Zp7``T5h?CsFY-i0 z&|71_9a(0jYttsJr;)Qi_t~v>i&!Qfng=kFJMPwak@--_!>9j;EOUt$IS~;%<1?Un zmE+cWap$4BB$>%Coh9}#abaw!_*Hh7UU@Pcp`eEJ`OLJ_&c zxyaEQgQhD!{dwfvMz73rL@dN-z^W3*ZSvw)LvCRl{%1#AoXw%Dfh+OBVB+A}K7Vv3 zUYL9c6G}#zc(e%#s2v7N0BnKTf6zA!MOgTy!oTSxB-ac+|ytj z#tD8^;)9u>sh3L#_v1k7jZ+Qbab(g9_ai4Lo_X7Ecu$6xKy!%s7MxF%SdO#jkj&kF zQfUZhhHYM+xrFzsb1qSZPsll9?FI&}!=(bVPyL1Sn%8B5>tjE}1`9yv;=m zxCKggoWC%_IotSmgwcrvXwhU>d_qq1+6@e_=1k~kj_Pf@#afx4?2C^nGQbx2ihgUT z*nU$1VbVLoXLDerH#9rMX1Lrk?AzOu-q4wYkLw&nuw|}uAmMe-3a@*-19#xvh<_X( zv|%>+JU%!Gts5A4)f1{VFz}Wq)NWwleNU+0!1obhw2}Eq{wf(Urs0!?7qKJyt#tZs zpfm%YJZCwVKMQ%WjA75@In9As#&DpgV_^-jfie8VowMg>7EApIr!RJ}FXmbIHU*v( zJ%b8Np#~Ju4NRuJOq((SDjWP`5OL0)gMRb7)O8Njnm{@`S1l4E)p+YBw-&zbDjh;8Vwo z_~0T#yk+sNYd0{!_iBhIcoLxoB7slHX>HxWz!*=c+Q7hcPpI9%z=57nzo8j{Rrt8h zcZl^Cf8^Q?40xmbJAsjgYHj1VbGefkNo?b*3_9N-yf&hQbQ{0JN?0H+1Oz{JPBUTm`Gj|zTiw(-iYD+f`Abuo zOZ*uh+zws46tXQ5r_~v`!v+TF2N@+1{FQ-G?b=nb$cra;r5i_)NhEw>{!4Yrz77M^bpsdF1?eu^AIjQ>fEt&x{5X#+oEKRhJQkNkmB9na zu%E*_i2h{(Df@CXzh}9RPK{K?`#E}B8YLU>7R`19x1db-k0ECu+u;5UPOW*3hb}&D zCli95%H0+;FKb$|tfC>wDbp>5t4miymm?cq(r#_=kzs;;TPbmQ{Y)y>r{!)iH{y$SrS5HOOs zNUs-4sUQ~f;gJ#X7%w(O+EZz$XstyEql2>yCE>Rme)&5Q8&9FP@wbpWE7E6>=XE1H zb7wl;=+(AgmgF3JM@TC6UhthKP;IXHY*azWF1{ILwRnbN2nFSP;3~=Z5f87 z((c{6NAi#PCCXN7Rd^I?s$EQ!w_0` zj5`Zrkkmahln)Opp=CIhEHxHtrtQvfJ6@s8(Fr?pN$gQA`#O?6B#A>*VtY-w zh~*Bqr1rs5R{Rx54HVw(4amCHYAmBiECj9Yy3gqlXoGOuiEI=l|122<*mSfglbVpIM- z!;h)Um$9j`SxK8hqzs7uuT0RFO^9bY)6SZ~>^g!5ATrJI&CXJWM``P= z;TycHtfCP>%8tr6jq!({jL3X*s_F(9MpZXfu6CODqXiQWP)jw;FwA(!Y&g;eGM>o^ zENaY#ti?Aw@Xb!l{Gh!pTpME>&!UV)H(1eWtB-beX%(&2tLj=yoaTAeurouyRUU4} zY%42kVXV`%m?N;hsf9*PEmd_@b&YkcPHRQ;R1P|fR~pQ;wdG28A&0B1lgd4-wi?`` z>g!sN)w8Ve4Q2c;^DNZb+5DM7SDVT5X3vwh9rALgjb3DkWV?Y5@Jv|(wl%)7Q=2mD z8nw2)S2#NkMmlZmxn}P-b?@@|PU?XBrfxC<^Loob9r8v|wHY$iRN+Yn`%TlK_7*&z2@!06s#m6r=u$RT^250(W)y7cD zGokWq&Vp7=4e28+!$%B2oF9jm*H_q(YGa{;nqiko3$2P}OIq3*T6(r*9T^AKG}_}A z?+I(F9p8{oR(e5uDH&m5mzt|9>uTy?mgUt51Gkzco=6o-T3{e3Q%v7l3TJ#Z48(Zd zk%gR}ji(c>*LYHyrDV!<%gjRmGbToO$J2H_eEu%-H~tQplHc!y>=Uz2ik_T#O61h= z`p{_^XSh@H$Axm-ocw-MawnHUyMn(F9Csjsk+FLY-N(s{Mfb_h$jRy&E^@oO@le9; z>F(h6c6ZF^%U>_;wqR7)`RJ=)vc1>~M1=U*9N0p9at>@EJSP_gWd6?L-&Lbh+0wte zs21WQbYKhN_iu0u*(}U-Oo%IB1U4+%7LZsTCbR~&P@CDKOy?Wu^cJ$&jzPJ|*#RQ^ zg#AyOqqc@b-W8>TrSExN!y6C$QpA)6wu*DO3q`Xff{f{y4jrWTCoxf#$D4X1#oa`+ zB|`i@lKBpTdWVQh#75CWV0oLe4k{#vS2x8O9YxN5ooqVpxF|EW=jN`EfHw8M4;Ic zfo4kto{VG0^30Y9yh5_s57a#B?6Ne)-17a#B?8Ts2sB$F&}@l7vn2w}mIyRkBG7D!K(i$R&6Wr>TO!bGi9oX@0?n2PG+QFj zY>B|3IE~oeiQ+!uLa{+SO8l<)L-9uOUhx;=>*7Z7OVMnJP@m0vWc?WUR=;SrM2I(A zBG7D!K(i$R&6Wr>TO!bGi9oX@0?n2PG+QFjY>7a#B?8Ts2sB$F&}@l7vn2u}Szde0 zmI!ix$!1Fgc~8k^O9Z)Eve^7a#B?8Ts2sB$F&}@l7vn2w}mIyRkBG7D! zK(i$R&6Wr>TO!bGi9oX@0?n2PG+QFjY>7a#B?8Ts2sB$F&}@moN?aD%|7J@BUL^TC z@ow>d#LvViCf_q(0f}Qiz#V?nm{Edo~!r`k}ns3EZ!+TCO#$Na&5mjl zglO+Uk={@8AdzohnQxRhTbv{EKQX3%M_eq{h>hYh@ig&F@dEK8@kip7;!WahqTQ!Z z-@TIg%AED{&k^!X@m+C~_-E1XU(mA^XhF_mVZI!Z6Hh1)7E8oY;_l)kk?R;zf3~>4 zc#vrKL8Mnn<{TF4pDLa$o-h7DwEH9Uu919$c!zkG_=xy~_?-BX_#2V`jI!QMqTOd9 zXY&3B=7?MblrrD_lhec*;(p@(;-TVU;u7(2ahbS6JX$(i z#Gi=wi4Tgu6rUG=BfceW68|iICVnY$k`U|R{B4r+gUHFE-Txu)FS%N*6OR;+5ziJm zJIUHFazRMSFNyyn{zd#;jNrtj9+&te3&bL^k7&;kNZ&>BFmbH7yLhm;K;&E}miv8i zgLt`kgLsR0mw2ye&mqXqwRl+$*T*9{`JViZ_?Gxb@lWDk#Lq<+d6+LE=8Ig6knz35 zoy0*Rr`s}pv^ZWY6Q_y$h;v2S&N1Htk@LJLA1NLua$Y^-&lJxUFA^^iuN1EpZxeqa za?Tjbc}jd&{Db(Z_?hVP`3d2OXwO-Y3nljy?YRr_oNGq?$>KiZT#-f~OkXHgi*@1= z;&O4Fc!GGT$QigS=N6GmeNw(hykC4=d|KojH|lK?KNUX{`E!ryVKGGPTN#b|KvqgKpMERFUzEZqayhXfSyjOfcd|G@~d_{asd`Emw z{FC^x_;)db&!cDuXa13#HcAc@cNIs7W5h|~RB@KLugFP*ET>ZBgh9$ji6@Guif4=G zi=0eI{hP%*#h-}}iI0gm%ntX(fBt}I`EmLi$LKoDcLo_SwDg}({vn%ZykTt}*8a8M zx8Bs*fvKf~+qb<_06e2K2DG8;Y}*;%)Wa>rHa@!rH>PnLhz|}$r+P!6)4tx|f8soL z-1fr9FPm~R8uSVuIJNm{Qz7G(h*PHcD+b}Y9|ME$L@<>2hQ->&=>dKo1f9Jw9ypD| z-~6;{MEGH*HQ*)7E8H<{ep&_OV7>i@W3B@9STEK6dRr0p^C0L8f)BTKJ2}qlJW;hVjh|aYUvJ@nj%}FvZ0@%KLFYy2 zl`){rA1{2C54P{uf&J}@G=G1eL>ObaS=pT;4BQdE0Qz;2f#KoIfF7UUdm!E~uK;1z z>7N@2I;#fZcQyms{POs&E~xhb+Q;7+{^sk!hI#DRWO^$dJ!VA7=#r7+x8~zx?AQ14 zF{-cCma<{?e0)SNf#vd^r%w-0A3ZH=L*^yU&ehY7Ta=i7#b)RJ>&(N)qD2q?A+%)k zy^rzttQ8S)%X-zmKO_{q-Sc z4aHdC&AskJ8vT7NM;tow6y)f_aEMR7uw`ZE6zm9H+OpCiKZt33K?caymZ5sRTbgzlpvyj zzA0$Snu{KhzYk@QzYpol--jn<#pbZ=w7-vaXw;UrtTk41%HM~VHxV1lyboC~(ci~t z=6$3O4c0Q??_(py$NIcvV!zlDcF&Ws&rKW@yA{oZEo=8El~evcyoyr(KD-@B`TOwd zoe;}sy)P8nBRl+koXVnJEZo(KO8NWnikcSVEJxU~dU;~h9lJ28 z#{}%WXUodoi66_pfGsQaa75$f$OK!}T>G&A^QyyG5o}pKIV;YWCy;maRn38JpUu`_u=VJi{Fi%pe?JHJ|n(2%Y!W|od9GM&yLqHKm2`o`ta+({evwlJBR*0 z)=?k+KI~<6@xgJPSM>M6Q_1{&T*?Aq%gS@a{C#ju0ot-=;yK9teeiu5ZCUwyEku7G z{TKmT)~=@U0sVdORPYYcGiY$&AeqR(Qj7!J^YDx>`4`I;#)ABSyP z3HkXm)BJmI6xzuwe;>R1GFtaAcN4a(-v<*1qH$)+dNMTPcI}2OD+P{-lh^^UWo2bF zxVw*8Vauu!ff~8vkuZx-`}=sFMa|^Fge@xt7Ii&k*s^+ZX57rT+uO3f1!Xnc^Y<|T zhcdn!+DKbg-pyFloh%Brtln`9$M0Y(;qQaW^!ITY^9A$>GCv0bob^=hHNkL4(Yt+GCazYof6l*#b-LHR&m_WgYvi-7a)=66aR+H zUhB)A0qao(g)D{sK7NjYmwj|W(e;+S0E3$Ok12@!01AEGFA?qT!B_p>AMB({k9Ra! zowNf({ScMJrypD5mgTV_)A5fBA~Z8pB8gIy&- zjjcKONSfL_q8OhHr!|Z8vux?ogQ+kk2`Z&sdURy6!J>j&P_|#K4xe_nn{0gB9CUE@ zYxxl)OR<16uHOGUCL3Gz&G86sxuK$nn~BN$A+zEb772~-DAh{y870-#&WIK?wK8wrzg0#u`}@n*I!&x<*HIP^C@ z1h(_Z@n7kKgOAVY4ZlAF+kc}EjyT%K-_q<~&WFd}XQ{1#q4c#i_4F2Szv16WQ=T`H z$nx*>yD<;tb8h`2v07{q*NDf8Ha8La=SjX)yg|HMw7K%odrtBz;@je%M3?|u{e>dm z!?QipMJ^XXd9lc)A}Ajxo*`Z={#1NSd|9+Pe8?B)PaTl2^GN&Y1KM0Z(B|%eiTrI?3P zf-+x|lQzc<94~o>c!GGY$d|O#zh8Vtv^i;r-zfPDaSYzIP=8PH0I^!+>r1AeD4s7~ zDc&JIBEBTPD}E~4TrQN;9dCqKUVm}4xTko4$R!G?w^BSsyilCL*Re>SDIO#)5m$=m ziI<7Di4Te!#V^GeCJV6KKH^YuqPUN^P;3xw?hx{QSMnvI%@IQU{gR&(-x5C-!+1-{ zdb^7i;t}Ev;$7k^VliHeFrUqp2d7H*{ch|hd9he4Hj1s{k>YysYVl6-G4XfeU&RPs z{;>WSiDO+Tb|=wB^Sc4s9D1-+`sQ~7a+&mO4n4{-zZ;03ulPfxUnRL#JW}!NMVlj! z`tO(gu!zf1o4Hnbl6lQ$d;5ulL`;vd_>tmtahAwG?V0ZYu|YgSTqUj*PY_QL`QDWI zFB7j7Zxk`Sx9K0lpPS74C+FDzQ**_ZRo4$|GhZxqd-}G!#`urT7vulixFtC}e%wak z!)FD5!{ydC#$k9nWhUYEAtt!t5@7RnsKXECz42jr{Sl*C8 zdAQ7^%KKp;4}wl5$~(J*e&PJHV0jZzo`2ksB~{+F2(t|w58OT}#Qbo7P(WrHKevm% z-eWkCS0K*ce7y${!LYxT^-Pz|IQ9#-d+`ajZ`#i3{=**tsrLO6VLW0q1GY7zystB_ z>S+m;JT$Yv+Rn^dFvJ}8c+dm3CB7= z-(r4QDUQOTz|QzV%rE0S5KN7lgMAO#WTml*sYr%@gce3|5)$T`9cWR}|Hs~&07g}0 z-Q(}|d)?_y(n%nJ4yz4>RR{^YiWned1X04K3?h3VC_+raDgy4fqcAR@HsihxGOoBg z?w>2}j*gD|0t138h|BMsTlaOp1Wfr zlm(OiWn^TAe;J1Y{L3yu_SE_ay^-c@hsufP_9k4w@&$RkWjUlUPWhK@V%7)nr>=il zD`c`AKEitbWmV94{$-CN|E~UJcSGy>m+_|b%l>6eXfx$sb`wRPf7xnQul{9AaRuAe zzl?O^#=q<-#61793{;-xR0M{$-z|zkU8? zd@}d>m$hSUd-N~+5r%yJW$#f;`ImKL(^CFrC!wc)#=op5YD)Q+y~TR>>|b^pTj}#J zo5Jir=U-+v+OVVmtBVvzrnw3 z9Btnd8HnS@MKg|P=ijShR)YzXr&($DHSqk)c%j8w38zcu{OCZIP5GC#X4#Z~*_#wo z{$5xBg{I*~pZC+4U4t{$&SpkKSoWR|xu-@lDs~U$&NqH058$IcC4j zzl?9RKL0XVM#AS`b{re!^DjG$75V(j93v2R$CdX><>Y!lOc{$-qO z#*PNMVsm+`!+ z<6p*~aO?P&&E-|V?_YKpP5S-Ic!T~A_b*$?-Sqs+`eKh#{$+A4@%fk4umgPlW#_Z# zp8U(&|$2v_b=PPo%Q>dJ;z<} z`d4u4?h2#^UG*;;r2b|1!EWStIeBzGqkkEFxFd&p{$%Q3HrSJm zf7y_F{$+>x{L46ZPH3&fuM%h(e5m$4yb2m=sy>tDte{=9z~r^@cx zzpNb$@7}+xxPTp`{$)*Iq!p^dC#-$`Wq3K<=U+xYG>nFS(!UI&9OtN6DuAcN?)=MI zLJ$8k0<-MKzl>k>;9o{yjy?I8wU%rn2yGGQUq=>8ynZPQ3dZtYfu7>>L1 zF-!d@>p8p>_cX+Kq-0HzWh(JuJx<8_+?T(RaW%zNne@yt9IHy9s1%+vCr=YTz+dlp z25ZH=;2M*vi1x|oSTQwjXb^?oPx&$Fz)(4RPBqCk;p|YCxz;0sRq{hIDXkT*!6en7 z$I4lkQ_~}KJfXNJnvGz zx*$nxxX+=Chu7m$ouK5B;NAQc4rR&VDr3m+NcLajGxqb|V!zH0Qm&Z4$+fJGLz(bz zdK|kR6=;%H+VGN&9y)v0bTF`1)Pj+2C4e;9ucm)(3Xz=s_bcGP)5i?Ar+q$Vrpx7C&nSPpqAw9XNy|pxG5^MA0&esb zVw}g18}s?|^7wJ9?_-v;mp*2dD7!a4X8C*RW7d5yeasf^rH|SC_}=-L9fU_QWKC{f z|J6d{_mS$*D&-^fb3SHA!yeBSZ}aS(35DNYAD=zk?vp-O^?l5agS|iCnZVmTdzV4s zw|6M)?TwEaiN5y6$LwW%Q{EdNv!V3$@)`&9##MbEvvS}5{+y55BG}_It+#pmOZ0Vv zwT|^d`Aa@#@9w3K*+jH&w?1awii&@gk6EAY-S*bUY$+eQ@mrHQFFRnZgM6#%&Mun+ z=Y+^#R=RFW$=Rn&>`@vlvzO+VP0qJkT_hf6r*C%7uAKP5KLY1eJ#Zcdqv;pdz8lx$ zOgfPrC3frnfqz+BXy9Kq1=kMvl$`-^YH+;j@|VGsUrP%MOB3_>qla(QqA}vfH2vy6f>bL;|lQPuXy2oFk!u9~t9Gp0cG7gr|&i zL_D6d*P!%x%BVL?HH{FN)QNtK*1(U<7_g$pvbF0fe(>ecG=HUR)kiV z{vO|uaa#X`Et?QBElcv0^^(+ZRQ$Cjw`6B2PZr}T zV9odID9(>^%@FvJv6p;2Wf$S-`gqD75V0Uy%Fcc|`o4%AqF3{9UH9D7sSoa8Bc5PJfqq-Zhs z=$(ebTAku48!US?Ci)ljDg4NI2K#u*Of$$+#u$q>l0WQ+M&!C{L_Lm63nXPTsquc; zdE-aM-ieK8U%-#dSh8Xlp%DGZ=EyFjc*=~N;wdw7X6${o3w~s#e2S-RE$+nhBm0r* z@FO$nMX`TSh9B8ulAhuzGwFR|UojniWTYwb^OTuONs6b;v=_#Hv(l zw&_Pk>LjO)@RadXFbC;w^t$gLiO9y`Ad&Dt=w6BpdG^!LaDe)aoDCZ zq5P*%2u~SDp`6UhQ`W|l(Youo+wdb>3e4|^JrX~%*~k%-Yd8GJDBv7V@|2k#bYp*H zQTUPRh(L|p@t{ldDW0->X{sFuSBc$_0!=NZ44yJ0hhmRYuFq5UG%{a3$y2tH`N31h+k~H|%)c4 zCrVSt#7MGFKQeQ|RmQGFuac+C$SIyOBhQZ=!}9PWYbnRv$5U1)3hvfj)AKQg0$A6Xd{@FOz{_>qZoGkD5OE#xUX z2Iko+=~M8OQD&n=22UB~exB^{l+A!5$x}vweLjl&2tTp~B7>)l7exwU3Or>?(Hfpe zDjS}%wNNzURfm3LJh;tBm`|QE)@tg1&?^LMm*^9L|6VY z?jtm$Bs45$=^TUU@I;XYz~5^KtA!sKuYBMs+e#6BWcebdc*^c!7yTWHDL*n!_}edv zd`se&A=QdM#b(8?#b4Ov(g5@$>xEq4DI;}Z;tn|IlbP_qmC`I4-(yDkRL{9 zLte7JQ8r=|#E%f#IxKpy(3}OpRaOAqsi>~KVIyl#HZtx$ce;aZlgg|I3`5%ICHDVw zFR?6epBZK{jD~h8(y{hF(yr7V1@ye{I`(Nrk#u3|eNJcpMvAgJeq{btsrTegmO6pe|CJ~4g#TL~vtQ>@R>zY}`0tG0 zC&%4BpR!-{Df>TXE8|0-pR25c?;(%Rc>S|-PIFIp&X5(o^MmD~;PBw6Pm2oc$MPyiuWjz!-VxcqsUKHls7BxP}~nssni!L${OF0hp0SJk>Bf?Z>}Q0 z{Zn3}$QhKBWsPs3tUU?@X`kq`@I1+MS>qenS!G${8!~@@W4f&I4U{#$f%8-^YkWiI z@5sz|jp7}Ok129J5T<{r7;uctABw1tE6N(5kY$Z;;Bl%yS#iDMlZqcH@^d%sICzyK z${OE5Qc6%RQkFKc{5{#xZA90b^|Mv83}dnyi6 z9IaTPI7d;|_(pkI;~OYzd;?{TZ=kI44U{#$fwIOo@CPkF7~d{gzpU{Mlr_GATqchYkUJ`jc=f=@eTBN%Vdpj$R2N*tnm%`NPKXi9a-ZWC~JHJWsPs(1)82vyjAf9 z#kUndBI1~Srns4iHj-S3=qg5tuq$hTLoaK916!zmZ~4rIslAbkW3>EqBHD3=${v3i zT2jXci}y|D%Ta{uhRE{m1o{G%J1F*5EK&TO;$eyt6{jj5r#M@2p5lp${I<&aFHyWw z@hZie6xS*~rudZN3yLo*Zc^muU)udvai^lg>mu}Niu^?Of8?Xa+uc4NHS|9>91hvq z<1bEmJcF3c__wG4@bd9FgK-`|Zp=rWx8ZUwTW9>`=~p5W{_LfX8prR2ICs3wtC!>5 zZ!Zjc#Dn>ucERgL|X5d1*7C@ZwDCl7(MFdIs}zrRaYl6W(rO|5?Nzoi*8tk%ZhQ95LEI~Ys5KS#c&+d@FYQby z{PyPi?BOz(v{&Cptrqsq-c7$;R?prt*kix4eJGN&cO&9#gLmwI#B_-Jyg{L9OuwUE zzI$+?n+u({F%QFE6g_=W6Z1QfC$nF;)%Q_b-YV69_z@%7zUL9gSgv9jZZlzTZ+z6& zAm85jsBPFwAGI}T-#exW@|XL{&3kj_6Z!0}@py85%^vZ15x!7*e~XKXdiCms^d3EX z8Yi`1=0VHvDODtW)binR2OhLxZrSPUR+n8=)^?e*9KLEL(<(cZX0HzX!M-@OX=(VC z?cwDsH#=joZ0OcomfjQ&ZOh5LvMjjOadPa;O_qCTskMCgb~odeZ8^b1fmSDL>+?$^ z+j2q^%l^K(dST9HcVSM^k(=FPb9&`$PCK^!mUat|+?+PHd~@j7c3avWd*tTOka=6$ zFD&029NTWoHAo8{yJo;#Xezc`cPvxpZn=KpTQ6P%i&lcIxDFn4cm2a&X!rT{AGX+= zx8=-*U%$8sx_c3_E}ge!`oeb+t3c_j`z_HhQx=B&TQjW_N5((ey3X3}K7d zlAO)Kg>$xCGqz-Ncm;k5&%qjkNpFBVF^ z%+>{u`?Gare%aS(lilay&DKIM$8~7QmoGlJ&Cbf)=4QIvTzAP=({8m_XRmTLo#NOl zoYmti1FOfiyfz%)V6X02=4{IepqHHy+jBDQ0|JnsaRzRWXO7t3JaZtzi0%2nd|)0h zFY~h(yV&;X!qWXq?G<@j9XEZ0y~^&JTiJbLaKp$-yK~J%d&7##+b0IsfywTIVP%Cl zG8qf4{g-?-_SQZ3+LEs-ZoT@GBg$5OVyGY&;o-zw8eDr225e?qjHmT7rt1EIe_|TW zdAQt>y9oY?7vMB?u149Ee_~T+aDycOaZY2dVd9Pl|3rGLf%EQ8zF~ynQiGG%4RS6r z(&+Wz%wrk#Pwa+vr2G@7Fl9FWfalKVpGeOa+Zl)&!E-16iF^$4{1fRNK%Tp$(53tn z=^_B0yVszMtcOML-2IY&B3kP6Pt2hKpMPRo8d3j5{%{SRyX#=w=bv~Gw8lU2UBo>9 z#7yiVdG6>x5Z!?~z;kDuhU)t#W?@Hs{)xAsLh#%zKqaI%^c(yWm$6-`byTq;+?@curqxAiJvnaJa_7i7F)-Pv5u;dGh?4~Cw%^iLeB@DJ9;J2Kk*pm_xUHj z&)xF*C!WXpz;kC#n?A7&9x9)IVkaJ0@Z6b8NlAETLxPda(QT6;2 zL#z+$sG9ucv00SCb7%b8M#ae3C#z(4UD=J5L`wxGiApE#Uj?_cDf$d9|^x%2!J*R#)l zn|~s&I!XV;9c<$s{Sy<&`mgd&Je+%w@=tt-75n`YdmtV2Mf#%3mTPeY>-i`C4f&VE zKSdu~alS>`@jF?-YS9P@KL5l6q4oR|v+2`koD_pD-2jcN;$IQtjkk`g;-j!kSH)A2 zNLR%(&U*`*Eq80XNyAf->6$*~ag4bcnKGG<^hvEw=Z^s||D5D&PF?k3= z0jJ*BW9)`2ka!;ycO$grp4nsVJlZ6YF)!b3xqJ4}M!5?1FGXnE5-IjLqa^h+S2k%^ zHQ%z2F*<(f=W@60swPv{gchfv$}tG-=tVi+&SjVX1u~CsyGc{9FyREFd=CnKs&7|8 zRX+3m4t;n4Lc4jEJ<;T%&*qH?ZLtTIJ<06K2T=T-%1gN`lZ~=9_8@@JwhSpyHswwS z(=2NzlsM{Keqx_H=HOg>aQUxZ6c!87w$E%}H?&Jamkf}#XWQsvud=3XAawTt9Pk2N z@71qs>tCZ*^Rca*B8VKh+A<^Al`@gm5CP+q0?(v_gjvK2$Z)*sn77b6}YHiFs02IiabliKbrUN7*`?IV=~tsl#$1t~1FkV54?; z5zGD2m75&m+E zY%>!tA@T+S%M;&62q7M7<0cs2n3Tf_#gX}SJS9dwp1@eL{|sUN_@z{28lT&Is%c&%wUZsR3bQ5Rc(TivyCt{!N}!Cs7x?& zjS*%h)**5~0vb+uTJ&=lB^WWs@JPZ|1k^zI2EnoB)Fv3oLqi};O)yemgvtaXJ&Z6j zF%*#z2q;cC(&*g;BkV=!d8EEKQGz*WM|wjP8BmkA**0!j?0|s7wm(9_I*MT0KF{Cw zqgZ35SU!@#fZkt}V1$~^ZgqhLh0PCy==fVF&xr(?a?(EZpUgvkgYiyzNS+?=7y zhY@*d2CNeod3)yNV`b*dTt3V@GntPzxZ%$0+t>=8Q(kFWejfp?8b;)iad3`@7}+QZ zRf}jgAAy;O>_*At^=H7UO4b)b57@~O@6|(d%g|DqNR?VX3~Jff6JFbJbl61GSr?X@ z4D48J{DazMGeZ`&L5Xk^ly@PdSv6MrPd_zH@EhiX2)M2ho<_hpwi7&pV_3#2CzvA$ zJ+Cb1BLwlB*R5@W(aRCg9Kux+9Zq-x0k;5Kt|hNQV2SQc6O8^10W`3LcM%+`)|Si4 zr$$fURfQ#r3zHX^fK{CM9%_z+Wc$%x*>H<9yDB}@7dm+F6U=ZMPnd<^Sc{h=7-2`- z)_9H-b72~93}L1cBBuLfjES0A{F`5X7ug)EHFE4*c>KSO7}j`yVGR85xas3%& za^48o!3e&qhZ+nCw$RnZ8#oQ(!91s`FxbGs;^UFF!4^(6H47kwS_QL1PPPs4ghGg2 zb8~~aAsAsSH|R9VZQLjik{!%+8uX2i=^Je9R2LQogQ3D;9<;$waid1DykJJi?i-9a z3;G7rLQZ;NurcI*or{V(7X>pqL01G#V+zi^!nP`-RA-5zFt8X#oLZVhGo1+D6obv# z>I{f9+lEGi8T$ttw}GhH^oQjc^^iTpo!Y`+j*}TTtvHM(ohm!-v_KC!Rq;4Y z=c?)b+XQp8xhCTRX>SJm-Z^)PU3d#7OE}+Kh55loXt;x(LT_V-gQ20a!;#K$baj#J z3_Bo?o!?cG>PL%db3TnYnbXjNw8Y%4jiHvo#;t>SaVXj#CF)PeYrTtBGuoKG5q3UZ zjQ(-Z$vDI`;KT}Pp9c;?df#8u`7k$s2wYTbJ4x2*k!;SNT~z@W_&Q9wdpkM8oOBcF ztmHkRnlnl`j|BXlTy;Ik#41$0Nv2@sW7T5i%B`-LG?j}O`}lLK231#EzmdO~ zoVv5;z^&a|Nn1F0J)&TbXqOJz!X#>VVh7Ht#xHf=Yy(mOr~I~seE4@qjE)Zk4NITG zZiU5hFtYS1?pEAA-T`Y9R!pj?=omkG`jjbM`gECGJ!#gI%6N6f+!>@jjd$zSyQp`M zW8z(opHemF;3>1Kv5;Yx<9kD{t(o=QCtDXPH%qtIb6`Jy21bpKzjcC6s=zK! z0&2*9?t7=3AII7WaQ;s9uGptvlEwd-1qA4?H*MJ#1#d2Ib zscIkx9mXp=cKW2_kDnxG5n{eBP#8BfMggZb);ikUNNxNGQdm{k5xytX?1e4LW-f+=ip%_>6DGTKBm*unQEhxbdr49 z6LeyZPPwV6#7Pi0dsRKf6qW0Q(0lVLf*U%9DVm7ho4h;XV5wK;_~>q6az#Z2b`SkN zX=ZAO83JLBgL&xxxwSa3=(9=lWyqx%fju5@niU&5g6j-kWRjybOOB>D18Hi_>Aa+_nEV8|UeVdf+`@^#jHm;Lth zA^YdgOq(^SdU{P=f_01_3@dXek}Z{^;88qdBrdG5yy;U)$nBrrqP)x~T~#q<#p1o}?1HC&4rE`EZvMY#zPiEW8+Hso=pzPsXq ziiap3uE@`+%=df6>58)y=O~`4xJ+@S;#G>*E8e5{km56nuPbg=+@UCQKu~`nI)v?z zIUv9xDo<48Yc$j6D#{!X$ZJ%VIUtZ_4hZlI)yo_Z$T9~6D04u79Q(8z$s7=%%mD$) z91x()0RhS!5TMKf0m>W@pv(aQ${Y}&%mD$m!Z4y;nF9ipIUqop0|JyeAV8S|0+cx* zK$!yqlsO+D0mbJO-&WkL_=BR% z0fBv)1H$?-@TGo5nF9j7%mD$)91x()0RhS!5TMKf0m>W@pv(aQ${Y}&%mD$)91x() z0RhS!5TMKf0m>W@pv(aQ264Gydm1UWRqUxaNO81ch2k7VnFE6IG6w`Gb3lMH2Lvc{ zK!7p_1SoSrfHDUJD04u7G6w`Gb3lMH2Lvc{K!7p_1SoSrfHDUJD04u7G6w`Gb3lMH z2Lvc{K!7p_1ULnkL+-E40RgU3`6k7C72i~pxgN;(4P_kD?-YL|A~b|!HLNh{^2T*RvfGOr>T6b;%wE+8uqZWMD?ese!0pk6=iLE*uPfg z8x_|Qp}$w<2Nj=Jd`a+(h8}FN%*VzNh$+;x@&v6@O5q%OveY6r+kpBE_YO%M{O5lyw;pzf5Ji_0Z1kiuBW@{HWqHiZ3YA>=C~i^w zLa{ZUrx0(a*j=%=Vn0Q?hA`h@io+C-R2-`~MRB@fwIY3cS^gwNc}|18OyzSG|Dbr8 z;x&plDBh}gyW;(d4=X;Y_>AIfif<~uulTVd{hZjYh+>Xno?DfQtrFE&wnH3)g74=TW_-(+cJX=1D}$)@E}rdp zkM%Y$Z6Xw2oM|Dv@Rwn%d7GCu4hnz0H(UfOYx z{r1A>XpU*x!((gG-YJNCWe~My!XEQ^o0rDtJ-@wtpFMV?*S?jAdu3>25$y3@)Z4tY zUC&5B;W_65726S-dV0c2Z)d?gwu zculwkb$aIp zqE;!!Un@p*^X&1vkw0Gv+V`rL3FzhP+O4R2?|5qar8$w^x)pabb0vRyPUHmu z^qtO;mzE9N_`!nbK7(h{sx8@N8wZ5W`0li?&My1ic6aE3Wn-meXnOc^d_vpW|Kz-) zyyBd0*OXmZhM9qV%eUuTe(KK1pkW(dnSbcULE&ZJt^M(=ompq0mfF&dgWc1dFBk-I5>DZ%AB@KnM{-kYne=x3GYRjFv_@E zCX6!f?#c|>iv8Wf{T*aq@nLr9#zAc5mzX^|^!{yj<^Wi*FiX?kmSaD*)0xhhk7vD@ zzN)4yaM_B|i%QSVk6dPT9KGSC?bgF@ZMUp*cUptq%kIB%kbUxZSATgbB-5YoW|wRn zWG(&f+^uhJw{mhO{$-~%J#^WhZ+~gKi*jzga!YqQyD8`9lxsP=W0MVUZ4X;7Z4WCvzZXDpa ztFY$>1y{Ql*#`wzEcxnhYtvRAT^U#rU7fjVwH3I0!p4g--A(wZeS?eMX@H-!1DZ@=hCte>$l&so-#I+LnkqL)@^bfk-13}ZO->h8S^|>07J6rT{-sof zgS-y9&+<<}-bkq2Czz*m?li^&Xr5anlPKM1P@mf;_gpFFa#E=K82$uXH+df_5SZg{ zh_3CndlwoL>YT-PxKB`BE%7uyDyLztX>aJlZs3Pg!het!3&A7Wi@`f8r|KxBF^21%j8Q9ZkF0zD+a~Ve+Tni)IO>1NQC|}FM2dkJ9ZO^9lQ!y{P6}uQd zM8*8*H?&-$V)N*kEZbj2%r)iDJ2+{Fgk97Tos6RzJ}jMa_WJX*JTyX4*1}lB`FkkhfjkuF@8^~)vD!P$r^Sp|1 zcm|=WoGGwe8NM?N|9n{sBYamwEx@%f!gqTkfooxe*Q*qc@^%`&Co&YkNyl6VCVa1o zSq&yko@RybYp@ut2(-zG4rb>2wQPR$Wr~kVFL5o58j6p%cm&N0w24Rgt3de47Mn#Z zh&IB5W%%i6LqMQShbX^AgrA9Y5z(xL5q@4PGHYRkU(g*eYhi>pXuW--e2)sh+(2HV zuoebqvxZ-3Fi=dHwJ^f3tEtlHVjlE2wd~O7YL1_`(znR|mPgZ=`cA_E04&lFtO-=cn z*wx%A%r$)nPjZ}Vx`7SFTvL-?6yu9_7;{ZYU>|7HBgPLvVazo(>3w43c&ISfG=!&g zu7&X(>&IMEb15l_^`w2wH8uH5W8GLDb4^Y9p)r2=31hBlrj#EVo62s)TvL<3JoYhV z%r#}_a4n1pl(81ZJ<^^rF`idp%r)hyBx_-Cae*-An(`cxxu#R8z+BUos6p1k;J1b_ z=9=<-Mb^Ujo;EPow3FnJwJ>-pn1l2Qa{CUFh-@4V(n_=`=stxEc{cZ(1Jsw5D(`rH zDVbP~!#0%(<@2GCt3OAfoXog<3_{M4o{aklzf*=W*K{3rCO-~inc+5eIDs57xt3tA zDFs|iV(ZyMm}_c!(2YIA{l{EW9TBLJJ05gtKA-P^S>Z$M@J5>20mEU;HKjmPZP_uH zYii_BERX4!Ybv*4@cySW@*Og3vzu%PFAbz|$%Gge{|IBQDeq=9bqHn5H8sc4jUCAy z!dz2k=2{qsu+^Ar%G(6j!q~=EW3H*$i$h~Su{`FQb`*Q%vHgKz%r(7PnmQ(SDDz{k zsX5^)V?&uAb4`t06~lX&6~gA^ zV6LgD5U>|Eeu}ODTpbog~5Zv6G`Q!Tf>V3&O1;v<5ee&wJ>;an;pTv!dz3Bxe)rc^bzc^Qz=jRD4`Wr8kG^yW5CKJQ#8Ks@L+#NTv|!2=PI24GHTF82U)O?l6?c7J93A$7T-L?4JBq#mK?2K3jdbf&M z)@0`;kcGXQ1)J%A%x?HFvT@?+ku-XhCx>NalJu)R8H;3azIggI*}-Q~Ae$yz+5Gvy z?!$*c%Nm7)!_9sUH~iL^czQqw#&~-zLuj)F_1OnDcmkzQhdhtEH&Lg3Py;prFCP|f zO>Hh>zP=6bMtmR)bKY|S+iLgAVLtxy!_il8G5XIwM0Cy349?*wC}+MB>5^%XOR3|h zRJ)`x`{W2Tu?IrITQF{yw4#oSCw)xa$x^m6b^JQM9HFhuBkiAkJ9MOn;n(Q4Rr8B2 zdw|sY806cGt{ZfX*}mbZ?qGzrRmVZqoT`r?zAmb{P_?3}90R8Wp@2ul9w>WzKjih) z{TU|hQqg?|`7P=`KojlKrtFpR_z+Tt(C%e)?-5X#&8~=kh)+Z9zl1i*@r}^oV+b9Y z-ie=?dPCI{0cF8mt6xz%K(s5P9pL@az7w=Vkzoiz`xX!uATkG`BXf1?4b3V@mm+BW zH!)_FAlOT?XVM1izZDt&gwUS#zlF%_2pySA+OZST4g_rnf24G*G5BkroW0I#M-I9v z3qjh!ldKOyN9K}t41;tyg0|xw#$=D|^RmD4+A$RwCL>5Y&PU{2gpO6nDebr#5|6jG zgTv3Umf^2`L3W=k6k~tfiwt)mNIQZU_6|Zv=8|?ag+vBMZ3ll4g?kMGNRzl~sPsoy zWaxq*?f5++M^&^xZD4IY<| zAbo(K?I@FWY=CIrnC;>yNIUp*`gR0qM*&6)e?RZYT+)sMAoWJjc1#o-pVG$7*@w~w z`{M{?7>Xe6I1!O~2pySA+HpCgRS4RS8^i{`kJ(RVpX;^bPGq)wN9K}t zEPzyl0RIb)(}%@IAKG{-TiUP|iB};=8Wj`{fzn z1y)8zzYHgg_u9s2lDB*dnw*Uk&YuqDLf;qNl%^SEk}+;6F*_r}WbvFu%t^bA@;Dz=fnO^tToABLQCw!ZAbMkze_dK;-RS z5|F9hhO-N&ayg-)L`M)zfeY_ng1CPR;B3<^4#doJ!gvHs$Gl|;Bhy5vS(IRepVHEp z66(=BL4mE2tc-y$~F$W@>_wenzNFFj8iOnS4N$jSXZY zSh3d-&$K6NR_+Kk@2^1=!>*fPc8>=WCFR(82R2~U%;#}EBbnBx`EtasLO^#CZj;58rGGQeb` zC2;Sd^#&I5qF&iJ%iR2v1IdFa2NY)v(s?KYR*{U?s}M&)Hk_?SGud#qde;`4#*ZQR zT5O_Y2)-7Z=orFYwiq`uZUL0=0z`j%4~4uG0h4_RJR|{Y-lFS(FCkzz2>d=9u&S$w zeD;T$kd6R#E%893CWvdYRXv}`FX+fkScHJwi>?6gIbNl06YaFOI0 zMPLWBl}`iTF>1n(qOPtY@~I5_MCgXVRucJ;1T}$8f_gsjB2kZg8t|?}%L&qDR<&Sb zX>d8AF9Hg>M6(~|94^ffxO+sNGi)FlA{(!@mc_p2I8V2(#4~`|D9?nUkagq=_ox-F zH}E{!%LkSNVKu<1ESC@4xe7@<9>N;I2#*4U`3XkY_Yf8(7~zy~T+Il}jlL?uGiQy_ z6W%a-H^E3lGzf*m2}XE=K*&s9B+T^-tzhN5Hl`}!YfP=bG4rJ{oYpNZV`NV);~9(= z6L{Jpznfr08xu}2vP;X58(C!ou)C`eaAP7|CDEg~-w%uRqY2v)95{a`80jWeofu9q zVyvH-neYw?$Vys0&x}jY1$l_MU18S-o%c?k}K#fA+Z~`@on_z^42SPZ(h^cB} zW`e_sS0Krjs&}l`Dv*!A1qkRKg5GV)B@KU2+EgV9W^RpuQ;@)`6xvA8d*2;$?^`5w z)+|Xdf*%8zpJ3W@;T=o7w&1RNNAgC93{n;P+ToQEoBZ**AWU+Q;^rVBxC%-0r6)CkLVC1o;4u_!|hQX#Emz_>os2bw3>UJu2pO0o+&0Lny;|76N*NVD69AcJjcb z+Tq>HY%6)`vFszzINpvLgUsODqHjCSk-sg6ecQ3!x4pjwtFO1&%*BA-@pP8Wv9%N- zhQStM`I{o6#+EU?cn=k%a@Oer7GYRiz~`jK)*>06RrLnxyGY{`)1K0s z;hCzyc!P=Q<>5qg9ZH>QytjQP229cVS16|OrWC`CaJQE*-Ve!|*cjKi z-Cg3C#v2(7gm-J8ZZB|$*kD|S*)&#-C@Z0nIu~b1HnW=S<;-fbmoux$p1k)pM>Wu5 zbLB7p@c!s+d?FZva0J2#1l|P3BTPo%b=})|m1f|mT#DdrHzC4s7Xq)L-sW9XpMZkb zL2r8p5r&Njyl{CN;|$*+@M7a_4Y8vPEfIK1dmG~ng$O*Oy^W_R!w7^Uefo)rGt5Nb z>EvxZgBWf@;7EK|!$u$nF-I^%0Ro4ww>^wBh9?ksAb8LienjBW;E`kKgTO=L-~9a_ z#$&Hz4MUD!&BJ4uEAV&V?COfHgJ(^dIcI8xHRZr@Rn@bnS5G=V&YABu@ecF*^y)Zn z`m8ze+S$LzbOQ(BF0*FOs_0SyB8G7w6rjy<$4{D4Ib+tp$9Bzvnt!s*GiOX52M&sH zb=xj{72Y2FlQq<}ti6Iyq+Rjf>vx%SJ7Y#Qrm5G~&X`g$;e_tRg&^RxtSQIWU@ACT zSXjwZaTn4aoQ;MGp%xi%mU1?|iA|_oP*qW5;+PvgwPG6Lc!8Bk>_&b3q}ocvLS`bc zO8Bh=zp7b58Fx-!kFy6fG+l%Ce!-kp!Ts8TY6W~NInD{f(gQM{+~9toTOnhQ(>O+I zmtYg8(~w|h+<6o;Pajy)7g!jKI*m#B;+(u>2#8xi-jYG0ny^y~wi?EI6+xISBruJz z<+%aU#eAA=yLPabb7@r^iv2>)huMWeCod1m?jdNwVADC+uQf9xZ($tzeo)(^_}rV9$_q8%&fGvPQ>wKD$tDgN5gIsc=8%VK5w-Rv`ENl3OxA zmOUhu`9bK(XcO&$u3AVUprXc&f>|L4ls$cVnriR&SNm|v(8GR1f6-cR^Vj;cuZ?&4 z+xYBWRJ+z+?enQ>Z}V6Cf>wKtzuGr^)!yK*_RYPhc8$NaU7LTP1Vj}g~2SR57?wKeuvI3CjU`}GpMjIUML(x{o;*0lA*Lv zzg>sGDgM@dmulS^*?m(7m3q@U9oajwypfIOoqB>zwd4GdAMuk9&L(@6Mf7JiYy@3N243z|105gk%Em{Vf;UYDSf1BgF z)e(tBje^aQiX#+pz5;nvwsWp+E;_h!Ia?On@xF0hcrLRGa}7IH2QZ6a@o;iXbqJ3>k^jx& zb?>speZk6wtJ8LC8ng8cHl)~9iZnEYT4XcxMX?tR+o~aOYT=OqtCo8_HoN1g0w+xE z?BgeUR6f6sc?!%V%ImZj98~`f`l;zt=7890!i3=?M-Q+j?7~I0kADgTMYHFCna1!> z8GfOkXPq*nQ~wP46!_6b)=rvU@!M#qIG4=-yfb5#a_`{5$HI8))x)DyB2Co^y}CoJ zUxrx?r%_!3tE#ykY0m#Xla+a_8##MU^^}UPWiw{hR#byltV}t@YP#-bAMl*_pGbW* z&75?5Pk=Su^fqa~%$nUP8mwKZuO{%KA_w_Dn*^)sxYStMD>f_)N*%epVD&F8{dLq> z$xE$|BCD#D)K%nrI!^ew>Tm`AFY;tf*bODtG;`4RNQ{-_3B(wmB`+j+UHR8iWc`;> zWAS%#@_U0aSP4Tk&zlR}?=~{7SJAjz7z_QRLJF%Ka6~ z6_+TUtGHV6&x%~zhULChwac;flv7 z90Z+%dOuK(jyjJlp#U~ZtQ2b2sJ4HGQvwU;KE{gR1rT#3%#}r>w z{9N&%bd%3p7yW3J>3GZX(-jvgE>%23kv_T1w?gqM#XA&VSNufrTg5b7qgamKw?yH< z0(Pg2W8YixAR^j&gyINA`rxwMWR-;j3;B*y{an>AR1^*@fcoP9YuQevYlI0{zCCv)$I23L@-Wr}9mTcM@UeK23i{^)D#Cq4+n&_lU5wQROX)JBYCJ zlcr~9LB{dPRcx*pS8Pj!okEqnDIQFOoq?J@QuRkEPE?$#ID-f~)hf?bJedePXKMN- zs$Z>mjUqj?+0H)^VdpND?^S%92s_Vc`dh01yW*#c|4`gUgq`nH{!uXkuXEbTCL(=5 zBI<3U*jceiu_qDv`l&oX@o*ySjMVfgs-Lb{rO0*3X@3C`c1}_G48;qHuycu~U#oU~`THvM{Ee0PqT;KHe^Y!{@iWEEir*;8@A)Y2@VOC~rr2CD zuGm?zNO79tv5IpQ<@ptMPEq*`#fua#R=h&-kBT=a-lBNBqCD@y-h(PXqWC|G&ne1t zF!IqInfvi~#SauWDsEBqIP7+)%vV2_lR5Fg43)DL>FUmOdbbf@n&`D2`Pe zuUMftL$OM+R`Endc^-$IGgLlX@j}HvC|<6(M)7*Zn-yb2-|RuE@!Dl;u4D*hJ-4ikwx;^v;S!ihUIODh^cqo#HUXk&0Ysn|8)4a*`wE zJ#pWir0JZf$9$ZnN4!JvK1HqoN&Sk(h5^4W^#E3Q(!QjxP2 z+5V>#UsQZm@g2qY6*nnQ|8&K(6qhS-|%9kt3gnH<2RGITnS^vX|Pbxm6$hoLY->mqR;&#QK6gj1h z`7#xA6q_ivP~U^`6+yft^?a|$Nw}=Hfg)$$Qa(tL6KyG%E6V#evnbXWlaZm5Q8XOZj$1&aQjt>^DSPkpoHtAP7{ytN z)ry=T%k;ApuT>N-YUnvD%LiCi9M@9T%YN|corkzr22rcLE%GsA6E zn7Q`R9&X7=duJo=l|j_1g1x0ag%>>oX?}Z4VUOPqXfG4NYv1LFdu0%{wzf0RhKzIb z(k?~ZZ*Sdjv!Arb?(yv1pk<1H+`cb_zd5es-bQ;2w<~)23VZFIqxNCV2axR=Ha3$Vlbrl#~KRgkPBB&?5S7ck*o>#WA?3l7%JHq#OC@bC(?tB&ghK6SB419g{ zrjOJbq)nT|TEp8~Z4Y<8=(b)vLgRuv-JMr&+N61cU%Q(=>fwHw?G_+UXy|~A?ts3P zkL-MGO|Kp9xNz^{9d7619f6_2oq;-~0-HWcT6V>9;Abrd#4e;c{{>P??$o2{+(rgw`h zvh(Z=eUr1a>84QnVVgca@$%bm+Yvyi07?ZW+B>ap_f)1lS;p?1zhON-i`=%u&3SN# zD|PLu)beDh@MY(hrkA2^Ik`)5)V>U?YP!jB58L#?oDVVvZX7g_N3-?zz(LOH0N7<6 zu*?3q)?NKF#!bfR^i@Y&7l$Lr-*$t89>CEI)U^BtOc~EUgb%o_R)S$Ry{!LMJK*k5 zX4wFkWuN);;EgVrWgESC4RRk=7TFXEe(_nr{@~Mqee-}FFaEi-M`=1aWS!g>qrw?G zq-^XbL(1Bet!dJvGTc4fZNT<$b8sRzzjOdtZ<~Mh;zys{xGfOr!LfJ{##+}MTF!dt zOk4oWx$N5fPMpb)8kgW)DDj`+kii+d0;&{e>`*H0(5uJ~uG3Bcw-RT*+dF>@Qv$(k z++*D5QN}%>$#J4e+rnHk5O)vHUrd!7B;lXihx%bnE)-STTU7C*mpeWG8mhuUE??n} z#6`lL(WE2Ga~+XjJeQ4dw<0lEkT-$x04xPN=TpWm9SQrv zzIitz4oML+6X7JsY}$2B z1;5Sc#6}2mSQ_!Jpw!$-d#j{|HPJ zM0$rmX5BfgJH;`34DF>jX8C{{NpZ~byKyANF-v!hNQz^YUlAiIj#)l@M^YTK`>||_ zWA+M`^>NJR<0#RU*UQX-M-{TuHPV0rhNQz_j9ke7eDRQx-hNEm)WO7S( zmU7I}aQb!l!=N<;-CH1lW0s$E!;v}RHz7v(T{|+j0pqNQOIbvA;h5!*6qS)X!yNPt zCRACGyBcZ%a?D2RaLh(h9J7XiFn7xFiUT!c&%9cdAgh%9+1~noYj@iiTYN|BKg;gRcj@i#SGT%z) zl*K@s@@N@T-)UG4Ajj;J6yMLhQBuc5=@1tAFpFm}IcE9YGg6;pmPH%MAC8trck_=t z&;{L-kd)1&#w0cE;6^3}!t9-xJm~s3X1`%)fMZq`rvuaB^Q;#fvqlcb&S1shm^E@{ ztRwULIA(v~PJv^VY;@$9J&5^z9J7ye;DckfK+=1}K4f_x$80r^Iyh!~NqXN{ckDz2 z9JA(9QWB#hSj5LMTg&p`m^JB##@e$yIA;4w`JpjV^+tRgv#nV_IA+;7{T=gj@jkdRj19n!Pr5x z0glNm1muGiEoCDOCl`8LelJ3*k_%|RzKfm7KL<5tM!+%q0&>LUS^|z)3OL7OUvY1I9JBmM zECP;M9TBLJJ05gtKL2Fc&5D3ywkh7aVpE}tl-La^&{Q!G4mf6w9Ez2*=fE*5w`y|C zGSUf|wb@NJM8GjiD$-aXP5C%xZ(>n!%$noq#%|&cfn%1L$uV2YR)b@fw+V90{=ioI zIA;07K*Yx}%NO4WIA%#8$#K9R8YAGCH78tU>~7Wvj#(pD#o94HIA)DJKXxPQ1IO%Q z)Xyt=tb`fBF?+r!z%e_J7W^EuXE6sjW@$n=X4kP!aLgJ7IA#Y>0ghRt0LSd%>_BkL z8U;9J7cd7nW{mO{aX%Y)nORQ44(W?8GL zpOmpu2pqF>PzyL_scLTXG9aTH1B{f-L6;|bbDJlhcP@+){Q&$;=NLQ|5wS%sSndHh zW_jfU$Lu!tI5=kKiwKU{qc}RkZc`L%c_Er;IA+tqG5ZLt>^BYhmc$Q1ms)YQ)sDZ* z0#=JfP^E)o_G07$$LwHeowM!SyOAgRMd;G*M@a{)voAoCMyg;3gtMPO2)axUy8N); zB*$5ioiQo{UHup>{2@Ex)H&;9`U zu7!Lab?>o`{*9?S54$u6pNqE#C0<3!%gGW(w*@ji&#ZP!@rS;2roDe)9aoRutbyVTJDABE`aWl9)bJIV-FyLa*DzGR8Jq>jUp za#*s2(M^LqQA%t_iOtCp4@(`-A?2B538Q--^1D)kU+U>aXZHM2sUw0@FAc%8%II1{ zZjNBJD?y3j$rAsNI?hANnaL7HcR%F2q(mi3oSH1LMN0gDly8$IjIJBryxSpI?RcWz znJn?WT&K1oWeb97mC;4;UDiRcIz*B3DI!5x@5;V8x&_5M9tdrxF8H$$ndT#Oj6>MJ z2pKz9A%=o~Mx3=8UD!`$ zjPr^;hz$3$7=P4|VsAitO^Ow=nS93!%3uDBVZR!^mPOgr&B(L~L7JR~A0vVY(&Vlz z#O&JaA~yS6p8wW*8p*eVZ+i`Bi9$^g_GgMT;7~|q2sr<*(sF4+#>H|xvYj5ppJR~Y zXoOCGhER)06~g{+(8x2;TnXuN1Q_uuj|y1`X7~ih(g-{4PUQGA%Wd~6|2w3&rCc#9 zUyeq*Lh;RVQt?+v{Q^NM&cHX=G=%;0kx?q{38^~*wxBx+7qo7jag}ktv76b>UtzI( z6N=y3nIe3PV$OCulh@)Nb0^KTobT)i1r+AhvnPGLoL4a=iAskD#29$Z7%*kt&@w$) zYv9$i{p>FhaTX(YFJT*gHLV-3rx3t4{AyZ>2;>-ta0K)A=3Itw;Ptc!2U?$b-I4E& zv@BZaGp|<Pyr2%krpAf|kO`XCP0NdmJ7m!U72(E#+iwFH8ckuU^7h>aQH zCtAm(;qm@XOab;)k|kx?(NW(e{Zr>qnUSXIKc%F00b zxSnjuM<8zQYojhllzjm5LGJk-CQ7(Vq9Y0G5x{}$CK!3d2#XSoJc|IvHo_|s9YuH( z!Le!=Cm7)#`lt=1ebPdq}5e@zHr zU?G=u00%= z)XLwMhqP;+*norp>P9|(%WH?Q+kE_fv()6f5^#r!z6984qG2?fH)R;|h9;u0E?bI4 z8N_bT@GmiSu!|DoAupG-k*fe~J)3f(G`2d`E+nl_HQASsFOS?GY$}5r79mzQ+3U8}2`0`*z{QIrV;w@S4w^cKn7}SYJ=&dhl9|NrMLqsxuj^aO zneqxUPB4MT0>F2;+JH>$KcE zzA)}j_6~OI1kc^V`o_JMGl54R#`Vb8X}LErVBDYVjgr<0o-)hCxH+4ov>7q26HHhx z#^?Kwt(VNC8xU~QCS_s3!win3Y;x;_!W-s#my&z*Vrc!8-jsRy3Rz=UxJR#W8DAsvs1@$$74AO} z=R2CDm#=WgAU;)Olg{`mFCFE1nSI_Tzl6Ap=6UvcZnC+a%y=GywK&z+WbOPqy<_VH zQ+N$)m^uZMY2NkPvxJ7q2J%%0Oy7umeBazBo+OTS!omb2+$ji)5{&Sw0%382kr4=Z zydiMUpr4;$vixP}XWlh#m1fHs3|0O(z0F!|P zBRpv!xCur~^B0E_9E*HPl5DAcVV5Mg#)!2>K$jEvw1vmRaxYzOssSivW9B#l?#6^Z z5|ziw9>{`+)jO6j(n|yonlsW50r?50Ey(1xMM}VkY{-C|0hqzq5{>z5qF%?P=)~E7 z^eqKrEny6TgJlkq!#hQ5&at#ca*pzbHA&5nK#e4ez$hWiN5E66onS;CEXzaSPv|?3K48saCB;!W~{_6y}rWYbG}(v#@nWQa6)}z)p1eN)Td< z-3FFs_CURjr`y8_ICun}V*#Au#HO;pBM3axpk74eAVRzrx$AB3KsLj16oIEGGA<;R zBH$66ptctKY|Zry@tK)LzeCXMN0^dc4kAaNIRlcthmK6;@I6R)O7mpLf|C(`>*EU_ z^l<-7U6l`MmwJ5hs>0`KM4v_QHOjG8L2(1ZZl8pq*KIwJ#{|d2Q<=8Y=sJXd%OjCj z6{cJus;?2AG9Y{|+@aLdd2Q-Z+skHIbSvi=@V#r9w$tb<2z4HcjER5#i3@gh^Svi{ zDo4oXxkIV8o2M~(Y4Wn+c8V+<^t<%?zx9DGRX-o?cxL&=Oh9;~`Qnpm`)>Qa7qajq z+oj+Ctc2zUATL}SP4xe<_a*RERaf`-zBwZy122p|NSH)I0?42s2#AOv zvm&BNNCJsKh#3H>0xBxCS_hn`I8U|Ct!TCSZ?(=XwpOh}>pVk6tznR1k2BBxJQ!Jq^m9J_4);Fy$QdNBe|i}zHSO!O)Z zyIi6_K=4gCH}D!5Oo%uiou3Iz9szP0+KBTdbppcn;^Z>;#8bbccn{rP>0y_md>r?Q zyAe0Q+poO^e?&7a=8pPP@KB$jy#ky7xeR#7^_T&d41VwNF(VlP*HSwQ95P3sp_SZ=jG+( zyYukRePXX%>;a~4lV0#O>Wqa??ivX?A%Gy8fSljs& zz_OF_DS&&mdNtK9G& zLtzPf6%1ZVe>guE;0TdDIL)-X? zaKB(ad=2yfQC|{Hr@8(j<4z#l4`#G!Sv$+c@9&XdIy?acTVR75(t{!;CJ_}gwR@yv zTQ*GXGjEykbC3zE@ImCtWbSZejCBSO?iFlV$b*R+NN0*oH(S`FY_&G-MAn1nfevO%tM#Uc$iz z;SP~tHh# z4a@aB22YbtYw|SFm4izU8yS1BIvMrHsPcUK%kMwb7K=Hd zQ_guCjePTR+1~tc2V#6T`}elDxDRvtnY6s`ncHuE7P+o4Q}%vTgejXx+xT50 zL1?uEJLSU;KV~G((WR?7hr0#uvr@Ra+X^Oqg0!y2(<$xw4^Gp8^Zh-_Z2GvD6LQ=}mQu>MNI&x3MP;1JtlsyL}ShJx~95i z^@+j5hL;W>dSqhY(yE4*(N)VDn`>4MTsj41d|CDjdyfs3kFR5mUgI5;tI+K|M+h4sq@HZ?ca zRUzY&y2>Wllm~O6%*qdhjr?Y`r3t+1%H~Qxy|7_m)w25L#>%SZ(aRPt+|eU~b4=OZ z#%B4hIuXF&l?`JK3`O(^{}FQHGF4)x)HRp> z7g+yKp78Q2TnzOs4c?MdzPzT9R{{G52M*0Om=(L?2f)Y-Mk)KxJWx&?ma>#x^a@bk z#5JpYMPpqvW`Z3@r>Pd#o|$e9GjORl%xbK%^N};qi26@w6Y_J0;^`Mx3~F9cRlC5f z3n|wV$JSKR?a0DvI0=JOgPIythG*f*C8@dGQs2^4Q|xb@G&w8KCk!?I4;jo0@w@XD@Qoc;?PCC1zP=;qEb^@p z{X-#t31)dW3Hf!7^y9*3g|7?wX_e_6ggt~ah2_F};qgL#onyXBg#4YD^gTj;VI%#V z@NJ>7p$dKoUs{-+FDw=wAf!zJrY{g4BU~%IRd}E93E`{4LVUGher|Oo9w3}8tP*l7 zEz^w+P~cgjpA^0*G&Vbt9>X^s${X99z&@h)7ETbZ7M>xzO!#Br{X**Jv%Hsun}uHp zvoP_Q{!M)i9It$52#xJZlyi&d2ZWo1uL{@U>nH0wTi7bRRrrALCE=L)eUtDu;ZKG434ba4t?&)uR$)HYEY@2r94ee3 zoFl9iHV`p4nuRNg=)(_$X9~|HqTE)|R|{_t|4z|&3-1&E5z$Wwjg3Q;^P=cK3Ev=s z|7X!33%7|M#2ULR%zC`>6VT<@{MXwVYn~=!2LFt!^f0gih@$V4r`53s5 zH1ZiA1E_D4(w`Cjfe8K^qCH;&-2KUXpD8_n4TBt)h%keQe4Rvh5hjSp*I(&F#UCLY zE&e3YQ-m{#$ajR&7mCk4rL1?E_^U*(7Oo>A-x*53Q2a}USBihLXwT=sy`-^TJxE0U z-z)tO!q>&887a#BRdgC2G1;ChVJ;E*yNcdJxF-?$N|ioV{0YK?#OFp7mUpPIl8AhZ zgo}mWQ~Da=dg1B9^NGlJvG6A0ZA7&1{}EBo!@|eK|DEXPgxveea^6w;U&a4I7{LQB z%Sjh@Afo(2(cA^g^u9!tGf?UKi9b$wp!m~8&lZ*wk*`MSjp8pCt`VLjTu(&(XNx{h zcr_98^A6zy!dHYJ3$yWxK)FdmJpP*c@pxqr%cVhd-(aE8{Q8e}_7>e=SSIAV0sFC^ zaGdZ^;XGlbutvB}xL$asaD$MV0W9|l;f=x{3-1;FT==RmlryHOfCq{`O1MB+CtNCQ7OoUtA-qO-v+y?I zeM0j-fqEVh{exM)*77Tf+B*TZNv_h-|)>puAim z&0Uc0E*vJ@N4USxybnQcisKd`kGV@D<@3!mUEjXM^XX!My*WT?GhiA9sBd`w6)zoHPw^5LXD# z64I0s`L_!16mAkeBc!c8%Kb^WP55_VobPLhdp;3psgLw1q2~kPaM8^|&*#B;qAwEO zA^fTEX`wMAh;ogUFyN=+ci{UTXwN4BO%IW#-BjW<;Vj`2VS})}FM;#LzgT#u@NVI6 zh0h9K7QQMp@1LmmAEMj)2B7g1wri4bu5iAvR=7mCQh1!Oy)S?Z#lKW|gYahIM&W(J zM}Xr6}}*RUHG=}L!o)!M!qjZoA++eF}@E2Gld1h&ccMym_&oz zK+$EweT4f7X|aaoRSG>H14~3V30DYL3r`f9_kH9)Q}l(xONG}8ZxqrT4(oef_$T4( z!uNz*gvRF}xfk%j6 zEi~U5z&}QGi;$*$*uK++#z!IO3q;e*57X}vJ}7)hXuc;Pom!=4oP;k4+xt%VQ2bAX zUkF{kSEC%75F(oI1i*2kCkm$ujW0r^&l7!=aEY)%xI*apTsTSesY3G|0p*zQ2*69k zZx#MXc&qSd!Uu%E5yn9!YhR4y8+T~7JaAiZs7yM zUkYioiRHa0d`E^v1Xx`I-ABk_?%Rw6-fWSTV{#qiW-6rNgTxi~}LD!4+eD<9u zniiTUe~a)D;S<8QgzpJyvx)Kr!ahRpeV7)Sm_9?ePbta}~32DEFbRXdu;dtRu!UaOwYNEV(p9Eegng-X%H}93e>qXO!6ZsDcX=R7> z%fdH=?+9txiRmuiH-Rx>rZ7(!7t-nz<%S8T31i}(i?;q6Y=bGqv#(CX$OjOzYsn~gdD9wk^hpA zMxRJ;71Hh#=?o#wIg#!q>`z2FC87rlM~Y8lPn4e`q**7@l|ou}BE3?$hKTakiC!-} zQ+(QeqWo1tT6iLTkMKbv@;@y4G2tfhY5$4xuM27IiS#xh4L*_XAnZg$d0j>CA?zbQ z%|TIqq!5qAMjn@k;R6ifHNqes>kMK!H`xCBMne2zVX1JaaD;G_aIA2GaJq1|aISE^ zuvWN4*dS~ct`)8mt{0vzyinNwyT~=--zL0ExKVhY@KNED!cD?wgs%wS5WXY)K)6l# zcOidF=Jsc@)ptZ;&mTXtCf6ybE?Y~fttd||C{iLgP~{yWQY z;;$916RsDYE<8(kuJ8(>_kHFD(Kib>3fq6Dc}V<6g-;5f7rrEXMfisB9pMMUZNk3` z&F{t>e|_iRmTZn!rm+3@nuPe=zD2oy!o7s0!lA;k!U@8og!w%GxCa+{^WdNNjRXCH z-M(=!oaVskHAi3kk0Ic*jyZ-3J@DlA0)ug`e>^Dn2F{gtgcO+!^zx8Zh=O?!^$ss> zA{clzbjB*7-#Gl1f@gm$vu2+p%VWFveb>u_sB<+0hI@_mrPcc4lzRaaXA%q3;gwMh z+F$Rssi-%{*30_5dfWTP=~d!536(|g%4mSC~vxN z{Jio`L7Kn3=TRQN1+pud2wwZRK6`l(b?;EFIFEkdHg}pZWK?kbPY4}O_ve3lPtmwJ6bmC3U>lIGV zFF*UomkTQz?spzAz6(vZkoyYP>p}Q;uwk_Q2Nxn+!GQ}AqlyyoD$tk)3%p z2Le%kWDlAzvr`L?Br6o=j>Dk28BOcVlM)C;hd>IhLS82oi=GGwg~HTAMH*s@hCS9M&J+RbR@(=;p>9kQ5Ou;L*j zv^k)&da=xFqbGw6%hOr3v>d)EY<|>%Kak+%to}zqW)0HsM)=mQ{9%axKw3az5RX8P z4vYsMM=aXO3{DRBg%?H##XbgRtz$x29^ZFE6T*d8MXnjtY1PXI@q{S z3BV1+(Kw0G!Ch@?PRH_;tyyN38eYbjCUAXrmLIl14H}e;}=Fm*d#>kcpsI^I7_F={%Co`4nZjEP8L>~c8E!Z zKM;}&dT_Ah4}=A$(~K*FY6yp_LBJmfE#t?cEwOWeSv2+%UEYy#R>b8xy27gn^O&

5^z=+TvNc5+<%0Pc0(Yw8w(6M}l6Wu5(mNkZD-;)MUUnn~>>i{$=dap?9 z4klNlN%fA(`hv~)UB|8_@7S!H zS=2Kf2N=@&1BpJTq9$Zju~jc9@02V)FGpWYf7bMOdRA{1^~YRT7DY2=XWh>>zm{1E zA^0cAx*cO0eIuJ!F#Uo2lBsWMvQ@*L#>vRdtOe#DXG_5{{v#jfg*ts5nAE8QI^Qo8 ztq8<8I&mryM&S>HayX;$Ly##7e;{X=E`;JmtO))S!XL=5aQC48?C!n+w;bsDq6ABa7Vq4);2 z68=CaOn)E`Qy%_6c$=U*a>_ye&F_yake67UCN8Sn=(fD-TrVj1uUvJV;X2VxoU z2eOpyf?8bvoNZ|M1L3Mp!eoU%5S|=fNTR!Z7==HOUxCq;t40SN17>z(g1v@#IK&IRo6C#OyB7F6TR8MLq^5HY_5x`d0KXk$SuOm5 zaOHzP5PETo!XHSfA>j{XAUXhlARK}oe?nr|?T^}H@CQO=**&r#wgFZOYuIUiw?{z(0YOlN4o{iF+9{h*Hy$G+B zz2N0zXfMW!!Ac+$v1)hkOx8RJVH|m^&K;J)+P??7g*;a24mZ4;LG#{P%x1bH3@>oD zQyk=wjm-QJk^*OkdUKhlK5id(dSE&J&u~loxHCg7&R|p?4zc5XUAHSTbwfFzzSi=3 zCnuNwkykbr~i%BNRZddVl{!7ZZTy(fgcsqU!|G&mISM-x7yb z;ZGf#ZBH2H6c0>BgyRizh9jOszW*QtmKzBa@mVBFN%4IcCVdEIOO4ZPkn$ntV|PZ< ztY0b%Z(p!WMo^X*(aSP(yDUtF#Vo(jtfWvkB(gKC&pTL@|M1gz&c~bDX#5YjpW|0j z8tsHEg8Ma__nh6PSO(T$|Q02t@@E7-i{TqLBoQpJc(1f!i~Id@w)Y+jNSpw5za()7uZ8 z+MBK2wJWO3era##bNl_%_H7*`9fBe*02hA$q+v5BQ zv!>6V-ni^&Y<6#&f8hA>c9-l9cAI9S$#P-c9&N+(sn}CvSo|wC}g+7 zn&z@J&$dEcQ+d@&Y(U1@tm6)7?KW;&URUjuW7n@4S?)?VTkfluwP33`N?qP;8h|bR zO*LjuEqA12T)iR2Uh~wJbZ>Jlkk%Yh)(`9sXjmkuTFg;F8(`oeWmI8N<A!HO%6UdJIm@3a7lb+?w7K4}3RD0J^UH!skD4}vC zEjeIbzy_3qMa|5l8tjTM$K-F}RJWt;n|3ud7<|7OkA=8ana_68XF|bT6UpiCvqZ8K zlaOP>PPExx?pbPBSl@hXLrv2T)?QdDsIRKw`U~R$)okaSDKK2&lrO4jhBbg1wgOCD ziOJ3E+gl%5z*#iQEPbA|u@az@UT&=em}SxVntSu0olS7uB8;UBbGla;ixU3L_9+Vt z^-C+4pglNu!-iH`OB*TE6ZK}bkhKC+R9#aw=b<^#DSHN0OO|m(YlKyg|04!b+LN05(JKUj{}cA8#DDFQVb$2MnC*M6#k& z(*o(S+)%z-;KqZ6@cz{WPPlpmxX+^f;b(=MtzY`ngM3o)9YH;`dMp@g_o4=ac%0>< zZR$up-jWwg{(@>Hg63DwlyuPiGUcc7w&gp5_Vaj>6Lg>`<~xGsSFRKz2qUWgWBWb) z1w)?0Egi27cpAe81-xSt@s+=$kiSKe zHg6T^Zg0{M+DrT)LVnMo+!*0h;Y?wLutwM`4J__LuKlPCwDV!wa$5-+<2yYiYDEy7^kHXEuzYF2u z%j7>mI7e6`Y!RL;JWqJ7@F&8Dg})cRDg28tjET;676^L__ZA)?oFiN)Tp?U9GO*y8#L=I z2jx{@Ua&mQDX%=vUoQ`$4)>V!^#;S2c8o7hxqg^yPcfpyD`P2Wf4!3uj`JXRte1SR z-nEE(c@TB}g7OlK=bw@)d=Xx zU5pEQxnu~Q++&J+NjZ2>wISonR)wbv!--bs z+v<{?1R*zg91=ZUvTMQdbjfJKYI|L>KY;7$l2LEs>vhS#$1+p8WN(r5>5}p3*V84t z8mrazx@31Dht(zH6Rf98_AYvx)Ft~J6LzLcwvdS_U9zW<(WgsRi8{ZjE?EvbzB662 zdstgam#iae+o>+ucy!*UOUBym9@D}B0T zMy2Pgbji3OKc!1%#yh1;#$D|`U9$hjx>LGjY}hx@CF9onq%K(o^M0K!Sq#;G3tckW zj({%NcwSu4C7X?t3SBZwew{9v(dS9&l5u_X>5@@B)2BSx@1}G(YMkit4BdTT{0Rd@avNCqkvzRY%rVQ(5`qs z_WN|n9-+KXmyFj{8(p$nS%6=c>>{oLeqA!^9JkRW>q^Fdwl3MH?53wn)_@+Rbji$G z;?pIY#{ux^l6}amyQWLl!jtLKC3}jrPnYa7($FO{_g(6eF+z1C=>qw5$!2rZeY#|S zU{;?l*+XpQSLl)%?NXmES!d?|3SF{drhkPl84Z~Db;*pLm0y=^BOBz`C8G(CHo9a+ zz4$A2$u8zZ`ewRhG@SBX>5`3NSw3B|Q`m!Vr%T3F=ii`9b`h&h>5}zg2mHEZ=c0$u zB|8b@+@m8B+v$>x0c%a-NTjyYC0mXJpDr19*`=N4=J5?EsY|v&x@3J&N7{KE@>|V) z&51uq`g~7UOuA$jcyugYfQgfKp+`fPY&J7ooH@yquvDU8)6!^-_#>ylB&jXD(*h5R{-^x?t^ zVU4g!xJr0}kiW4q-?_poghtl^{Ch<|AbeW*obYwwpM|@1$?SOU)+Mv!uv?eRj>B$U zGCK~tb;&Re_}XdKSKw`2H-Z0&x@7+w436#AC3AM`lHnTTbB#?Ck6n&LRr1hU9(GeHWV50BN&d5`&+ErnN(8Ri7wez zNI{p3rox~dW6Uy=!M;)?1W@`*((Z2_D#w?k%KW53yteH4t&>6F&XMc>EDzIjR zfoef4y$=7V1Yr7xx;^`2r(iHV`(w5MCu=5~vQL^NllI3f8OwSSI-{^ZX35N~S5N?S z#w?kWMGutF8M9=5)?sYg7?FipE7^~+BD-1JQ~Qhb+aG&|t&;sQ#yRR3G1?y^8KnI& zDlI~1j2#1=v_EEP+8>*Pls6!4x(xec?;>t=#;AX2$NQ*U###Dr*s}77ZFkcCnDGl! zl(av_!IJ$k7Mwm2nHW?>O4=W@ zMJ4Tz*}O^nV?W1`1&WgP$8u2w?T=lhw&fzI4|9i)PYHzX#LOXjB#}06FC;JKW0lx*&k~$JxbXhvvkV-n58r0 zkF#B{KW6i%?2p}oJ2~x-y~T9sjM?Iekf2h z%9?S4&X`?FQufEJ`~+(k3iiir`lNUlmJgjVYu_wof6U6K?2mD9Xn(AN^3WOkzNv3+ zoYxg~#*A8T(W8O5XMc>>h_OF*8b*;iV>FG_#{O6-hOCYKF`7gQ78(0vycFz7x*MbJ zJ4uFQ<8YFy(WY?dLI~u$kAuSr>Juf)JDLq58$XnXKXFH%%Y60BXq{>c?`wr zbc;G;6sG;LyD1O*W4ulH?T^`BOo~%`oH}ETro8F#rzj8mW8X7Pog2TO>ChRo7hG-p z9*ipOk6F4QUd(jZAG7qz_*&+N&R7p~&S8IycA}^=R$>^iKlVI33;SbiK^yyHETWD5 zG0X7TAF~Xf{V~h%*&nkE*dME5yI_CJ)$D9tRs55q~p<#cFiy{eA6zq@j?1fdHE6AqrE?CZLqo|l0QSe|8jLz) zT=`&s>{F7^87nj-?2qN61D^e{H<6gq8RG`OJ@O#8L;GWkkU*WWVUU9Tv8zC)UF3G` z2QnNw2LEAy?8XimzdX3gb8p}~U9CfDM+@X_k69oHX&thh!{n(>rf9w{I zhR#?|mVRr8@H&*%(;bZL+v$v*fJa_ye~htW)RaIdV%5+YW6epOF;?de>%iK%xz1;Q z%<%Zp;|7FcHq#wpc(gy3hDJbVj9PJ?{jpO~)lTe>vE#5mwjVMDQ4XlxI%B(a#&+8u zvjz}w4JD7=I%EF}b;cGB8NA#6m@%=m+y2;Y`(q25oPU+3*LS4Q^-t?;ZLbjq8){eu zQnuUvd+m<>tCYFEmExdXS|8M)SnF z6JZb^lE}{$_7s*1jURfX(|7~rxUrE)JM+Z5g})O1UigNv2fnIMZlG|qkUR9qKT^0< zc)aio;bp=f3-1>`C45=9S@?x83tx^{es|$O;b`F@!g67Q@C0FT)aEY}ju9IF?kKlh z^l`$|gcl2M68>KJrtmMqFn%m&`wE1;g?kGR5Y7?S2wQ}w2rm#CKkO*)9?_2rUle{I z{6csTzC*J9!-eMx>5+l_2ZR~;97ei}aDdRWIW}ChXLD@2=tG6`g;l~vq46({a$7~; zDtth=N%%+MTST1O_k_luINIpqyB=+fg@x%vlv^O$vq9EF{Qly5dSk|aIOL7raFpZO zAe$(8V|xtgo}cj3#Q&iX%a3Unrn^DjH`z|w!66n4`w0gLhX^MLrwC^W4-=LPtAzXv z%5v8TPZ6Fb{4caI#@p0?y(7y1HodU>V3P?;!7kYtI}dZ+J8&B`$29!M<>HJrl;b>v z@}^^6b^?thG-+Fk^ViEm(RWeSuGkpM*+m;;`H5Y#G4}E<+8BEVlI7iwILo6> z1CR4M!mcP!gbt=Lw6`(Vyo)x*K7ia_USU9v3y+5p{QdoVBGq5~h>&bwd%dv2&bww~ zYzpLd#m3lin15qXpLcj;i($a?c7_rqx?-_~v7ITJT+3q2Uv5L_SpFqm<1><<&2b1={! zUcYwQdx63$Cr*3s2Z5)yW!~nV<6N@!19#P?cLRN$0nUeytqp9=31x202}ZZ(gj+XP zO%A;ui_G2}nw&E(N9W}X>Aj_RRo>?4(X%&4j;`5qN|(INkv&&zd1O_= z=GZ=cww$IPG7{I$8;_d$Zt05}!t;hfX84v~ z$h~fIUz8LyC50y6^z^t12TsU*KbHNotxkt-n~s>c-^7-Q%@gnXz&+aC_YU;)Q^Xc+ zVaac*TBrJq0B{FPF=NP z%eqzXL2k__HMhRJE%Pih!k1*ek7xZ$KEJ(iB1SFXV&vRX$IU97wJm2#&XAnJ~J7a&(?>=>)bovT4S)(7vp93UJ%g;oI(i=fgAK zn%KJ8oqXQgJlSvJK>&~LI703}@IUiHTrtNRM%#a|5jTd(N3!luV`B;>8*it@5N1>wNTIP|D(f7$n>h&GPl$H3` zRGkn_$m;dohM1?<_cVlP3y#0LXFZ5QcdFNSC_3WP>w6y+ z!WP`I$WIeshcW9n)ayG2CDIn0(d)aI1&ox+lauuY+T+vf`vld%7M!gumK9|WQhI%J z*p`%DAI-z~^!on5yeYlDt65P>uWvZ>`t?WzVnIw~Wa? zy}k!Y&yb$qx*h2CorT&`dVOZRQ+j`Uf;zW zujL)BmYb8clFi&suWuR#=3D6X&1Ab$enn}daeKd_o?hQU6uwXDV1-$ak^H66exzPs z9m$8gdwPA}=c!5Q_0hGOPp|J#R`f0P`aWk-zv~#}t0naMPA9ojy}nwW^cU3TDOvm; z0b6jMUf)(W@{hSxL7`qB%?97SSEw1=`tQdYpEu9&s!FIo1AN7psSCra3)az@dyic!h5NV%Y-;u1(r`Pu) zX`f!->#X0W*VmKf!>_2lfG5OhQImc}J-xmwnBS+@cL;|Ow&1M%^!U$6!xo&U*LM(U zpI#rYt2TOld$K^-f=lZ4@iR~xy}nF#34TSBdVO!P4A_GE57z6W9sZ-x)adm+%8~Ku_1(m*KE1woS@f>y_3={n>-FW6 z_UZM}N~>S5uRn|S>GdsV)vyI;dod~gYv%Xq^$p-W^Xc{dh2{D5`g&5{r`Ok=@;<%3 zqgbC`ua9p7ZS?wHqJ&?sZy6E87UaqLu-@zF)Bsumxus(ChmZCE!=o zGN9MTSxLX5mI1v!dLsX>^!jpHxKFR|BaXqh)9d4^lho@Q!I9XhUf&-e3csS?iC$lX zJxJ;G{ey$!*X!Gip@&}IYE;?dbF`|RULXBpu1WAau9HA;+{8*02z^0*%Ju2>(buV` z*Vln+eO9?I9HRD|Rq=ZPvG{!C_N(}9KrvMDI|+$&F*+9YQN_>FP)?;hRQxOr6~DhQ z162I@39kc-?CEw#pWI`upV3#)4j%4ncm$@N->QC$O$KWMLJ?I<-R~99@#$*N%gMVH zb-KqDunOLZeoEdr${nA}7w^9z@R_NYZFSe=Q*H#RDQ2kQsak7z{AhnKLhs5dc+@)~ zkE8HD=vOH>gn3UiJbFzWj!?Xh;dP~43+OuXj%K|l7LmuTFAtMPW25eg1IWummM}u^ zhLvTGdy=X5d!TvG0&g&QUD!Sv>3zcR7K4=_Ybi>pLg?MF9IW1CaYM^32*o@r?mE-k z7zQJPQ2axV%E^W|5YZy?=z`ikxeG^yH|KitjzIzLdebvLz2Ab+doddKeZzVS36wy6c2BsH{?d{f; z{J-R@b*Pi_mK%uNJ&qFwyqM>USG+!c9_9!S%uy^_#~Va8#*2xYaBU(!g7}P$7ZbUR zkPne|2R)y|ohyNYbk91y)yskepLhUQl{r`p+`AIEaUtj&b6hJU{235@FSp^_9Qv;k z@bwFFGYQP*I`as&s8zP8S1i9xZbRgnyt4>{O>{Pa;sNJue``%5RJ3t$HEDR; zPD5x3LO^x`^zQ9| zFv5`l9~GMel&O`2%~lXuWtfA`eS-GDqJ(4~{OE8fLd3b;q%s~ena`R;tWcb2yK~kw zZ}h!9$f5&6&RT>E5dzLx(|!f~t>Swjagr@<8d%B0^GL>Xy%vG_nEx8Z-vcr)`D20e z6({n925?*QT0|L$Cl4e$6$qCiAZ;@71`}_pAgZSmxh-BfuvffF_89P9ely~82s9c;SGR(3O4W)a4kEKP3f zgNQt8_=gjoG<+20WoGY#&N}?(dp9QN6yh&Tys4TKltTgj0f?G|g}LU!I2SZh4kFr% zq`88)(ekGP%z+%HhAV)OKbUAQq~>Zwb+8SpYof<13hjxM9f(;_ZQ23g_ZaY zKYdMzecTgSc6-mJA4@0+{?}PNwaQO8$^SFPPVrvmgv}fae&M*`G<@QYbPT5j^G1c; z;L=1mzh^itGANHnL0(=s*r@=t8{Q+>lt_$%Tvkaq9Jwu=5eas3!|k0+I6atILb3#8W=XK7ghG&U zjc`G@djxypA+^{hWJlofGu(}2_5dSF58kHSZjoT73vO_Q5iJN8ASFH6p(LC|R<~eo zNjM|8KWiJ6VD5}yy_GB|fFE#XE*OedK(+w?D4tywjt?a_BUtWYKB>0*$H%M^~Ni;GgoNXFh3PyIgYjL=sESwk+&Svq0!f~Wwbfb|{ zTjHQ_#y}?60-H^FIg`Wr5K9Zbzq$mYe}P*vG@Kt?SrW!*h9jly3*|7xCCR5+LCZ;&YzecnMdt$#STH;ZJ6E8$!ngJt@}SrLxx zXWO$^IJZf`+C%5M){n6qbf^46GpTl2 zOXL3;-@|f{ZM}oHQ?w=FZBKj~XXxck)-5<)b*H?W zTVL?jLa+RWd-Dzsx$9OMf9A%)e9h9D#zi&tRmZ|~EY4C>4IE7~a;))4opc z|J^!Amw)S&_1oskhVi^gV4s-d-PYrMYGgTcJ%8*AD(NCS<;vZv`FlRZz42>WUI)+O zE2>Nfz5ZEm_bI39RygUy`ztl}y(<=O(%Z{Xk!q23h0b$gU3>eSlY7qN%^9QTdebpk zd|p)5(%4w$7{IVinKu65^4U((E_C^d#yTz&c9g%d8*_WFPI;|wnAKQitGA0m6ZGL} z1RMAA%H~SUsTEbV3veEmEL%{yq|NjcTt3c|p1Uy-S2*RcYQ3Ze zm3YqTQ$ErcELq%SJ-9b7HSW+C+vc^omLOziNxhjxE6{X0tFLZaR$hy%aY>ESFoDk0 zt)F{VMtAGU5;T)j>s%W@^VS1>lX1}Q_w2qjIW4g9$0oG#bKiCsf$`(cX<1*{xCmRB zFr+or30rexO%0~+4t6)$89g2gF7h=W+fdWQld-DC@r;3Ey8=7v-_>Eg*~7JcQ$tNv z-NL$>YI_E1VC#F~GG2C-i<&Tx>YB={R^o(OBg(}U zQ^)puDDoZt+{NbdMUH;iceDUvD=W4`6j$#kjipBrs4vXc(Pu98!-xgK&O{{kCPHD4 z=bh1NdhD18_f#5!*3YSRp)GxLj!VKS1sZ(PsYxX#SMK{AT|H(CmKzn*9$zv;P5T z_CEm4{s*Ah{{S@mAAn~618@ajwSi{;1JLY$0A3@$+5Z6gA<=IN&He}Q&He|V+5Z4c z;1dVSGy5NaX8!}w?0*2BpmekU0kqlw05tm_fM)*#(CmKzn*9$zv;P5T_CEm4{s*Ah z{{S@mAAn~61JLY$0Gj;|K(qe=X!bt<&He`J4j}$Hy9xpsYc$x6W!uy3! z311d&7JeZ#`yWuB+5f=$G4W0PLbLw?e6#-nX!bt<&He|V+5Z4E`yYU2{{ztMe*l{O z4?wg30ciF=0L}gfpxOTb{5_Tp)@$}Z0RJL79J740{{j5oqRsvX&9j1Av{$4O3^jK zqs4C#eXQ{N!ZU>D5YdjyL|-X1zS+UQUGz_c_Y%Q>SoCAUUyJ_-(Ju=(3%3egtl1og zurOa(DC{d7AS@-KzI{cH5l#?)n&?@=x#CxeUL;&1{tD6G6P_mgq3|-{mBQPEcL{$f zd_;(4-JEaUm3iL5HkczU6q*m8NG}%MPe{!V<{K)UEIdRwM`-R>kgF1H?pvVw(>(K^ zDEz+g4B`30i-lJTuNCrVeCGd!@G;?2!e@lf3ttt!DdbQ7%+KElh}0(~rU`R|`9i7# zFr7ad5GM#H3Hi~S{Mo`Igyq6o;SwQDH&Xss;fcaigl7sj2rm}$hc@QBUPx1lq|N;l z_zTgG3x6%7ngZqiEc{$(?z`Yec|QbZ2=jz-;U2;wAyphGzrXMx;Z)%qp}9{(j_MDT zKUR2x@MPf`!n1`J2`>{~E4)#7yYMGMs#380r-gqIzAQBNd!*B(9p$zP|01N?1^IE| z9>OBw0O26vaN)kf@xlXz=D7jo%@Tctuv|!$4%W9uxL$a=@I2u~!YhPy&&hm065c8_ z&mrL7Cz|RZlzUzHf$&4&UxoCFO}Pjb0%E!_PZ$>_gvG)E!a+iMW@i3{z>?b@B<-j z6tcX}gjAX#ohckBEE7`Qi|M0;gq8493h?c zk~Yt8Kq}^t-Y9%f_>k~P;U*!qb}0Xz@FU@;!hZ+@e4ay`Dm}z5!d}8YLhAQ0eU#8V z|AC$<8UQ6UyLX3jJct-xgClhv=97l%fn-0vb@s}_wpd> zT#fQ5=N(?!DPZ`^d&XBDhtX>vf9&@1u#7uV9^Vzc!%Mpm41alVpgi`I?ZZ$e%ew(_ z=Hc@kk0bEF=i(j8JDA3Br_hs|Uu0D)+si#DIgkGggg&}-^_i2K|3fv>;0l4E=M zJcnCU1Hc^l#a3m(qrLtTebd941i4Z$JAv<&$8l$!C@*=e#QZBuQmL`!cN@Rl-_gF8 zcOW-taM?(^a}Qhfa3t-$?_^)!;Jr(S@9Mt3p+}htx7*iu=54oa%Y5+E+RG+7AuK4Y?(ArLQ&rHZ&pMI8e&WPH1>+i)rGUvlLPnb0kd&v%-w5``zcksCfJpaH| z?`Hze#q@Mq05KCVA_U`o6>97ejX?)sz|%! z$R5szYfqS5>kcHRsv@}Q2S^LLS5~B765See=dF)yjRi9&hBsXGe!AOKySny?F3#_( zCO8)bMn=wdKD=UW+J&g0qdOvYRyH1jv(AcMxPReO?`GV7^+b-)@tf3J*bzlApxC5qCI3NCc?R~ZDnPbuCapwY? zBON(TtC+Vwd?7|Hc*M5Q;_2H$U61GzK8s@)xyZ%Xt@&gbb~o;Io1I6Gtu=EZ$Ba_f zwxe|KRyX}a&5EC_wX>q!&Whwntv4f8_`Vz3^|4}}!frOt*N@U8oJj@IOKzFaeL@<} zS;eM5Zo~IO^xSdNJG*1{tcYFE0lbj2#N!P*x*`Hj%(;=AMXL&Ls^Hw7y(xOhk!b&{ zZLx0d=vnWE64Tz>-<|f}xX`R^p}nTPH`YNsFdlP${JTMSJb0Y-Z$BNqB=~+tUUWm+ zB`4kP?pru9wjp|PUhNT1Ud7nkXVtp>roA^lIIAMCX#;p0Dms`wo#~g%TfgtyRTI2x zkE6Zjll^XSiqbZm@fKUN@#%Npc0rx;7G&4*T7CPOtrLGYar4{J%T9YccHxt6M=x42 z@y~BXFFj`BQE$z|B4^jZklPdMU*;Sv<`-cdneJP>7{zwZ3J3;6Vg5pfU83B_f?cBH z2!Sx4cSDy_U}WdH6c0pSL`rBe;=!qf1nd~)Q*dZH_`zwN%^Q6v`Y~CzVwn#vDm>fN z6E^Q0q38rqp{I}%D$bw6IG-g$d*ziQ9{v#-*=TU6G{2GY4^Ve#MBd4WWAnm2%*JQ> zaIem9gB1z!19fx=N^nCVbTP75Hro_>o{5bn9?L^&6q`ve1TQTVxh}X5%1@`U>&Ok6 z8H{sJW#q;@@|}$R@Qwb4?r14T|YU-cq4g$t2{{R~d% zcr+{Wqad?}TA6lh*B2q$AruLnLm4+#4{n(8P*=#tI+?M`VGjypgJL--KD#$WVr6-Z zqYgTWhz(Yaq3lP{%-G-z+kja1JVWMNGBf*hxV?-8aXE5(rk=?S_Gw=Q)6HYE3WuT51n;c7nTsC)y#tu$roTJVc zj@Xnml5`T0y@m84>FgMtL}c>=a%_g^bpa>iG^BKfwCOUOMDR`SEH`#!tcInV@jfb- zahBc%7%Pw1AqZu^!j@E~nUDQNv24?@1wA-e#z{mZ#DX*U4$q((A|d`L04EVk*|b1cmQY-oorRN&YgOqlCLf z_Q@n4?*0gx7br?(Kg*&X>CVkiFc_bG9tZdFtT-T0)GzzzC^Gg$+F(OkClRqZF)2}`#ARKjci`Qa1xO{oE5#P$wns;JlD)x zVE%C&3Qp%g@^N1Hq8?^ar)Mw-{X(&dK#ZdkZ(+IEOsdNz{sIRBn@P9giRsu( zYUx<~5>|}Oq?XQ%7f>EfB5eMg_)F{*Hj}=NM^kPl?Lm2LCbj9MaqfbRVKeDpP5RLI z!_1G(q&9s-yo#p^n@PM&PeCBx{Sq8bP@gDS-uc{SgqV-hHYJ4o-N7)cKWCx2n6Z5Dx}59LXx;T3 zMmUN12|82QjKVTwMQ-dGNW{%rg3Y8Pu$aWTS2l*tq;>>DaekYNVKb>_1Zrf*BOw-F zI2h$-$Hus^KeH(Q{1qGP=8|Ah1sq&#Cbe`VUdy7fnbh2pi!z-IM!tlwn%#L*Y;7Pq z9;YVWkww8t1n*`n>M~|MDUfT=V<^sFOk;2oL18+H;BNgGHk0x;K_?Nfvenp3YI`v$ z&R-m3*i72rls7%jU#w%;OnRGX>fCrG<*}L6UU0SXn^+$U+*W>S84jA1jWWneQYclO4xnbb0{ne;MBz)6IyFkNl9?bujVULRe5I4YRh@(>s=JfHlfw&1be9ifs{_H; z!RX3WCk7`GJh@%(;8EH~$_FPAD_Jo%lTI}xoJ5#aBNqAst?RK0|HAHY zG%4-GK;#0HvIqB3uSwvk$Z-;UeRmVLa5_2N`Moy{P9hdV%5`I}K`wBno5#n#@O9wD zzM$N>Zr-EdL_%amLU)?~l z1T6k!(!1eU#~p82yg&UGp?AXq$DLqU^sSbSQ2aJT-2)8oQP8W%<9N6eb2%I@Bg)0K zcm`VK9%vdj74;v4Pz;viPRiwJSPgnPd7IeagF5nzJqh}!`% zle@69WtgMylD7xt4(?zk1J3g&sJ}OKCEY28#ov2ZBlKR@((JfXJ8VSqJbW1I!>|b_ zp&!aZ2{_!D!Bete1#CbL_HrO)Jwo3eAZ|hACK4S%Jd4P$Nre0QEAY0&yH7D-l?i(|-hF*CAYt(0@GseTMKc0$S7$((@4s7+H5ga11`W^}P(-uK2Q4 zfYA3W5R(y^K;k5S%5o6LfxDb3bs%m>>&q5+Yk z5&E&Q{n_mwfw~Bx|4%>^<)JAE{eJ;s0V4Ae9A{59d&Eb z9Khz8W^F*0A0P~1vj(s^1K5lKtbQ-A5L5N8CvWn|Du%=JJ;yt^CZ>?!TVRiQGT z#c5wQ#R)8kXZ#3_E3F{E%JNHZzyu3a+my0usA2|cl=3A@TPWgTbR@7y1@IXpP%DBL zd7v(y$%#L>&Iv4zXEQp4`@aKA;#sV6$e&3pjc2nd&Y&@Dz!0``2Bwy6=g?F;_g2Z9 zSm&^Kwh=Pz9IkdYK@&DGBA#~`v%k!;NBUc{PpUPe)S4i>Ioh@c!^JB+61p4zov(FV zQ|x49?3WS5^&INt+slhZzK_F=%#jWdU?iG{g6wEae;Z)Um1rC)u z@(bL)nYPk`u<1jmq$JwR#>7>r=>p3tOx7le&T6H|F6yMnuKxVESF=Wz+g;nCO}S$- zIa)nJ=*NB;97D8J`S<9DLF$GjFJU6+ZqE{TOs2P$x^HGjH`g5-xnP_r6*E26b8V=` z)_+g>pgi%4cXcy%cegBWrn_-mcur()#^D)jBT=3T>?OL1HG+*ECIQ|0qL$s8_MH$^eak_XG`gWx)c5%_g4=&T5} zGSUM9gH7OV4cnCob4|@h5ULS^&iAlU9}(V)T;~Y3=vf3r32dAxkj>+1GXxvh#SFj^ z1a{Q$y=HOyGoF{Z9oqbNT}y#0zU!hq9P1FMG=;N5xB>xtk(*l?x!Drct&D86L~Sc0 z4_RVK>mLz$3jy6Ed}{c|gjyL1pf*@8z)L?O>6XZB{Tm_?)78TW#R#V9jEt~Etd)^N zERosD8@xSTNA*FYjq^6=D8fVpv)!7Jxt55vGE!lQ%+_}h;n1Of1YQGZQ>fJ&Ht^9@ zb0Ena-)4H?1o#e?@UNTdA&jg&98St04}56n!8Ww#;oSRDy|_+)Y66%mJasx}r%q?H z|8zF{PiJ#xD;3ZfuzSA25bG_`+{y^m&&(!!MmAakGYAoGL`TXJ-+Y*nnh!WZsri5z zl$sC6q~?QZF((Ftsh^QMEYaM`$geC>-O9)tmZ)uI33k~+c1Bpg5rT+0SS#yG zAY?iXnbrcqDyLT~Ib7OY^G*aJb#SfaV#>QO+ra7>XA@Wp<6ci0Z*$m=qFh$Z<4^>y z^bx1gX>z)?GG2>-vsDjRX_A_pgZ*Z|HuA?u8IRpCW_18IutsKx6$Sun8F4jpp2N zj|1k<#x;?$ZmlG2<7N=pI3wsgZyVS6&d+p0N|JY*fK%4W*HNxccnX+8{15?mYQiT7xbe8H2{f}50W}bYB7||SP!gk45LgnC zccg$*>boHw!4;>IIh%(Ox|m@_p<@x5Zux|n2w`Uh3uUwdfrS#eX5d~=Xf)9|g!2)C zPK(?6Q$%>}qX%P&zd*nvB7rMF7%DC()LRT#C?}V_97=Fn%=G;|==WOisYjecz1AR`*9=z31mQZFP#ZkswAUueWt`(Tcq&d_`COn!-jxm`umt-U-+iCB~B-uvae|M)ToTv;j z_T#hC&-y3ttKFPN%USM_-y@dztbZQ~^)feH{vNessR~n6uU1O@5TPq(4hv~hlqW<1 z-m+1YW$jRk_iKizifSd1j?l$v-mYw0Td!7=4wDmP~?^7P(?O&Be={A$3Yf@d;zcgKf`JFY^p?*G{Fp(Wb;k zgs(g$6yQ_LSD%u>n0^dVoq<*o!w|ac;B?!Q)T@>0qY%1cd&PD`;0f`0h#^@riOC3G zRWj4L{-NaUPl;FZTnI2kaZ5GRodg#TnUAIRab+HtIQ!@^&!%%7 zO-XQp^h6l<$(ZYttJw$y-cJFe5RCCPMh>xjFFQoQFb8Yk!Q6c3#vLlq$_N`3!8>}S zC}67Pd%HYBe}iMc5WKD3x4Y*s^Dy*SvSJrQ`@BC=7i5=WS5 zqO%B-5X@bbktvp+DmXciNHB%jp`MwNn8_3#0o?Ng=4ovmC{*-3I4T2LE|#n*%RzUIs)xdEYA?t{2ozyLGlzwWd`^5gJW&CV{~i;9|r!eCF4b zn=Fyy5$B`h@sZ8(@_4k@AdiNKIofw(zLyba+{@#8=4~%NHzhtdC7wL}A)bCdO1g|O zaPCwfa1s#hD9j_+=nTS%2$<_@S{bpUFoQL{gut9c->HnD2C|9mPAh)Cfi7^=)N3o) z?lGDL>nS+Zh2&im(*;LGvK@z~>OMSG-%%9O!9JVk@Crom-HO0qPAem8EkE^CG1JQm zG`Z~yg?*NvN2oVhW)K<>%-Ar(dowP67S##Cw+?tk@y%quk(xzVh+r-+Mvk-mR6|m| zW{c1ieh9LU>PHbyK|qfP45mkn++g|4WDa%0en>jkB+esTh!AvEt!ZV14`a9%c^>)L zg(%M*8-u7<63`UJhMb6i=NZE32&Nm1Tx0pE2exE4x*wH!CC92twY?KGTwZ#Que>U{8)_5?2jgVV;gGLo$5jLRZCi`Yn-Zm<~KAh zTl6h`Yhypj!1`tNH3MrZ7u3y%2^y9;e`#e^ZC(AprtGF;oBqi*FR5EFe^FJ{{I+c$ zQ8Kus%AArZOA=(joEJFZeyDrz5>Q3q2qY01T3{OS57P+z{E^ow&oeFt!(p_h zHVyw_;cY0*k#&F_woc)~NN}ke?hwqNZL*dGQp@s@DIbxs`L=2QpS|;ducAuB{+(Nr z5E4j2AOQkgdQBh@iWneLA|gnrq9QGYpaDV>stCb~SQaculZ)89vWksWENj;VD|Rdk z3KkGc5X<*GXP&ut5@0R+xx3%*bNC(p=RJMSoS8d!?&N)1pyCX;V8f^y1*7nh!x6kT z!m6KYJd+{)ia=XVM8{x8plxOV9^By9%p}zva@44CP6iKYXe*(D4%gtEj1@EOiu8BZ zlK#sUSV4AeC)a8cXxq~6K$)f(d#`KP@TCMA!+Bl3CV|G8f#ZUKdL0ADwG6Zia;i`p zvsK@ou0T`^a|C=*t;}xF?OfmNY|LP7-^%p$^!3=XlvsgA zzJwr#n#gX3p_6)n+RYHfN=1jJyX+3F0%l#cWECttuCST~YiFckSgny4DV2FxDUKdP zJ(0yQ*MX?kfu5M<4j4g49-R6x>jq*n13jArVp^h9i$J0&*NTVmp2b#%nb%j-#|<$( z{f>Ff;L@+Yj*1&MXoGt%n3^We4g`t&w!3Qk>bkoLMe0 zjJ3oH4)Hao*$)e;UZ7SwqL|di^thOj7N|?ddS>lmLRsfm6l!^dLV>!?ordDz(=Wz1 zz?@+H;P#J>8Ef&n6w|6phpY}=1M%%qv@_4;WG7?wcm~Ht`Q~y+ zk678h=NApZAxCR3rNd((u1~HjS9jBR__EdJsJ*o0WeZ)z_%0rWi$kpM&c&FOCPCkp z#lb*S6FgqAEclWeJ-HNqqa43y|E|Bng2Ix?^G6wvTqRSAY}Z`!TnG{6)=x zuc`mO4@10bf}0t~8K3c*77;xE|JRkF?P%^_J22#(hwF}H+6<}Fc8}dNN=E;y+6h!Vwq-(hd+N>S^n&j$z>za=|nm){Ehw+oeO|-On%w% z;Y40T%t3U!Ks=h$L%gA7pWR{abzCWhGvL@!?ht8Dp+88shr|4`$rbsq~*h&UfLzrW2rV)$bH zpK_B}iVq@tR{t=EiGP@z#L@x0P|*EiVPV0qa+`2Ga*Oz!XnZdr z-S}Dp4=SBMs?-ybjZYoqPmx_Fo-1A{-XLxkPr>tiwp%1ti06q{iuZ_*ivJMb7h`cQvYkd^ z2eG#}L_AeILtG#(6W55hiVuq~i0_JDh(C)7_>&R#-(2h}E)p*jpA}yhzZP@wiZ<&H z7bl5R#S(F`c)obCxI$bd-XuOKekgt=^4i4ylEfBbS8;%7d?TXVDYUUBP8W@jM2x+H zHaJf_n?(7gvM&)=D1Dvm4dM+-zgzab;)6BfF2-U+KeSj}XTyeX{IA@eHNUmOWowr1XnqUn*X%bmKD-<1{`K z!5fu+kILOAKBV-&%YIheA-*GiChijtk~oe(lbD;j*jLU=J&~{M(+-O5#dNWU*jpSR z9xvvJqs7z3$zl9G!xq?LbYn6V3c&E5Yd{}%`d`5ghd`)~){7~E_ zekmRhe-P=Ii1SfPj2DwgjH|KiW@0v8m81WR*+|QxCsj~UQG~4G(jwF9sCM!k$Jt*y~MRUIg z`#RbD+fe2|Dn2DXCvF$b{UFM{BYUUFzawRR$MM86fX&lZ=6OGW;C&2c|1J}4Aw8OMFlKr}(M3Pc%NxQU8$a zpGE$8G5hCtJ+iIn_zdkX+x!V8@^fSl6l?klJw@sCZ^HJbif4-a(`BZ=AigHPDee?M z7C#sFi{Fb>PG&pN2xM(BSxgn1i><{Bv8#BjX#R8)@xii(ist(R;wQ_VBo>I%MS3UV zI2@m#i)3FYUMyZIt`e^mZxAWi%XZB75b$By^z^~>XGF(G=qs|{5O<0ni*&TYdi%xi zMaO4oG{0{kt+tpfrizpqXMSsuerD{N_aWFbWtWSU z;(6if4#U-yiL4Iqz4w3+amJM;%R>%ej?H{3Ddt34~kxXZ$f&MSXZnkrinqZ zt=Lh_5{=Isw8KBaXL}>Wd~vGCKgVbOIU@Z-(7sGuDH>n;NZ%;?Mv;HI&+^;Ecf_6I zZgH>pop?x$=JzzzuPr8t4a6p5bFrP+N$e$Nivz^t#ZltPBHaqGKlA+(G`{;m^F0$> zq5P}F_2NeHF7dD8L*gUi)8g~utKtrkE)3XzcQHpCD4r+|7srX?#i`<%VwpHcTr8d| zE)&i7T=ctI_BG-S;w|Dm;(g*4ajR&)C!?JgWxp!!5b2ME`?p*CQl!HXrXLdNZiIFe zzxRT%Vxm}IY$~=8>5hcu(?$LXHSKJ1pg34G-`kNtO7^MZ1krqtNB)_z%f-3kBJmvY zQqg>`N4?duuMuw$ZxQbn?-d^w9~GYxjn)F%;~(;Ke_j*c6+aMT@ZE;_abi6&MQkdz z5RK*n%BRcD5_^gLMDtt$<%Y;UNgN|O&lx7kE)dTYXNpE^0qv}my-_q;3rN31w$WUG z{ebK(;uGT2;%lPOTtNAqvOgBT7OO<_Tmj|Ga|N)TzE`J+^aH~An;;s^1lXmr&G&uS zD`h_*ZV}%VKM;NVK8o_uVzQVj_7by2^SvA8&G&9_hSJN#%f*%A{i69Ejq>LEGibg) zgP$vZzxcE0)A!2OVtesKakyx{-=dug+2(sKZ1cSqG~Z{z+m!#j_z!WP__b*9dnC%6 z@3UZQ+2;Ez>>;vG5>FE+igd!l`g9>eUM;Q_>6eA+o5Y92N5t2~x5N*`e~Mp-Ux^3B zA4NKJVf(3KbFsCUDRvk8iv307Qxo+k$SxG8iF6CY_AA8;#fwEciDCY&;wEvk_&4z} z@fq<2@ip;Hai{pPNWU{||B&d#448lSn*VGidZDl zR}IToiWiC(is6r{6h34+3iP*bx7Qs)RUbe zHdT5{*=@xPrPH4d$2mwGD&~nNi>HZnxx?}m;#uNi@d9y~NQXQuf0uZ__^|l6_>}mf zxLtfpd{6wR_^G&G{6_pi^whKajS=I-mSS5mL+mQ{75j_y&1=YZQ@qkL-AAbbMag8d(ld^>j%U%F(|ebJBnFi zFR`CEK%|2rj%R{cC{7bg#R~CkafwK`MXbMGyg|H0+$3%m|0X^rJ|n&$((@79+bw<} zekC3fe-@+ggDT6%iun3s&Kq1-OgdnQugQkE{WZkLrlC^~%^ADqbHjE@?<95+v&3Fv zwwNOh6!XN zk8aFXvmEodwMF3Z{-ts}wl(_=a=~bGq9?$1+Gf^hWbpIV*_^yVNWj+$PmVI$_49Zp zA%VaBW2t)B9>+BX!Ks6&hv&+x&Q7}Wrn=%RcLDqfHe_SkoHp`dyZc=_80!mdvMBp= z`sFigrw*c?5GEkVh&Cs$47R(y4fv}V?k?NI*MM+)7a{J{LDcgo+MC3PHYe|V*zWf3 zMtjSV#`fY6obmBp1*Z<8o@VLD=MHFd@~(#MZZGF_dq3G8POWfzHzCeCT@bi+><&#e ze6~6p^B6XXPPu(JsX159=9GIB35+{iai7SsW*YZ{+rtR%@eRiKocY7YT6lafAdWR! z3YhI?wAa-!K&LO#wLCoUpj;4%4Umr82-6Sc;gid{TtXs(=lm_{x936|3?6B3F{@?m-r7u~(B zDrSRkdA;@2i>SQlp@W{ST?URWez_`P`KBt*-D8$|GCcdXFX@__dC+@StE&2?R`;9x z?|3x5k=6T~?Y=d)Y#LK}QR6qOJi%qqiMV}TQ z_|pC{k2cI*j+#l09@%fz*}pyNDrzU(w&@~ynCaQ8tn50yjLY}yQd1G zt$msviu>tt#60_om)uk3-D#!UDgK?lZ5J&~JQTNo#U$UF*!})GZ&vveHdT2mYweHm z-n=&|&U5)g2fe{9d-2Q9Yu3Pr_v0<1eHTjlHh*P_DH zm@U*v7*~~$hF)vMAg%EsZ{lF+M~s73#4%NMw%B$W>{QrsvQuFv!;Y1moVEjc5dKx( z)t>gAeIHalSmoKUqso)e2(3K>S|SGphR7RoYQecEU3jZW}h<4LdBmbMhfq}aL& zwG*vLwYQC5YNa1nOzXHw{%xz5o?DE%UC){1={$2=(%S6Y=vB~Y@LJiP{V|@ApZYV0 z@A;^k??7GO+D*gve2{4!sA~<_V-3i`+8p_*HGw6+xP6Y5Z|!Nw`NQw&%;|Aee!D56+NK=k+f>gZfn&O zyH`U6W^m=#yBg-=4B6#*v^g${_Vvwg^~Xgbjz1nfgzEzx&$u@zKeWU38!82K=j*!& z7hGS@)Bz|06$m)i^Z4#UJ5YfbYm%amMPVN=uTX)Q#w34$dIY|utUbKpLX#BT43;-0 zV1Dt5i7rPAehE$ZqfcPvQKz_PKzxX#fd3QxA4P##%eMfdf&>HyTOEj{rkv4L9y^^ipg2;UtT79=28 z)yH4YAOZ0@iq`Q5{Fkzf6@%LhPhG}+d>aiC5S*xlI!K@d1b=yr?}CbufH1$ph9w~E z9{utB%>@z=wiy#&Y0PBXjEfJUJ|rM)(~*EkL?Rr@W1?%h7u5) z*>`|_A5+V2z!Tqx?e&)FkEcf>NI*E9-^s$+GUMVu;tutZnGk;uht^kSa(n~U?I$xe zz5(mz$V`iWfOU_P8T2HjVOER;gdgSN`GW`~AQ(5ZjuArwf~F4+!{ZB>eUjNR*xva2 zXpfM6p4St5KKf2ZX|v0afM|xH83~9^@4C;?Gqa%1An zz@{|iWElyFfS(P=&cS~S>LK7?2m=xj^qNcwh+ARC=Wr+IBr?v9rgNBcosMvLxatzF zM$43dfGbW%0zwre0il6O0>U{KT=9^A7+^*n7k@6hdPrti0%DQrIU#-$3vbaXPL1dK zhXe#?2@(+TH!}C{O&-V4ApsFzi^uWlCZ8L#Rs07W^>gt_03;yd528s(K%^TpECFG6 z6qbOncOWbQVUIaGzKTt~lGx4E&52(^^VP%w#tch9*i8+L|Cz&hOJg1yzl|&N?bt8O z{^rH6VD5WK{Q+nb#8dGF5)kvv9*v8?hI{mJ9iG9EfQY|?9sN^_jS>(X5UbWV|8XAb zU&#NMj^i>6S#_D!fWN@m5)ho7lm%=T5)k$d$xA;ZAZ{?b;7{4ld`Ljpc1#L?Frx&7 zZO5eqIeCzPu1O!hdBLT6U9Y6wt=ZKMjcz_9zfZ$I* zMgoGrkx~L;5_ZiT`z8)t{@-oXog<@Vp%5*!UcIh|>rOh`X^fsr1ipBp^a4 zkz%eTkbt0pb3CONaw!2}&!9i$0QVmf5LyxFkvksnv-woMZ*3$X_OPkH<3CD3&|p(} zJUEbmu1?t0YR_*lz_00qd#RCcL)*? zEKCWAXL$@D0l|+6NM4oX1SdoeiWdA0`$h-K)}+cM8qY=8vBZDy$BQs}sg5)k$Y zSDX^d@{oYA?b4JEs7DD1+n$&54f}%x#7XF%SM(Ho2{RH96HEdmAa3S}ApyY=_$UE! zJ4-+Uf=w6+2s%)s1caRc35Xs{fCPk{011c+?gb;yH6fUpxF0r4VBKmx+< zuS6!k6eN0bzcW#o?oJ2PGiPkFhQ1d184{ zq+yzB;)z{_J>rQZ+m?WM4+)KV)u99g4{qZfoGVB`uvfePFPuuLo~YMR#0vPClxFcV zU{*I4*!M^Y_<5q^FH@M#eMCwt!~^~${2$9T*c%Zu07y0Dat|N@!7CpmAl9>ENI>u{ z7C7MX`+IVA#Q4imt?64hJ^_5Mz>O3nATCEM&G>f7;@|{KsUrdL7%O<1P-ue^5Jf0u zS<%L^$1)l{jmdsmr$@Mj*7xWFNyCvAwS7=QE~JkIFhJfs?|&@Zp>1tvayoaI!mY(HEoN4w5~`?W*UE)nL#o z62_W3TTzFvN>{715m_4$+L^Jbj;Bo($~Ho>UG_vPh5Nzxlka1qDXYY9k?=8sr~RZv zOdcZGb8ObhzT1)9;bElm1>;K*I@}54uZY}5<60PRBk~H3E8RK#p|2s8Az(xg0HYC+TE;YAA-hUPp&&vdgbs`h zM>v5-J^UBW;jf%a5YA%GLA10Pky~ke1|wYOeHbzPQjE~yRT#O5 zF3&=}a)cvx=`>=xd=RDXK`>o@hsc)*>N0aTcL67x*F0gyi4mw|ul$*{!?(!mjEBVO z2pyMWfL#)hj5C*&hMGz{VOl+`K%~M6D11CCFiRD1edkrZ+Z9-r-Y2PdF$pbX4d+Gr z?2xjB|}zHt!s-O{rrFnQ^YuIE^mHH7VvpA}fJyuXm3o6dBF68ciMU=0iSsIKARkEna# zRS;XpBg)b7h_0^V5mQ~qqn0EtYTGIwv5t;MZAZr=uDXs#yt_Q#2diW2c+|CJME;cX z_~Ya}DAqysk+yD~3~7S2bEo0LeMISx4le1Bj<)niCztd`dUZh$c7+$HDfQ9Wk^bmn zOMhfmZ$4lvi*!9K6{o@Bnjl%#H9@*p*97TNT@wVS1Rgaa(8V~(&ql;sksEN@LF?lg z6S83pM*0Q<1mncMxBk1;_$myH4O}<*y+fpT|Lbt zI!(Z9G@_VbL&o8Lu{6ZUM%$<64qa^eeA|E0^=Y;s)PWKzh z1^%&)&oeJ3#7H~ahzs%VU=afMm}Gz(^3o6^m)k}~h>`WSQ4nI}R@*2JF=C!|dS;h| zUWUQXPAq2P69k{9)E{ExTib{UF@j{~#D#80gom8nJBJ>%dEB2fWiVgP0%ngcz|`?wm5$%AHf;TDf!PxK{3{$jXIF=g7(}hb9Wzl8Q)FXbYy3hYTGO zT%_1tZ^$`Zt}7F=%=UX0-(f2l?!c=ZKwea_N{B!1+KQV+E-(9kbA_c_a@=fT*Ko>> zCiw`LpJD)AkmK~87aENSKR=L86r1QMf8R`@%3Rl>d2oz zKA+bJ18{uk8O1$8guw`w=M-W*g3p6RLn)13IF9`M=1I8$g&8M#W*UhM=M-gzb5&ye zB@}oW0gVznO?foR2#-6F(XL`whR%3MrgD^V7nym9Ownyxp6=rT;B9gjaej~Lcl?>%*FF-lRk#v zvtl}7bz6Jnf&F%W{CI9ZX__)M#ZDKx@K#N1(Hl{R*j z3bw{L3*)RJ)SAh1D&mJ^0!eisNM{dqOVhHoto-<99CxXeTVr>kT;BKR2F-zL@ z`TtO)axqo+QV)9}63;Oiqb>ukw4>_)t}EC5ioI{{|JmL=1Y8w7QS6Qe+e0m4kvp#v z#xjIj_DW`Pn(PzBiRIOEFNe7*oD{y&Zkw}3SYJxE<;-RBW*vH2a5Pb{SX-8R< zTlL~R9!`12oeJ*bRJ{gPhEoAir#zx|^W1H0d=`KhM>U0}XB5E;1r8y>V2&~)_P|H{ zLc8G>SsY3q{HsB81H_$mY-d1@jUr~Nxf6Mj&hnf(IQT~^J~~o-bfkFr@E@)O!Yp2u zxd=#m7RC~GbONyu0pC*>hZwPEVFG*FjKG?t>rlRCt zw8$=uM90pCk11{(?j!^pDT2eo2W1||VpktQa9B)^j3vARSeI?_?zI2`w_F4RZn+kP z7_o1Y#_`ka3j`EF1!pt0?OSmB4tOk4ihyqbL<_T&IcX?^2C@0g|NQS;lyx><)p(i8Mc~DVt7Hm-b45bbY|g@G9+wX9 zZSF>JR-d!SNg21^y!n&m{~Ude?}xFvwKE9 z&Uxed^gk++@|XvX{ObiQ=m{kB4OpG{KLk>sevs52qABw!H`2ViMhXN9Y_XKi&`qfy zkRr-s84w{jq9V$$U!jPSc@#yI4N^qe8CFEO26`m6BnpR?Swj-#Z8HiZi9&S~>LLt- zwt%gOLRF35BZ-nh9SWBu%6EB`L_w>Nqo5{AYeqYwRO`$@GRt;0Ny*eiIdaq}P(VTf znkez-RMSMU+X}R9X}4qw8hM9Ib#sKQmdpy;6H9Lh%mY&JorSw$LxofK%Tw&>+*;CmK6C z>f9PUpLH=C_1fS#C9vi&l`uKjeWg%SWEcy(lFU%iO(5zxN2;VJv?HKU(lJoG36inL zG03kWRq}`P ztor*FS#~o~85yWpqyAQR{fAWlDR=!x7nuQ^Y57_#=eULjQc$OER4|ZY4sCle)fZ zMp{rgit#-FeUrqN8EE)HD4f)7>HQZ9C;7#b%RCcj&X`y@Z(7B~$z@aFynSwd#mwnb zAeaSp0BBfb^@1n%X;WuRE-^9{)dVblgUm?{$J-I1jLhzTN}$Z{Q&c*qdwM};k6`-r zqLP`DE7IW(z7Gyg0TL#cBGAP(~D-z zOfRn}o0gA?CDSICPn$6niAA$#Kwo6$jP&wC!*Zlie!*=Qm8R#Ad3W3i<|rXN`d1p*0~Jy@d*@)BGtWrgLlODg`$q9=GAX*L#b;q=0? zsf9E0=X;FwNm%maKPYx$YXy#)IlC;suygLTl8VAI9GqMonexsx&I?RG?$&JOnF2^_ z@YI{g?rmfx4#q+-_j&c+ol<~2v3ZkH#{DJ(0;at&V( z%tEY~KJloED5azF%b>S1@wk!4LvDx4HPcc3H;AJA8YPqwxI(d`UoD4X)ORN0NY3jz zaoS{z>wj4XW#YtU6Qa?e~GG#rgzQbTd3i8@0Q^XF7h z*C^bo{aItwjEuSzSH7bfW3+QHW1fjq3oCGmDx3&$Ea=k|6db15z(NztjbhSNbCNrn zUC!$H4=AX(hi(hrn6VelFmjSSX%`fF3TDopQi6*RuBu$fGt7`@&zN0aSYR%eo{5;6 z(!%^{MbnT1O-jn1Oq)>zNwA`l$y3X*u&0$z%%3;eQ(afZRF)W%Qw{C^E47sWmNbg- z74b7R%i~>GCobO8$@QRt&l!%QjWXEx;-A_moGPF3juDwOpYclJwv!@;DUY{>U7OF7 zZ1hX;_1`=XJEAs<`N(N?xHbyTv?$c`#@IeT=u4cflX$z@upx=}s#}wIRLA4X{BB|| zkRL?L1%sATN-SMbB;EjF_OoLd~Qg4v3QBNR=h{#gJzcdPOOi|t+ZQ- z-NgRl2yv3QPP|QgR@@=(7QYn(c$e zi^iub>K%)B?OA__c$zpxbTm>H$gUJG5HAt05I2g(S1Q{5NcI8Ihieo2Gd@qjma@Bv z1I3ZzsU+6I1aS(9eV8rI7Z;Ie?;_ckipG~I(yx(yt!R9iBHj2fMSJ%t{UH+Rf0zBN z_>$6%4^xzXSLq)r{d3v-#c!2v;Tp{G2E=4BRctGE6nl$(#Q`M7bCT?l;>k*%BD+XD zQ|WVLFAx_ieVOdb#4D7(UiL=uCZ%tZy;*!%=}*aiPW*?`-;({F_>t1Tko}d&ed4@C zi4DX?VlxtR*p5WVQo8ZQih6yNeuC16iK9r=8?XFgrI(1alzz7CCE|r7>Md9PI;C$A zjW!D6_sG6aG(KHX?@8JS+m!yQXf#m}-%T6k_K^rRHBbU|?DRwu`&VBy+9z25#s@6w z*VH`euX4Gf@d=Ciqhya4CyCR<>Eax5fq1TXp?C?2ey@_fTIAm+a-27c_mCK;(M&=4 zrXn7n98AUr&--l)hDbR(w%>mqfV_#6SXU^ixZ0 zK_b76*jee_#B4D~%p*~LEQ$RqQF^I3Tj}SMD0i{!Ym|SjXnfY9{)4o!K8;UWaHs6g z#c14cGCx^tE@p_i;wW*lSSl_RuM+PPjZav#Yka?gpD6u1(U03|_REd?f!h&7Tuuxz zJi}Dc{Qit`t!1|tGsW&=p2**s*)CteB`1nS;u&I@I7j50!Ysc;Ju`2Ih+M>O}}u)mXiNc8jm80j&hacTs+zHGku$b56(4tA7n z?%!eeklkAxARaIB?PAs+EuJn;7Wp0p^Jj>2#k0io#HHd2@hWk>xKX@CyhGe9J|sRN zI+`~0cf4Yr zt~gvACDOMB^CyZ$;u&JOI9D{^XHfoJ*>rEf`sRBLc%5uV!-lR7nE!DMnhnl^Q1r;2H!qiNG#wxem& zLpD8Da6bl!j;2kX>{GYt3Co%9>EK^w z-!E6q-Rw}hqj~dB*`JF0#c#wPMT_6R(O-;6AG@^ciw#A3NMU++(b2fck?m;Q zoG5#wI98-L71p06&J!1k=ZY7Kmx-5)^t{6QMr#$UscrMJ@?RG}6nBYViQkGpiWcr! z*=~#&C)N{F#Fk=PF+(&OuBdNZQGxxH{_kqzT&;H2iW|in#XCetBj*9xjz-QCvY!@T z5?>bI6yFu;v4-=|Lp)9#Bn}nx#8br6#bU8UEEgT^8ly>z_Rm%NGVwC;-_@>pM(r3+ zJLu;X*>8wD#gE1P;y2=tqJ{4coQGOsyqGMeip@mx+y~`5$?hWd6ps~iMMu-dJQqT} zu}ZI|nTzydrI(22IT6y$b0Y8@rC%VL=R`+UeVoj}`Pn2%7bJ5-b+24sj ziTti-){_VaA;zw$%|owGEZ0puR_rGpFPDnuEKvF)kq)3(ewk=Ab75a4 zn?9tNf1616QMAqTAkaJy0?qRv@NMP4FVdeB%O4c!N{Y78zy+JiZXr4vK%{EJ9;XDolOxJBG5J}o{kzAU~jzAt_x?h(HbzZJh1>Gp^H z1;ltUQKZK;=64dii9N*u;_>21;z*HB+E{<4I7eI{o+Dl$UMj8-SBuw(^xnqy9uOZD zpAcUVw~3A>(c7}=(~b43#Ggf9vYj3)))7<0#$pSxjYzj}Z0|U6usBp4Bc38o5(`AS zhGYH3;sxR|afNu5=x7pclud_mtnX+LJt^DKAlfebHSryBr$`@jtnX+LdGW#mZAXKs zuIzeZBeAJSpK~nVP3%qL{Gn?(rVkTGD;-~7O+GG9CLb`wV-iDrjWNXShM`jq!!&ly z=g94p-bw5tW{Kv#3XCILc8)ku94rnM$BF#ACysxTSRj^)72-T`p;#%NCoUJS6jzDs z#GA$2#k<9O#jWC#;xpn4;x_SBai{pP_=)(LSS9`-)_hJ)KL_0JI59y?7E{GEv7N|2 zerLU2dfu7L_HnO~>hzOQK7V?}3<4ghnk`Fo;FRlx1jc#pabvkErxN0RCSp4Q!Kp*L6Ea%kbHdr2 zyg^97*KALYGLrivg6~&2#rc@iw8wFcL2&9I>KV}h&#hejI(buTlsgSCOHF2D+MIIv zu&ebu44>0zlSSDd_k)~+;M76Xvn9jh2{NM1$t#2HZZ8`hBp{9L;p=m_y^9cc>LBWQ z2kp^QinBS<^O4|gZz$U1`%P>w4#628-_3IBAnHl(;_*C-Yo@a~c~>LB-CkOuy?<;E zr&hSVn-FImG-I}Rd&2ufjrN$o3Bg_N?S8*b3u<&u-*A8K#Z-g3yUkMH@^`C7 zZ>_wju=v%ggbkAhu005!ZYv9xZrSgt>)E$|iM2PbPU1o9%#1Ns)&^)BwQ6+Ppl`SP zR^Pa3XyuK2vRGdHh%Hey~`K>E=<)-CEudjd5sp23%6gNTWihu+~}2dyDwKZGb_Wt)5?mjvi3fLmC-EMURl(L!k({!pxM4h zDm~B+OJ3Ei$?!dw)$#04i1O{N6PI$(e~G{6*ed_{v7h?=2|ZHr195Iu5b4pEjD=zp z?18yZkxDrj1w|>#pIeoRcpz@epoBwKUM}>c-rasDl)sW!S?kINdiMI0z3V+0bGBV^ z(35BN4Hn0&tdAChlj4zLvMDpHAT#aCK(4@z_} zDpJsuiuMgC4PXpVkuv$`me!7_NG^<%=jE%h(v$Leqx+(O z_e>VH^`w0Mz?CfZSJtrgqEy1XyC*|FRHXS{wGmv|@o)le4IeJo$ zqs6eER5q#(La#DaTZ`G4J1}%p5q%zs}QT3#F)9%ufx|M|^ zdQvSomWZCzJ2WGDQgp@U(v#x*2rfM-{ygs1lS;u3Mf9Xv;;6dxq~>!DTzXPtneEb( zx{3C`(vzBip+)qh%zQ`mq(*RL5k09dIFg8-lo{Bs*OS`Dp*ng}e0RX5CpD47bn8iR z)g}A|hwyjkNfmII5k09p+0{|?q)ubuh@R8|nh`yzD`-aaq^KX_(vy0HqmJlFC9tF4 zsVB9EO-1yiC`@v6J*f_y$%vlRGhFErJ*h1mWJFJ@FAGQXq?U1yB6?C3`}uu(Qaw@A zr6)C;?Yi`&ayS_-J*oGY@6wZclO4PCr07`0ttZ8of!umh7qGlbPpUC(m!4D#`*Z0@ z-Ami0C&e$}Zapc!9Oc%NqQermp42SXcj-wba2j2DQrFOS=}Fb5?b4Itc~wnM>P2?o z)|0xI32r^9DmLNPle&>@{CD-Fcpkd-q-c-A)SFKOe2#45G&*`xZ(s)^dQ#?E;?k4K z=kB@mq+&V4N7Iv{wqit2if=x+^`y>XRhORB^KAOp=}FCJQ!YIz4{ev8)H&QCm!8zu zJO(a3spHwTOHYb&HEunrZd~UsJt?}2bL&aPv%E`Bsx`~I^rV8^6}O&LFBZ7en-JEM zdW0q1dQyBpvzngNBka?yCpCo$Zat|G_rk3wbsI2Tf@6(gwRVS<` z<>O2oRZr>}6#awrq>RW|SWgOWIH@Ov`>{fF+4NnEDq!*6F{~%WH?tN8sY~kUNj-=P z(35%uNiIF95vcDy-%1Lhpsgp>4UPQ@J*iqrEPg+j4(lWt0S~IDU4wyo>pJD*QodmK2`)XU*Rf8#iH@FB6EyGWNo8~Iuvs_bIfl`b zYQxx2B;_KsJP%DLLaP?&T6$8~z&@90e7#h9Qhc*!7(%P@?8DZR`VjW*OpD`0*?LlA z@raCXO+Y7#a#DXqHeW8-kEB*(*<4;7N|Eso7x>2vw#3vZlQsZ9?(zp|TViTdJ(lAS z(PQnjZXRn?D$}OJ<`2>+mxZ(@Ogjg5B|@7#?AoR1u0@hd)ubZOnlx zaT5}5MewxY)BFd+b-LSizD3s82<=QAC3@OyMcIFb%l5F#*2e1MpBUI>m1s*`@h?v7 zvGlad22rkQxU3T4H4+PHP`K=gRs)Xv7?k6mCfMUvVg(YWAb8r3#iKDEOB{M^);QlA zXrRMANUe*&--tV0kN+|esA<%Jzt*0HFoMQ1{1?tS8^#R?A?B3fznuv0&?v-z6nXjy z?8t69J%U&pqy!N@2!DCQ^l;#nI0XE|R_o4y4`v33ox$N|aF`h!o*7mg zp4|EoGB~UZ4kv@d$YA%KokmR8Ls6!micjJeYF zJ&$n2E}ce9mx*|iUJJo=IUJGW5!7WSe`Ys#m!3~B0_zy4NF78{htKfeg(!DELPutG ziNZ0!7BDJOUHKD&w|y$qnYiS-U4*m9+aWcU7q={^NOep#DpK93RqXAQYE-1U@v7%d zw{xwwrzT^48{s zvAa=`>h1j%DpJ*@qkNK%!s-5}id5hj_^89HK$5(Y*+`06G8;<)3+4$ZoL1jz8^>Br z+!9Rv;h!HmL9X7lk5&C2voS*#wA)w z*8iU>QdsbZ>qT`7V7~0><9uhqjER`te?cz__b50)&u&G&g%b>VQQJ)9J)UjIAbFQ( zGEk_-hRc`-{(*@$COVq1E5JEE;)iWrks_bge0XAuKQYEXX+Z|T29B-@?A^ zQ4-?c*(D&r6Ee{b!3eA{l4Bb&M)qi|ZN!B(AhHF4drUIG1#xMJkr!;EBE$&)h7CCd zAx7u`14eO(k$tvNV#F5sr)k(@q78!CV@7(|MofqiKKDgVT*z6A?A|%_sLkWflfl$x zgzJ%IoYlv8&CRSLNKKJk8z_VSt8aXw`L6Io_sA`5GbQxk3g8Rg;%Z)~R( z0^~}FF6IE7Wf@(TDW?4igzeB7F1#7x9~)8>2*cxUBkJruR8%ap*14O;aLzasa(3CI zI|G0U21kTVOP!Wd>~u5Q!_v?%whIuhN5J_;+=>9l(PtZlDSKhhn(tcJ5Te?OBKE?b zb(U*kkBBVnS(Z_lvKKZaml)wsHfY%ATG$H~8e^-;S#WlU5qn`TnD1KH3l_K*_JXrq z3;Wc_!iHi>WMM<+D+d!i7y();zVO1vK1SB{+=XUcKW+-mJv+pRy{_lZcdhHW3ta1Z z?pdyNJu0%U%PpfUVXtebQZbT^;PaIGLO&ql$HC;K4v0g*L|7r`U?LqeYBu|j*zY|3 z)}@JNYiwMY*CXiA{ztC7;nO3$+^U@`7!5~Ni6ec4&nR9B>`xiSu0%i~f&m%`3qy>o zv(q;Mn@!YsoPP#UNLpDTMqalKZ-|i{w&61$E#@@CM;FO63>^^sM6r8jjNdtsLGa|m z$GLM3;yQA~Pd%SbLhPF@Z)MAG4S@*-I--C%o&|oRkTd~n4W8@?UK-%+exbQ6*vEWa z!S))-1dilorZHoxTWBc&1hXn{itcU^KA|0T<|qGyT(e zQ)FL;&0^r#(Jb*90(H1bF;k551V&aWrl%2tGZ@D0=^BA?n9XQqA%>Adg)t4YR#VBu6DE+}_77rkx%Dszu0nSE%=mC*~z)nzw zQA#4P3dvgz%2sRux#msvHkjrtGu2}WUPIL*qr4)pIyoA_RCxfAhfKzbJn}gNoVdgb z2mxrCp?5}k5ny#5OWs_tcjqR5XTKnMTik91;8i>F(RYb80XkIB_Uqiu1Dad8@L^TO_AJBTXV`E zVw`(t+cDuiwe2`_#nbJNJzD&a(V2~ceEjFOcqq3bBzqPtywV!nYH*ub9{%5SerZ$- z^ZCr1Pvp)!JeN5yAk?dwTZYq!8T@EJyy_%0%#ZOP0&+do8}=aASysrks^|KVn}d4% zphvE^dTtDIxw!bjp6r=heTU|7hnU0LS>#sVA(P9TZ3y*h=JLA04BjmqUX?qPjAPOY zAsMnz)dp3;9dZ^ra;xu91$T&xJ=?BZeTOQzLpoeo+J|pkbiFXi5KJS6VtBZ0@dG9Y z?I9ZZTrt-H{o>x4La2+m<>eT!3C31o>Vw>h$|6L zauQ2A%|nh3sWnDtKc1{Hy1YA53S1vCIFNc$2xZ^ZAGS>hdwJz7R@L4|B zkbT!OK62|Z-q{s*30_T|B8vI1t|T z;A1XQK0HP2m?i8<933gadl$3W3RB|{zW@QPe1;=qpNr$uFah>GMYzH0#W~YXdB&Xz z?jumW29CK?0a2$sqV{O`!NOtKI$Rvp88khkhzb)OO)y~kp`?U}J@C=L(5}(pa`w~F z*>dVQwlg5dM(bv)xf6L#MI1e+j_W|yEIuYud`zTx_^28kF5I+xATVIzrpLZ_HZD?e zgh_iA#uIjQ0&yOK(cxmmo`nhQ=?fl0)HK8~#8G9hO%a$();O$Kc~&&maAd|0yQO8r zy7!FiLik=21HeU|8;3gu0S`+E4huI6LpheO5Rgo8g)uoYmhcK-UAD!W9rCzd1NwvM0|Sfhr=$jx?o&DxPW`%%2XzYGDNR|JF4Gk0-_k-P2maBb}bYp*d` z;|aQbG77eg@OA=+HuBjRK1O%oL=%+j6(ZJod#jhIt6?Hl6mI_Ln1{^W-*!d^S$S;{)Q0U3; zJ-)PT=G3yuze~9af1;K?W9E#)^g@VGjGtz=Iez-&{Niad{+PDQ=a>JRWB#8}+v@q> z7u%{kG?3IiVEN_-1I-3P80M%#TZw@>ZK%anE2=reHb+!?TU545vW0CRPt(}9C65w7NxmmL8)YMi;yehgD_d@hN;+Y!o2>dM z*Tnaz8ALU?t$x(H38FR2x5Ts-9pyWxOSY}96x|?@8s(c#C7jwBfjHl6DlcVHsVf3!9cvP$8t<&ZQn;3%Wc)H-yuY0bhm!Uvw}sO z(0Z81#34fh4LZYuTpO%FgQ-W3*Y?dF5{UId%FL8D3!@xbT)x;~SdGiog2|t66uInF z$a}?R1{$2meksjm@-%{sKm)Vb%rWa0=m1$VXmg>4OO>l{Akk#EqE6L=i@E-4`&M_Z zpw`##mLS7wduoIgL?h^_9`wHw`*-LaNbU?1(*YCOTrMk+d}25URp&xKj1yu?7zMU+ zD>%;A$Ov_r>O8hFMyU(`n_@tkqf8xk7whg#;AjV#!$P; zKmnicTyHR+gBhgt>0VneTfytju*q=W5Da=7M!(Wv-+2 zMES3}zDKZLe9tZl^4Rb31b?+U*MCHqOKLSe=VckOn(0#<;jhBU1x9qJq;Q5bhX(W> zKc*ZSJ>&CBCPS5~OXm2ZnPq2o8$V#!s1rs_>~3@Xz)^YQ^U7wP0nMrM@y8Ds0BMp6 zXrVx&q^NXeIi*mFW-!`V>f0Dc1X$8|}Osnve;cPr%MnT~`qlZ*oHVMt)45K{T)XCGQPc~|O zh}oh}MhuH5Sm`KR&~FM(4fJ1DSXeTx9H-NCsI{S|F+*q0mS$k`RiDD^Z_Th#OlpYDICxYuvd_4-rD3o?*}1;Ls^ zUWaRT{nrJ$X7#i`Xa3aVihSPjsY4vX(e$|ZB;tsAT>b0h`9A&M)#Iwq9Sd)+$52S~ z)%Z=yhliW)&1XETL{fa7*oc7`{;0Z!U8jbPx71ym&y(b`SU<6boowDU;bR@n_Yw8D z_yKnWIj)|l6NT_w^td{(Jl@jnCH52fbdKpKihOQL+dOOrOJvUy7mIva$8wj7^!Y-2 zgLu36fcT{NviOGhsraSHzbt1vf9i4B^N@$9gq#oKzaG3q_MduO_Pq4LiNN_8CK|uy zu&2vjB>t(#WzW-}dR&+X`~}~&_(KKqPdzSs9{y-OuFvuD$@%7=JCfg$I8QAE+5xe? z*idXQri(^@3+0cKJwhBKo=W1_=936Bm0m8+Q~G(bmx`B>sCTvUuT#45vyA?3SNcOL z_k`?!sN5^!4yErR(cYJ`4=Mj=(U02)j?eg8M!Cka+mh(7qu531*|KxQAtYY2$sOSYr4wMh1b;>F^X;wtf4@doiuag*riZEcnPr1+v}{4--e-l2_gen?`R zUn$@CYev4Kv*p8|Lvp_zovj4fj?PvS*^bUu2icC!R!`YE;y`hjI6^#CoFL|t7*~nx zQgOa`ws?WKOmzG@ucnRt`z$d*W`T?-lt6wA|k+F$TAfY$s0aLLxs)9H#UU z;;BlXAWjv}6we~jp7GO+{kuZxSBvXNq#OUtSci|$245FH5`Pq9ar?^r6tR_Mu1UL= zX#Nlsc8cuAqIu;N>5dLp7o}&3d;yv5kMQk$8@Hu}JquEWb)zC*B}BI$QLy!g8C%M@2_xi?3@kpKoT8Z;J1V{Ocs9eX<~s`EdIOtS~sYjTf|M`X7RV`YkjPGpNPLzU#kJXC!%g6v8C8n z>>_4~$BO;L!QxPHjChJTMJy7{_fzyozk%#`foQ(3!lr{0rmq$^h}Vm^iFb*c#fLv_(i4qgUWU;Z> zOl%`|5W9*!M0%lNd#8&9VzKDxZq1hM=x$ZYzDT@Oyi!~xhQ#Z{Tg5xYn)+OiEBz^v z9&tFnkHl}pgCZRxGv6;7J#g4{Wj7ETiS(w!^2dld;y`hzm?w@C$BPAGu{cvK7wMUY z?O!YYlHS%cD))l8Lwra4NZc)cA$}zu6n_-`cwEf>W5l{*J+YbCQtTjRh`q(WVoklS zLZwd=XN&X2CF1$wrQ!;4mAFp)P~0Wf)YqcFb8~#f+G1VN(bYs6<{8Bt19uj{RWB9xS?Zt`p#1yfq*g|YCri=6*#rmg;Q^X>1rdTd66f4D= z`dTZMzDB%Oyg|G}bac4>Ci^k*MRB`WQ*X=B%}T^~J&wDh=;&q{{dA-cQ+knjhG?G8 zAm2Qn0XHiBMzN;e)q6_+P&7K{s7FWg?7xxd=vwuZeXKY}JVh)Q=ZY&tqeqVRjJ`Pd z52e2@z9kx+apW7Faqu&x?-Rchjovu&y?hP;Mv3uaqL?bCi7iD(zbZp^SCKBm*xvD? zqgypzHeH1=f0jr$VYJP24v>z)Xs;FN6O8s|@p17fal81M_>Qwa-h%bxg z`3UOO)T7#`{I5m&8RK~BiH*djA{~q|zq{B+JWixHGUhw_Q|5UJ>@$>JF3uIra~9;E zBl{xpQqeqjLH;eW&GQ%7n`J*CJ}uJC8TiM3^6tPI0DVB>1#6==~?XkVp;s)`0@iy@; z@d0s*NPl~*|AzRU_@Vfz___G4_`OIke5_wzOcR4*dof+i5_^es+{gN(#8bry;#BcW zu}qvJ(wQIYUo2iu;{3taUqf8JO+H|V$1jHX+GF^C*!vQ|DypmhnKy4u-g{)_h1CZM zn`}wgBBBHck$qRGQXW}eNFWYTbAJ)LN)o{oJb7T~Sb5 zsnq)a{q8;U-UNuEtzY&3F);bvbMLw5?sw+RoH+-#I|^++46~x6f_Z}d1qTV{3l0}7 z5*#B~ELb8qOK_gxe8B~Riv%kL8wFbgR|>8XTqk&n;OT;A3tlXEncx+IKNq}K@J7L{ zg0~3XC-{)yV}ef#ZWDY)@OiUyI_C8 zL4q^}OgUMUk9)BkyPSX7kJqRlx*IQ}8~Os>q}BvL`O_lW2f9ujz3`WOc;u>%;es|W zjYmJ6ew<&&HwZj?m+Sm0&W&^)lW^LyNjD;)8?MXtVW*WK0zc1Rh-@Dj~ zlr|XUv0n3V+IbLEd&8%8BOPf~jxhPwc7a`3>>u`F%P2>Lv)q+4P)G2wT$X2-+lsKA z2SKA}zF|Zeki$+}2HGj_ol0C!5J!1vPD0-42-|rOG>(Kknp&_AJ9r8robq-<-m6HY zydX}yewQF@=Rwd|UI2f=*emVBPP+&ZPI=Fxqu5T$!_rE~yBcBULABJ;a2PDI?In-t zH{*2j#m4R5kJmlIr-b3p^WZDC2_W0S;|`q8`n`(!+5N|9W4HGSgfT}O0qV#ZuRo=? zY1WAc(J?)YY2b?@l2ZY<$x0sOvrK!=BWToO{vFDI9JV~>aq{g%{a&=0fHoiec#Rkl zO&(w8$Lp}7q9V=x^?tl=@2v_<`0?t39kKDZ?$Wz=XD#wxZ1m~1F2BUR<;q39%1$<} zUO%8TzAmTq%g_G#<)TH6cdKU~D!bd4Xw-8kXHZjZYaap=T5 zk)spCRyKOw*I9K=+92@e_=fsFVHt0L#aEEYFv>`eEj4_FQldLFm5GI^x&r=CHZuAO zvoskDt)|SvZkkL>kF7L(!&3jQ1ZAP4&Os<;J^locO|=b+YA(WgzEQCEkFt3w_8k_` z0*ugoEN!%q?$Gf}JzPkC=wmO)F+v7IhobSmBZN!~@vW!tNFlRAYgx6iLgs|-WNNXH z-9wKvb)1k6o%RB=uyKrEkM%BU1x^AWG!c?hJkj4E++eI zq4B+bN*yBp0dCdgLyU}JDExfW_hbJg1ayBd%wU+(`IgZa^Xe{ehdjvVD+|m}ss0cv z<}2^X&a!eb$vtigPFaX#o>GFxT?r!7OnVC8_qF;r0YjWYzUAo*vmkEUz7=*ski=P+ zwgaivzTf&&(Ie@xM#Fb&hGa;OH5tC!?3s`rTVeQa7s?;nNZG#&P|cW5nrMx{cZZPS z^jLY7;kz@PpT)a!(?YMa&7wdq_Uo<5@-K zg-&AkJRbU7k^Mt_hv$1Dpk6iQ4oZ);mK(mOq@a9|Xuuz&0YxCuf^Aanm=IkM_?}Lu z#~D{{aftqPe9xrQE0`;HLVBzgqMj2`C86Jv`31>4E%YanFQ)uSwRcu1#umMjaVSK% za_5EU7JSn zMmjTpjmxj|r$u;E<6GkLKZ2`}D>o}r$aMJT(dqe-C~5fSQ7=4lher-)yWpEgrx!(N zX3PiQJnF?q?wAM_7ksTQ*-DBdlSwbP`AZ@@&Zt=l4Pln?7z=QthQqY6+2UOTGNQz|Tz_bSW zJnpSv$TD9?3@50Al~MM1@;$4T$7!2nLVg1gYWL?XRErtg2iN7{HjUc7$Y#Pf&&9wT znvW0qa!vnf;E1Tb8@_o+a7NHbhY!AaSV{T?d6rq>n@45@N@T-5Zi>(0eNEUm*7X08 zq84#5i_HuY6!i*e_~y~HH7*_m<-@B4^^ZyrWH_|?4~X%mFAJKA^m- zA?1+yh*}%H2B}8$Z>(1IY5axU^N;|?OSv<^WtzU@P)y)FGqVk;oz76z(SI*eVMce! z3Vf8F%GZ|>KQae)rDt70S?JarR3h-PO}iqOk^Uq-<5Fbig4;>{Pt!B#R)tghVW$7p z<_|`AoeumhJ?k2ko`z+>>U@^&`6VKHnWIpB+YwKH6v@NrJ)@%~a@r+~f=8@?v{RGhb^_a^lnq$*h!y7?gi!+baFpD!)EjAi?tR;N#s77vd z=TX7O9G`ImI9(h4eOTg~D7mjW%lgEe+t-}!Y6UUJztQhqZuBlhy2s7l>SvmCPca?R zP?(u+_6cXETH$WtqrK_o9FwlsTuJ8(R(rP$Zb`wfLQf}y4g_!uoe4wubSvN!UhzQS z7ykrs9zZ_?0r5`&lDSe$b8;r*Q+pYcGl!yLL2+*&{CM$b`yQB_S%j*FSsc06P)4;A>#C5D-;7N{O_p;dj(IN8Jm;46*3XF@U5m9lX>qWcXo=qKW|;;4MESBKg}JF#PiuX% z{vMsy4HAY6U}B_ZrGa05Rk~p@j80i?Tp11#+XgEe8sjjQP*;xntf-LcBrHlK3!q#n zLVfbSk39!HOAP#CZLKn5+OR^xI*GOx&`=+XuLNIN(_)9slUVcO+Sa%>(4cBxRa?gN zn&w!=N_3r=b7*IbAy!_yR5ghPQ3^()K`^RP&JnCw-l8hdAl4dS!bP>r?rF9(X~YHA zS9E2R6_!}Syoxd#ku*%fI>eirlJ;5J+m?vYAcbwC1<#k*ea2oR0(%zasx8X+3u=i< z=r*@!)aE4WmF0`(YM5h*wofmEeU_S*d`{KH^<}j&)!4FTOv$>qCYs{S+KPoTp)qad zgsHK4#tQTkhn>rl?LrU3u7omoqpBNQ6)$Vj^^u-bmT$C`jaYqrWeWzC!&%pW*`h0f zh=fUw82VdHE46ZK>SJ~BI$FzsX^%3P+n86@SQ4*=JsXFujTIFRGa9JgutEq(G*(SA z+e}A&e1#FKj$sJu8w}kmYNoJ4t7w0uu56{qk2R|v(UwDErIV*kg&pCAr#{tX>Va7OF+nG}E1&9+u>q5EC*@*wq^+G{mtt z{9iGcgjwy}*c(Skmn*Y91}svIj`pYRsCf+ywarnOu!@drs*6snE05!fT^WV#s)~4X zb3;>ev}kZ)enHXTWy1&8l`Uy#8t`pRP3>cMgZHNP!JEf%;j~lS8>~}Z=bFa20z{P2 z_NHO>L(ns7;^66qH{_chaHaS&+*xL}8L@KAE@oG=yV=vlZ@~6GoKbFL*O$(86|4+$*?U(6-0%7ok5AU%xV{PD%~UkctO_@v-Vf?o)# z@9Dtb6;q!11_%}js_)(qufBH!{zT%p2yPSnv)~tkK`ar>Equ}oZpA%Hyg@C^h&p?=Og5VUvnS$kl)q?ecErKTqo+)^{;A4W%3%(<`ThNcK znB{g6RNrxc<`XvRNevSmMMRya2+k0kO9cNyq00pqOMH{i%LPx6_)~>e-)}(fc@lrQ z;4cO5BBCDe2>pQ|wkZ{lWuOpSt3vMWc&8wi!&mAZPUZfD{8{Atwt8x?gE<60omz%;aIyQr zYph{^MgQPZlDGpIj#r-{*n*dvpV+XV;YZsII*O^mM;!ge0YXokG2_R}v{ zAk8W7cF42G4OtTMxV|Zm^MOa_45*24Amm^g&pQQez6{(LE*Bnx&G(pu?WEJe$2nvl z>=zyn;dIvTzFx`x%S4*pf6pR}Io}9S$1RXoXcIt|%Y*3X2IC#@(UwF6@w}&{yfmCF z(_TXe8abGMM=&6VEsuGeeA{~AeUr@uwE3XhR#d2!)zsgw)onX$_yOy-ecD?UcmTR> zYgEnzM!7sMG3t-#JLtI` zqoTBy+RKcZo>Rjpw}(yvEoBg6W|uW8%6Aw_gPz;_r2M{<0ZBbK>T6klL6jBE97R~o z{CQbZ80LK`bl#Nm+9fCjI&U0%ykmWn*{Ed)owwH!<#E4*zh2&Wn%0ky4LWbEko8-{ zK% z#v9iVpMFE31@i4bp%q4UNt$`GA5U7|Zg`wY-|)1*JN9T}nXrpaLFCzM&(O_R3HTe=cNowr|r zJ7o+0^g@(s8_G^Ym^yE?{1JKqwSmr?7GQ*^+6bLDO}azrEbVY1{UJB*RiX1{7k&i# z9y)JQc!(B6p!255tkCJK+E^iTLT{0|Sjg_7mzX+ENa(ypQIgVmbAvDRJC-{&g<;j} ztmL!+Noq)h__7%~Z)_N7S7-*=XA4c8w+)EM0=H^1bl#{LsdU~JA)xzvVFtsLUdlGd zymp)Kr?9esRu}V!STX3lv9m30CnE32ZmCacX>L)EC?%; zI&V@ChKGA<8vS5W=PehF5}h~6AUbctFFJ3U@`sM1?B4|@Km>K(c-sY?H%%sV-cC{_ zr-iO%$#=;t&It`+-Un4LQRj{O1$5pXz;5A!&fD!IAMHW?DCob0u44B*9?IbFl-&NI zzp?M12n<$aLg!5vl+bz84M^y`={k=Id06h#>BCgs;?PqR^-TH%MJ9CKw5XEMQZm0F zb)FX5MDoRy4^?|-h5E2XuVjpe2fTyhT~(H^N-O)Op*=)Hh|aQRj^n zV%BW+hqER7H2z^c#$`H^Ix(p;75=o&8+#{mH|0X-O*hDh@L>XV-jtCCC|nF+LC|^A zv_JBiPVcGdU}PNgL+4HBPm6SAE1>iC3a(DndHXTbq4TEG^CL>(6*_NPCvA9yikQ@S z)9FPKr5ppDH!8Kbp!0SP%ZJXJ-b#uiUeeHc)BGioFVP667aNu4+KV-PxTTvyb2<5E&OZ%ZivI&WMfO6ToP^dfcM zdZGlS^EQ$qq4Tx~qpoz`x-kMeZ!|Dq;2>V8}8* zM+_&ZgOySCcz&Xon2*yo$%Onlh)_CioP}yJi_Y6zn?~)t92V%jZAGhcHlcD#=dBGK z5w&+i=Zyr`cw{y^06K5F2i+0ge^BR5W&}!P!#!?_PwKqAM^PKd3Y|9+6!kV~=)7s# z8|lKXgwC6~9#iLyfzQD#)z&(1M`9{PmXj4aZ@ijO)F%}66IX^FM|Wf$YYCk zo2DBhXK|iD=S|ZqBR4ZYblzs5eD3I4*%CT$3snSk-ujXQI&Z9j(s{dqRf5hNMJS!O zCy+v&Hyr_;H@YyR&YO;a&f7q8K<7l6*0H*Sg~lql%Dad5bhgw{H5 zuOOnEQZt6m8wa=BGn50JHp06bYTTWoQ8I$9{q?=s66LNu9S% zka9>FqSi)#j8r3f7poQBg1?Y^F%qcrRs}BTytRNMaHi9ix(h7|d}-6J$fKxKz{tq>4Kh>b&4sBKFf%fKr)YmHNXS3er|a*1aknI&c3?f$j{?!-(i*-h^ax3~vziBY2|u87e}ZwK^ZscHe8H`da$mE7EUG-hQ^ z$aoN(w$9rZD7gcjw*u4%Hxpoh&RYYrayv$02X)@?gYuxx+d-W-EF?0S7C`fBtOq!obvk0`9|^D@U)oGKX6kuuvi^suG%9n@Cv zA5(+dr>mwd|nsn^Ja5D!mg za79CXOH)}z%Ms8_rEcf2)-fssbDsqd5|wxuuyQE;4Hy|eyMan z^}vHF_Say+gMO)We<-`q=$GzzeyaLMaFyU0f)5F97yL-@a6EWpK3fm&c%f}QxWz*A zGhyBSunC9F29|%jMwL&s%E}mk6xTK6(t2?&nq?8aIM+rLEP8R4-#vtN zG4Q9oUfh{rGF{b(7ri)_*n(r_e1635s~7hqT|QZMeG zkmS&dJC!oOpc#zusSdrkxhN^A7xxy+?N~3)&CCwHxbPW5+EFYXAo zIjI-NA9xPEI9BW%=*95`cS0|YdZS;Z7spwb)(ORb3%xl0es$=@t-zpmtQYqnM>(k% zSH`?ay|_Wlo79Wz!I4Vp#ZgJsp%+JEH{Vt-u88F(_2M3*s1EhwE+=zRFYaEFNxisY zwkW9=M{jEmy|@VLoYafsZ{}~O7e}j<4!t#Chz+)pXMsTX$-$JnVCS3{9by|@{S_|NLaaUDAK z;z&F7;=W)rZM`^tpqJE(Q+tU+FYZKkfI~0tGiL2bFK#f(QMTZeUfdcErb92zwgqSF z#bvWA4@@s^6AEx3eU+yHVo_2QoAG;!+1eZ;ln)QfwR98SHsQgS%; z;*Ms7Q!nmu*6ZJ-7dMfz9C~p#um#^vFOItoZNVwMIHf(@pfg@^e$e%L9!xV{YKAu5V9msQ(aFOJ2V zW7FE{#j%QJaaudQI99`<7xy;Fq+Z-{l#y6U*9BFU8xYUjA&90O$zw8Qwa2O6- zHLeM{8z2x*&i1bw*WL!4m9!3b&>Y-Bb8y&+4bJ@inS;YK7W~MkYjef2UvqH$AQtA} z2)%I992}7%J2D5yB?xnH1j*ueX4%&q98+Nq&dK!E=HTq5jC|^F($}KJmT@@#9yA9> zb1Oes)wogLJI%OozB2lj?zI9Ytir8;y*F>JB9u)y%Ss>ONt0;UkF#1$ScOYfT%L4o zDemj+!tJAmV=EhtN|=oMA*jzmN32Mh!a5)eaQifxx<{k5a+T7pgSd8v;r^G^>b_fr zx`c|&_fMbhTj{ZJ-5#_YN9$+bYs+!p1J$@?qqs+WrExfWBROazt{iVRE2^V-AzDMj zc+tXejk)U=`x48kdh4Tv;%ZB+VoahLy7; zs>_-x5mDAuQGEpV-sPj>gX;!XH4dq4j1FF0xuUG8YH(q6@XTRQa;t9`jCZCr706gy zQ`QXIq||&9^Q2B~xF4W)9Dafs9qGpLj`I7i8;4h8jsri#9mn_4MqCfn&&0{TrHweJ zO&Ikqb^rGPUtuC{R6;YZCuDvby|_b>kNO<8KHONLO9iJ29@LA|{d7<-PWQv}SZ)yeK2OXO>@PS}@Q0!oH-*oa&<;Kq z`;P3z{ooy(LM2CC@3BRx!+E`D1RqWE(2xK4)J`9J^YNa6M?aic)?dp<-6rO7mdkl& zADojs2H|w-E_I|6HyeC*9hh$c&M+sm9Cq4t&`xBP}kl%0nnmO$42bmAKJ;@jAP zPTW%PIm_)xC+?)ZhVb^IjBAoI%(uw11b2|@ZoCJC5K8^$qJMA2Vo$@-; ziMz^?hxyNiyc_LF;z;A0Ca1iPbmDH3Je&_aM&pUJe?K~LcOZ>*wfV+(pcD6~@B!3u zdj~pk4cmaL0zBLn4z$N3U6-3kp-$Wz2`b4q zv~bw4{rW*I>_8{3=rE-4_;Tgu^&{vpbOGZ7jM+}K42?u7vf;f>?rgz z?87YqSc|a!lYUSqV}e;r8I|yZN?SjcGN7FBgL){qU?1);l(x5hI9e;RYMDp;ppIoJ z;s=%P{gQrA`89}jHvY8tgW3yBru8M_Z9k|J5M%p6r9ZlT{h*#oZt;Vf$?(_uLG41B zNk6FPl63e%y%e>!{h)ksAE5<7qONOKd7aw=2!Va{Q#vU{h+G; zPWnN8hBZt2LH!MdCHS+*`@PleG@7MW3y&5^bg&)+hl%4d0N`=Ob{h(gU zQBL|n?aRDLKd8zARMHRXbrhBKgId7OPWnN8hr{|U{h)rqY9#%jo<>m}`a!K=C6j(o zPa&D~gW89pl73KWG7`FPWniLBxLcqr4=OFBJN%$38*L6hs7i0k;Rm%V z3xe*Oc)g7Lk(FNTO87zj1MB7RgNkcXJ3pxJGu`0_^?yh^{Gjp!IHw=f*O>0`gL)Fv z9ez+hWBCq0sLEEC!w+gd=6Co(hy!Ufcy?Ws9aa={GjrSzjl65X(+0l zAJicf3Ej7ZAJj}ne82smZf3J>Kd4c(DCq}P?IjLBsN>lI4nL^pGV6i)LCxesgYKL5 zdul|K29(1O>NQM1Fh8hDIoRO`bv?8GB*EuE*Kd85{6%IeB zACceT2lWA_JN%&jg%=8kAJhV-JN%&1=2bgCs8pG6=Lc13nL7QT{)|;}`aykyYscva z^=xuD{h$schtm)0Xht~wpq8;-|0X}EFR=*@Kd5|&^)3CNa@R@tK|P0ZI`o5jGn(}8 z@`E~x#U}lr(j;&@Kd2G(7Hq<`qMv)-kHn-+IOPZRBSfu@9*xw!Y{DIh7C8K%Qh7A6 z#Y``TZq`12P+<-3_4L$?R9J&+gS@~Swg*!qvK<{9c+;j`5h~sW-b(LG|Dx1-`;>Cu zPVY>0I%>VqxM<)Vn?D$#PIutl^ehU8b8zU2@i&ogDYLzo?x9Q4UM6i3+PZJ{&)`G!(Xf#kZuU+d)65$_MK~Kd6{=oOlQQpoR<+ z2l@i1`89eR--XA|1$AW=)%^1IyYR8vysG(Ml>0rl30F0&@O!8E_MQ7d{UIo|9gr^D z_r@07|5>HA??m@ZDRXJRk7|SuIxua4AI*P*1Jmz;8roNDpvC^zRnPXP27`;jH*;IM zj}TELR)X5OG*xAjUnaDVv(&wU#PsEIn1~nwE2e4{qFVK7T`w8k8)_+jAPA{G_Uu# zq$UpPw;hNt)Jn+vPxwN8DSBWw-wxCl>Sew3TKGDfZwKlN^+tz0Y;TEv{yDczfQ+xaP0DK2x^Q}AP-w}2upe=82{Wj_^zPTSh z=(mj&g*7UzMH9YI5vi@c>A$wkx59$qMMaA9>-F36XQ=`c`fWMz>^k_}oik6{dP?<% zGd7mKyu0{S>-?jtTT8q(TX!4lp4nlnErc5BPYzpf~qwC>9H!>)qr*Z*k1sV2HFmbHPu-Pf1a_sFn@ZDmxK}gHK#Yl)ejoN* zZSL@|PTS#It;0Tqy%P2!?2)i%^{d;{&G|Xz`+?M+J1x_-F=yNPXv58r#++v%Z0syp zfBp`WC3Mnp=4ubPT&ov@;|ZX(#kfYr~c?NuwPG44i#rt9JvaZIn14?e+(Hkd1Trp=0!cbOe^tR)!l) zoh9vUVSA4=$IQlGwz%Ji8;(ogVJ(@x!?lF1Pes>I73iV+RS!)%eSO#Cce|&4 z{(-qV&`tM@>0kTl+MCigHK}>TcGhfDJyEQBVyd$z?%8FAcWuA^H+C;%eW$&UVP=+W zEOA|u@|&m82j=K4(hKZ^GZ4<+_B7jn=oUx&&pB zwG?41p)XoYt{)?ZmCzTZ?m6^DJ=hANFG|~lNq@p6%*^kH+@deq56o_@FY0MyVi=Wl z=Vw*2M8EqXuv**j$J4vZ9}wkrb7S=tBbRB>Go*J=m@4Jg^Gs|~VSf~A^!}BTN zdJnf+e^@Gw zD#9%(I%*R_si(3G@Ts<;?7u=po_~~|=2pYBH0M7|bUBT1l=2cvqu~g$`V&f{;nT@H zMwo+P+Jf{SA!J(ka#k&&G#dUZ8sJYTjfSJln@}1J|BQJZN}~~SoBk<&ItmQGi_!B> zO<@>45*|u&T7V?oPKF~GbpMPLHjIvh!_}l`3k}1bsZB^RQJ`uv90{kOYUi8&AN!{x zQup`542G3-)-0hk8h({EDGSV1ss6C4Sb0x&mU1NQbyIL^1^)1q61?sj5O5^CnpO3; z`hN;C+?9=7p3X1}in5w3yn3+Q7#_~Lv?fTd_W#zOhC0%bu>aN!$v{WK{@d)CKu5y< z+lBInD_PBi(rCDeMcok?g;-avb|mb-GkvKlIW2rVnG;H*;WtS>n8IFy0&kcV@;}_; zCRE*(8x4O-QIGa`L6Ldk&8+p~A^M<&BjGSjsrsJ?bVaNyS345+KP3feN5cL;NCUJZ zVgEL%^O!LGj{2WYXFs@di^Ic7K9ioWNbN}2|D1>_3B#qV;ZG=yhHpSO`Cm+VQ8jQ@ z_#~#jk}(tj54YjZNxmMeQZ1SvUc(l>5#|bpBjGT8xBB;18fDgO^@shCP4|}B8;}p< zG8#!9CUyP-t?uvkFLL?WI}z#t`5j85AF(r_G`dMO!5!JgbSRB#+8?=u1w(06)4|B0 z3iJMid7|-RtI3$TByekoO@qAS= zF(0RGk_q`eh)}yfXQ5im*gm)}i)|XUqyKq7ltzDs#^n4A!h-%>(|Ih8ltxKl zjYqm5)$dRm{XN?crBRs?D3J~Kx+y+~n%-gmSkwO;MXkgiKa@sEP}HFu94L)y+8b%5 zXou2hDzC_IgITKGWt)GU%Qp~16B$iW4yDmYm=#K+dK}#m>S+3*G)iXb*WHQ^_d{uv zmkBx&{u^uUP#Qgn@*GN|!%(sxN~0I6s?LwlrMe$Vqk6$rN1kSRP#V>AW26uHp){)L zm66w39t$G zQ5^wC!WHa5D2?g}I1-MN14^Sh0*-`#O%A8hXzFT+XRTD9b}>Emshj)eVN zT)tBg5gEZgh0-Vq4&RmRGZ;*~NYN{eRPO2|l&Bs?DsMHokc95K(|?l7dIAyMxa(lj zrE+k)J(kM&S<-cfW%7LaXSWK^*QQb{$18R0-g1wEf*Ug3A-Q?o4*FrkNUiX(s zP30Wy2U1l4h7AX>1yCC0&Id=rw0P`?!Nd`Ygl*_F&JMr3FS7N#3RTofqX8I9Tnj0O zTnoOn(IRxI5#`TyGkO^_7(HloIsiw)bHQbr{?3er(&$8xo^$cX>(+m%RoNxW1*Opl zo{aLsYq%UrqidPZp)^V*YZsJ8uRt~`jW(iQE+~y&t!RH_GV0@UD2?8ND!ZUGO5s!* z^(v)N|9VD4Y4k>9>t((Mp=LezQ9RqhfblS&!$ZK{a3tK&kD)1uD#e+b&yH!#W_im% z*D&sINHdpZvre~xzJYOl$k(LeG9cKEGxu7S)10vt>5ZV5;LKx#%+@UCrM2M87{^AL z%d=R<{h)8g*{5-(VXjbYT*n->K8>pkbES%U6P5l8&OVLhhPg^b(GU7=MCCmTR&%wA zTZg!XIP=&m<_Q_>l*Ong)w%O#qgLh`Rk^1@bJx#9lwqEz)LI83OD@hlmSvul&U^M1 zpvxFHn{jJZ-fpOSI?lWdB$#Wvva#F;7cy=*`POA}_AL^RHHl20lPu0LZB5VYV8pfflI6rCO!*LclA2VzXXIZXkby(iJ$n+Y{{g!7- zQ04W3$U|_d@{U1(wi=~8tlu8!m!UH-i(QK%Jxq(!C!f2Ot1J@Ygf5t7xXL4`oS*s4 zjIYq~`FCUTxhi!^L1lA`;fhO22HC2F_zha(S}X#-gcMh`5L~{lnn;jSy0FG@Esca3 z99GKs+DM2+4&yrmS6w8`su)A(kQ&B%deiKB4o}u|gh;-JWsZ!56_cvxD5+<2Q-$Fw ziev_veGdyd%vqb!$=ZyO+T^gAN9fw1yDmUAyzU$D_g~Q`?`urPLr!leBQ=!)UnYL9 zkHMt#iy2m!9A$hUVy32!PCY#Juv8OdN(gM4WNNBuPR?X}uouJ)MF)j4+wq5;{6$zm zome1#E@hfl*eN(2jDA}%88Z}zCs}l6w$Tsu%gQ$U1$Cj>9@U2bD?Y}DJG$QGy=^>p z<35N>^qR!=?O_&V&M|Kv?>X8#KlMkc$Etzr=P?R0g`ItyodE~8b2bie#|$gjUfs}0%4&F&LL1X zVzrq4{nZtmOW=jfG!_slRd6ohbQL_F@Qx~bF2OE)t}0uXG8Zg+9drqSt}%{8HEMA( z+$7avIC=18supvs9cfzNM3o>z9c1Z_6LxqB-4SmYE$%i3_%WVo97mXh(=t}CX=8u| zBi=4w@v|bV1mf+wsCZQf{;*Vt-^%1c$`%7cGu;I2}F4SI@BAOSl}T zWi+<5F>t*mD%%*iRTI^13_PHT+BQC|d=)1q8R1i$$nI`qfcKvu{A~59fjAj&wKu=Bh+ZZU+M6iu69*@C^ z90X2q)e-jCAs$_#4okh0-)kCittSsoqVHnPyYVnrAIT}Q@6^!q;YZ1_J^oeHN003Z z&apkgIkqPR9pf}RIZn%*lS#`y9f2f36_&W!u*J#4e!0v4f>+N;+5(HaR(lUHL*uAYk zG9QZ53zuVLWthr*xK3~{TZ9uqR)VJlixKpKy%jBIn9Bu8ym-Id1X&ETACZI- z)j`QPaSQ>lp=jhuZ49tDG?Fk4C*s$(F`&zxpB#`x<8k+@#c>fZv!Yc%3PBwHF%5#$ zu?~N^B0R=PMq!^e1~0*heVOnSPVD2R+6i9*LAGIC+Zf!56D=X|=Q45-xEp%#96Uz(Nq)E6)seKTa8E$;TaZ(DAo1n|cckF?4 zxCfq#6WoN?aVm-2=iKOTO61L!bqH!v20Bn10_1%&fb15A}xxuH%{#DF13tVC9hh>u0)|WjU;unul~_V z;YaVEeUSnekjaH8jspjxE+ zc2<&u+k!e=SPm|A@3jszI=vXfqpx=hs}R(SHX*P*I|sn#XV}i*92ks#q6oe5sQWry z+VOU7Tt)57jteUCA~$Y>q>7IG^{TeB2s|-lYuXrChZA=bUn4gmk?daMB^4+iF=JPo`0D>!>7vC1?+RFpkUeQlTAqM z>?j%stGW&+?&*_dFG!Y`xNRa2bMRWT2q%V*z*7w?18a0VYubntEXZIVD!0B)>g&}U zLaoX&k5G>j+v3_b2J~J$FS)VJv*iGls2Si|fD;=8p$aGVkhN_Ltkdz#U9T#VY&FFo zKOYe-;;c935|*goECNr}A_h*@@rklk$;`W4B`hTH{kdhFw6=`_?wyWJFUp)*)OB8Jr9D zL{Lof$0>gYe(753dGI&({Gq>mnp|H|+gkbEe6oD-bLhIk^$qp$!Esn1Uw{t>RZkmx zeWs?rg24)4d|g>f^^j^#saR#as;srPCDyX4G2Vt&DoIrozQXFC_5r zWOy?V@dUiR7y`FqY>j`xA z^zd3MO;5KWpbN4Uix0w6z?$BRabUKZ%qTKi8BvxIb%Wj7ItKxlC&St{ILa8y%P3EO zrh(6SPe6ys`k=vO4=CW|ZZSP@S*Z??6?jyadAz;VFj(HaEM0oY8a`wSdNI}daL~zWpma~6o0ffT zH~GAU9Kt0ghspY6j#)(sx#(lllRD7T385*TPWk!Mtkq1IrV=_$=`c8*($GQKRv?NR zr7_cVooR?C2ji(^G7fy`AD?%uv#cSWPCAF3THwg5lQ?fY-aei~(OIKV#z6LQw#SbO z`!IlXTI2ENah&d4YYtKUa^>JE&LK=_&Y*ABFGDze1J<2$%`qJ4Tu)~d5E$qQAvDDk z8ai|;D=<|>tBJG!;B;1Kg&7@Ub!PPooMMLP$){MH=8rsy6dDd z_T>1=b>&ILj8U`rt~n;BaSAJkW(LNf!yxFg!DG~7cC6hIXg7QZ=~-xb`*v7BE*CDO zr&#Y}$@_amt-IDnJ>DKJJd`l&TkGbPH8$HH2G_+_HZ;cTjaWl{EWQ#xbjq3*BXLDV zOG8~bw#zbpvfVVisGWC~*81j}#r5&ZD1Gcy#%s$~&8=AtzS{DtW)-NaEu$2C>)oP0 z5{|{2n(7;jSY5d-F)}Th?YZkMP>P!3; zm1V08ytu*@8%>Hg%{V$bp&wior#Lf9Sq7&_}K48ucZ&{+sNGx*E)gn!3i;rg*HerOAlZ<5Qig zq&F$udr-PeTCQj}Ct_vI6)iP&@mP5)a>bfUCr_J*Nmbd5%PVHo%CFBLr{>o_H8dm={nC~84aw4DiEg(aDfxy^eOOm1{%RlG?}U@XyUj8Q{5XM1f! zGfIv%SJvS6rltiqE@hR{$?A^Bh%GLwt1DAhE)a4I8&^l;T)oW8F}+b1?s{r#@P0Q| z#}yKb9X+j~elbwSrg?cyrO_n4#aph5nx=}@+OnoOC^W{ev`{tGc)J-@HMOi=1=de} zYojeGwj7HcPH9w+vI5HY7gnLRm{HCq>usgl-aa@qb;#kgrV*PqbHdcvJhhSwMncBE zcZaADr;UM^!R$Itr+7WKAKkr*R!wiNhC>{+r!~&4Xew)|sGeMp&cQ2WHgUY_dtEkr zt*&fk3Aa8~pxp<@vLM|Fv1Uve?vrXX?AfKhc8hWF$}uRl4drFE?G~DveQ`BEq`zz8 zar7Q~qpUW$q+07+o8xFgeS8Ime|ZZg7y7YmC6`#NcI5Cfz4FRym+B1}VwDV8vF#Qs znA8NWSCeT4+J;_C?2DDn4YBI7`brF8V+m&ktFlxT%Eg_KB$GP1p|&%DQC5k{#+sR9 zukop=$CglEA)U5ZEg^fV*)yaOS1jGvkfB-l4PnF5SZ$e_sO8R8qq>R{xn5n%Vp?m(QDPTLnT_*6n;kh?KnQBzeDuhfGR$9_?TYn;0F zVG-0c$0}Bq8I2RTd0&C#O4ykHGpHhgeh*^-8)0pIp2rhG3r z?LY7}t9|hI^Z0PyDS-|CQ+=m-PxqYRKGQnOb*?!sTx|W+ObO?WPaRhP?lS&vGt7Pn zdPYqgJl*hyeA5H26n}<0%gi<-R*u=l>}qy5d%Ak#_uJlwGs=FFMP>CvB>g>~GqH*n8>dE7-o~AGim5kr&@WX&)NU8=`c6H=Qj=+5DEe4-wB9 zIlfFECOBGftl)IPIf9D>x5c&$iy9N33mvUbe?1W$Vq`M0a6dWx`6YxyuvoYdg zK|UZOy+M$M*h&9fkS~Er-!Hgb@HIgf#+vDAf`|_1Tp(C0xJGb` z;5CA`2|gR|(!C_^{xg1m70iEf|2xrs^NT zD#7J~Hw)e)NS#meQ@N8kN^p|kOu>1Aiv{Zhn+2&4%KYmD&l9{&@KM3%1m70?OwfnD ziTQg94icm)D0Kvj1ji6j=b3_Y1?Llyze4E6g0&LALg*6&*Gc?YLZ2tNS>oG-zDn>~ ziT{nzw+Y@Q@sA4qgy0K;uL$lC+$G43n(c5428gJCme4tZJtUsWtmGdgSRnD#Dr9`I z;6#a^CG%k zV7XwGV1r<@;2Obof@cVxBY2VEC4yA`WxcNv+$wmB;N61v3qC?bz5XEd(}FJvzA8xl zV9MPgxSNP}{X;N{+YzSc2_8X2`Z&QU5Ab7sSZx;Ne#NRA3ub>jcjfJXi2S z!7YNf3EnCAfZ!v7zZcvtsJ{I}xqlY=Ey4E$cM1MgFoX9$;8*uoz#c;P5~Ml~(+3F- z6IAxL5U-RQf#W59vfy;VV+GZH8u+M(LV4;dDO&mF zQ#FR^XAAN(InrAMuN1sm@Fqc}Ru8^AguX}cQNbq!pAmdsP~BG|-x(o+HSY{!EVvRtT#5TEz2x zI@8ttE$~F4PZc~E@$U-q zyCBjjg6e)6bhgml1=amE;`<3bP_R&Nq~H;P;{@qqh4N<#t`j^(@GQae1nCQi{Few` zB}i`>jNd9qhZ3ak7Ni3M(vJx~Dfq15{|LS=_?95O95CM}f}aciQ&9ObMS1`y`P8=| zK)ORBeTZPL;2=SM7sm8ag6j7J!X-ja66E(*wj6Xr}G{Lh3Hwj)Oc%|Ugg1;8LRq$@X`vo5pd{U5Kp|ZT^1nJ6z^xJ|T z3Vtm3PeB)d?|_fruMrOs>@PS-aG2mI!D7J@!Ks2X1=Tmekav;L|0Vbf!5am)3jR*; zZo$U{pA>vrP<@PS-kl!sbeS#prD<(Ztke@P= zUMkomsD9rfeyz|y5j<1yTtR;D$o$s`ZWX*m@IJwZ1l8|j@V_cFKN)8J_XYWxBxx6a z#{vU_Awl)K8u5dK9xlkQu*g4FaDw0z!5M?+txu#X@= z_auLb;8a2N`yTPf2z{KO`hAah_4^)JFY!%+s{~IJ%Q_6Wp@I}Et3%(`zo*+L-CBO1{3{2tgSRj4E60-%n2=aqf#vdtIDmX=O zw&2l%3j`Ml)(EQK^N`abwEA5SdY#ax2%aT)p5RXfFBRlBv#igpf_DqvFZg@G?Sjt> zz9hIy@UMdZ5H#fXsZTIfu(x1e!NGzBg8a%^^^c(X{f_!g7Fzvo2d#d$1M4Jynczx6 z_4^&^8-!NB-$9=*^kzYRxXbcx61-LL4#5Wn9~FE`@Q;G(_c`*b-{-(jCEos>{-w|s ze-9%)D3~V5uX-6jKrml$xZvKu=lS6;`HvGU6O0Si3pNSjGOpHv{ks>W%8%PRh1k9o zV%QYgd|5*8{X4n8#19h87aT5FBsfN}Sg=HJmf$?WBKduy%0r#)^1hLM(f!#L<;#*E zxLMI|=p+1WRquQN2K(4~pzGAp3xCOnpEBy$n~!Nc`r+hwe;pskcJFeXy0x4;JSO9` zWs|-Uf-^aRC8d-e|Bg%jrc3Kl?r@YH%;C&9_ zC=Zv(guF8lw(}rp42Qf$49H=pZ2;|*cO>k2uQXdbI0zDZ+Lh1dYv*N85DvVW<5R z5l(qyX6klQ9=peucMZbKlaG_f1`PPkxK`Q+(|G<`(B>P7iN(IM51Wtg`WUv48^Kp> z6F`>BgU_~{^(#UB?Ed3hQ@egoB8;ij2vEldkXL9EK)WoWV|p0T5rz>(B&LIUFG_io z&oUt|aTJf#??vqhTV6UMoP6_8KfbTD51Y@{bXYd5U`WHzueTLiFtT8{wjTQRwnC>J zu1ed-R_Gz67jAW*?k$~I-LSKGTE_WBrI{C;UV8h~pOaSop{u|0PfD@lJfK^vONu#Oy%eS3muSeHGy$9uyurLoeh#y^e{{7uY`Qt6 zI;Z-{J+8$M>`9sUz#ij_z$NCPzHL*gkFS0lvG?t9A=WzMlTPkSUhCw$Y{Gj-S;4~6 z(sA!iG|}cUZb))(+S$o-N$Rd(s_%m0_a+@a1vgBWm=Tw%Z*;FD*3>pNIH|_jt|Ewm;a(92(x` z4o`S*oHZGiUCnJ~zrVcwd&o(-G}bfY(tG?*?{?oeXj|yA;I1^+vYxr6(bBYGo5vU3 zd)dT6_nJ{GkO7zUB5Z^UGK#4 z!12Ic+eezAOK&L|RuZ}(veWW~wuLS+$7WVPx!cJ1ZJS$d4t;XBJKweK0>t?9vz4Vz zn91oAEKJ?fw{&Rf6{Xje`ZtYwyP$OL?zEtJ80?Q)F4S-Q?r3oC?(V_yIOp!p0pbIk0rLPh!bRLVLP@vg-=XEMs~c^*3i z-M*tjV#d?@IWy*EO$39*=TY$YKA+)fs4M)vFJ<^`@LNTh{9FoVqt0iJ%kT%j-(N?R z$Ndiedaprd)2c_+;QPIj+5W-ACKdLbhE)1~AAmT&+jF%w0`dbtLw!8g2KhN?fc`b% z`phuBQf53SQOFGzvs#;( zc2l=Mfi>**xX&Sv>E|=uP7GTXc;WkQQNUpVyM6OWjuz4#IvQEw``s>_Ux>l?yIuH+tjiHXriH#Fd8Ck8p&`sWR>+*t zKPkCb$nK%JWF9AE)X0dSSCsE}H_8Z6fx$O5g<s>v|p$p^p6_xmDBSN**(gJDV!0pa^yx5^#j_rmb~&Tpn*;V#6A z!S_2mOPTTXxG6YgIsWjJ5(N5+JQgt{mw88qM0k-3cDZ-4`*E( zUvkj*J0AwqjHmC`49P$cc%AK=ok8GxSS}db9^W3WG_%(6g-dDwmdjtPB0QBS9<$Dg^yA=)K`@AnBx zls4n(drm}^gr;-QUy!`hLcF(y@AnT?duN6I%u2qJF&<2?FBvK$^XtJ?Xc&FJ^X3!2 z-?@Te#xwL^Ea**{Y?Uzk$c|vvZ1sn;C7ZfY*^I}yu;@-q>U<<}YTxhdod|a)AIx~_ zjx-_(;_diQ845A3hugGFynbT z`C-OWr{_m{lZF}3PgVNx$X4cu8Bd*F6dA%^fEiCOA3WubiIkub^!={4lH$lp%7+Ragd_s9J;~7->r$vUb8)3#%^UsR>iZsl4D#bCF@f<=LW;}nV>N7vW zbw%IrTuRD}=UEg8GoD-{%8Vz!OsDVno+v??@%)k^V8(M1M%~JN)f1r-6@9-SsyJZA z)8pn+(1XM$?v6oHBr6A|&1kE~%}4iH=I4mv1a+`7${x>86ch7t+9sKhKL-(N_vb8B ziy7Mo*X3NBM(y~Xk-p#A{WN3LS~Va8Kt z1WIJXJ#LE6;d|1s4`w{yqp06;u#3$M5)}0Xv%-w0roEAuC>mxw)kQfsXrwUkIhdu| zUAFnwxv&946kn9!s+%(a92Dgv{S#M)9!GbCFIwsQoy;`j8KG#H@#JNKW<39!MZ=7z zZpEa?z040Yo*R|CSrIBo()T;<@?yP3_#%_O-}Qp4j%1M^W;`{m&3MxHyQWu0Ca^r1 z@tlG3xuZvlC=g~m7pe%D@%#fhV8)X*uyU_3BR7!)W;`iEnepU?OW*H00%kn>F#={h zbp*_KcHzu|8BZMnGoBO40W+RD0%km0$N@8+x)i)NPdNwTSu542T{O)~DcYy$dYh&h zPan*9Zb3wZFTd&godo-wFOBH?{W?XjG*Y;$lTf017%2nLA}%DMyYBSCjOQze=*C@# zzTY{x-TJa8V8)ZB>heFdGvyfG$H5BU?~LkhavM;y8xxFX3O#NvbZ8bco^3=-9>N}X z2L7gS4vt1ZRRHETf6NxZj3;+KnDP98odYwTeCvo0{oU>voE?7mViei)LqvK^{@8`N zSnnoCIfQRJ*G5y3%QoZrFf$lEXxWp#-}!jnG=0Z_FL0ijc>@?b@e#alH~0dZ&CCZ8 z(RL+%VF(r)L?s7T;pcZSKw%DH|ti_$#qUr}Z{ z1~Tx7+jAd?PE@4pWzuY=c{p$Wa6lFh^G@6^(?sW(C_~c_Rf;qB5%M09PSIzA<}dl& zE7=i8rn7izgs_C%CFC2MaU0T`Krg|W$9kIM(#ZD&=xZ3qx|-wDDDOeE_FkNMMMy9w zD8A1?{{^Qq(OIIR&VZCwoXQ^OM3s~8*L^tiGFU=sC%&gR88oMH9%^8iN2!{mprT%! zeV}(fNyTvEJ``u(oy<8YTh$lz492a(A9GR<#_>(+$vE>OiteO4ACD#EDWfV_@T705VUW#l7=PZ5QY z%R=}3D<%eQ+k#%(wxF-QZ9#u~+kye7tw1aY+qPh;ZCfzd-nL-K$95(uP zs{n7*nLy+sR|yF2b?~tlOjQv2tKcyNW`JFuSq$0-%@)x>5e|Gis*k<^n4lm~*B_Q8 z2&d!p85=KN>n-ZuM&kTL#PIHIBu<7HiyY4&@E%SSRzmy`C!`RlY!99BbWIu8_wocxeKNw|Mq+C+BG|@We-bCGI1&DY z6ISV3+8B666P0ZYyrqfiHU_9*2DVyWxe~`1g!IrHV|N{@c+1)Zg9^0oGyc4rj}s$H zI8FtRCQt-sPceIkEoQh7$d<#di`{Mn?N(dHnq-SXBwGu@+0q3NtqzFN;cug2Ax{`fA)wL-&LOY~u$r`{jZ^(D z9Z%4+elB?J!%{QK!b(+z{|$(YEo}^hRY6VFZLAHoFtJDp^He;n;xSOE30)hnDrz1< zSD|H1V$i^c1K*3Q#`FG(txYj5_cNXc=~r-ijbkowAA5m2iYzSJrWtN=(02QsG8o6A zy~eBy+_Num+iTs)!?JkbLTx0c(LBdA+M1X~7$}o6xmjT_2q`!*80KCrGuVli>}>#K z!hbo;D-d`9XDZZnKN~RYvjN>cGujxzMu&`zTi1FM(d^@5m3S?ib8;}v@9_M0jq$5Yt^!;K)}#eTi3eOUF<{M zchRb~ZncV4No%1}4aPqHKc6$7Np6rX&-47+r_bx(d1dbVe7|$HIdf(*ckZ0eA$YPf z1?18gZ^|nij&DTI3i+%LJEDtsNnCUgOOXk&9 zElO|z{L(~^6@v%%oIY>yvP7L3$BUl_6V)2SJAJTGnrIogI~^OpDSb5k--1v_XcY-R zU}%3^c_{wuIvc&_n@UhPoE&V8ao-Sk!qMi4b~n_b1O;!45)}TecuG)kO9=`cgTL<{ zQ5WhsD7m<@P&ubS6KZ85kkvJi?PMolEG~sEOBaT!5)74M!&0+BW|lL%G+=jz7ED)o zIzz%~K16w(bY$Wzp(+v8pPWuM%-IQu+CW*#$u(+I`H+@^h!JI^Ahr}s7#xX`HB2TiSPEAgw<_5H3n{>KG3>1){;yfzFCjCokbF zq^~G94xf`|JLkGlP*gOS+ZWMwN6l&A$Y|gEMd2b(Oz9t^TJ--!n8-Vscnx7A0~2pXBO!kO}~s}Yph=BuC|x;uDm=YC^E2;T%!mVZUfAil$kuRP{U zZ5z!X_l^T%LB;rYfG;j{7u3$+B@9atE42aeBcSEWaNmg~nHOoag0S%@+8C$MNB(}| zG2#d@De}=c)0?sH;5^w2MLsX$c0TDLuM#(lJH^|?2gJw4SHxe6pNM}Do5c_sg!!AX z>|jsXCyQr`i^cQA_2M@1N8(S#J>sv$Pet>%0Oj=MV*~J5@g#A&_-&Co+KhL($OnJ4 ze=OcFn%|V+e^vHg@t|nNYGZp5&ON5D5J!j;#ns}KV!e2m__6qfXvQ`pzhZQM=G#vk zDV`$E6#2p;1>#lW4)J#J5%C4_9r5?# zpT!tDJoE1)mWac|lf<*cMdB*)d*V)!KX5a@$@mGFtP+=qtHtk$X3Q$$JtX^C@l7#+ zhwRKJUpz`2AdV5Ih}GgU@nZ2B@ka4J@hR~Q@e}b&F&)>I?p#Cyd@#V5s= z#9xSSiN6+qEAA6N6TcAog9hvEHV?}=SG+*HP&{0d z#c1jw{&m{UH-DJ^CGmCfP4PG4hvM(V{bIBDwHW6AH{=%;bH%ur5R1j$qWS-ebc1DA zietnR#Hr#LqS5k0I`jV-Tp|DY;#%=ialOc2n_15t;`c@VLP!5kM7{+@`zi57k-xps z&o`n-Pn*SP0>TdR|1rq7w#jVK(`M-;`zW!eSSI!thlsc)S zDsi*8Mf|>aqsZ}ojL&yS$p^(p#3#jP#h1m`#J9!w#81TEiwDIf(bHn#OOPzDo7i16 znuqY4`xx*T`Hco5?BivhC{7lqi8I96;zgnv0D|;~YqI=E+iwx?6CV=!!X4}RtoWw* zuDDP9ROCBujGrN5YF1;n7x~5;w^xWm#9`v$nkgJG!uXuLoV;HAfq1iM?z0fSPqwFx z@|5i7#KSdG-j)A-(cF(Ad_Z=S_>~yo{S?9xF-zpDwe)upi^RhxS`$;e&#>70aK+psfbw-Y;v z-Nf#qxgSUTa@j+~VIsPbX?yQ}38q_~Sg!vsd9?As!@HmQ?~kSDgM|O%gXqx~9kJq; z!#ocG{#VD*^ZA*#;IeO)k@#f&yoLYIALY%l7H`|Ju+bH);qou+g?n#w3O>(4w=wtC z=$h69tX>)ft3AqMo&{*}w(<3n)N;QnLml8?xh#+SK`z1S zr9sd-4Go`QK#RBS+ptsftHgsQ_G#wFuL)j$7a{DWLC{)`{20$$ylt!CNX>72N`7oc zFF!ti^3pJmOOfBbY&b36w)L=6^P7(RxPPo4zFxKDw-aHeL35a;vMcoWc#>-2HmFw_m2%{_20A|^X{3<*H^vWVr zx`$QJ(|rl49sFK?SqQVtlw zA3UG}KW--ye|sGLnQ++ttI3bX?A^Y0Q z>vFGYzv+cf@)OqnKdtGXyd=CiY3;|mn1$i;to4cHD^_?z;6T{Uxb}rl(jNQ4fw1#~ zg2;yEg22X{P2p|Ufp8$Qwc=2?^5$gpnyyXZ%8En5%C1d8&=2}SALy&hsNd6M?cUSm ze{W9G>TT^GeqrV|tLTNM@cJ%aUfpDGtWO5EbxL+gZcWBEc1Sv#{G05p{w*08$NprE zv-QR1C+{kbZcO^N75iU7K9iDT_xZz5H@`mV2jjbZd1ceKq_Z(&pWhF!^H}riH`~|O z%?}T>uYIxk@tWXz|9amRUy@~qE3%Tljn6kfewVY&+3;BNtCKdK$nrxQqx&4EbMn;W zv&cCZd8YZ*V*=OD!PxpcM?UoOo@8)K&i1V9JOA|6CTq>}%}>|(*PoqyvH9t$llK*l zk8MK^`<)FZ?~9Jlp8wNiXxs38(dhHdZ%jIQU*`#h$;zcIWh zxh5Ij`gQur``#KD-4ZT;JN@_RY4u^eLOyo1f9sfiBggnLH2?U0BaV-34Skjw3YY)K z-GR?C1Cb5K?+YC7Yz_At)f7HIxo<==ur>HuX7Ikd!{y0+{$yaos3!lyv`y*t_R#cA zs}Gjl(Y`)!+gli&pSLj^Bl5F1=HfGVV?I9fHx|_A?suZc?#Zn`dEfYG=C&Um@MW~C z$MM*GZQ+b?Hpb~szH@tFUcJ*84R1|uP7XQb>wRNqtH?@NT}zvMeP2LpRyGyw9MDws zUjL?|#EZ>W*aKnP{T@ZAVdVaoA4~uFn0FA%f57L**!@w?XPHj#Cg0Fsz0BOhyJwHi z-qa2w_~RPE-(^qsmgs@7&q;>+tv93hhyCK5&UVjZelRCPz%-29fA}NI`ugiVxDj!$D}MVVob=F>z|A$z%bBTH8`v06zX~o4 z-=9Ux4*raH%yxJr;LJfH|Db|XxWyNso}@$ZRR56nbBrs*+i-`!HTX{|SWcHeKy^uH zBK-c7+h1W^q0i|0l6lQ5*g;n~kO9l#mu3Hg_PFG=jOU+&>;sA1F>pBrNERs0o5pYl zWEkj^%YR?aG1#9#SswrOIG-^7;M@%i*D-!&-VF$2T$!JRX5k~)tvwZZF*p;S!G6fd zcD}@Cs80r~?EDTNp;{9T<-#AvIDh`T2>U}na;lLg@(k)3x+yx4;YG+XbaO8KRvPaL zmLZhR_#EdS`e9@T>=>ss2;CUE6K)JOi%nw&w*<_?q9VWLT!y_5-Rdx@a}T%Ofl2Z3 z4-Vt}9|6()YvIjg*cpPjk#?pjv-035i1ZB)MfR~Ch!QE!Wf)~}oPVT3CHi9zqMDJ4 zbhiRwGoU$Ak>{Gx7@wX*DmuER8RsAAmp;N|#Bu(wp_sI1@No)UX5aA7pR)xNM+Sv| z3t#L2GZ+%__HQiBV`Tbc+|S5Rnc>)FtZ1doXzT!YXqe2b*afWVu`=^wg-m;#%mR#% zf;n7fVT=;1kr6U6&Od<$4%?A&VcxgJ_@yy&Vj9D2^=>rBM`)UH{(EUpFgs?(`47N% zs>ms_*I}UUy(oJ$Vw+vYIR74~+Il;3R(L&gH|>3P4#Uhn6O7CVx=rAZ9YjqcRgr7W z)^Lm!i_GfG#?m-{W}NmTd~j6>0l(30va|SgIUHFQeiPeb=pk0*+-!zf(C=C8$KQ< z?$O>1p1~aF&(YnH57pT?&Y#DcN%PGIdrSWP{GcDlg*`cwo7(XyMGt>urZ3FaiC@lq zG0xxZD^|RTje&9gubEx&$M6c9KTiesAjJ_Y$vvEVVr-NiE70+F)7CRyT{QVr?7ei ze}#eZ6OMoPPx4{GWj%&QbCajPs|#!^a=E zBN*rZD`R7vKdT8k6{TRDKV5}3F9W7`qk~a4BjD$WUTE{=^Uej%O%w2s#Ah1&;I|Mkd0{+0kA4K> z{CVZWIDZ?v8o@aK6~@F!zme=6VLw$fI-iG+fIWy+!Z`m&kxLgoDPNr!fhM&Q+4!&% zKW74~(+arKFwXy4#KJiL{`6j9=iZMvnJ>c^dKD>s82SGaJfSbS8H4^mg3&(eyWgMA z>1^WMd*6fpyvIm1uhEi!$e&~8y1}6TVb~ep!~Pue`?VSL&#VLfcUeFw6YcT`{tP3N z>bYHQ{=Q;Y@@5TR?h)oD8+iMNO6yoK#QgZ&WJV%8G_{24ERJ$r{f))fQ%nIC_i%EwyV9UJV?CLX5)7=qOd z`X6Il@50<|T(eM1lkx>*Ou_o%JoxS7GxuZPDExjp)?&66hWN84aa5Fd!^Iyl-U-Gx z0ro)p_-lfFLI=ikP$?eTVpa)b_n9Ai$V#lmosBP_K8k>UNMDihb)@eEbkt#3&9MKI zGCzRpF_;e;7l!?xluK6{YQG@q{79QNOlt{pJ1!`hv{q;iIuV*Vsz ze^AKY@iaC(iS=my>?5Dmy$LZ-IxOZpi1pStV%~(9oTcVyljmNOr<<1>wz~7ZrL8S_ zx!yk_pZzU)c`qJy&`R>m+ae!uz<<9!6dsF)>^DewhIB< z8qUuPqZG6?rENomEm(VVgGt8sNA7l$&Ba&FN8$IoLyXsDJj`U@gZCLkcnWK;i(v3z z{f5Re7)=O#jW-{-9^2qR(-Zpa? z+P7zP$A1pfz|_wE52oi4dJBPH(O?7bM}RY5_5K)D@*0>K@fwV&D4E^;8B4s3D4y+L zH5pMMyDtr9ltf@O*4|8_j7r%;6HSfy$wA8YqtTx*Gq%tIM4yMXueZ^(&{}vd#Htoz zBELz>!JGCI8Gk_XG9EG0GFuRnGhdbQNcCl8M)Qsk&zUor%zVyd=*f&SJV9>F;C3XY z4BTN>y#xmJ2 zGIp}emUHBHh_w%^dyX(lYRg{<+h=NFzmxH+HVJK9JE-67CNve*$u%AoFmHugJ#Zzp zKM2I&D4UOuUT5N?9TMhY?ai$v%izI}dS04Llky;Ix;N08hQi;aSo<9CpI3|@CLaMQe@Gy`78KPcamUTk(xH}+Guxu0=kKjX#z6nQ(pg_hW7D9@RSJ}_`e zO*vit_`exO1&tBLz%UgWCo}G#53vtn=i^X>tvYx)1iPJ2LK)0q@N#GkJNrTzjA!*< zxUkl88bg6D*kq+KBX%`&?`K;>7{z(btAJbhYoUtP!e0vwZ!P?_(1eu2e;JDKg6|go zMrz@|YE$@|p}=+){%<9p6LQhNb8ROhJ#b9=(7=#%YU9MEA_VhB7;G1^OZ zNC`SfwMb^i)bzOR&$o{@nme7OrDO6vE?S98XJe+;EZW-|8x17?+2ZwA`K6)P2)!I&cMIHn`LrAs((ErD!;}$&QXD zOtJkWUu2pW=Nal7c4P1;4@gaLLav)+pj42QWKf(vA>}v^#*s|PW60ro@EpQ|D-5o> z7Z_q^87?LZcrmdqSZ^~xaV~Bk`8~&MK%~PK{13MvXFzl|!6^h2KtN_Zf-MWB7qGz3 z#r*v;UmYA+*g)gF76-(SXk66ds3>fpaT|^TL@w5^?tt9K zVP#(A1guahA|_&Wtd*-8_+H^o*Uw$#LjXv}5S3U>HptRleD2!|h>bkWCj#BEA_eQp z{~AcKWi|hGe2x`5DFo|b{3#V0%?hz_+d7lr>R8`Nt18ygqnF` zo9(8G%-@Hf5!}Vw&YE%Q21kFawl$UDE5QKO7b<($Y^!=8)&p^bp#vO27R!ia}fivI@Yok z4Gg$#vvNfP1IJ=TBw{R9=+d0mz`#V;sBK_?zrPq+AqHl;#<_en)Up&Koe-}@5cJvuLP@P{0i(4YU<6Zkk8gpP zC1Bf}C5z8ku&`NCArt1u6{_A1x6+N4B* z-hnoC^A0si@eVXjT-4EByj|5!b59<{iV7ZF#QYx9O z>cjJm>eF|4^<5uJOa-3j_kVT99CY=&9UFt=}5vl==$ zu)dWNgW)Z0W1vB~PpRe5W*_uKpxDSfSyJPmDrUirpiz4~2EEJ1@$IqG%-Bb*ryts;Y!a&l#vL#WxLz|TG>84`r=KBdsX9J;9nN6 zUalC?^g85q30Cw1X44HTA`q1(IGstk@OdQ<2eaUsX|1x-zW%yHot3?2&G{X=HZaqJ zDI3oBHqcpYia6CfI$q+IIEZ4Fh-oTbce6~2vw2;;$PIeC3GF4tHoe1Vu4P}sg)0`5 z4>!>#PX>78q1)(1cXh9xHqO&poxBfWhsD*?bH>cgiR+x~Iq{=5Vr?-oPxYKW3%`Jy zi$>J?lhyOMFM4+Wq6`vk-u95s`|lF8{@84uGkKeQ-ai|(xaadnJm=xjLoHiU8o>5> z7js1C{B5m^?@@%gvRSnFje}QH?@HRT#b#7)NsXT3Y^h=E)5S2)1#{MUxi~g+aC=!x zp{dT6Bj@)q7W>TM`)T>;<(eWA=C|p1-#A+`woQL)g3~*55HyQzv(s@)%HE_pTMnON zGZvz;9&H=Y{z_X?4v#q}+WaeG94_t_^USdIXr?+_b{)4OD2^Tb8@q0^*Kunj%jV3w(UKlONr?V)*%*G3SDXmq&QFU zoMD@>R<+I3XY>Ea=C)2d$O{KoRF)5@Tb7KL$7P3aDMTEfiN|k~?!vnUZ{f9q>y=p7 zW8I9E7X)uf_0i8CiV`X5c{TVM*4HXeIv3@)mYlzOlrAqwJPFu(A_+3-3Jpr>x$; zKyN$$d(FjKgOx)BdCa(a3&ZDPJr667rMK{3$vUk3mvl z`ZU%Tu^t|uaha!A_Tk$(Ja83O{%_(xt<)v8zukZ@MUHhmV*Hmi1zmY5PwCFJ@HuKp zZFOJI`)}RBlIp5i3#Jb)ttc&@4hbZq3iuCb6;}Yz=xE@@bfYxLH`Nza)y;>PAP(>B zMN1bfoiT6rY-tP5sh(T4Y++rC#vm?7tulo8Y9kp!gj%8?+#*95Y?UE|TgC7WF<_hD z-O;OdTb}Y@rKdLt$-quWLn{#CYS~T}MFh`DxblJ!AFm-E%qM6j!y7h?Swg*bsO&dV97PhPwH zex`J6xZxak!;9K5!rO4uId*}``EfUAo@-i#V_wx5$gRhUC5-U((SxYeMXq1o`ujLK4z>&@qI+eB0Grw_0A?Wj0g_#Rac zdt2t^_LK^~%S#l91#P#cKR0<6nWR5yNjmIUFX;GU_~xz6KdaQ=JFB z&F(%uat^Y00x{>Yj8eB8c+AfH%-tF6;-hR(9)mlS)=dhxB6`h{?p%RNMxES*)7_NF zzB8J88$l--$NbT4_FiBI!sy@-h%`I1$=#XO*8f<0vfitz*~O^yzG;E3rYhglHutDU zosUeTI?jbY_XvD_L84bNvTyY?U%)CAyItdR+w|_11AfUW?n@VEQ=2_}O9%YMmIEGj zKG0ro$#4t$SaG(XTXElEqnJ{+!7gu;-N&s-)qkSSC)lSzuz#S?wu7Zm;!WybkHOv!%BkF80&PiTU*SIa!YA&2O7v1=ooZNQ?|>4R;1h1AEBv{GZ!z) zMz(glyuLvljZZItuqCu8|F{ZejlW}~HA@116Rof74dTJRAIhO^B{TB^1r^kvoM*a9 z`^rFpZO=tUnY7DIO{*YyiE17_?yo3j9+Y5arvM~T|F&SJk>qS6jTz|^IFewd8CSztD$(lf*=))z=i~De@D7D=sIz!lqDx5^Z2LKO@P8nqiN`1Qj2Wk%G=9YR(bnQ+ zizZjqENxXJH+D;CtvsH&Z}v_(^@Rb#SzfCa(5x+RNd;lEr}9hBN? z`wzx{yan?XS1p_|YuQ|D*ia}q}3ZsDxCOBbAnXmb}uRfJ z*9}`Tcdm6#`2ZslID5%5h=|TzxTFe)Z$=&NiWZ>5q&6faDCb%@@Z|%UqPA-B9QF=Z zb`;}7jPjxRXxmGwmZI=Q)u#VI=`VT0_%Y~abJ$;&wd6L#b$iNyHA|K*Sb_dJcka^a zI!hv#)r+cY=T$GBy^@vqZwhJRHHChESxuAmF&R_lbq1PdMa7H-RjBAcL1r^$%p?k2 zK70P(l-$(WK27(e){J>oixyRx(-onVP)&9L7bszeRad z#xGes50oo1& zw_xcURIF8~v-Mb5Gv<3&mKh@^9S=oZ(@~e8qq0{26Y0)VaP6x(HC4ZJdF_I_>eN24 zbgp|TggQCSDHMrgG|Ot~GNvvotE+Iy@mg^~bu}6cUlOVoww?jY7B5>`jmBMEz1*5H z``o&Pyf81ST4BzJg#-InxhKl3h2J*URt(fP=V#p_PsDR!ZS}kv%TUUsF{io*xy|{8 zgrg`2ym-NqS(wNH?Sl09bT7w@3ZHd9pT=&3FlSU zVYjQ<{??4DIoN?2OPS)|lAciPUB;HMjvqDZm_(1`Crn99Hq!;nT~eDEfhhyVESgn4 zXAb^pPOM!ryL#!;CACWvgG(yP$_Ka19?&ykzWkag1+S6MiQ4LO7c9l4JW(-lP}!jV7z-W6_sOrZ;2!DxjA*Q7%sL-t@FB(#H9bdU zthb%ZT~SZO8&QsrDt-yK?4uD33>s5%k`;`FPKx-_!a4ptJKv5w1$KM81705M?Bm0z z!UQrpBhTmP@m{N)@^lVP2d|IdUDTAt)%9H160P;YAS3-N>w5ASwAJ-A zm%77rJ#qQLf(HiwQo5cSSs%Q*xKq4Qd_a6$wF~y93y0}`rTD)GoMcgeuEAoLK(|;hcyV1@RJByRV86saRV7v>&E5&;87V$yx zY4MlhN8+DEKaM@~<7f!7SmfNEv`-ahiRXxG#5=@Y;&b9}!~&cK%;#uvjA-<);5T|# zV6FTYikzjK={Pood`mnehVi(HeonPYb{7YT9EDB)D)B0Dhj_dAi1>o|j`(}=&teQ6 zpZWb)^*t|8x~oK^`-FTrM3MP%Dp+!l_#4saD8au0597GqOo$8KA^ShXw?#9nEw*!x zQ^rrj17XtW9D!qGPZ6s{qho~a7t6jzyivSYd_sIp{H^$f7{)jcme*eFB@Pv-?ZWM6 zi8qT6ie^e?Y`4?gcwIye)L^>v#P5onB9;E@#9PEW#rwov;$z|~;$HE9=;?eG;P)Tq z+d~{9P7`O6=o53q`6TlAj<{M}M<`3`<>yEU*6Rx~h=0PgIrxEWFLn|+27>i1kzFnhlz)WmG2%G+r^r5CJX`(+vKNW9 z@_YK77s`K${2OF*>;vn!P5v8Y-z+{L?h>C9UlQLH-xm*ve-ghWv2thw_cwz?c{w89 zCN}~$o{xlFuD{%s`E|4{ZF+Wu4V0r?-7 z{j~TBiGKJ7iS!@K&jAN4=YafQ%KlF=f_-MXOcLq3kceL-_K?3^_5g7>iF8SApDOT>|>baXlK2M6zif@vr|GVNxVxxFaY!d%W zA|D$!Z)CO@CsEGPB=YMmmdQUv_AqfQiS!e+eYX7b#B=1okVL#oWnZW5_2LcUP2yeR zz2ZY8>h&y%eD=tGPuus3pUD45+0@UT zUx@*XEutL}bHsLHM-u6JlgPJR_6ThsBTf(}iD!y4#5pALsUwlkdEzSZY7+I>C|)Oj zy?BHCH;F%$|3UE)@fB@^OQ>*Ql%Ku&Q8u@P|5${&nyS4ps@kROHB@u70>_giAXVHg21FT;TiFgHK zp;$tq-W;Pq4wU~G@gx%0hUwx0@d|N=_<;DF_**fN=cb=0?hx_y!qf-1t%j(gA-bVk zPtm+kf_fh%yQf$#^2-VgCw3K&68nf{BGs^%ewa8~94k&0&k(;QQu2oBR*9az^hVj9zI21^ABwk#KM^UP zzZOn=OWe5n9jjUhQxfaz1UMM5r>H*L`pR<{StAtxK{k0xJhgfe<)I_ zhw1MXDXBvH3Go-=FU60U$-yJ+SQL4Lbr?-rjHpBH~2{!%<#N1CsTvtE?OAwB(QN-ojvDjp>s zt|L7}exoyj_$SCdNt`TB6X%HYMM`O~oJ+;)#Cq{&@pkb+@e%PE@dfes;sMd-^9$r3 z5VOU6v8#BLNXZVyKS?}GtP&TA=ZF`G7m8Pj8^j&r_eJV|Fn=?j3h3!Szaqb<|NM^Z zz2e8>AH>f@BOZc$GWeVYEE10vE5+gB@#2Xhl}4DZR$M7wAg&WH6DdQ&_}>?A5^ocK zD&8+rnS}A57pXr&`!^yrL}-65hH&pjJ6)tk2cKMQU!)zE`B|2JL6Xw?y+?3I5;G zMmbd1U_3J)3}~Jsfqd1Te(GqDJw!@r&>kjE5Y2oq@SEpF$d@V^jJHrU&xc@}=R+X% zFu1*5q$CFIJ4NbU(0)Rs`+nKfgJArCNSO!P9mK9A z>Om<7`umGiyrCbLcSG-c2TT(W|CS9A#SqP8=*7d=7-J{IVzGzVM=TTji^Ijy;#hIK zI8B@`&J^c}HDaB(LOfqwBd!zIi<`wQ;&ySTc!PM8c$@fuxJ%qEJ}&MNUlrdF-xfa> ze<$u24~k9VS7KP-7ouX8c=-1rzFg1a*+c9jmWlmEzF5zAmEu@&yf{&uEY1|?i1WpT zVvSfQt`N@`FB7j6*NdA)zIf02@CAGFCh<1$PVpY`0dbdTelJ5hzCh3Pd&F18H^jHa z_r$&8$KvnACh;rL{N9Fq{rWx<7Ng?f-`fi0FBCcGk@e~$mWlnv!D6N8eSaG-d!jg5 z^uE8%k?qYNl*j&pXL$wcH~)kA6z~J?zvojxGnxh6z${1OGmI5q&&<+a^x(zgb&g?P zN4YRw>HrMC@#6nA=%t~H-y2`$LDb@HI~F!>X{_P$e+5SwuJ!q_(XEU)1?x2dtCt2r zYXv&OD6g_9+h(SO5wsreXjx-%?e`WhkLhrvmfHsxI2ZuX~HPZ514;`8|&O_#K@2p_(oE zZAREjgP^qu2k0hNT#L7j{})p8n}Y^mH0HFEh~VFZUpvTEB&;pVxkPwAoU>ClE$6)Bt9wLw*&W0ebsOrZlT{ z6XKP@*$#d$KjzOeQ@WA$2KrxD_`Jo-508o4#5*7Ld(DdkdhuG`4IE^qQ%IB#7+6s@ zpse2zOqx)Z;NpIkmz511I53eYA2_&Tu<`%x`4qmwK4AIAdcflY zUBCcCmInRm!p7(ZlB&pYHBZ}qbF|6z^Q6=gJBpA082Po`lmg*fu@ z59)l#|9r*)e@6UJ=*o7@PPg1<|JKfjLJM>8P$9QDnjOc?4SCJsZk-PW$LBYPw-z>s zt%BxYLHtmlFdy+B9@F_yV0vM*vlXe4!hcy|v)!#-v%NJB)7)h@2QGZ}WgE)=#qV`V zhU>eG4%BbDE7a(OQMczhAF_u&FovaePqN%T_zYOp_>5+M`m$C0O1AH_kZ;y!A^#-I zmGDV>tKMI+J3I1OD6-(Q%;Jqn>$8yMY@7L6eDpKf{(kmnA=}@YgCA$?=EnfIXgp7i=q!`Yp4 zQQyj)osvd9om#tKW%7~LD`GFUGshE(>@4Tr3RuO_r-!y!9i_a0f}L&#UQ zwkF@qTQIZ}>ik}IGAp?O$M(dJZnvhlM^7pA_w!dcP2s|vL!m;aDFg<=Ac(;aO@YE6 zj%;2>?CqWG0gXLoZ`Hx46k7(eR3Bt+==na z^3F%t3H#4yi4^_!cWciP{un%g?ZK@`VEd|3!$6-5Q^)tYvDSn`E3q|*xd?86FYFKe z$T4D@^v90Ij)W@G-3o+bPoTh1MV@O$W1E?@qN8h?xd=l2 z(tDbWI2XYqs6*Oa_!t70**E-y7>gW>LxaM6`W}0M84QVd`&U8p7@7W936h3}$_&T& zURS76W;C{xbr~izE5@g{p<`v{#rTF~=s1}LvDcaNaG8ZMzRDFEAv0m+#1T7ehsK2| z@DMA+Q4O7##xPs`GPc3^2u&(i$4=(v31-J&`(iK9K1KFAh>7n&y(x!db{TUK>_lnn z?a*1_70lhV_t`lNGxrZ!vl&6R3H-5rtanvpmDw7Ov0|ZFo!MBLi+~xYU5yW}Dk0$C z3?tXh;v?X2Xj%ACm@&>D89FzcVHPxv)m-isgu}yLm&KRx=7;VL4@FAOMG(3#M+rC= zLFj(3CvYx;&;zo=0}HY^;|td&KygN9ei87-PC~5rke;LGD}x zp_jA+?py?+Ju0^{#^=AGUu09++*dR_wvai$nti4*-MI)tzf@MEV?%h*-&ET1v4?n+ z-b%w*DWshkdybWSH|GpQf=GVsBu0KeYJP|-niji+d$c!$XE5g?c!C9esLsZ@2zacS zG~ax%x8yhQgMJ*BYHZ5nrgmjW*~1^2=?k-U;#9N>VJ-rlF7XC72Ie9#4~!v*&C&6& z^ISU||C$A3E&|t%#^2*kU@ihTeOCNY+L(*LJfOr}1h+9h<|1&nm&G~3WC(K+L~%FF zxd=GHX$W%>xZ4NEIk9L6a}iLA+*ec?&&N)LFc*P)DH$F=oB3ld0yqBXIDZ%mVJ-r9 z``Gv%+L()=*rXpH@4{xpTm)|XiSeDZF&6R4y9ATm<(cM%-LWFc$$0oa08vJ%qUk+!pl5*Kq$a7lC>NO5~0Q z{LH?9-_tWfn2Uf9+2Zf;U}G)<8qA8?^&!kf;M&3Xi)=Z}MKBAsGjkCzkb}socKbac z%tbI2H|OzMW`(&3ZZJ_T-21`CTmg-;GS^v<3Yy9Tm-IN6F-XaF&BYr zuZZ_$d6J&rGuRtR$uoNFAIi-13^g)kQZYv6D$f@>H9a}h8LGZ(?>EE97P zxDL!kz+Ztwn2W%5U@ijwd>X=B1g-;f5p<&ia}l@>%tgQ-IzyO?z%Au@%tde`vS+PK zn_?~k+N_kZF&6>tOFWx%5ri-o!Ci2~sh<$STm&?D`1qq&2y+qq+}N0lfLC=ICM(QE zz=OjRNp^?*m`lp}9FC5>>Vz;C0S|7+9JU1JB4DX*`9Yj1CK2W$_!Lnw7Xe)uxqwg8 zyV1dN5DxfxqHB%jl-R(AdP)+5=@g9<_zF#10l>sz$+i-B6x$1gSiN18q@Ln z`M3)AWBe7e^Luax>;cF!jJXK-0&SN+A^z&b$Jk3Nfr?vp;#MR;zFn{(jJXI_Ar|H$ z7>D$@xys?U;mil&3w1`kh-N1UjYQ57O-#@}8oAw{o=8XYA~L2dX`PGUF_aUz)1S?a zK3sY^mu=)Oe|C3chp~^$I^chj1q^25yZwO=VPy6}jIQ=EsFXc~|4ty1g7Uf8AK|9D z+o_g)Oc#dODU(=>?q=MfSnXOWp#p3%QlWtgxCNkbIqxQcP_7bectfzfk zCgV}pV)}v}L7r`i#@(Gyt zV=d;}5%%cJH?VK~p}!l}?x>+m4 z;6$v&e_)O$m>e&Jy_~*-#+T1ho`?M?eTR&%BYpe{o3FW>*$BpEugYti=nlL-O4Qo6`kbJqqw~MoWq}O^Q9(@?uL0*Y^?Z4@?U77QS-pmhrYp zk&YhCX@k3)GF+e4gWqoMYl-=;iOIg-8LL|x*Ea}uKde?yK7;9H>Yi?AvhrubeLB`& zCSy5k;oxM!?7&0NODsFvJ}M(O-O1>fF(sI7PqMSnWWII~4~FcmRC}FbNc$g)IQXWd zAhHN#!b?@$U@l@)h&ZHVQo;>O(HOZ<3OFJ~V`Z9V+b87GpWf9vA-6B;5|tpb;>S|s z55}R&V1YQzx+6Z0Ws9D&;%7@|*W}OmIW3yZijkXd9gS+{QA^n^8}E5AuYapIyN6ne z%-!3HHdDiy0>-9c(eFKN=bo-Cb1%g+z>9tRGA3iOBEv( zle}7*4JLV;4?Yxy3?{+T4qAEy6F^RQEP^eIQDU$$sE;0>`9y$c9z+OBSIX56a5s$BUD6&jhuqo%yJYR_eJ#T>8ux+GhSF}2O4K!A@Ivk@0y#)>&IASMOOgwu*0|Pg>#>xf;ZgY+EjIilF zuJN4~jYRB?ky3ScX$qmn8O=@Z(%K;2E}*-4JAj~9eF);VRvkubwPB=Id7_sy8W;;I zWmB7jCxyH01a85K<3-$Nf~OJpVMPO8xtjm~2lD_~rxBG{p~kwpVKM?dGVmV+xGKmW z6pB310-}Zu_jV29gEfd?3zn zgJ%Q$Sr}e#pBb6qG_wk2=?9v*-uZ+U4;XQyl~55l!3 z))az$-K&GCyz0**{xnu>8&9!YhI#Qx5wb)|%hj|!a)X}E2AyxxoL&pKo#^xf69*6Mw1~KSi$7jlL6cJ~q)Ov;1);`sCK=li@TAubFI-omhP))|3ojq8pqH zOm%~;X{VTk=EJsjgYGU(=LzFRp579}^h;cXje{?_v-0RP1S^I{A-MXigSs~`$e1ayaJvnMI*XSSx5*|R zyHmhg$)pT2W~w^4mC`x9q)?$mEFDbG$^00XhdW@M!~7UzOk6{}Sh!h3oq07$sUP>k zj}Kl5v=bs<)EdhVsSr26Pzft5Sr zEex;1dJ$IcjkmDIT!UCy-5ji}a_W*=zrAQ7$Lfk0|7A7Be}E?7^hH&(=Py`XZT%zi zUb=GW|1jT$3uaA+0K|0s0$j3q$>QpNmQrF{-O3iNsB;FnvWYVeS4PCqY*j|Y6-LU4 z2(>69BHW^kh@J}tn#Fac^LaUvG9vl~f9RHl?{9d3;^`y~Yn4gtGzw~21(ZUZmB3Ga zP)N*l&MEC;)DSa+4&=W&Ip>yQOPbjNiLk#Wj|eTYD&*~IBX%4|4K8PX_##&jk?M#? z)<1N;=}!C7K%O%%fq1SWVms*7<#sX25GY|Fza6ygpoQivsw_=(>Cy$7Z%l?K^$3-N zRDmO%DD@fZpo|6+LV=ze3Tshkc^h|rKH?X^eIDI?VRV48!ZqBaeZ4FWj|-u_X{=5e z1t9-olD3(6nRzVFg{)c78O3~tl(NwV8W~5ol4-&G-mJWd1I@Rn6X8BGaa*PZL zMunOrGhFCuxuIrI-HQdGa@QphEJafUg1In^GaIecwX`geb@+zNK=io7eH{bQeu*Ha z)MO6$j6qhD0+&vt(kR3=t+MMV5qD*)k{z~wWDbAWiSXzyhfG^hAg>er<@xz}xcP+) zo{^$!5wD{UdT&HoAWA^ClE6N@f_J&WVhGbwDvx?~nNIrz_9DMDklEYRIQC7=I&4FI zonSxK(=NRY#UBf)I@ByPkVkR3{_tY^1SgHzrmDwv4z%m$#wo&<7~*y_JLDq_;*btEJbKOEa=jMpy|^2TR~-#{4DAYAxyqjVd4X z-xUN(lq{NEvuxPxCAD?cD@qm(f?YR%*`itCT=?hKoI9XoPWeEZ)Oss{=Fc!_JOHrnbWTm8WZsuMLwM#6;)s+KNT zJdc`k%N84bxm2AwYGkF_{}*-VX0$5KnWG6AJ@>G#jS<8Qd_S^qYHQ&w| z#4F_7#dRxdsv#R`bn(1{3yDZ>TucSF8LqaTk*56nl?QoCiW*puzTEm_z8_^$$YUriQkcqB5`ng$A z^z$JpSuOH8GHw2FK=RQ(`CXAu;Ak6d1MtVP`GlAL2gJw4JtCj^aQi-y?^My|(;?Dm z!GXE5jWz-70kTJk^Tcz-OT>*LAHOiayTzZ0&xs$4Ux<86!T86BW?Bc>Q)O3+b>doa zqxgOCPVqm)mqar*ANl=G_E%yQUvyb+i8xd=Gx);K*EP7EZwQfQj67(@#)ChV{~3`_ ze;6-QEDbR2ELXveJ8PxI9FUIUMyZC-YA-};7I?3 z?AOE(#XpGwbaqztz!MNL^Bo__Hfx_N%V#B;zSa4o-NK37m`S~T(;4ML%cQee^-8^4F~^b`5WXn z+HmmSB>zw4zhB%X|5LJ!HXP#bk>8Brg>A<0f}bkhA4MD2V%8ha0SwJpUeq^Vw$X;e z_Rh57?=K#w?W4r8@}DaEG;zB8^JITptdXCS-Lw4F;yU@iCwr6l1Mx@Vz2bx7)8g}@ z8T*TT&DdY?Q~CcWenFxQEbJ5a%Zvd=yiD3)p8Q>87l}Pdq^r>OVe%UdIHWUUgyB0y z{wd;_B+|_xu`ZE+sklP^i%G=0TJ~0L-y!}$elvy`<(VLKXnwXtzK_a&QhY^xU3^!3Uu+c3|97PSTsB7{u)Yre?}Fz4J;+~r zXy=IhIf*vMQISRi791*@zkSg^Ry&m-KgeaMwPd~6AoArp`pta}_@wM-#h1m`#COH_#YU0u$T6QL z(cA~Y=9_x-A1#)O72*(an3xpJeG<~0B72H>wm3^%ATAO;Z6Y(80qH$$qP5z7rMO<) zD(($WpF?FIxpEy>?$55dfG+hvImQmB45&E`f1`EalXhGHo5&` z@hWkHxJBG9dfG-mmi-g)Zjmp0GQU0I8{*sI2coBS^r`GWihT8)>5UdL=xH5w;r%M? zqs880g*Z?gCXNutisQvo#nZ&YHIn!iD$6-vTq|BGdfG@EWt;nI#J^Sc-Qs=XBjV3R zzQ4-+-xm3*JnfG}zMxI}k0OWD(EhW?mtARlnn)dGcM)Z+C#;pI8NmIvfMsHE*vnJpjc;N73VH1TnI8X}sZ zcOP^3{YygIi^U#dA91i)DGnD$i(|#{;xuu(I8&S>)`)fD3h{h#jkr$q?t?bVF4O;` zJlc4GK0P|8?nyj%W+qu9#;|fYDzdy#-BXmah0@JpAi2OMlS=w{bZdEBnpg zipM^3c)5>zg<+c?E0+;iy}W7jp5jy7Z+nZkZ5SN5MYo1)!vnqXe+zw^&&+TNnEY6; zldyVe5VU@a&VO1;x!$%Jhs7I)m#jB411(-W-ixP}ThkBM1H@ywjL!Wa7i0C(AZWde zhEFh{#oP8R*s1v?aPsi{WPbQM-ICvh2zzM|v<@J@oeXI4w(*%>YJO$N?>+dKAJ1#A zewz^X(jaJUD8zeZY&b36w(r4C%`XcL&;4V5d?xGV$M+YRrVJ~WmEG`v9mm64xQ**A zq8IObJ&&yWaKGXKW(oIdJ=S!1{pF_!r`E3k_4C>Zbm&4r^nXO$;9_30Gb;Out-Tf@1@Z*?wQpVhD9=5`x%HsoFdy@=WA z_M-(K6y$Hr+Z3zM*mi1D*6(uWXKuZyIb+_-P1f$!c&XQ4cg-Pc?p4~0EEBQi`|Gmhy?=%&>7u;ZP57tj^icX*0 zlvU{8GP)^id-NLAsd92tc>3Drw0Yrc);3#Xe2vFjYny%ZeAnBJV|;6yGcHeSJU(r0 zb8ueT#`MM$!uGbc&FN!aXewMYvMGxCjR^#|tZj~79&J26dSSCuG!b6k)-}k_zuj&; z!Cr%H{>D)mq53rJi*Ezs!RKHv?CaMw2X>`3B%xs7+Zt*d6i9^X|rV`md_6zhm6J%8NRLSnw`r-jVDG2CD%3Ex2|gr*o?WZ zIkY0!cw)q99AVq_>zbpt`Zt6TH)Gy~&3^lZPtt6(JL(u(Z#Rw&uWR<%P-d9!Ydp~x z+!1XYkzSY#Z%wbau|NI;S#}2MJ_ULl_J#ngwat++{w=``XsLNNG(r4h&{kstTOy6e zN7gon=h=m`Hs(%Cm>E?X1Qz z8Iet^5B9kuuYN3!TfuwwrWZa5^?5bYa3U1RGDlEU#lSf;$3@Bdm5ig6pjkYyX{V-fZ&M*d@<4`4jdw|JI4~ zBiE-Tk>}-?G+VpYH2aEpq=Vb8ZnkhdMuk|WRTSQeTz5IwqdcG8m`umO#EpnwgfgP* z5HpD5Z?k>ZhR4NS2EAJFS~AFhD^ zV|)hrgNW_ii<&^MgOzi>=EhnR4*d*Usn@XuKBL#c-^n7>FMwW0kl{kafL;gvR$3W8 z#vqi=_|ofG1Up7)wZM&`4RHG)xgfm`^CKMeI-Cip7W6up)VYe8-_el|{;1b+6?|yi z;qYcM>_iY3dL3-EtUNfV*O89wJ-rTwQHJz7+!Fn;oq}G6 zYkGPe*(M|Eb#QcX+E#q<^sKpkBv)@WtL@216ol23Bk!&0}QxV|=&>y$-K% z>2-L8Q@$B`9V$FFkX1WYW?rn2X^)dx5ZlL`hs!LCozAo)WG1W}-r5?y4vxBxor9wa zy$*)i>aQ~A@e!IF-5qP-<_TuUVEbbGX`do{9R}QAjIue2l-XtIb=-^6j9$k~=Ki0o z%Go&#Gk1cnB2J|}k7=n5o zx4?{jh7agx|p*JWLXoT=AQgq@ULhZ0DyLlu)=hiipn>sYS`BZC0y zb(FF_AClRk*WrqeWW~P2$h*{w3u003;$x-EqWd94z%cXxOJ|Kjb&E9$nIy-4v$d|8hRb0 zjM<{s;bt{DwvGq=P1SjPY&Vb6TWOz~{hb)&<1XlRj0C9H!KYB6_oFMZV?OA0Z08>B z&EOeKy^fDr(1+@5)azh{m^9yfu(#x2$`AT+T&Vt$$xZF}E2*p3!Pap_1EAO8?vNFy zfCKe9ZZx~#kAJ~(q1WNs;rJl#F!VZHI~qU8oq%44n?5W4G;Qd0yo)4dC=={w-1il$! z2hWis8hgC z3GqCeKc29IrbMO7JD#7JNKD6W+ZqY!3*azUfA&IiGUM{W^YT>BM(u84GeWQ9PV7}d zUu0(VIyehji(Ur}oa6EPxi`@3a9hwH-_90>UWa-FO5~0Q{LH>!67n^A9h@*NZsCJ^ z9Wl*aP6A-F^mtr4%c20Kab@>uVVtr=M_E9Cj!*#INLa&*TJ#>)azgk9O`xO zcQ@*FFpD;N9j+rqufugfuY)=f)a!5^DS92Q19}~c83TG9ZYlT)EA1*|&sv!_g!3{;a$|dX9b4gupU5_aUIz`f`EhJB=yjOM<%*!!!HXgdlN5R#JUBd&WV?DD z@50fMR~_ng@Zfeli){tH4wmYc|EZSJh+eW zP@2b8^GIVKJO-wz0CY8u;~qe-gI7N2b?_{tUI+EPY#U=(&7;7u|0k$jXTD|UHp?hc3erZ*_vd!&r$<_^=aqAw%SQEL_y)RkVOpM54WLjnN=IgmgSgph$r zL_om^2+AxfC1e7kB*7#MA_BEm(P~9SMMQ%$TBoXYuC>;wPQ}(%tJaIN600Z;%--_TJn7bKQAXertW}TjO4PJZpc8uSnRt@1Zk03{3CzAk=8CV;Abvp)kD@ z&2wNx^H_plP^%d@e%jG)_drU9Ncmi7um-{r7?J;?j@!j1@xZDEf zS7!1XfpL`&m&+dr?J|?!6A0fy*$n1aX7b~_m}B8`i&! z{(!P&?8(DTTH0IZe2v^|nBRDlmh&7q2O{@$rX6q6eu?nwlr1oNChc8#p>_pds)d4C z$o3m7T_j9fIBkty{9x$<1|4XhqnpffDA-+AJrsn6dSfcYSbxANhPE}Bs;A#7#OM^7 z2iZSpJ87emX*2}ZB$U2aKGOHVu8SEDc2w^|dvuCtek3oYBW!Su3157u$+b_&N|>UM ztqGi+JnadYlI8j>SV-2_Z^lBhc9t$MO7L(A=b5d*kf)zNAz56r2G%Jy+w|~y!3dIP z5EB8VHX8?@j8;%5XzjG8@U#`*@Wn6Ar?AFAiH$RcyUCYJp*58_5)Kvt?q5yMEI3$E zSid?vvPTO8H^c?Qd$cf+5Daz&PvB5N`t_?{gD1_@7n#wM1qTBF1kYgRQ-69Ex^lK} zg^?pMJ+zsL&yI=HJUKl-Hv!lQpogt(YgGW1@-OyG+)v$wJD-R)-Jk8s$pn_wLy*uns3 z3_W|Ee!B;b60>p&%ljw0rort8OYGpz@BG-vu051H&)Tp9nQ995O_FF2IES`lrb=SDY>(!%jl2!}7di4mr6P71crQ)c9IiDQj?)yfun z+#NNy9^Ms3juPnMo^z}v!4`Vl9z;%PuGz5Ux#QS&hYsoJJ69z7`fP*gGd6>d^rpS^ z@VVUW4fH4jtiJ@&76yC*w^9932aE}V4TBYjV2js6q;v}!ftZO#@i>ArMjY$pl`ZtR ztvt?aWxRN{l#PpLqV_@H9r|jX`E}$-M8jMG@gVAnCT(6#&r@y-Hm?rDCJh76!J)zg zj~Js!56z{)Qp7k~ilF~fIGl`#G*rWjVm;j*fC9WK;c9LA*yay2>5!r?Ez9fgsCC{9 zlnx6S9HgA?jY3abP0va=o*e-03?rxKA~+>Ob+~KNP!B}ky_$Cq+zT{>!G1jy4(1Ms zW8q**2WB+jVgJGG55f8-D#5CmEgbIXdT`JoU2-~Wj+d8e3jLhukmC3dXh zp_4*IYwlctRYq9^XKxu5R=NcB#2J|w1!v?OR#$ofHiQlb8KE7rV-*hTYVOOAjeHtUfQwC|<`8sA)-tO&_q;W$!+l!V zUUyf|CAf!?!>(2IaJM3G+G_42wg$tRJ7%8iCAg2G)``e&iPa}QMol8$&e~;m7H`s# z1HqF3%+BCUQk=UA3BA_gHr#CKocQb8y1>uV0Il6rf~UjbB1hZ^7c^H4UL8i6Mo;y1 z#=6z)0lrs6t-e^rbNfSZ*grh8kA%Zjn&0Calxr1|#rSO_yZrR-W9!(5} z7(1C&UuV2C*{jbP?=0eFI8@~e(`9Qpn%S~ZrUlbD(9bg7Im9q8Kggtf|i%+!qXf}&m)ZHs+9?r(BTd;;hj$JYo1Et^f|+;o=NIfkH?M~ zJlqjx(D1&Qy>FD*_wjnNbKQE*eg$5R3miqnEUz$MCBCa%mY;;bDE_dyXE|QA;@4PY z&Wi9A1=`1|aQ|aO5ceAIOxCFc4)3oO zC*f*@J-KTY_GF^=bG=?ebyz!YfeyGQ!0iKj&x%HAkT(sM8L_eV+>7f};!!wMnBdfP z+d7tY=PYsTRN@&p)N+S!5FE?ev!+N$aEF_Q(8JeekQ2Tt;|S;zzm-F@S9_BzQUCbO zKXOIwQFm?{ku5g2Z|UQu&cFG?Ph#jh#@^Zw){Gh!HO27leypah zvZlJarh3lsSV>Xw@PQ`|hH;7G8ye^QhgmaPRMFgATUAqjVrg+<6^G&fxLKp&Fx`>~ z(<>cefe1E%YzL-d1~!aBP9~K*xuMLium$6E&d#Fk7dN5F zVn64g!WfLpq&e5wG3T$VU`EE-Y8M*Gt*Z(trCFCNSDk9?1NC>(VxbhLk-|Zt{$U4} zXi|EF^70{sZJ7;Yy;JX z($K;I`Djus=FE0Y3>Ac(7_Irti$S9l8Vn9_gM%1+#Ii#L&Lnok;6nIj#^6JX3Sir2 zXeccYo?1r2#81JHP}&gZ_!zS5Nrfd;tuJ(gX>92LC!G-$j7X*Lc*^pbzLLQ~j2K@? zGe-qZe~Krwnk8sp=gcmdS>~@x=j_Z7>fOag{L+{+vydj33Q&0#k?LeIG4_9&lfj_L zs|k7KLcECO^z7nUEb48W47R)3Oyh&eu1r3T#6aU~Hj3%0dOb`iIg=`-TdNkjY8d zVFg97@nvf1c8qCh2TF!I%aJe#Sr%q;$D?}-dWDjmw=ne6oS$O2)4Y_o8)#(eomJce z8%#_Q)3828jCma~gPe`_$k;>}=;Hpyq0+C=n6`q>B-FmEX%+K?eJa;P*8s!b+_#-= zjH6;FGv?Hx^a1YP#nFN8LwG;8J#LsC%bNE^UI$=+AbA#cWKO7{AB$jj6`|UwUK)~P zn5NMN7$c8~VeJt_dNoI49x+HAc9z&^di6*s_lVKQ){l~6F`AefN@an?XbF#xE*wP| z`4OC6P(CYe>d(?nKxw5p@T3)TysM%nFLZF)pd8xxDspSy8EPxg7}U;K{!(iOg$nwh zO-2t1JGZO1TWj?DG3>}b-_^SvQK-of{fa{v|51$rEUyo1f&EzQ20A0iKR5qSHuuyZ zV~Z`*c(GTD(0ojmJOw7%Cer@bC4puKcGip?tu&`+Y(Dq={CmAKqSM5o0P|nwq=~a4 zB51O!H@dW2C=bK1B$RRhRd}{@jd^9!q8SF+K&Lqtik7gGaT4|I3ugt+V1pqpF?)js z(h9;IOX6MV4$NY+UtvWpnI|UH3a0Nmgq`s``wgd{h`};m1AYvHU}?^uR*gKMCrbVG zD%kVt8yZ-EhJJ#W6dZ?4-*eyTV*%Qg^-S-0m&Sw5uFVyc2ID@)MpilOsMNz2OI@X#`TVLSjg2s|)L2si8!UB|jf-mPRqogk zb7nTxG&aqtT2ujpRz<~g<~KB+P&#Mq}AnwFDqWgOws=(^IhfWoF%YlW{ilrR+{Q)O{%tT z@sh@x^2N=Ku*rkH52HM^k%PgYKEvW&#yFGt*LMF`G{K5kT}`<$7u7K#kA1V({vDRQTw|uwVO_7PW>8t}qUM@L7_KXm)w-rZ`{+PC5Bvw(|JwVY zsa$lzSeg~AH)CTNdJTPz|K_~8fal2~Jk>NclrO|l2xDlA$2IXt;JCs_TH4HGEq)YM z!4M!Kd5F2^-32wxu;W+5^DoS$RpVq^-oz9*4KJuM#UDI;M24R*cE#iz(JzyZrH z#=!m0GWNyyvwmA&od4%-e0i}?TVIE!ZML1_KvG)np`2&(pJ?wZ+iQej+qW|RiT1v_ zqn>=b#XfIi@5{Tra^F1o41f6|kdCj&{uvu!1E`OmT}nkxQ)GCwI9Z$~&J%0ICULoV zx_FLwskm9ZQM_AxSmfI~mixT;uK0ntN95FW>h%;0L}TLv^0^Aviz~!+;zsdW@pf^m z_+R4tVjsRRM81Q>QQ~BAj(CE&LOfI4AYLclB|akZ7YgRj`F|u|{geF4g3J+1#6!d> zqOnZ@y|Wd*RQ#pLAHbQ9u_3{HF|HWS6-!0_>P-1mah|wI{Dt^?@dfd1@l!E`m-);m zOXRd#hB<|ktP@WWITMod%fy?+UyGcI$N0aAe;2+n}h(8rC z6t5BQ6dw~`5Z@I)7nAXu1)(oyZ|wLIEi%A6rLp>C;5DZ zj~5#xU!m|S@h6i1T;cP@izUBO;cLZTiT8+)i%*HqlBn0;#CIfrPyA5wFBIkvrfiR~ z35IkT3TKJNCK%+o3g?RhNyvvQ%;|^B=Mc#!DLh4-Dfv8wtHoN$n-yLzo+9~Lh0hkx zlYEoHo5gD+zg6KoL}N1y^?X=i&vw|;(tknnm&I2le^22Z;wO?D8)9f@5P7n_+&Erv zT54m9B17S>qWSR#dVLix5R1hj;zaRCai++Hs94UK;yL1aaf5h;c#U|Qc&GR~@iFl^ z@dfc!@lEl4@gs4!_@&6-Pg$=dv7^{o++XY?n(HX^2P!;N93hSs4;MN6oB5mTEVx8r z^Z60NYZN|BJX2}+(YCHb;b`7M~Y)aPFH9ADI#YZFwEZ@$@Vs~Zj}61@z>&S#b?Aniu@>% z`TUpombhK~Oxz;|c%6rSSWFi)#U3Jmm8D*RI8Yoc4j0XR2K4y7BlRbV=Dq`AV|x_* zk>u6lLXlJLnQn==N<3BM+SF5DaJWKq!c(Hh?c%^u)xJ~3zKg_RH{6O3#ejz%%PlKOx0?0J6li1!S7C#Z8 zUVpJv943wt$B9RXM~Sn=IbxN#Kx`13#1*2s&qTS#)+~6Yt#Lpp)ASe z%SnE(LcS!vCcY(pAo4pu>U}PLC5CuE3V8?dyKH3TOK*T!D)Mtq<}*q>RGc7A7R~)L z^kyquE>?-grY_u6twz7<^U4$Q({vX6YiRS(r@vkWSzG!Um zLcUw!FU2tLmmyCQGsSF?%g-{tk60iM6g}HoqZJ-6P7=-iJ<@YsTIMrPtQPs55#<}i z&EnPKFT`8KdqiUc80j8X_;K-B@z3Hb;%lOLPC&Z9EBvvzOZ-}Na4%*0MNAVri`_(i z6Gc7qIVEUp3xg9RpCZl>j}yzqh2kQyNn9qH=M?03j>7B34WhAKjQDF5=J!~v&oknm z#lMQLiEoL27e5sF?I6>CC5HH1f^Y{hL(CHQ6MKop;t-K*gfsmZ@o@17(L6sPo(p$y&w|Kw!JMl4btN5H~ zY&#<#W7`>gOY-gFhoX5tLwtzOWgx#WB{M{0;~8Oo+eo>w;S7#fc#=3>JX)M9R*JP^ zow!t7A^uo2ww;mx*$S@{jg4o>FH`txaf^7jXly$}?{^A6CTjEX5@ zrkE}6FZK}+5C@4v#S!8m;$h;E;xzFX@ke5{xKLa!t`vVFo+18RJYVEDrEJfA;zQ!2 z;?v@@;tS%-;_Kqu;s@eR@pJJjF^q||EH6pyD0UWmioL~rae#>1o^Q2Ld7z$~_!(OO zWqR)ezQ0XJ|9kkt#+pTi)isq%7PxD|$X`)e*;upGZ~Bp|y!ezW@XI%UwDyVimMr4h zlgbglmRW^W4Rv)`8PT6=eq%))ln$9TxezlJ8*3|^??D)I-sa^|4S~Ph zr$$16mrpF0<*^;)GB_^{ywkiI?8^_Q?s$Hi;P=unj|Ir@53IO0FOKiI{Q13y{HVtE;_!;+w*`Kt@qS+% zIsnhq*dN};IJ(c2W{Dr;F+cV@%S3+hZ9T?cVLX(`k7@jR!O3`6 zybrxWC4-BG#S+_h*>@~0Jy7-_zuUf}^8Dt6WH@c=4M!sbM}NjJZgLELC&7Eokwkd zXLz9X)#5(m!mY2D4jz|!`H#lgJJXZy8+Z7)(9ZNw@=nYazHrC5z|QmlYzLkn+?gJX z>`aeD5$Ej0yD->&-2c?*CDw;YDWQvIl_ix0HuNrgtt_d;KL2m;I;W1<9epq9!)Q`} z*m<-s9kDy<{?gsir$+2f8yVV@@^NHO%I-+(8^fO7m2xX{?Y}E+WvKPtA$E(6Se8F* zcliDQGy;24J__wg{y2Dn-TGSbh}|h8?Tt(k*^|s123vblJ_}sHv3j{SF~Oe)zO zT$!>b?V~92inhK!Jbb>@`bJTBQy6)njdr;8jiEO3L^&OD%F-8?{Pk|Ti+-S?@SM;?MzP#?@8VjZhdWN8Z@mv$sakb@02pX;CalS`PiF+ z8v~cH{!9~UeQ#uBkG(5pXL?HiT}e+3-W_-l>q(x7jBb+O2OFqjx^BTUZa47rZb! z3~k)yT*mzDi$ksN40q56fyr*~s%UD8aQ`(-CJ=iN>1TV8kI<0RH zvs&LQ3S1UweYYgEKGfPeBn|CA4@Fr9b7J|-jr)Q1LHnH5ABS(b4K@e^>;Cp``aMr$ z1f*@W`dd3LS#u9wq&pk0-(?luw;K!H?+Jeu*qF2@yfeJV`Y_P?{wNFMFQY8DF$ts5 z+7sRZja``ji~Iwv+eQW<32qFwzB4!iIV44)J>gH2H==DrBCT%?WlPx#_A&QA>*w`9 z%YOvr2i9D_D=_cA-GO=bp73YkJ<-o`YrHqPxy0`{}p=^rS1y0 zZXe9DLapx)Nojp&q=nLwH?UrIK3mRSVCgKCrN>L%aW2XXTG#IiqRiktv~vgQj{e?O zjByZON~0%DS}U#+R(_<2s(-3AQCWou5hDl995l*_TE)Iv;*L zvg4(J4+GJZjZW*~kxR+?FW~Yl{J^$vD?b956;~cNFKTyPpo_Fj~uiQnk8(XMuwGH zw*A>x4`b+nU4a9he72jhHTm?e=(e-U&V4&@{#j*bzx}s&JKyu(TdyA0z0A|Q%h;NH z9VdMEIuNvv#rZ$wT%1Gy3da|#{tdP!&2P+h^eevSlgjV z{_ub_R>#-I`YMq88Nt2)#nMJkt83ny$% zj%NlpgyOa)X&@&oTaynmZZBJtO^~{_Ci9^i?P5AAgTHEZjmp+!F;t?(G7x8MO-4&R zV`ZsJQO#(=)+DDfL`&kfCOLZ}+Q!yov^3fLgp~7*wkG-JJ2xs@lf1@96SgL2GQWha z$tkF2G+}F!1_GiZWwS5E7$uA*Y)y_})e^QQ+2PTIt;r5do3J%`Dm%kxYm#@YQ9C*@ z8iZcz2JF>n!q(&~%-Lsa@=-?nY)xk4el7ZKwkG)_#X39sqv$;5Zu&c6YqBeAmasL+ zo2F>O)}*P}KW=NXfK`ji)?_C(GGS}-4~*N(*5obd@`cfat;y(}o%mfP3~JHVWb`g? zB+%Am^lpWssSDU)_jDM`V+6J)C$p$~6?AP)M(^ure&ou@Nafe!(S)tZzHDN`*5o6M zP1u@zj#(vaP0|QoG+}G<&+M(XwkD&`s36zYWb_YefNN_qx>a=^naVjU(S)r@E~61` zYilz4ys{dXx|TaVVQcbjj?9Fu$?l9z*qYqLV8YfU&1XatwkFeA?)S1a$zMD2gVA|` zD9!g}FK50!Ta$0IGkmrtGuW{{Ta#R<1L3%>N&fg5_1T*IgpKmqn*5YK;!H&(>r;yU}NB@>7Oa z20EO9d}(X4mSLZ*Ngh{GzpY8m_KIE|=#&K-Ta)~GHM%8`61O$U`A$*4t;uxe`JZiT z@>zDHXKV66G$19KV@LT5QMNgk^tC&hpNn7v@3(A?&(a#V;1tz0DTa#C^ zK|WiP(^zYttw}EQ6!qDfq>0X`&(`DtJPv%eCg)TCOwX3&!t7I7p3l}KO%FzWwkB7x zJio2UQB?5Tn#^Vnep{1IQp0a+k`oN0>pV-6ur)c1g7Z89Y)#T|M$~U>awat{@HAj+ z@?vWIYqln%mjoi0u+RD7f7EAdaz6X)pRzR>T@`SQtx2ABqMohE3ij1E+L|1WQvO}G zCg-vR30sqSEZA>r@+idPe(cYv-TtHT&$Tt#!Lv0v4*IKOT* z!q(&=l%8d0(%gzMBN#F3R>At@U68c3H5rJ>*5v(6)F(ab7f_+C$z^ zyy#)#w?ggH|um-VxU8!M942+xBv zwk8iWYBwWzni0X)Bd>-pd+{H2w!s$jxxMMQEr!vO8-q6VZpj z)!(w>DEc}wAP zZ)4hVCT%DFE&-RjnY}j7q&*ekM#|PQzr#%0j}U&1vU`~JFq4+Q71YD!PBeNZ?SCQ6 zcm8=0StFR>N;ar6je~0n?&c=K$*u1Ss5oD}s=i?^D0f;Gpb9=;NGMK{JZ{_N9m{Z`&)NpyiTsn%6kX-y%*Pf#b}-ctz~gdSB7I8d3J%+&2zia{5isB$2DCU#v3%p z#5F%KnpYuwMO@RBS^3MMxe~5EuD#P}-;MB{acx(Ia|SfmQEK+dXGYWQKi6;N-Hq1V z7T5T~r{Vgoyfw(oo*O$=B zdmOs=$9228xlDe1QRGU?URtToeO8>bAsw$;PNxQe(B?; z`x&CojHi=uGX$42U0w#RBQxS@`nqYJMAYx$+=i4cr~v+@=rO;(oI*3oX7a}o8^ zcp3@+0>LvT4L`aWA5U|rn`Q(AB@~)+By5DB9?r@egG=N}Mw_vAn44w;1nVd?X(ZeV z!BcP;M@X}U(I(9VH_gWoybtI0se~BI(0wkhJIU4Ui=XFu!nwKq>|-D)OBd*FD`fm$*Me@GOO}wosi~i zMw>RC<))c{d&k4z+8^Iu z{Rz>}!ntKgh%-2E?jUySbCaFUi|=*_-lEX7LBfn|3@kY7fa?*($IF;m64$P<1I#6L4U6$%Gm2y`cKZ++NLSDtH8?zQyK{;~;yI0eV+@@W>|yhK ztxeD8aEu`Nh-)HDa^FAPOj|OBPMv)kL+{+VOBdusP29hD|E*klT|?-6=7RaX`&ZLb z4F_||FoZs|M+*a&#|5x{%|Jp>;tKeI1JbWwJr|y{-N5~;={X+`M)L?hhC9|tt6J#! z*p;(wX{K#ROb_1$8zp+!A|ytMiOp>S!oCK@n=}S;*wG`{652Q?-7_0ZfYZY_Nyh#( zJv^16t*&u!2Fl=INReP$(5OxEMln0KiS>sKQo?Q1$^JGS=WElZc$=Wl7P-xXexiAC zi>s)p+4|r=sz9&S4VPjw5d_wj3*nVc!hSkze^Zxz84M;RWypSd zFW3X8JcyQQs|NY(h%rXI2*pMV1 zF!B|F7J4{k3+6S6H;lY_RSP}txSL^)Ep)CaAplR*4Fp^0aYrOtNsrrk$QI2on}f~^ zq+{#cxfd&My3+lR_-eR^;4pGFtfoi3L=)!$)5znI0K`yJm{I2m)9P$n-SCJ4A5`2S%8pLhFK6gx?jGyBvscr@=L*Maw#`1+fk47? zI(G$c#nH!aXh+a)I>*t&a5##HH{f7U-)`}`5$fJ(NtDalxEs`QTV$-zcJ7Qj-u+nH zq@?&ramUI!2$9jFz$?akEO9z|8y(D}tt(8?wEc}=Kubq`z?iq>(3F9gmyrW z&v86{;3eDHDJb?J#F=DwHw=lqg)d5ya*9TZ)3xjMq_9F4V z@lGS$K{cJd!EV5%#On=Y?HxHthUS>f^aOk^@!z(4p$Q0cbN|z~818hqOx0?M*XTwx znwK75KXEUk(O)nLa>%q+8s$}967~~c<**Z>cPu)G?`Gls3h06!$;8Y*HgvIM4O22rqNRg_8ywI5x5dA+iGl^+U>|bEsVStZa-s^-0jPF5uOtJ);(mW6VJhA zqWP@OiC%S@P#s3R4A&XQvzt|$XddDJ!hVUEd4x7bK`M&3(lhZtf<}59yZlBt97(6G z<~U`in*cqHre|k!q|$gc%*OMqKFf6S^mPC~PQ?J{;pYy~+1?N}d2o=L*V)!|4$@tw z*N;y0%oL6~cc@L_P~&L}gUUO5!P2@n>P&WtaW@5(Gh5jFN4}<=t}JmH3&8$6N8CoZ zh~TTjR-iDdRAUXuq1v**YUw zZg#P`qyVm?me?3U?(HZBo~bm48C@9Xx@9`j??4#4bsFSB z=`6QW1YKvOc6SHur{hfN8op@I8LVdcEDP*1Nb@wwz#(e zyzD_c(d%;(y*}MLB2YLq%@)RgT+5M$C#`I&C;I$R_*pUBClMn}wWe|~Ofq$uO3Z;X zEqVeTcVtW@hMT&~;JCQa^|D$irdl%+-ifhu=`16LBI|#N6Dvzq6#6#vYyM__^$Owg!g`!EeTK zJg`x2&T|rdJtfiCa}s@hG@4M^|fqw2uRWeH}lWFwnzPU?zK&Z#}ck zq5~s(xMOz}ew5Y7W#mLtmzk{A9j=$v$}(-Ands}8tfAZ2GfhSC&+BQ&^z=iJxII0S zKl3ZI7vSY=6x`lWlT^kY--bXJ|c+O};xAkjLm(ZR^5DR?^Dw$gZK zv28nCFB`-T#`QYU&+!`yw~g%GS4@HC&dF__PyJX|jidNm?<_pEu-RYn3!W!VG2-|M z$rC3V@n!_Q^OhIW$;8A@2%ebq4fsT}X81K8K)`KD{PKoz>DTb>%0wRV-A+x8GB*$3 z3BlKSzWX9CIuWzrmqlpl5|a@6PE83R&mZndajqu}n@3s> zZQs3biV^Bo$kW70CZ2p&Lg>2$CxpJUZ$iie%q=~><3na?rEQ34d(`>PD2eo}q?Esj6_L3Xo?ARZN`g(J?n|p0NrSRnLo_CK; zoCMK2|^x_QMjVBujD?%p(PHpS2VKDPtB0Yhrj3f^Sk z{)ku(_YJoqzWWch>?^o$&}8-E8!GF&B0h)wbs0>Yr_Hs`Jzd66CRnh`@?AdJtxVv% z8k-W3yYGVFy9%_sy12Q=M;nbC`mP>{s>C(i`hVxy-D_sp3S&-*dm;WuufSefcO4)% z?cHWqeD|G_m$s9IAM~)XqI*A$a6j>q-}bq~OH1;3w|M0zG{V+L$8t`S zxApnXw22?V+NbS-Oju{VbuvCS%iDN^LC1$l-j{eA{d8BtT?=;u9Pco^&5QTqZbJlb zHN4G>zZn8Aj&~N`=EYOSn+tE_)tv4&+-&la?QNXfoF$oGPJ>wJ!_du5f&Wqw_W|%-am!S$G@oMGl24gBuUmz8o)(w-a>U z#ysen;doQxZJc&^JY0KyFJC@F`SbDg?uDH99Nu;({FL!VfX>@^3qtoO+!O8Ol(pBV z4&5_wyeaWEPu5nHP0=Vc%DKn0GGRa5$b- zy=^1>bhp9ra^r0``(%FkQ;^f~Z51y*e0N79V&2AcJ>7OVp7Xu4ycbXU&!?B-#Qi;2 zvvQ5BPpGe2w4}Pmsv0q8abv>*7%qs-uU%Br6w6;ed}zU(1@%i}%?;nVP81BX53Fyf zuNhcVQCT~u*3ENHT}9PGT1)uv$h+yJrhhTt|E;yH_BQ`tJOtM3adM?u`?`weg@p@w z4c%*PD-2DVEywqTP{7!rO?cN=ZfvZ(erQzJ%!eOm0b`ck6)Ruf7KQLu)SQCwnc(+c z%_`(zJ*$6UH7l%NH5)5h6^t}Xne0AgwpmZ54_C2DbFfHDAFj`o)*lPmgnAV~w2;eC z4eE@ATd+7zmL2L<3gH4RY?Wq15JuEsEUtp3aC$lOkhlcQ=0Yl1gNLhHIZ0RxDaN&j zlDVi(idjmkXSmQT^TGvs@Vm-heyn;Gmv=GC_@FGTgVk(1sjTYaSV@28g({^vjj;i- ztQgjxQKoKUe*v!FFZV5yHE}jp_lkrkhqzD}*7m`FELX*4v2x+faQ<$^Lb=Wbt0@~4 z%0O+MUUsNAmLx(Cl|tbqtI)X?(dk@yDvgW%0M-cB7>Bg67b2zF-#)->vkg{GXM zLWt3cX-+K_4u--|aC{8W`$Jp`mQ$yYI`tG+GuS7FB2cwlD%`f3OFcQ6%oBSlt#1K5 zSfM7vX<#a>In~=4$y6x6H&*E4s!|yPAT;|Xh0%)&xdKjxse5lOkCn!1Of59s7zuaD zWMjE+B4O;Oefs@6SVJhTv$vnS0C{rFENF##hn;TRcUb4FcL`gOR&1({rI%6}%yovc zide1-i)5iqF?ZRnVMfSiLC17PM%cM$wVSzHN$fS}aeSA8#D#-V0#?rIZALX0*Xr${ zSs8!Ir{TQB1t{gOLNBGa*s zp6H5kgtfQ0s27iS9pi||!r`35qd5&LlA)sx;0e;K)72YcHrcFZmw`drrrUU`Oh?}w zfIa45RleTESRaqUWUdL8hLd3l`Wl^4=QYi(HWv>>u5I!Pcf;{3iNDL*H1r#eySB@N zjq*-!p>)$qx3#^UE?k`qHFTQ@Vwie;kcK7IdKWV?iR}k@TEWSr{}8n%1Ix*I6=r{9 z{j?0HmpPw0b@1D^b{I-`(rjk!G_{lC+z9DOKIy;K(xQF0l#S&2X66)*-J8vJt$-9~ zMV`hB+-p)Kym#OF2i@Ms*WUW>ap#w7DYb6FKxjYbLY)7cE?Gf4)FbS?xhgj3Xowx> zQhQ{0P}qhTWA)8dw$WYh>V{*8in&p(IPkD!+1sbsF?aE`%i1lzb~!Vczb@3rEJtas z>+a%feXtT`T7Sf1AwgZd`-hT;hEn=-xxoHrM}~N=k6(K`clMTH>+5hCwp{Ki9NFIC zgI$hQ*wXt!T+;6F;Yw`%G13p%$MEf(#qqGr<|zV02Gzx?Y_QIumD$p9T{5Y#nr7Pt z+ITJa{i>0L>4lwp#!w&U5q5_2u{{zu1M&6QkP~;4KXo90UvJ|J?fhpf!1hnCt7Ps> ze^|Dyc_1EZ4#r|j)iErL+gP>mVBD%N9ab~2?tuA=3#%8$1}>;xR?#?rU`cG?QKhkg z^XnT1!ZuuO6%sD0t!TpHRS?eC`c(t5rdcyq+iHRgt2I^l!}AvptZJxlZmg(kJ{T*b zStk|`F>7)Cql>rU;lN#N?SEwvH?6vsSjsKFgq!iSTfA+rRlJIaxNFdvWyt=2TF}jX zEVIfNRMgc~m}L{;^DUc4lQ4_1B3?6=-m0wNVsP{EXtt=R zweo3)O?NBYX5q5`%yrt@A2Ny6K6&i?u!!3dE_P>OfzT1L{KJo&8Jl5VU13Gh*dbWv z{4gzZ9>Y?iRW(gb4UJ8);RD;OcwP`2URY9CY?eVUE-5aJ<-?X}4G!6Y*l`Q0ss;`p zScx-h)xsDoiPmz-#8}DDVMW6R!;%w!miwkP-1y4w8`f}JYdgz+Si_C)HL*FyTBYlE z!x@QyiFbd6^n{Lu&pUmaV`W+05ys0j^O|(uYq*)antiR|hJ%RHRPZVtQ>eK=`K>-n zAUlhgRc+D!c3%=o10*jMhl^$65hB0RU_NujMdFF#YVmaO9Px)W+}wWqVGTF8AL?)} z;W#=)JV(4tyh;4E__X*p@$cf7Vk!na^ZQ{9H@6>tSi{Zjhac8(LqA|btXUfX{J*w_ zn^`LW*E!E-O;4O7*dM*cek5G6!b8M^NTeG_!W|{KSwjHnXG>l~La$!olcaZwc&g;* zD14rHF^P1W75@v#ZxQd1{I?|Zo>2JDivO$lisY>%&V?U{yCiqgAV+;8qFFltaore( zeowI<33;*fhKOdZ0LTxQ-Vx#q67q8CRf%S80LYgxjC!w<-kFL&M>J~!K<_ezuMn>z zk?vL!@n)?6)c-e%e^_#}Mga6)RQN5?tOWr17YavVu7&v+oBxpSuW)~H7zz0pg(r!} zNM5OMy-3qT?6=k8TFEaUQO}FTO_EUMCXu*`Gu{eZ)M;hmg=4rSL?>A1O|kyn;mgYs7lVSCGhemG~3M&m)oV zMuo3c{0-tQlK+~7-lGctQSpBfUy}T7gB*x zUlLy>k#4)vw8CS>2_(`@Q~X@XE5!wp zHz~YKJcUHM(-nWd;Z3iZ2t7ko;(cj}vKWhUt!1{8GtRh^r+(hlJim3SX)CYsFtk zewV`ciN7T=jvo=9A<>Q(75|F(y5t{{DCcv9!(9+Ydy~X;66yC-xR+Q!qMSh_(vOjR zoH$vWD$XLISFUiCSWhCKW^uWAmg0XdULg6!;teF~b&vR{h{t-9A7=0vn)eLIAE$2< z?kbw8w2=2zxIioxhlu>fob@|WoGF_34Uqp-;WNc`;(GBi@e1)~@iy@{;_t+*;&bBP z#8<`b;``z!;%+g3mouzySWFeYHFCQv?5&ZTr|<#dY;lfQB`y#f#3pg2xJEovJV)Fp zUM^lEUN3TLFzd@{z~lqsL*nnnr^UaBFN&{&9HjoddB=65cP z|4^j4XNEbAl?-718ksD5YvguSxQCb{=7~k(VDVtlTO)U(!knVY{Au@=^w!AbR8fXG z#gnWPPZU>(tHhs*XNu>G7l|$6RU$v`WWKkGv}MZh>*9Oj4$-U@fOs1x0P6AkT9Q+8 z$OK$@nmtexK=z{^w!k9MBxX;hefV) z!213{d_m-tSIXZNjR`D-`2hswyF?p)hC^aUv9s7ijEOK-Wb|Qw$dGnnnf@4Yfp~)0 zEG`#+EdEryK=jtkyz61R)A*UNnSivR3dw<@?MPjgvE3*Q|vD8FZLA+#3FI9c#t?+EE6Y+Q^lF$ zT(MH59cR|(XW|9o#p2cC7V%f&J>sLHw}$PD3e#9Q^L=0ZNc>uKlHBi^XQ~WO22)RyO?*rI zyZE6<``Bzx4>4aHAPx}^6vv3;#3RI`#91Q0QDeT|nzSb=?5#&_=fn7_<^`nH1C&D zzb<%IVm-}!X3)H62J(R;^X2U#6O9&_0D#GDw_As2%GoLU>e`Yf}KQfP1;h0y)|h^ zDeSFDJ3-+oqIvI(e2!Dtynja6TZ49u5QeY0mKZA`O=_e4R+siE_g;6m!nBA@{VZ`m(Y)7%yr07TMH*S9{t$7Zc%-;MJV9&} zmx{Ee&GZ+D<~=ULmn(dYc)fV5c!zkO_#5#r;)|krpNst7R2WlqOnE`kyvIend5;Uy zQa9@}N<2(7?`a{QqVNpyII&!$QE#SSDw_AS2>)1NTJ>i9Ch;oqI`L-Fysw4cJqrI? zqyccIr#Wx(CGo$+kHuZ$*P_Gsm(VxwZNW5!X$73}0?v>8^opJ3X#Ud8GoK=-n$}vv%<6_&iLoW?c)35C*p3AhQq0! zCGIEo68nk$#bR-YNSoqJKT)JvafTO(O(dQbXL^EFv<&IQ%j5tmlFHRC?i*v+zVzszXTqG_RSBh)I z)5LY+dU1oeN!%jdDBddGAwDQREIuwiCB7iOEN&Cu5O;_li@U@xL@vp~{X&CiBuzt* zG!H?>#9T3793T!CM~Y*_aUvIoVLmg&_V2eBO1?;3EH;bFMejZLT7}OR*NHSC!E!c> zSBqQ38^ycD`^5*vhsCYpbK(o)%i=rYd*Tl9W0BuBvmQY)DyE1u8^QP~2cZ>In4~h?qkBd)< zTgB(Z7sQvvcf|L^9pcC0F7XSIpYogIL8Ms@hH09E>?-yUV!$uBlwI0N)ACZ$KjBuc)lV7YqJad`IICR^YRS1vSVyk$!K8@kVIz44!VIE>8J zUXO9y^5CLy-=#MII_=BlzV|*n+3d_xaW0~HVhu2z;@mENXHZMQC9%-W& zTZ4Dso)YNk4JsL2S`nxFUsq07)6j=8KH*o{YVAP_kTX`Q>!Wr4|E z@eP+12!@8Dnt@=1R>cC*(CZXNBc}qvV2Ix|B5n^<9Nv#RxmlwS<1{ko0h#DwC!apqWU?s1C$H5xSp{qI^jBx4%=6OxzB!~k!R_bg9Z*ZHD z6SSO1So|*>CUrQIC3MSv*FrTd7z+LfL3GyTNRdvz!z*W`OSfvoXZ!(zu8~2}m%!A= z7*U)_Kg#G>eu5P#QHjCSLPnM(yA_D0@^KcF6rv&K$+k+nS1Gz{TDY8ln1DtubNN}34)Z}3f%d*R(M z3SVbOeiSW&$L;UAo#^L2{fad!54-garryrXDmn}`vC&jkEK<2YJIl$z!(b@LjFZX` zO{WqBKIno*0H>Dz7@HzqnX5$ zlab1kb>x1f?V8$;X@6&WDUj16l@Il>5C}>P7r-($J z>zHYRV>^~FLRQZ!t8uBEh!%NKX(y$g#^6gy5195&N$tz5Ug<=GZdhDC^-0$GwUh}^ z3gpaA_x>?4sVvLKLbCP(B1vnR5k1%WI#9L;{rjo;r5r)2MDy=ntd zH+@DnKdy`%ABf(Jt4km!E1Q#*B6VK=McEF+^?@!AoA|-mU73Ed7eCyrWF2V?B>lz2 zkId%ev&fQwP9}gDYvZp^Kn=e5k zD+3+aIq2r>bE)4Fh@5HkXJ_-cid+@Q(-?32-zku8A~ z{><;>yd26dWR^DtGK#R*ot$l<>`V%72_$`PG~NrL|9L35JLxV|*te5RP&=s_=|aH` zP{^{MKtFPT`cx_M_UG@664PW-q(@8nEj$ zv?wK#V@DgHk!{Z1eeI46a6~k+1Nzw-A;IjsnKaMV2#KOZHarw$_FZ|uk`@_lM>#1b zdn|YM7`v01A%m=b%kUvyIGp`D!-v|P%(WIjcPG*F1X8Nn-L^*71R`nZ#_XZ&^-}{~ z*Fb}{dYVap66oaa$6)pqtmSEe3@Qh5qS>6375Ql(o0o||PHy(|+$X08(%o@7KKoU+ z;*7w6Mw8!^>^rExHqiZKl#b&qn-AxaGXq`R18!mV7W8W5EHAt``v}JW%nL8iK9T9q z4rFi=3(x4;7qUX<1TqSZV6C0a$I8gh-5NMKo9*n&Sfz8_ES#LH?d&H}m&iI#aHE}l zHZ{)k1b5ik2TBdHeMF!dXfn*w~}~PXTW6D(@I){+VDV9xciRC zs(^Dd1pD!<6S**u%$>X6&zR5Ufn=8Imj8g4sH+wJC4_b;NKp@)rvWp%F~B(ACKTj7 zMGyOZ%5~U$Y~-)ue-g)FQj#hVuzJpCv4u`H&wRGslSZB+gPfjSO)wA)9)t$qevCI2 z`+o`DkX?Y%qo)SKmB^)6Z|JR#@nmYnc$aR+F2R4~I~x(va{@V>qGQ{UgORkuxpw9S zh)q8cvQW_dzY6|tDINN!CqDsS_I8Yk4g=D&&R{O+P`;_^FfhH-PY@Zv$(Az&I~1mO zI@5%sR%8V;9+VzB7lPh4C#>2q28h(=r2uIkjl11G(=EFspT1m(VsJSu$}a81lFHx? zrHt9zgF7UWB-CMu20&Q>0(nbq0OOL5D_gj44Ae`Vd#Gf%a# zzxiu&-?L7&tw7RwhjKs^TBB1&rkpV*&FycD9c~zYaHkk{b^Uy|&}PF}!9(5@f-3DT z>O;gNTop|kT$^)h3j*yn-iE@=If2@t%x10_Z8Bw&X?rDMEKJe+m8Qp)dYCNmFaCs{ zINT`Z#`=2Oa0T_V}#sI$0q*oDmB-LqlmjLrxBi%)uh06VB;8 zI+O}Sa(3?+>ID07)lCiM3oGiYY52()Fe>*9d-;rPxu%rb8H-w0)ntrEHKAoRJT-R2 zoS98EjZJf^7FEE8SyAyEn8i7vbk5kx(6?3mfos=Gu^Is4uTsj(u9uxBzyZsu~(jsHJJFrUi?Z)FjMLmCs*P z!T8#y@~Y*qHf5|QLroQPjcj?Qp_X`dwW=GIRI3KU$^h`JwIyMV21XDCbt_8M!NU<(W{Q`k3FyY4o2 zvcBVdGpPL!0={9-Dl{xX(P$NIWSJgsTZU_1tiHCPvdL;%*wEMbl$t9;T?V~;4GVJ$<8*$3G-S_U&Mb*+5WFR6op zH2wn7#`su0e&@g#@C=icyLEt|sk#=HuxpVoc8?it=5VX6FR!bqUt3e{9d72g zp19pJb9S<1>#V7U_R(;REaAx0ZYYjl*fzm%B#cOy6Rp(GnahxyB>nawZqtV-O zlW{nN%W1L^w&lz&^(@UXtJ6!hNnIs4AM*K&mkt?NT|AUQ4)^~xGnE*-JTrQy!o@?> z<#p`x{}6j@eC+Wy-rpUP7CkNSbK5$k7=a2dTwvLG@P>vRHgK{PPK`|N5J-x43TD}z z?QEy3-OcW9_ptX5^f3=;UQRCkqM-HR*Zx>6Ea(s7UJ{pf-{$Z++_yQnFXcUIV#EE0 zZ*$_mjJiU{+(su99P`VMKaA%h-{!>E<8+0NmF|n>y>7>LVcth4Hpk*ypv30jm%CmF zvX$&t+FTo+h&I1P?c;P3zaiU)AvW*2W$A!6c_g7&K1=*7w%PbTh2Lb47AK3-#Cam0 zovBwZE)jnst`*mdSBlq(_lUm{pA?@L|1Rzpxy&=m@(`%>WvcpJ#_j}h04SBSq6lko5$)(3jbAnmBc=MQ+$_1-M$d9_Mi!eNTknDI7{p%d9K3dTRNm4 zDEV;7M~a7#C~uzPt3{kzwCFJg*=d-Mf9gg{V+a!2Sz}WUSFYYJ^ z{P~SXe#0?NI5&o4%FC}DelHEY)?LV}3&xbUd2t-io}Y0~;~3>N-P^o4j(>l-YkI*R z1Y|6ia0 zfj_@7u|$4oQarzF;P=wNYu%6hR_>!;u0WhWzbUcAe&gMwSHEAv&-^$ZxDD@!@6EU) zv@wqEe$mtWGJD^1u6{2)z--MJR6J*S8_VVP2%Nuuvtx<&@^03vALrHJmSQnrwoS;d z#0!9|8#mI|4c1oZ6+wt}`iFHLi|9ZgbOA-itjK}gW*Lz?%PJT; zf_lM-xebkmb}=p*;h;^-xynZWJ3An9Vws#n;+%mrn15w1Nzou@Ogfk0U)woXhoGLe z(-Q@IbFL~O@#b7z1O2_{TwM&QH|Hvs{_mV~bs+Oh%()uRpl{CAeJoycu2$k~wD+8= z6OqE5bM-cS-khsev@kyBY8@lKY0gzHBNKD3{)B|SIaec4=07{pL6v#`r9|> zYAH)g%(>d1rG4X^D;tgX&AECJ`TFKujb_ynbFMf;?_1_v4Ma(aIaiOe+;5(9broyr zn{#y>)xT}dRT2tM%(*iCotSgQCl247t7n*5V$KyS_D{^Y;?%PEoGUY5>$~P$J&F|H zW6sqK*6W@QW3m4@=V~%L|6T?6nsfCl?&ZXstAm&}G3N^F+4$#N{fWWEoU1A9?0?Uk zt4=KUADwfxoXUwgS1k-C=3Mbq?wfP<2EQTXRvl~Ug~=jvkC-#6!q2DJQhu6SIvnR8Xg4E%Gh8hIA*&$$}Q zEd6t?@+tVwo^y2vo9WHDnt&E1=3JR`iEqx;basGm&ehFK`j5@IqSY_|oU5}K_RYEa zfMLwJGS^qmxuR#^bFK!m*L`!YE@IN3B<5V5%36NQoU5JOC%!pX&$AWZGUw_w#(&G4 ztHT)Yn{#F6Bl+iCEoFuLbFTXG`1a4ax|>z<&$)Vm8vZ#~*HObi=V~}L{By1jr@%kw z>MYjl-!$jyb2h;@=c=6h;QP(F;#ub(oO8uFsQ<1xSF`>fdtU-rRdKd`&OP_u+$=YH zxB-%IA%vZn1pyJ1C0ro}S*3_b2w4co5|aRtBH#i7Qa?zj0zrcoceL)(R;`L#ty-|! zTDOl{H$d`%b%|2z|2#AAx%Yr5*5Cj8?DunE^340r%scPQnX}w;<~+k{BXh3E(stCG zt5eZim~*ur{hY;5td5y;#kpC_gM5x@1l8Sq@Mc6Y=V~kx9CNNNMULpTX3CXFJ>HzF zpv<}Ayv^t?390-g#5q@F@r%wrX3kYt$DFH)%#dTxx!Qr^-*wIvtHPWs))Yb*j&R&L zS9IZDoO9I;jqi$Lcr0{s&J}*3ot$%Za?aJsIal9t@%8_yh0MRxoGW{6^Z#vgu8x|h z@NYc<3lmt>l94}}iCB8g%kX59A8tBUWaY#kXg=2e_@t_@&(h&*b$kXc(|mrkv#spO zL~!+g!Az^t?>EQlgwv=_IC<*(O$gMh`r1>j^!%$I$yBTGjLDO8u6R-Twxxkj&bh)5 zFxgJdx%$p?uD)sUOa0Ot=i?uG&J`c9aBc&CGZW7iJWp_j;4HzDbFOqhot$%}`(X&4 zjd0wI5xhWfp5P^dKNGx8@J_);1YZz*Q}CeRmx3qfT{FFrQUD1jT1{5D}ZtiZ3LiN1!Imt)gBtn2>EJmidLx zDhCbrbNMUGt(pfl-tYPIDclp&d{(+fx8Kjif>YqnbFDD&QVwlfLn+o$; z>9QsM-*UIS9&itt%!*%wf=)-bn9%W;8M=@;f! z>GBait7|Y@n0!`hnjhv?>GZt7+su!-RXbFAgwIN+4-D*QI_6f9&c>A;;j_}GlA(d_ z+_T`b()o)t&k*>mbb5r(O7mq!_^fpPae;@>DV$ry&LN-GeAWj(tBX{95k4y(N=NZo z@fcBjR^{Bsm|I1voul}y($Qr{@mY~#$I4cGRy-8+PHI7~J9d&1=^S=a34HRnS0F>G zc`q~^ppL9m+57Vjm5JpzY$KUap3B22{wj__bubH`RV@6IGiH>U7mB%6)o5lqr?aZL zRX;(FfI4?$ZWRR_<6%B4-GlDHwd^s>t&$Oe8rg7l$J}aISDJWCmv*OO-fh4l#v*MYcqoTC~pA~m*$2!^ppA~D>_1|n4itt%c zm0|KUphhuV_9i#=63C5W(iNVof20;ndN**)NUO*>$t1qYLJ#Y4m{KknwI*@mY<8 zv19qH*aq-f1z@HZia|O#x9a5Fs*`+HyfZk-XElFeuztaUxphIzp$Jyan^{>=QCaad zwy7WU+^VX=f|Gn!C;6-*JUQRaXZ5}2is&)+Bc#ImAD?>ll>)4zFtCRtEp1|uDn%>AWCy`on)};TUAxlw|v3;`r5Mc`XOMDBm3Hqj=>6# zIq>`DD{P=+T^b+fS9}*xsVyCUPjXo4zWATxu+kUEZ{o1x8RLhZPc;Zl=6o3P3aEK8 zf|CT#7n~_LTX3@eDmFMT9v~#oIYl80!a`g|Ud+@u3m@1epSRgn|P_6fee5E2U5WGZio#0l% z9fB_izAi|LZPxd>pbyUwC=U=U666PE)Xx^&Cdk(c)W0D3hTs9gF9f6Un1uP#1=Tui zkjq8BRFEH$GGB|}U4oAYJ}>CS^A6?%eYL_I!BYiC3Z5%iDY#H@rQpv6ZxVb!@F~Gp z1m6|>M9_mrkE(vb9KrsAX9-RboGloKhhZ$&Ua-610Ku~aD+Fr=FB5DOd_?dC!8ZjD z3Vtc*=c8BDmnqm+aERa-!3zZE3oaL2FL;CCy@I<0Ulx24}5L7T&>lgKuQ71_+0?+n2r!LtRY3SK7ID0rjbeS(h*{*H)!`GVjcB7AyB z@B_hvMAX|Rvdw8_;!zy+aYU4}Ijzz}9~8Ykzp5u?)Hh1fO9XM6QF;t(g}fFrU!q`F z!5)IA2o?&41d9dvR+{Di7jstea&wZi3j3KGE*om=j=wkr@ytta{RC~W^YL9U<2W6u zjrn+wWp5mZ-1;D3SQ|qTxMhIjhxXecFb@Oei3qlBM2!;aFt+W@P8$n_(_UBD>w$4f zd-TP&SBkh@22r&Z-gn`wdH}~Fui^G)+n5K1v)+@cgNCy!Gq5@6g!32VGZPd3RIDwR&~PXlnL(8qKEN`^;s=q1l&?&l;E+ zf7tEb8d~c!4_T(~aH98xw!{@<_q#fnhrc>)btv|5qQ^K8V~q~oSmav2Ib>~o>!7h@ z@9?y0>mGzV@Kep?m91bJ`s=mvnEvdFrgzO9#zry>iKw$lI^g>`>Rb zeNeyFoZ>~TU5gjC=1lG1+HKC_)|;1{+8Q<0=w%$5ereRIp|(u4jzHO z#^FR`+(E3qb~w>WIT!_tD|@9J^v29WO%o4#P~)mzwXHY7+Dg>8eeH;YQNSyDjXM}M z2Oh+9Z@qHutkz#FsYR_-$TP5Y)ttQ6D~fAdFJ0TvnmuSSJnYuGy~9GZpsICMOjYYI zrgm$+6?VME-C8g2m3Yv*q^k9nURAAE%*k){Of6{5?saPG<%4Qb$D-C-VC&Wn4XyOY zgI1fU%T?UH)heFV+GT2Yv~X6dF{pcMaLItyOFIl~^{lOHy$rq3rPzY+{ab@`#vSw^ zt=p3N))nZL%TeYR9ng+mXajt|3GH2l-o2q0+JSbhMmw?x<+pb3P=Genz~{nN@0>+w z|EaCMscg&gkIQ~JE_8Ni=V2qEV)q{p8Zo=j|GN>;3$T1CEw9D?g14*S**3^G!ONA( z@hk!QQE`o2Tq;Uy`=F>7Z-LE`;3(XdgVh8J^rgFPGG{ zUWtC{hT1!$RQIV5A2#Dg9&``#9JGqP7@;1FIuFLB=b&fm@{b?7%WQrVW45EYsi?Wg zXihm~8F{-s&AtOG42*5>kj!aWZ6BI*u17y$oT8R)OP&FCZ}l!&+`0;(+Z^|OT|)Vx z-k~Pw%|U!5M!OfW+DmG@iyVo1}-?hDz>gc z*~lElJZ5lv?q>?;H@L>OuYeKo!WC2UdG6ycCSTO~C>7y_<87T)!!oiKXGi#9<)uzx zQJ;GnQ#cp$XkNHAuxMKUff~UJr%Zf^{Px_%IY|9FFWhoeZ}Y;v2#Y7?g-e5{4qmu_ zQgrabWz&f8!Y!iludT(|6I#s+_ZDI{FPw=MhI!%MhtY55g+oIeyl`sTUSus!vN`{& zyl^CJ3-iJ~M+1?yIQvqJ@WOS4n+{$$PS$g*#i?d;Mb_f{0Da-$g;VQzMtI>A+gM~R zPPN3SV=Yczz9YPFY1pd{UbqJKfnzPsi<#`;h2ylPZ{>x%4z5Lb;Z%P|c;Vh=nyl`~vU*Lt?1y{qoaL=;8BD`>y(ao=|#km~Se-B=`S@bKi7AI-6zj-ar>C7DA zg(GLVgBNZy#mHKm7t>UP7w%Jf9pQz$if#IyYjJkL?{)_-+%>fPjcakL^#mila1U`W zMR?(!rIV4hIJq*rgBNZMTNL4idx8~xFJ8EwDCyvZn@_tAUN|+W&A|)z4$~dHa7k>i zgBR{iHp0OR_gl)2wK#91qYhp;e$eJzi?flP@8E^wgC{31oLbk?!3#H@_8n_+dRgAF z7UzqU9cyuBup1q`aB5DQgBOkyah$wxJg$!7g&R+UPF}cyR5*Fz_S1xu7mg3Ve&oDx zYUxUw7w(T}K!g`gol6|NaB8lmgBMOQ>3tI~+-U5c$XcAQac4W$;#3n|9lUUlvgf|r zTAW*H%E1fw5sNx_;na$u4qiA;Pjjxt$tn3xUbwxq=ir6w&2jEni!+1y9lUT~(Vk;1 z&P?Wa@WS`q=dH51s$3m3~GPF}bX z9D6?yFWhie@8E^wL(uQZ3&*ogm=`XAJ@JieadIB`55)_|??xQFa9l~@C|)?VISARD%x_+zNaUV_ z`~*T*`erUqWj^yKIrPk2kxEN$b^$`Sng+wXRAo2~BB_wO)m&(pm#JKRP&^eOhi^8_ z%e8ID%a#wWpIaI?d1G}wXRIzWXm9u`4S;#Dl(fZJ5u*D z>5?}Nyzt8$C=;e8dbJGo|5!I$SGl8u2E%ILta8%BkiqKWw~(d zJJc;;*|n-HXSi}vhn!-SPnCTXG8b~dG}u2APR+`aI*#WT$Hw(YO`auS4YRwMqW>CQ7&XQdhO4N0e5T$L8yiLury*Fz zqWTs_Hfo`vg%J^!D&bGGY)mG6gn$w?EsVs$CDWKf;JLyw8kV*&!X`man5&|b3H*tx zvM|EdAPZ^=Z>+@WKAz(u%LD>_HI4IGC+#CjV6cpzI_o^&t_WFJjjj_}B6afp_}8{n zXs}`|fjf*lmB5r5b_X|D~t?M`iX>dl)i3h3nN^r2|Z+p$y2;ZcOv+*i zz&^^i^=Hv#zP4c=?*Cs)oWAq8r`{f~h>u}g7+l6;g>;^JdyFD}j@=HHwOhbEbkwoo z9zk#G0PJ$+r@xnJKhJ6e(pT!~ukO$FXR&^cFxs?78saCc7p6QO^b?o1lbRJ{<2ozGMD3l#$ zpP|@7o}g~mEjfpGwLE&EFL8M3I5d?T7_7N7-qDX^*pKgN{n;D^L$%+d*`D<}KHTB=XqZ)-=~2fh z`pRqYq_Yu${RI1Ch{@V!3G4c`jt_eqI9S^(p?&_yK>iZ;*Ao(V^jC?aUdMhyM%7)rplmVg;;%Wz_XCTx&0^Z$ zC~?*!ttxi(SFxksVpXa7qs|K$U#vy?tC+1jM`~ezeX8T*SetG6c-D|j->NFh_yYy) zK8*m6#}avq;WFxKh^z zY;N_Je|UXyZch0S4sXloMeF8~c)!~D$O{k66MWZTlnWqEkGkH))C|Imcsm^h8_jay`k`f*@i^K~JhR7cuWC9xDYI zQ&Q4WQan~#AQd{()6pu-4F)~&)*3U{`fOPc81y7qoi7{g@p!FUmaX@+_ge9$C(f$P zh2|7b913~7`Dtm0SqY}6oz;+w)Qg!~;A!V=?};n)v@5V`a;?-{Piz6wF3jz%ibz@8 zMnMW~r1YiPNUR;)OG!)j#G;-k?@CX+!hFcq64T@F24$hAqc=AfKBwn;(yc{|^<-=! zV=owt{%SemeR_G)dwcx!Bi&k@i?+ryR*~C_s(7SYnJh9jw>MI(`MI!Nke1diH8oYL zEl3M^(!Ex+>4`7!q~{e_b-A{^D%$I$?a^*L`hk^1dGk@&N;J^}wh(LfktEt~r;Wy& zy(|!Ypr26p!d&#Am8hI%i{MDO<$kY~3J0vY%3ixvv>xW6P!;4MUuqu|$P>FMtXXVE z=UNx#TG6>MM%Rz;8!DHSbZd#T>O6J?`u)=7rY8&IEY}lbRR^)VtgIjtxP#7cxJfx5 z-kIpwgj`f;#j;CIMFsuPDY^^jujMzjJ4%Q)BPoHN;tFk{ehvoZLm3ra!j;8({T_eL ze_wrm8HK8Gxp{eTT=x}QpnN?B^U-(Oc~1Zbnsxm$3|{MPQy)Y$hf$BeexwsCsk%yynFly@d&PCGIX`QDWkY?QhJ2$G>(|dOn_J4Y>s3l&glQX;?_da@SyeZC3D&Du zB;kgTQ6Ky96Q`8o+ZcQSRbOdTl`pKVEyN1Pq2N)qJ$Ae8GYXXT!7Mvu7z+`N7g+E+vne>-g0c$>Ag4GF2~FSZkbh&bh%6 z`2&Ija|?3wg9Ul{1M>^=3xhqd%4=m=U1iVU`LoK)`wr|ov$kx0d3CV1a?$L%*$d_e z3;GYp8_@59VBdM=H4BH7FQ~8)<+y!OzeQ`H1 z1fQH$Kv7m(UOfc;wrD_Q-+8^OYH}-Tf_-OIEH109>RS-(JGL;`w`%@^zIFArv&&I% z?(DL<+4E;XS+#I}c|Ck^vOJ%V^%jl*3{P;r5q9X zwh2wHzyOinE4|Q&aQ%lr98?`$RtJaXRjNT#T3QzxT{03Qt)kADzi{5f`m$M-*g2(P zX8zJrouO37!?6ozH(;DrRn=8uS60retesUkzZ|=bJFu>@Tt_ZedlI)&@O3`M5uH?H ztd?J3)!9S3bWz#dg%|`ir>fCjhg6J1J9Xa7$k;27eEX+NW8{~zZ`BZWe$|CBi~}go zsM1G@f_yC%Xu#kOQ;_2jtA>jUW^zQ%T~G&KO6w|SSCAY!39L6k18oejT_Jr&HJ@B9u@_oY!+jUy(gTU%SM?W&BuyKC&Bq@_b!IV=)ze%z2(8*x&@`xIAqZEHAUQE z@~toGWANXA{{WOUS`AevXdjwR41w59@X4PTX&8{mgZzwZrMl7hr$pLmNxg&X6 zlB3@)2Kz|6P+w_qpmLAk2qnOby==$)d1Z6aAE=nUYn(M=#GqggUH~R3Mu(~ewZUOv zbr>nE4#9D?3(70&>K4@21qb%!rJ?Ud{czr%v!J%;_q|@= zyIv8!(zhz=O7CjV8uwc3D%aKK@c2HSaj~B9F~j0VS+|=p@qLDS$9c!ccO4!(EFT8S z_%qWmyCdouFtYC$!|RV46YYxeCA(A2G&5kOo9)dGW`>#N;zPD$H>c`{;Kaw2cE=X^ zsZOP(ANYpTE%it#EFztcOd^}5UW++p_F!bQ48G}!Y}Qd<1+c#4NFrjET6sC5vhZ~* zKAlhxY}o(Fe6(=<0e+m%HF=-I2b*}n0JrHGzhT1Ee}!p+m>O@m@G(OU5t;gkzEE(G z;F*Ga(o8#(1kV$kCCDjZOy^7k;^l&?1^K{<`Wppr5&V_lZv}rZ_-Da`f}aa^!oZ-N zT){I0iv?#0&Jk3PG3k%U+XR0p_^9AVg7`pL*^lP~8kAF$J%H-rK2R;}4CFfrrk^KR zEqIdaUiZroJfCI%j1jy*kVK8tUn2N3!RrL?6nsSR1;IB34+?%Mc#`X0_vgPW*Zo^D z+W+^6*r)piTZwpVtiHhndT_3y97DwTQQu%fZZG;Q(W`GTq37D(iT)Ll|04L7==X_yQ1Bzs ze<`wwb2t0NON2j3BBu#<5PgowJq2?`f11cc1c!@$jL72!CyTyJyjk@3i2Q)yuSNfq$iEZBD9`-R}`f_Di%AgHc)$oII&PYJ##_>$o3 zg8wP_f#8RNe;52rkT(mgA1~h(#tJ3~rVC~WW(#%~RM%6KFA$k)rqiCH`22fbz|Pw+r4Q_<-PZf-efbBKQ|UP8p>gE-_E!Ej5wv ztBK@BCngDI3U(IkA=pQ7px|IZPCsS&N6Le!11!bRLqF}0E zhG0;zhhQJUeu4u9hYA)6mI#g$oFX_)P;sH4{%VnH1nUJk^_u=|65J-ZU2uos-GVy> z9~OL4@L9p#f-eicA-GrY1HlgkInA5(#|S11wiC<}>>}7pFjug@;2=Rx5vRRrf)#?* zf;EEmf=dNg2(A`fC%92?li)VN?SfAVJ}bCeP;tA!k2gf#EBJxnhk_pqwh3~|5dC)x z#t9}0rVC~Wa;iJ?4-yHaJ?N3d3Kk>D~x#f^h}Yel|V@EXA_g8Wo~_MQ-YPVhy+KMB4j__m<^J5BvQ zL-~(H|ApW`1-<-zf^_wJ4VWx)J3;k(4f-x3_Y%w%#A(TJ;n=h9=OHS4xO^$J@841> z<8hmPzi;H$T|BS8Y$gy-pcPizF}yRugJks#KX+zbosmmL?r|Qh{rgkT7#-0sxCK_v z0Rcuo{&8%${Zm_K{AE7e7OCynd`#ok9RY{_3G?+qo@47>Y8yuy_aC=n1lu;{yOHM= z{)m&!P76WCA!iH~{fb<}*o(oz=a?8i${ziij9`~R)L4mu)6H(ABdyvIXTCe|DE17D zIeW8hR6yaZcLsha?nOS<%lg<3;$j5545G$9eB&2nL^eCE4zknU&|!LP(;g0)u)Vd2 z+hq_nqO){9#<|&Ps}OhE8|SdcZnXX5q(Zw4qDFhz@-d`b=sQ&du$*5!{HUS zcPrv7lZU{~pM%NEI8N=2X$bedF!b!J^I^(?XpZyM*eiulHp)rEcsK@*G&<$=cB6n&8ik zLuXy;I%HYb`hua1e(6oIp+RQKwTXpk8#Auy*aR*Qt3#9PaGZ5x`mS_;W1y+ymJXXI zv?UH6hA^Qm4j2dY0ewI>&^X5eCb>MPWO7r-()E)7S0lejNLFg6x~!8dSRb?WNK(;XggxYnwYI`v>7$i+T25*I1**LHol3}XO37S zW1DkBIiYE7*4{Vw8U3C+64ej6`?;F?gia0ZIuc{* z@oSzt;z3zAa_I8YMm}}KGG9Dm&3fvHYZlAiy65`P#!z%~%9cRO3;SGV{APOVI%1{7 zH>GdsbzfrhqR^Xd1NV;Ie|ao8OiVEU-0iy7-C_=UtIf!Jw8+)6>xg&c^RW7pHurB_ z*Z%&9wT7NPhdOA#D)e&bwa|NeX!~youFXl;kJvxbvaWkJA$fB`OYDrH`$ro68vLOp z8N=GT8e{jrdQo1(u>GUi+B+tOUQZaY|7>eyTV7sa1NH!7*@?X~lbhN#|7N&*cVR<9 zV`5W!sN?$`LhYNa1D9Ftn+h8`Zeh;Ef{u+Hwj>sGXbj+Qpt1cH>|>;33>2m{`SI7^ zl+kRSp3$`Yv~T`X=s7Shr8eJwAl|eNTxz%F_v=D5R&u9_?p z{TCP7Fnr)|w~p-dTeGv#+3d0LxA=R=G&kH=vfpivj>_GG`s3pdoAHT-i3N*BPTc1+ zC+_o(91a`~JiMpB*{S*dqC(UXIAlfncX!%io|#hpJVtBO?upgrDbKgL^IW@|pz-D9 z+)ZwtxGi>@YTwTfp>N~N)5s@<{plLs7K}qL#|=k79|O~Ysle2@eS4k-htFKUeNK0q zJ#k`=tHv3b7p!A9Q16uBoLT@zpGsU2-RIzb!qq#ScP3!>Q4bJYo|kYTa9@JV zVE3tDiYuytnbrHxG3mVggX!n5%+<>BW83oz4yK@X3rj$xP!C}7ZBs@^~Y$rB$^^uz4HH@$>*qsL3a7yqdZ>ZE3gpRb*P&U zc~z6Kj^T5tO>qG=(7NjH>B)@K`k(1psaJdE_Wu`l4Y+`osZ^hzj)4n^oh9oS(r^qP z;W9`K9`{BFSjR9Hu8<4p35fm#HgZuC#AZ<4N2H7ELcuLLe2T{hkSF~wb~ zm$;7MMv6~ml8eNZ9rW*_sb?}hxY2cGcl9R&!3ESyi9P(khe>b&jZ|WI9YbAFcpXFC zfbcqoy57P5VKnu}q_b7op?*Hb0~gTwN(`@Ks7)357jvh-CO((=`GFa@fV|kVT*vSe zI{8-eRAk~hhF3B3+i@FI>JZcLL?K3oantAS3V&I|E!mio6(0Yw-mZxq!6n3*@oE-~!TeT;L@( z0$f14d}4s#+mH+BQ`~uT9mA*SD7b)hdS2jM%2>xxJ#fkH7kG*FfeT2d4-AZBFJK+R ztQeLb9Ee9FqQC{DPbEVG!)YH}KstX>Ac5t<1*FqQ1=NCR-~v()Y_dxN7qA<_1*G$j z3%p7hTtMs`u46cbGS)HNqx_u`;BiGRARbC;9m7&q04^XNBWfMP5EbA8>JJaqI)(*o z61adG&^2lu!~L}JOIOTrl>?8iJ#HQfdMAB_+>V{3L^_8|JK&SY&7a4qW-{U&ppL9m z+53|VwrP7DwvkLI&po8h{v3tsV8-c#$K{2#4DVL68^HziEE<#E5j83jM`MA9V7J9$-b}0$QXLSjX^l<^UHE6RhlQW?&0*fD4Ew z)H;UaSSPrEv;ylGe#%CH3rH)lj^XL-KyU$R1=ca-hpFTO(h96&xRyD<1*B`?I)*pF zJiStViggSr(&Drf?pB$4!;T{WSh!QA1aJEN8cLF2OhU@kw_e1N-*3=*nnMeDXs| zb_H7DO|&;Y@hueM5{Ew27#$U#_^Ohz#NixdjP}KQ$cCOkgI&yY_S|W_o?s#loyKO) z#$9zbXo3dyVeA~JLI_>?g3&xZiRQ0?davDO;Rn!%!e0)z#_M4nE)-h7)a$zPBA*Ta%Ayqa7 z(ZkdYLuT`=gx|v#^7$V?=!W^Iqm(DS-{*xS=NBwFDvjQyqVasXPZnXjPVPN?t|iHpeiFl_m+p@CYhAs?y~j)zqc8q&@DAYdpC zf_o>X7wT%n#-0&tp=;djj0igo3?v|BbP9ftq(DCyE=NfQ&uL2U3z)I7gJMsQJuTKm zwrKxR#bZo!bPDycosH2cr@)uEl%w+do%si%8{%0Z#(6j7$DqMybMa35Nys1O#bN$r zmBSP9ASKP{4mVTN% zUq%asRWJiao%@$RjYtg68K7Dj`Udc01eNelM0BGz4CQZpy2VT=eEiL&J+uAOPoqKR z!iUngBEag7<&4bGb+2E}$V>$A*bq4T2$|L|Cs)c=ttW6+k1EWFnj!;w7b1gY)GTdb zgwCU19c@^@oQ+{SptqZ&46$8o6KRC(wyA_;TgImy@QxtupLA>%ILOTeZG_%SxJIxL zu8i35!omnDc>;kC-%aCO!f+LxM5s{FaoiOyc#B>xN(3e=&nFPrDmd7-%x;kqIGtyP zYQ~15Rls!;CvHLjOH7eB8$3RU-x!vCEsS%Dj!utjvAaVVWq&-30CpR~(+Hq1s&8TB zMJ-gcF!CoYRJSnlmKNr6CZS{Nfp{+j7$a05pwe~A;T7XD)HgYXx^(AJoyk`M%#NOO z^wB8x5jzI`HH!Tbgb$3{-2!$XyH^mkI|W2Rksg5%=?(~yzM!E0gYEukSE|;a; z#0@<5vrBD6J~;gWf0lswmglyK+^wT_<1n&TEZ+;=ex;wz z_Ow&&nLY^h&rm*$C$JH)Y`4X0)Z+BkCEOezr2MY6(6Dh=BT!SAMNK25O}aQ6e6Na* zXB!{WQTyBg`}UB>85EAI4W6Nm-13l}zQh>UUesDZOMNTY}?Lqhp}sDT5plVaWaoeo~^NecdFAi zXM*BVv~xMAvRWwIivafsJa$z^MxIB&sbCUmx)|S!fP4g=1MMVxm#K16Kk_M8aI3FS zl~gf)t{w5yb@@hD%vWD^XxWPb@2El(2ppJ}0q!k(SlVT| zzi&lA*+a{uEae>t@SDJqhGWlcv7NTdMovhRc|ux?;K93hw46~cD2C&ja18>EcT=6Q zw`o0rCv29;&kdiu$s=ZuF}t3~`D!vx-A^b3;|cE}fQZcu?^XOFP^+Je0%F(^m2uQXE0M)AzI96FdkpmVx=L&T(=O~3Wd$6jebU?3gV6p&_qti5|+k+I@?e0=$ z>_G~>Jua2wc3V*twW^KIS%w>yQLS={JKK4{Q67$Lu>9&Wo^?5aTM0b-L#$Gv|BXO#RaZT>=P437Q0Ee9Ii`USJ z_ArHSyO-@nsgE5c=^M|Sc4o%q#%cGmZ*!E+VHBv1&T{)ESNot6-W!F0^CeC%Z$|JM zlbhT>X>v2pGkq$kh(62vtmiWIH|rAPQ(w<6ElgoM?A(m=*rHWp9D<$3IGez>PCr<$o&VeFW^d`;tN%U*nL8Q7k-!fWa28;V_v$F& zB^8}cz|8?NOlFn*I1g7zg1!V!wktknY$JmrBr^=w#y4dsM&M_GI6gRt?$=QQZ6gCA zQAMW`*g$9_RfKP4T!tk)WHeu`3{B-;)`q4Mw1ejpLdww8h@q({<=8?fxk4G4L||vT zjGxZ1$18|H?aVxFGxvik_fH}@CPs2F#v7Q*;a0NYW6hpp<(S%&Y&I=-CdJwTLK?^O8vqBUG1+9AK=}4hc$Lf*ztL2L32OL?T z_=*ENQxFtVp7@?*_5$q@%O@8jHeba^eFeg)n5rRttvFJF%`8S&=9B!0rzcrCn!D*I0FXRNbK5S#^r>@;ggmF_H>rk7TIJw1vep%J<(t{aS@soI@x zASxrTS+w^|skbkMvsp(P$3 z@_-^NBk1vUhZbWf3QTIfu>a!wdU|z+*^FYPBJEPfU_|qTUP}!SYvpn?h&=^Pr4{BB z?)YFagd6BXv~_UV6to3=QP-N+JNcpp*Ms@3+J`;m@ecMRGjmKo(86K=dA!+au%bAq zbVUQn)E1SY{vwfdY~cJt6WMM3rPC&$Kjsgn0ql?}bj3t;o;kR??xaFRnwH%g`cqUi zAH4&LvUtnSou_q!8B@DuE=Z!#ap}eMnFBb!Khk>AqQ{@4e0jTvAze%Jlg1JxQ6Mrg{WiZ%H@`*{f(52+JM&ccD-(-YkT4r7m5td-n&9#$%>!SXJws;JoR#`dTTH#MV{}k{~;SW!; zRkv^+n37J&wDnyHh@3}SyZc0M7Hkky zJP=6djAZ8Hmj}c{f?o;7V`3BanSy-;s{|Jct`z*a;7x)L2tFnFir~9~p9p#|;8_os zswL(Ko+>y}kh86rUMaXxaHZfig0~2Ax+e4gPH-+BA5y+p@JhjJ1#b~l-}xioOCrB5 z_>o{Hj!oL>D>y`OjNk==^8_yu{F&f&f_Dl&BKV@O9d|#J?FWx+4Mz_dkYQ{JVS7d;CR6qf)#?eyd3piKdM!7qF}n9 zdfkBWmLqacLEids9G)u3`KgroEeKIvH-Q(3Tp?I3xInN@kaJmCZj0azf;S1?EBK(` zF2QF6Ulx2-@UMdJ3LX?ZEck^WUxBe+FRypN7(vdXr94=0gy30%e8a=^NrL?BigKAC zUrJG)E4WbbV!;)HeC@-0KND1+jX>TkGCv4m`ptrTPe++wQV|~zRM&CHPl)_G!50Mo zB>0-(+k)>2a*iZR|CHOnRR|Nke_^#kS!H)z#75q}rURk~C&MI1~`w#q{Z|hg8Yt<@+iR)!E*)A6RZ@REm$L1 zFStVR3PJUe7VJJQ@(Y4{1pg}duAt4Abx7pT1-}%G=6x~j`2{ltI}7#@>?3%p;Aw&* z1xE{x6PzSiDp)Q!M{vI2V!@vZUM9FoaD(8_1=amN{JlYBb>9#99+7tnJ}kIP@EO5l zd9~gb{Q*IKJHq}*6U-FsEZ9phSMXH9(*%bLh6Io0(K=7`7YJ4eRtsJvxKMDZ;0nPt zfhH#3w62%aT) zw%|_$&lju^tQM>nY!JLuaHZe|!JiA>Ab6ADU4r)ts?Vw5kIjemk?21a{HGwF@z8IZ z|0-VO4uUrS)j*L43yu;j5mfxdurozu_4^94`h5kg5q-VjCc&+OI|T0*d|2=?LG^nH zc6N)belI~*zn6d?ieCL*f~zYbs^D}%#WRd@vqk1tPpoIH;08hUdkFfiBCFp;kZ%$B4#9f`9~4x-i;(Yek=5@b z$m;hIke^hszI}p+1V0u$BKVb{m%nR}KSmH=7AZMRkl$meeiA%Y@HD|;f+Gd_u@>`B z6D${;CCD$gn7%^rXM!69HwkVP7x9sATC4S%DXm1?nhIZFCODTez$yo z-nC<&q2^+pquh$hnG0v>r8gvAHghIcI&w0zaor3@<}xh8!DW3Ms;_J2a;-zL2wFHJ zw|v38d0cYDQK||HEF#me31f20>ao<(%!TzZ`!8&K_Klw}>RB+0akjT}Ll>&8GyXCk zZfVtaY(A!O>yCiS#R>EEL7rpl{Sfz!_GU-<8`-wav>^6>4femi*=fa4;IwQEm4xku znAD5wIG<&sh?@9EzosJCWe_#ib=bc>h+{0*0MwRV@ZGrA zN{}xIhxnOW5(4XGzq3yJ*g({ni}BZ=5!u)VZY<->w-x^VRi)@Zc0O>g_3ww-VfJ<+ z?zMu#f`K~!iMiMM{Y2Gu9PYJWDDJfcaIYCd1B!dC6S&thg?p`YQ?lY-8|ul}5WFS} z+-oDk+-vdu+JSA&XMJHLUE3ZES1B8Pg&nR*Z)(aU^IB|U8hF9lZ!Y-UH@GvH)(SrN z0=+;t&<%6}U4s)8^IEE6UOTiR1wAWx8iS!) z1N>s(N^^~jX*8N%*yp*!XpTSZi}$tM_qj3SjL#DXKYwJ^$TMKy-Q?b4G=shDj{huu z`p9K>c$>Xjo<4H9>1lrA$dw}v#@FmRa;2FYayRFMqPISCWZfN**La#!OV9W`uFtL` zS4=jVpJd6#=Z{>mCJ=IOLA{e>uA5%!ZjQR{nIo%E9?!CxQKQ+r$Y?s_^O(V?ZzL?= z;c0pTejxuHv0G|K?%1;>l(Z$P`8T07@U0nU+-7pE#Wl6tl6+r$a}~JO@*W$ze?&ZZ z*7mwLn}Z(y+{jy3G~jdB0oWQj9XxSs$*%^kxU0-RhCU+y7P!(}kgqmThxyK)zr`kQ z1&>$0zXeQdBdotCSjay)dj(k4hJ6sbB*XlBf;n`5XlTOq#@`c+!UmLH)3q%Hv7w=^ z;8%Mr7P0-Khmu8&Ihgi~j6`shY0fo&BbebrS>Rj?fOBoQ6#(a2d&RltD`?-CzQtFN z-k65JX<%M+!A77drP)`Q(iDrou}vMoxz+)kYj55a1n1i8207OC)ypGojfB&NUCl;hf!D(Yw>Ofp;xBxp~KdXt#Bs$ZaUTwY$K#w(e6`bC-}2 zTxb}bKf`#-Ey6x{Y>`pe=KIiBn7X>KE&llzv6m;EU)UD+A;y7O*cMY#(3bXCGg$l9 znFVd$y@QIL#C~{p4@MixT1Pyec(?cttaL{yzO|CLoYm&(1#PYiD~g^zveNu)&#u_$ z!=`J*{$XlA^=fmS?rA<7Y-yy zX0x}*f?dt8mI;2fdofB2S48c;_j6aCc}m?17h>+b`&MKtezoW=M$qWI^!Cbqdtz>Zh)(Vji;zm$OcJ9SEPn?9UCa}_SsaQTk*0x zN>QY^Jh$V#E%aufRO5pXYY+-qz0=1dFL=LRq7*U7Yy*KJbTW`S~>6SI|+5ien9DlwnY6j=k zfbTu%{5xpiv}n71{1_N#3N5<*d>P_9T|}RMAX_k4#5n(j^ks;MiT+r6dWMLp{=c#8 znIfk9xqgOksE8T<5X%k|F=%tF`HFr0P>25p>{Z{{F^sd<@1^CEXo_Uy@&AR%=ctB3 zb}9ZZ-*}P9vGxF(T!h@J$>3PK5w)#1eHZxn6kYfC^knr!9oC;^rY*KB!Z_xr zOS}M zrE1n3Yrco2Y`XuCY~n7}OXOJNZz|tYnIFMD7dY0MY3iBGOx)0tV{J0f_nd#Y5_|ah zWwP)0(HAIDbFBGZl!`RRn(q(N0L`)H+b#7D_Fqj?e@rS@WrzAnD&>1QsZNQSW6k$x zF;(O*=T3i3%9i-A;$C_^CJTF(9BZ6z;d?8YW0@Rli<$ZDxZ70f6#pEy=$&}=t_&P& zU0CnCGT6wm#(mAAY3dJ0OWH&HLp}D(B}htOQo9G>Vh^`(hRes^36#?=IM(!7F#_al z^nqjT71acH;8CW7V@=Dxz$L609BW#R3-BeB4;*W{d}3fTWpJ#;$FLcxfoSFj$C^&h z3v6Z&fn%+!O79og%=*Bwrqc%oI{oq*Br;?$8Q)nL?YdU{XAd%(4 zv8K~U1^5M=4;*WX^d1~*quGt%Skw8(1)ie}jx}};Io66OgJVrSG|Zk7;Bn;x#~KeM z#j!Sn2Enn$V?=SRokayW*3N;4ieqgNn*@%v^=PVS7(2YLUl0X^ugou za$ClAWFfl|9BX^gnDkQA80X72eSbiXfI4@BV~qli@c@@e@quGa_nE<%Djzu3DA3ek zez$LhD{4M|tSL@3a9^eKYDQDbSQH#KAF&t|?aIC!!y$j=@8}ox>O&@U80rExpz_F%f&9UaY%9a}f=dnI;tSv+R zID>1BHPCP+Uab`1SR+l84;*XsKyj>HjED~$Yc#1i*2c3=aI9$sIM(>))(4I?tpLZG ziz5phYgz%0wKNt1$C_4vW9@wA0LPlHg&b>-z&yQDeF}~>%5+M};8>%4y)Bbt&9~VV z^*bm6WFYf_V~qm)d?ot~9BY43GC06C_i z%Yz@Il|~T3FoXPH7j}EYP&7E!u0bwvto;|wtQC&6J`f4^u}&`FazAx1D_t6OWeDRDayZ+<9Mh4yPZ0J|_m}XmyAw5sc^8L(=Q$iC4s;kY6`x{0?{-UzEIO~|v z6i}E)bio(Q@CugFrqa@d|D+4+{I5#>6EpT5P1EO&5cqjcGWLN04-9(b$m<~Ngd%nn zwn5=8%pgY~vtag9-!CDz|ae-2*yL_|4GKa?y=^% zUi#m|N%4o{*4Z3k0qm7&=BG?BcMkWQ>zxvNp64g3e|me2e48h*53OO`_lu}(s8u}wc1e5pyR!|N;rgwZq$aMTclCUgu=()$fkl#|7ENl0vJ&U zHzUC6j^&I@(RHt1&Io5!f~1AO4=s>s{c?U`!P$|}6S``bb}VP)Q3TVNN?@>zCCgeE zq3_T;ny`L3+rnl*Z?{G{!Dg{Z(AzCjdiZwKHW(6oAaJLk^^=ZDhXD7unV>t;oNPED zQ|2k(G_nv4QZyzIa#i$LqQRL;JB~X-op!+w$cJ+=%JB&VHVO`Yyv%Np5;EY@1npMQ z9AJ&aiAxbcKn0>fR}15-!m_)C@pWO@+hX^IGRpqgh5+(70)G~x2MFXQ1d*1zg%Ms& zAS`WRgnffdXoh3!fp{+jAsJ*N;gBL3WSnJC;fY8FX~0x(yLB&}>*%FX>?L*$SpnHI z$*{?I29O;CY9G5_5VgC-G8RSp1VW@kAVhkDh9aFYnVrFjm)Mg8&bHOicTbO04c}pV+>jBBLh)*s5WsGah{CmqmzG(GHbJWz!+yewrtzBWxE2W z4XFsg4!8eajTq0JXb#Vse9dtz8zFT(g&xgD*bddxRqPl0G>L-mI4KC}6(>g@tEcV| z0t`z2i%&>FI8*sJnZUC+dUU5co!P85oQknvX$kdMH# zqn*TFm0h-zA1bPi99Gyof~us_Kmk-yq+9k_g)v1zXb(&$1tG`hi>lBBf+{K*1j79etTf+y1+q{!~r$5*IpIR_;4 z_PDf+i_LIbQB*s^Eb6FH&Y@!E7SBn}ql|JqGTLl{sfgz};7OMF zsUt7rJS#Bm+x$Y;B9A_!f0Iu$m0iu-7x6*M^nqXA*t~u8qo3*%o&Ifgb37uuj3(VP zC+eU6D4=!*BOwH@F}2Bkev_N=VuW-w*t^k17DUa3n1wy3Xb_n?%~68!3WS~@^JMm= zHff?1CjqOnV_WFb!t5Ll`K(0I;OQLSp(wBG>k({!d4;^uAv4a-RE=XqpL*cDeVw$g z9@tyb36ln%TjLfX`Af^>)>x1Teb}tE@~MZ9=J>@cnx(Z zEz@Pv;&cSt4Lh4H+g3ftGmwE)_B0;>+8eLI;SGs6Qq;XaM~S_0VE7Qy5i$^h2wf4l z{~7F!Wyl@Me0JU}#F>|L=DiR&knD}4kZ1Bi2pn8P5r!iaA&f#OLEvDrH_jip3xPi( zIEd`c-dB^*7Iu(50*+0eiZphfJr3;OTh4s84cf7HnVn9ZZG(2~&bQNv&i?!YF9*IS zji_dD8a=;!?!t;nqkPb`n%V{bhrKs}ucEr&hiC5Go126r1QJMCgbN`oN&;aQQGq}d zWRrkeMK4)yNFbY8*j&H`cdLSRfhwrgy0v0k>r(xxRa*E>>GQyXiJ3|>BN%#a0(>RTf%4SN;n zgt|;YeM5b$AXZjhv!KSUb3t8MMKuZLUq;={E1LhydjD6VqPrB1JGp4IDcVPXN72eyRat9oOSEN0W2_l*n37SWe$@g4^8=*+C2lC51+mD1f{4e@BTX^z`Q0q4 zHwkkHj~O8|?VUZ#i1zf$i1vhf7tDxHm z$-ys7M${7!jcbWQMs)PBQ2Jp|99&Ax!~xk^ehtwKXHW!5_dx`-8?-qc$dINv^Jt8t z@FP?hB`CU(p`j6GP&6epog)f|BYrHUGMxnwUrg%eq)dQ@=s}^3QAkcHq_$@Ylo~1J znH@^Y3uPP-N-M(up-!g=rCK2oNf}5d71fPG-PA=i+MbBbD(K$_7L;1klDeZzfk{F_ zF6xFdB`P-Bl~4<1{as8AsNY!$CCdC^PD;dqk|wJi;$%l~9-LOI~}hnk?U`6uA~V`?K2+gW&Hc;_zt&6=~7CI=Amt$ zbm`ELkuGf?YlMySpt&sR(g!^0(sbup2q8m6HIy{m-}Qd&x{iM1ti5wOMhcl6=L)+p zX_(i`4u>IZjB2OfG|ke)xvHp*mDRU4 z;*hH<@r^gSG}hFN=@u6!mRM)Brn$1Y#VY6b$uVayo2_LyK#Vc|e}VF*`y{?=o-m?im6f}D z0Kqsn^TOXRm>P>M+2tT58Kgo_TPt zYG{f~!s-@NwYo)QPE$igthu?NsW~#PV8rmEaq)#NhD62{jwmcLt6vn2C>j|V4Cn6{ z6p@ESPFPe?Q82Ec9Jlg{>IhuFYj_z)MvNIdeC((b@kR?8QP}Wq{?v@L^tex~_r72^ zx~ZFOr+B|^DhCOhW4w#quxq=VG%v=nNPkIej`6hh+u4RRfw!UN9nJ1_Q_ZEgJKa=F zExvridou8JcwVWu*F{JlXxcr9cxjkVM5dvNA1NF!oFps}@~tGx^Y>>1YQxB3oRyb4mE#WHRw}saVZxucy zXPUzWR9__**n;a`Ox3WIoY!~EGo z^W!1xsj^Fj<-(JNtA%$6?-%}B_-A1*-ukfqLBgp*zH4NBg|JC@hVWA1lR`SSG5^1W z$#{cAJ4ZNBI9fiW zo$xf_#lmZZKNLPFG&)nL=g+c@t`qFb@E(=zZWP`jd{Fq3@EsxFyE1<&u2G`VWda&K zCg6O<$AqoIHA17OgnT#3zDxL+@DIYj2>&Te2Bn+r^$;E?JVZD{X!MPc?-tqj3O^9q zpvJPEzQQF!PdD{K*`99dm9n{vJIier{#1Cs@Dbtfgj`LX`L_%E>k2CiXS4oKxlM5GK5ieD!C z6ya*cUnu($;WfhRgf|h<{++V#65gkHa{hUIPY8db_&>^iS@@dbx60lwv`{z82ZdR} z9N|Er(E&m}qx%CqRPi%}bA(Z$(fvWbCfW2nU^{Ds=L^40#JReXi2ZuS-z2u5YZ260TIJQ#AOqa?*Q3!cwqWaVUgkwBO>1s zvP+eItZ;$it7X>;mlAQkoJvIbixq#F@CwCmlzoGcJ`gPT6Qw_<_$P$F6Vj)F{e6*$ z`rnZKmhgQd>iL(_Q$gEjek?R^FpG$Cy=6y)2N6-ONa=?uezNc=;cVeNBI-F&cA2n& zh;cq$c%kri;m?Hl8e-bR$D2V+Q-l1b$A07r&F`47^JNba776(sjrnH@NjIczzE=VF z>+8DX(aP^#7>^ag)k1O%7~fG}_bSDIS9qh)xD+G*X4yXx(h-pLJS==%2q!`l{|Dh8 zg|7e4hj^mAz7U zhH#DW+rqU%^L-QLHp>3K@HXL(g?9@d5&ly6d!hMWihAfM%l??}r@(EpKM;N-{8X64 z@0ZAzD$EjkI=d0s=KC!2(RGgb4;4-k9x0qBJWlvc)7MSr_hKAhnlMX984t!sgad?h z5oCO+aDi~4(5z>GbWdk@sp3hRWVy41=L+eq!T7a8sszyXbaro&eXH=t!n=hJ2_F?c zCG>Q5Uy%KZ@J->{!uN##5bjN1cOv@6{+Z_l;0)QGzAjymnSP?MQdli)5H<@}3eEEd z!fRxoFQh*u>$_U`ec^4wdxhqC1mQO@b|(Ogs%wS6uvEdPxud^d5%HY=JN%R zuAjs{!a^av$Qgf_aI$cgaIWwqVY#rQ-tIcZUn#szc!%&|;bX$R>Fs{3eBe8q{&m#X z9jo|5gj0l`&hC8Kp1$rv*_FaN;mJZuGjJTv5S}NzNO+a-yFxm|GXEcip3d&uvODVQ z2Kn5C{K>*D!frxOXE$H=XrZUCJ5lx&;Y{Jt!V`sM!fIiyaBup$mnh#l;dU1#OxP-1AzULoU-%v2)xsNvw+QbP-X(lk_?Yl1A>EDx4;qDKzVnpxheSW<3(vSIfR$Xr8wb|0CHy6+R<;UigOa zEnyCy6H%_0aIVm-3xfD^*=Ai3*iEvR3Relw5}I{Ekk70O0_>=NdyDe@KuEuKw*R#7 zdEraK*M)x-n)N`C|2^4sf@gX2Tnp?eyN}SU2ZDIB9td!R;>QThb1vdNo!jY(pCz0x z{Fcx>=OX_~*=GpNb1&k}^Dc0$;;$B7BQ(#wNWWF~ox;0>_Y2MQFY^6fHg!pPoUaPs z5Ym^Q@t+8TdJaq$b`f?Hn&)2RH_yGmk%}KHq}M;|Gta$1y8P2N&$~c+`O`j4NDqJ7 zYlYtP?2lyAbD!zI6w*JR_AA0Sg>MV#l+X1428Q{A%Y<~vr+tx-Uiq|d5Z+2exjSV4SV$QF#?xn?`JWQfJD>I&!gqx z<-${itA%F^&l6rGyi|C(aFg(R!kdM+3-1x$FMLS&sPJ*&lfvhPF9}~2z9D=|_&4D; z;RixX&%Z$-wGBBAX~Ik)Jqj2f5e^Uz77i8C4T8zuArr^akU@t#8i)Gk z_#(XE1xWMPHxBjjcS+WlhTZGmCWO5*2wLY2!RHe0z24@feHRh!>Vqc^kCXM`V=P|Z z?Fh5XaO~X9!OP6cJJiQ?DmwY|^*s2q>1AJvd>HEZ#^d1j5O#n6CZc~lZR{U^QTLAb zX@oIH8v$l}2K9~b44`+sMBns)Ql@3@OVn!M@8qnH^|MWH&Le0I#{3(@fHto_mhtDC zgZ};5%LMfDK`;B@qDW%fn_hO&@Ude@nCyGk%N{z=G#J;*?twSaJMQ|?N8A5lf7E?I z(#EszEne8LZQ|tchER#!*srALl#4p`jV9-$V4=~OxkkLcufAUXXV)D#|(?V4%n z2VykCBYL@}(Vh*D?9|0nl#PMn3-r{h@vk4E%(3C(pr_P;@Yv*^0@FW4Z^H+tc*oa^ zeHyU1@lt%--oM zm^w)&v}Z@6rDQuiJ(*mI^xv`Fqf!~>sH2Zocm|ZQF^bflUCUn1G6x1bkj^s|K3ewK z5RY7g2$C(#AwzriM1(K3!zU&$M8F;Ile#j@+RtatqDk%$1k+z&Wo0QNh#unoQ66^gb-RvK|5z z?@FfrBeiG4Kkcdl)SeCB?ac&g&xY@jm7Gpz)$qM3#i#;8l<5`dU-&+muJ&yBXI)M= zEoY`b!j|t>+1&J*Ec=KVC2G&ol`j0)0YAqn2|#;x5DJBVdB9d<4oLry!}F{3t~mFB zyus;w=NSHVN`Wz5?b+~e)R3z^8~&{hz}21&Z&AAw(sSAF@4JjNWhbUDVO7s`DK@67 zJsW;bRZU61fSF%V*%|4#(R?wr%^dHX^kF=rSGrEdpiz6a2mAb5n)#tA@3?dlUczr= za9#wUJ=>S5Z)&npdzR;#MZ1}QoGsnXj z2~J^X&${`iRvh9B(h7;76l~LaLeBWeZIZoR|CY0yW za^~*OS!gb1+&*|+mU=dNH;qRH?b*#Zs$4FTmllThEZIUi6g>_@d)82gAcR@N5rp=v zJA%QSVitw=tY!pS?=uPLOFdf>n?ok|>Q_HSFd-eiT-<+KF%n$9^+t50-XO}S@+OzHjSDizV z=`gfsUAr;oAck-ez+)v&Yb$We=RZO?J+s zoF>qoWfewy_Af{YLwnYZfcETa6y$~8+vdgRT?>@44h6g7e=6tTcmzxbpb`5Kn}zl)?|jgn{S8k6 zv}cbrCbVa-#R1^^7=NAb!=KPX_7JoVjpHN|#rje%cva+7q*{^Z*saJ<@E`Rajw67u za9$O1*>*p-SjuwSc@Ytj(a2==r9SPdzRS?U>3xTxqSN})RsYn!-^2e?`tHDCtOT6~ zM#^eCbREitA4iE42-fm}rSn^e!S_P*pKrx`q@@HhI?cv==KeFRlwd{|N)7O=OhWfk zLK$6eGjO2z@GnSmM!V}2-0~QJsSJKJeEB&gB>~rHb0RD9f%C%mJPP&1eW3d z(Sa8HpPO-6FlnjPKaW&#XT$)G7)NLb&NasJVl;?K>@IeGMph>$qgTfKq%QVco7%Mj zXVg~Jw(wY4`3T5UM+J~nZCCN?)cN&y7 zEvt*&)t;Di3WG4M_1O3XElDZsp{+TvrN>LUj*#&39?;!Ou z%2^L7v?%R)?!*kYRm?+fxO%alW{_75!nus^xb;T_1SSc5KD4d*gi&rRfrW$C`}Q1O z&b!!pBMxFA1XdEj>jWZiQvv9!5m_UvIC>*PtgwT+2x72hV~1c9!7DM>SAvYMU2NSE z2h|aR+7J5L5Bl3L_0?9|u_`tR;VRQKyU1|IO?iUeVIU8#Vt2z$0NYUPh1dhu@Qp;~ z#PE6pi6A1(#sLeMP`rxxtNcCiZtulA>A#e1*e^9v z8LM0{&iDw$9fua|a#XDL5+A#9X{u?7o;)a**U<0V>0U@P zf`hT`Xk~Llv>FbvwQzE5Hm;7Idu+mK)pd6rN9Rc6fr!N~qcbPXJ2F~2zqoj6X(^pd zjgP74V%pK?w0Qi2`OR>(Tu@P41}EX+MGN2twq)dj;+dt>N~5D)Trj0{&H{LYErttl z^8)ydx!#1k@XPJsYg=1h<@P*^^HEkCGftewzq2m7yrD5>+&j^~Wfflk=)DO~V_ySw zyrhq1tTN*I#2W9lXgR#iTxZYfhE{sY(igL#J{nt&c~aK2s5$N)xTvMtidHlyLNw5HOE!c)>5M%=ZyvY{2Ox~O$&i}65~ zPcfa(&C&QgdYck1z0suj?mD%{GnY=Ab;SG`laR3r z_m$cjxG3Y;=-jP|9nU#y(yVE-O5%RD@$oiuyRp=D1h0=ROE@;WC&tVKbC7fgS1;rU z8?PK5(DP?boi)$vwK=g-`N2yW!CZs#m`{i$;64-O7}4L_H)ElYglnT7*MNHgV<6&= z+UR;?tfHo>CRXWP-sXo)+(4HbSA27awQ$cilR6edE$*-nXEjC}AnKk>URb&m=+f%< zoQ_t(Z=V&oUfw>pcxnkGy#3>2P&)1SsnMC!N^u)3J`y?NRo6jMU^gEvm|67|@a!H5 z|8aK|AcWA;uq0Yr#xv=8?N`+sc_XX7wQgQnBW5C+Y+#8)*g9bHgaG=?T+B>rcT7Pu_@A5%uZ z!Q4zZ;{O|0YV#Yc-TXsZ(s`5|U;0f?1bSO01AF;Q+>JA}_o?aK*sX!6DitqX@hucDvhW(0h+mhw z2>F{d?H)uNc0LiA_#nl2o@(OZ!V=+8!fy#r64nY&7OoPWBfMC+LAXhHyYL?2qr%?_ z`F4%{;L9T7--RCu!x&7)A0QkeoGm;_STCfEC-Yw_q(Uj}n}mF`N_&gY{NxL}O?H1i z2*T!4cSPei12ldzzy*q5A~gOlh(BNURYK$6f_UT40_0MCtnV4&8$#o+f_Sba#`HYl z2qAwlW<1rdiK~Pc2{#Du6jGL%`Ti;FhD(Mvf6OC}6iya$RVl_V6nyL0sRI&lb)So+zvn^0htNxmb9O@CQP^gk}0u!k2|xg`Wu1G2xl-0AYdfP~lAB ziNZP|m#kyCON5(*cM9j>1v1migbl(~!b^m=3-1&DO89~>glm!Y7+yZm@bQ6$j}M%x z^!dV=uvNH5_#NSm!k-F%DSTe|w(#G=PAP8ty@iJVj&@hbK3{0~=7@h<_TPnv;MEuV zKV5i&uw1xE==oQ#mVJ)!BH=or;en&RyJbHh^!%%zko{ZXAA~On-xl`8J&gStCOlj? zM|hHOF%fg6o!>Q%&G5c~=QAC6rEr6A6A|^_Ci@QIPZa;4>_>!;EB^PgpA){M_`k}2 zSGY~_AIbhy7{oo9{T)q2`v(hg`!n&l+zcYxAU{Kxf3R?@q+ZS-7V!4c~mC zXfF&4hBf|ej&F7S8-~(s{qUdp@X=aGIP!FCcO2rpjn^JGUSqgr zSQD{xJMRFue!d%L9`0=KSnOUO5VUHsPfTOT-MlouBlp*LDe8M3bA$D9UU~IZAncVv z(7GLU`8A%swAK#!KE`~z(M$BD@w=P9-ReBc+Jt;;m+@Y^XZy+^XkCY!PJ{t%Ue&8% z`|C^2clnB}54X2?eODsvl|j&Y81>;VzIkcu5aX{e*H<5Ijq&t`goq$KYr8qj`uEvS!OtPZWmpNbP}7dI(xd@JU}~ zySwL;E@ag{J}F5Qd*qWIi>@X3q-MMmd{X`l>*JHY#mW+VQg-Zf@JWZFvN)e~Aj|HJ zPfG6NKJZETE&#kfbB%&e+Jut|KB;T&jZez&i9SB*AeK$=NqIZ;@k!e_JYNi-G{Sa2 zE1#5KMtywJdui^LPx>AYA;BkI!agVXq@*M58=sVK27G+dWKKLEpY$|#%Eu?=7Z*RD zl)@x_KIuj5*B2}P4 z1fSI0OMHCNFEzIiUlOE2==Hru|OdEXCa()JrPs+fq`J{#l=;M2W^kG?w~zdROxbCr^CRkJ96OQV0D= z`8YknCoMn+Qa(u+pOmW%*^~CbC!M?#pR~9=pR@)CXHPNh{}?_00d|*9I<-BYlpV24 z+Ve^8VA&(u^GRQ1+_cZlCk+=3zzOvDq`yQZ=i<=t9&$gQ6i=ny4O=vnV2eTl(Ocnr zTGoC(skNU^itBdgjW1pH^GU&&Dg_;_A~vi9%)wX_*3c-?0viAAGGKT|ynpGkFPcy4 zt!DN==9B)?+RrE5^q+n>?gA*j3EWa*`Hq%Ua7lY&X>zBB@fPB7Uye2 zFHNukc^`;&S`&oIQ`_AEZ*Wq#R!13jn_DCa*GuZd@N%<@Po|Z`4&nI;sA^6I~+xGKGKNp{L zPmA-od{TTo=yvgi^GT=Rq>;}=??NKE5yY5~+z8tH`K0bR?B|oZW;&HKB+qn z`}w5qIPB+>VjS=){^$JM06r<)B79r8Rk)u|Y8CDapY;C=!lV27r2F}#xD8nAu>1Ly z`}w5!u^D6X4d9cG9-W|*Mm__dbcD+=-Mc>Nj(pAx>kH8*9RNNyes;$ew6Dew`Dx^a zRGEnO|8}iUx*fkNgF~8)U$dPa_()6Wliq=PI%txT{0rUDOPR78P10JVIb+cek3+f+ z56_+^>7Uuk@a#%flN_9mrX3Q)z#IJ)qC!D_jwW%@9NSreMDRw9eCfxC0dJJy@V}9t zywQtb7#&jj8&_) z@J2r}CUi*WG5I!!MLiu-I+IX`lw?K-yLLi}&I~*25CU(MgA>;weV=WVGodJpVYDF~ z(lu@q=?|a<=#aW*T!+*()6%41O;3lE>W5G@#6Vq)Q0f`@M`1a0Y-oEC!sLx! z3-okI-3qMq%n<4upW>Qv9a7g!PG1L}Idn)}GcDby5FRQsGkq*h1$d)wYIb@KyLPzD z-1I&?j)^jRyBd^}WcqbTd5Sz8QieI|7z*l;(lk1xr-fk8G6&|@A?1NOdDJ1TL+E4V zHirxyQi_Ti-Y8eZa>x6mu4Z*C)P6C07EN;d9oHcxDHcLxo(?GoOFE>iIQ1kXb5{$Y zU?mLbkPb#=FJO%%)`JHNF7o&gwrzt5t&hxAa9ftMLMJ^ARSWWmkz0G?W99` zJvz0s4yh}q8rLCp%f@v`IZD(aJ(gu3JK$EFFzS#FM|Z&+{ev+Fq`$-A`BnPAjX5}d z4NvQ@Q@UX)1oGlKq;5lT9a8rI;yR>myKx=TUZ(8C^io#!OqYX<8P_3otBUK8x@F@! zq|ai=0(o&A(gQ;@=cV^&pI=KWGe>k>`XcuEjSODF)FBBDol;23pCUoz>Va_V^?;ElTJ<8szB9lTM>5K@Pf zj=JQHy0?;vIVaMF4yl`eimML^9a1;_$eagRA9P4vozodP=P^Hcqi+6$4k-tRI;2T# z54=&cAQ1E?d9KJC<)vhFNJ;M}ZfjVK*bUJC9> z`Ynq4PLeU%Ih-U49)^OOks;fD4KbXczO0P$&gY9J6U%YhCNiPCg$ScN%2{YGX6cY} ztu5U#!!vo<&>F-$8lgtX1MZNC#pn`gq0(D4F zVLEuD?gdw!vl{W#A$9G>oZoYvfH&&e%X6qqN#5ufw9h+w&ac@a=#Z9}2iQx3{T$ZWyXdMDQ}82OjXb!<;mfNB-_;?{RJX=@vcMO zC{J#$Z*i=kL&{d&_Mi0%C3Hv`)!XK6z|3w;u-6a{1$m)MpOnXl7)lPiDy6BMgZ*Ke z4nQw-8=D1hly^R8Q<4Wt-so^+LWlJGH~>$F^kzgRc%yW%?#tErcBw-;2uDEP=q%)F zr$b7=YUz*;L))wRu0{)|_oe>*X?_2U@Tq-&fd8lTwecUk(HsDIqg>Z3Ooii=tL-im zVRYVtfB0T#{=ba>&>>CF=rk6NebgcCoY94kSLUo>KvFU@x>Cq60N&_jtffmvHYH4{ zL;5M3=$euJnz5lndI&m`l9dr^LqwkaBrNhq*>i4VT(InHe7IAGbn;M!1|vFxojRn& zrtKP7QSABWu!bq7{Wx!wov^2NV;|l|oyVBcGi1S{`qoHGLqlzI1f-@&tgbv(xhs{>+M4nOiz+HQsD+Lz98p-b0FrdI zt(CDaL!I?A>yTEB98p+-$qv=cSXCKx<>Dfv_)_L-NVXJK)0>c5g>ERG1+k#up&;V% z5&qxkknZP=LU}J@=$vt;8+eYM_+4G}zvhj8E%~BfE>kql;@UG&bf1Z3?!^;rij{%B z_f^Q4evNsiUnPyyr#HEuGumqI5=KduSJRgxKDuk-u2{sl3?Q~jP13K9RJ!X9fk|vS zKd|LRN@O9zeh0yUg{plhcD=ZNnBP@cQw~zP2I+>)Y5}hNl*m?`K}lKNceN%R^cbYbdWok{{Ufu@KE7Q;fcaJ;c3E)h1Ux2 z5I!V)TKJmqePIyq#o2B*VVUq`;q5}M5XOAZ3G?u7l=cW=vCz{Voh{qb9<7#LFKiK> zBD`9-QFx>9HsS8HNFP=D)50)r)$CV}aFB4EutYeQh&ghM@OUDQtxkBdaFy^Z;dw;V zzfSg*!tW~n`?5VP(#?whnc_Vy(nl5lTg7`?q|YnVE>4XuPW zBW|-svy#^*ciQx)!PkiRR*TSJUbx!4v{Kl(C0P>{UyJ%4$31{@4EQ*T*H?kCSB6NG>cg!uUf(SUdu3S1y{PQ7XpMe=`n>bj*;ijjtWy zxIZKu4&>Gu6L+Z_H2=MPPr>r{?>yx5$}l763%4h*`;Yfy-|?ag@#F2t4ZR2TeHN|J zzp-6(BnNfvNo%w>=HC&><85BwJ8F%l;s5^e7o!l2tPMowdnH+k2;FY|jkLekZxRv&~5fZ_jj|+7a2juH>n=ouZ`eX-?IY zcXRD^C+x_a;H;mF|0nE7n=l#s2|JR3$-p2mIN{PA)~3>u`?f>2cH3jCZ#VViZk}Hf z*f@Keo$)g246VEI-Hc%Gt>FWEZ%rEC>D{w~3$}(1+_?3gmG_uZ6=!T~JL33TEc~Bd zUV{IN^GfD!4ff0&@%ydT%1%=TwVk;bq49&-&YIp8wG3*z{`gK)%G$oaa%tPZ#p||O zi!0jBO6`ieTif!H(y#4?o-J(yrX%I}yteD7cbYP`?c9|WZD)>WY-8I^sr}l{nO@b_ zfAL)Oqo^&v=M|Hik)ymV>G*+d&dRd3H9bcm=jgUG7MHh$rdPCuj$higY4O;$K`Zmy z`X7IC+f9pG+RmQd+IG(IquatOZ+<%YqtN^I`rx}x_PscwK3jfZ9aVBU`eh&T-rww% zL#I@=1;(T1=>t)Eb6fF&o7>9AZ);n0;G(v3a11x7wl&AIh1Z_`B}%?G)mfgg-42A` zJ7u;YU5?r_HgY-MnHiXyrvU#q0P6@9~ zUEgy`>e>|iPg$G3A#0oCSljMg-D&+bSmgflaBb>2urtW2!6CXVN`qZ}&leXPv6;nVfg{s(;5FR|HV1tgP20?x%M3KM^L-%T!Yp7SrK zK8`q@*Pt!zww9cpjAQX}#0~8`!4W5E-^UUEBg-Z@;#aew1V@~o^I;!HoL^0hwy@!d z&&FAWwy?(${}IQ)#}Pl5$v%$w^R$l^XM9&2@ik~I!4Ws(o#2QYT4#bI{wVuhmf~^5 z*)eDfe^!n-mxqaS#Mg7YmUi(t;+L|UJ8{HkV_^1yBTj#IXbTquI1&E9rtXs&*B16T z;?tPqk0WlpGJG8I7umj#BmO$u_i@Dgv3?&%{8idMj`${)_i@Az<}ms=;=iH|ZDEfi zo<-Zo5$AQ)jw5dT3;Y~$(mLC5#0T(@eh|ovbHs0C9d`s$zs4MKdey`^;^{bm1V`N5 zOMD#ht2jbFjyT!#yXA=YK)o5^!|~~gd6M%MN5;nyzm-LO9Pu5j`m=Gw>CoWkh!3Uh z^$+3nb-j98})QbQ|{Fm$mw1wRq;E4Z%Io5g+ z;E2D;9P7LYaKyPN*%!qT@5;)39PzHa_V=f#(AK3zhw_)uo!U%V;^uOGT3k1-Ppo4h&Z2-|Hmrc zvAeMuE<4Z<`vAHc*zekgy!|R7Uc#Qw4%ypm)1kf?h))^GUfbJk)9a5A`9Aji(-`@l zn{y&cjliD2g>}B~MpDuEyNvt;BR_D9e+OauX5@E8iv6LT#X;mRQA4p0#LAifa67aX z=9$>@FT+1XcDoJ7F#=8Y$DUu!!vC-jU?e{#Z)Ri=|LlLd#kXS`zm0w1V$0s)Mvce& zq=DG;`TL&zk=rtVoB0VNf8<8?V0Q-Mb1fHp{@re5Uq-G+#08Ax&w?nP&&clBQ(0p9 zaLfMKt&%^h@F$jm%ZnJ7!+bYm-(=!OFs>Kl-ogH=i5tl{)5w@kSm6r$zzWp&iCbS2 zY%a$(umbgc;?{RL?6oEi^?l;jcPs3hO&sd`#I5fk*#Czell2ocwVz5q4KM4y2@=c@ zg-&)gqFqtw{)P78X`W8>ptLS_S9@a8m6OwK98X@zmpPDh_heiLa9HtjPs>tV{-~Yf z1|lxrkn&-k;HedR08iRP&K!gX5XU3Ju}*u{1b8!I0^)bEZQ_Mu%^_Th>(#L?+q{Z_ z@A2Zb<`A}c@eHuGp!L2zhn_I;&2~4~sK@Mvf+rE`u{+i&EgKo&%U&4E zH!?scF&L+AWZ-7(wsiub52{4B?pald03WDe+#m0wNx5AeGbt$I-)!6)-Ay6(kn7g6 zfw_cRv7_Y8s~89(*|v@)aCfX_r*33`y+Hg#0Keft<(WXXfho#BEqY;F#}OK_JJ#}3 zH!^Uk8&7aY^;iP?jNHDi-@FR#x7)hIlAg4C7B8FEE?pxH?7l9 zjD#ai@EC%7GUivJ$D6PRtjnhS5V#pTG85QSL{Id($?&s?`->Ytg}4p7V>PvGWMGGD zRBmK|vk@uP8yQG;joOX95#Sm?Y>voi0c;V!3gAry4oKzO#LpU-Y`3#PL$7fsfy)Gl@_1Ljm z6WxW8=qrpwM{zO&X2U%_gsS2eA~9*u>TB4|@G($`955<3GBC$Asy8yw;u^IZFGt{J z>^MUNvTIP{)Qt?h;l{V2YRVTlVAgMBfRq;)l^Yo-bdBnb42*G&+KnX$9FHB<5-LqR zs%2og8}Cg5WI3PUVz7VD|kAn+HAOpMZURCp+ zMQ_=C+;9l!HG)Tv2e5+(5*C=?9Cqz=H+Uw1CmO}P^No5F9iD@#%!ZbD-tqr;YAMOO z78A^Em6ZpqOJ@^#&p8YJ+p2r@tS}b&k z!M|X)tz!s(Gr^+?nV3qBb+T=4auFCTfuUk>Aa+bj0x4n+E@^YW8{x(ic)MeXqQdx{ zFJKkLPb0o4m~9~bkHL=H5n+l6&Lwc30?>I|pG-PBxPG$U7;B zF?6rTx%VK*>B$_#MsutS2%MQ{i@@=+tp(n&+15$k3`GWSUOLvPcKlGhexORz1KuON zD~#ds?5=g`Ok$%OoGpo9NY*C~sSTfx+7sdOVx?mB)9jaZE6sm2RvrFOOuo z8#~?0+nX&I!#k&mcL`n|Ug6$07!S{mRfr-1`=g9>^9>MbsMX$!XVRD9Ik=#%tfIQ6 z{!8&nT+qDYzg;`zYwS`+Sgke!qf>fv-R3}Hpp!cZTl zQv{*b2;(B5Y^NS(?@)?!KqQpztYDg#E1Ra1G%S>zgo=`eWrduqP)ZiIZdnNDgwhf3 zB;{u#(Vkuy%5eHbS_-E-k605zp(N+}RV}7u*Fso_CW3B#Ce{}$>K5vR>cY(2-wl?9 zI*km4hfGfz%qF{q`XD`Z)UZ&Rv!XB*P8yMoUZk>2((q7PlGAA805S`a+%P@V&51A+ zjUd#Ip_3v`N+CMxq(_jM$5RB17|aHyjS6KC38js}h^#0)G?Z}=QqWYA)5S*AN>+jL z8BSecA?&mWg3YWCqk>Gmn5lv3kwWJfQ!6^0ozyLqF|@$Vm7U~tvI`Q`nEKO`oN61T zauY?ehq(>47GiXqPWYeUG`THhg)-cpdv&{=bR&_^Bzici8_th&ggqgG0dfv4%r>Vh z!|6N$EjukZAoMQX99bS>F#Z`yxjfX!uwm2PZe}~naY%b=qzE&?v{S>=;Pi@wdYTh5 z3}?`}WEBr>yA=r~4+`~kPufwYmp$1h1t%al0|(SI$ysiPIyo1wDvX%Z6GLdmB4MNGJRm5qrX#$mfh zh2u=4?H=0%99d%oL-WDu44xb*C^(LTAw zLgzHW*oKmpx_5-3XsPRP*uKkn*TEu`~dX;n_DId$%ZZf-4oLfQR8UCr4-#&p!! z-)*5!sB3>%Y&a3CjCPXql4Vc8tYVNRrNVI9x zIC!up)?;b!R~=t~r>eG$Wn)cE^$m1UgHvNmjPAT;aO$lqZ>o*e!w;Tu#p4&uZ;mxJ zFQ}+3t1D|7UbLX9p=rs;1;sN6`^~ni>|zDq5Ns98p|syyzQR;T%~7 zAMPlz9_>{$G%Tq>JCkb`xqjX)bKVk_ayNngThti@#=F>8LLxM*y|$OlA5 z3@;j2G@@u^WN=fgHdfXg8xlDIQUe9!3d)MN=vO|hjl%{2}6kr89Y4j((}#7IG1 zMPuus6%9?$+byUY3%jMdwXPgkh4`w*rK1Zfi^kBbZ76FgC@Zfyw7RUR5)oxh71f8r z=W^-TSV7%ERgHy}jgf*ymCMSSstQI#3TBUt6jaqW6g0Oq)l{HhZB1D-77RmVmDUXN zuOPA46(zJ1is^;b!Kt#Y2B*EIuCcW#7Hw>4a$Qd0TZluh&Tl6{VuhCDUe1#muS1DT&6t(W6l}+Vdlo^F5pxn`1bEvAS5(qF8+eP8QEibF9J* ztT5*fvJU8BeWg`af!`MJuZaIf@ZU(!Ll)DliN27{np)B5(z4oCOoztN=m_GGiacIw zU3p>_R^XJl&DF8F=GMC5W|~Ji)Mm!|oh&hLaeW{MhOuG^XCG>>M*kYho6Qs($GD2x zhGsM#ZLX}TqBtE#DG>lK*A^{tIw=J-l2-bHD8kMXW) zu0#VqC-7?T>h+c~GCizpXvMHu(HXOgkBZJS2kR~ywXCTISMy%JTMyfnhq3z=PhR*| zb2YA{h&u*N74ERO*K#wa7VkXxDu~rna6lOIatvc_Lpc_Q^37h%;35nE;6Tm3uZWp* ztFbcP%Tb)Svf9Lqbyv$lc1~7v^6F#DtX*}srrz(LU9q$Ua|oxUY`K~2wPQw=nQLHI zMd?5hEw5eDT(goVrlrneH4+FoWhCWRux5ucnQX9)4WdH_7=rjFnTebTPs>t$rX~CS;DKGHh?z&Yw)GsxVRtSIVfj8)WB)x;{@6B@%Eq6(ik=F>^Nhsdb#J5Cd3tCL)t1@@@5ZtQ=;Nz>QE?QO7#O3y4O^pq;ycT(5z?OtPkm~x*2S9+NPXw`>um=%T ziF_iu&iTM}o@V0V!V=+8Lel4$zEBtwHVan@&k$ZByj-|Rc)O6VtytfKLb7UUKPP-$ z_;;c4r$)N*rv@5-YM^;>1v~}=$nxbv^XdoonX>u&2-A%}HSiwU#-AFtdC>(l{?tI@ zPYpEw)Ij4;4diQl)?@ssf#tG|KQ-*tvW-7AY~xQ2H2%~;{xZSxPYU^Fowo6(1{!~A zAb(S0yz!?7j+1TtsbL#`YM}9_1{!~A;1=aG{?xFIKQ++!Qv;1ZHPHA|1C2j5(D+jW z&&Kp)yT+dyX#A;x4=LXGQ^S5mw(+Ni{jqH0PYru2E;H6MUl~m+&#+ zAB1lTKNK2&YSeH1se#6y8fg5ffySR2X#A;x#-AE!{HcM)pBiZVse#6y8fg5ffySR2 zX#A;x#-AE!{HcM)pBiZVse#6y8fg5ffySR2n4av8gYl<^T_D@|Q^TGq+xSz%u9I#2 zsbOC%+xSz%HvZH=a&|br#-AE!{HcM)pBiZVse#6y8fg5ffySR2X#A;x#-AE!{HcM) zpBiZVse#6y8fg5ffySR2X#A;x#-AE!{HcM)pBiZVseu>ZUc`PrB%~H7ZIXV7+l4_8 zbZDm&agMtPyAiPu5f%tX5Rv~d*^`AwD85wovBCw4ua;daH2&47=QP=82+tuRo&+Pd ze}!;^;*Ebb!p6TEX#A^@|9<5o>4@bXBO?B3*?$nep!mPYen*ko|4pI>m34eS`4F!n=jP z6#iQHqVP|`zYE_NI`nzL@rH$1A>P=%ga-+S2@e+*3-PgG<`Hg722riSOku9j{3L++ zmM?pVuvp0788{zj3Hc*E?GuDiA-><4_{Bo=xrltrWRr!+a@PrO7TzxWvG8u;L&8Ue zPYKQEBMVr6aGW^snFr)9?GW)Gle8XGX8L(`CNradZ^7L;e9xFUSSRo|;oaqh1X5lHq zRl@Ux7YV;3r0)&OUoX5#c!%)E!k-Br6jHgH<$f!CQTQj}N5W5qN&Mb`{Ha1RQ)zb> z_7V0MP83cN9wnSDJXUyuuv}OrtP`FrTqz{=gzcUyyijwShlP&`pA?dt%zV!YUlhJ3{EN_huS34= zvUdp0_dLWq*jZ0lm?7*c>>)frXucOBJYIH*aJq1=@EGAq!g67~ut`X2G~2&Ic#ZHn zA%)PHe!K7i;lo1e7cia5;l!7Pe-^$c{D&}%2P@{It~Ze^Y~mOprSoYQ3+D*u2~QA4 zh1J4Z;d0@r!n1_*mt(!_gjWhl_-6bw!dHcF2)7GA6n-q^<1Wjk2-AfyA&K;2knd61TZGRDUlP75d`tK@;RnJULJB|dc+GPK zknRDr4-}3Oju%cAmI!AF=L(M(o+PXiE*3TkmkQ~5!1k^c-YWc|@TbE2gg+PlLiiiu z?}RT1UlIOA_>S;B;Xj0Qa$x&Cg#(2L3eEEp(#Oa?OgLF+o}Z9DOZG9sHUw0iRU7dH#a^j_fw!KZO4l^1C>`v~c@!TjTelZ7S1S;DzOqjQD)C&_LSE)||GJX1(#57vK`kd7X-e<(E1Td<9u z6%e;Oqod`0--l`P<73R=q59sFO&giK=K-s*c|~1ISve5zs0~(op`F&kWJKZaUdDan zWsb~yRD4}FV+k-G2Sjhf5SpzY{xcuGQkjh|3I2^~+y-IC?PRa{h9XbLb|>=0Y4d`7 zCiCiMQVSAh z5#fcI_I4INhcOSm%}c9BgumUJ$07m`qI?(2_PlmaLD(yUp!Gms%Zf0d%}e96WV`x` zU0ov9hs!oz-?tI=${=XHjQV&Tc$=4Y0V4eM-Q%kd-Hg|_31P1cg4R~lHx%RNZC=`U z5#g`zan#4-WdHE0IbPrG2(t`MgV}muV)W}!AJh3P?9Vs8&~<5XOSx%Ge^mLr_|3>S z(KCP?XKoK+_xEp$?|Au^-a8+B#&*CR1(N79bWwT9gMBntV1`I>Hi0qDdObJsT z$DM7WzW7#&1E-s!w|Vtpy0y#qD*E?lFB8zqH*Cb%qEV5=wzst{4<0jmjGKG!`bAs% znFizfMLlq5+;LaZM(P)3l$^P6!jw=+(rT;U^*wS+)>@zb^FNFhK|6& zJ5S(WLZjpm&%cGJ`<48DBrb8D^b{bu1sH z>08H=Z}&Zok{3{ZXN{7HDB-SS$tO5(9ZSCLh-;Ma75;8DO31JGX_P#Jfd%rrjBcr@HLfBql8bzK8=!|Y%QTt@*qC6eHtaNprUX>qr|xDC)Tl?!LB7VN@6^Y zght7gO!aA$3_(i?jS{{*@@bTykCtDfgwM);jS{}|+M`CvU(wTqMu{2kght8z?3qua zgq0;UO4zZ_p;1EBinvBeHp?b7N_fj|r%}RLm-%g!*awXglB%Im!cQz}l+5J0xKHLz z8YMTg<%C8Ff1C4Zlmu8dp;2-l&4fltUk-L+9m_j;;`ULazmzeY)vo$_gvP>0E{ zQS!Q*9@i+joBi@>l=S3L_%uq)dVfBRl82e!r&02E*6-6O;lgHqjgm{4?$anqrtQ-x zxsMmHPopH4<$W3@Bbnc)QF1Z+@6#xm$^1Tz5?)vBG)n3i;nygkPE|XN628A~r%^J1 z5&v6_5?+V?bu4Lfkw5ckfZmWB2R`9qpLK8fA2`tu()`+R&0?hieZ zLm~_fKvV>K9-Fl%bY-h0*e5fNP1%QbVM`6L7cq|Au@CFQ-tZZTAFBg;G2h`vpCoXZ zl~1nIC8&F#J;!<9E*)qeZ4V!4&keW0*}wk?w1_1}QGAeXk7Pkq2y6f1k$4>YCMaIS z1un4AV+VnY{t~$GF9Au>iwr1a_~Sg$3pWlYKmYtQZA^e748gz)K!*yXUdES_g9@#~ z(yJ2Atp0`rO+?lRa zJ}SfWonYR;S&hlW1F#3+{!jEOn7dO2Ooc0~KT~Nu)2@8|Se1YC+Z3sD+@F2-`}%$3 z)=q?@$;l&&K#;`!_^Wa9n^4|bQ`=HdQ_t56{IIg*@^?6VY_j3;mkGzc!EoiH|5kp; z$zu@iO#SJ_(=7?_W0DRxUPpGn2&Nt!Xnb^Rm%JSJobY)yxUBUKEd7pN3H#^{lkgsB zN3M?3xWDv;4im4^-SY{iyK!A00pGaUfItrZetXv<&s|5{a&r*mgu4XpIDgx7nD991 zuDgTBq>uZTc!Y6r;G>>n$xdz|?fj2Cwz}&;WE=pr+M97Th6McZ-LK4CGNH6I>`CFkLVbb zaG6S6Rq{GPb4d5b&vgg->^?W~TkTi3q@d5C$h&-ZyMCY?#xUDlpFO`PO2Tg`?wS#I zwxL&$9JTyjA{Z!C<@z*g?|?sKNgfTek?$~D`!0= zLgU8*+wf|E#*YPv2RDEsYlT+` z&HWVlH_ImXgZ2GPXg&|{V}#dVM4NQ)csyP{KR@Z$Xx=8F{O96xL9L;%1E)(LPv3Yl z7ky&!5fc9fF$!V-hTFf{`r$wG;l;7pI_6^!Tx#ZP%EW%zH1g#HI z*C1~&d}%elF!S}s9D9lZZC)KQ*#35R^tG&q5XW{I@3p%eVXq8=*4wBr!hkj}tp&Ef zzI!6>HNg6K*j{}XBJ7nx&`RmNYtGlXOv64AJGaLpiTZe(@anq;VSjx+P~RE57#IEq z`zFQDxeVh;6*5eD^6Fd>xn8y7lLN8whF65=kL-6uFtgx5#67qRv z7{}w__5gN&|6YwGjyDTw-tqnhVa)kPfZ5XU1#^UF0NE}#qHh?iiO4q`k^COa@2IRV z6Fb}Vt|0`iM$Erq3~2M}V;O(GZ4vm^dYOP;K5)K9ejd(O(eRPuh8xn?-Z@|28(vXxsx#@E7ygG|%9zi>X z^O@EK)&k!FctP;KQgJZgeZ7j~h1wCqV{?m(CvlJ@4xYWU`$m zBznBBcM;?9zQ{<}nfLWa#Cp81Du(yU`=Wb}kM~uKL-+H(ikW zxV*12l=XOD|3-m0?`t>{in91)JAUiz5?ul+S9lFaEiagUJIecbU#}sPkN5Qyi+;|v zspjFp>HXPSg7+20=em#gbqvPd$NL&UGr{}%9lMs`eWkPJ z1n+As2FuU;Dnd&M-q)|#ZendJ^syc9>nK+3Tbs(zZ}zk{RTN!I@V?A=CwO0{vS$h2 z*YDVNg7?LaeGcAN4l0ZDzIwCl-gsYRRPF=s>p0e(Sewc)es;Sy)x8|R1nMo9YIdyXAd#W}g$h zuVdKf1n;XGQ}>DY^%GR&<9)r)ddma4IIWyT?39o9WoS=}0@?0bRLME-x#@A<*D{vh z1MiDs4*s>N&YAtn8p5~eK@xG?h_VK=s=LPKJeci+Qe7vt#=J)Zw z`0~Qf`{Gi3e%=?at9HDvJ6M6A_tl-}_~t-b5+1Ldyq7{bm}TL61*>SFY)od=nm}XeT`w!LAF*eBTfaX3*AMb0(r}GK4O3Tye|rEx8r@)Fo&P_WvIY@-q%aKr}@{Wx{VXb zzc$qb=J4~rj$(wL_w{e~>kHz2(V^PU`=Vp&KJvbJ*NOAKhHr;rypldCGmkuI42U=wl~hOjCXq?3#zn zfjnN7tRNJ8nH7&`=KF&o(zE*8eD7z^O0(HlZhY^;&3+waxun(X2t$mHU?0Gy?Kxf9 z@*?a}#<4m3=q_yS`>>fdfL*fZc43d+g#9PRt!LR%Lm}&iqvNaR{9iC`eg>PT^uuWE z1A8O$+bB55<(3Vyj}EjVDioyn%3$065z1VG`cY;-qYMv^-vmZk&_1kFr%uzd+;x<= zQc_|SB||csmbJ@uly*-kbJteN*E&l6d;=3qvq3(l+2Fl1%{a}$G~^V+hs^sKaEt0&BP~Xs5x-nUV$x<@FwThj#swJ{eC^ck`J%dL^w)v` z_j`PGaI$j1fpb>kgKi+?ql-h4q=Au8Cgi$}m~wg6a9WSaOr*&Wz5SH1Ei0>HOm2simbmiQ9ftXmeod7~DLij#>AYykq-ite&z)-I zKmQ+lUji6Km33X!)!pe%xQ;9p;5swkr{7P(tMl%C@7=f5 ztE#Tbt@FrxJ{N4Xiu^aiRr_s@cu_|T%MC2IQ-q`YyS?)wO&QvM_yC+#{YQ;DcNDy% zPV2K5$vk?{@Bw3n_Cdxd{d65KzDUmDeTEMj9;!z={6oF@BG&qh8Zc&9|KaCZ%~Tx7 z|I1!}|1JN%NT){+8sEQY*r3t4==B?D(R|bWl9a?Y!exum+@eY@n>*{g;@Ox?CY7`B zg4ZE=w%qO_OwOkgX8#Z;J!|%wfJ0ZOyxK|ef`p5q7&{dzpSB*dGMK=Ce?GvAHrE{5a)fxXi{#fT< zSfksi+|qd5vu&qxQKzWCTk^qzWBWb)_tgFK6#qTkNG$(79jbw7ZWr7m_>|x)g0BnyRq*eEXZ-ifL#>4M1WyM1cIZI^4Lk)SD$cl#=@+^@R4>jcLMOHl2 zkQEO#aIfeU4>e@PLk(0s)Ih}-2UI-NK*d81{GayU+lZHzoIf>!cM9Gs_@Lk}!6yV2 ze;UfYBJxo|<<|$j;;RO>!z)tS?m0vgXZrYEDjweKw zAD1=7M;jpN!HTJlK;kT5zbriI~%9jHL<2-)cn2+azwek3I<9UJ8 zQtOStZ6@Br(mr1!GYI3cI~3*dsj#?XfMEz4H;b${?zZ z_Tk$H2V>@DrA>!u#hJ1OeupJCg%vG9n!Vo4mYOyZiL94;tKJ2OTV)W{{)wNYK}KY= z(yAca?X66Y`r)zLmc8o`x605&Ai>PXI5#WpYQ*jKw%F|9vKg^g-;c31?2)|7+AMn; zp|IQA4tv&dedb!p2V|>`wU;fIs+E?F?@eSC^Qx?n}>*PkX4TI*xpD4bMA7cULUk7Eu+*$S- zLNsjp=g_{lZL*aQevF-dh#zCO&RF*Dd-^eMYoRKv=f~*0#TmL{qTWNVP7TdS)moSy zj9tN5cLOG#IR;MsDV$S2I#vy_HQI_g9!Jd4HqZ%R=0Kz z%u-l2oUWNL=LmCW`YsyIn2AjBxIU(ZI-GS#<2s6t12AMHC$?pUx1p%`E;{;9pOZXA z6?7hB)@QJ*>$}(;nRG{UG)R0G9mUXCzKi>i|5V>aE=XhfE)HVc@?9)IRj1{w=6L`7S1)@`&%^jZF9^-^Hd(%!|8< zW0dake}PJDzKgjyl0VdUu?y;s_%8kxc5S|kb6H!|cQKK*MST|^#YNcWyJ(>EHs8g+ z!LH4BQTfY6eHRstSk!lMH5+c@tQ(G+qP~lNVZGn%yGR~*yYHfMbNe>mMITxk^<7ls z9ray2%5Fq`7Z0=UsP7^h_5*wux58M&caiH(e4FngXI;WmDDfkF7w6J;)OWFhga3`b zi`#gVqrQt1ST^dr$WH)lzKe7dw)rle%fXKNF5b%n_al85Ng!nNU96<3Z}eT{A{jQ{ z#XS_i(RWcf?L~bTxnP3LcTv$v{V3l>(m2_C7pHS9Y`%-j*eILtA{WT8bJi)&xT%ha z@8XAS*SGjCI%(g=S@#L^+k6+3Dcd;fl<$?zckyA?Z}VNuqHObBe3&P&&3CZ}?b&=6 z$1%UncX22CXXC8nf)#e(MV?o6d>7ZyfZcad`JmZ-7pKtVeU1dW@EPgvxB`RO=l@;b zMV^Ot&N|9=&bs^9O^dUxH)d_rcTrtSY`%*NH~?qsmg{-oZWjH1zKfY02%GPsa!j>x z*6n3FIP1oub)c!#Vi`F-XB~Kv>i8~lfepLw;@xbe&3ADN^V>MB<-^Jf^-q?K?Uq$ch_%1%f z9CqKu_RL}TUF=SU-FJ~M^8Qo4i(j$}HqN@S?BkE)tW)H1H#y>XaGNZoop1DAd=Opw zPx&s6;h0B#7eApG@m(~W&Mp`&!{elnXtTc{(WUb@qUQ>Sdl6m~HE)21E)DV<6fO8X zn`LpM4@8{~=c7vR4yR&?BWK+%nDRd8R7`TF z(;@vBUC#B`$Bbd-ofc=^<;bd^V{+Evxj=0?nfA$9SJ0fX3@C#L>8w`op&SkeLhef) ztI~TWkhAVm$aD@&XLIyk33WK@T+G)y!db^>#$~W==d5E3g{ZD6a-R(=uzGs8!bUch zGyWph;^KP78F+AYN)!)jt_IK!!jq6Y3AwrIS&S5ObyIpzK#z+vxzgwb=k?by8msGr zlBkbsp$$svfX4cg>g4y^^LIs4<5?ko$DWP+_{ox_8}WAg4UyktQL{0BqRQclwje1* zNuBA=RSxjf(P9Z1ZL5-^RTbC;rSg2BMB)8^baI5 z|2NUr;S~akj3P)8kG;sLM0HGs7oa`Uw-eP_Cnw6O%`Wq2t)X?q-f@Pg?q^9<*CqR> zz*D!EUV1`Q7oYFSOLxW7J1@dcm-~N+oesWaYC(3(jb%akY_;P0BzVQlpKL95Pv3{i z5?L-j!Xx+Hes(|11&v4l422!(_{!(PGYLd{GjS}`a7U=z=--GHuCXwEk-2=m$>3Hu z-6WFBQO-YQ#WUfF2A7uN%E?iJu8NY%xiev@X#Qj@cR%#penX1R)8@lC+19?l=bR!s z`)^R#Mg5p8m%J|jrUTqhg3j(c9NiR$OO6FzOik1F0^ew zMNT?CZ}O3wznbaOcDAj({L!u)s7t3;z{OmhOSmDQ;?mY7;?YJMKhCGE9m*-65W!x8 zA;BSnXMEbsaZ^+ke{1^LdB`lW))1+Nuc zBe-60yWkGNU4oAZ;*I{d`f~N-I~vrN%zStWMc-)3{|QdIEvWuS)9U5(VvZeP0og1YQy|;xJ=k2+_Cm*cskiE#kGNF^QSCL@ z3o;^`l~xJaZf{l4JZEW--L~xUyt2w5s(lW7Jh!dQN?Q(v-QLz<)E+Mrmc1>ATV)W{ z+;Gg|%1+j1rEP%1Zf{30dfe>3T-%V3WjG(WErt`*vpf*8F^%CNK`UP`oXGPe55dZ} zSK`!h+l_pjL)ONAaC;oV-oD+zXn&KCX7!iH5`Pz&4N%*Au$N~EK-SBRXd4DC^{nsb z%QX=5FH2c4ca}X21M7`!zX@Uu*@zUa7rtCw@=fO~wU4Yr+BFz7x#!G%Zca|;&hX;u z);Y&i1izb;ZbJ)IVI5zt@3Ri+<(PoxSU7e5xytt_dNRb;cqvolwOGzndM?LRBO>dK_JHi?AJpNywGe6$ zm?#!F_-_4GiB8S96k`D2EfzIoz0tdn7VmU9FMDV1dP<=z)iRd_ex0VC_Z=yBu-7*bm{u!*TyNFJ|tT$>^{vghE_-KJ5)|9lk2dZX;9k-p5K#g0MjJ>*thZmuPgg;4o!aq61meQ~0i z#;{KRJNRyyEpz&xqp@OdXK3jx$A-aoi-TpPufU=;P8yEo%3};tgUdM-LXw`q&wS{+ zwFu~!^+p+IH+<~Ie5)c@;;c(pj#TBUjsJEY*8SeEl$hDDXznB}=B0*aML7`BftRHNT_K_e2c_Nue?05`eM5tfCF#BW zb7<<-hDl27*RW_NOua6q3jMO)sM+SB{+n3#tyuNBLiz}QEB5H^#6*~Iq@U-P^+pFF zlOuhc{|59MzFRzl9qAMNJ8{IoJ7=1jq9yB$v1p3gakivz4y90!60oZkg#hfsZM}ck4No-ZAiZb_Bj#W_s7aXH19h)@v%gAfVU>;k#vCN_q#Z z^+wJ7g#on=Bz(8b^nn3uz0p6Z@%nU z;;Ce$|Hcup)*IzHVx+(52u#H&l6NkQ5{h?DaUQ~VD+fcSe77=So4#8oRF02b7=NA$ z=0VzpQMVl=C9-kIL?-(VL1hr+Q$~vC>jbhs4w2fv$`46E`SAWhzbu#1f z!SgcRlF_;Do2ihx^}~NivrH^fVJMJIfBkW8H>VqOJ)RWWXD}j znve3%?V+i&Il17wMS-Ri2_by9OxYcHp6T`18{LP@(rk0R(Rd7Fpe08gymQs)2u;d{aR!jCBn?47>c9ri|kg*J?f(YrX7QS1oHH6TYI##9kOkqvs zkf&0|=IFgr*c!g;;B7U-V7}hU6U|z0l;0%UeYfhZH@XkSvEHa!s1ybvo!*Tr>bGUo z_2@d|#swcWI-i{-K4&5}7MC>7$JZ`K=Kf_v5(wzZ!z+gfRU-cQbt>&$|qpv8jI(06-s)p4i5 zq15o?NB^NS3y#)xvZCwMB=Sd{@z#nA%>VX6qd&;s(7a6j__ayD!#P|6?{PONx@G9 z;l!xy$K&yZ^)waC6jXm0gPu!-sBsXSCOBX4YC$e+!F+cJJ}mg0;QNA~3OewHf%zK> z1_ilH0`(IFFA=<4kV}#AODucI4)0WV?NF`YvX+6mWhDrto26V_D#N9Ly%_KW#J-zSN(~=LM zwuh0=Dno@euj=z~Z3{;Gi+Ayn_PvBS=JITS+Ws59TfC-P8~e%)!w@-#DDMt_BM(=% zAL6@}+qr9(Jmux}-M(9Gda`CM;=7d!mf@_!$If+!9^J7e)Nw_pRprNe_ntp3SlD@O z=FL4q4^4~tsM=k0WJ^rm>YR1?YdWsYUEk$q?bw}{Z}qGXCFDAf8BRy2-KtirQ$r2) zicmsM`*jIW%%# zT3>;4O>gW+)_MwhBaEzd0-XizHjk?Hy*TQy<0GxTcI@!wTDk*PJKRzn+7P-ev^~^z zonviq?SWeDotA4S)Os?tvs>2m4~>V-jv?n7-|+9lkxpstGsJ{>tol)uTNN?xITG(qxGrl8?R4W z-)#M%!=CiLD3uU$ZcIR#%09{1``7mW$n7|E*w;U9&C@62`X4$Rs~0@tWsP8rK{;9N+)I;ovoUPa6HVhEhW)QHZ*o4c8qyoY4Q7 zlRCA~9YP-JY0`11r?JZ^;Wm>vU}H5DKi@don&<+j8h|Dr#|F zbKtNWH8lb{(w{%6Gk?gjdC+lOLN^>j8f(}Qg6v9yC1Z2&rhdmY!*xrOwTBKjPJjBO zD?Kfg6k=K-^v*3!p-;oOIqT?~L)$EU|H+s-TF2V-&6E2t{jA9YXK!8^%G$I%bf|X4 z)-Iu>Lg(7-&91fWH*4*C9qbkgZg8*F&US6mSNTJuYMtkd4CRD6hFoiQgq}U=(_=$= zNW<|p`X8$Gtil-g{w(x%sP9MaSRAiDhYo8xkJ$c`29J}jhnT~;5%X<`bM%2EEq_sS+*7?}JlX2;5LX9!*I3Bv*_1G(ewE6wr$DQs$wazAgc_nl6A=v9z zn7KA*b5XNSo1gUjzSg-n^I+x{oFk4o&C)}`P(uE?zFnW%(m(SlJ*Wlsw(FkKT4={~ zU2EIrVBry;J}4&tm2;12@$tv?_=Nm~ym|dcANJ^@54-#K1@;9Vf2FgYx%uJ3eAE*_ zZ~O-{H|f2SroC9J<-{BuJx%ZMVy!dBad0g(o}6wwp7`+CjU91h+iiBNZ5|4)-4t?e zPRMV&*84$jXmo9YPw!@6JaNW5`ql=0qj9$OMHpS13QPqi1CxD+UwQTe?Wy=wdF3^3VZqEK z{-idVp{*8g;G-yJbWNh0H~dg1LTmkF-pVWv!SzTb zhu{Y2lpks**!R+*2!5y}mhpZDi||9G-t;``k60Y@iy!JN$bPaZ!4Gvc)bNY&H=u!g zTuDfRTZCrNV+4MvENbvc9vp&na-|8GficQJeBZok;6yyf02Ge0h~IMx3a#b?zh(GQiM8-YXc88nZ6sQ2>F{JQB;C1&{FW2^W16Zsw_y^X(` z747$CDKX-QYE~5SLp3`P@k2G+T;M-RQ@?MRugdoJFQfQs!+uJP_@SDn3jJ!i*Eglj zL;ZJg{=5|%R{b5}53`YPC-%jl(GPVtXUMz0g*fi?L#4kQ{7`uY(+_nAD|%lh8~sq( zAQnwgJIPs+rz3;NmF250$G6JJJgRYJq9^p_-SH-T`a5qYAi(nQLp9R}2KG?~hoDcD z9~xkv$suUw9}#$hGB^Y|IP^p9K^cCikE-^J3-G+6A1Y5J<%c?n2Eif7b42-}4x$2n zsLfD=@~ z31~P$ZCR!nJnqpVzhf0B_ zUS(1Ep_;Ng@DWYd_d`8_%+hSr50&nUfoo|BeyF^g(Ue++8h)teadZYQVTa&{%FOgb zJ)5TChsxUo{ZO~EYH$dey%-pHiT2=!dabfIBEXkp^h3Q@HFaDdi}~S)YMyY@0_n^T zKU7nm9cab;;1D$B1%Xkl4}Pe_Q9rNffv(H|4#A6+0)D7(GY9-o*#hNK~C6eyCKX>AVc6*^LQCw{Dk{CwiLB zlg~OAG7xt;6S0rw9PEyWY5@FDJFo}vL*-QfeyAroIPgOqs6_ao29b{6WAjjDv#+3x z`k}6YmFDzUT^f8Bz0`ty!=wlK*$?bCfFb&!mLeDYP)m@{d!wFoFY+|F6}lJ_K6}^c zNzXz9r_`sNaVMeXomcZd8zmHc0;avsITM*kr_{Y@i1&GCqK;QrCZQm$xtx489rITf ze!=P53!y;_a6MV@QTHGR zqEACs&tKN95Yjs_U*E)CNM8nd2|@59$oIRqvlbd$*#unu z`QC#3GD54_3p9OzQjy=aJwmJ5lQeyxD)|D$M-VdJLsor|8a%E;(-k2DEztDAswG^5 z=01d0(=~mF(!37o6@-j6D6S7lVSCfi9S1_j3ifMAQ|b;Ox}UnktYNsSVH%n~9wCFP zQ0v1}ILP}UKSdq?+@%k1LR~9Nr=|$47UXF9xvD4$=lO@1Rts{WN@A{uA#PKuJg5Rx z#d5YFv|5l4m9lj%#6eU|rmg18wG!eY1RP-gt>BFBF6kWqf1zMJ%_7cR*f~O6=`a_2 z#%zs0>Y=wi71qe(a@>-x0RPj2yL`WcJB(zk~u>=;t;>WyL zL^j>rpvUG=dqfHlK-x$sqh4Fxo46PuMq9mdsk0vn%>%)(==_Fw?E zEoFn=Pz@SOFdH<_-k`CcLC+^lm45^x{6tj=j7&nn=xVD$)5t3QUeINBEo(SAU%_hCZBvN`ymEyt~0DYs((31fz#2@sutHo zC*&wqtGUxrA*#eH6#yIY1_GKsyM_@w(^HsO!*)HRgw-pTFv6b>hE}n-hLIo&^R%kp zu9d1?ymRW>7=qcDxr-wQ2XhV^OlZ0qjP-~;qck}+#J?e6{!}kzgi9{r%wk*KMbNeJ z1a)`RMp+}kWzQLZQPn!q>NV9cp*GxSHO`0L2$)<1^HQ{W_fo{w=ETWi4ykEq1mPtF zLz}&{h7t2TkDOD;jvnavhYg_Gs^V-fA2?&R)psmi=ZO9K>&7*dIcn(JswIrHLBQOM zPPVa}Z08}kwE0?o;~GZCBVYgs6A^I9(bai0!_*Ua7O_NbcI1R|Xt}m?X)MpB^{T)~ z!X5-nFg-FlXt;sKs9q>gf9B#@f~pDQ%yzF^%E)*nR4%Pygzs+92|~5fuU@Avo68}% zwbdis=m+Dg5MYeJi;9(G9V-mVy2ydRKq0f*BT|2Ue8xm=9KoC&W317JeGW2LFTo|4 zkg94OW7T4x5lC@-Qx&v}7S%4XEGvPwpH#L-5I#qM{>#fwXPqOA^ivuymaCQJAld*6 z)k{ui0flAT0(=AkmmmU=-CF}-^AIKcNku1EmXMcOxv?2;iEITvgMj-EVK{8?_HEf> zoW|ZpKo$bq2xC#Z7o(hPY(9dv6`?}4>cWEnpDJ=8!7P0-!JO^qMGajjR$!jndkA$- z{m+%f^La&-vML{Uyl%K$4m3|T7B(lt#e{aM=m-M4=Fk>TA+m88?-ffJ`4a*zQ3Sqo zK%SYzO$eAr&j6BDKSmSS08CkRwX^C>W1UJsYh>d!#lG3)`*08p^>_a>9L?oFGmhrc z;z|%~=I8!Te%ym+e$AyOnDLCJyS$+Ba5o(6YTDYR8w-Q3hDO7nE5VqZjaWhux^jpu zTn#8B7;}P%H3+)AMtnBXinCeHa5sUC1Xn^!m)G4Q$z>$LYEn`PVgXkJH>jW8hA)_m zMBU{xniLdd2e%u~Yrk;0+{W!ogRVx@tH2fO#-FELF~+p)T%>_}I;JBqC205xjIo1} zDK`aq8n|N8q0T_EF(GIq292^HWM2W~s_b0!913@O3O2Vh4PUk~H`oIGGh%~? zA=1K_PT>C%?8g~ZL1RvV(IlH9_H(n1IAq0M#Vdn`KWJ1I7^$j!Wj3m(1*A@6$5!WwYJXHDC+}B*wUe`Ml7{(4-_Kspd5b8uL`48H0^R*~Sc1S)kfD*oeKt zn3wJDpgMx4_=C;N7P(uflK#QQML`4QQKn@uXy8(to?U5N3@O{VcrbJ*j&2NM{)@7W z^a4gE=o}8;9{hJdk(9y%)K4!RhsJf|aqFDSLxZt&_j0E~$)nJwIU<;LF&%>~B<4vFzFeXQOF3y* z=)d6%!@MmRhmvd6#Po2a6OH{#FkOx9I)*;omE07`xhW~h_#v*RxMBz@jyF|^W^*@~ zJNI0dOJNfCL3f6$DVpOorUr3lq@kVdl_9pGSe-YmOI;~$oJDP2-ZnV(7LYVOpRHu~ zJX>)lAl7J%D|s;F5pFcca8EE|RiioPEmfPn&0LLI@*G1eQPyuyNN#zGRx;}D6r5cT zFTvSkEXvMo(F_gUrE?_2YGyFom7D`vPT6|rsZGmTjRiVxt-4+|ch-5uvn%oCT`s6E#PoY==9&oYUuls~Cl_eFG6DH3ro>g3tlRKfb zyyBAl3H^qR9yGeBlZg`wM~|2=qN038$>gfa2?P4|i+-k7I=j5mWPwJ_lgrC5nOY6pFqPT4Gv|vTayy=zG%gcg!ox9|8 z>3C5vYu4o1b9+oKuc#_nkTt6d_NXH5c@LSH(2UZ<=nSosj*%<|%@tl~-2drT{? zm;yy{#pG!{@FCT_E+tvB+LzAGo-#X_HFe7T;)>F&ykOS3`QSw^E6=K|s+c|*1!qn# zuAE*rm1N0t%fO9ZUX}%pdm;&xrxaHe+vQUTl`(pAF%qg3=698|rk80&(`U_|TTxOp zyQ%^V?IjDU@Z}^rI)yXB9J8WJOiK6D@VeKbXfLV^4I0`XQ)>$62nRa1Gml)6skWvg zj_33Rpv^BWtt>%m$*hu!sU>BT7iuWbxuYr|M9 za=FXnF5hgtnu}^BfJ$p_7tJf4ITv$tb|*Az{^UxeV!m3bvnEBSs`?mEeQ-KURfpvQ zia640M%z~xh|twzEGJ*0+NfyhrQdL40}10iRkt zYgTa)*CIg7Hng0)=9IO*T`jFBDVaIF5=Cd3ZNIIGrWMJBfalaKR>Dh! zI+$wG;Db{PbA+}(IyL53Oy_089M8yUZJE~0r2@=xsgT7SC}C_dOF4pC5vM&A=C`d= zXO>UG@&WcK%_c1@DaPcsMs0dY3F<_Li)TjH7noZ%x3UC-SynPXvXDX1tl|Y~GSBSX zvDjRbVA9M>)TIzVDrEp=^?_4Q4rEnF-CXrRmMTE&%`4}W%JQOVIL$CDvkQ5IWf23c zp}>!qBNt$qlhMmoo$n%xr=ZD2mFjcnscM#6os1mrqDnIX7m=#+ONwUVCo$)MeLAb5 zz>t)dse416RWdLGG2o|Lv%#X}$8o^4u?{g#YYt4AYLYpq>T-gQvdb!GmrR~sI=y6y ze8P%JQi{8Wx~t%;?dg?8lNS_gv-_2o;M#!WTfzgvYmqDwU=@RX^IKJ%P?&hAZC3G2 zbV5G-)^Pvm9&E$Q`g!GiWWfz5*r#Gvu>Y({B~zx9ObOynGr6R)vb>@)*fon6{H!@0 zaW$S%UeWf)-UaaZ=tHo7Q^>co*2X8wzVR8$yjOXa$6W1R;kw3ot#O^>2EA|m3Ww3z z5gVV;mw&S9lZ#z(3GNY^-WpL?m;PD9G`BxynAZ{ONpvRbDSE(2)z8u!>-ejsqa~h$ z>u+|IQ#<~(J>8JUc1vf-vv5?#BeQKYG^dtqlkpH=M>6mV%f1J{X}g@P{wm5b;F$9}!&9y+cpS8SR~Wh4@NJ6&&1H-D zT}(qkuJuIuEFun4D;( z1)mfAo#5+&hXwyGcv3J1gTi(+6(oNk<#Pou7AzB7B)Cd&li*!~4+-+M4DI|`Ff7;- zPr=mlkLJXlg2MzS2-4Mp>5Bxf5!@hnx8N?p=LHo9Bg*kly)6HkU<#%%<#fS3!9Ic` z1eXe~6x=NMpx}ps{}fEYRHEGs!F<8Kf+Gbd3T_dkw;0R)R`3nM4+K9K#G{MKmn=A3 z@FKxkf|m(iFL;aKeS%L29uPbvcvSE!K|dxu+x1P~6Vk_m=@$vk5?ms9qu^FSa&R*L zdAI}+iv<+{9pt4V-zd0UP_f7%eV@p03jVv_6JCXLneDhq@J_);1b;2~hTvhr6M}K@ z4`KN5L6}(OG zVL|J=!nZ{JNYI086zw$;Oef-)w-#(qL>qew^2S4X01@Rzi9A;DLeZCsJVUTt^y+&; zlvm#q0;zewaIg4YYK7ThX$ zhu}kky98el+$Z=)!9#+$ysP7j%ZNg#74pu>9~dZwmfZ@B=}0UqiW1 zMW!Dk?fpwo-RB_3@je7h6r}4XWqKwN>DNvy5bP~DKyZlQXhB6$iTvt537jPQO9aaW z>E%SbpyX9}qu^RWbst6gFGQvX6!WY5DDZWW6%{Jv_eB0s@b7}33VtcbpK`PlBdAm0+G=XTg4g0|fbr0_~0yEE1e7I8$)8;6lO61eXh5D|oBmoq}Y@rTra( zj|n~{NY5{((+i#WH^C!<#|8f(_%A^R@7u^9C&(`oDD$t2#56&=kx^E^4}b$j9xBL% zcbR^H;3Pr*@s#>XK`x(5xms|U;B|sG3a%I2BzU{v-GVO&()F13elPgC;5&lv2_6+Z zE_g!lUxIP`eE~akG9;!7rU~LJ4W(}_NPjuz8!E`ZXHy<0SS(2XaO(MoY~pOe`GSgH z0s1RMUM@&)5$0bbsQ4Ek-y$-7^O*iC!N&#n3er=L>2C?XEBH6TzYCJ9m-#F&z98b1 za|B5PPPvC*A3=I^Qa@C1wBY%IlLSizX9x!79N8f=dOj6r}4l^WPwNli)@{^?MTOcZhti-~)p6tYrC@1z#6@ zOOT&qF#SWp2Em&IHww}pl=gNDJ|+09;C{iE1z#6@OYmL6zX=`{JT6G*QreFf zOc6XwFepeDLFQ{O*g>$fV0S@!rZV4X!3lyB1*ZyLB1pGY=3gbK_&*?T7Wp>8y9DnS z+$s2&;8TJx2r9l1*!i8vuL&L!{EOg+f{ITB`7u4dbuA$4KFRkYKYA@7{H>rW+u~4* zyn;BxC4n*JhMzQQYmGe)58exzTSq|)tbCbJFwSGgjrn-Lur@0?01B%N(>_DOVg6v2 z%}VPB8IKNHZ_)d*aQ?wK-vwccXtc+6jYhD_AgUe0OQRJ0{;)PHtpo}y&a_XGuwwo4C# zTJ771IOZsaTWzagFV7NyR)2}M>7hM`d_gE1LC^P%w3mRuI$CMBW$ff?%y1 z=ma`}4xpnTcC&BVE49wOEkfjm@L#UAJXD*xs`-hPwFhc5wl)F}K_K+UTD;jism;$k zsg>$S;`Fy`wcZ1d=z5Ej3AuOf^c{&a+V@L8nGpPAt#gF;xW}7$(l!5W*o;5!i8pS} zIO!^NtWQ6gl0>V{BXJIW?Z6`rN6V8bj@SApgj$4NdL@3N@0KSX^iDH2XPnf#I5uaV z)H@@m6D2;?H>JaR!*uT^)Z|N?wq|GFBR-UF==eIxxgqA$1~H!}d2*iG>DlQ1w1NAP zoz7KnCAl^jpEfXl2mOE}#sK$b$EOV(p(BpI%_n;DU90-lI>Bb)iFL1y*{q)vvv%oc zr4OWRPT2I8*0?ZXjUP+`{xuD-Z?L8z_6^r0lU2ae^a8hr%rT?*4_Vqva$h&#^7T0lyi|uS*>u7)I760b+LjT%C@C+mg&p_*g z{tdq49)}TH)mIN0IMyA(EugoU+<(JUeH6n$*MoDK>1{jxadJp+scMd#xkKK->wf zGbf-p24ZXCHhORB8agLr+}u6XGj!mvK0h5C1NmQg6vu!E90MLlOE3=Pe-ZC%SsM@Z z0e!$&U@SNW_JU)8e+e3c9|-2T?$o&?h>sUGzNFu3ot1Kyf@fegu8sH zCAA+?!8xGgc4HiX9cQ<*#wt||*Ge&diMVrE>U64{t`z3tH-*k~&swZhF)u&`o`J7$ zc>vGA7Fuw+_}5dcd9@N*j7y<%1(Uikei(JSGLi=~&iBNw%%qDLABm>Aa*}yn!*^}` z0odA*I)Kqa(??NqPu z40J^nZylZiZ=Us`s-Mqo-YCyNo)RNG1HVD@ymfd6y!mn8!87nHn8@%7&p-_8j`9rf zEsHnGGcX>_^hS9Gu4m>b&%lf9P?Tq29Ge#98OUeZD9=Cw%SL$y_-6{Qjc0&!z@vKy zd+5UJzXnIu8|4|`v!&O@Gr%w0yf&VJ1l*Io-^MfW1!`NRdoS`#q;)mkQJ#V3Y+00N zpc&g8334DiziZ(W`N?@K~xVDb!jUzQG-JOkc?(&hp`KWz0zc?SN(@us8s!<_TMBQKXJ8L|6y+K4u-+fVGjJ!G*v9Fd=frn_< z#xw8%2gAlQ5YK_N@eJ@`9dd+cpfU5?cm}>?r))d}f9HtUcm_zK>9z3;{DI|dJOg~` z<+bq)aJ?_Djb~sD?a#A#0}2BrEN|l(Xu^uWEQ(@;BxR@sGJOf#@`P1eZc!R@e@eB+=2YlXi-BW{u8&KC08_&R>*&7?r zz;D?9Z{iua5_aRg7SBMClf}j}(4K>9;~6-IBL|)Vbw5t`X|asd;TiB&J3#b;R=vxt zHlBe}%2!5t1|DLEY&-*`>G0Zk2EuH$jc4F&HqFK}a4F9N8_xijee~LR1}a&fjb~sM z^V@g^wy-`s&p0PQ>jGnm89Gr*U; z-hYp0z>D>+6wg2v$JE9%FqmWZgLnqKSno>l4DhPswRi^9@=)K%Gr-q`|0$jUQY?F; zJOllCknB7I7a$$K$4ENSjDMy#c?M#yaJUuEz$D~f8tjH4)q>|>rw7&FPPC?%Llqn4 z85lw{*Xl_%$Yb&hsCUj_9@quVSw6=u8_$5_QD^eKP~&zOP=8X`6Xh8oM~LIGZ{Qgi z$3l-g?K}geXop^4@(l221~)wm??lKm&?Cs$P^dx(=?UnJ-c#`m+yHqVbvpX2_fk9q zgK?qlh>(6aZT3!l7U}Om<`+U4Y^UB=kp=LtU1Yq@U|aQmiY*`;RkuUP;IeDNN5J1D z!x0qEKz~(~e^}x5UhxcsRLT7?%%!<9GN9K7GX=%xu94ES^z!*)sp)mb4j|4 zcbIRG(!CG)0CjI*rw?lUEV6GxhxlGRqb>6dRrVUAq5M6S!Di}1Q&>j{}5m$n#M`d0U78B(VA=iiB4;ifSlm7s*|%2x%!@xvkh`~M$XpC=6lMf zY0HdjZKff|xNptDKddf8j<(81vYyI@U4W|2M`))SCQ7aSY)mCi8w>_EeQxYyD42OA zv}6mJiIByF>{ZaLfV3O|uee!k10qf>h`qib_7khvEy%E$#h9Rq?Sk|xRjdPx?PLM9 ze}u8ieYtp%rD}W;nYj2}4zn;(75^JF@0rDu@x(~IQ|qWL3Eq?;4$CQB%H1Hbqy4t_V*e~L@)G_iqr`=4i`g&EGDRq&|#)6f(+=ph!`68e?!pk zh|fqstvo`#k%?Y4>PU@2WHbdHDf-MzL&&j;KJC4zewu1Y+eHYRg=jT#nzYHOZ z3920%A<>CO+QDKTjr-3K^n2pBvnbnfKQe7cQ0;gYk*6uJ9d97=8bXd$OxmFa_;Z@k zxIe+zeeqw>Adk{f6#0lYc(myINGC}(&;dkJ5OS}3}C#pl+3Q^w`AHusz zWh@if>2sru^+BW;1s*ke)SQQq#Uf%zol}irNY}VeW9%8hD4h8qw7)}{g9ur>(bDWEq2b>mK0uHGWU*NFp}+q7 z_@%5fa?a?uAbpLTYTz0{;Pp4_4V1JWfv&3FT4?n{@q6nS=!X1V5R`%8hzz9xX0;6D zqd_xZz@ZJqUjM7>Ga5J-+RVP#RUv-`%P=)>0yLVI&oWCO$Ey8GmV3_?Epr3%uSCdU z9;Qk;p{(hs)>imjZ=xGBV5n0ZZaj{E>OLj#%WX%k?&GbiGd}9j94B-y1r$CB=yERZ ziH<+OFPch&!)_XQ%`{+^c|*!{QEmn=Sh+b}&D_7%6}OU^`?pr^MBMI-1E4s27WEmN z6J5(^=TenN4TL-jy+z2UFq}fW>(FfDwA3W5oEaBqs(!X> za&|O(71u3pP?B)?oQ~J$>^RJdM4jDiZ7+gLPnSbeih9Nu%`L zeO+VRk3YhO@R+sS1+pg85xRI(Y#nyFpv1qLOVMer`lo~K*=JUj)l;atW=&E!8qXBf{Q zKFm{9yR2GgWH&E2NFeeVMI|6py$!cW+?qxZnyKg*0tO&MN4Wj z&;l;?13kO=f{KnJyo8|4z`nWhyV6J$kqC#w*$_a6GYP;eI!bL=%1E^mDxEcq@H&s4 zY*1`M6mCEO`v`$8Ri$iAE@YG0JYBnxz+h;X+M9eKn=I|zuvD5BfySy;qX}{#MnuxA z2)e);?6gX(5FN$V61h4efTV{oNkz{iY*5jWgq;Y6Hg`b{BhtsMOWmNSq97gH8aWo| z<-`Pe;hw0%SwmrGRN=0P4hP!9aXE;9 zX-OcZDtML_)iCm|DOA)jLJvws)WpaqrZA5$10oxrWhWtkTZ3Sp2dlT+MjWNEMM;=A zBg_(GtV4=UJ+6Ar>81p$@1Q8T7CLqqQLEqJF^cvXLbSgS+_vsbP<3O+=TqH-=T=Tr zd`AJkCbwIrET8^tM~zW+)EE(AaSbCpjGz`Fyr7~N6T%3Fw!~S($T3q`T*CZ_gV2M1NXOX;cXjUdR`JP=W}@g0QO7#QK$ z;6FBG@KPE{LJQbFRZc2Jqme_6o&7kz1f6;a)JF0l z&YVr7yCP~H$I+)dVCKh#JPdYIPr}q^tU??6IlweEwoSy;*wdLJKNmNpyu5c zU>X{6y3&pq&Eru9cwVysI0ihKSu1$Ntje9_`Et|3;|Rz@;0PfPa;wcyZ;o^fnxQPw zS_4cYl7r3B8dg^?Zrq}VwqLU)R9OjBn&UXy8b_;eBoAAYiEv5+hr1_2qH3m_H7>Rc z!>-!AIJ)L_>N}&A*XqWqlZYR!c^LNKm}*PDTAoL zEh)AeknO#f`Ys4La6Qpk{%;8OoHk`-XmmHHCqw;Fa7I#WN7(juON)%8M`wBSiW0do z+Le)0SJyvB&Jzf>NoH3@ire0LDVI(Z!MURIl$9%v($rH%ibr#vat>SNbcgkV>XdPI z@Wf-VwbF_A66R|so6^vEBQ>vKk>l_5P{Dx9`W=xUW-$@9d6Bc)5vwyRuPiphv8w!O zuR&HhryjldN9$IGzUvaD>oZUtp9;|R@%Ho78+l1oKP8Prt?K5pnz`}jZ*9D;FswpY zgRmZf7Y}Q*>!|02{YlfH%3__N&p_gtW^If!>_gy*W^L9RT3dR~ z90m^pXOOj7$BKj59f4!l`!wk}(B&cUFI&uOZHzO75O}S&HeRL~CLwUNt&O^|2;&hh zM&MCkur}sps6gNqeKA7)^fF0XAZhmWM2u;w1l|DboBeq4n*u`{iX1Xv zx+;>N2XRwtb^@6K<^{iGm{nXgEqfYI+sU&kLFR$xLBvU0G^M1p7z8#&RSRdA zR6>Vy+9boNf`Fg-B%d*3ku1=H-2(-ocVm8%hQ!Pw)$nIolxlCU21+hPwO3$L?15NM zk>@3l22D}zDRw=bBwNkNvR9$V_p(X8XSiFq637$wUF>?gQA}>W=GkNuD+p#67!3x4 zwQm7yp!UW(JxCntlw4Yff3#2i!qWIg@UbM#bY={eJq%I`BCl%~Gy0P9`E_%1R2 zsA&Y2eQslqvTPVH#3QR!-3xP=#+pZ{<~&fZ+Luv?%htL{f1aa|?E3jQti~)J2`>&`Fo=>kpzooL9@Y0;)y}nMJ6lAC@k426wOL;e ztM6aRG5XrCj$K4wT_MNlb6w4*h@s_6%!7KuEMPYLi#d9>YWdai=9qmkCn$0-dVsE? zO^(PhDeG_>Cn`Bve8$Qp?2=)821Az2p*Z0$5CiDt>I&VJrt5=s-JO)>^0mRiTnK(c z5D21d6Stvy-H0a<(jT)uc;1~=lL^%~cz{tTSH_OZ#4ql^VchKF# zU4W9PIeZy71Hq5?$r3#n98BWDHBsWh!Dv7DCzFl&uYnCcHrv-a``cIv=LsueQ&(~+N`4nBA^TL1l`zwFI#xn6BUuUKj7Pvqm|*lbr|JfS z#~{wQ{W4xr$_knzp2Q2`cCbzU8*GIxymqkI3V#^wn7Zvm2)#~6aL5}{>GTRvOj#6x zxt)IItcPa^4!@n?a87O~#mV-4X%6u%gh@~+bceza`9HyWD3pXz?nA{o2r@^oxsk8# zN3$K0fU^h#u^_K#I%)BKj@*YuqlXRcQ#kHFL4s%D4#WUobVS}qMc+}GYX0Ray8RS55gVg9 zcuZG+Ksya5qWV1rPQ(mQ>&g$O$fc5x--<_zZfWE@XegK>coq?ft%&gL$`pORU{}GA z;1EH6HcWdL3(gdrBgl7|OkXZ|y`bWif_|&W+XZ(EJ}3A)!Pf;33;td3q@d!9f<48H z2vod?K*fs)ych$=cJMtIagiYZB1d_XpyEY@{E)~81r;wM^kI=(@+}x-#fu2+DYD{4 zggilH#fu18@gf2hFCuV*q~9&5coCsjyokV8MgN}QXM&0s5$Wlex2#|BA_5if5m50W z0u?VJQ1K!H6)z%C@gf30l=A-+RJ@4LD_%sP;za~1UPRzXoF1%iq98vwq)&+u&;O# zfmt{K*xnw3{NRGJ;zb0`5?S#gLRP$pz^$Su?*a2GUPPecMFc8dM4;k>0V-ZZpyEXY zDqcjO;za~1UPPecMFc9I7GNv9Tc!O@g8c=@2$l%W6}(FDCc!%e6)z&}C|*RM;za~1 zUPPecMFc8dM4;kD1S(!cpyEXYDqcjO;za~1UPPecMFgG$-#oTg@gf2*6j|{iLRP$p zK*fs)td?}eiwIfqA_D1OPCJSh5vX_(fr=Lq_?DzAUPQ=>7ZIp<5rL=WMMN3JiwIP_ zh(N`Qi2RBd5whY%1S(!c=oK#_WW|dJRJ@4LD_%s%iWd>6coCsjyoit$FCtL!B0{ft z5g{vHM4;kDgkJF?LRP$pK*fs)RJ@2l#fu13yof->i->ZH7ZI}JMFc8dMCcVSB4ovj z2=wFH&2da6LQWHGA$t02Q=cQ)N%Xx%E)*OjdU|j(|2V;mL_baBnSz%JE)~2%aE;)t zf_Dl&EVx^cUf1LedRkENBcdOFkaWe9h<3b98TyZi2%m{e?`gKvz&(rTAtGN25oygt zZYM}*Y3h56On+(Szd-bpL@p!39(|*U^F@CR5$(N^2s<^Be!Ji{(LX5iuLSoJQSJpv ze@*mn3jSI2ABz03;6I5d_m!ZIwo-0LM7vT18;ib~U~AF07wjzh0>R#bV zTSb325$)L}`o{$KivG7E9}s+l2)l0!zAN~Nq<=2>wV;uJ{Fo0u!34n+BJ7+c*jBIu z5$)+kM7e%~14Tbl zL_b;*k^gML_M-17a#z8AMD%x%q+cxhNrIOMmJ3!9VSgDB<*pUEM$&H=+%C97@K;2X zd!C4L`$c|7(%%z2Ec!2q$oI9N0Vj0I$wc%kRj{e(TL^X};#$#9aD?C-!DWIqf;$Bd z2*xCv<*{s$vNJ>wj~%Lh{LEE|t|-LxQnYQbfK*9lrYy&FW{B6x@3Ho*r3 z)pH)|d0gbZg1;8rFZhn&dx9Sc{$0@G;cd(3G}y}#>?nASU@yUt;9$Ygg69iP5u7GC zM{us-62U73)pI54y|KUr6AoPn9nQd7i=WhSg?g)E5S^` z96^5PPdhyXLxO_^)$=#f$A~;ZP(6=BUnX*eV12&c^`hS-c#q)yg8UYq^}j6mn&6v) ze-%{E^~e_%nd~+!M-LF9Q&2tUBc3X98$o=Ar1J4Qd*&Z2c(LFl!Rdmt1giuW2$IHu z<*yXHPVh#-^@5uO`3*nw?-YDgP`yt;oZs^^{jeZ8k|F&(8G>bka|IU)l6!#d`-R}$f)?*Cc`up%xZtyb zzZN_w_^RMLg6|1_BuGjf+BqrswIF#8sBb1niWAE11ncwfk_L(Cy#)sdT0FeuNMO3f z!#hXhxq^!Ys|BwXyiRb9;CeywE70CfLG@k+@{=MzFZf%*gMzOLl8k}nKN0*w@GC(l z-@hQ8->(o81se%A6>K3$CI{y0EvVk}K)yiaGQkSLg@Ts}t`S@>c(33Cf`1VFqu@J& z?+Jb+_;*2aMyU1+HV{k_Y%JJJkQ5TkpD#$F2+9Km$>c!!B0&;0P_7VE@0n0H=^ChC zDM)4p%C`z`BO)L98K{3ukTeXG4+_3cL_QKRP=7>_R11{979`sO_TMlrIoe@4FzEiA=%*rmOc{z-uYP zE@=y>zeSMj1eA9QlAwU{uLa3bKv})l0+M`y@^L}__NVL?Bn1KGCW7jH6=e0k3fM>V z{RP#!9ng;#nG^ynf0^JiB9DW}Hw%&`fcdry)_?!Rulbq&njpXBr+ie9U+hzM3G$$w9#k!8U@Kf;oa61$zq?3Jw$;DmYGXg5X5KDT1>Fs{|JaE*4xNxKePH;5xyr zf_DgR6WlJiTkvtgy@JmP{zmXc!TQfN?}+|A!4CyL7OWMl|9nF~a2_9iv_!1`d_zxv z>ggL!q#r(!KHx<9fD`HWO)L-`C^%Gbgy4CC;{+!NP7|CdI9sqvaDm`r!4-ll1y>2K z6Wl6jJs({tzu(pT!MmkY84oSHa^bA1;z>ZPL8x$=6(bG0maW!s%$`(Psb!yr7ad*^ zXL!*umfSGpYHN+X2LX=~YU4R*->iI@P%_SI0XOEe`{g^87JuUaT4ksrncf9Fkg{26 z{UGCZsPz`TR)D`7;(Eis1!HRRkw&#^G|(!8sJ0q^Fz54`wOMH;P*`!My@Wqh-vxWt zW~CKFVXt?@AlyfNX1yE-tKKTatunMx)kf2TjL2rC@mgcIw|k7qyUl*!b{VmEHR4to zM74FWx5K8eqE{l#Ztpj+HxcIp?V*_wdwkbol|fW1Y=`Gsc0e{O?Iy@}du_&<<4SvY zB^9xEC*mx_YcaQr@^IYnyVBa2#;`-s%J)dO@5hUt*&S`Pi~+6r@+ji=_T`{`3DB{9 zc+D1R-#)}~*k=ROHXHWP#K>m#mx$qtY$FWH?N!j*wU3mFjxAng z*2&i!?R)by`6Av9`FYvp9fHB{;ziHx)-kVZklV!ArTvG7;CURes)M0DD&gW-W1V)BcI^1&!O*!! z-iX-}N)H8dJjY_Z?wezer^Oko7U)Keemv+l3S(Bq6dtNgeP>|kKyB*QU?<1%pmSsB zP_1w4f!biTcg>;NwCb4EV{3y2<3s(iA6uJN&>vxJZ7MJom<&t?CIAzFKA;ci0eXN= zptGRK(U?sa9(6Zva@5uM!lTaECPxhf$F&z8)vtZ>IR2J$OuORGM?akrcRZ+%4($k+ z?u+Gq#<6heCg455dw_d@dy8N-7((t`|YWkLiZ#^;U zXnf-y;kZ2&;db|AhcACKJG`}BemM4?%J45YWrwS~mxWh!?-X7>qgU9suPnT6d`9^G z6Z6A&Eh-CNb0j;gFG@V>Z%k`Z8$sC6Y&JZw(I#SJO8AEHZNu>=mW1zKlpStyWL9|V zj8R8@u`EA7+A?RuV|MQ-qxLMVH>7|@9RE2oHd?pSrTr&s73g`6SL6f znc?aaiAUpN=b7zLF1$iX(|f zW3N3Y?0=K}X&K(8#)R$22;bJOZMbEm9mV0>x)+CAs&*_!`C$0A6O+Q#?Usb^J%RFj zri9z<8FkcqZAN$*+H&_It3PeS&UP)r%WQU>-6w{ZDLcWibJ3KrXNEQQ>~EK_Z_&K) z-7_u?KLDFo4dxiN4Z8-@UUB#;*m9x#RS2%}ZNjd7CE+%Us?he1>UiFx#?TtOf^f_} z9Jd)uKYQ!`xQ{%J{h_T78KILO>x=YrKKWQ5-#UCvyQ$$@F;gz@J~h0xd+TsDX3L7f zt#Qn!hVNXoBV4@c((o0SiG3QM6K=U@M|fi6Md2$kLwm<|52s_64vbwGUWQpa?b^=a z49wt?YYWgOwtxRCj~~~4g-1PmoJV8!xN!y+9(CX2Iv#X6kGk%;E>w8b`Ty8^6ZopC zb8UR@v(K31Bq0MQ41qur27!<;3sE41Aj%vjAre9o2ogxh08tTeXscE$iUWc*)S(VI zP}{22I@GzM2+noHSwJnQ)mUu(KhL|~opXqK>;3NUeqZnJe>bc=>wVW+?|Rp;*WPCj z&)(|A9_alf{#5TLaZeS05`v%OZnw8tTNc`(t#4qT%qZ?!{KkI&udGd7inkW~z`Gwv z=(T71feRC?Yvy3j4Q{dzCM3>m^PVxGWJ*cvCp}K@S5gA$khJiNkL^>JVb+estohsC z)f2CU)_2(J`(W=o#lgehj`D6RKd{AnN=>glafg#VzQf5*uaa5dtGAE!Kz1NcXv<2N z)z&>>0>Z4e3}6N@4VVV@`W*Y(;@o1-K62RO91htc5BW*>@pd^h0`!fAZ6Cq(ElxI;Nb5Ki=M5?u5$cy$65&yeNp* zz)+)aVB$=cc$A3^5)bf_qaR%N8=(t&eZO|_h8k#^QN8b`gqNTU?S)0(&3ID{LL86A z>4?Q|LE>FuB3R@_H+9SBe%O*L~n_cP5bQK5&mp!SDk5 z^@q?%0J-juVSnDMqT#v^+}DZpxt{FgFn5o@AGK^ocrV3Aq?bI|-NUOXK9+eY-1B5- zg|DKiCo=CBF(*uh{=idV(r0_J`-OL~O}j$>5OH9q^5!L0V7FFexb6ebY6A?{ePEB) zTNr+erk?LaA`egYxNr@{7doYiIH6N{Elj`N4H>((@zy3P}K5_woQ=_OQsEtPfoG zCVfBf{ouMcOUby%c-jZoy~$r3DPnnW-JA3iBD@h60N4HNQhrLL zC%X|`_a^_0$ge1a>s~&%nms$xl`^>Q<-x-2`4R3{0dU=OS8}qS^hEeIi~zXqxsN#6 zPkSOwRDkRLQ`F#OzwV2CMibz=&&Q}c+53EvhiC&__kWih_;jMr%U!_?(%tBQm_ZVe z&LLA32F&N(f(&Ukf820_#$=_+9Z%jTG4?oZqnS|tBPe9`=PZ<+8OsOv%WPMMcRyn{ zg6n=G8k6xF8juhG*FB#ajmX*!u6uce6nxzL6lDNh_ofHEksH{4aNX;SK#gp;&r9ExbBVYk337$;JTM%ExGO);UlT)c9%T?aNQ@O z8za2I6ad%#M&!WC6Zt!fg6rOlqc^gI4FcCaGkdaw5r^sEy60iSlbsXU#j3$|Z(4Ce zZA6Q>BdOf=Pyk%_ zw?om5t4;u1_Z-}AT!#YSx@WDX{s-Jb8J3@`G`Q}m>TYuxklBq1MtWlZ9wWsZg_2(J4P$YtAsRA@t2*`4}9Oj?aUT@pgO zyzvhp#)GXDdd8dfGax&WPq>G6dpk4Hg9Y|_)E#=(+xbzEgJ=&8_`K`!H^AG=p*>#T zIS`Vb!k=FD*J!^z2X6_}a1iO-?8P|eCBOY#JB!h!&@D#Dz7vkx^Xzn5zYU5@sJxub zpKqtr1)fS(AY?CQ&Xetw&B$>b6s-t3bk<&Ir!nUnP&`5mR(^S;$!;X zLYceVvX>au2&jf24)MYatZw;O#y5ZFI6?>3>F1iuaiPtYe-X*$`)D337p12*>1wq*Rml^+7Kt2fp zbMs|n`Cq2s$*DM<5*}b*lm|Exwp^~+$*KQlOu=Bc?VCUz-EsaaixNoN+dG!iR%v^) zW2tdfmlI3n+kq)Kmhu@W5As0RWHa)r5#E!?n-Exp z$n{Nfp=gJ#D`fDO5qe8>Ho+9QWMey56*8GEKHeZQaYw{LCR+>sf~|^hHiBcVscL29 z0wdJ4GIFUAYFioEYJ~b$My@qNQ!6947@?(=5&o`+wROVa`W)9NYc4^^zO6NjTN%ki zK<$JD2%vCW*UHEmqj$RiMPW@hPrLWV_gOSFR|?D`7()%l5Wkxa3QV`Gi#-ql*&{)F z?A(|hlO94Zp^v1`Tmn|!v#FJm3ka+p^p6`!y-OeXgAIhgghdja!;=xylm #(dz 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μ93{$*`CCGZh1dpYk>h>~ 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℘*H|1;$7lz#fQbm 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%0D-O-tRO?}jCM9e{o8th%X$gU00 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 O?vvWx*8GN_V)qCDEy14v diff --git a/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c b/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c deleted file mode 100644 index b444c11..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 717669f..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index a7d2624..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index eb944ce..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c +++ /dev/null @@ -1,132 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bf7608b..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c +++ /dev/null @@ -1,132 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a6c4a6c..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1c66a24..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c +++ /dev/null @@ -1,145 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bc62937..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3c1cbc2..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f9c4a95..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c +++ /dev/null @@ -1,109 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3eee3b9..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c +++ /dev/null @@ -1,163 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e303b09..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c +++ /dev/null @@ -1,120 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 76cd577..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8e18a73..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 53ad73c..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 37aa924..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9592684..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c +++ /dev/null @@ -1,119 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5587ce5..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c +++ /dev/null @@ -1,119 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f807112..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c +++ /dev/null @@ -1,145 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 267e4cc..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 645fb0a..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c +++ /dev/null @@ -1,132 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 40a373e..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b10e3f1..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c +++ /dev/null @@ -1,147 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index cd2f22b..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5de36b4..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c +++ /dev/null @@ -1,128 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f67db45..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c +++ /dev/null @@ -1,116 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 72ecbe5..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c +++ /dev/null @@ -1,159 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 039b93d..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c +++ /dev/null @@ -1,144 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d762ca7..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c +++ /dev/null @@ -1,191 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index cb967d2..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c +++ /dev/null @@ -1,129 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8a15155..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c +++ /dev/null @@ -1,201 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index db6060a..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c +++ /dev/null @@ -1,181 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c4163fc..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c +++ /dev/null @@ -1,175 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4c97af3..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 835917e..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bac1927..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a55a8fd..0000000 --- a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c +++ /dev/null @@ -1,109 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f5c58a7..0000000 --- a/CMSIS/DSP/Source/CMakeLists.txt +++ /dev/null @@ -1,223 +0,0 @@ -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 deleted file mode 100644 index 7bdad93..0000000 --- a/CMSIS/DSP/Source/CommonTables/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -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 deleted file mode 100644 index acda9f8..0000000 --- a/CMSIS/DSP/Source/CommonTables/CommonTables.c +++ /dev/null @@ -1,31 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4b49b34..0000000 --- a/CMSIS/DSP/Source/CommonTables/arm_common_tables.c +++ /dev/null @@ -1,57215 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6887da4..0000000 --- a/CMSIS/DSP/Source/CommonTables/arm_const_structs.c +++ /dev/null @@ -1,486 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 16e06c6..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 2210533..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c +++ /dev/null @@ -1,46 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index df5db00..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c +++ /dev/null @@ -1,161 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 073a337..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c +++ /dev/null @@ -1,157 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6ef1ddb..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c +++ /dev/null @@ -1,137 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 06f1bfa..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c +++ /dev/null @@ -1,233 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2ecd801..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d715d98..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c +++ /dev/null @@ -1,153 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 84812dc..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c +++ /dev/null @@ -1,188 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a493274..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c +++ /dev/null @@ -1,162 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 873e566..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c +++ /dev/null @@ -1,130 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 99f051c..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c +++ /dev/null @@ -1,184 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fa5f4e6..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c +++ /dev/null @@ -1,161 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 54863ef..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c +++ /dev/null @@ -1,129 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8d14821..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c +++ /dev/null @@ -1,194 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6659427..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f6d6dc6..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c +++ /dev/null @@ -1,137 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9651999..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c +++ /dev/null @@ -1,169 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4877d20..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c +++ /dev/null @@ -1,182 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 906410f..0000000 --- a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 705f5b8..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index 51720bc..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 433a65a..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c +++ /dev/null @@ -1,75 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c88a3d9..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c +++ /dev/null @@ -1,95 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1625a5f..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d839e55..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c +++ /dev/null @@ -1,54 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 256fd8c..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c +++ /dev/null @@ -1,54 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2aa391c..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c +++ /dev/null @@ -1,54 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 12a1c83..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 84ee3d2..0000000 --- a/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c +++ /dev/null @@ -1,110 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6719b41..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -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 deleted file mode 100644 index abd919e..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 26bd66e..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c +++ /dev/null @@ -1,122 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3bb829c..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c +++ /dev/null @@ -1,84 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8b7ff78..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c +++ /dev/null @@ -1,84 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 97c6902..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c +++ /dev/null @@ -1,122 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1f0c2bf..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8cefabb..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fab0a32..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c +++ /dev/null @@ -1,144 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9889b13..0000000 --- a/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c +++ /dev/null @@ -1,144 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 59471ad..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt +++ /dev/null @@ -1,128 +0,0 @@ -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 deleted file mode 100644 index 7ce0cdb..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c +++ /dev/null @@ -1,127 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ac2313f..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c +++ /dev/null @@ -1,94 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9a284b8..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d28509d..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c +++ /dev/null @@ -1,495 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1a568d7..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c +++ /dev/null @@ -1,250 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 586296b..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c +++ /dev/null @@ -1,296 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f51c262..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c2e542c..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8637889..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c +++ /dev/null @@ -1,95 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9e23897..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c +++ /dev/null @@ -1,363 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 011e21d..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c +++ /dev/null @@ -1,247 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 596b434..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c +++ /dev/null @@ -1,523 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a8af8ce..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c +++ /dev/null @@ -1,443 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 23cf2d2..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c +++ /dev/null @@ -1,211 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fe6901e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c +++ /dev/null @@ -1,86 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 14ae008..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c +++ /dev/null @@ -1,285 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d398f18..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c +++ /dev/null @@ -1,86 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8fa1308..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c +++ /dev/null @@ -1,816 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ed2aea9..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c +++ /dev/null @@ -1,366 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3102a05..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c +++ /dev/null @@ -1,663 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e87eddc..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c +++ /dev/null @@ -1,558 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6ad34cd..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c +++ /dev/null @@ -1,362 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fb9e2ec..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c +++ /dev/null @@ -1,360 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e25f9ab..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c +++ /dev/null @@ -1,676 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7166b57..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c +++ /dev/null @@ -1,387 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 535fbc7..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c +++ /dev/null @@ -1,700 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f232d51..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c +++ /dev/null @@ -1,618 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 21999d2..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c +++ /dev/null @@ -1,386 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 811f386..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c +++ /dev/null @@ -1,390 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 55272ea..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c +++ /dev/null @@ -1,752 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d0f0122..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c +++ /dev/null @@ -1,634 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9b0228c..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c +++ /dev/null @@ -1,753 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ad2b629..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c +++ /dev/null @@ -1,696 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 39550ec..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c +++ /dev/null @@ -1,581 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bdd1cab..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c +++ /dev/null @@ -1,700 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1096526..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c +++ /dev/null @@ -1,893 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 13661cb..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c +++ /dev/null @@ -1,345 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6898618..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c +++ /dev/null @@ -1,614 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a5840b7..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c +++ /dev/null @@ -1,601 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d46d9a0..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c +++ /dev/null @@ -1,341 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 035bfba..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c +++ /dev/null @@ -1,388 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9837875..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c +++ /dev/null @@ -1,696 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index caa2f51..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c +++ /dev/null @@ -1,682 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e5881ac..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c +++ /dev/null @@ -1,800 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 218ca34..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c +++ /dev/null @@ -1,703 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 948b15c..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c +++ /dev/null @@ -1,595 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2c3a28a..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c +++ /dev/null @@ -1,390 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9382f09..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c +++ /dev/null @@ -1,105 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f583a03..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5ee69c6..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c +++ /dev/null @@ -1,105 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f9d92c0..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c +++ /dev/null @@ -1,595 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7af8a44..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c +++ /dev/null @@ -1,387 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 0531cfe..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c +++ /dev/null @@ -1,715 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5f8df95..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c +++ /dev/null @@ -1,332 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 513cb72..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c +++ /dev/null @@ -1,324 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 02e82ad..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c +++ /dev/null @@ -1,81 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a5b2d06..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c +++ /dev/null @@ -1,137 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7d8376f..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c +++ /dev/null @@ -1,80 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f96d250..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c +++ /dev/null @@ -1,81 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ee0ed27..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c +++ /dev/null @@ -1,914 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 287d347..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7f43bbf..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 973e715..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c +++ /dev/null @@ -1,105 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7efec94..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c +++ /dev/null @@ -1,479 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d6a8ca3..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c +++ /dev/null @@ -1,481 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a3d95c1..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c +++ /dev/null @@ -1,453 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7929629..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c +++ /dev/null @@ -1,70 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5c80dff..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c +++ /dev/null @@ -1,70 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 476296d..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c +++ /dev/null @@ -1,70 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 42e7c0d..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c +++ /dev/null @@ -1,506 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c8d28d7..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c +++ /dev/null @@ -1,505 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e20798e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c +++ /dev/null @@ -1,332 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c57371b..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c +++ /dev/null @@ -1,288 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5f6d354..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c +++ /dev/null @@ -1,323 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f44f037..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c +++ /dev/null @@ -1,341 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7745e71..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c +++ /dev/null @@ -1,93 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d07d611..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c +++ /dev/null @@ -1,93 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7c32cea..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 98153f3..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c +++ /dev/null @@ -1,93 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9cea93e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c +++ /dev/null @@ -1,341 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 86d3e1d..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c +++ /dev/null @@ -1,357 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7a2b57f..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c +++ /dev/null @@ -1,341 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c48efe3..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c +++ /dev/null @@ -1,354 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bd9f933..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 01abf48..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b472f6c..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9dbea81..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c +++ /dev/null @@ -1,396 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c4b9a76..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c +++ /dev/null @@ -1,356 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4fc6e7e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c +++ /dev/null @@ -1,533 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f418f46..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c +++ /dev/null @@ -1,81 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fe0a5c5..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3410b9f..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 28ab04a..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c +++ /dev/null @@ -1,564 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 543dc72..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d581ac1..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c +++ /dev/null @@ -1,98 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 30e78ec..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c +++ /dev/null @@ -1,97 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c15ad5e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c +++ /dev/null @@ -1,297 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e26219e..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c +++ /dev/null @@ -1,311 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 0fc9878..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c +++ /dev/null @@ -1,262 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b0c0e27..0000000 --- a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c +++ /dev/null @@ -1,283 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d48d6b1..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index da721fe..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c +++ /dev/null @@ -1,53 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8e1246c..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c +++ /dev/null @@ -1,232 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2aaf849..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6194809..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8e2af31..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c +++ /dev/null @@ -1,631 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4c5a45b..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c +++ /dev/null @@ -1,340 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7b458f9..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c +++ /dev/null @@ -1,283 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ce02a25..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c +++ /dev/null @@ -1,76 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 0275503..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c +++ /dev/null @@ -1,67 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d5c5722..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c +++ /dev/null @@ -1,72 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d602b98..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4607e07..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c +++ /dev/null @@ -1,673 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index ffddf99..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c +++ /dev/null @@ -1,534 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 670ace1..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c +++ /dev/null @@ -1,483 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 011959a..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c +++ /dev/null @@ -1,374 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1d2b69c..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c +++ /dev/null @@ -1,357 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 161e723..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c +++ /dev/null @@ -1,196 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a0097b1..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c +++ /dev/null @@ -1,221 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9b75d4e..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c +++ /dev/null @@ -1,170 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 929b17f..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c +++ /dev/null @@ -1,164 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index cb57647..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c +++ /dev/null @@ -1,226 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5d5e5d0..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c +++ /dev/null @@ -1,144 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 40d1bef..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 71748bf..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c +++ /dev/null @@ -1,284 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 707e0d6..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c +++ /dev/null @@ -1,182 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5d0b5e2..0000000 --- a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3f23355..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 4f86aa4..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c +++ /dev/null @@ -1,53 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index cd54e2a..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c +++ /dev/null @@ -1,271 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 329b0c8..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 99de13e..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9c8b6d3..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 63d9652..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c +++ /dev/null @@ -1,166 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 463aa84..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c +++ /dev/null @@ -1,114 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4b0ed6e..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c +++ /dev/null @@ -1,110 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8f52211..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c +++ /dev/null @@ -1,112 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6e9ff4b..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c +++ /dev/null @@ -1,268 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9450383..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e25eb47..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2b171f0..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a4825a5..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c +++ /dev/null @@ -1,175 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 12f524d..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c +++ /dev/null @@ -1,132 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1e193b3..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 47405cd..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4546510..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c +++ /dev/null @@ -1,176 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9fcd964..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5a3e8f3..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c +++ /dev/null @@ -1,124 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e1e6577..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c +++ /dev/null @@ -1,188 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8e5c042..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c +++ /dev/null @@ -1,161 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index cfb6cb8..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c +++ /dev/null @@ -1,147 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3c325b1..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c +++ /dev/null @@ -1,234 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 259e76b..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c +++ /dev/null @@ -1,164 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 558332f..0000000 --- a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c +++ /dev/null @@ -1,147 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 33c4f87..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 4deb19b..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c +++ /dev/null @@ -1,48 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 707adc4..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c +++ /dev/null @@ -1,152 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d8da113..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e342a32..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c +++ /dev/null @@ -1,98 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 77da8ca..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c +++ /dev/null @@ -1,95 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 29f6286..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c +++ /dev/null @@ -1,151 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d8c0f8d..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c +++ /dev/null @@ -1,100 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index e174889..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c +++ /dev/null @@ -1,98 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index bca3267..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c +++ /dev/null @@ -1,99 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 68c1ad0..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c +++ /dev/null @@ -1,244 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 479f8c5..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c +++ /dev/null @@ -1,252 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 5f2a7eb..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c +++ /dev/null @@ -1,253 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f49d9b7..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c +++ /dev/null @@ -1,166 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 1afd489..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c +++ /dev/null @@ -1,138 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d118b76..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 03e7ec6..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c +++ /dev/null @@ -1,159 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 8d82c28..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c7d1b4c..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c +++ /dev/null @@ -1,110 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6bd86bf..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c +++ /dev/null @@ -1,179 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 89afd10..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 641c02d..0000000 --- a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 4e5b4f2..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt +++ /dev/null @@ -1,116 +0,0 @@ -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 deleted file mode 100644 index d0f7ce4..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c608129..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c +++ /dev/null @@ -1,229 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index c16091b..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S +++ /dev/null @@ -1,216 +0,0 @@ -;/* ---------------------------------------------------------------------- -; * 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 deleted file mode 100644 index c5fe60f..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c +++ /dev/null @@ -1,99 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2fff61c..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c +++ /dev/null @@ -1,629 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 28ad1e1..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c +++ /dev/null @@ -1,332 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 701ac95..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c +++ /dev/null @@ -1,254 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f75e329..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c +++ /dev/null @@ -1,470 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 417ad91..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c +++ /dev/null @@ -1,197 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3d865d0..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c +++ /dev/null @@ -1,182 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f4a20d6..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c +++ /dev/null @@ -1,179 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 2a03b57..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c +++ /dev/null @@ -1,689 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6c79a65..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c +++ /dev/null @@ -1,337 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 9629145..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c +++ /dev/null @@ -1,1200 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 930c2c1..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c +++ /dev/null @@ -1,156 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 0090688..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c +++ /dev/null @@ -1,145 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 17d16b7..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c +++ /dev/null @@ -1,141 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b4cabb1..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c +++ /dev/null @@ -1,1809 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a9a59dd..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c +++ /dev/null @@ -1,827 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 50048f6..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c +++ /dev/null @@ -1,285 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 87455dc..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c +++ /dev/null @@ -1,448 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3fd70e9..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 3c55192..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c +++ /dev/null @@ -1,130 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f5cc78b..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c +++ /dev/null @@ -1,130 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index f926a1d..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c +++ /dev/null @@ -1,381 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 369a5c3..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c +++ /dev/null @@ -1,383 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b5d0a66..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c +++ /dev/null @@ -1,309 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 7a1af14..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c +++ /dev/null @@ -1,320 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 58fbfdb..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c +++ /dev/null @@ -1,344 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 141f8b6..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index 6f90771..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c +++ /dev/null @@ -1,158 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index a791c92..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c +++ /dev/null @@ -1,160 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index fdc9bab..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c +++ /dev/null @@ -1,380 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index d16600d..0000000 --- a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c +++ /dev/null @@ -1,292 +0,0 @@ -/* ---------------------------------------------------------------------- - * 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 deleted file mode 100644 index b4fdede..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_CAN.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - * 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 deleted file mode 100644 index 9e54e26..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * 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 deleted file mode 100644 index 971fade..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * 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 deleted file mode 100644 index 0f221da..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_Flash.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * 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 deleted file mode 100644 index 99d82dd..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_I2C.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * 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 deleted file mode 100644 index a515074..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_MCI.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * 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 deleted file mode 100644 index bc0746c..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_SAI.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * 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 deleted file mode 100644 index 9f31654..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_SPI.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * 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 deleted file mode 100644 index 2b24436..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_Storage.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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 deleted file mode 100644 index 6270a4c..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_USART.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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 deleted file mode 100644 index effbdf7..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_USBD.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * 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 deleted file mode 100644 index 12074ed..0000000 --- a/CMSIS/Driver/DriverTemplates/Driver_USBH.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * 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/CMSIS_Driver_Include_Common_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_Common_MIMXRT1052.cmake deleted file mode 100644 index 138148e..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_Common_MIMXRT1052.cmake +++ /dev/null @@ -1,8 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_Common component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MAC_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MAC_MIMXRT1052.cmake deleted file mode 100644 index 4fdb9e4..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MAC_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_Ethernet_MAC component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Ethernet_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MIMXRT1052.cmake deleted file mode 100644 index 8611c13..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_Ethernet component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Common_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_PHY_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_PHY_MIMXRT1052.cmake deleted file mode 100644 index 08b611e..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_Ethernet_PHY_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_Ethernet_PHY component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Ethernet_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_I2C_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_I2C_MIMXRT1052.cmake deleted file mode 100644 index af4df5a..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_I2C_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_I2C component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Common_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_SPI_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_SPI_MIMXRT1052.cmake deleted file mode 100644 index 805fd53..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_SPI_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_SPI component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Common_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/CMSIS_Driver_Include_USART_MIMXRT1052.cmake b/CMSIS/Driver/Include/CMSIS_Driver_Include_USART_MIMXRT1052.cmake deleted file mode 100644 index cb0e371..0000000 --- a/CMSIS/Driver/Include/CMSIS_Driver_Include_USART_MIMXRT1052.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include_guard(GLOBAL) -message("CMSIS_Driver_Include_USART component is included.") - - -target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/. -) - -include(CMSIS_Driver_Include_Common_MIMXRT1052) - diff --git a/CMSIS/Driver/Include/Driver_CAN.h b/CMSIS/Driver/Include/Driver_CAN.h deleted file mode 100644 index 5c567e6..0000000 --- a/CMSIS/Driver/Include/Driver_CAN.h +++ /dev/null @@ -1,382 +0,0 @@ -/* - * 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 deleted file mode 100644 index 59d5b75..0000000 --- a/CMSIS/Driver/Include/Driver_Common.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 deleted file mode 100644 index d60f5fd..0000000 --- a/CMSIS/Driver/Include/Driver_ETH.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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 deleted file mode 100644 index e26019f..0000000 --- a/CMSIS/Driver/Include/Driver_ETH_MAC.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - * 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 deleted file mode 100644 index 95635ed..0000000 --- a/CMSIS/Driver/Include/Driver_ETH_PHY.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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 deleted file mode 100644 index 7053be2..0000000 --- a/CMSIS/Driver/Include/Driver_Flash.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * 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 deleted file mode 100644 index a7c58c4..0000000 --- a/CMSIS/Driver/Include/Driver_GPIO.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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 zero */ -#define ARM_GPIO_INTERRUPT_LOGIC_ZERO 0x05U /* Interrupt on Logic Level One */ -#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_ */ \ No newline at end of file diff --git a/CMSIS/Driver/Include/Driver_I2C.h b/CMSIS/Driver/Include/Driver_I2C.h deleted file mode 100644 index b9ba9d0..0000000 --- a/CMSIS/Driver/Include/Driver_I2C.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * 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 deleted file mode 100644 index 59caa11..0000000 --- a/CMSIS/Driver/Include/Driver_MCI.h +++ /dev/null @@ -1,360 +0,0 @@ -/* - * 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 deleted file mode 100644 index 827fd4b..0000000 --- a/CMSIS/Driver/Include/Driver_NAND.h +++ /dev/null @@ -1,420 +0,0 @@ -/* - * 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 deleted file mode 100644 index bff3b95..0000000 --- a/CMSIS/Driver/Include/Driver_SAI.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - * 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 deleted file mode 100644 index 61b4d80..0000000 --- a/CMSIS/Driver/Include/Driver_SPI.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - * 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 deleted file mode 100644 index 573d628..0000000 --- a/CMSIS/Driver/Include/Driver_Storage.h +++ /dev/null @@ -1,419 +0,0 @@ -/* - * 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 deleted file mode 100644 index e60bf51..0000000 --- a/CMSIS/Driver/Include/Driver_USART.h +++ /dev/null @@ -1,341 +0,0 @@ -/* - * 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 deleted file mode 100644 index fbb3f4d..0000000 --- a/CMSIS/Driver/Include/Driver_USB.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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 deleted file mode 100644 index f6b230a..0000000 --- a/CMSIS/Driver/Include/Driver_USBD.h +++ /dev/null @@ -1,273 +0,0 @@ -/* - * 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 deleted file mode 100644 index a30eaca..0000000 --- a/CMSIS/Driver/Include/Driver_USBH.h +++ /dev/null @@ -1,417 +0,0 @@ -/* - * 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 deleted file mode 100644 index 69a5013..0000000 --- a/CMSIS/Driver/Include/Driver_WiFi.h +++ /dev/null @@ -1,659 +0,0 @@ -/* - * 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 deleted file mode 100644 index 8dada3e..0000000 --- a/CMSIS/LICENSE.txt +++ /dev/null @@ -1,201 +0,0 @@ - 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 deleted file mode 100644 index e0b602c..0000000 --- a/CMSIS/RTOS2/Include/cmsis_os2.h +++ /dev/null @@ -1,756 +0,0 @@ -/* - * 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 deleted file mode 100644 index 8f7cdf6..0000000 --- a/CMSIS/RTOS2/Include/os_tick.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************//** - * @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/CMakeLists.txt b/CMakeLists.txt index eaf5c39..85a3cd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,247 +1,200 @@ cmake_minimum_required(VERSION 3.10) -project(imxrt1050_template) +project(fire_rt1052_pro_template) enable_language(CXX) enable_language(ASM) -# Device specific settings, goes to CFLAGS and LDFLAGS -set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb") - -# Extra CFlags -set(TARGET_CFLAGS_EXTRA "-Og") -set(TARGET_CXXFLAGS_EXTRA "") -set(TARGET_LDFLAGS_EXTRA "-Wl,--print-memory-usage") - # Different linker scripts -set(TARGET_LDSCRIPT_RAM "${CMAKE_SOURCE_DIR}/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld") -set(TARGET_LDSCRIPT_FLEXSPI "${CMAKE_SOURCE_DIR}/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld") -set(TARGET_LDSCRIPT_SDRAM "${CMAKE_SOURCE_DIR}/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld") -set(TARGET_LDSCRIPT_SDRAM_TXT "${CMAKE_SOURCE_DIR}/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram_txt.ld") +set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/SDK/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld") +set(TARGET_LDSCRIPT_RAM "${CMAKE_SOURCE_DIR}/SDK/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld") - -# Copy them from Makefile -set(TARGET_C_SOURCES - "devices/MIMXRT1052/system_MIMXRT1052.c" - "devices/MIMXRT1052/drivers/fsl_adc.c" - "devices/MIMXRT1052/drivers/fsl_adc_etc.c" - "devices/MIMXRT1052/drivers/fsl_aipstz.c" - "devices/MIMXRT1052/drivers/fsl_aoi.c" - "devices/MIMXRT1052/drivers/fsl_bee.c" - "devices/MIMXRT1052/drivers/fsl_cache.c" - "devices/MIMXRT1052/drivers/fsl_clock.c" - "devices/MIMXRT1052/drivers/fsl_cmp.c" - "devices/MIMXRT1052/drivers/fsl_common_arm.c" - "devices/MIMXRT1052/drivers/fsl_common.c" - "devices/MIMXRT1052/drivers/fsl_csi.c" - "devices/MIMXRT1052/drivers/fsl_dcdc.c" - "devices/MIMXRT1052/drivers/fsl_dcp.c" - "devices/MIMXRT1052/drivers/fsl_dmamux.c" - "devices/MIMXRT1052/drivers/fsl_edma.c" - "devices/MIMXRT1052/drivers/fsl_elcdif.c" - "devices/MIMXRT1052/drivers/fsl_enc.c" - "devices/MIMXRT1052/drivers/fsl_enet.c" - "devices/MIMXRT1052/drivers/fsl_ewm.c" - "devices/MIMXRT1052/drivers/fsl_flexcan.c" - "devices/MIMXRT1052/drivers/fsl_flexio.c" - "devices/MIMXRT1052/drivers/fsl_flexio_camera.c" - "devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c" - "devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c" - "devices/MIMXRT1052/drivers/fsl_flexio_i2s.c" - "devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c" - "devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c" - "devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c" - "devices/MIMXRT1052/drivers/fsl_flexio_spi.c" - "devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c" - "devices/MIMXRT1052/drivers/fsl_flexio_uart.c" - "devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c" - "devices/MIMXRT1052/drivers/fsl_flexram_allocate.c" - "devices/MIMXRT1052/drivers/fsl_flexram.c" - "devices/MIMXRT1052/drivers/fsl_flexspi.c" - "devices/MIMXRT1052/drivers/fsl_flexspi_edma.c" - "devices/MIMXRT1052/drivers/fsl_gpc.c" - "devices/MIMXRT1052/drivers/fsl_gpio.c" - "devices/MIMXRT1052/drivers/fsl_gpt.c" - "devices/MIMXRT1052/drivers/fsl_kpp.c" - "devices/MIMXRT1052/drivers/fsl_lpi2c.c" - "devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c" - "devices/MIMXRT1052/drivers/fsl_lpspi.c" - "devices/MIMXRT1052/drivers/fsl_lpspi_edma.c" - "devices/MIMXRT1052/drivers/fsl_lpuart.c" - "devices/MIMXRT1052/drivers/fsl_lpuart_edma.c" - "devices/MIMXRT1052/drivers/fsl_ocotp.c" - "devices/MIMXRT1052/drivers/fsl_pit.c" - "devices/MIMXRT1052/drivers/fsl_pmu.c" - "devices/MIMXRT1052/drivers/fsl_pwm.c" - "devices/MIMXRT1052/drivers/fsl_pxp.c" - "devices/MIMXRT1052/drivers/fsl_qtmr.c" - "devices/MIMXRT1052/drivers/fsl_romapi.c" - "devices/MIMXRT1052/drivers/fsl_rtwdog.c" - "devices/MIMXRT1052/drivers/fsl_sai.c" - "devices/MIMXRT1052/drivers/fsl_sai_edma.c" - "devices/MIMXRT1052/drivers/fsl_semc.c" - "devices/MIMXRT1052/drivers/fsl_snvs_hp.c" - "devices/MIMXRT1052/drivers/fsl_snvs_lp.c" - "devices/MIMXRT1052/drivers/fsl_spdif.c" - "devices/MIMXRT1052/drivers/fsl_spdif_edma.c" - "devices/MIMXRT1052/drivers/fsl_src.c" - "devices/MIMXRT1052/drivers/fsl_tempmon.c" - "devices/MIMXRT1052/drivers/fsl_trng.c" - "devices/MIMXRT1052/drivers/fsl_tsc.c" - "devices/MIMXRT1052/drivers/fsl_usdhc.c" - "devices/MIMXRT1052/drivers/fsl_wdog.c" - "devices/MIMXRT1052/drivers/fsl_xbara.c" - "devices/MIMXRT1052/drivers/fsl_xbarb.c" - "devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c" +set(TARGET_SOURCES + "SDK/components/serial_manager/fsl_component_serial_manager.c" + "SDK/components/serial_manager/fsl_component_serial_port_uart.c" + "SDK/components/uart/fsl_adapter_lpuart.c" + "SDK/devices/MIMXRT1052/drivers/fsl_adc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_adc_etc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_aipstz.c" + "SDK/devices/MIMXRT1052/drivers/fsl_aoi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_bee.c" + "SDK/devices/MIMXRT1052/drivers/fsl_cache.c" + "SDK/devices/MIMXRT1052/drivers/fsl_clock.c" + "SDK/devices/MIMXRT1052/drivers/fsl_cmp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_common.c" + "SDK/devices/MIMXRT1052/drivers/fsl_common_arm.c" + "SDK/devices/MIMXRT1052/drivers/fsl_csi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_dcdc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_dcp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_dmamux.c" + "SDK/devices/MIMXRT1052/drivers/fsl_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_elcdif.c" + "SDK/devices/MIMXRT1052/drivers/fsl_enc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_enet.c" + "SDK/devices/MIMXRT1052/drivers/fsl_ewm.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexcan.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_camera.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_i2s.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_spi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_uart.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexram.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexram_allocate.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexspi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_flexspi_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_gpc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_gpio.c" + "SDK/devices/MIMXRT1052/drivers/fsl_gpt.c" + "SDK/devices/MIMXRT1052/drivers/fsl_kpp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpi2c.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpspi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpspi_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpuart.c" + "SDK/devices/MIMXRT1052/drivers/fsl_lpuart_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_ocotp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_pit.c" + "SDK/devices/MIMXRT1052/drivers/fsl_pmu.c" + "SDK/devices/MIMXRT1052/drivers/fsl_pwm.c" + "SDK/devices/MIMXRT1052/drivers/fsl_pxp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_qtmr.c" + "SDK/devices/MIMXRT1052/drivers/fsl_romapi.c" + "SDK/devices/MIMXRT1052/drivers/fsl_rtwdog.c" + "SDK/devices/MIMXRT1052/drivers/fsl_sai.c" + "SDK/devices/MIMXRT1052/drivers/fsl_sai_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_semc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_snvs_hp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_snvs_lp.c" + "SDK/devices/MIMXRT1052/drivers/fsl_spdif.c" + "SDK/devices/MIMXRT1052/drivers/fsl_spdif_edma.c" + "SDK/devices/MIMXRT1052/drivers/fsl_src.c" + "SDK/devices/MIMXRT1052/drivers/fsl_tempmon.c" + "SDK/devices/MIMXRT1052/drivers/fsl_trng.c" + "SDK/devices/MIMXRT1052/drivers/fsl_tsc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_usdhc.c" + "SDK/devices/MIMXRT1052/drivers/fsl_wdog.c" + "SDK/devices/MIMXRT1052/drivers/fsl_xbara.c" + "SDK/devices/MIMXRT1052/drivers/fsl_xbarb.c" + "SDK/devices/MIMXRT1052/gcc/startup_MIMXRT1052.S" + "SDK/devices/MIMXRT1052/system_MIMXRT1052.c" + "SDK/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.c" + "SDK/devices/MIMXRT1052/utilities/fsl_assert.c" + "SDK/devices/MIMXRT1052/utilities/fsl_notifier.c" + "SDK/devices/MIMXRT1052/utilities/fsl_sbrk.c" + "SDK/devices/MIMXRT1052/utilities/str/fsl_str.c" + "SDK/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c" "board/board.c" "board/clock_config.c" + "board/dcd.c" "board/peripherals.c" "board/pin_mux.c" - "source/main.c" + "src/main.c" + "xip/fire_rt1052_pro_flexspi_nor_config.c" ) -# Copy them from Makefile -set(TARGET_ASM_SOURCES - "devices/MIMXRT1052/gcc/startup_MIMXRT1052.S" +set(TARGET_C_DEFINES + "CPU_MIMXRT1052DVL6B" + "MCUXPRESSO_SDK" + "SERIAL_PORT_TYPE_UART" + "__STARTUP_CLEAR_BSS" + "__STARTUP_INITIALIZE_NONCACHEDATA" ) -# Copy them from Makefile -set(TARGET_DEFINES - "-DCPU_MIMXRT1052DVL6B" - "-D__STARTUP_CLEAR_BSS" - "-D__STARTUP_INITIALIZE_NONCACHEDATA" +set(TARGET_C_DEFINES_XIP + "XIP_BOOT_HEADER_ENABLE=1" + "XIP_EXTERNAL_FLASH=1" ) -# Copy them from Makefile -set(TARGET_INCLUDES +set(TARGET_C_INCLUDES + "SDK/CMSIS/Core/Include" + "SDK/components/serial_manager" + "SDK/components/uart" + "SDK/devices/MIMXRT1052" + "SDK/devices/MIMXRT1052/drivers" + "SDK/devices/MIMXRT1052/utilities" + "SDK/devices/MIMXRT1052/utilities/debug_console" + "SDK/devices/MIMXRT1052/utilities/str" "board" "include" - "devices/MIMXRT1052" - "devices/MIMXRT1052/drivers" - "CMSIS/Core/Include" ) +# Shared libraries linked with application set(TARGET_LIBS + "c" + "m" + "nosys" ) +# Shared library and linker script search paths +set(TARGET_LIB_DIRECTORIES + +) + +# Device specific settings, goes to CFLAGS and LDFLAGS +set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard") + # Conditional flags -set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -Og -g") -set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -Og -g") -set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -Og -g") +# DEBUG +set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O0 -g") +set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O0 -g") +set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -O0 -g") -set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2") -set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2") -set(CMAKE_ASM_FLAGS_RELEASE "-DNDEBUG -O2") +# RELEASE +set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2 -flto") +set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2 -flto") +set(CMAKE_ASM_FLAGS_RELEASE "-DNDEBUG -O2 -flto") +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto") # Final compiler flags -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -ffreestanding -fno-builtin") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CXXFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -ffreestanding -fno-builtin") -set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp") -set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -lc -lm -lnosys ${TARGET_LDFLAGS_EXTRA}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections") +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_C_FLAGS} -x assembler-with-cpp") +set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -Wl,--print-memory-usage -Wl,--no-warn-rwx-segments") + +# Shared sources, includes and definitions +add_compile_definitions(${TARGET_C_DEFINES}) +include_directories(${TARGET_C_INCLUDES}) +link_directories(${TARGET_LIB_DIRECTORIES}) +link_libraries(${TARGET_LIBS}) # Main targets are added here -# **** All In SRAM **** +# Create ELF +add_executable("${CMAKE_PROJECT_NAME}_FLASH.elf" ${TARGET_SOURCES}) +target_compile_definitions("${CMAKE_PROJECT_NAME}_FLASH.elf" + PRIVATE ${TARGET_C_DEFINES_XIP} +) +target_link_options("${CMAKE_PROJECT_NAME}_FLASH.elf" + PRIVATE "-T${TARGET_LDSCRIPT_FLASH}" + PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_FLASH.map" +) +set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND + PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_FLASH.map" +) +add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_FLASH.hex" + COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_FLASH.elf" "${CMAKE_PROJECT_NAME}_FLASH.hex" + DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.elf" +) +add_custom_target("${CMAKE_PROJECT_NAME}_FLASH_HEX" DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.hex") # Create ELF -add_executable("${CMAKE_PROJECT_NAME}_RAM.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES}) - -# Linker script and Map files +add_executable("${CMAKE_PROJECT_NAME}_RAM.elf" ${TARGET_SOURCES}) target_link_options("${CMAKE_PROJECT_NAME}_RAM.elf" PRIVATE "-T${TARGET_LDSCRIPT_RAM}" - PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_RAM.map,--cref" + PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_RAM.map" +) +set_property(TARGET "${CMAKE_PROJECT_NAME}_RAM.elf" APPEND + PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_RAM.map" ) -target_compile_definitions("${CMAKE_PROJECT_NAME}_RAM.elf" PRIVATE ${TARGET_DEFINES}) -target_include_directories("${CMAKE_PROJECT_NAME}_RAM.elf" PRIVATE ${TARGET_INCLUDES}) -target_link_libraries("${CMAKE_PROJECT_NAME}_RAM.elf" PRIVATE ${TARGET_LIBS}) - add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_RAM.hex" COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_RAM.elf" "${CMAKE_PROJECT_NAME}_RAM.hex" DEPENDS "${CMAKE_PROJECT_NAME}_RAM.elf" ) - -add_custom_target("${CMAKE_PROJECT_NAME}_RAM_HEX" - DEPENDS "${CMAKE_PROJECT_NAME}_RAM.hex" -) - -# **** FLEXSPI **** - -# Create ELF -add_executable("${CMAKE_PROJECT_NAME}_FLEXSPI.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES}) - -# Linker script and Map files -target_link_options("${CMAKE_PROJECT_NAME}_FLEXSPI.elf" - PRIVATE "-T${TARGET_LDSCRIPT_FLEXSPI}" - PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_FLEXSPI.map,--cref" -) -target_compile_definitions("${CMAKE_PROJECT_NAME}_FLEXSPI.elf" - PRIVATE ${TARGET_DEFINES} - PRIVATE "XIP_EXTERNAL_FLASH=1" - PRIVATE "XIP_BOOT_HEADER_ENABLE=1" -) -target_include_directories("${CMAKE_PROJECT_NAME}_FLEXSPI.elf" PRIVATE ${TARGET_INCLUDES}) -target_link_libraries("${CMAKE_PROJECT_NAME}_FLEXSPI.elf" PRIVATE ${TARGET_LIBS}) - -add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_FLEXSPI.hex" - COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_FLEXSPI.elf" "${CMAKE_PROJECT_NAME}_FLEXSPI.hex" - DEPENDS "${CMAKE_PROJECT_NAME}_FLEXSPI.elf" -) - -add_custom_target("${CMAKE_PROJECT_NAME}_FLEXSPI_HEX" - DEPENDS "${CMAKE_PROJECT_NAME}_FLEXSPI.hex" -) - -# **** SDRAM **** - -# Create ELF -add_executable("${CMAKE_PROJECT_NAME}_SDRAM.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES}) - -# Linker script and Map files -target_link_options("${CMAKE_PROJECT_NAME}_SDRAM.elf" - PRIVATE "-T${TARGET_LDSCRIPT_SDRAM}" - PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_SDRAM.map,--cref" -) -target_compile_definitions("${CMAKE_PROJECT_NAME}_SDRAM.elf" - PRIVATE ${TARGET_DEFINES} - PRIVATE "DATA_SECTION_IS_CACHABLE=1" - PRIVATE "SKIP_SYSCLK_INIT" -) -target_include_directories("${CMAKE_PROJECT_NAME}_SDRAM.elf" PRIVATE ${TARGET_INCLUDES}) -target_link_libraries("${CMAKE_PROJECT_NAME}_SDRAM.elf" PRIVATE ${TARGET_LIBS}) - -add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_SDRAM.hex" - COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_SDRAM.elf" "${CMAKE_PROJECT_NAME}_SDRAM.hex" - DEPENDS "${CMAKE_PROJECT_NAME}_SDRAM.elf" -) - -add_custom_target("${CMAKE_PROJECT_NAME}_SDRAM_HEX" - DEPENDS "${CMAKE_PROJECT_NAME}_SDRAM.hex" -) - -# **** Code in SDRAM **** - -# Create ELF -add_executable("${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES}) - -# Linker script and Map files -target_link_options("${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" - PRIVATE "-T${TARGET_LDSCRIPT_SDRAM_TXT}" - PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_SDRAM_TXT.map,--cref" -) -target_compile_definitions("${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" - PRIVATE ${TARGET_DEFINES} - PRIVATE "DATA_SECTION_IS_CACHABLE=1" - PRIVATE "SKIP_SYSCLK_INIT" -) -target_include_directories("${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" PRIVATE ${TARGET_INCLUDES}) -target_link_libraries("${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" PRIVATE ${TARGET_LIBS}) - -add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_SDRAM_TXT.hex" - COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" "${CMAKE_PROJECT_NAME}_SDRAM_TXT.hex" - DEPENDS "${CMAKE_PROJECT_NAME}_SDRAM_TXT.elf" -) - -add_custom_target("${CMAKE_PROJECT_NAME}_SDRAM_TXT_HEX" - DEPENDS "${CMAKE_PROJECT_NAME}_SDRAM_TXT.hex" -) - +add_custom_target("${CMAKE_PROJECT_NAME}_RAM_HEX" DEPENDS "${CMAKE_PROJECT_NAME}_RAM.hex") diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 63c16e1..0000000 --- a/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright 2021 imi415 - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -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/MIMXRT1052xxxxB.mex b/MIMXRT1052xxxxB.mex new file mode 100644 index 0000000..9549be6 --- /dev/null +++ b/MIMXRT1052xxxxB.mex @@ -0,0 +1,837 @@ + + + + MIMXRT1052xxxxB + MIMXRT1052DVL6B + ksdk2_0 + + + + + + + true + false + false + true + false + + + + + + + + + 12.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + core0 + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.0.0 + + + + + + + + + true + + + + + INPUT + + + + + true + + + + + OUTPUT + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + INPUT + + + + + true + + + + + OUTPUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + true + + + + + INPUT + + + + + true + + + + + OUTPUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + 12.0.0 + c_array + + + + + + + + + + + + + + + + 12.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 9919cb9..0000000 --- a/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# IMXRT1050 project template - -Based on KSDK v2.10.0 - -## License -Anything comes without a LICENSE section in the header are licensed as MIT. diff --git a/SDK b/SDK new file mode 160000 index 0000000..f208e92 --- /dev/null +++ b/SDK @@ -0,0 +1 @@ +Subproject commit f208e9228edc85ff9b477a8589b99453bb621c0b diff --git a/arm-none-eabi.cmake b/arm-none-eabi.cmake index 7aba1a7..ab16b40 100644 --- a/arm-none-eabi.cmake +++ b/arm-none-eabi.cmake @@ -1,5 +1,10 @@ -set(CMAKE_C_COMPILER arm-none-eabi-gcc) +set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g++) # Make CMake happy about those compilers set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") + +# Poor old Windows... +if(WIN32) + set(CMAKE_SYSTEM_NAME "Generic") +endif() \ No newline at end of file diff --git a/board/board.c b/board/board.c index 09714f0..4a5d727 100644 --- a/board/board.c +++ b/board/board.c @@ -6,6 +6,7 @@ */ #include "fsl_common.h" +#include "fsl_debug_console.h" #include "board.h" #include "fsl_iomuxc.h" /******************************************************************************* @@ -16,9 +17,58 @@ * Code ******************************************************************************/ +/* Get debug console frequency. */ +uint32_t BOARD_DebugConsoleSrcFreq(void) +{ + uint32_t freq; + + /* To make it simple, we assume default PLL and divider settings, and the only variable + from application is use PLL3 source or OSC source */ + if (CLOCK_GetMux(kCLOCK_UartMux) == 0) /* PLL3 div6 80M */ + { + freq = (CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 6U) / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U); + } + else + { + freq = CLOCK_GetOscFreq() / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U); + } + + return freq; +} + +/* Initialize debug console. */ +void BOARD_InitDebugConsole(void) +{ + uint32_t uartClkSrcFreq = BOARD_DebugConsoleSrcFreq(); + + DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq); +} + /* MPU configuration. */ void BOARD_ConfigMPU(void) { +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) + extern uint32_t Image$$RW_m_ncache$$Base[]; + /* RW_m_ncache_unused is a auxiliary region which is used to get the whole size of noncache section */ + extern uint32_t Image$$RW_m_ncache_unused$$Base[]; + extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[]; + uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base; + uint32_t size = ((uint32_t)Image$$RW_m_ncache_unused$$Base == nonCacheStart) ? + 0 : + ((uint32_t)Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart); +#elif defined(__MCUXPRESSO) + extern uint32_t __base_NCACHE_REGION; + extern uint32_t __top_NCACHE_REGION; + uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION); + uint32_t size = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart; +#elif defined(__ICCARM__) || defined(__GNUC__) + extern uint32_t __NCACHE_REGION_START[]; + extern uint32_t __NCACHE_REGION_SIZE[]; + uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; + uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; +#endif + volatile uint32_t i = 0; + /* Disable I cache and D cache */ if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { @@ -78,7 +128,7 @@ void BOARD_ConfigMPU(void) */ /* Region 0 setting: Instruction access disabled, No data access permission. */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); - MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); + MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); @@ -114,6 +164,23 @@ void BOARD_ConfigMPU(void) MPU->RBAR = ARM_MPU_RBAR(8, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB); + while ((size >> i) > 0x1U) + { + i++; + } + + if (i != 0) + { + /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */ + assert(!(nonCacheStart % size)); + assert(size == (uint32_t)(1 << i)); + assert(i >= 5); + + /* Region 9 setting: Memory with Normal type, not shareable, non-cacheable */ + MPU->RBAR = ARM_MPU_RBAR(9, nonCacheStart); + MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, i - 1); + } + /* Region 10 setting: Memory with Device type, not shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(10, 0x40000000); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4MB); diff --git a/board/board.h b/board/board.h index 1ff8700..2bc096f 100644 --- a/board/board.h +++ b/board/board.h @@ -17,10 +17,79 @@ * Definitions ******************************************************************************/ /*! @brief The board name */ -#define BOARD_NAME "IMXRT1050-EVKB" +#define BOARD_NAME "LQ-RT1052SYS-VA1" + +/* The UART to use for debug messages. */ +#define BOARD_DEBUG_UART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_UART_BASEADDR (uint32_t) LPUART1 +#define BOARD_DEBUG_UART_INSTANCE 1U + +#define BOARD_DEBUG_UART_CLK_FREQ BOARD_DebugConsoleSrcFreq() + +#define BOARD_UART_IRQ LPUART1_IRQn +#define BOARD_UART_IRQ_HANDLER LPUART1_IRQHandler + +#ifndef BOARD_DEBUG_UART_BAUDRATE +#define BOARD_DEBUG_UART_BAUDRATE (115200U) +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief The USER_LED used for board */ +#define LOGIC_LED_ON (0U) +#define LOGIC_LED_OFF (1U) +#ifndef BOARD_USER_LED_GPIO +#define BOARD_USER_LED_GPIO GPIO1 +#endif +#ifndef BOARD_USER_LED_GPIO_PIN +#define BOARD_USER_LED_GPIO_PIN (9U) +#endif + +#define USER_LED_INIT(output) \ + GPIO_PinWrite(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN, output); \ + BOARD_USER_LED_GPIO->GDIR |= (1U << BOARD_USER_LED_GPIO_PIN) /*!< Enable target USER_LED */ +#define USER_LED_ON() \ + GPIO_PortClear(BOARD_USER_LED_GPIO, 1U << BOARD_USER_LED_GPIO_PIN) /*!< Turn off target USER_LED */ +#define USER_LED_OFF() GPIO_PortSet(BOARD_USER_LED_GPIO, 1U << BOARD_USER_LED_GPIO_PIN) /*!OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK; + /* Use free 1MHz clock output. */ + XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK; + /* Set XTAL 24MHz clock frequency. */ + CLOCK_SetXtalFreq(24000000U); + /* Enable XTAL 24MHz clock source. */ + CLOCK_InitExternalClk(0); + /* Enable internal RC. */ + CLOCK_InitRcOsc24M(); + /* Switch clock source to external OSC. */ + CLOCK_SwitchOsc(kCLOCK_XtalOsc); + /* Set Oscillator ready counter value. */ + CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127); + /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */ + CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */ + CLOCK_SetMux(kCLOCK_PeriphMux, 1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */ + /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */ + DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13); + /* Waiting for DCDC_STS_DC_OK bit is asserted */ + while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0)) + { + } + /* Set AHB_PODF. */ + CLOCK_SetDiv(kCLOCK_AhbDiv, 0); + /* Disable IPG clock gate. */ + CLOCK_DisableClock(kCLOCK_Adc1); + CLOCK_DisableClock(kCLOCK_Adc2); + CLOCK_DisableClock(kCLOCK_Xbar1); + CLOCK_DisableClock(kCLOCK_Xbar2); + CLOCK_DisableClock(kCLOCK_Xbar3); + /* Set IPG_PODF. */ + CLOCK_SetDiv(kCLOCK_IpgDiv, 3); + /* Set ARM_PODF. */ + CLOCK_SetDiv(kCLOCK_ArmDiv, 1); + /* Set PERIPH_CLK2_PODF. */ + CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0); + /* Disable PERCLK clock gate. */ + CLOCK_DisableClock(kCLOCK_Gpt1); + CLOCK_DisableClock(kCLOCK_Gpt1S); + CLOCK_DisableClock(kCLOCK_Gpt2); + CLOCK_DisableClock(kCLOCK_Gpt2S); + CLOCK_DisableClock(kCLOCK_Pit); + /* Set PERCLK_PODF. */ + CLOCK_SetDiv(kCLOCK_PerclkDiv, 29); + /* Disable USDHC1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Usdhc1); + /* Set USDHC1_PODF. */ + CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1); + /* Set Usdhc1 clock source. */ + CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0); + /* Disable USDHC2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Usdhc2); + /* Set USDHC2_PODF. */ + CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1); + /* Set Usdhc2 clock source. */ + CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0); + /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd. + * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged. + * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/ +#ifndef SKIP_SYSCLK_INIT + /* Disable Semc clock gate. */ + CLOCK_DisableClock(kCLOCK_Semc); + /* Set SEMC_PODF. */ + CLOCK_SetDiv(kCLOCK_SemcDiv, 2); + /* Set Semc alt clock source. */ + CLOCK_SetMux(kCLOCK_SemcAltMux, 0); + /* Set Semc clock source. */ + CLOCK_SetMux(kCLOCK_SemcMux, 1); +#endif + /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. + * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged. + * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/ +#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)) + /* Disable Flexspi clock gate. */ + CLOCK_DisableClock(kCLOCK_FlexSpi); + /* Set FLEXSPI_PODF. */ + CLOCK_SetDiv(kCLOCK_FlexspiDiv, 0); + /* Set Flexspi clock source. */ + CLOCK_SetMux(kCLOCK_FlexspiMux, 0); +#endif + /* Disable CSI clock gate. */ + CLOCK_DisableClock(kCLOCK_Csi); + /* Set CSI_PODF. */ + CLOCK_SetDiv(kCLOCK_CsiDiv, 1); + /* Set Csi clock source. */ + CLOCK_SetMux(kCLOCK_CsiMux, 0); + /* Disable LPSPI clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpspi1); + CLOCK_DisableClock(kCLOCK_Lpspi2); + CLOCK_DisableClock(kCLOCK_Lpspi3); + CLOCK_DisableClock(kCLOCK_Lpspi4); + /* Set LPSPI_PODF. */ + CLOCK_SetDiv(kCLOCK_LpspiDiv, 4); + /* Set Lpspi clock source. */ + CLOCK_SetMux(kCLOCK_LpspiMux, 2); + /* Disable TRACE clock gate. */ + CLOCK_DisableClock(kCLOCK_Trace); + /* Set TRACE_PODF. */ + CLOCK_SetDiv(kCLOCK_TraceDiv, 3); + /* Set Trace clock source. */ + CLOCK_SetMux(kCLOCK_TraceMux, 2); + /* Disable SAI1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai1); + /* Set SAI1_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3); + /* Set SAI1_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai1Div, 1); + /* Set Sai1 clock source. */ + CLOCK_SetMux(kCLOCK_Sai1Mux, 0); + /* Disable SAI2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai2); + /* Set SAI2_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3); + /* Set SAI2_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai2Div, 1); + /* Set Sai2 clock source. */ + CLOCK_SetMux(kCLOCK_Sai2Mux, 0); + /* Disable SAI3 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai3); + /* Set SAI3_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3); + /* Set SAI3_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai3Div, 1); + /* Set Sai3 clock source. */ + CLOCK_SetMux(kCLOCK_Sai3Mux, 0); + /* Disable Lpi2c clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpi2c1); + CLOCK_DisableClock(kCLOCK_Lpi2c2); + CLOCK_DisableClock(kCLOCK_Lpi2c3); + /* Set LPI2C_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0); + /* Set Lpi2c clock source. */ + CLOCK_SetMux(kCLOCK_Lpi2cMux, 0); + /* Disable CAN clock gate. */ + CLOCK_DisableClock(kCLOCK_Can1); + CLOCK_DisableClock(kCLOCK_Can2); + CLOCK_DisableClock(kCLOCK_Can1S); + CLOCK_DisableClock(kCLOCK_Can2S); + /* Set CAN_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_CanDiv, 1); + /* Set Can clock source. */ + CLOCK_SetMux(kCLOCK_CanMux, 2); + /* Disable UART clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpuart1); + CLOCK_DisableClock(kCLOCK_Lpuart2); + CLOCK_DisableClock(kCLOCK_Lpuart3); + CLOCK_DisableClock(kCLOCK_Lpuart4); + CLOCK_DisableClock(kCLOCK_Lpuart5); + CLOCK_DisableClock(kCLOCK_Lpuart6); + CLOCK_DisableClock(kCLOCK_Lpuart7); + CLOCK_DisableClock(kCLOCK_Lpuart8); + /* Set UART_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_UartDiv, 0); + /* Set Uart clock source. */ + CLOCK_SetMux(kCLOCK_UartMux, 0); + /* Disable LCDIF clock gate. */ + CLOCK_DisableClock(kCLOCK_LcdPixel); + /* Set LCDIF_PRED. */ + CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1); + /* Set LCDIF_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_LcdifDiv, 3); + /* Set Lcdif pre clock source. */ + CLOCK_SetMux(kCLOCK_LcdifPreMux, 5); + /* Disable SPDIF clock gate. */ + CLOCK_DisableClock(kCLOCK_Spdif); + /* Set SPDIF0_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1); + /* Set SPDIF0_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Spdif0Div, 7); + /* Set Spdif clock source. */ + CLOCK_SetMux(kCLOCK_SpdifMux, 3); + /* Disable Flexio1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Flexio1); + /* Set FLEXIO1_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1); + /* Set FLEXIO1_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Flexio1Div, 7); + /* Set Flexio1 clock source. */ + CLOCK_SetMux(kCLOCK_Flexio1Mux, 3); + /* Disable Flexio2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Flexio2); + /* Set FLEXIO2_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1); + /* Set FLEXIO2_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Flexio2Div, 7); + /* Set Flexio2 clock source. */ + CLOCK_SetMux(kCLOCK_Flexio2Mux, 3); + /* Set Pll3 sw clock source. */ + CLOCK_SetMux(kCLOCK_Pll3SwMux, 0); + /* Init ARM PLL. */ + CLOCK_InitArmPll(&armPllConfig_Board_BootClockPLL600MHz); + /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd. + * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged. + * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/ +#ifndef SKIP_SYSCLK_INIT +#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1) + #warning "SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged." +#endif + /* Init System PLL. */ + CLOCK_InitSysPll(&sysPllConfig_Board_BootClockPLL600MHz); + /* Init System pfd0. */ + CLOCK_InitSysPfd(kCLOCK_Pfd0, 27); + /* Init System pfd1. */ + CLOCK_InitSysPfd(kCLOCK_Pfd1, 16); + /* Init System pfd2. */ + CLOCK_InitSysPfd(kCLOCK_Pfd2, 24); + /* Init System pfd3. */ + CLOCK_InitSysPfd(kCLOCK_Pfd3, 16); +#endif + /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. + * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged. + * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/ +#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)) + /* DeInit Usb1 PLL. */ + CLOCK_DeinitUsb1Pll(); + /* Bypass Usb1 PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllUsb1, 1); + /* Enable Usb1 PLL output. */ + CCM_ANALOG->PLL_USB1 |= CCM_ANALOG_PLL_USB1_ENABLE_MASK; +#endif + /* DeInit Audio PLL. */ + CLOCK_DeinitAudioPll(); + /* Bypass Audio PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1); + /* Set divider for Audio PLL. */ + CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK; + CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK; + /* Enable Audio PLL output. */ + CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK; + /* DeInit Video PLL. */ + CLOCK_DeinitVideoPll(); + /* Bypass Video PLL. */ + CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_BYPASS_MASK; + /* Set divider for Video PLL. */ + CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(0); + /* Enable Video PLL output. */ + CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK; + /* Init Enet PLL. */ + CLOCK_InitEnetPll(&enetPllConfig_Board_BootClockPLL600MHz); + /* Bypass Enet PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1); + /* DeInit Usb2 PLL. */ + CLOCK_DeinitUsb2Pll(); + /* Bypass Usb2 PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllUsb2, 1); + /* Enable Usb2 PLL output. */ + CCM_ANALOG->PLL_USB2 |= CCM_ANALOG_PLL_USB2_ENABLE_MASK; + /* Set preperiph clock source. */ + CLOCK_SetMux(kCLOCK_PrePeriphMux, 3); + /* Set periph clock source. */ + CLOCK_SetMux(kCLOCK_PeriphMux, 0); + /* Set periph clock2 clock source. */ + CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0); + /* Set per clock source. */ + CLOCK_SetMux(kCLOCK_PerclkMux, 0); + /* Set lvds1 clock source. */ + CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0); + /* Set clock out1 divider. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0); + /* Set clock out1 source. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1); + /* Set clock out2 divider. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0); + /* Set clock out2 source. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18); + /* Set clock out1 drives clock out1. */ + CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK; + /* Disable clock out1. */ + CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK; + /* Disable clock out2. */ + CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK; + /* Set SAI1 MCLK1 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0); + /* Set SAI1 MCLK2 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0); + /* Set SAI1 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0); + /* Set SAI2 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0); + /* Set SAI3 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0); + /* Set MQS configuration. */ + IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0); + /* Set ENET Ref clock source. */ +#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) + IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK; +#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK) + /* Backward compatibility for original bitfield name */ + IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK; +#else +#error "Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined." +#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */ + /* Set GPT1 High frequency reference clock source. */ + IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK; + /* Set GPT2 High frequency reference clock source. */ + IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK; + /* Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKPLL600MHZ_CORE_CLOCK; +} + +/******************************************************************************* + ******************* Configuration Board_BootClockPLL480MHz ******************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: Board_BootClockPLL480MHz +called_from_default_init: true +outputs: +- {id: AHB_CLK_ROOT.outFreq, value: 480 MHz} +- {id: CAN_CLK_ROOT.outFreq, value: 2 MHz} +- {id: CLK_1M.outFreq, value: 1 MHz} +- {id: CLK_24M.outFreq, value: 24 MHz} +- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz} +- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz} +- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz} +- {id: FLEXIO1_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: FLEXIO2_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz} +- {id: GPT1_ipg_clk_highfreq.outFreq, value: 4 MHz} +- {id: GPT2_ipg_clk_highfreq.outFreq, value: 4 MHz} +- {id: IPG_CLK_ROOT.outFreq, value: 120 MHz} +- {id: LCDIF_CLK_ROOT.outFreq, value: 3 MHz} +- {id: LPI2C_CLK_ROOT.outFreq, value: 3 MHz} +- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz} +- {id: LVDS1_CLK.outFreq, value: 960 MHz} +- {id: MQS_MCLK.outFreq, value: 3 MHz} +- {id: PERCLK_CLK_ROOT.outFreq, value: 4 MHz} +- {id: PLL7_MAIN_CLK.outFreq, value: 24 MHz} +- {id: SAI1_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI1_MCLK1.outFreq, value: 3 MHz} +- {id: SAI1_MCLK2.outFreq, value: 3 MHz} +- {id: SAI1_MCLK3.outFreq, value: 1.5 MHz} +- {id: SAI2_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI2_MCLK1.outFreq, value: 3 MHz} +- {id: SAI2_MCLK3.outFreq, value: 1.5 MHz} +- {id: SAI3_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI3_MCLK1.outFreq, value: 3 MHz} +- {id: SAI3_MCLK3.outFreq, value: 1.5 MHz} +- {id: SEMC_CLK_ROOT.outFreq, value: 132 MHz} +- {id: SPDIF0_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: TRACE_CLK_ROOT.outFreq, value: 88 MHz} +- {id: UART_CLK_ROOT.outFreq, value: 4 MHz} +- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz} +- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz} +settings: +- {id: CCM.ARM_PODF.scale, value: '2', locked: true} +- {id: CCM.FLEXSPI_PODF.scale, value: '1'} +- {id: CCM.LPSPI_PODF.scale, value: '5'} +- {id: CCM.PERCLK_PODF.scale, value: '30'} +- {id: CCM.SEMC_CLK_SEL.sel, value: CCM.SEMC_ALT_CLK_SEL} +- {id: CCM.SEMC_PODF.scale, value: '3', locked: true} +- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1} +- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true} +- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '40', locked: true} +- {id: CCM_ANALOG.PLL2.denom, value: '1'} +- {id: CCM_ANALOG.PLL2.num, value: '0'} +- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK} +- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0} +- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1} +- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2} +- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for Board_BootClockPLL480MHz configuration + ******************************************************************************/ +const clock_arm_pll_config_t armPllConfig_Board_BootClockPLL480MHz = + { + .loopDivider = 80, /* PLL loop divider, Fout = Fin * 40 */ + .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */ + }; +const clock_sys_pll_config_t sysPllConfig_Board_BootClockPLL480MHz = + { + .loopDivider = 1, /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */ + .numerator = 0, /* 30 bit numerator of fractional loop divider */ + .denominator = 1, /* 30 bit denominator of fractional loop divider */ + .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */ + }; +const clock_enet_pll_config_t enetPllConfig_Board_BootClockPLL480MHz = + { + .enableClkOutput = true, /* Enable the PLL providing the ENET 125MHz reference clock */ + .enableClkOutput25M = true, /* Enable the PLL providing the ENET 25MHz reference clock */ + .loopDivider = 1, /* Set frequency of ethernet reference clock to 2.4 MHz */ + .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */ + }; +/******************************************************************************* + * Code for Board_BootClockPLL480MHz configuration + ******************************************************************************/ +void Board_BootClockPLL480MHz(void) { /* Enable 1MHz clock output. */ XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK; @@ -160,7 +559,7 @@ void BOARD_BootClockRUN(void) CLOCK_DisableClock(kCLOCK_Gpt2S); CLOCK_DisableClock(kCLOCK_Pit); /* Set PERCLK_PODF. */ - CLOCK_SetDiv(kCLOCK_PerclkDiv, 0); + CLOCK_SetDiv(kCLOCK_PerclkDiv, 29); /* Disable USDHC1 clock gate. */ CLOCK_DisableClock(kCLOCK_Usdhc1); /* Set USDHC1_PODF. */ @@ -184,6 +583,369 @@ void BOARD_BootClockRUN(void) /* Set Semc alt clock source. */ CLOCK_SetMux(kCLOCK_SemcAltMux, 0); /* Set Semc clock source. */ + CLOCK_SetMux(kCLOCK_SemcMux, 1); +#endif + /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. + * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged. + * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/ +#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)) + /* Disable Flexspi clock gate. */ + CLOCK_DisableClock(kCLOCK_FlexSpi); + /* Set FLEXSPI_PODF. */ + CLOCK_SetDiv(kCLOCK_FlexspiDiv, 0); + /* Set Flexspi clock source. */ + CLOCK_SetMux(kCLOCK_FlexspiMux, 0); +#endif + /* Disable CSI clock gate. */ + CLOCK_DisableClock(kCLOCK_Csi); + /* Set CSI_PODF. */ + CLOCK_SetDiv(kCLOCK_CsiDiv, 1); + /* Set Csi clock source. */ + CLOCK_SetMux(kCLOCK_CsiMux, 0); + /* Disable LPSPI clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpspi1); + CLOCK_DisableClock(kCLOCK_Lpspi2); + CLOCK_DisableClock(kCLOCK_Lpspi3); + CLOCK_DisableClock(kCLOCK_Lpspi4); + /* Set LPSPI_PODF. */ + CLOCK_SetDiv(kCLOCK_LpspiDiv, 4); + /* Set Lpspi clock source. */ + CLOCK_SetMux(kCLOCK_LpspiMux, 2); + /* Disable TRACE clock gate. */ + CLOCK_DisableClock(kCLOCK_Trace); + /* Set TRACE_PODF. */ + CLOCK_SetDiv(kCLOCK_TraceDiv, 3); + /* Set Trace clock source. */ + CLOCK_SetMux(kCLOCK_TraceMux, 2); + /* Disable SAI1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai1); + /* Set SAI1_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3); + /* Set SAI1_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai1Div, 1); + /* Set Sai1 clock source. */ + CLOCK_SetMux(kCLOCK_Sai1Mux, 0); + /* Disable SAI2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai2); + /* Set SAI2_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3); + /* Set SAI2_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai2Div, 1); + /* Set Sai2 clock source. */ + CLOCK_SetMux(kCLOCK_Sai2Mux, 0); + /* Disable SAI3 clock gate. */ + CLOCK_DisableClock(kCLOCK_Sai3); + /* Set SAI3_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3); + /* Set SAI3_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Sai3Div, 1); + /* Set Sai3 clock source. */ + CLOCK_SetMux(kCLOCK_Sai3Mux, 0); + /* Disable Lpi2c clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpi2c1); + CLOCK_DisableClock(kCLOCK_Lpi2c2); + CLOCK_DisableClock(kCLOCK_Lpi2c3); + /* Set LPI2C_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0); + /* Set Lpi2c clock source. */ + CLOCK_SetMux(kCLOCK_Lpi2cMux, 0); + /* Disable CAN clock gate. */ + CLOCK_DisableClock(kCLOCK_Can1); + CLOCK_DisableClock(kCLOCK_Can2); + CLOCK_DisableClock(kCLOCK_Can1S); + CLOCK_DisableClock(kCLOCK_Can2S); + /* Set CAN_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_CanDiv, 1); + /* Set Can clock source. */ + CLOCK_SetMux(kCLOCK_CanMux, 2); + /* Disable UART clock gate. */ + CLOCK_DisableClock(kCLOCK_Lpuart1); + CLOCK_DisableClock(kCLOCK_Lpuart2); + CLOCK_DisableClock(kCLOCK_Lpuart3); + CLOCK_DisableClock(kCLOCK_Lpuart4); + CLOCK_DisableClock(kCLOCK_Lpuart5); + CLOCK_DisableClock(kCLOCK_Lpuart6); + CLOCK_DisableClock(kCLOCK_Lpuart7); + CLOCK_DisableClock(kCLOCK_Lpuart8); + /* Set UART_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_UartDiv, 0); + /* Set Uart clock source. */ + CLOCK_SetMux(kCLOCK_UartMux, 0); + /* Disable LCDIF clock gate. */ + CLOCK_DisableClock(kCLOCK_LcdPixel); + /* Set LCDIF_PRED. */ + CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1); + /* Set LCDIF_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_LcdifDiv, 3); + /* Set Lcdif pre clock source. */ + CLOCK_SetMux(kCLOCK_LcdifPreMux, 5); + /* Disable SPDIF clock gate. */ + CLOCK_DisableClock(kCLOCK_Spdif); + /* Set SPDIF0_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1); + /* Set SPDIF0_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Spdif0Div, 7); + /* Set Spdif clock source. */ + CLOCK_SetMux(kCLOCK_SpdifMux, 3); + /* Disable Flexio1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Flexio1); + /* Set FLEXIO1_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1); + /* Set FLEXIO1_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Flexio1Div, 7); + /* Set Flexio1 clock source. */ + CLOCK_SetMux(kCLOCK_Flexio1Mux, 3); + /* Disable Flexio2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Flexio2); + /* Set FLEXIO2_CLK_PRED. */ + CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1); + /* Set FLEXIO2_CLK_PODF. */ + CLOCK_SetDiv(kCLOCK_Flexio2Div, 7); + /* Set Flexio2 clock source. */ + CLOCK_SetMux(kCLOCK_Flexio2Mux, 3); + /* Set Pll3 sw clock source. */ + CLOCK_SetMux(kCLOCK_Pll3SwMux, 0); + /* Init ARM PLL. */ + CLOCK_InitArmPll(&armPllConfig_Board_BootClockPLL480MHz); + /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd. + * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged. + * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/ +#ifndef SKIP_SYSCLK_INIT +#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1) + #warning "SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged." +#endif + /* Init System PLL. */ + CLOCK_InitSysPll(&sysPllConfig_Board_BootClockPLL480MHz); + /* Init System pfd0. */ + CLOCK_InitSysPfd(kCLOCK_Pfd0, 27); + /* Init System pfd1. */ + CLOCK_InitSysPfd(kCLOCK_Pfd1, 16); + /* Init System pfd2. */ + CLOCK_InitSysPfd(kCLOCK_Pfd2, 24); + /* Init System pfd3. */ + CLOCK_InitSysPfd(kCLOCK_Pfd3, 16); +#endif + /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. + * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged. + * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/ +#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)) + /* DeInit Usb1 PLL. */ + CLOCK_DeinitUsb1Pll(); + /* Bypass Usb1 PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllUsb1, 1); + /* Enable Usb1 PLL output. */ + CCM_ANALOG->PLL_USB1 |= CCM_ANALOG_PLL_USB1_ENABLE_MASK; +#endif + /* DeInit Audio PLL. */ + CLOCK_DeinitAudioPll(); + /* Bypass Audio PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1); + /* Set divider for Audio PLL. */ + CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK; + CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK; + /* Enable Audio PLL output. */ + CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK; + /* DeInit Video PLL. */ + CLOCK_DeinitVideoPll(); + /* Bypass Video PLL. */ + CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_BYPASS_MASK; + /* Set divider for Video PLL. */ + CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(0); + /* Enable Video PLL output. */ + CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK; + /* Init Enet PLL. */ + CLOCK_InitEnetPll(&enetPllConfig_Board_BootClockPLL480MHz); + /* Bypass Enet PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1); + /* DeInit Usb2 PLL. */ + CLOCK_DeinitUsb2Pll(); + /* Bypass Usb2 PLL. */ + CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllUsb2, 1); + /* Enable Usb2 PLL output. */ + CCM_ANALOG->PLL_USB2 |= CCM_ANALOG_PLL_USB2_ENABLE_MASK; + /* Set preperiph clock source. */ + CLOCK_SetMux(kCLOCK_PrePeriphMux, 3); + /* Set periph clock source. */ + CLOCK_SetMux(kCLOCK_PeriphMux, 0); + /* Set periph clock2 clock source. */ + CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0); + /* Set per clock source. */ + CLOCK_SetMux(kCLOCK_PerclkMux, 0); + /* Set lvds1 clock source. */ + CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0); + /* Set clock out1 divider. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0); + /* Set clock out1 source. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1); + /* Set clock out2 divider. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0); + /* Set clock out2 source. */ + CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18); + /* Set clock out1 drives clock out1. */ + CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK; + /* Disable clock out1. */ + CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK; + /* Disable clock out2. */ + CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK; + /* Set SAI1 MCLK1 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0); + /* Set SAI1 MCLK2 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0); + /* Set SAI1 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0); + /* Set SAI2 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0); + /* Set SAI3 MCLK3 clock source. */ + IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0); + /* Set MQS configuration. */ + IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0); + /* Set ENET Ref clock source. */ +#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) + IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK; +#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK) + /* Backward compatibility for original bitfield name */ + IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK; +#else +#error "Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined." +#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */ + /* Set GPT1 High frequency reference clock source. */ + IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK; + /* Set GPT2 High frequency reference clock source. */ + IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK; + /* Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKPLL480MHZ_CORE_CLOCK; +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockXT24MHz ********************* + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockXT24MHz +outputs: +- {id: AHB_CLK_ROOT.outFreq, value: 24 MHz} +- {id: CAN_CLK_ROOT.outFreq, value: 2 MHz} +- {id: CLK_1M.outFreq, value: 1 MHz} +- {id: CLK_24M.outFreq, value: 24 MHz} +- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz} +- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz} +- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz} +- {id: FLEXIO1_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: FLEXIO2_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: FLEXSPI_CLK_ROOT.outFreq, value: 24 MHz} +- {id: GPT1_ipg_clk_highfreq.outFreq, value: 6 MHz} +- {id: GPT2_ipg_clk_highfreq.outFreq, value: 6 MHz} +- {id: IPG_CLK_ROOT.outFreq, value: 6 MHz} +- {id: LCDIF_CLK_ROOT.outFreq, value: 3 MHz} +- {id: LPI2C_CLK_ROOT.outFreq, value: 3 MHz} +- {id: LPSPI_CLK_ROOT.outFreq, value: 6 MHz} +- {id: LVDS1_CLK.outFreq, value: 24 MHz} +- {id: MQS_MCLK.outFreq, value: 3 MHz} +- {id: PERCLK_CLK_ROOT.outFreq, value: 6 MHz} +- {id: PLL7_MAIN_CLK.outFreq, value: 24 MHz} +- {id: SAI1_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI1_MCLK1.outFreq, value: 3 MHz} +- {id: SAI1_MCLK2.outFreq, value: 3 MHz} +- {id: SAI1_MCLK3.outFreq, value: 1.5 MHz} +- {id: SAI2_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI2_MCLK1.outFreq, value: 3 MHz} +- {id: SAI2_MCLK3.outFreq, value: 1.5 MHz} +- {id: SAI3_CLK_ROOT.outFreq, value: 3 MHz} +- {id: SAI3_MCLK1.outFreq, value: 3 MHz} +- {id: SAI3_MCLK3.outFreq, value: 1.5 MHz} +- {id: SEMC_CLK_ROOT.outFreq, value: 24 MHz} +- {id: SPDIF0_CLK_ROOT.outFreq, value: 1.5 MHz} +- {id: TRACE_CLK_ROOT.outFreq, value: 6 MHz} +- {id: UART_CLK_ROOT.outFreq, value: 4 MHz} +- {id: USDHC1_CLK_ROOT.outFreq, value: 12 MHz} +- {id: USDHC2_CLK_ROOT.outFreq, value: 12 MHz} +settings: +- {id: CCM.ARM_PODF.scale, value: '1'} +- {id: CCM.FLEXSPI_PODF.scale, value: '1'} +- {id: CCM.SEMC_PODF.scale, value: '1'} +- {id: CCM_ANALOG.PLL2.denom, value: '1'} +- {id: CCM_ANALOG.PLL2.num, value: '0'} +- {id: CCM_ANALOG_PLL_ARM_POWERDOWN_CFG, value: 'Yes'} +- {id: CCM_ANALOG_PLL_SYS_POWERDOWN_CFG, value: 'Yes'} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockXT24MHz configuration + ******************************************************************************/ +const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockXT24MHz = + { + .enableClkOutput = true, /* Enable the PLL providing the ENET 125MHz reference clock */ + .enableClkOutput25M = true, /* Enable the PLL providing the ENET 25MHz reference clock */ + .loopDivider = 1, /* Set frequency of ethernet reference clock to 2.4 MHz */ + .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */ + }; +/******************************************************************************* + * Code for BOARD_BootClockXT24MHz configuration + ******************************************************************************/ +void BOARD_BootClockXT24MHz(void) +{ + /* Enable 1MHz clock output. */ + XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK; + /* Use free 1MHz clock output. */ + XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK; + /* Set XTAL 24MHz clock frequency. */ + CLOCK_SetXtalFreq(24000000U); + /* Enable XTAL 24MHz clock source. */ + CLOCK_InitExternalClk(0); + /* Enable internal RC. */ + CLOCK_InitRcOsc24M(); + /* Switch clock source to external OSC. */ + CLOCK_SwitchOsc(kCLOCK_XtalOsc); + /* Set Oscillator ready counter value. */ + CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127); + /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */ + CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */ + CLOCK_SetMux(kCLOCK_PeriphMux, 1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */ + /* Set AHB_PODF. */ + CLOCK_SetDiv(kCLOCK_AhbDiv, 0); + /* Disable IPG clock gate. */ + CLOCK_DisableClock(kCLOCK_Adc1); + CLOCK_DisableClock(kCLOCK_Adc2); + CLOCK_DisableClock(kCLOCK_Xbar1); + CLOCK_DisableClock(kCLOCK_Xbar2); + CLOCK_DisableClock(kCLOCK_Xbar3); + /* Set IPG_PODF. */ + CLOCK_SetDiv(kCLOCK_IpgDiv, 3); + /* Set ARM_PODF. */ + CLOCK_SetDiv(kCLOCK_ArmDiv, 0); + /* Set PERIPH_CLK2_PODF. */ + CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0); + /* Disable PERCLK clock gate. */ + CLOCK_DisableClock(kCLOCK_Gpt1); + CLOCK_DisableClock(kCLOCK_Gpt1S); + CLOCK_DisableClock(kCLOCK_Gpt2); + CLOCK_DisableClock(kCLOCK_Gpt2S); + CLOCK_DisableClock(kCLOCK_Pit); + /* Set PERCLK_PODF. */ + CLOCK_SetDiv(kCLOCK_PerclkDiv, 0); + /* Disable USDHC1 clock gate. */ + CLOCK_DisableClock(kCLOCK_Usdhc1); + /* Set USDHC1_PODF. */ + CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1); + /* Set Usdhc1 clock source. */ + CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0); + /* Disable USDHC2 clock gate. */ + CLOCK_DisableClock(kCLOCK_Usdhc2); + /* Set USDHC2_PODF. */ + CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1); + /* Set Usdhc2 clock source. */ + CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0); + /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd. + * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged. + * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/ +#ifndef SKIP_SYSCLK_INIT + /* Disable Semc clock gate. */ + CLOCK_DisableClock(kCLOCK_Semc); + /* Set SEMC_PODF. */ + CLOCK_SetDiv(kCLOCK_SemcDiv, 0); + /* Set Semc alt clock source. */ + CLOCK_SetMux(kCLOCK_SemcAltMux, 0); + /* Set Semc clock source. */ CLOCK_SetMux(kCLOCK_SemcMux, 0); #endif /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. @@ -193,7 +955,7 @@ void BOARD_BootClockRUN(void) /* Disable Flexspi clock gate. */ CLOCK_DisableClock(kCLOCK_FlexSpi); /* Set FLEXSPI_PODF. */ - CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1); + CLOCK_SetDiv(kCLOCK_FlexspiDiv, 0); /* Set Flexspi clock source. */ CLOCK_SetMux(kCLOCK_FlexspiMux, 0); #endif @@ -306,10 +1068,12 @@ void BOARD_BootClockRUN(void) CLOCK_SetMux(kCLOCK_Flexio2Mux, 3); /* Set Pll3 sw clock source. */ CLOCK_SetMux(kCLOCK_Pll3SwMux, 0); - /* Init ARM PLL. */ - CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN); - /* Bypass for ARM PLL. */ + /* DeInit ARM PLL. */ + CLOCK_DeinitArmPll(); + /* Bypass ARM PLL. */ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllArm, 1); + /* Enable ARM PLL output. */ + CCM_ANALOG->PLL_ARM |= CCM_ANALOG_PLL_ARM_ENABLE_MASK; /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd. * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged. * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/ @@ -317,20 +1081,12 @@ void BOARD_BootClockRUN(void) #if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1) #warning "SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged." #endif - /* Init System PLL. */ - CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN); - /* Init System pfd0. */ - CLOCK_InitSysPfd(kCLOCK_Pfd0, 27); - /* Init System pfd1. */ - CLOCK_InitSysPfd(kCLOCK_Pfd1, 16); - /* Init System pfd2. */ - CLOCK_InitSysPfd(kCLOCK_Pfd2, 24); - /* Init System pfd3. */ - CLOCK_InitSysPfd(kCLOCK_Pfd3, 16); - /* Disable pfd offset. */ - CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_MASK; + /* DeInit System PLL. */ + CLOCK_DeinitSysPll(); /* Bypass System PLL. */ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllSys, 1); + /* Enable System PLL output. */ + CCM_ANALOG->PLL_SYS |= CCM_ANALOG_PLL_SYS_ENABLE_MASK; #endif /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd. * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged. @@ -361,9 +1117,7 @@ void BOARD_BootClockRUN(void) /* Enable Video PLL output. */ CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK; /* Init Enet PLL. */ - CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN); - /* Disable pfd offset. */ - CCM_ANALOG->PLL_ENET &= ~CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_MASK; + CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockXT24MHz); /* Bypass Enet PLL. */ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1); /* DeInit Usb2 PLL. */ @@ -409,12 +1163,19 @@ void BOARD_BootClockRUN(void) /* Set MQS configuration. */ IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0); /* Set ENET Ref clock source. */ +#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) + IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK; +#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK) + /* Backward compatibility for original bitfield name */ IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK; +#else +#error "Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined." +#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */ /* Set GPT1 High frequency reference clock source. */ IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK; /* Set GPT2 High frequency reference clock source. */ IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK; /* Set SystemCoreClock variable. */ - SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK; + SystemCoreClock = BOARD_BOOTCLOCKXT24MHZ_CORE_CLOCK; } diff --git a/board/clock_config.h b/board/clock_config.h index 1821733..379e02f 100644 --- a/board/clock_config.h +++ b/board/clock_config.h @@ -1,10 +1,3 @@ -/* - * Copyright 2017-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - #ifndef _CLOCK_CONFIG_H_ #define _CLOCK_CONFIG_H_ @@ -35,73 +28,73 @@ void BOARD_InitBootClocks(void); #endif /* __cplusplus*/ /******************************************************************************* - ********************** Configuration BOARD_BootClockRUN *********************** + ******************* Configuration Board_BootClockPLL600MHz ******************** ******************************************************************************/ /******************************************************************************* - * Definitions for BOARD_BootClockRUN configuration + * Definitions for Board_BootClockPLL600MHz configuration ******************************************************************************/ -#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 12000000U /*!< Core clock frequency: 12000000Hz */ +#define BOARD_BOOTCLOCKPLL600MHZ_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */ /* Clock outputs (values are in Hz): */ -#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT 12000000UL -#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT 2000000UL -#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT 0UL -#define BOARD_BOOTCLOCKRUN_CLKO1_CLK 0UL -#define BOARD_BOOTCLOCKRUN_CLKO2_CLK 0UL -#define BOARD_BOOTCLOCKRUN_CLK_1M 1000000UL -#define BOARD_BOOTCLOCKRUN_CLK_24M 24000000UL -#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT 12000000UL -#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK 2400000UL -#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK 1200000UL -#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK 0UL -#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK 0UL -#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT 1500000UL -#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT 1500000UL -#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT 2000000UL -#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ 3000000UL -#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 3000000UL -#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 6000000UL -#define BOARD_BOOTCLOCKRUN_LVDS1_CLK 24000000UL -#define BOARD_BOOTCLOCKRUN_MQS_MCLK 3000000UL -#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK 24000000UL -#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3 1500000UL -#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2 0UL -#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3 1500000UL -#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1 3000000UL -#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2 0UL -#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3 1500000UL -#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT 4000000UL -#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT 1500000UL -#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT 0UL -#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT 6000000UL -#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT 4000000UL -#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK 0UL -#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK 0UL -#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT 12000000UL -#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT 12000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_AHB_CLK_ROOT 600000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_CAN_CLK_ROOT 2000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_CKIL_SYNC_CLK_ROOT 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_CLKO1_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_CLKO2_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_CLK_1M 1000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_CLK_24M 24000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_CSI_CLK_ROOT 12000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_ENET_125M_CLK 2400000UL +#define BOARD_BOOTCLOCKPLL600MHZ_ENET_25M_REF_CLK 1200000UL +#define BOARD_BOOTCLOCKPLL600MHZ_ENET_REF_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_ENET_TX_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_FLEXIO1_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_FLEXIO2_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_FLEXSPI_CLK_ROOT 132000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_GPT1_IPG_CLK_HIGHFREQ5000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_GPT2_IPG_CLK_HIGHFREQ5000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_IPG_CLK_ROOT 150000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_LCDIF_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_LPI2C_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_LPSPI_CLK_ROOT 105600000UL +#define BOARD_BOOTCLOCKPLL600MHZ_LVDS1_CLK 1200000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_MQS_MCLK 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_PERCLK_CLK_ROOT 5000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_PLL7_MAIN_CLK 24000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI1_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI1_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI1_MCLK2 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI1_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI2_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI2_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI2_MCLK2 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI2_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI3_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI3_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI3_MCLK2 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_SAI3_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SEMC_CLK_ROOT 132000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SPDIF0_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL600MHZ_SPDIF0_EXTCLK_OUT 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_TRACE_CLK_ROOT 88000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_UART_CLK_ROOT 4000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_USBPHY1_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_USBPHY2_CLK 0UL +#define BOARD_BOOTCLOCKPLL600MHZ_USDHC1_CLK_ROOT 198000000UL +#define BOARD_BOOTCLOCKPLL600MHZ_USDHC2_CLK_ROOT 198000000UL -/*! @brief Arm PLL set for BOARD_BootClockRUN configuration. +/*! @brief Arm PLL set for Board_BootClockPLL600MHz configuration. */ -extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN; -/*! @brief Sys PLL for BOARD_BootClockRUN configuration. +extern const clock_arm_pll_config_t armPllConfig_Board_BootClockPLL600MHz; +/*! @brief Sys PLL for Board_BootClockPLL600MHz configuration. */ -extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN; -/*! @brief Enet PLL set for BOARD_BootClockRUN configuration. +extern const clock_sys_pll_config_t sysPllConfig_Board_BootClockPLL600MHz; +/*! @brief Enet PLL set for Board_BootClockPLL600MHz configuration. */ -extern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN; +extern const clock_enet_pll_config_t enetPllConfig_Board_BootClockPLL600MHz; /******************************************************************************* - * API for BOARD_BootClockRUN configuration + * API for Board_BootClockPLL600MHz configuration ******************************************************************************/ #if defined(__cplusplus) extern "C" { @@ -111,7 +104,167 @@ extern "C" { * @brief This function executes configuration of clocks. * */ -void BOARD_BootClockRUN(void); +void Board_BootClockPLL600MHz(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************* Configuration Board_BootClockPLL480MHz ******************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for Board_BootClockPLL480MHz configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKPLL480MHZ_CORE_CLOCK 480000000U /*!< Core clock frequency: 480000000Hz */ + +/* Clock outputs (values are in Hz): */ +#define BOARD_BOOTCLOCKPLL480MHZ_AHB_CLK_ROOT 480000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_CAN_CLK_ROOT 2000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_CKIL_SYNC_CLK_ROOT 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_CLKO1_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_CLKO2_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_CLK_1M 1000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_CLK_24M 24000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_CSI_CLK_ROOT 12000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_ENET_125M_CLK 2400000UL +#define BOARD_BOOTCLOCKPLL480MHZ_ENET_25M_REF_CLK 1200000UL +#define BOARD_BOOTCLOCKPLL480MHZ_ENET_REF_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_ENET_TX_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_FLEXIO1_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_FLEXIO2_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_FLEXSPI_CLK_ROOT 132000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_GPT1_IPG_CLK_HIGHFREQ4000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_GPT2_IPG_CLK_HIGHFREQ4000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_IPG_CLK_ROOT 120000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_LCDIF_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_LPI2C_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_LPSPI_CLK_ROOT 105600000UL +#define BOARD_BOOTCLOCKPLL480MHZ_LVDS1_CLK 960000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_MQS_MCLK 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_PERCLK_CLK_ROOT 4000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_PLL7_MAIN_CLK 24000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI1_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI1_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI1_MCLK2 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI1_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI2_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI2_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI2_MCLK2 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI2_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI3_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI3_MCLK1 3000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI3_MCLK2 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_SAI3_MCLK3 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SEMC_CLK_ROOT 132000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SPDIF0_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKPLL480MHZ_SPDIF0_EXTCLK_OUT 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_TRACE_CLK_ROOT 88000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_UART_CLK_ROOT 4000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_USBPHY1_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_USBPHY2_CLK 0UL +#define BOARD_BOOTCLOCKPLL480MHZ_USDHC1_CLK_ROOT 198000000UL +#define BOARD_BOOTCLOCKPLL480MHZ_USDHC2_CLK_ROOT 198000000UL + +/*! @brief Arm PLL set for Board_BootClockPLL480MHz configuration. + */ +extern const clock_arm_pll_config_t armPllConfig_Board_BootClockPLL480MHz; +/*! @brief Sys PLL for Board_BootClockPLL480MHz configuration. + */ +extern const clock_sys_pll_config_t sysPllConfig_Board_BootClockPLL480MHz; +/*! @brief Enet PLL set for Board_BootClockPLL480MHz configuration. + */ +extern const clock_enet_pll_config_t enetPllConfig_Board_BootClockPLL480MHz; + +/******************************************************************************* + * API for Board_BootClockPLL480MHz configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void Board_BootClockPLL480MHz(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockXT24MHz ********************* + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockXT24MHz configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKXT24MHZ_CORE_CLOCK 24000000U /*!< Core clock frequency: 24000000Hz */ + +/* Clock outputs (values are in Hz): */ +#define BOARD_BOOTCLOCKXT24MHZ_AHB_CLK_ROOT 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_CAN_CLK_ROOT 2000000UL +#define BOARD_BOOTCLOCKXT24MHZ_CKIL_SYNC_CLK_ROOT 0UL +#define BOARD_BOOTCLOCKXT24MHZ_CLKO1_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_CLKO2_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_CLK_1M 1000000UL +#define BOARD_BOOTCLOCKXT24MHZ_CLK_24M 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_CSI_CLK_ROOT 12000000UL +#define BOARD_BOOTCLOCKXT24MHZ_ENET_125M_CLK 2400000UL +#define BOARD_BOOTCLOCKXT24MHZ_ENET_25M_REF_CLK 1200000UL +#define BOARD_BOOTCLOCKXT24MHZ_ENET_REF_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_ENET_TX_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_FLEXIO1_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_FLEXIO2_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_FLEXSPI_CLK_ROOT 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_GPT1_IPG_CLK_HIGHFREQ 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_GPT2_IPG_CLK_HIGHFREQ 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_IPG_CLK_ROOT 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_LCDIF_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_LPI2C_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_LPSPI_CLK_ROOT 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_LVDS1_CLK 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_MQS_MCLK 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_PERCLK_CLK_ROOT 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_PLL7_MAIN_CLK 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI1_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI1_MCLK1 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI1_MCLK2 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI1_MCLK3 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI2_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI2_MCLK1 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI2_MCLK2 0UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI2_MCLK3 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI3_CLK_ROOT 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI3_MCLK1 3000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI3_MCLK2 0UL +#define BOARD_BOOTCLOCKXT24MHZ_SAI3_MCLK3 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_SEMC_CLK_ROOT 24000000UL +#define BOARD_BOOTCLOCKXT24MHZ_SPDIF0_CLK_ROOT 1500000UL +#define BOARD_BOOTCLOCKXT24MHZ_SPDIF0_EXTCLK_OUT 0UL +#define BOARD_BOOTCLOCKXT24MHZ_TRACE_CLK_ROOT 6000000UL +#define BOARD_BOOTCLOCKXT24MHZ_UART_CLK_ROOT 4000000UL +#define BOARD_BOOTCLOCKXT24MHZ_USBPHY1_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_USBPHY2_CLK 0UL +#define BOARD_BOOTCLOCKXT24MHZ_USDHC1_CLK_ROOT 12000000UL +#define BOARD_BOOTCLOCKXT24MHZ_USDHC2_CLK_ROOT 12000000UL + +/*! @brief Enet PLL set for BOARD_BootClockXT24MHz configuration. + */ +extern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockXT24MHz; + +/******************************************************************************* + * API for BOARD_BootClockXT24MHz configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockXT24MHz(void); #if defined(__cplusplus) } diff --git a/board/dcd.c b/board/dcd.c new file mode 100644 index 0000000..d3bf9dc --- /dev/null +++ b/board/dcd.c @@ -0,0 +1,45 @@ +/*********************************************************************************************************************** + * 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. + **********************************************************************************************************************/ + +#include "dcd.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.xip_board" +#endif + +#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1) +#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1) +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__) +__attribute__((section(".boot_hdr.dcd_data"), used)) +#elif defined(__ICCARM__) +#pragma location = ".boot_hdr.dcd_data" +#endif + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: DCDx v3.0 +processor: MIMXRT1052xxxxB +package_id: MIMXRT1052DVL6B +mcu_data: ksdk2_0 +processor_version: 12.0.0 +output_format: c_array + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* COMMENTS BELOW ARE USED AS SETTINGS FOR DCD DATA */ +const uint8_t dcd_data[] = { + /* HEADER */ + /* Tag */ + 0xD2, + /* Image Length */ + 0x00, 0x04, + /* Version */ + 0x41 + }; +/* BE CAREFUL MODIFYING THIS SETTINGS - IT IS YAML SETTINGS FOR TOOLS */ + +#else +const uint8_t dcd_data[] = {0x00}; +#endif /* XIP_BOOT_HEADER_DCD_ENABLE */ +#endif /* XIP_BOOT_HEADER_ENABLE */ diff --git a/board/dcd.h b/board/dcd.h new file mode 100644 index 0000000..3d8b7cd --- /dev/null +++ b/board/dcd.h @@ -0,0 +1,25 @@ +/*********************************************************************************************************************** + * 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 __DCD__ +#define __DCD__ + +#include + +/*! @name Driver version */ +/*@{*/ +/*! @brief XIP_BOARD driver version 2.0.0. */ +#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) +/*@}*/ + +/************************************* + * DCD Data + *************************************/ +#define DCD_TAG_HEADER (0xD2) +#define DCD_VERSION (0x41) +#define DCD_TAG_HEADER_SHIFT (24) +#define DCD_ARRAY_SIZE 1 + +#endif /* __DCD__ */ diff --git a/board/peripherals.c b/board/peripherals.c index 4a0a5a0..2007c30 100644 --- a/board/peripherals.c +++ b/board/peripherals.c @@ -1,10 +1,3 @@ -/* - * 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. @@ -13,20 +6,41 @@ /* clang-format off */ /* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* !!GlobalInfo -product: Peripherals v6.0 +product: Peripherals v11.0 processor: MIMXRT1052xxxxB +package_id: MIMXRT1052DVL6B mcu_data: ksdk2_0 -processor_version: 0.1.19 +processor_version: 12.0.0 functionalGroups: - name: BOARD_InitPeripherals + UUID: 19596643-a9d0-4000-b44d-6a0a05ec6830 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: [] +- global_system_definitions: + - user_definitions: '' + - user_includes: '' + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +component: +- type: 'gpio_adapter_common' +- type_id: 'gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6' +- global_gpio_adapter_common: + - quick_selection: 'default' + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +component: +- type: 'uart_cmsis_common' +- type_id: 'uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8' +- global_USART_CMSIS_common: + - quick_selection: 'default' * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ /* clang-format on */ @@ -35,11 +49,39 @@ component: **********************************************************************************************************************/ #include "peripherals.h" +/*********************************************************************************************************************** + * BOARD_InitPeripherals functional group + **********************************************************************************************************************/ +/*********************************************************************************************************************** + * NVIC initialization code + **********************************************************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +instance: +- name: 'NVIC' +- type: 'nvic' +- mode: 'general' +- custom_name_enabled: 'false' +- type_id: 'nvic_57b5eef3774cc60acaede6f5b8bddc67' +- functional_group: 'BOARD_InitPeripherals' +- peripheral: 'NVIC' +- config_sets: + - nvic: + - interrupt_table: [] + - interrupts: [] + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/* Empty initialization function (commented out) +static void NVIC_init(void) { +} */ + /*********************************************************************************************************************** * Initialization functions **********************************************************************************************************************/ void BOARD_InitPeripherals(void) { + /* Initialize components */ } /*********************************************************************************************************************** @@ -47,5 +89,5 @@ void BOARD_InitPeripherals(void) **********************************************************************************************************************/ void BOARD_InitBootPeripherals(void) { - BOARD_InitPeripherals(); + BOARD_InitPeripherals(); } diff --git a/board/peripherals.h b/board/peripherals.h index 1503606..2a75809 100644 --- a/board/peripherals.h +++ b/board/peripherals.h @@ -1,10 +1,3 @@ -/* - * 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. @@ -13,6 +6,11 @@ #ifndef _PERIPHERALS_H_ #define _PERIPHERALS_H_ +/*********************************************************************************************************************** + * Included files + **********************************************************************************************************************/ +#include "fsl_common.h" + #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ @@ -20,6 +18,7 @@ extern "C" { /*********************************************************************************************************************** * Initialization functions **********************************************************************************************************************/ + void BOARD_InitPeripherals(void); /*********************************************************************************************************************** diff --git a/board/pin_mux.c b/board/pin_mux.c index c1a6618..2395fc1 100644 --- a/board/pin_mux.c +++ b/board/pin_mux.c @@ -1,10 +1,3 @@ -/* - * 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. @@ -13,14 +6,23 @@ /* * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* !!GlobalInfo -product: Pins v6.0 +product: Pins v12.0 processor: MIMXRT1052xxxxB +package_id: MIMXRT1052DVL6B mcu_data: ksdk2_0 -processor_version: 0.1.19 +processor_version: 12.0.0 +pin_labels: +- {pin_num: C7, pin_signal: GPIO_EMC_41, label: LED_B, identifier: LED_R;LED_B} +- {pin_num: B12, pin_signal: GPIO_B1_07, label: LED_G, identifier: LED_G} +- {pin_num: A7, pin_signal: GPIO_EMC_40, label: LED_R, identifier: LED_B;LED_R} +power_domains: {DCDC_IN: '3.3', DCDC_IN_Q: '3.3', DCDC_LP: '1.25', DCDC_PSWITCH: '3.3', DCDC_SENSE: '1.25', NVCC_EMC: '3.3', NVCC_GPIO: '3.3', NVCC_SD0: '3.3', NVCC_SD1: '3.3', + VDDA_ADC_3P3: '3.3', VDD_HIGH_CAP: '1.1', VDD_HIGH_IN: '3.3', VDD_SNVS_CAP: '1.1', VDD_SNVS_IN: '3.3', VDD_SOC_IN: '1.25', VDD_USB_CAP: '2.5'} * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** */ #include "fsl_common.h" +#include "fsl_iomuxc.h" +#include "fsl_gpio.h" #include "pin_mux.h" /* FUNCTION ************************************************************************************************************ @@ -30,24 +32,552 @@ processor_version: 0.1.19 * * END ****************************************************************************************************************/ void BOARD_InitBootPins(void) { - BOARD_InitPins(); + BOARD_InitDebugPins(); + BOARD_InitLEDPins(); + BOARD_InitSEMCPins(); + BOARD_InitSYSPins(); + BOARD_InitSDPins(); + BOARD_InitFlexSPIPins(); + BOARD_InitUSBPins(); + BOARD_InitLCDPins(); } /* * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* -BOARD_InitPins: -- options: {callFromInitBoot: 'true', enableClock: 'true'} -- pin_list: [] +BOARD_InitDebugPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12} + - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13} + - {pin_num: F12, peripheral: JTAG, signal: TCK, pin_signal: GPIO_AD_B0_07} + - {pin_num: F14, peripheral: JTAG, signal: TDI, pin_signal: GPIO_AD_B0_09} + - {pin_num: G13, peripheral: JTAG, signal: TDO, pin_signal: GPIO_AD_B0_10} + - {pin_num: E14, peripheral: JTAG, signal: TMS, pin_signal: GPIO_AD_B0_06} * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** */ /* FUNCTION ************************************************************************************************************ * - * Function Name : BOARD_InitPins + * Function Name : BOARD_InitDebugPins * Description : Configures pin routing and optionally pin electrical features. * * END ****************************************************************************************************************/ -void BOARD_InitPins(void) { +void BOARD_InitDebugPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_06_JTAG_TMS, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_07_JTAG_TCK, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_JTAG_TDI, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_JTAG_TDO, 0U); +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U); +#endif +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitLEDPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: C7, peripheral: GPIO3, signal: 'gpio_io, 27', pin_signal: GPIO_EMC_41, identifier: LED_B, direction: OUTPUT, gpio_init_state: 'true'} + - {pin_num: B12, peripheral: GPIO2, signal: 'gpio_io, 23', pin_signal: GPIO_B1_07, direction: OUTPUT, gpio_init_state: 'true'} + - {pin_num: A7, peripheral: GPIO3, signal: 'gpio_io, 26', pin_signal: GPIO_EMC_40, identifier: LED_R, direction: OUTPUT, gpio_init_state: 'true'} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitLEDPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitLEDPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + + /* GPIO configuration of LED_G on GPIO_B1_07 (pin B12) */ + gpio_pin_config_t LED_G_config = { + .direction = kGPIO_DigitalOutput, + .outputLogic = 1U, + .interruptMode = kGPIO_NoIntmode + }; + /* Initialize GPIO functionality on GPIO_B1_07 (pin B12) */ + GPIO_PinInit(GPIO2, 23U, &LED_G_config); + + /* GPIO configuration of LED_R on GPIO_EMC_40 (pin A7) */ + gpio_pin_config_t LED_R_config = { + .direction = kGPIO_DigitalOutput, + .outputLogic = 1U, + .interruptMode = kGPIO_NoIntmode + }; + /* Initialize GPIO functionality on GPIO_EMC_40 (pin A7) */ + GPIO_PinInit(GPIO3, 26U, &LED_R_config); + + /* GPIO configuration of LED_B on GPIO_EMC_41 (pin C7) */ + gpio_pin_config_t LED_B_config = { + .direction = kGPIO_DigitalOutput, + .outputLogic = 1U, + .interruptMode = kGPIO_NoIntmode + }; + /* Initialize GPIO functionality on GPIO_EMC_41 (pin C7) */ + GPIO_PinInit(GPIO3, 27U, &LED_B_config); + + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_GPIO2_IO23, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_GPIO3_IO26, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_GPIO3_IO27, 0U); +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitSEMCPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: E3, peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00} + - {pin_num: F3, peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01} + - {pin_num: F4, peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02} + - {pin_num: G4, peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03} + - {pin_num: F2, peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04} + - {pin_num: G5, peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05} + - {pin_num: H5, peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06} + - {pin_num: H4, peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07} + - {pin_num: C6, peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_30} + - {pin_num: C5, peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_31} + - {pin_num: D5, peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_32} + - {pin_num: C4, peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_33} + - {pin_num: E5, peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_35} + - {pin_num: D4, peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_34} + - {pin_num: C3, peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_36} + - {pin_num: E4, peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_37} + - {pin_num: C2, peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_09} + - {pin_num: G1, peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_10} + - {pin_num: G3, peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_11} + - {pin_num: H1, peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_12} + - {pin_num: A6, peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_13} + - {pin_num: B6, peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_14} + - {pin_num: B1, peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_15} + - {pin_num: A5, peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_16} + - {pin_num: A4, peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_17} + - {pin_num: B2, peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_18} + - {pin_num: G2, peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_23} + - {pin_num: B4, peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_19} + - {pin_num: A3, peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_20} + - {pin_num: C1, peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_21} + - {pin_num: F1, peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_22} + - {pin_num: H3, peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08} + - {pin_num: D6, peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_38} + - {pin_num: B3, peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_26} + - {pin_num: A2, peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_27} + - {pin_num: E1, peripheral: SEMC, signal: 'CS, 0', pin_signal: GPIO_EMC_29} + - {pin_num: D2, peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_25} + - {pin_num: D3, peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_24} + - {pin_num: B7, peripheral: SEMC, signal: semc_dqs, pin_signal: GPIO_EMC_39} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitSEMCPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitSEMCPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DA00, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DA01, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DA02, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DA03, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DA04, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DA05, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DA06, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DA07, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U); +#endif + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0, 0U); +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DA08, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DA09, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DA10, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DA11, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DA12, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DA13, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DA14, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DA15, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U); +#endif + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_39_SEMC_DQS, 0U); +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitSYSPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: N1, peripheral: SUPPLY, signal: 'DCDC_GND, 0', pin_signal: DCDC_GND0} + - {pin_num: N2, peripheral: SUPPLY, signal: 'DCDC_GND, 1', pin_signal: DCDC_GND1} + - {pin_num: L1, peripheral: SUPPLY, signal: 'DCDC_IN, 0', pin_signal: DCDC_IN0} + - {pin_num: L2, peripheral: SUPPLY, signal: 'DCDC_IN, 1', pin_signal: DCDC_IN1} + - {pin_num: K4, peripheral: SUPPLY, signal: dcdc_in_q, pin_signal: DCDC_IN_Q} + - {pin_num: M1, peripheral: SUPPLY, signal: 'DCDC_LP, 0', pin_signal: DCDC_LP0} + - {pin_num: M2, peripheral: SUPPLY, signal: 'DCDC_LP, 1', pin_signal: DCDC_LP1} + - {pin_num: K3, peripheral: SUPPLY, signal: dcdc_pswitch, pin_signal: DCDC_PSWITCH} + - {pin_num: J5, peripheral: SUPPLY, signal: dcdc_sense, pin_signal: DCDC_SENSE} + - {pin_num: N10, peripheral: SUPPLY, signal: gpanaio, pin_signal: GPANAIO} + - {pin_num: K9, peripheral: SUPPLY, signal: ngnd_kel0, pin_signal: NGND_KEL0} + - {pin_num: F5, peripheral: SUPPLY, signal: 'NVCC_EMC, 0', pin_signal: NVCC_EMC0} + - {pin_num: E6, peripheral: SUPPLY, signal: 'NVCC_EMC, 1', pin_signal: NVCC_EMC1} + - {pin_num: E9, peripheral: SUPPLY, signal: 'NVCC_GPIO, 0', pin_signal: NVCC_GPIO0} + - {pin_num: F10, peripheral: SUPPLY, signal: 'NVCC_GPIO, 1', pin_signal: NVCC_GPIO1} + - {pin_num: J10, peripheral: SUPPLY, signal: 'NVCC_GPIO, 2', pin_signal: NVCC_GPIO2} + - {pin_num: P10, peripheral: SUPPLY, signal: nvcc_pll, pin_signal: NVCC_PLL} + - {pin_num: J6, peripheral: SUPPLY, signal: nvcc_sd0, pin_signal: NVCC_SD0} + - {pin_num: K5, peripheral: SUPPLY, signal: nvcc_sd1, pin_signal: NVCC_SD1} + - {pin_num: K6, peripheral: SUPPLY, signal: test_mode, pin_signal: TEST_MODE} + - {pin_num: N12, peripheral: SUPPLY, signal: usb_otg1_chd_b, pin_signal: USB_OTG1_CHD_B} + - {pin_num: M8, peripheral: SUPPLY, signal: usb_otg1_dn, pin_signal: USB_OTG1_DN} + - {pin_num: L8, peripheral: SUPPLY, signal: usb_otg1_dp, pin_signal: USB_OTG1_DP} + - {pin_num: N6, peripheral: SUPPLY, signal: usb_otg1_vbus, pin_signal: USB_OTG1_VBUS} + - {pin_num: N7, peripheral: SUPPLY, signal: usb_otg2_dn, pin_signal: USB_OTG2_DN} + - {pin_num: P7, peripheral: SUPPLY, signal: usb_otg2_dp, pin_signal: USB_OTG2_DP} + - {pin_num: P6, peripheral: SUPPLY, signal: usb_otg2_vbus, pin_signal: USB_OTG2_VBUS} + - {pin_num: P8, peripheral: SUPPLY, signal: VDD_HIGH_CAP, pin_signal: VDD_HIGH_CAP} + - {pin_num: P12, peripheral: SUPPLY, signal: VDD_HIGH_IN, pin_signal: VDD_HIGH_IN} + - {pin_num: M10, peripheral: SUPPLY, signal: VDD_SNVS_CAP, pin_signal: VDD_SNVS_CAP} + - {pin_num: M9, peripheral: SUPPLY, signal: VDD_SNVS_IN, pin_signal: VDD_SNVS_IN} + - {pin_num: F6, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 0', pin_signal: VDD_SOC_IN0} + - {pin_num: G6, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 1', pin_signal: VDD_SOC_IN1} + - {pin_num: H6, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 2', pin_signal: VDD_SOC_IN2} + - {pin_num: F7, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 3', pin_signal: VDD_SOC_IN3} + - {pin_num: F8, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 4', pin_signal: VDD_SOC_IN4} + - {pin_num: F9, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 5', pin_signal: VDD_SOC_IN5} + - {pin_num: G9, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 6', pin_signal: VDD_SOC_IN6} + - {pin_num: H9, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 7', pin_signal: VDD_SOC_IN7} + - {pin_num: J9, peripheral: SUPPLY, signal: 'VDD_SOC_IN, 8', pin_signal: VDD_SOC_IN8} + - {pin_num: K8, peripheral: SUPPLY, signal: VDD_USB_CAP, pin_signal: VDD_USB_CAP} + - {pin_num: N14, peripheral: SUPPLY, signal: VDDA_ADC_3P3, pin_signal: VDDA_ADC_3P3} + - {pin_num: A1, peripheral: SUPPLY, signal: 'VSS, 0', pin_signal: VSS0} + - {pin_num: P1, peripheral: SUPPLY, signal: 'VSS, 1', pin_signal: VSS1} + - {pin_num: E2, peripheral: SUPPLY, signal: 'VSS, 2', pin_signal: VSS2} + - {pin_num: K2, peripheral: SUPPLY, signal: 'VSS, 3', pin_signal: VSS3} + - {pin_num: B5, peripheral: SUPPLY, signal: 'VSS, 4', pin_signal: VSS4} + - {pin_num: N5, peripheral: SUPPLY, signal: 'VSS, 5', pin_signal: VSS5} + - {pin_num: G7, peripheral: SUPPLY, signal: 'VSS, 6', pin_signal: VSS6} + - {pin_num: H7, peripheral: SUPPLY, signal: 'VSS, 7', pin_signal: VSS7} + - {pin_num: J7, peripheral: SUPPLY, signal: 'VSS, 8', pin_signal: VSS8} + - {pin_num: G8, peripheral: SUPPLY, signal: 'VSS, 9', pin_signal: VSS9} + - {pin_num: H8, peripheral: SUPPLY, signal: 'VSS, 10', pin_signal: VSS10} + - {pin_num: J8, peripheral: SUPPLY, signal: 'VSS, 11', pin_signal: VSS11} + - {pin_num: N8, peripheral: SUPPLY, signal: 'VSS, 12', pin_signal: VSS12} + - {pin_num: L9, peripheral: SUPPLY, signal: 'VSS, 13', pin_signal: VSS13} + - {pin_num: B10, peripheral: SUPPLY, signal: 'VSS, 14', pin_signal: VSS14} + - {pin_num: E13, peripheral: SUPPLY, signal: 'VSS, 15', pin_signal: VSS15} + - {pin_num: K13, peripheral: SUPPLY, signal: 'VSS, 16', pin_signal: VSS16} + - {pin_num: A14, peripheral: SUPPLY, signal: 'VSS, 17', pin_signal: VSS17} + - {pin_num: P14, peripheral: SUPPLY, signal: 'VSS, 18', pin_signal: VSS18} + - {pin_num: K7, peripheral: SNVS, signal: snvs_pmic_on_req, pin_signal: PMIC_ON_REQ} + - {pin_num: P11, peripheral: XTALOSC24M, signal: xtali, pin_signal: XTALI} + - {pin_num: N11, peripheral: XTALOSC24M, signal: xtalo, pin_signal: XTALO} + - {pin_num: N9, peripheral: XTALOSC24M, signal: rtc_xtali, pin_signal: RTC_XTALI} + - {pin_num: P9, peripheral: XTALOSC24M, signal: rtc_xtalo, pin_signal: RTC_XTALO} + - {pin_num: M7, peripheral: SRC, signal: POR_B, pin_signal: POR_B} + - {pin_num: M6, peripheral: SRC, signal: RESET_B, pin_signal: ONOFF} + - {pin_num: P13, peripheral: CCM, signal: CLK1_N, pin_signal: CCM_CLK1_N} + - {pin_num: N13, peripheral: CCM, signal: CLK1_P, pin_signal: CCM_CLK1_P} + - {pin_num: L7, peripheral: CCM, signal: PMIC_STBY_REQ, pin_signal: PMIC_STBY_REQ} + - {pin_num: D14, peripheral: WDOG1, signal: wdog_b, pin_signal: GPIO_B1_13} + - {pin_num: N14, peripheral: CMP1, signal: DAC_6bit_VIN1, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP1, signal: DAC_6bit_VIN2, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP2, signal: DAC_6bit_VIN1, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP2, signal: DAC_6bit_VIN2, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP3, signal: DAC_6bit_VIN1, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP3, signal: DAC_6bit_VIN2, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP4, signal: DAC_6bit_VIN2, pin_signal: VDDA_ADC_3P3} + - {pin_num: N14, peripheral: CMP4, signal: DAC_6bit_VIN1, pin_signal: VDDA_ADC_3P3} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitSYSPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitSYSPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + CLOCK_EnableClock(kCLOCK_IomuxcSnvs); + + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_13_WDOG1_B, 0U); +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_SNVS_PMIC_ON_REQ_SNVS_PMIC_ON_REQ, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_SNVS_PMIC_ON_REQ_SNVS_LP_PMIC_ON_REQ, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_SNVS_PMIC_STBY_REQ_CCM_PMIC_STBY_REQ, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_SNVS_PMIC_STBY_REQ_CCM_PMIC_VSTBY_REQ, 0U); +#endif +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitSDPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02} + - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00} + - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01} + - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03} + - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04} + - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05} + - {pin_num: D13, peripheral: USDHC1, signal: usdhc_cd_b, pin_signal: GPIO_B1_12} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitSDPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitSDPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_12_USDHC1_CD_B, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U); +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitFlexSPIPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08} + - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09} + - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10} + - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11} + - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06} + - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitFlexSPIPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitFlexSPIPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPI_A_SS0_B, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPI_A_SCLK, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPI_A_DATA00, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPI_A_DATA1, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPI_A_DATA2, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U); +#endif +#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3) + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPI_A_DATA3, 0U); +#else + IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U); +#endif +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitUSBPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: H10, peripheral: USB1, signal: usb_otg1_id, pin_signal: GPIO_AD_B0_01} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitUSBPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitUSBPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + + IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_01_USB_OTG1_ID, 0U); +} + + +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitLCDPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: D7, peripheral: LCDIF, signal: lcdif_clk, pin_signal: GPIO_B0_00} + - {pin_num: C8, peripheral: LCDIF, signal: 'lcdif_data, 00', pin_signal: GPIO_B0_04} + - {pin_num: B8, peripheral: LCDIF, signal: 'lcdif_data, 01', pin_signal: GPIO_B0_05} + - {pin_num: A8, peripheral: LCDIF, signal: 'lcdif_data, 02', pin_signal: GPIO_B0_06} + - {pin_num: A9, peripheral: LCDIF, signal: 'lcdif_data, 03', pin_signal: GPIO_B0_07} + - {pin_num: B9, peripheral: LCDIF, signal: 'lcdif_data, 04', pin_signal: GPIO_B0_08} + - {pin_num: C9, peripheral: LCDIF, signal: 'lcdif_data, 05', pin_signal: GPIO_B0_09} + - {pin_num: D9, peripheral: LCDIF, signal: 'lcdif_data, 06', pin_signal: GPIO_B0_10} + - {pin_num: A10, peripheral: LCDIF, signal: 'lcdif_data, 07', pin_signal: GPIO_B0_11} + - {pin_num: C10, peripheral: LCDIF, signal: 'lcdif_data, 08', pin_signal: GPIO_B0_12} + - {pin_num: D10, peripheral: LCDIF, signal: 'lcdif_data, 09', pin_signal: GPIO_B0_13} + - {pin_num: E10, peripheral: LCDIF, signal: 'lcdif_data, 10', pin_signal: GPIO_B0_14} + - {pin_num: E11, peripheral: LCDIF, signal: 'lcdif_data, 11', pin_signal: GPIO_B0_15} + - {pin_num: B11, peripheral: LCDIF, signal: 'lcdif_data, 13', pin_signal: GPIO_B1_01} + - {pin_num: A11, peripheral: LCDIF, signal: 'lcdif_data, 12', pin_signal: GPIO_B1_00} + - {pin_num: C11, peripheral: LCDIF, signal: 'lcdif_data, 14', pin_signal: GPIO_B1_02} + - {pin_num: D11, peripheral: LCDIF, signal: 'lcdif_data, 15', pin_signal: GPIO_B1_03} + - {pin_num: E7, peripheral: LCDIF, signal: lcdif_enable, pin_signal: GPIO_B0_01} + - {pin_num: E8, peripheral: LCDIF, signal: lcdif_hsync, pin_signal: GPIO_B0_02} + - {pin_num: D8, peripheral: LCDIF, signal: lcdif_vsync, pin_signal: GPIO_B0_03} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitLCDPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitLCDPins(void) { + CLOCK_EnableClock(kCLOCK_Iomuxc); + + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U); + IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U); } /*********************************************************************************************************************** diff --git a/board/pin_mux.h b/board/pin_mux.h index 3ce8fab..f45e652 100644 --- a/board/pin_mux.h +++ b/board/pin_mux.h @@ -1,10 +1,3 @@ -/* - * 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. @@ -49,7 +42,98 @@ void BOARD_InitBootPins(void); * @brief Configures pin routing and optionally pin electrical features. * */ -void BOARD_InitPins(void); +void BOARD_InitDebugPins(void); + +/* GPIO_EMC_41 (coord C7), LED_B */ +/* Routed pin properties */ +#define BOARD_INITLEDPINS_LED_B_PERIPHERAL GPIO3 /*!< Peripheral name */ +#define BOARD_INITLEDPINS_LED_B_SIGNAL gpio_io /*!< Signal name */ +#define BOARD_INITLEDPINS_LED_B_CHANNEL 27U /*!< Signal channel */ + +/* Symbols to be used with GPIO driver */ +#define BOARD_INITLEDPINS_LED_B_GPIO GPIO3 /*!< GPIO peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_B_GPIO_PIN 27U /*!< GPIO pin number */ +#define BOARD_INITLEDPINS_LED_B_GPIO_PIN_MASK (1U << 27U) /*!< GPIO pin mask */ +#define BOARD_INITLEDPINS_LED_B_PORT GPIO3 /*!< PORT peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_B_PIN 27U /*!< PORT pin number */ +#define BOARD_INITLEDPINS_LED_B_PIN_MASK (1U << 27U) /*!< PORT pin mask */ + +/* GPIO_B1_07 (coord B12), LED_G */ +/* Routed pin properties */ +#define BOARD_INITLEDPINS_LED_G_PERIPHERAL GPIO2 /*!< Peripheral name */ +#define BOARD_INITLEDPINS_LED_G_SIGNAL gpio_io /*!< Signal name */ +#define BOARD_INITLEDPINS_LED_G_CHANNEL 23U /*!< Signal channel */ + +/* Symbols to be used with GPIO driver */ +#define BOARD_INITLEDPINS_LED_G_GPIO GPIO2 /*!< GPIO peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_G_GPIO_PIN 23U /*!< GPIO pin number */ +#define BOARD_INITLEDPINS_LED_G_GPIO_PIN_MASK (1U << 23U) /*!< GPIO pin mask */ +#define BOARD_INITLEDPINS_LED_G_PORT GPIO2 /*!< PORT peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_G_PIN 23U /*!< PORT pin number */ +#define BOARD_INITLEDPINS_LED_G_PIN_MASK (1U << 23U) /*!< PORT pin mask */ + +/* GPIO_EMC_40 (coord A7), LED_R */ +/* Routed pin properties */ +#define BOARD_INITLEDPINS_LED_R_PERIPHERAL GPIO3 /*!< Peripheral name */ +#define BOARD_INITLEDPINS_LED_R_SIGNAL gpio_io /*!< Signal name */ +#define BOARD_INITLEDPINS_LED_R_CHANNEL 26U /*!< Signal channel */ + +/* Symbols to be used with GPIO driver */ +#define BOARD_INITLEDPINS_LED_R_GPIO GPIO3 /*!< GPIO peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_R_GPIO_PIN 26U /*!< GPIO pin number */ +#define BOARD_INITLEDPINS_LED_R_GPIO_PIN_MASK (1U << 26U) /*!< GPIO pin mask */ +#define BOARD_INITLEDPINS_LED_R_PORT GPIO3 /*!< PORT peripheral base pointer */ +#define BOARD_INITLEDPINS_LED_R_PIN 26U /*!< PORT pin number */ +#define BOARD_INITLEDPINS_LED_R_PIN_MASK (1U << 26U) /*!< PORT pin mask */ + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitLEDPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitSEMCPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitSYSPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitSDPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitFlexSPIPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitUSBPins(void); + + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitLCDPins(void); #if defined(__cplusplus) } diff --git a/devices/MIMXRT1052/MIMXRT1052.h b/devices/MIMXRT1052/MIMXRT1052.h deleted file mode 100644 index 2b6ec9c..0000000 --- a/devices/MIMXRT1052/MIMXRT1052.h +++ /dev/null @@ -1,52543 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compilers: Freescale C/C++ for Embedded ARM -** GNU C Compiler -** IAR ANSI C/C++ Compiler for ARM -** Keil ARM C/C++ Compiler -** MCUXpresso Compiler -** -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.3, 2019-04-29 -** Build: b210407 -** -** Abstract: -** CMSIS Peripheral Access Layer for MIMXRT1052 -** -** Copyright 1997-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. 0.1 (2017-01-10) -** Initial version. -** - rev. 1.0 (2018-09-21) -** Update interrupt vector table and dma request source. -** Update register BEE_ADDR_OFFSET1's bitfield name to ADDR_OFFSET1. -** Split GPIO_COMBINED_IRQS to GPIO_COMBINED_LOW_IRQS and GPIO_COMBINED_HIGH_IRQS. -** - rev. 1.1 (2018-11-16) -** Update header files to align with IMXRT1050RM Rev.1. -** - rev. 1.2 (2018-11-27) -** Update header files to align with IMXRT1050RM Rev.2.1. -** - rev. 1.3 (2019-04-29) -** Add SET/CLR/TOG register group to register CTRL, STAT, CHANNELCTRL, CH0STAT, CH0OPTS, CH1STAT, CH1OPTS, CH2STAT, CH2OPTS, CH3STAT, CH3OPTS of DCP module. -** -** ################################################################### -*/ - -/*! - * @file MIMXRT1052.h - * @version 1.3 - * @date 2019-04-29 - * @brief CMSIS Peripheral Access Layer for MIMXRT1052 - * - * CMSIS Peripheral Access Layer for MIMXRT1052 - */ - -#ifndef _MIMXRT1052_H_ -#define _MIMXRT1052_H_ /**< Symbol preventing repeated inclusion */ - -/** Memory map major version (memory maps with equal major version number are - * compatible) */ -#define MCU_MEM_MAP_VERSION 0x0100U -/** Memory map minor version */ -#define MCU_MEM_MAP_VERSION_MINOR 0x0003U - - -/* ---------------------------------------------------------------------------- - -- Interrupt vector numbers - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup Interrupt_vector_numbers Interrupt vector numbers - * @{ - */ - -/** Interrupt Number Definitions */ -#define NUMBER_OF_INT_VECTORS 168 /**< Number of interrupts in the Vector table */ - -typedef enum IRQn { - /* Auxiliary constants */ - NotAvail_IRQn = -128, /**< Not available device specific interrupt */ - - /* Core interrupts */ - NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ - HardFault_IRQn = -13, /**< Cortex-M7 SV Hard Fault Interrupt */ - MemoryManagement_IRQn = -12, /**< Cortex-M7 Memory Management Interrupt */ - BusFault_IRQn = -11, /**< Cortex-M7 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /**< Cortex-M7 Usage Fault Interrupt */ - SVCall_IRQn = -5, /**< Cortex-M7 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /**< Cortex-M7 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /**< Cortex-M7 Pend SV Interrupt */ - SysTick_IRQn = -1, /**< Cortex-M7 System Tick Interrupt */ - - /* Device specific interrupts */ - DMA0_DMA16_IRQn = 0, /**< DMA channel 0/16 transfer complete */ - DMA1_DMA17_IRQn = 1, /**< DMA channel 1/17 transfer complete */ - DMA2_DMA18_IRQn = 2, /**< DMA channel 2/18 transfer complete */ - DMA3_DMA19_IRQn = 3, /**< DMA channel 3/19 transfer complete */ - DMA4_DMA20_IRQn = 4, /**< DMA channel 4/20 transfer complete */ - DMA5_DMA21_IRQn = 5, /**< DMA channel 5/21 transfer complete */ - DMA6_DMA22_IRQn = 6, /**< DMA channel 6/22 transfer complete */ - DMA7_DMA23_IRQn = 7, /**< DMA channel 7/23 transfer complete */ - DMA8_DMA24_IRQn = 8, /**< DMA channel 8/24 transfer complete */ - DMA9_DMA25_IRQn = 9, /**< DMA channel 9/25 transfer complete */ - DMA10_DMA26_IRQn = 10, /**< DMA channel 10/26 transfer complete */ - DMA11_DMA27_IRQn = 11, /**< DMA channel 11/27 transfer complete */ - DMA12_DMA28_IRQn = 12, /**< DMA channel 12/28 transfer complete */ - DMA13_DMA29_IRQn = 13, /**< DMA channel 13/29 transfer complete */ - DMA14_DMA30_IRQn = 14, /**< DMA channel 14/30 transfer complete */ - DMA15_DMA31_IRQn = 15, /**< DMA channel 15/31 transfer complete */ - DMA_ERROR_IRQn = 16, /**< DMA error interrupt channels 0-15 / 16-31 */ - CTI0_ERROR_IRQn = 17, /**< CTI0_Error */ - CTI1_ERROR_IRQn = 18, /**< CTI1_Error */ - CORE_IRQn = 19, /**< CorePlatform exception IRQ */ - LPUART1_IRQn = 20, /**< LPUART1 TX interrupt and RX interrupt */ - LPUART2_IRQn = 21, /**< LPUART2 TX interrupt and RX interrupt */ - LPUART3_IRQn = 22, /**< LPUART3 TX interrupt and RX interrupt */ - LPUART4_IRQn = 23, /**< LPUART4 TX interrupt and RX interrupt */ - LPUART5_IRQn = 24, /**< LPUART5 TX interrupt and RX interrupt */ - LPUART6_IRQn = 25, /**< LPUART6 TX interrupt and RX interrupt */ - LPUART7_IRQn = 26, /**< LPUART7 TX interrupt and RX interrupt */ - LPUART8_IRQn = 27, /**< LPUART8 TX interrupt and RX interrupt */ - LPI2C1_IRQn = 28, /**< LPI2C1 interrupt */ - LPI2C2_IRQn = 29, /**< LPI2C2 interrupt */ - LPI2C3_IRQn = 30, /**< LPI2C3 interrupt */ - LPI2C4_IRQn = 31, /**< LPI2C4 interrupt */ - LPSPI1_IRQn = 32, /**< LPSPI1 single interrupt vector for all sources */ - LPSPI2_IRQn = 33, /**< LPSPI2 single interrupt vector for all sources */ - LPSPI3_IRQn = 34, /**< LPSPI3 single interrupt vector for all sources */ - LPSPI4_IRQn = 35, /**< LPSPI4 single interrupt vector for all sources */ - CAN1_IRQn = 36, /**< CAN1 interrupt */ - CAN2_IRQn = 37, /**< CAN2 interrupt */ - FLEXRAM_IRQn = 38, /**< FlexRAM address out of range Or access hit IRQ */ - KPP_IRQn = 39, /**< Keypad nterrupt */ - TSC_DIG_IRQn = 40, /**< TSC interrupt */ - GPR_IRQ_IRQn = 41, /**< GPR interrupt */ - LCDIF_IRQn = 42, /**< LCDIF interrupt */ - CSI_IRQn = 43, /**< CSI interrupt */ - PXP_IRQn = 44, /**< PXP interrupt */ - WDOG2_IRQn = 45, /**< WDOG2 interrupt */ - SNVS_HP_WRAPPER_IRQn = 46, /**< SRTC Consolidated Interrupt. Non TZ */ - SNVS_HP_WRAPPER_TZ_IRQn = 47, /**< SRTC Security Interrupt. TZ */ - SNVS_LP_WRAPPER_IRQn = 48, /**< ON-OFF button press shorter than 5 secs (pulse event) */ - CSU_IRQn = 49, /**< CSU interrupt */ - DCP_IRQn = 50, /**< DCP_IRQ interrupt */ - DCP_VMI_IRQn = 51, /**< DCP_VMI_IRQ interrupt */ - Reserved68_IRQn = 52, /**< Reserved interrupt */ - TRNG_IRQn = 53, /**< TRNG interrupt */ - SJC_IRQn = 54, /**< SJC interrupt */ - BEE_IRQn = 55, /**< BEE interrupt */ - SAI1_IRQn = 56, /**< SAI1 interrupt */ - SAI2_IRQn = 57, /**< SAI1 interrupt */ - SAI3_RX_IRQn = 58, /**< SAI3 interrupt */ - SAI3_TX_IRQn = 59, /**< SAI3 interrupt */ - SPDIF_IRQn = 60, /**< SPDIF interrupt */ - PMU_EVENT_IRQn = 61, /**< Brown-out event interrupt */ - Reserved78_IRQn = 62, /**< Reserved interrupt */ - TEMP_LOW_HIGH_IRQn = 63, /**< TempSensor low/high interrupt */ - TEMP_PANIC_IRQn = 64, /**< TempSensor panic interrupt */ - USB_PHY1_IRQn = 65, /**< USBPHY (UTMI0), Interrupt */ - USB_PHY2_IRQn = 66, /**< USBPHY (UTMI0), Interrupt */ - ADC1_IRQn = 67, /**< ADC1 interrupt */ - ADC2_IRQn = 68, /**< ADC2 interrupt */ - DCDC_IRQn = 69, /**< DCDC interrupt */ - Reserved86_IRQn = 70, /**< Reserved interrupt */ - Reserved87_IRQn = 71, /**< Reserved interrupt */ - GPIO1_INT0_IRQn = 72, /**< Active HIGH Interrupt from INT0 from GPIO */ - GPIO1_INT1_IRQn = 73, /**< Active HIGH Interrupt from INT1 from GPIO */ - GPIO1_INT2_IRQn = 74, /**< Active HIGH Interrupt from INT2 from GPIO */ - GPIO1_INT3_IRQn = 75, /**< Active HIGH Interrupt from INT3 from GPIO */ - GPIO1_INT4_IRQn = 76, /**< Active HIGH Interrupt from INT4 from GPIO */ - GPIO1_INT5_IRQn = 77, /**< Active HIGH Interrupt from INT5 from GPIO */ - GPIO1_INT6_IRQn = 78, /**< Active HIGH Interrupt from INT6 from GPIO */ - GPIO1_INT7_IRQn = 79, /**< Active HIGH Interrupt from INT7 from GPIO */ - GPIO1_Combined_0_15_IRQn = 80, /**< Combined interrupt indication for GPIO1 signal 0 throughout 15 */ - GPIO1_Combined_16_31_IRQn = 81, /**< Combined interrupt indication for GPIO1 signal 16 throughout 31 */ - GPIO2_Combined_0_15_IRQn = 82, /**< Combined interrupt indication for GPIO2 signal 0 throughout 15 */ - GPIO2_Combined_16_31_IRQn = 83, /**< Combined interrupt indication for GPIO2 signal 16 throughout 31 */ - GPIO3_Combined_0_15_IRQn = 84, /**< Combined interrupt indication for GPIO3 signal 0 throughout 15 */ - GPIO3_Combined_16_31_IRQn = 85, /**< Combined interrupt indication for GPIO3 signal 16 throughout 31 */ - GPIO4_Combined_0_15_IRQn = 86, /**< Combined interrupt indication for GPIO4 signal 0 throughout 15 */ - GPIO4_Combined_16_31_IRQn = 87, /**< Combined interrupt indication for GPIO4 signal 16 throughout 31 */ - GPIO5_Combined_0_15_IRQn = 88, /**< Combined interrupt indication for GPIO5 signal 0 throughout 15 */ - GPIO5_Combined_16_31_IRQn = 89, /**< Combined interrupt indication for GPIO5 signal 16 throughout 31 */ - FLEXIO1_IRQn = 90, /**< FLEXIO1 interrupt */ - FLEXIO2_IRQn = 91, /**< FLEXIO2 interrupt */ - WDOG1_IRQn = 92, /**< WDOG1 interrupt */ - RTWDOG_IRQn = 93, /**< RTWDOG interrupt */ - EWM_IRQn = 94, /**< EWM interrupt */ - CCM_1_IRQn = 95, /**< CCM IRQ1 interrupt */ - CCM_2_IRQn = 96, /**< CCM IRQ2 interrupt */ - GPC_IRQn = 97, /**< GPC interrupt */ - SRC_IRQn = 98, /**< SRC interrupt */ - Reserved115_IRQn = 99, /**< Reserved interrupt */ - GPT1_IRQn = 100, /**< GPT1 interrupt */ - GPT2_IRQn = 101, /**< GPT2 interrupt */ - PWM1_0_IRQn = 102, /**< PWM1 capture 0, compare 0, or reload 0 interrupt */ - PWM1_1_IRQn = 103, /**< PWM1 capture 1, compare 1, or reload 0 interrupt */ - PWM1_2_IRQn = 104, /**< PWM1 capture 2, compare 2, or reload 0 interrupt */ - PWM1_3_IRQn = 105, /**< PWM1 capture 3, compare 3, or reload 0 interrupt */ - PWM1_FAULT_IRQn = 106, /**< PWM1 fault or reload error interrupt */ - Reserved123_IRQn = 107, /**< Reserved interrupt */ - FLEXSPI_IRQn = 108, /**< FlexSPI0 interrupt */ - SEMC_IRQn = 109, /**< Reserved interrupt */ - USDHC1_IRQn = 110, /**< USDHC1 interrupt */ - USDHC2_IRQn = 111, /**< USDHC2 interrupt */ - USB_OTG2_IRQn = 112, /**< USBO2 USB OTG2 */ - USB_OTG1_IRQn = 113, /**< USBO2 USB OTG1 */ - ENET_IRQn = 114, /**< ENET interrupt */ - ENET_1588_Timer_IRQn = 115, /**< ENET_1588_Timer interrupt */ - XBAR1_IRQ_0_1_IRQn = 116, /**< XBAR1 interrupt */ - XBAR1_IRQ_2_3_IRQn = 117, /**< XBAR1 interrupt */ - ADC_ETC_IRQ0_IRQn = 118, /**< ADCETC IRQ0 interrupt */ - ADC_ETC_IRQ1_IRQn = 119, /**< ADCETC IRQ1 interrupt */ - ADC_ETC_IRQ2_IRQn = 120, /**< ADCETC IRQ2 interrupt */ - ADC_ETC_ERROR_IRQ_IRQn = 121, /**< ADCETC Error IRQ interrupt */ - PIT_IRQn = 122, /**< PIT interrupt */ - ACMP1_IRQn = 123, /**< ACMP interrupt */ - ACMP2_IRQn = 124, /**< ACMP interrupt */ - ACMP3_IRQn = 125, /**< ACMP interrupt */ - ACMP4_IRQn = 126, /**< ACMP interrupt */ - Reserved143_IRQn = 127, /**< Reserved interrupt */ - Reserved144_IRQn = 128, /**< Reserved interrupt */ - ENC1_IRQn = 129, /**< ENC1 interrupt */ - ENC2_IRQn = 130, /**< ENC2 interrupt */ - ENC3_IRQn = 131, /**< ENC3 interrupt */ - ENC4_IRQn = 132, /**< ENC4 interrupt */ - TMR1_IRQn = 133, /**< TMR1 interrupt */ - TMR2_IRQn = 134, /**< TMR2 interrupt */ - TMR3_IRQn = 135, /**< TMR3 interrupt */ - TMR4_IRQn = 136, /**< TMR4 interrupt */ - PWM2_0_IRQn = 137, /**< PWM2 capture 0, compare 0, or reload 0 interrupt */ - PWM2_1_IRQn = 138, /**< PWM2 capture 1, compare 1, or reload 0 interrupt */ - PWM2_2_IRQn = 139, /**< PWM2 capture 2, compare 2, or reload 0 interrupt */ - PWM2_3_IRQn = 140, /**< PWM2 capture 3, compare 3, or reload 0 interrupt */ - PWM2_FAULT_IRQn = 141, /**< PWM2 fault or reload error interrupt */ - PWM3_0_IRQn = 142, /**< PWM3 capture 0, compare 0, or reload 0 interrupt */ - PWM3_1_IRQn = 143, /**< PWM3 capture 1, compare 1, or reload 0 interrupt */ - PWM3_2_IRQn = 144, /**< PWM3 capture 2, compare 2, or reload 0 interrupt */ - PWM3_3_IRQn = 145, /**< PWM3 capture 3, compare 3, or reload 0 interrupt */ - PWM3_FAULT_IRQn = 146, /**< PWM3 fault or reload error interrupt */ - PWM4_0_IRQn = 147, /**< PWM4 capture 0, compare 0, or reload 0 interrupt */ - PWM4_1_IRQn = 148, /**< PWM4 capture 1, compare 1, or reload 0 interrupt */ - PWM4_2_IRQn = 149, /**< PWM4 capture 2, compare 2, or reload 0 interrupt */ - PWM4_3_IRQn = 150, /**< PWM4 capture 3, compare 3, or reload 0 interrupt */ - PWM4_FAULT_IRQn = 151 /**< PWM4 fault or reload error interrupt */ -} IRQn_Type; - -/*! - * @} - */ /* end of group Interrupt_vector_numbers */ - - -/* ---------------------------------------------------------------------------- - -- Cortex M7 Core Configuration - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup Cortex_Core_Configuration Cortex M7 Core Configuration - * @{ - */ - -#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ -#define __ICACHE_PRESENT 1 /**< Defines if an ICACHE is present or not */ -#define __DCACHE_PRESENT 1 /**< Defines if an DCACHE is present or not */ -#define __DTCM_PRESENT 1 /**< Defines if an DTCM is present or not */ -#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ -#define __Vendor_SysTickConfig 0 /**< Vendor specific implementation of SysTickConfig is defined */ -#define __FPU_PRESENT 1 /**< Defines if an FPU is present or not */ - -#include "core_cm7.h" /* Core Peripheral Access Layer */ -#include "system_MIMXRT1052.h" /* Device specific configuration file */ - -/*! - * @} - */ /* end of group Cortex_Core_Configuration */ - - -/* ---------------------------------------------------------------------------- - -- Mapping Information - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup Mapping_Information Mapping Information - * @{ - */ - -/** Mapping Information */ -/*! - * @addtogroup edma_request - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! - * @brief Structure for the DMA hardware request - * - * Defines the structure for the DMA hardware request collections. The user can configure the - * hardware request into DMAMUX to trigger the DMA transfer accordingly. The index - * of the hardware request varies according to the to SoC. - */ -typedef enum _dma_request_source -{ - kDmaRequestMuxFlexIO1Request0Request1 = 0|0x100U, /**< FlexIO1 Request0 and Request1 */ - kDmaRequestMuxFlexIO2Request0Request1 = 1|0x100U, /**< FlexIO2 Request0 and Request1 */ - kDmaRequestMuxLPUART1Tx = 2|0x100U, /**< LPUART1 Transmit */ - kDmaRequestMuxLPUART1Rx = 3|0x100U, /**< LPUART1 Receive */ - kDmaRequestMuxLPUART3Tx = 4|0x100U, /**< LPUART3 Transmit */ - kDmaRequestMuxLPUART3Rx = 5|0x100U, /**< LPUART3 Receive */ - kDmaRequestMuxLPUART5Tx = 6|0x100U, /**< LPUART5 Transmit */ - kDmaRequestMuxLPUART5Rx = 7|0x100U, /**< LPUART5 Receive */ - kDmaRequestMuxLPUART7Tx = 8|0x100U, /**< LPUART7 Transmit */ - kDmaRequestMuxLPUART7Rx = 9|0x100U, /**< LPUART7 Receive */ - kDmaRequestMuxCSI = 12|0x100U, /**< CSI */ - kDmaRequestMuxLPSPI1Rx = 13|0x100U, /**< LPSPI1 Receive */ - kDmaRequestMuxLPSPI1Tx = 14|0x100U, /**< LPSPI1 Transmit */ - kDmaRequestMuxLPSPI3Rx = 15|0x100U, /**< LPSPI3 Receive */ - kDmaRequestMuxLPSPI3Tx = 16|0x100U, /**< LPSPI3 Transmit */ - kDmaRequestMuxLPI2C1 = 17|0x100U, /**< LPI2C1 */ - kDmaRequestMuxLPI2C3 = 18|0x100U, /**< LPI2C3 */ - kDmaRequestMuxSai1Rx = 19|0x100U, /**< SAI1 Receive */ - kDmaRequestMuxSai1Tx = 20|0x100U, /**< SAI1 Transmit */ - kDmaRequestMuxSai2Rx = 21|0x100U, /**< SAI2 Receive */ - kDmaRequestMuxSai2Tx = 22|0x100U, /**< SAI2 Transmit */ - kDmaRequestMuxADC_ETC = 23|0x100U, /**< ADC_ETC */ - kDmaRequestMuxADC1 = 24|0x100U, /**< ADC1 */ - kDmaRequestMuxACMP1 = 25|0x100U, /**< ACMP1 */ - kDmaRequestMuxACMP3 = 26|0x100U, /**< ACMP3 */ - kDmaRequestMuxFlexSPIRx = 28|0x100U, /**< FlexSPI Receive */ - kDmaRequestMuxFlexSPITx = 29|0x100U, /**< FlexSPI Transmit */ - kDmaRequestMuxXBAR1Request0 = 30|0x100U, /**< XBAR1 Request 0 */ - kDmaRequestMuxXBAR1Request1 = 31|0x100U, /**< XBAR1 Request 1 */ - kDmaRequestMuxFlexPWM1CaptureSub0 = 32|0x100U, /**< FlexPWM1 Capture sub-module0 */ - kDmaRequestMuxFlexPWM1CaptureSub1 = 33|0x100U, /**< FlexPWM1 Capture sub-module1 */ - kDmaRequestMuxFlexPWM1CaptureSub2 = 34|0x100U, /**< FlexPWM1 Capture sub-module2 */ - kDmaRequestMuxFlexPWM1CaptureSub3 = 35|0x100U, /**< FlexPWM1 Capture sub-module3 */ - kDmaRequestMuxFlexPWM1ValueSub0 = 36|0x100U, /**< FlexPWM1 Value sub-module0 */ - kDmaRequestMuxFlexPWM1ValueSub1 = 37|0x100U, /**< FlexPWM1 Value sub-module1 */ - kDmaRequestMuxFlexPWM1ValueSub2 = 38|0x100U, /**< FlexPWM1 Value sub-module2 */ - kDmaRequestMuxFlexPWM1ValueSub3 = 39|0x100U, /**< FlexPWM1 Value sub-module3 */ - kDmaRequestMuxFlexPWM3CaptureSub0 = 40|0x100U, /**< FlexPWM3 Capture sub-module0 */ - kDmaRequestMuxFlexPWM3CaptureSub1 = 41|0x100U, /**< FlexPWM3 Capture sub-module1 */ - kDmaRequestMuxFlexPWM3CaptureSub2 = 42|0x100U, /**< FlexPWM3 Capture sub-module2 */ - kDmaRequestMuxFlexPWM3CaptureSub3 = 43|0x100U, /**< FlexPWM3 Capture sub-module3 */ - kDmaRequestMuxFlexPWM3ValueSub0 = 44|0x100U, /**< FlexPWM3 Value sub-module0 */ - kDmaRequestMuxFlexPWM3ValueSub1 = 45|0x100U, /**< FlexPWM3 Value sub-module1 */ - kDmaRequestMuxFlexPWM3ValueSub2 = 46|0x100U, /**< FlexPWM3 Value sub-module2 */ - kDmaRequestMuxFlexPWM3ValueSub3 = 47|0x100U, /**< FlexPWM3 Value sub-module3 */ - kDmaRequestMuxQTIMER1CaptTimer0 = 48|0x100U, /**< TMR1 Capture timer 0 */ - kDmaRequestMuxQTIMER1CaptTimer1 = 49|0x100U, /**< TMR1 Capture timer 1 */ - kDmaRequestMuxQTIMER1CaptTimer2 = 50|0x100U, /**< TMR1 Capture timer 2 */ - kDmaRequestMuxQTIMER1CaptTimer3 = 51|0x100U, /**< TMR1 Capture timer 3 */ - kDmaRequestMuxQTIMER1Cmpld1Timer0Cmpld2Timer1 = 52|0x100U, /**< TMR1 cmpld1 in timer 0 or cmpld2 in timer 1 */ - kDmaRequestMuxQTIMER1Cmpld1Timer1Cmpld2Timer0 = 53|0x100U, /**< TMR1 cmpld1 in timer 1 or cmpld2 in timer 0 */ - kDmaRequestMuxQTIMER1Cmpld1Timer2Cmpld2Timer3 = 54|0x100U, /**< TMR1 cmpld1 in timer 2 or cmpld2 in timer 3 */ - kDmaRequestMuxQTIMER1Cmpld1Timer3Cmpld2Timer2 = 55|0x100U, /**< TMR1 cmpld1 in timer 3 or cmpld2 in timer 2 */ - kDmaRequestMuxQTIMER3CaptTimer0Cmpld1Timer0Cmpld2Timer1 = 56|0x100U, /**< TMR3 capture timer 0, cmpld1 in timer 0 or cmpld2 in timer 1 */ - kDmaRequestMuxQTIMER3CaptTimer1Cmpld1Timer1Cmpld2Timer0 = 57|0x100U, /**< TMR3 capture timer 1, cmpld1 in timer 1 or cmpld2 in timer 0 */ - kDmaRequestMuxQTIMER3CaptTimer2Cmpld1Timer2Cmpld2Timer3 = 58|0x100U, /**< TMR3 capture timer 2, cmpld1 in timer 2 or cmpld2 in timer 3 */ - kDmaRequestMuxQTIMER3CaptTimer3Cmpld1Timer3Cmpld2Timer2 = 59|0x100U, /**< TMR3 capture timer 3, cmpld1 in timer 3 or cmpld2 in timer 2 */ - kDmaRequestMuxFlexIO1Request2Request3 = 64|0x100U, /**< FlexIO1 Request2 and Request3 */ - kDmaRequestMuxFlexIO2Request2Request3 = 65|0x100U, /**< FlexIO2 Request2 and Request3 */ - kDmaRequestMuxLPUART2Tx = 66|0x100U, /**< LPUART2 Transmit */ - kDmaRequestMuxLPUART2Rx = 67|0x100U, /**< LPUART2 Receive */ - kDmaRequestMuxLPUART4Tx = 68|0x100U, /**< LPUART4 Transmit */ - kDmaRequestMuxLPUART4Rx = 69|0x100U, /**< LPUART4 Receive */ - kDmaRequestMuxLPUART6Tx = 70|0x100U, /**< LPUART6 Transmit */ - kDmaRequestMuxLPUART6Rx = 71|0x100U, /**< LPUART6 Receive */ - kDmaRequestMuxLPUART8Tx = 72|0x100U, /**< LPUART8 Transmit */ - kDmaRequestMuxLPUART8Rx = 73|0x100U, /**< LPUART8 Receive */ - kDmaRequestMuxPxp = 75|0x100U, /**< PXP */ - kDmaRequestMuxLCDIF = 76|0x100U, /**< LCDIF */ - kDmaRequestMuxLPSPI2Rx = 77|0x100U, /**< LPSPI2 Receive */ - kDmaRequestMuxLPSPI2Tx = 78|0x100U, /**< LPSPI2 Transmit */ - kDmaRequestMuxLPSPI4Rx = 79|0x100U, /**< LPSPI4 Receive */ - kDmaRequestMuxLPSPI4Tx = 80|0x100U, /**< LPSPI4 Transmit */ - kDmaRequestMuxLPI2C2 = 81|0x100U, /**< LPI2C2 */ - kDmaRequestMuxLPI2C4 = 82|0x100U, /**< LPI2C4 */ - kDmaRequestMuxSai3Rx = 83|0x100U, /**< SAI3 Receive */ - kDmaRequestMuxSai3Tx = 84|0x100U, /**< SAI3 Transmit */ - kDmaRequestMuxSpdifRx = 85|0x100U, /**< SPDIF Receive */ - kDmaRequestMuxSpdifTx = 86|0x100U, /**< SPDIF Transmit */ - kDmaRequestMuxADC2 = 88|0x100U, /**< ADC2 */ - kDmaRequestMuxACMP2 = 89|0x100U, /**< ACMP2 */ - kDmaRequestMuxACMP4 = 90|0x100U, /**< ACMP4 */ - kDmaRequestMuxEnetTimer0 = 92|0x100U, /**< ENET Timer0 */ - kDmaRequestMuxEnetTimer1 = 93|0x100U, /**< ENET Timer1 */ - kDmaRequestMuxXBAR1Request2 = 94|0x100U, /**< XBAR1 Request 2 */ - kDmaRequestMuxXBAR1Request3 = 95|0x100U, /**< XBAR1 Request 3 */ - kDmaRequestMuxFlexPWM2CaptureSub0 = 96|0x100U, /**< FlexPWM2 Capture sub-module0 */ - kDmaRequestMuxFlexPWM2CaptureSub1 = 97|0x100U, /**< FlexPWM2 Capture sub-module1 */ - kDmaRequestMuxFlexPWM2CaptureSub2 = 98|0x100U, /**< FlexPWM2 Capture sub-module2 */ - kDmaRequestMuxFlexPWM2CaptureSub3 = 99|0x100U, /**< FlexPWM2 Capture sub-module3 */ - kDmaRequestMuxFlexPWM2ValueSub0 = 100|0x100U, /**< FlexPWM2 Value sub-module0 */ - kDmaRequestMuxFlexPWM2ValueSub1 = 101|0x100U, /**< FlexPWM2 Value sub-module1 */ - kDmaRequestMuxFlexPWM2ValueSub2 = 102|0x100U, /**< FlexPWM2 Value sub-module2 */ - kDmaRequestMuxFlexPWM2ValueSub3 = 103|0x100U, /**< FlexPWM2 Value sub-module3 */ - kDmaRequestMuxFlexPWM4CaptureSub0 = 104|0x100U, /**< FlexPWM4 Capture sub-module0 */ - kDmaRequestMuxFlexPWM4CaptureSub1 = 105|0x100U, /**< FlexPWM4 Capture sub-module1 */ - kDmaRequestMuxFlexPWM4CaptureSub2 = 106|0x100U, /**< FlexPWM4 Capture sub-module2 */ - kDmaRequestMuxFlexPWM4CaptureSub3 = 107|0x100U, /**< FlexPWM4 Capture sub-module3 */ - kDmaRequestMuxFlexPWM4ValueSub0 = 108|0x100U, /**< FlexPWM4 Value sub-module0 */ - kDmaRequestMuxFlexPWM4ValueSub1 = 109|0x100U, /**< FlexPWM4 Value sub-module1 */ - kDmaRequestMuxFlexPWM4ValueSub2 = 110|0x100U, /**< FlexPWM4 Value sub-module2 */ - kDmaRequestMuxFlexPWM4ValueSub3 = 111|0x100U, /**< FlexPWM4 Value sub-module3 */ - kDmaRequestMuxQTIMER2CaptTimer0 = 112|0x100U, /**< TMR2 Capture timer 0 */ - kDmaRequestMuxQTIMER2CaptTimer1 = 113|0x100U, /**< TMR2 Capture timer 1 */ - kDmaRequestMuxQTIMER2CaptTimer2 = 114|0x100U, /**< TMR2 Capture timer 2 */ - kDmaRequestMuxQTIMER2CaptTimer3 = 115|0x100U, /**< TMR2 Capture timer 3 */ - kDmaRequestMuxQTIMER2Cmpld1Timer0Cmpld2Timer1 = 116|0x100U, /**< TMR2 cmpld1 in timer 0 or cmpld2 in timer 1 */ - kDmaRequestMuxQTIMER2Cmpld1Timer1Cmpld2Timer0 = 117|0x100U, /**< TMR2 cmpld1 in timer 1 or cmpld2 in timer 0 */ - kDmaRequestMuxQTIMER2Cmpld1Timer2Cmpld2Timer3 = 118|0x100U, /**< TMR2 cmpld1 in timer 2 or cmpld2 in timer 3 */ - kDmaRequestMuxQTIMER2Cmpld1Timer3Cmpld2Timer2 = 119|0x100U, /**< TMR2 cmpld1 in timer 3 or cmpld2 in timer 2 */ - kDmaRequestMuxQTIMER4CaptTimer0Cmpld1Timer0Cmpld2Timer1 = 120|0x100U, /**< TMR4 capture timer 0, cmpld1 in timer 0 or cmpld2 in timer 1 */ - kDmaRequestMuxQTIMER4CaptTimer1Cmpld1Timer1Cmpld2Timer0 = 121|0x100U, /**< TMR4 capture timer 1, cmpld1 in timer 1 or cmpld2 in timer 0 */ - kDmaRequestMuxQTIMER4CaptTimer2Cmpld1Timer2Cmpld2Timer3 = 122|0x100U, /**< TMR4 capture timer 2, cmpld1 in timer 2 or cmpld2 in timer 3 */ - kDmaRequestMuxQTIMER4CaptTimer3Cmpld1Timer3Cmpld2Timer2 = 123|0x100U, /**< TMR4 capture timer 3, cmpld1 in timer 3 or cmpld2 in timer 2 */ -} dma_request_source_t; - -/* @} */ - -/*! - * @addtogroup iomuxc_pads - * @{ */ - -/******************************************************************************* - * Definitions -*******************************************************************************/ - -/*! - * @brief Enumeration for the IOMUXC SW_MUX_CTL_PAD - * - * Defines the enumeration for the IOMUXC SW_MUX_CTL_PAD collections. - */ -typedef enum _iomuxc_sw_mux_ctl_pad -{ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_00 = 0U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_01 = 1U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_02 = 2U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_03 = 3U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_04 = 4U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_05 = 5U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_06 = 6U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_07 = 7U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_08 = 8U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_09 = 9U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_10 = 10U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_11 = 11U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_12 = 12U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_13 = 13U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_14 = 14U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_15 = 15U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_16 = 16U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_17 = 17U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_18 = 18U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_19 = 19U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_20 = 20U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_21 = 21U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_22 = 22U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_23 = 23U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_24 = 24U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_25 = 25U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_26 = 26U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_27 = 27U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_28 = 28U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_29 = 29U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_30 = 30U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_31 = 31U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_32 = 32U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_33 = 33U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_34 = 34U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_35 = 35U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_36 = 36U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_37 = 37U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_38 = 38U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_39 = 39U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_40 = 40U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_41 = 41U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_00 = 42U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_01 = 43U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02 = 44U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_03 = 45U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_04 = 46U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_05 = 47U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_06 = 48U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_07 = 49U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_08 = 50U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_09 = 51U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_10 = 52U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_11 = 53U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_12 = 54U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_13 = 55U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_14 = 56U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_15 = 57U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00 = 58U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_01 = 59U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_02 = 60U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_03 = 61U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_04 = 62U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_05 = 63U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_06 = 64U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_07 = 65U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_08 = 66U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_09 = 67U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_10 = 68U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_11 = 69U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_12 = 70U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_13 = 71U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_14 = 72U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_15 = 73U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00 = 74U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_01 = 75U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_02 = 76U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_03 = 77U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_04 = 78U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_05 = 79U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_06 = 80U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_07 = 81U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_08 = 82U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_09 = 83U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_10 = 84U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_11 = 85U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_12 = 86U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_13 = 87U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_14 = 88U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B0_15 = 89U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_00 = 90U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_01 = 91U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_02 = 92U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_03 = 93U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_04 = 94U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_05 = 95U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_06 = 96U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_07 = 97U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_08 = 98U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_09 = 99U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_10 = 100U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_11 = 101U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_12 = 102U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_13 = 103U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_14 = 104U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_B1_15 = 105U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = 106U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = 107U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = 108U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = 109U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = 110U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = 111U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_00 = 112U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_01 = 113U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_02 = 114U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_03 = 115U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_04 = 116U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_05 = 117U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_06 = 118U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_07 = 119U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_08 = 120U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_09 = 121U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_10 = 122U, /**< IOMUXC SW_MUX_CTL_PAD index */ - kIOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B1_11 = 123U, /**< IOMUXC SW_MUX_CTL_PAD index */ -} iomuxc_sw_mux_ctl_pad_t; - -/* @} */ - -/*! - * @addtogroup iomuxc_pads - * @{ */ - -/******************************************************************************* - * Definitions -*******************************************************************************/ - -/*! - * @brief Enumeration for the IOMUXC SW_PAD_CTL_PAD - * - * Defines the enumeration for the IOMUXC SW_PAD_CTL_PAD collections. - */ -typedef enum _iomuxc_sw_pad_ctl_pad -{ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_00 = 0U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_01 = 1U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_02 = 2U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_03 = 3U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_04 = 4U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_05 = 5U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_06 = 6U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_07 = 7U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_08 = 8U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_09 = 9U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_10 = 10U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_11 = 11U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_12 = 12U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_13 = 13U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_14 = 14U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_15 = 15U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_16 = 16U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_17 = 17U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_18 = 18U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_19 = 19U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_20 = 20U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_21 = 21U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_22 = 22U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_23 = 23U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_24 = 24U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_25 = 25U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_26 = 26U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_27 = 27U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_28 = 28U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_29 = 29U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_30 = 30U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_31 = 31U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_32 = 32U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_33 = 33U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_34 = 34U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_35 = 35U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_36 = 36U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_37 = 37U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_38 = 38U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_39 = 39U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_40 = 40U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_41 = 41U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_00 = 42U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_01 = 43U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_02 = 44U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_03 = 45U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_04 = 46U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_05 = 47U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_06 = 48U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_07 = 49U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_08 = 50U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_09 = 51U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_10 = 52U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_11 = 53U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_12 = 54U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_13 = 55U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_14 = 56U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_15 = 57U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_00 = 58U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_01 = 59U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_02 = 60U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_03 = 61U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_04 = 62U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_05 = 63U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_06 = 64U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_07 = 65U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_08 = 66U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_09 = 67U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_10 = 68U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_11 = 69U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_12 = 70U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_13 = 71U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_14 = 72U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B1_15 = 73U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_00 = 74U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_01 = 75U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_02 = 76U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_03 = 77U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_04 = 78U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_05 = 79U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_06 = 80U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_07 = 81U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_08 = 82U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_09 = 83U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_10 = 84U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_11 = 85U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_12 = 86U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_13 = 87U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_14 = 88U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B0_15 = 89U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_00 = 90U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_01 = 91U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_02 = 92U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_03 = 93U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_04 = 94U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_05 = 95U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_06 = 96U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_07 = 97U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_08 = 98U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_09 = 99U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_10 = 100U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_11 = 101U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_12 = 102U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_13 = 103U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_14 = 104U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_B1_15 = 105U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_00 = 106U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = 107U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_02 = 108U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_03 = 109U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = 110U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_05 = 111U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_00 = 112U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_01 = 113U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_02 = 114U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_03 = 115U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_04 = 116U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_05 = 117U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_06 = 118U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_07 = 119U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_08 = 120U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_09 = 121U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_10 = 122U, /**< IOMUXC SW_PAD_CTL_PAD index */ - kIOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B1_11 = 123U, /**< IOMUXC SW_PAD_CTL_PAD index */ -} iomuxc_sw_pad_ctl_pad_t; - -/* @} */ - -/*! - * @brief Enumeration for the IOMUXC select input - * - * Defines the enumeration for the IOMUXC select input collections. - */ -typedef enum _iomuxc_select_input -{ - kIOMUXC_ANATOP_USB_OTG1_ID_SELECT_INPUT = 0U, /**< IOMUXC select input index */ - kIOMUXC_ANATOP_USB_OTG2_ID_SELECT_INPUT = 1U, /**< IOMUXC select input index */ - kIOMUXC_CCM_PMIC_READY_SELECT_INPUT = 2U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA02_SELECT_INPUT = 3U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA03_SELECT_INPUT = 4U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA04_SELECT_INPUT = 5U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA05_SELECT_INPUT = 6U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA06_SELECT_INPUT = 7U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA07_SELECT_INPUT = 8U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA08_SELECT_INPUT = 9U, /**< IOMUXC select input index */ - kIOMUXC_CSI_DATA09_SELECT_INPUT = 10U, /**< IOMUXC select input index */ - kIOMUXC_CSI_HSYNC_SELECT_INPUT = 11U, /**< IOMUXC select input index */ - kIOMUXC_CSI_PIXCLK_SELECT_INPUT = 12U, /**< IOMUXC select input index */ - kIOMUXC_CSI_VSYNC_SELECT_INPUT = 13U, /**< IOMUXC select input index */ - kIOMUXC_ENET_IPG_CLK_RMII_SELECT_INPUT = 14U, /**< IOMUXC select input index */ - kIOMUXC_ENET_MDIO_SELECT_INPUT = 15U, /**< IOMUXC select input index */ - kIOMUXC_ENET0_RXDATA_SELECT_INPUT = 16U, /**< IOMUXC select input index */ - kIOMUXC_ENET1_RXDATA_SELECT_INPUT = 17U, /**< IOMUXC select input index */ - kIOMUXC_ENET_RXEN_SELECT_INPUT = 18U, /**< IOMUXC select input index */ - kIOMUXC_ENET_RXERR_SELECT_INPUT = 19U, /**< IOMUXC select input index */ - kIOMUXC_ENET0_TIMER_SELECT_INPUT = 20U, /**< IOMUXC select input index */ - kIOMUXC_ENET_TXCLK_SELECT_INPUT = 21U, /**< IOMUXC select input index */ - kIOMUXC_FLEXCAN1_RX_SELECT_INPUT = 22U, /**< IOMUXC select input index */ - kIOMUXC_FLEXCAN2_RX_SELECT_INPUT = 23U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMA3_SELECT_INPUT = 24U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMA0_SELECT_INPUT = 25U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMA1_SELECT_INPUT = 26U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMA2_SELECT_INPUT = 27U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMB3_SELECT_INPUT = 28U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMB0_SELECT_INPUT = 29U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMB1_SELECT_INPUT = 30U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM1_PWMB2_SELECT_INPUT = 31U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMA3_SELECT_INPUT = 32U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMA0_SELECT_INPUT = 33U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMA1_SELECT_INPUT = 34U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMA2_SELECT_INPUT = 35U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMB3_SELECT_INPUT = 36U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMB0_SELECT_INPUT = 37U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMB1_SELECT_INPUT = 38U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM2_PWMB2_SELECT_INPUT = 39U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM4_PWMA0_SELECT_INPUT = 40U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM4_PWMA1_SELECT_INPUT = 41U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM4_PWMA2_SELECT_INPUT = 42U, /**< IOMUXC select input index */ - kIOMUXC_FLEXPWM4_PWMA3_SELECT_INPUT = 43U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_DQS_SELECT_INPUT = 44U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_DATA0_SELECT_INPUT = 45U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_DATA1_SELECT_INPUT = 46U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_DATA2_SELECT_INPUT = 47U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_DATA3_SELECT_INPUT = 48U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIB_DATA0_SELECT_INPUT = 49U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIB_DATA1_SELECT_INPUT = 50U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIB_DATA2_SELECT_INPUT = 51U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIB_DATA3_SELECT_INPUT = 52U, /**< IOMUXC select input index */ - kIOMUXC_FLEXSPIA_SCK_SELECT_INPUT = 53U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C1_SCL_SELECT_INPUT = 54U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C1_SDA_SELECT_INPUT = 55U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C2_SCL_SELECT_INPUT = 56U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C2_SDA_SELECT_INPUT = 57U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C3_SCL_SELECT_INPUT = 58U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C3_SDA_SELECT_INPUT = 59U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C4_SCL_SELECT_INPUT = 60U, /**< IOMUXC select input index */ - kIOMUXC_LPI2C4_SDA_SELECT_INPUT = 61U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI1_PCS0_SELECT_INPUT = 62U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI1_SCK_SELECT_INPUT = 63U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI1_SDI_SELECT_INPUT = 64U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI1_SDO_SELECT_INPUT = 65U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI2_PCS0_SELECT_INPUT = 66U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI2_SCK_SELECT_INPUT = 67U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI2_SDI_SELECT_INPUT = 68U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI2_SDO_SELECT_INPUT = 69U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI3_PCS0_SELECT_INPUT = 70U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI3_SCK_SELECT_INPUT = 71U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI3_SDI_SELECT_INPUT = 72U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI3_SDO_SELECT_INPUT = 73U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI4_PCS0_SELECT_INPUT = 74U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI4_SCK_SELECT_INPUT = 75U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI4_SDI_SELECT_INPUT = 76U, /**< IOMUXC select input index */ - kIOMUXC_LPSPI4_SDO_SELECT_INPUT = 77U, /**< IOMUXC select input index */ - kIOMUXC_LPUART2_RX_SELECT_INPUT = 78U, /**< IOMUXC select input index */ - kIOMUXC_LPUART2_TX_SELECT_INPUT = 79U, /**< IOMUXC select input index */ - kIOMUXC_LPUART3_CTS_B_SELECT_INPUT = 80U, /**< IOMUXC select input index */ - kIOMUXC_LPUART3_RX_SELECT_INPUT = 81U, /**< IOMUXC select input index */ - kIOMUXC_LPUART3_TX_SELECT_INPUT = 82U, /**< IOMUXC select input index */ - kIOMUXC_LPUART4_RX_SELECT_INPUT = 83U, /**< IOMUXC select input index */ - kIOMUXC_LPUART4_TX_SELECT_INPUT = 84U, /**< IOMUXC select input index */ - kIOMUXC_LPUART5_RX_SELECT_INPUT = 85U, /**< IOMUXC select input index */ - kIOMUXC_LPUART5_TX_SELECT_INPUT = 86U, /**< IOMUXC select input index */ - kIOMUXC_LPUART6_RX_SELECT_INPUT = 87U, /**< IOMUXC select input index */ - kIOMUXC_LPUART6_TX_SELECT_INPUT = 88U, /**< IOMUXC select input index */ - kIOMUXC_LPUART7_RX_SELECT_INPUT = 89U, /**< IOMUXC select input index */ - kIOMUXC_LPUART7_TX_SELECT_INPUT = 90U, /**< IOMUXC select input index */ - kIOMUXC_LPUART8_RX_SELECT_INPUT = 91U, /**< IOMUXC select input index */ - kIOMUXC_LPUART8_TX_SELECT_INPUT = 92U, /**< IOMUXC select input index */ - kIOMUXC_NMI_SELECT_INPUT = 93U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER2_TIMER0_SELECT_INPUT = 94U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER2_TIMER1_SELECT_INPUT = 95U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER2_TIMER2_SELECT_INPUT = 96U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER2_TIMER3_SELECT_INPUT = 97U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER3_TIMER0_SELECT_INPUT = 98U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER3_TIMER1_SELECT_INPUT = 99U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER3_TIMER2_SELECT_INPUT = 100U, /**< IOMUXC select input index */ - kIOMUXC_QTIMER3_TIMER3_SELECT_INPUT = 101U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_MCLK2_SELECT_INPUT = 102U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_BCLK_SELECT_INPUT = 103U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_DATA0_SELECT_INPUT = 104U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_DATA1_SELECT_INPUT = 105U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_DATA2_SELECT_INPUT = 106U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_DATA3_SELECT_INPUT = 107U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_RX_SYNC_SELECT_INPUT = 108U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_TX_BCLK_SELECT_INPUT = 109U, /**< IOMUXC select input index */ - kIOMUXC_SAI1_TX_SYNC_SELECT_INPUT = 110U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_MCLK2_SELECT_INPUT = 111U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_RX_BCLK_SELECT_INPUT = 112U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_RX_DATA0_SELECT_INPUT = 113U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_RX_SYNC_SELECT_INPUT = 114U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_TX_BCLK_SELECT_INPUT = 115U, /**< IOMUXC select input index */ - kIOMUXC_SAI2_TX_SYNC_SELECT_INPUT = 116U, /**< IOMUXC select input index */ - kIOMUXC_SPDIF_IN_SELECT_INPUT = 117U, /**< IOMUXC select input index */ - kIOMUXC_USB_OTG2_OC_SELECT_INPUT = 118U, /**< IOMUXC select input index */ - kIOMUXC_USB_OTG1_OC_SELECT_INPUT = 119U, /**< IOMUXC select input index */ - kIOMUXC_USDHC1_CD_B_SELECT_INPUT = 120U, /**< IOMUXC select input index */ - kIOMUXC_USDHC1_WP_SELECT_INPUT = 121U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_CLK_SELECT_INPUT = 122U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_CD_B_SELECT_INPUT = 123U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_CMD_SELECT_INPUT = 124U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA0_SELECT_INPUT = 125U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA1_SELECT_INPUT = 126U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA2_SELECT_INPUT = 127U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA3_SELECT_INPUT = 128U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA4_SELECT_INPUT = 129U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA5_SELECT_INPUT = 130U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA6_SELECT_INPUT = 131U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_DATA7_SELECT_INPUT = 132U, /**< IOMUXC select input index */ - kIOMUXC_USDHC2_WP_SELECT_INPUT = 133U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN02_SELECT_INPUT = 134U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN03_SELECT_INPUT = 135U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN04_SELECT_INPUT = 136U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN05_SELECT_INPUT = 137U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN06_SELECT_INPUT = 138U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN07_SELECT_INPUT = 139U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN08_SELECT_INPUT = 140U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN09_SELECT_INPUT = 141U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN17_SELECT_INPUT = 142U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN18_SELECT_INPUT = 143U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN20_SELECT_INPUT = 144U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN22_SELECT_INPUT = 145U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN23_SELECT_INPUT = 146U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN24_SELECT_INPUT = 147U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN14_SELECT_INPUT = 148U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN15_SELECT_INPUT = 149U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN16_SELECT_INPUT = 150U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN25_SELECT_INPUT = 151U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN19_SELECT_INPUT = 152U, /**< IOMUXC select input index */ - kIOMUXC_XBAR1_IN21_SELECT_INPUT = 153U, /**< IOMUXC select input index */ -} iomuxc_select_input_t; - -typedef enum _xbar_input_signal -{ - kXBARA1_InputLogicLow = 0|0x100U, /**< LOGIC_LOW output assigned to XBARA1_IN0 input. */ - kXBARA1_InputLogicHigh = 1|0x100U, /**< LOGIC_HIGH output assigned to XBARA1_IN1 input. */ - kXBARA1_InputIomuxXbarIn02 = 2|0x100U, /**< IOMUX_XBAR_IN02 output assigned to XBARA1_IN2 input. */ - kXBARA1_InputIomuxXbarIn03 = 3|0x100U, /**< IOMUX_XBAR_IN03 output assigned to XBARA1_IN3 input. */ - kXBARA1_InputIomuxXbarInout04 = 4|0x100U, /**< IOMUX_XBAR_INOUT04 output assigned to XBARA1_IN4 input. */ - kXBARA1_InputIomuxXbarInout05 = 5|0x100U, /**< IOMUX_XBAR_INOUT05 output assigned to XBARA1_IN5 input. */ - kXBARA1_InputIomuxXbarInout06 = 6|0x100U, /**< IOMUX_XBAR_INOUT06 output assigned to XBARA1_IN6 input. */ - kXBARA1_InputIomuxXbarInout07 = 7|0x100U, /**< IOMUX_XBAR_INOUT07 output assigned to XBARA1_IN7 input. */ - kXBARA1_InputIomuxXbarInout08 = 8|0x100U, /**< IOMUX_XBAR_INOUT08 output assigned to XBARA1_IN8 input. */ - kXBARA1_InputIomuxXbarInout09 = 9|0x100U, /**< IOMUX_XBAR_INOUT09 output assigned to XBARA1_IN9 input. */ - kXBARA1_InputIomuxXbarInout10 = 10|0x100U, /**< IOMUX_XBAR_INOUT10 output assigned to XBARA1_IN10 input. */ - kXBARA1_InputIomuxXbarInout11 = 11|0x100U, /**< IOMUX_XBAR_INOUT11 output assigned to XBARA1_IN11 input. */ - kXBARA1_InputIomuxXbarInout12 = 12|0x100U, /**< IOMUX_XBAR_INOUT12 output assigned to XBARA1_IN12 input. */ - kXBARA1_InputIomuxXbarInout13 = 13|0x100U, /**< IOMUX_XBAR_INOUT13 output assigned to XBARA1_IN13 input. */ - kXBARA1_InputIomuxXbarInout14 = 14|0x100U, /**< IOMUX_XBAR_INOUT14 output assigned to XBARA1_IN14 input. */ - kXBARA1_InputIomuxXbarInout15 = 15|0x100U, /**< IOMUX_XBAR_INOUT15 output assigned to XBARA1_IN15 input. */ - kXBARA1_InputIomuxXbarInout16 = 16|0x100U, /**< IOMUX_XBAR_INOUT16 output assigned to XBARA1_IN16 input. */ - kXBARA1_InputIomuxXbarInout17 = 17|0x100U, /**< IOMUX_XBAR_INOUT17 output assigned to XBARA1_IN17 input. */ - kXBARA1_InputIomuxXbarInout18 = 18|0x100U, /**< IOMUX_XBAR_INOUT18 output assigned to XBARA1_IN18 input. */ - kXBARA1_InputIomuxXbarInout19 = 19|0x100U, /**< IOMUX_XBAR_INOUT19 output assigned to XBARA1_IN19 input. */ - kXBARA1_InputIomuxXbarIn20 = 20|0x100U, /**< IOMUX_XBAR_IN20 output assigned to XBARA1_IN20 input. */ - kXBARA1_InputIomuxXbarIn21 = 21|0x100U, /**< IOMUX_XBAR_IN21 output assigned to XBARA1_IN21 input. */ - kXBARA1_InputIomuxXbarIn22 = 22|0x100U, /**< IOMUX_XBAR_IN22 output assigned to XBARA1_IN22 input. */ - kXBARA1_InputIomuxXbarIn23 = 23|0x100U, /**< IOMUX_XBAR_IN23 output assigned to XBARA1_IN23 input. */ - kXBARA1_InputIomuxXbarIn24 = 24|0x100U, /**< IOMUX_XBAR_IN24 output assigned to XBARA1_IN24 input. */ - kXBARA1_InputIomuxXbarIn25 = 25|0x100U, /**< IOMUX_XBAR_IN25 output assigned to XBARA1_IN25 input. */ - kXBARA1_InputAcmp1Out = 26|0x100U, /**< ACMP1_OUT output assigned to XBARA1_IN26 input. */ - kXBARA1_InputAcmp2Out = 27|0x100U, /**< ACMP2_OUT output assigned to XBARA1_IN27 input. */ - kXBARA1_InputAcmp3Out = 28|0x100U, /**< ACMP3_OUT output assigned to XBARA1_IN28 input. */ - kXBARA1_InputAcmp4Out = 29|0x100U, /**< ACMP4_OUT output assigned to XBARA1_IN29 input. */ - kXBARA1_InputRESERVED30 = 30|0x100U, /**< XBARA1_IN30 input is reserved. */ - kXBARA1_InputRESERVED31 = 31|0x100U, /**< XBARA1_IN31 input is reserved. */ - kXBARA1_InputQtimer3Tmr0Output = 32|0x100U, /**< QTIMER3_TMR0_OUTPUT output assigned to XBARA1_IN32 input. */ - kXBARA1_InputQtimer3Tmr1Output = 33|0x100U, /**< QTIMER3_TMR1_OUTPUT output assigned to XBARA1_IN33 input. */ - kXBARA1_InputQtimer3Tmr2Output = 34|0x100U, /**< QTIMER3_TMR2_OUTPUT output assigned to XBARA1_IN34 input. */ - kXBARA1_InputQtimer3Tmr3Output = 35|0x100U, /**< QTIMER3_TMR3_OUTPUT output assigned to XBARA1_IN35 input. */ - kXBARA1_InputQtimer4Tmr0Output = 36|0x100U, /**< QTIMER4_TMR0_OUTPUT output assigned to XBARA1_IN36 input. */ - kXBARA1_InputQtimer4Tmr1Output = 37|0x100U, /**< QTIMER4_TMR1_OUTPUT output assigned to XBARA1_IN37 input. */ - kXBARA1_InputQtimer4Tmr2Output = 38|0x100U, /**< QTIMER4_TMR2_OUTPUT output assigned to XBARA1_IN38 input. */ - kXBARA1_InputQtimer4Tmr3Output = 39|0x100U, /**< QTIMER4_TMR3_OUTPUT output assigned to XBARA1_IN39 input. */ - kXBARA1_InputFlexpwm1Pwm1OutTrig01 = 40|0x100U, /**< FLEXPWM1_PWM1_OUT_TRIG0_1 output assigned to XBARA1_IN40 input. */ - kXBARA1_InputFlexpwm1Pwm2OutTrig01 = 41|0x100U, /**< FLEXPWM1_PWM2_OUT_TRIG0_1 output assigned to XBARA1_IN41 input. */ - kXBARA1_InputFlexpwm1Pwm3OutTrig01 = 42|0x100U, /**< FLEXPWM1_PWM3_OUT_TRIG0_1 output assigned to XBARA1_IN42 input. */ - kXBARA1_InputFlexpwm1Pwm4OutTrig01 = 43|0x100U, /**< FLEXPWM1_PWM4_OUT_TRIG0_1 output assigned to XBARA1_IN43 input. */ - kXBARA1_InputFlexpwm2Pwm1OutTrig01 = 44|0x100U, /**< FLEXPWM2_PWM1_OUT_TRIG0_1 output assigned to XBARA1_IN44 input. */ - kXBARA1_InputFlexpwm2Pwm2OutTrig01 = 45|0x100U, /**< FLEXPWM2_PWM2_OUT_TRIG0_1 output assigned to XBARA1_IN45 input. */ - kXBARA1_InputFlexpwm2Pwm3OutTrig01 = 46|0x100U, /**< FLEXPWM2_PWM3_OUT_TRIG0_1 output assigned to XBARA1_IN46 input. */ - kXBARA1_InputFlexpwm2Pwm4OutTrig01 = 47|0x100U, /**< FLEXPWM2_PWM4_OUT_TRIG0_1 output assigned to XBARA1_IN47 input. */ - kXBARA1_InputFlexpwm3Pwm1OutTrig01 = 48|0x100U, /**< FLEXPWM3_PWM1_OUT_TRIG0_1 output assigned to XBARA1_IN48 input. */ - kXBARA1_InputFlexpwm3Pwm2OutTrig01 = 49|0x100U, /**< FLEXPWM3_PWM2_OUT_TRIG0_1 output assigned to XBARA1_IN49 input. */ - kXBARA1_InputFlexpwm3Pwm3OutTrig01 = 50|0x100U, /**< FLEXPWM3_PWM3_OUT_TRIG0_1 output assigned to XBARA1_IN50 input. */ - kXBARA1_InputFlexpwm3Pwm4OutTrig01 = 51|0x100U, /**< FLEXPWM3_PWM4_OUT_TRIG0_1 output assigned to XBARA1_IN51 input. */ - kXBARA1_InputFlexpwm4Pwm1OutTrig01 = 52|0x100U, /**< FLEXPWM4_PWM1_OUT_TRIG0_1 output assigned to XBARA1_IN52 input. */ - kXBARA1_InputFlexpwm4Pwm2OutTrig01 = 53|0x100U, /**< FLEXPWM4_PWM2_OUT_TRIG0_1 output assigned to XBARA1_IN53 input. */ - kXBARA1_InputFlexpwm4Pwm3OutTrig01 = 54|0x100U, /**< FLEXPWM4_PWM3_OUT_TRIG0_1 output assigned to XBARA1_IN54 input. */ - kXBARA1_InputFlexpwm4Pwm4OutTrig01 = 55|0x100U, /**< FLEXPWM4_PWM4_OUT_TRIG0_1 output assigned to XBARA1_IN55 input. */ - kXBARA1_InputPitTrigger0 = 56|0x100U, /**< PIT_TRIGGER0 output assigned to XBARA1_IN56 input. */ - kXBARA1_InputPitTrigger1 = 57|0x100U, /**< PIT_TRIGGER1 output assigned to XBARA1_IN57 input. */ - kXBARA1_InputPitTrigger2 = 58|0x100U, /**< PIT_TRIGGER2 output assigned to XBARA1_IN58 input. */ - kXBARA1_InputPitTrigger3 = 59|0x100U, /**< PIT_TRIGGER3 output assigned to XBARA1_IN59 input. */ - kXBARA1_InputEnc1PosMatch = 60|0x100U, /**< ENC1_POS_MATCH output assigned to XBARA1_IN60 input. */ - kXBARA1_InputEnc2PosMatch = 61|0x100U, /**< ENC2_POS_MATCH output assigned to XBARA1_IN61 input. */ - kXBARA1_InputEnc3PosMatch = 62|0x100U, /**< ENC3_POS_MATCH output assigned to XBARA1_IN62 input. */ - kXBARA1_InputEnc4PosMatch = 63|0x100U, /**< ENC4_POS_MATCH output assigned to XBARA1_IN63 input. */ - kXBARA1_InputDmaDone0 = 64|0x100U, /**< DMA_DONE0 output assigned to XBARA1_IN64 input. */ - kXBARA1_InputDmaDone1 = 65|0x100U, /**< DMA_DONE1 output assigned to XBARA1_IN65 input. */ - kXBARA1_InputDmaDone2 = 66|0x100U, /**< DMA_DONE2 output assigned to XBARA1_IN66 input. */ - kXBARA1_InputDmaDone3 = 67|0x100U, /**< DMA_DONE3 output assigned to XBARA1_IN67 input. */ - kXBARA1_InputDmaDone4 = 68|0x100U, /**< DMA_DONE4 output assigned to XBARA1_IN68 input. */ - kXBARA1_InputDmaDone5 = 69|0x100U, /**< DMA_DONE5 output assigned to XBARA1_IN69 input. */ - kXBARA1_InputDmaDone6 = 70|0x100U, /**< DMA_DONE6 output assigned to XBARA1_IN70 input. */ - kXBARA1_InputDmaDone7 = 71|0x100U, /**< DMA_DONE7 output assigned to XBARA1_IN71 input. */ - kXBARA1_InputAoi1Out0 = 72|0x100U, /**< AOI1_OUT0 output assigned to XBARA1_IN72 input. */ - kXBARA1_InputAoi1Out1 = 73|0x100U, /**< AOI1_OUT1 output assigned to XBARA1_IN73 input. */ - kXBARA1_InputAoi1Out2 = 74|0x100U, /**< AOI1_OUT2 output assigned to XBARA1_IN74 input. */ - kXBARA1_InputAoi1Out3 = 75|0x100U, /**< AOI1_OUT3 output assigned to XBARA1_IN75 input. */ - kXBARA1_InputAoi2Out0 = 76|0x100U, /**< AOI2_OUT0 output assigned to XBARA1_IN76 input. */ - kXBARA1_InputAoi2Out1 = 77|0x100U, /**< AOI2_OUT1 output assigned to XBARA1_IN77 input. */ - kXBARA1_InputAoi2Out2 = 78|0x100U, /**< AOI2_OUT2 output assigned to XBARA1_IN78 input. */ - kXBARA1_InputAoi2Out3 = 79|0x100U, /**< AOI2_OUT3 output assigned to XBARA1_IN79 input. */ - kXBARA1_InputAdcEtcXbar0Coco0 = 80|0x100U, /**< ADC_ETC_XBAR0_COCO0 output assigned to XBARA1_IN80 input. */ - kXBARA1_InputAdcEtcXbar0Coco1 = 81|0x100U, /**< ADC_ETC_XBAR0_COCO1 output assigned to XBARA1_IN81 input. */ - kXBARA1_InputAdcEtcXbar0Coco2 = 82|0x100U, /**< ADC_ETC_XBAR0_COCO2 output assigned to XBARA1_IN82 input. */ - kXBARA1_InputAdcEtcXbar0Coco3 = 83|0x100U, /**< ADC_ETC_XBAR0_COCO3 output assigned to XBARA1_IN83 input. */ - kXBARA1_InputAdcEtcXbar1Coco0 = 84|0x100U, /**< ADC_ETC_XBAR1_COCO0 output assigned to XBARA1_IN84 input. */ - kXBARA1_InputAdcEtcXbar1Coco1 = 85|0x100U, /**< ADC_ETC_XBAR1_COCO1 output assigned to XBARA1_IN85 input. */ - kXBARA1_InputAdcEtcXbar1Coco2 = 86|0x100U, /**< ADC_ETC_XBAR1_COCO2 output assigned to XBARA1_IN86 input. */ - kXBARA1_InputAdcEtcXbar1Coco3 = 87|0x100U, /**< ADC_ETC_XBAR1_COCO3 output assigned to XBARA1_IN87 input. */ - kXBARB2_InputLogicLow = 0|0x200U, /**< LOGIC_LOW output assigned to XBARB2_IN0 input. */ - kXBARB2_InputLogicHigh = 1|0x200U, /**< LOGIC_HIGH output assigned to XBARB2_IN1 input. */ - kXBARB2_InputRESERVED2 = 2|0x200U, /**< XBARB2_IN2 input is reserved. */ - kXBARB2_InputRESERVED3 = 3|0x200U, /**< XBARB2_IN3 input is reserved. */ - kXBARB2_InputRESERVED4 = 4|0x200U, /**< XBARB2_IN4 input is reserved. */ - kXBARB2_InputRESERVED5 = 5|0x200U, /**< XBARB2_IN5 input is reserved. */ - kXBARB2_InputAcmp1Out = 6|0x200U, /**< ACMP1_OUT output assigned to XBARB2_IN6 input. */ - kXBARB2_InputAcmp2Out = 7|0x200U, /**< ACMP2_OUT output assigned to XBARB2_IN7 input. */ - kXBARB2_InputAcmp3Out = 8|0x200U, /**< ACMP3_OUT output assigned to XBARB2_IN8 input. */ - kXBARB2_InputAcmp4Out = 9|0x200U, /**< ACMP4_OUT output assigned to XBARB2_IN9 input. */ - kXBARB2_InputRESERVED10 = 10|0x200U, /**< XBARB2_IN10 input is reserved. */ - kXBARB2_InputRESERVED11 = 11|0x200U, /**< XBARB2_IN11 input is reserved. */ - kXBARB2_InputQtimer3Tmr0Output = 12|0x200U, /**< QTIMER3_TMR0_OUTPUT output assigned to XBARB2_IN12 input. */ - kXBARB2_InputQtimer3Tmr1Output = 13|0x200U, /**< QTIMER3_TMR1_OUTPUT output assigned to XBARB2_IN13 input. */ - kXBARB2_InputQtimer3Tmr2Output = 14|0x200U, /**< QTIMER3_TMR2_OUTPUT output assigned to XBARB2_IN14 input. */ - kXBARB2_InputQtimer3Tmr3Output = 15|0x200U, /**< QTIMER3_TMR3_OUTPUT output assigned to XBARB2_IN15 input. */ - kXBARB2_InputQtimer4Tmr0Output = 16|0x200U, /**< QTIMER4_TMR0_OUTPUT output assigned to XBARB2_IN16 input. */ - kXBARB2_InputQtimer4Tmr1Output = 17|0x200U, /**< QTIMER4_TMR1_OUTPUT output assigned to XBARB2_IN17 input. */ - kXBARB2_InputQtimer4Tmr2Output = 18|0x200U, /**< QTIMER4_TMR2_OUTPUT output assigned to XBARB2_IN18 input. */ - kXBARB2_InputQtimer4Tmr3Output = 19|0x200U, /**< QTIMER4_TMR3_OUTPUT output assigned to XBARB2_IN19 input. */ - kXBARB2_InputFlexpwm1Pwm1OutTrig01 = 20|0x200U, /**< FLEXPWM1_PWM1_OUT_TRIG0_1 output assigned to XBARB2_IN20 input. */ - kXBARB2_InputFlexpwm1Pwm2OutTrig01 = 21|0x200U, /**< FLEXPWM1_PWM2_OUT_TRIG0_1 output assigned to XBARB2_IN21 input. */ - kXBARB2_InputFlexpwm1Pwm3OutTrig01 = 22|0x200U, /**< FLEXPWM1_PWM3_OUT_TRIG0_1 output assigned to XBARB2_IN22 input. */ - kXBARB2_InputFlexpwm1Pwm4OutTrig01 = 23|0x200U, /**< FLEXPWM1_PWM4_OUT_TRIG0_1 output assigned to XBARB2_IN23 input. */ - kXBARB2_InputFlexpwm2Pwm1OutTrig01 = 24|0x200U, /**< FLEXPWM2_PWM1_OUT_TRIG0_1 output assigned to XBARB2_IN24 input. */ - kXBARB2_InputFlexpwm2Pwm2OutTrig01 = 25|0x200U, /**< FLEXPWM2_PWM2_OUT_TRIG0_1 output assigned to XBARB2_IN25 input. */ - kXBARB2_InputFlexpwm2Pwm3OutTrig01 = 26|0x200U, /**< FLEXPWM2_PWM3_OUT_TRIG0_1 output assigned to XBARB2_IN26 input. */ - kXBARB2_InputFlexpwm2Pwm4OutTrig01 = 27|0x200U, /**< FLEXPWM2_PWM4_OUT_TRIG0_1 output assigned to XBARB2_IN27 input. */ - kXBARB2_InputFlexpwm3Pwm1OutTrig01 = 28|0x200U, /**< FLEXPWM3_PWM1_OUT_TRIG0_1 output assigned to XBARB2_IN28 input. */ - kXBARB2_InputFlexpwm3Pwm2OutTrig01 = 29|0x200U, /**< FLEXPWM3_PWM2_OUT_TRIG0_1 output assigned to XBARB2_IN29 input. */ - kXBARB2_InputFlexpwm3Pwm3OutTrig01 = 30|0x200U, /**< FLEXPWM3_PWM3_OUT_TRIG0_1 output assigned to XBARB2_IN30 input. */ - kXBARB2_InputFlexpwm3Pwm4OutTrig01 = 31|0x200U, /**< FLEXPWM3_PWM4_OUT_TRIG0_1 output assigned to XBARB2_IN31 input. */ - kXBARB2_InputFlexpwm4Pwm1OutTrig01 = 32|0x200U, /**< FLEXPWM4_PWM1_OUT_TRIG0_1 output assigned to XBARB2_IN32 input. */ - kXBARB2_InputFlexpwm4Pwm2OutTrig01 = 33|0x200U, /**< FLEXPWM4_PWM2_OUT_TRIG0_1 output assigned to XBARB2_IN33 input. */ - kXBARB2_InputFlexpwm4Pwm3OutTrig01 = 34|0x200U, /**< FLEXPWM4_PWM3_OUT_TRIG0_1 output assigned to XBARB2_IN34 input. */ - kXBARB2_InputFlexpwm4Pwm4OutTrig01 = 35|0x200U, /**< FLEXPWM4_PWM4_OUT_TRIG0_1 output assigned to XBARB2_IN35 input. */ - kXBARB2_InputPitTrigger0 = 36|0x200U, /**< PIT_TRIGGER0 output assigned to XBARB2_IN36 input. */ - kXBARB2_InputPitTrigger1 = 37|0x200U, /**< PIT_TRIGGER1 output assigned to XBARB2_IN37 input. */ - kXBARB2_InputAdcEtcXbar0Coco0 = 38|0x200U, /**< ADC_ETC_XBAR0_COCO0 output assigned to XBARB2_IN38 input. */ - kXBARB2_InputAdcEtcXbar0Coco1 = 39|0x200U, /**< ADC_ETC_XBAR0_COCO1 output assigned to XBARB2_IN39 input. */ - kXBARB2_InputAdcEtcXbar0Coco2 = 40|0x200U, /**< ADC_ETC_XBAR0_COCO2 output assigned to XBARB2_IN40 input. */ - kXBARB2_InputAdcEtcXbar0Coco3 = 41|0x200U, /**< ADC_ETC_XBAR0_COCO3 output assigned to XBARB2_IN41 input. */ - kXBARB2_InputAdcEtcXbar1Coco0 = 42|0x200U, /**< ADC_ETC_XBAR1_COCO0 output assigned to XBARB2_IN42 input. */ - kXBARB2_InputAdcEtcXbar1Coco1 = 43|0x200U, /**< ADC_ETC_XBAR1_COCO1 output assigned to XBARB2_IN43 input. */ - kXBARB2_InputAdcEtcXbar1Coco2 = 44|0x200U, /**< ADC_ETC_XBAR1_COCO2 output assigned to XBARB2_IN44 input. */ - kXBARB2_InputAdcEtcXbar1Coco3 = 45|0x200U, /**< ADC_ETC_XBAR1_COCO3 output assigned to XBARB2_IN45 input. */ - kXBARB2_InputEnc1PosMatch = 46|0x200U, /**< ENC1_POS_MATCH output assigned to XBARB2_IN46 input. */ - kXBARB2_InputEnc2PosMatch = 47|0x200U, /**< ENC2_POS_MATCH output assigned to XBARB2_IN47 input. */ - kXBARB2_InputEnc3PosMatch = 48|0x200U, /**< ENC3_POS_MATCH output assigned to XBARB2_IN48 input. */ - kXBARB2_InputEnc4PosMatch = 49|0x200U, /**< ENC4_POS_MATCH output assigned to XBARB2_IN49 input. */ - kXBARB2_InputDmaDone0 = 50|0x200U, /**< DMA_DONE0 output assigned to XBARB2_IN50 input. */ - kXBARB2_InputDmaDone1 = 51|0x200U, /**< DMA_DONE1 output assigned to XBARB2_IN51 input. */ - kXBARB2_InputDmaDone2 = 52|0x200U, /**< DMA_DONE2 output assigned to XBARB2_IN52 input. */ - kXBARB2_InputDmaDone3 = 53|0x200U, /**< DMA_DONE3 output assigned to XBARB2_IN53 input. */ - kXBARB2_InputDmaDone4 = 54|0x200U, /**< DMA_DONE4 output assigned to XBARB2_IN54 input. */ - kXBARB2_InputDmaDone5 = 55|0x200U, /**< DMA_DONE5 output assigned to XBARB2_IN55 input. */ - kXBARB2_InputDmaDone6 = 56|0x200U, /**< DMA_DONE6 output assigned to XBARB2_IN56 input. */ - kXBARB2_InputDmaDone7 = 57|0x200U, /**< DMA_DONE7 output assigned to XBARB2_IN57 input. */ - kXBARB3_InputLogicLow = 0|0x300U, /**< LOGIC_LOW output assigned to XBARB3_IN0 input. */ - kXBARB3_InputLogicHigh = 1|0x300U, /**< LOGIC_HIGH output assigned to XBARB3_IN1 input. */ - kXBARB3_InputRESERVED2 = 2|0x300U, /**< XBARB3_IN2 input is reserved. */ - kXBARB3_InputRESERVED3 = 3|0x300U, /**< XBARB3_IN3 input is reserved. */ - kXBARB3_InputRESERVED4 = 4|0x300U, /**< XBARB3_IN4 input is reserved. */ - kXBARB3_InputRESERVED5 = 5|0x300U, /**< XBARB3_IN5 input is reserved. */ - kXBARB3_InputAcmp1Out = 6|0x300U, /**< ACMP1_OUT output assigned to XBARB3_IN6 input. */ - kXBARB3_InputAcmp2Out = 7|0x300U, /**< ACMP2_OUT output assigned to XBARB3_IN7 input. */ - kXBARB3_InputAcmp3Out = 8|0x300U, /**< ACMP3_OUT output assigned to XBARB3_IN8 input. */ - kXBARB3_InputAcmp4Out = 9|0x300U, /**< ACMP4_OUT output assigned to XBARB3_IN9 input. */ - kXBARB3_InputRESERVED10 = 10|0x300U, /**< XBARB3_IN10 input is reserved. */ - kXBARB3_InputRESERVED11 = 11|0x300U, /**< XBARB3_IN11 input is reserved. */ - kXBARB3_InputQtimer3Tmr0Output = 12|0x300U, /**< QTIMER3_TMR0_OUTPUT output assigned to XBARB3_IN12 input. */ - kXBARB3_InputQtimer3Tmr1Output = 13|0x300U, /**< QTIMER3_TMR1_OUTPUT output assigned to XBARB3_IN13 input. */ - kXBARB3_InputQtimer3Tmr2Output = 14|0x300U, /**< QTIMER3_TMR2_OUTPUT output assigned to XBARB3_IN14 input. */ - kXBARB3_InputQtimer3Tmr3Output = 15|0x300U, /**< QTIMER3_TMR3_OUTPUT output assigned to XBARB3_IN15 input. */ - kXBARB3_InputQtimer4Tmr0Output = 16|0x300U, /**< QTIMER4_TMR0_OUTPUT output assigned to XBARB3_IN16 input. */ - kXBARB3_InputQtimer4Tmr1Output = 17|0x300U, /**< QTIMER4_TMR1_OUTPUT output assigned to XBARB3_IN17 input. */ - kXBARB3_InputQtimer4Tmr2Output = 18|0x300U, /**< QTIMER4_TMR2_OUTPUT output assigned to XBARB3_IN18 input. */ - kXBARB3_InputQtimer4Tmr3Output = 19|0x300U, /**< QTIMER4_TMR3_OUTPUT output assigned to XBARB3_IN19 input. */ - kXBARB3_InputFlexpwm1Pwm1OutTrig01 = 20|0x300U, /**< FLEXPWM1_PWM1_OUT_TRIG0_1 output assigned to XBARB3_IN20 input. */ - kXBARB3_InputFlexpwm1Pwm2OutTrig01 = 21|0x300U, /**< FLEXPWM1_PWM2_OUT_TRIG0_1 output assigned to XBARB3_IN21 input. */ - kXBARB3_InputFlexpwm1Pwm3OutTrig01 = 22|0x300U, /**< FLEXPWM1_PWM3_OUT_TRIG0_1 output assigned to XBARB3_IN22 input. */ - kXBARB3_InputFlexpwm1Pwm4OutTrig01 = 23|0x300U, /**< FLEXPWM1_PWM4_OUT_TRIG0_1 output assigned to XBARB3_IN23 input. */ - kXBARB3_InputFlexpwm2Pwm1OutTrig01 = 24|0x300U, /**< FLEXPWM2_PWM1_OUT_TRIG0_1 output assigned to XBARB3_IN24 input. */ - kXBARB3_InputFlexpwm2Pwm2OutTrig01 = 25|0x300U, /**< FLEXPWM2_PWM2_OUT_TRIG0_1 output assigned to XBARB3_IN25 input. */ - kXBARB3_InputFlexpwm2Pwm3OutTrig01 = 26|0x300U, /**< FLEXPWM2_PWM3_OUT_TRIG0_1 output assigned to XBARB3_IN26 input. */ - kXBARB3_InputFlexpwm2Pwm4OutTrig01 = 27|0x300U, /**< FLEXPWM2_PWM4_OUT_TRIG0_1 output assigned to XBARB3_IN27 input. */ - kXBARB3_InputFlexpwm3Pwm1OutTrig01 = 28|0x300U, /**< FLEXPWM3_PWM1_OUT_TRIG0_1 output assigned to XBARB3_IN28 input. */ - kXBARB3_InputFlexpwm3Pwm2OutTrig01 = 29|0x300U, /**< FLEXPWM3_PWM2_OUT_TRIG0_1 output assigned to XBARB3_IN29 input. */ - kXBARB3_InputFlexpwm3Pwm3OutTrig01 = 30|0x300U, /**< FLEXPWM3_PWM3_OUT_TRIG0_1 output assigned to XBARB3_IN30 input. */ - kXBARB3_InputFlexpwm3Pwm4OutTrig01 = 31|0x300U, /**< FLEXPWM3_PWM4_OUT_TRIG0_1 output assigned to XBARB3_IN31 input. */ - kXBARB3_InputFlexpwm4Pwm1OutTrig01 = 32|0x300U, /**< FLEXPWM4_PWM1_OUT_TRIG0_1 output assigned to XBARB3_IN32 input. */ - kXBARB3_InputFlexpwm4Pwm2OutTrig01 = 33|0x300U, /**< FLEXPWM4_PWM2_OUT_TRIG0_1 output assigned to XBARB3_IN33 input. */ - kXBARB3_InputFlexpwm4Pwm3OutTrig01 = 34|0x300U, /**< FLEXPWM4_PWM3_OUT_TRIG0_1 output assigned to XBARB3_IN34 input. */ - kXBARB3_InputFlexpwm4Pwm4OutTrig01 = 35|0x300U, /**< FLEXPWM4_PWM4_OUT_TRIG0_1 output assigned to XBARB3_IN35 input. */ - kXBARB3_InputPitTrigger0 = 36|0x300U, /**< PIT_TRIGGER0 output assigned to XBARB3_IN36 input. */ - kXBARB3_InputPitTrigger1 = 37|0x300U, /**< PIT_TRIGGER1 output assigned to XBARB3_IN37 input. */ - kXBARB3_InputAdcEtcXbar0Coco0 = 38|0x300U, /**< ADC_ETC_XBAR0_COCO0 output assigned to XBARB3_IN38 input. */ - kXBARB3_InputAdcEtcXbar0Coco1 = 39|0x300U, /**< ADC_ETC_XBAR0_COCO1 output assigned to XBARB3_IN39 input. */ - kXBARB3_InputAdcEtcXbar0Coco2 = 40|0x300U, /**< ADC_ETC_XBAR0_COCO2 output assigned to XBARB3_IN40 input. */ - kXBARB3_InputAdcEtcXbar0Coco3 = 41|0x300U, /**< ADC_ETC_XBAR0_COCO3 output assigned to XBARB3_IN41 input. */ - kXBARB3_InputAdcEtcXbar1Coco0 = 42|0x300U, /**< ADC_ETC_XBAR1_COCO0 output assigned to XBARB3_IN42 input. */ - kXBARB3_InputAdcEtcXbar1Coco1 = 43|0x300U, /**< ADC_ETC_XBAR1_COCO1 output assigned to XBARB3_IN43 input. */ - kXBARB3_InputAdcEtcXbar1Coco2 = 44|0x300U, /**< ADC_ETC_XBAR1_COCO2 output assigned to XBARB3_IN44 input. */ - kXBARB3_InputAdcEtcXbar1Coco3 = 45|0x300U, /**< ADC_ETC_XBAR1_COCO3 output assigned to XBARB3_IN45 input. */ - kXBARB3_InputEnc1PosMatch = 46|0x300U, /**< ENC1_POS_MATCH output assigned to XBARB3_IN46 input. */ - kXBARB3_InputEnc2PosMatch = 47|0x300U, /**< ENC2_POS_MATCH output assigned to XBARB3_IN47 input. */ - kXBARB3_InputEnc3PosMatch = 48|0x300U, /**< ENC3_POS_MATCH output assigned to XBARB3_IN48 input. */ - kXBARB3_InputEnc4PosMatch = 49|0x300U, /**< ENC4_POS_MATCH output assigned to XBARB3_IN49 input. */ - kXBARB3_InputDmaDone0 = 50|0x300U, /**< DMA_DONE0 output assigned to XBARB3_IN50 input. */ - kXBARB3_InputDmaDone1 = 51|0x300U, /**< DMA_DONE1 output assigned to XBARB3_IN51 input. */ - kXBARB3_InputDmaDone2 = 52|0x300U, /**< DMA_DONE2 output assigned to XBARB3_IN52 input. */ - kXBARB3_InputDmaDone3 = 53|0x300U, /**< DMA_DONE3 output assigned to XBARB3_IN53 input. */ - kXBARB3_InputDmaDone4 = 54|0x300U, /**< DMA_DONE4 output assigned to XBARB3_IN54 input. */ - kXBARB3_InputDmaDone5 = 55|0x300U, /**< DMA_DONE5 output assigned to XBARB3_IN55 input. */ - kXBARB3_InputDmaDone6 = 56|0x300U, /**< DMA_DONE6 output assigned to XBARB3_IN56 input. */ - kXBARB3_InputDmaDone7 = 57|0x300U, /**< DMA_DONE7 output assigned to XBARB3_IN57 input. */ -} xbar_input_signal_t; - -typedef enum _xbar_output_signal -{ - kXBARA1_OutputDmaChMuxReq30 = 0|0x100U, /**< XBARA1_OUT0 output assigned to DMA_CH_MUX_REQ30 */ - kXBARA1_OutputDmaChMuxReq31 = 1|0x100U, /**< XBARA1_OUT1 output assigned to DMA_CH_MUX_REQ31 */ - kXBARA1_OutputDmaChMuxReq94 = 2|0x100U, /**< XBARA1_OUT2 output assigned to DMA_CH_MUX_REQ94 */ - kXBARA1_OutputDmaChMuxReq95 = 3|0x100U, /**< XBARA1_OUT3 output assigned to DMA_CH_MUX_REQ95 */ - kXBARA1_OutputIomuxXbarInout04 = 4|0x100U, /**< XBARA1_OUT4 output assigned to IOMUX_XBAR_INOUT04 */ - kXBARA1_OutputIomuxXbarInout05 = 5|0x100U, /**< XBARA1_OUT5 output assigned to IOMUX_XBAR_INOUT05 */ - kXBARA1_OutputIomuxXbarInout06 = 6|0x100U, /**< XBARA1_OUT6 output assigned to IOMUX_XBAR_INOUT06 */ - kXBARA1_OutputIomuxXbarInout07 = 7|0x100U, /**< XBARA1_OUT7 output assigned to IOMUX_XBAR_INOUT07 */ - kXBARA1_OutputIomuxXbarInout08 = 8|0x100U, /**< XBARA1_OUT8 output assigned to IOMUX_XBAR_INOUT08 */ - kXBARA1_OutputIomuxXbarInout09 = 9|0x100U, /**< XBARA1_OUT9 output assigned to IOMUX_XBAR_INOUT09 */ - kXBARA1_OutputIomuxXbarInout10 = 10|0x100U, /**< XBARA1_OUT10 output assigned to IOMUX_XBAR_INOUT10 */ - kXBARA1_OutputIomuxXbarInout11 = 11|0x100U, /**< XBARA1_OUT11 output assigned to IOMUX_XBAR_INOUT11 */ - kXBARA1_OutputIomuxXbarInout12 = 12|0x100U, /**< XBARA1_OUT12 output assigned to IOMUX_XBAR_INOUT12 */ - kXBARA1_OutputIomuxXbarInout13 = 13|0x100U, /**< XBARA1_OUT13 output assigned to IOMUX_XBAR_INOUT13 */ - kXBARA1_OutputIomuxXbarInout14 = 14|0x100U, /**< XBARA1_OUT14 output assigned to IOMUX_XBAR_INOUT14 */ - kXBARA1_OutputIomuxXbarInout15 = 15|0x100U, /**< XBARA1_OUT15 output assigned to IOMUX_XBAR_INOUT15 */ - kXBARA1_OutputIomuxXbarInout16 = 16|0x100U, /**< XBARA1_OUT16 output assigned to IOMUX_XBAR_INOUT16 */ - kXBARA1_OutputIomuxXbarInout17 = 17|0x100U, /**< XBARA1_OUT17 output assigned to IOMUX_XBAR_INOUT17 */ - kXBARA1_OutputIomuxXbarInout18 = 18|0x100U, /**< XBARA1_OUT18 output assigned to IOMUX_XBAR_INOUT18 */ - kXBARA1_OutputIomuxXbarInout19 = 19|0x100U, /**< XBARA1_OUT19 output assigned to IOMUX_XBAR_INOUT19 */ - kXBARA1_OutputAcmp1Sample = 20|0x100U, /**< XBARA1_OUT20 output assigned to ACMP1_SAMPLE */ - kXBARA1_OutputAcmp2Sample = 21|0x100U, /**< XBARA1_OUT21 output assigned to ACMP2_SAMPLE */ - kXBARA1_OutputAcmp3Sample = 22|0x100U, /**< XBARA1_OUT22 output assigned to ACMP3_SAMPLE */ - kXBARA1_OutputAcmp4Sample = 23|0x100U, /**< XBARA1_OUT23 output assigned to ACMP4_SAMPLE */ - kXBARA1_OutputRESERVED24 = 24|0x100U, /**< XBARA1_OUT24 output is reserved. */ - kXBARA1_OutputRESERVED25 = 25|0x100U, /**< XBARA1_OUT25 output is reserved. */ - kXBARA1_OutputFlexpwm1Exta0 = 26|0x100U, /**< XBARA1_OUT26 output assigned to FLEXPWM1_EXTA0 */ - kXBARA1_OutputFlexpwm1Exta1 = 27|0x100U, /**< XBARA1_OUT27 output assigned to FLEXPWM1_EXTA1 */ - kXBARA1_OutputFlexpwm1Exta2 = 28|0x100U, /**< XBARA1_OUT28 output assigned to FLEXPWM1_EXTA2 */ - kXBARA1_OutputFlexpwm1Exta3 = 29|0x100U, /**< XBARA1_OUT29 output assigned to FLEXPWM1_EXTA3 */ - kXBARA1_OutputFlexpwm1ExtSync0 = 30|0x100U, /**< XBARA1_OUT30 output assigned to FLEXPWM1_EXT_SYNC0 */ - kXBARA1_OutputFlexpwm1ExtSync1 = 31|0x100U, /**< XBARA1_OUT31 output assigned to FLEXPWM1_EXT_SYNC1 */ - kXBARA1_OutputFlexpwm1ExtSync2 = 32|0x100U, /**< XBARA1_OUT32 output assigned to FLEXPWM1_EXT_SYNC2 */ - kXBARA1_OutputFlexpwm1ExtSync3 = 33|0x100U, /**< XBARA1_OUT33 output assigned to FLEXPWM1_EXT_SYNC3 */ - kXBARA1_OutputFlexpwm1ExtClk = 34|0x100U, /**< XBARA1_OUT34 output assigned to FLEXPWM1_EXT_CLK */ - kXBARA1_OutputFlexpwm1Fault0 = 35|0x100U, /**< XBARA1_OUT35 output assigned to FLEXPWM1_FAULT0 */ - kXBARA1_OutputFlexpwm1Fault1 = 36|0x100U, /**< XBARA1_OUT36 output assigned to FLEXPWM1_FAULT1 */ - kXBARA1_OutputFlexpwm1234Fault2 = 37|0x100U, /**< XBARA1_OUT37 output assigned to FLEXPWM1_2_3_4_FAULT2 */ - kXBARA1_OutputFlexpwm1234Fault3 = 38|0x100U, /**< XBARA1_OUT38 output assigned to FLEXPWM1_2_3_4_FAULT3 */ - kXBARA1_OutputFlexpwm1ExtForce = 39|0x100U, /**< XBARA1_OUT39 output assigned to FLEXPWM1_EXT_FORCE */ - kXBARA1_OutputFlexpwm234Exta0 = 40|0x100U, /**< XBARA1_OUT40 output assigned to FLEXPWM2_3_4_EXTA0 */ - kXBARA1_OutputFlexpwm234Exta1 = 41|0x100U, /**< XBARA1_OUT41 output assigned to FLEXPWM2_3_4_EXTA1 */ - kXBARA1_OutputFlexpwm234Exta2 = 42|0x100U, /**< XBARA1_OUT42 output assigned to FLEXPWM2_3_4_EXTA2 */ - kXBARA1_OutputFlexpwm234Exta3 = 43|0x100U, /**< XBARA1_OUT43 output assigned to FLEXPWM2_3_4_EXTA3 */ - kXBARA1_OutputFlexpwm2ExtSync0 = 44|0x100U, /**< XBARA1_OUT44 output assigned to FLEXPWM2_EXT_SYNC0 */ - kXBARA1_OutputFlexpwm2ExtSync1 = 45|0x100U, /**< XBARA1_OUT45 output assigned to FLEXPWM2_EXT_SYNC1 */ - kXBARA1_OutputFlexpwm2ExtSync2 = 46|0x100U, /**< XBARA1_OUT46 output assigned to FLEXPWM2_EXT_SYNC2 */ - kXBARA1_OutputFlexpwm2ExtSync3 = 47|0x100U, /**< XBARA1_OUT47 output assigned to FLEXPWM2_EXT_SYNC3 */ - kXBARA1_OutputFlexpwm234ExtClk = 48|0x100U, /**< XBARA1_OUT48 output assigned to FLEXPWM2_3_4_EXT_CLK */ - kXBARA1_OutputFlexpwm2Fault0 = 49|0x100U, /**< XBARA1_OUT49 output assigned to FLEXPWM2_FAULT0 */ - kXBARA1_OutputFlexpwm2Fault1 = 50|0x100U, /**< XBARA1_OUT50 output assigned to FLEXPWM2_FAULT1 */ - kXBARA1_OutputFlexpwm2ExtForce = 51|0x100U, /**< XBARA1_OUT51 output assigned to FLEXPWM2_EXT_FORCE */ - kXBARA1_OutputFlexpwm3ExtSync0 = 52|0x100U, /**< XBARA1_OUT52 output assigned to FLEXPWM3_EXT_SYNC0 */ - kXBARA1_OutputFlexpwm3ExtSync1 = 53|0x100U, /**< XBARA1_OUT53 output assigned to FLEXPWM3_EXT_SYNC1 */ - kXBARA1_OutputFlexpwm3ExtSync2 = 54|0x100U, /**< XBARA1_OUT54 output assigned to FLEXPWM3_EXT_SYNC2 */ - kXBARA1_OutputFlexpwm3ExtSync3 = 55|0x100U, /**< XBARA1_OUT55 output assigned to FLEXPWM3_EXT_SYNC3 */ - kXBARA1_OutputFlexpwm3Fault0 = 56|0x100U, /**< XBARA1_OUT56 output assigned to FLEXPWM3_FAULT0 */ - kXBARA1_OutputFlexpwm3Fault1 = 57|0x100U, /**< XBARA1_OUT57 output assigned to FLEXPWM3_FAULT1 */ - kXBARA1_OutputFlexpwm3ExtForce = 58|0x100U, /**< XBARA1_OUT58 output assigned to FLEXPWM3_EXT_FORCE */ - kXBARA1_OutputFlexpwm4ExtSync0 = 59|0x100U, /**< XBARA1_OUT59 output assigned to FLEXPWM4_EXT_SYNC0 */ - kXBARA1_OutputFlexpwm4ExtSync1 = 60|0x100U, /**< XBARA1_OUT60 output assigned to FLEXPWM4_EXT_SYNC1 */ - kXBARA1_OutputFlexpwm4ExtSync2 = 61|0x100U, /**< XBARA1_OUT61 output assigned to FLEXPWM4_EXT_SYNC2 */ - kXBARA1_OutputFlexpwm4ExtSync3 = 62|0x100U, /**< XBARA1_OUT62 output assigned to FLEXPWM4_EXT_SYNC3 */ - kXBARA1_OutputFlexpwm4Fault0 = 63|0x100U, /**< XBARA1_OUT63 output assigned to FLEXPWM4_FAULT0 */ - kXBARA1_OutputFlexpwm4Fault1 = 64|0x100U, /**< XBARA1_OUT64 output assigned to FLEXPWM4_FAULT1 */ - kXBARA1_OutputFlexpwm4ExtForce = 65|0x100U, /**< XBARA1_OUT65 output assigned to FLEXPWM4_EXT_FORCE */ - kXBARA1_OutputEnc1PhaseAInput = 66|0x100U, /**< XBARA1_OUT66 output assigned to ENC1_PHASE_A_INPUT */ - kXBARA1_OutputEnc1PhaseBInput = 67|0x100U, /**< XBARA1_OUT67 output assigned to ENC1_PHASE_B_INPUT */ - kXBARA1_OutputEnc1Index = 68|0x100U, /**< XBARA1_OUT68 output assigned to ENC1_INDEX */ - kXBARA1_OutputEnc1Home = 69|0x100U, /**< XBARA1_OUT69 output assigned to ENC1_HOME */ - kXBARA1_OutputEnc1Trigger = 70|0x100U, /**< XBARA1_OUT70 output assigned to ENC1_TRIGGER */ - kXBARA1_OutputEnc2PhaseAInput = 71|0x100U, /**< XBARA1_OUT71 output assigned to ENC2_PHASE_A_INPUT */ - kXBARA1_OutputEnc2PhaseBInput = 72|0x100U, /**< XBARA1_OUT72 output assigned to ENC2_PHASE_B_INPUT */ - kXBARA1_OutputEnc2Index = 73|0x100U, /**< XBARA1_OUT73 output assigned to ENC2_INDEX */ - kXBARA1_OutputEnc2Home = 74|0x100U, /**< XBARA1_OUT74 output assigned to ENC2_HOME */ - kXBARA1_OutputEnc2Trigger = 75|0x100U, /**< XBARA1_OUT75 output assigned to ENC2_TRIGGER */ - kXBARA1_OutputEnc3PhaseAInput = 76|0x100U, /**< XBARA1_OUT76 output assigned to ENC3_PHASE_A_INPUT */ - kXBARA1_OutputEnc3PhaseBInput = 77|0x100U, /**< XBARA1_OUT77 output assigned to ENC3_PHASE_B_INPUT */ - kXBARA1_OutputEnc3Index = 78|0x100U, /**< XBARA1_OUT78 output assigned to ENC3_INDEX */ - kXBARA1_OutputEnc3Home = 79|0x100U, /**< XBARA1_OUT79 output assigned to ENC3_HOME */ - kXBARA1_OutputEnc3Trigger = 80|0x100U, /**< XBARA1_OUT80 output assigned to ENC3_TRIGGER */ - kXBARA1_OutputEnc4PhaseAInput = 81|0x100U, /**< XBARA1_OUT81 output assigned to ENC4_PHASE_A_INPUT */ - kXBARA1_OutputEnc4PhaseBInput = 82|0x100U, /**< XBARA1_OUT82 output assigned to ENC4_PHASE_B_INPUT */ - kXBARA1_OutputEnc4Index = 83|0x100U, /**< XBARA1_OUT83 output assigned to ENC4_INDEX */ - kXBARA1_OutputEnc4Home = 84|0x100U, /**< XBARA1_OUT84 output assigned to ENC4_HOME */ - kXBARA1_OutputEnc4Trigger = 85|0x100U, /**< XBARA1_OUT85 output assigned to ENC4_TRIGGER */ - kXBARA1_OutputQtimer1Tmr0Input = 86|0x100U, /**< XBARA1_OUT86 output assigned to QTIMER1_TMR0_INPUT */ - kXBARA1_OutputQtimer1Tmr1Input = 87|0x100U, /**< XBARA1_OUT87 output assigned to QTIMER1_TMR1_INPUT */ - kXBARA1_OutputQtimer1Tmr2Input = 88|0x100U, /**< XBARA1_OUT88 output assigned to QTIMER1_TMR2_INPUT */ - kXBARA1_OutputQtimer1Tmr3Input = 89|0x100U, /**< XBARA1_OUT89 output assigned to QTIMER1_TMR3_INPUT */ - kXBARA1_OutputQtimer2Tmr0Input = 90|0x100U, /**< XBARA1_OUT90 output assigned to QTIMER2_TMR0_INPUT */ - kXBARA1_OutputQtimer2Tmr1Input = 91|0x100U, /**< XBARA1_OUT91 output assigned to QTIMER2_TMR1_INPUT */ - kXBARA1_OutputQtimer2Tmr2Input = 92|0x100U, /**< XBARA1_OUT92 output assigned to QTIMER2_TMR2_INPUT */ - kXBARA1_OutputQtimer2Tmr3Input = 93|0x100U, /**< XBARA1_OUT93 output assigned to QTIMER2_TMR3_INPUT */ - kXBARA1_OutputQtimer3Tmr0Input = 94|0x100U, /**< XBARA1_OUT94 output assigned to QTIMER3_TMR0_INPUT */ - kXBARA1_OutputQtimer3Tmr1Input = 95|0x100U, /**< XBARA1_OUT95 output assigned to QTIMER3_TMR1_INPUT */ - kXBARA1_OutputQtimer3Tmr2Input = 96|0x100U, /**< XBARA1_OUT96 output assigned to QTIMER3_TMR2_INPUT */ - kXBARA1_OutputQtimer3Tmr3Input = 97|0x100U, /**< XBARA1_OUT97 output assigned to QTIMER3_TMR3_INPUT */ - kXBARA1_OutputQtimer4Tmr0Input = 98|0x100U, /**< XBARA1_OUT98 output assigned to QTIMER4_TMR0_INPUT */ - kXBARA1_OutputQtimer4Tmr1Input = 99|0x100U, /**< XBARA1_OUT99 output assigned to QTIMER4_TMR1_INPUT */ - kXBARA1_OutputQtimer4Tmr2Input = 100|0x100U, /**< XBARA1_OUT100 output assigned to QTIMER4_TMR2_INPUT */ - kXBARA1_OutputQtimer4Tmr3Input = 101|0x100U, /**< XBARA1_OUT101 output assigned to QTIMER4_TMR3_INPUT */ - kXBARA1_OutputEwmEwmIn = 102|0x100U, /**< XBARA1_OUT102 output assigned to EWM_EWM_IN */ - kXBARA1_OutputAdcEtcXbar0Trig0 = 103|0x100U, /**< XBARA1_OUT103 output assigned to ADC_ETC_XBAR0_TRIG0 */ - kXBARA1_OutputAdcEtcXbar0Trig1 = 104|0x100U, /**< XBARA1_OUT104 output assigned to ADC_ETC_XBAR0_TRIG1 */ - kXBARA1_OutputAdcEtcXbar0Trig2 = 105|0x100U, /**< XBARA1_OUT105 output assigned to ADC_ETC_XBAR0_TRIG2 */ - kXBARA1_OutputAdcEtcXbar0Trig3 = 106|0x100U, /**< XBARA1_OUT106 output assigned to ADC_ETC_XBAR0_TRIG3 */ - kXBARA1_OutputAdcEtcXbar1Trig0 = 107|0x100U, /**< XBARA1_OUT107 output assigned to ADC_ETC_XBAR1_TRIG0 */ - kXBARA1_OutputAdcEtcXbar1Trig1 = 108|0x100U, /**< XBARA1_OUT108 output assigned to ADC_ETC_XBAR1_TRIG1 */ - kXBARA1_OutputAdcEtcXbar1Trig2 = 109|0x100U, /**< XBARA1_OUT109 output assigned to ADC_ETC_XBAR1_TRIG2 */ - kXBARA1_OutputAdcEtcXbar1Trig3 = 110|0x100U, /**< XBARA1_OUT110 output assigned to ADC_ETC_XBAR1_TRIG3 */ - kXBARA1_OutputLpi2c1TrgInput = 111|0x100U, /**< XBARA1_OUT111 output assigned to LPI2C1_TRG_INPUT */ - kXBARA1_OutputLpi2c2TrgInput = 112|0x100U, /**< XBARA1_OUT112 output assigned to LPI2C2_TRG_INPUT */ - kXBARA1_OutputLpi2c3TrgInput = 113|0x100U, /**< XBARA1_OUT113 output assigned to LPI2C3_TRG_INPUT */ - kXBARA1_OutputLpi2c4TrgInput = 114|0x100U, /**< XBARA1_OUT114 output assigned to LPI2C4_TRG_INPUT */ - kXBARA1_OutputLpspi1TrgInput = 115|0x100U, /**< XBARA1_OUT115 output assigned to LPSPI1_TRG_INPUT */ - kXBARA1_OutputLpspi2TrgInput = 116|0x100U, /**< XBARA1_OUT116 output assigned to LPSPI2_TRG_INPUT */ - kXBARA1_OutputLpspi3TrgInput = 117|0x100U, /**< XBARA1_OUT117 output assigned to LPSPI3_TRG_INPUT */ - kXBARA1_OutputLpspi4TrgInput = 118|0x100U, /**< XBARA1_OUT118 output assigned to LPSPI4_TRG_INPUT */ - kXBARA1_OutputLpuart1TrgInput = 119|0x100U, /**< XBARA1_OUT119 output assigned to LPUART1_TRG_INPUT */ - kXBARA1_OutputLpuart2TrgInput = 120|0x100U, /**< XBARA1_OUT120 output assigned to LPUART2_TRG_INPUT */ - kXBARA1_OutputLpuart3TrgInput = 121|0x100U, /**< XBARA1_OUT121 output assigned to LPUART3_TRG_INPUT */ - kXBARA1_OutputLpuart4TrgInput = 122|0x100U, /**< XBARA1_OUT122 output assigned to LPUART4_TRG_INPUT */ - kXBARA1_OutputLpuart5TrgInput = 123|0x100U, /**< XBARA1_OUT123 output assigned to LPUART5_TRG_INPUT */ - kXBARA1_OutputLpuart6TrgInput = 124|0x100U, /**< XBARA1_OUT124 output assigned to LPUART6_TRG_INPUT */ - kXBARA1_OutputLpuart7TrgInput = 125|0x100U, /**< XBARA1_OUT125 output assigned to LPUART7_TRG_INPUT */ - kXBARA1_OutputLpuart8TrgInput = 126|0x100U, /**< XBARA1_OUT126 output assigned to LPUART8_TRG_INPUT */ - kXBARA1_OutputFlexio1TriggerIn0 = 127|0x100U, /**< XBARA1_OUT127 output assigned to FLEXIO1_TRIGGER_IN0 */ - kXBARA1_OutputFlexio1TriggerIn1 = 128|0x100U, /**< XBARA1_OUT128 output assigned to FLEXIO1_TRIGGER_IN1 */ - kXBARA1_OutputFlexio2TriggerIn0 = 129|0x100U, /**< XBARA1_OUT129 output assigned to FLEXIO2_TRIGGER_IN0 */ - kXBARA1_OutputFlexio2TriggerIn1 = 130|0x100U, /**< XBARA1_OUT130 output assigned to FLEXIO2_TRIGGER_IN1 */ - kXBARB2_OutputAoi1In00 = 0|0x200U, /**< XBARB2_OUT0 output assigned to AOI1_IN00 */ - kXBARB2_OutputAoi1In01 = 1|0x200U, /**< XBARB2_OUT1 output assigned to AOI1_IN01 */ - kXBARB2_OutputAoi1In02 = 2|0x200U, /**< XBARB2_OUT2 output assigned to AOI1_IN02 */ - kXBARB2_OutputAoi1In03 = 3|0x200U, /**< XBARB2_OUT3 output assigned to AOI1_IN03 */ - kXBARB2_OutputAoi1In04 = 4|0x200U, /**< XBARB2_OUT4 output assigned to AOI1_IN04 */ - kXBARB2_OutputAoi1In05 = 5|0x200U, /**< XBARB2_OUT5 output assigned to AOI1_IN05 */ - kXBARB2_OutputAoi1In06 = 6|0x200U, /**< XBARB2_OUT6 output assigned to AOI1_IN06 */ - kXBARB2_OutputAoi1In07 = 7|0x200U, /**< XBARB2_OUT7 output assigned to AOI1_IN07 */ - kXBARB2_OutputAoi1In08 = 8|0x200U, /**< XBARB2_OUT8 output assigned to AOI1_IN08 */ - kXBARB2_OutputAoi1In09 = 9|0x200U, /**< XBARB2_OUT9 output assigned to AOI1_IN09 */ - kXBARB2_OutputAoi1In10 = 10|0x200U, /**< XBARB2_OUT10 output assigned to AOI1_IN10 */ - kXBARB2_OutputAoi1In11 = 11|0x200U, /**< XBARB2_OUT11 output assigned to AOI1_IN11 */ - kXBARB2_OutputAoi1In12 = 12|0x200U, /**< XBARB2_OUT12 output assigned to AOI1_IN12 */ - kXBARB2_OutputAoi1In13 = 13|0x200U, /**< XBARB2_OUT13 output assigned to AOI1_IN13 */ - kXBARB2_OutputAoi1In14 = 14|0x200U, /**< XBARB2_OUT14 output assigned to AOI1_IN14 */ - kXBARB2_OutputAoi1In15 = 15|0x200U, /**< XBARB2_OUT15 output assigned to AOI1_IN15 */ - kXBARB3_OutputAoi2In00 = 0|0x300U, /**< XBARB3_OUT0 output assigned to AOI2_IN00 */ - kXBARB3_OutputAoi2In01 = 1|0x300U, /**< XBARB3_OUT1 output assigned to AOI2_IN01 */ - kXBARB3_OutputAoi2In02 = 2|0x300U, /**< XBARB3_OUT2 output assigned to AOI2_IN02 */ - kXBARB3_OutputAoi2In03 = 3|0x300U, /**< XBARB3_OUT3 output assigned to AOI2_IN03 */ - kXBARB3_OutputAoi2In04 = 4|0x300U, /**< XBARB3_OUT4 output assigned to AOI2_IN04 */ - kXBARB3_OutputAoi2In05 = 5|0x300U, /**< XBARB3_OUT5 output assigned to AOI2_IN05 */ - kXBARB3_OutputAoi2In06 = 6|0x300U, /**< XBARB3_OUT6 output assigned to AOI2_IN06 */ - kXBARB3_OutputAoi2In07 = 7|0x300U, /**< XBARB3_OUT7 output assigned to AOI2_IN07 */ - kXBARB3_OutputAoi2In08 = 8|0x300U, /**< XBARB3_OUT8 output assigned to AOI2_IN08 */ - kXBARB3_OutputAoi2In09 = 9|0x300U, /**< XBARB3_OUT9 output assigned to AOI2_IN09 */ - kXBARB3_OutputAoi2In10 = 10|0x300U, /**< XBARB3_OUT10 output assigned to AOI2_IN10 */ - kXBARB3_OutputAoi2In11 = 11|0x300U, /**< XBARB3_OUT11 output assigned to AOI2_IN11 */ - kXBARB3_OutputAoi2In12 = 12|0x300U, /**< XBARB3_OUT12 output assigned to AOI2_IN12 */ - kXBARB3_OutputAoi2In13 = 13|0x300U, /**< XBARB3_OUT13 output assigned to AOI2_IN13 */ - kXBARB3_OutputAoi2In14 = 14|0x300U, /**< XBARB3_OUT14 output assigned to AOI2_IN14 */ - kXBARB3_OutputAoi2In15 = 15|0x300U, /**< XBARB3_OUT15 output assigned to AOI2_IN15 */ -} xbar_output_signal_t; - - -/*! - * @} - */ /* end of group Mapping_Information */ - - -/* ---------------------------------------------------------------------------- - -- Device Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup Peripheral_access_layer Device Peripheral Access Layer - * @{ - */ - - -/* -** Start of section using anonymous unions -*/ - -#if defined(__ARMCC_VERSION) - #if (__ARMCC_VERSION >= 6010050) - #pragma clang diagnostic push - #else - #pragma push - #pragma anon_unions - #endif -#elif defined(__CWCC__) - #pragma push - #pragma cpp_extensions on -#elif defined(__GNUC__) - /* anonymous unions are enabled by default */ -#elif defined(__IAR_SYSTEMS_ICC__) - #pragma language=extended -#else - #error Not supported compiler type -#endif - -/* ---------------------------------------------------------------------------- - -- ADC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer - * @{ - */ - -/** ADC - Register Layout Typedef */ -typedef struct { - __IO uint32_t HC[8]; /**< Control register for hardware triggers, array offset: 0x0, array step: 0x4 */ - __I uint32_t HS; /**< Status register for HW triggers, offset: 0x20 */ - __I uint32_t R[8]; /**< Data result register for HW triggers, array offset: 0x24, array step: 0x4 */ - __IO uint32_t CFG; /**< Configuration register, offset: 0x44 */ - __IO uint32_t GC; /**< General control register, offset: 0x48 */ - __IO uint32_t GS; /**< General status register, offset: 0x4C */ - __IO uint32_t CV; /**< Compare value register, offset: 0x50 */ - __IO uint32_t OFS; /**< Offset correction value register, offset: 0x54 */ - __IO uint32_t CAL; /**< Calibration value register, offset: 0x58 */ -} ADC_Type; - -/* ---------------------------------------------------------------------------- - -- ADC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ADC_Register_Masks ADC Register Masks - * @{ - */ - -/*! @name HC - Control register for hardware triggers */ -/*! @{ */ - -#define ADC_HC_ADCH_MASK (0x1FU) -#define ADC_HC_ADCH_SHIFT (0U) -/*! ADCH - Input Channel Select - * 0b10000..External channel selection from ADC_ETC - * 0b11000..Reserved. - * 0b11001..VREFSH = internal channel, for ADC self-test, hard connected to VRH internally - * 0b11010..Reserved. - * 0b11011..Reserved. - * 0b11111..Conversion Disabled. Hardware Triggers will not initiate any conversion. - */ -#define ADC_HC_ADCH(x) (((uint32_t)(((uint32_t)(x)) << ADC_HC_ADCH_SHIFT)) & ADC_HC_ADCH_MASK) - -#define ADC_HC_AIEN_MASK (0x80U) -#define ADC_HC_AIEN_SHIFT (7U) -/*! AIEN - Conversion Complete Interrupt Enable/Disable Control - * 0b1..Conversion complete interrupt enabled - * 0b0..Conversion complete interrupt disabled - */ -#define ADC_HC_AIEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_HC_AIEN_SHIFT)) & ADC_HC_AIEN_MASK) -/*! @} */ - -/* The count of ADC_HC */ -#define ADC_HC_COUNT (8U) - -/*! @name HS - Status register for HW triggers */ -/*! @{ */ - -#define ADC_HS_COCO0_MASK (0x1U) -#define ADC_HS_COCO0_SHIFT (0U) -/*! COCO0 - Conversion Complete Flag - */ -#define ADC_HS_COCO0(x) (((uint32_t)(((uint32_t)(x)) << ADC_HS_COCO0_SHIFT)) & ADC_HS_COCO0_MASK) -/*! @} */ - -/*! @name R - Data result register for HW triggers */ -/*! @{ */ - -#define ADC_R_CDATA_MASK (0xFFFU) -#define ADC_R_CDATA_SHIFT (0U) -/*! CDATA - Data (result of an ADC conversion) - */ -#define ADC_R_CDATA(x) (((uint32_t)(((uint32_t)(x)) << ADC_R_CDATA_SHIFT)) & ADC_R_CDATA_MASK) -/*! @} */ - -/* The count of ADC_R */ -#define ADC_R_COUNT (8U) - -/*! @name CFG - Configuration register */ -/*! @{ */ - -#define ADC_CFG_ADICLK_MASK (0x3U) -#define ADC_CFG_ADICLK_SHIFT (0U) -/*! ADICLK - Input Clock Select - * 0b00..IPG clock - * 0b01..IPG clock divided by 2 - * 0b10..Reserved - * 0b11..Asynchronous clock (ADACK) - */ -#define ADC_CFG_ADICLK(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADICLK_SHIFT)) & ADC_CFG_ADICLK_MASK) - -#define ADC_CFG_MODE_MASK (0xCU) -#define ADC_CFG_MODE_SHIFT (2U) -/*! MODE - Conversion Mode Selection - * 0b00..8-bit conversion - * 0b01..10-bit conversion - * 0b10..12-bit conversion - * 0b11..Reserved - */ -#define ADC_CFG_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_MODE_SHIFT)) & ADC_CFG_MODE_MASK) - -#define ADC_CFG_ADLSMP_MASK (0x10U) -#define ADC_CFG_ADLSMP_SHIFT (4U) -/*! ADLSMP - Long Sample Time Configuration - * 0b0..Short sample mode. - * 0b1..Long sample mode. - */ -#define ADC_CFG_ADLSMP(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADLSMP_SHIFT)) & ADC_CFG_ADLSMP_MASK) - -#define ADC_CFG_ADIV_MASK (0x60U) -#define ADC_CFG_ADIV_SHIFT (5U) -/*! ADIV - Clock Divide Select - * 0b00..Input clock - * 0b01..Input clock / 2 - * 0b10..Input clock / 4 - * 0b11..Input clock / 8 - */ -#define ADC_CFG_ADIV(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADIV_SHIFT)) & ADC_CFG_ADIV_MASK) - -#define ADC_CFG_ADLPC_MASK (0x80U) -#define ADC_CFG_ADLPC_SHIFT (7U) -/*! ADLPC - Low-Power Configuration - * 0b0..ADC hard block not in low power mode. - * 0b1..ADC hard block in low power mode. - */ -#define ADC_CFG_ADLPC(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADLPC_SHIFT)) & ADC_CFG_ADLPC_MASK) - -#define ADC_CFG_ADSTS_MASK (0x300U) -#define ADC_CFG_ADSTS_SHIFT (8U) -/*! ADSTS - * 0b00..Sample period (ADC clocks) = 2 if ADLSMP=0b Sample period (ADC clocks) = 12 if ADLSMP=1b - * 0b01..Sample period (ADC clocks) = 4 if ADLSMP=0b Sample period (ADC clocks) = 16 if ADLSMP=1b - * 0b10..Sample period (ADC clocks) = 6 if ADLSMP=0b Sample period (ADC clocks) = 20 if ADLSMP=1b - * 0b11..Sample period (ADC clocks) = 8 if ADLSMP=0b Sample period (ADC clocks) = 24 if ADLSMP=1b - */ -#define ADC_CFG_ADSTS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADSTS_SHIFT)) & ADC_CFG_ADSTS_MASK) - -#define ADC_CFG_ADHSC_MASK (0x400U) -#define ADC_CFG_ADHSC_SHIFT (10U) -/*! ADHSC - High Speed Configuration - * 0b0..Normal conversion selected. - * 0b1..High speed conversion selected. - */ -#define ADC_CFG_ADHSC(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADHSC_SHIFT)) & ADC_CFG_ADHSC_MASK) - -#define ADC_CFG_REFSEL_MASK (0x1800U) -#define ADC_CFG_REFSEL_SHIFT (11U) -/*! REFSEL - Voltage Reference Selection - * 0b00..Selects VREFH/VREFL as reference voltage. - * 0b01..Reserved - * 0b10..Reserved - * 0b11..Reserved - */ -#define ADC_CFG_REFSEL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_REFSEL_SHIFT)) & ADC_CFG_REFSEL_MASK) - -#define ADC_CFG_ADTRG_MASK (0x2000U) -#define ADC_CFG_ADTRG_SHIFT (13U) -/*! ADTRG - Conversion Trigger Select - * 0b0..Software trigger selected - * 0b1..Hardware trigger selected - */ -#define ADC_CFG_ADTRG(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_ADTRG_SHIFT)) & ADC_CFG_ADTRG_MASK) - -#define ADC_CFG_AVGS_MASK (0xC000U) -#define ADC_CFG_AVGS_SHIFT (14U) -/*! AVGS - Hardware Average select - * 0b00..4 samples averaged - * 0b01..8 samples averaged - * 0b10..16 samples averaged - * 0b11..32 samples averaged - */ -#define ADC_CFG_AVGS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_AVGS_SHIFT)) & ADC_CFG_AVGS_MASK) - -#define ADC_CFG_OVWREN_MASK (0x10000U) -#define ADC_CFG_OVWREN_SHIFT (16U) -/*! OVWREN - Data Overwrite Enable - * 0b1..Enable the overwriting. - * 0b0..Disable the overwriting. Existing Data in Data result register will not be overwritten by subsequent converted data. - */ -#define ADC_CFG_OVWREN(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_OVWREN_SHIFT)) & ADC_CFG_OVWREN_MASK) -/*! @} */ - -/*! @name GC - General control register */ -/*! @{ */ - -#define ADC_GC_ADACKEN_MASK (0x1U) -#define ADC_GC_ADACKEN_SHIFT (0U) -/*! ADACKEN - Asynchronous clock output enable - * 0b0..Asynchronous clock output disabled; Asynchronous clock only enabled if selected by ADICLK and a conversion is active. - * 0b1..Asynchronous clock and clock output enabled regardless of the state of the ADC - */ -#define ADC_GC_ADACKEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_ADACKEN_SHIFT)) & ADC_GC_ADACKEN_MASK) - -#define ADC_GC_DMAEN_MASK (0x2U) -#define ADC_GC_DMAEN_SHIFT (1U) -/*! DMAEN - DMA Enable - * 0b0..DMA disabled (default) - * 0b1..DMA enabled - */ -#define ADC_GC_DMAEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_DMAEN_SHIFT)) & ADC_GC_DMAEN_MASK) - -#define ADC_GC_ACREN_MASK (0x4U) -#define ADC_GC_ACREN_SHIFT (2U) -/*! ACREN - Compare Function Range Enable - * 0b0..Range function disabled. Only the compare value 1 of ADC_CV register (CV1) is compared. - * 0b1..Range function enabled. Both compare values of ADC_CV registers (CV1 and CV2) are compared. - */ -#define ADC_GC_ACREN(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_ACREN_SHIFT)) & ADC_GC_ACREN_MASK) - -#define ADC_GC_ACFGT_MASK (0x8U) -#define ADC_GC_ACFGT_SHIFT (3U) -/*! ACFGT - Compare Function Greater Than Enable - * 0b0..Configures "Less Than Threshold, Outside Range Not Inclusive and Inside Range Not Inclusive" - * functionality based on the values placed in the ADC_CV register. - * 0b1..Configures "Greater Than Or Equal To Threshold, Outside Range Inclusive and Inside Range Inclusive" - * functionality based on the values placed in the ADC_CV registers. - */ -#define ADC_GC_ACFGT(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_ACFGT_SHIFT)) & ADC_GC_ACFGT_MASK) - -#define ADC_GC_ACFE_MASK (0x10U) -#define ADC_GC_ACFE_SHIFT (4U) -/*! ACFE - Compare Function Enable - * 0b0..Compare function disabled - * 0b1..Compare function enabled - */ -#define ADC_GC_ACFE(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_ACFE_SHIFT)) & ADC_GC_ACFE_MASK) - -#define ADC_GC_AVGE_MASK (0x20U) -#define ADC_GC_AVGE_SHIFT (5U) -/*! AVGE - Hardware average enable - * 0b0..Hardware average function disabled - * 0b1..Hardware average function enabled - */ -#define ADC_GC_AVGE(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_AVGE_SHIFT)) & ADC_GC_AVGE_MASK) - -#define ADC_GC_ADCO_MASK (0x40U) -#define ADC_GC_ADCO_SHIFT (6U) -/*! ADCO - Continuous Conversion Enable - * 0b0..One conversion or one set of conversions if the hardware average function is enabled (AVGE=1) after initiating a conversion. - * 0b1..Continuous conversions or sets of conversions if the hardware average function is enabled (AVGE=1) after initiating a conversion. - */ -#define ADC_GC_ADCO(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_ADCO_SHIFT)) & ADC_GC_ADCO_MASK) - -#define ADC_GC_CAL_MASK (0x80U) -#define ADC_GC_CAL_SHIFT (7U) -/*! CAL - Calibration - */ -#define ADC_GC_CAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_GC_CAL_SHIFT)) & ADC_GC_CAL_MASK) -/*! @} */ - -/*! @name GS - General status register */ -/*! @{ */ - -#define ADC_GS_ADACT_MASK (0x1U) -#define ADC_GS_ADACT_SHIFT (0U) -/*! ADACT - Conversion Active - * 0b0..Conversion not in progress. - * 0b1..Conversion in progress. - */ -#define ADC_GS_ADACT(x) (((uint32_t)(((uint32_t)(x)) << ADC_GS_ADACT_SHIFT)) & ADC_GS_ADACT_MASK) - -#define ADC_GS_CALF_MASK (0x2U) -#define ADC_GS_CALF_SHIFT (1U) -/*! CALF - Calibration Failed Flag - * 0b0..Calibration completed normally. - * 0b1..Calibration failed. ADC accuracy specifications are not guaranteed. - */ -#define ADC_GS_CALF(x) (((uint32_t)(((uint32_t)(x)) << ADC_GS_CALF_SHIFT)) & ADC_GS_CALF_MASK) - -#define ADC_GS_AWKST_MASK (0x4U) -#define ADC_GS_AWKST_SHIFT (2U) -/*! AWKST - Asynchronous wakeup interrupt status - * 0b1..Asynchronous wake up interrupt occurred in stop mode. - * 0b0..No asynchronous interrupt. - */ -#define ADC_GS_AWKST(x) (((uint32_t)(((uint32_t)(x)) << ADC_GS_AWKST_SHIFT)) & ADC_GS_AWKST_MASK) -/*! @} */ - -/*! @name CV - Compare value register */ -/*! @{ */ - -#define ADC_CV_CV1_MASK (0xFFFU) -#define ADC_CV_CV1_SHIFT (0U) -/*! CV1 - Compare Value 1 - */ -#define ADC_CV_CV1(x) (((uint32_t)(((uint32_t)(x)) << ADC_CV_CV1_SHIFT)) & ADC_CV_CV1_MASK) - -#define ADC_CV_CV2_MASK (0xFFF0000U) -#define ADC_CV_CV2_SHIFT (16U) -/*! CV2 - Compare Value 2 - */ -#define ADC_CV_CV2(x) (((uint32_t)(((uint32_t)(x)) << ADC_CV_CV2_SHIFT)) & ADC_CV_CV2_MASK) -/*! @} */ - -/*! @name OFS - Offset correction value register */ -/*! @{ */ - -#define ADC_OFS_OFS_MASK (0xFFFU) -#define ADC_OFS_OFS_SHIFT (0U) -/*! OFS - Offset value - */ -#define ADC_OFS_OFS(x) (((uint32_t)(((uint32_t)(x)) << ADC_OFS_OFS_SHIFT)) & ADC_OFS_OFS_MASK) - -#define ADC_OFS_SIGN_MASK (0x1000U) -#define ADC_OFS_SIGN_SHIFT (12U) -/*! SIGN - Sign bit - * 0b0..The offset value is added with the raw result - * 0b1..The offset value is subtracted from the raw converted value - */ -#define ADC_OFS_SIGN(x) (((uint32_t)(((uint32_t)(x)) << ADC_OFS_SIGN_SHIFT)) & ADC_OFS_SIGN_MASK) -/*! @} */ - -/*! @name CAL - Calibration value register */ -/*! @{ */ - -#define ADC_CAL_CAL_CODE_MASK (0xFU) -#define ADC_CAL_CAL_CODE_SHIFT (0U) -/*! CAL_CODE - Calibration Result Value - */ -#define ADC_CAL_CAL_CODE(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_CAL_CODE_SHIFT)) & ADC_CAL_CAL_CODE_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group ADC_Register_Masks */ - - -/* ADC - Peripheral instance base addresses */ -/** Peripheral ADC1 base address */ -#define ADC1_BASE (0x400C4000u) -/** Peripheral ADC1 base pointer */ -#define ADC1 ((ADC_Type *)ADC1_BASE) -/** Peripheral ADC2 base address */ -#define ADC2_BASE (0x400C8000u) -/** Peripheral ADC2 base pointer */ -#define ADC2 ((ADC_Type *)ADC2_BASE) -/** Array initializer of ADC peripheral base addresses */ -#define ADC_BASE_ADDRS { 0u, ADC1_BASE, ADC2_BASE } -/** Array initializer of ADC peripheral base pointers */ -#define ADC_BASE_PTRS { (ADC_Type *)0u, ADC1, ADC2 } -/** Interrupt vectors for the ADC peripheral type */ -#define ADC_IRQS { NotAvail_IRQn, ADC1_IRQn, ADC2_IRQn } - -/*! - * @} - */ /* end of group ADC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- ADC_ETC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ADC_ETC_Peripheral_Access_Layer ADC_ETC Peripheral Access Layer - * @{ - */ - -/** ADC_ETC - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< ADC_ETC Global Control Register, offset: 0x0 */ - __IO uint32_t DONE0_1_IRQ; /**< ETC DONE0 and DONE1 IRQ State Register, offset: 0x4 */ - __IO uint32_t DONE2_ERR_IRQ; /**< ETC DONE_2 and DONE_ERR IRQ State Register, offset: 0x8 */ - __IO uint32_t DMA_CTRL; /**< ETC DMA control Register, offset: 0xC */ - struct { /* offset: 0x10, array step: 0x28 */ - __IO uint32_t TRIGn_CTRL; /**< ETC_TRIG0 Control Register..ETC_TRIG7 Control Register, array offset: 0x10, array step: 0x28 */ - __IO uint32_t TRIGn_COUNTER; /**< ETC_TRIG0 Counter Register..ETC_TRIG7 Counter Register, array offset: 0x14, array step: 0x28 */ - __IO uint32_t TRIGn_CHAIN_1_0; /**< ETC_TRIG Chain 0/1 Register, array offset: 0x18, array step: 0x28 */ - __IO uint32_t TRIGn_CHAIN_3_2; /**< ETC_TRIG Chain 2/3 Register, array offset: 0x1C, array step: 0x28 */ - __IO uint32_t TRIGn_CHAIN_5_4; /**< ETC_TRIG Chain 4/5 Register, array offset: 0x20, array step: 0x28 */ - __IO uint32_t TRIGn_CHAIN_7_6; /**< ETC_TRIG Chain 6/7 Register, array offset: 0x24, array step: 0x28 */ - __I uint32_t TRIGn_RESULT_1_0; /**< ETC_TRIG Result Data 1/0 Register, array offset: 0x28, array step: 0x28 */ - __I uint32_t TRIGn_RESULT_3_2; /**< ETC_TRIG Result Data 3/2 Register, array offset: 0x2C, array step: 0x28 */ - __I uint32_t TRIGn_RESULT_5_4; /**< ETC_TRIG Result Data 5/4 Register, array offset: 0x30, array step: 0x28 */ - __I uint32_t TRIGn_RESULT_7_6; /**< ETC_TRIG Result Data 7/6 Register, array offset: 0x34, array step: 0x28 */ - } TRIG[8]; -} ADC_ETC_Type; - -/* ---------------------------------------------------------------------------- - -- ADC_ETC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ADC_ETC_Register_Masks ADC_ETC Register Masks - * @{ - */ - -/*! @name CTRL - ADC_ETC Global Control Register */ -/*! @{ */ - -#define ADC_ETC_CTRL_TRIG_ENABLE_MASK (0xFFU) -#define ADC_ETC_CTRL_TRIG_ENABLE_SHIFT (0U) -#define ADC_ETC_CTRL_TRIG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_TRIG_ENABLE_SHIFT)) & ADC_ETC_CTRL_TRIG_ENABLE_MASK) - -#define ADC_ETC_CTRL_EXT0_TRIG_ENABLE_MASK (0x100U) -#define ADC_ETC_CTRL_EXT0_TRIG_ENABLE_SHIFT (8U) -#define ADC_ETC_CTRL_EXT0_TRIG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_EXT0_TRIG_ENABLE_SHIFT)) & ADC_ETC_CTRL_EXT0_TRIG_ENABLE_MASK) - -#define ADC_ETC_CTRL_EXT0_TRIG_PRIORITY_MASK (0xE00U) -#define ADC_ETC_CTRL_EXT0_TRIG_PRIORITY_SHIFT (9U) -#define ADC_ETC_CTRL_EXT0_TRIG_PRIORITY(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_EXT0_TRIG_PRIORITY_SHIFT)) & ADC_ETC_CTRL_EXT0_TRIG_PRIORITY_MASK) - -#define ADC_ETC_CTRL_EXT1_TRIG_ENABLE_MASK (0x1000U) -#define ADC_ETC_CTRL_EXT1_TRIG_ENABLE_SHIFT (12U) -#define ADC_ETC_CTRL_EXT1_TRIG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_EXT1_TRIG_ENABLE_SHIFT)) & ADC_ETC_CTRL_EXT1_TRIG_ENABLE_MASK) - -#define ADC_ETC_CTRL_EXT1_TRIG_PRIORITY_MASK (0xE000U) -#define ADC_ETC_CTRL_EXT1_TRIG_PRIORITY_SHIFT (13U) -#define ADC_ETC_CTRL_EXT1_TRIG_PRIORITY(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_EXT1_TRIG_PRIORITY_SHIFT)) & ADC_ETC_CTRL_EXT1_TRIG_PRIORITY_MASK) - -#define ADC_ETC_CTRL_PRE_DIVIDER_MASK (0xFF0000U) -#define ADC_ETC_CTRL_PRE_DIVIDER_SHIFT (16U) -#define ADC_ETC_CTRL_PRE_DIVIDER(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_PRE_DIVIDER_SHIFT)) & ADC_ETC_CTRL_PRE_DIVIDER_MASK) - -#define ADC_ETC_CTRL_DMA_MODE_SEL_MASK (0x20000000U) -#define ADC_ETC_CTRL_DMA_MODE_SEL_SHIFT (29U) -#define ADC_ETC_CTRL_DMA_MODE_SEL(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_DMA_MODE_SEL_SHIFT)) & ADC_ETC_CTRL_DMA_MODE_SEL_MASK) - -#define ADC_ETC_CTRL_TSC_BYPASS_MASK (0x40000000U) -#define ADC_ETC_CTRL_TSC_BYPASS_SHIFT (30U) -#define ADC_ETC_CTRL_TSC_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_TSC_BYPASS_SHIFT)) & ADC_ETC_CTRL_TSC_BYPASS_MASK) - -#define ADC_ETC_CTRL_SOFTRST_MASK (0x80000000U) -#define ADC_ETC_CTRL_SOFTRST_SHIFT (31U) -#define ADC_ETC_CTRL_SOFTRST(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_CTRL_SOFTRST_SHIFT)) & ADC_ETC_CTRL_SOFTRST_MASK) -/*! @} */ - -/*! @name DONE0_1_IRQ - ETC DONE0 and DONE1 IRQ State Register */ -/*! @{ */ - -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK (0x1U) -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_SHIFT (0U) -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE0_MASK (0x2U) -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE0_SHIFT (1U) -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG1_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG1_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE0_MASK (0x4U) -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE0_SHIFT (2U) -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG2_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG2_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE0_MASK (0x8U) -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE0_SHIFT (3U) -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG3_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG3_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE0_MASK (0x10U) -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE0_SHIFT (4U) -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG4_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG4_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE0_MASK (0x20U) -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE0_SHIFT (5U) -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG5_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG5_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE0_MASK (0x40U) -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE0_SHIFT (6U) -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG6_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG6_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE0_MASK (0x80U) -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE0_SHIFT (7U) -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG7_DONE0_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG7_DONE0_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK (0x10000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_SHIFT (16U) -#define ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE1_MASK (0x20000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE1_SHIFT (17U) -#define ADC_ETC_DONE0_1_IRQ_TRIG1_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG1_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG1_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE1_MASK (0x40000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE1_SHIFT (18U) -#define ADC_ETC_DONE0_1_IRQ_TRIG2_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG2_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG2_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE1_MASK (0x80000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE1_SHIFT (19U) -#define ADC_ETC_DONE0_1_IRQ_TRIG3_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG3_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG3_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE1_MASK (0x100000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE1_SHIFT (20U) -#define ADC_ETC_DONE0_1_IRQ_TRIG4_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG4_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG4_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE1_MASK (0x200000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE1_SHIFT (21U) -#define ADC_ETC_DONE0_1_IRQ_TRIG5_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG5_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG5_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE1_MASK (0x400000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE1_SHIFT (22U) -#define ADC_ETC_DONE0_1_IRQ_TRIG6_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG6_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG6_DONE1_MASK) - -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE1_MASK (0x800000U) -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE1_SHIFT (23U) -#define ADC_ETC_DONE0_1_IRQ_TRIG7_DONE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE0_1_IRQ_TRIG7_DONE1_SHIFT)) & ADC_ETC_DONE0_1_IRQ_TRIG7_DONE1_MASK) -/*! @} */ - -/*! @name DONE2_ERR_IRQ - ETC DONE_2 and DONE_ERR IRQ State Register */ -/*! @{ */ - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK (0x1U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_SHIFT (0U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_DONE2_MASK (0x2U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_DONE2_SHIFT (1U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG1_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG1_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_DONE2_MASK (0x4U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_DONE2_SHIFT (2U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG2_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG2_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_DONE2_MASK (0x8U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_DONE2_SHIFT (3U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG3_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG3_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_DONE2_MASK (0x10U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_DONE2_SHIFT (4U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG4_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG4_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_DONE2_MASK (0x20U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_DONE2_SHIFT (5U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG5_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG5_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_DONE2_MASK (0x40U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_DONE2_SHIFT (6U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG6_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG6_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_DONE2_MASK (0x80U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_DONE2_SHIFT (7U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_DONE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG7_DONE2_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG7_DONE2_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK (0x10000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_SHIFT (16U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_ERR_MASK (0x20000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_ERR_SHIFT (17U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG1_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG1_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG1_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_ERR_MASK (0x40000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_ERR_SHIFT (18U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG2_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG2_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG2_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_ERR_MASK (0x80000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_ERR_SHIFT (19U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG3_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG3_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG3_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_ERR_MASK (0x100000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_ERR_SHIFT (20U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG4_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG4_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG4_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_ERR_MASK (0x200000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_ERR_SHIFT (21U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG5_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG5_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG5_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_ERR_MASK (0x400000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_ERR_SHIFT (22U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG6_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG6_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG6_ERR_MASK) - -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_ERR_MASK (0x800000U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_ERR_SHIFT (23U) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG7_ERR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DONE2_ERR_IRQ_TRIG7_ERR_SHIFT)) & ADC_ETC_DONE2_ERR_IRQ_TRIG7_ERR_MASK) -/*! @} */ - -/*! @name DMA_CTRL - ETC DMA control Register */ -/*! @{ */ - -#define ADC_ETC_DMA_CTRL_TRIG0_ENABLE_MASK (0x1U) -#define ADC_ETC_DMA_CTRL_TRIG0_ENABLE_SHIFT (0U) -#define ADC_ETC_DMA_CTRL_TRIG0_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG0_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG0_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG1_ENABLE_MASK (0x2U) -#define ADC_ETC_DMA_CTRL_TRIG1_ENABLE_SHIFT (1U) -#define ADC_ETC_DMA_CTRL_TRIG1_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG1_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG1_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG2_ENABLE_MASK (0x4U) -#define ADC_ETC_DMA_CTRL_TRIG2_ENABLE_SHIFT (2U) -#define ADC_ETC_DMA_CTRL_TRIG2_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG2_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG2_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG3_ENABLE_MASK (0x8U) -#define ADC_ETC_DMA_CTRL_TRIG3_ENABLE_SHIFT (3U) -#define ADC_ETC_DMA_CTRL_TRIG3_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG3_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG3_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG4_ENABLE_MASK (0x10U) -#define ADC_ETC_DMA_CTRL_TRIG4_ENABLE_SHIFT (4U) -#define ADC_ETC_DMA_CTRL_TRIG4_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG4_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG4_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG5_ENABLE_MASK (0x20U) -#define ADC_ETC_DMA_CTRL_TRIG5_ENABLE_SHIFT (5U) -#define ADC_ETC_DMA_CTRL_TRIG5_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG5_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG5_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG6_ENABLE_MASK (0x40U) -#define ADC_ETC_DMA_CTRL_TRIG6_ENABLE_SHIFT (6U) -#define ADC_ETC_DMA_CTRL_TRIG6_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG6_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG6_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG7_ENABLE_MASK (0x80U) -#define ADC_ETC_DMA_CTRL_TRIG7_ENABLE_SHIFT (7U) -#define ADC_ETC_DMA_CTRL_TRIG7_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG7_ENABLE_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG7_ENABLE_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG0_REQ_MASK (0x10000U) -#define ADC_ETC_DMA_CTRL_TRIG0_REQ_SHIFT (16U) -#define ADC_ETC_DMA_CTRL_TRIG0_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG0_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG0_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG1_REQ_MASK (0x20000U) -#define ADC_ETC_DMA_CTRL_TRIG1_REQ_SHIFT (17U) -#define ADC_ETC_DMA_CTRL_TRIG1_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG1_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG1_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG2_REQ_MASK (0x40000U) -#define ADC_ETC_DMA_CTRL_TRIG2_REQ_SHIFT (18U) -#define ADC_ETC_DMA_CTRL_TRIG2_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG2_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG2_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG3_REQ_MASK (0x80000U) -#define ADC_ETC_DMA_CTRL_TRIG3_REQ_SHIFT (19U) -#define ADC_ETC_DMA_CTRL_TRIG3_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG3_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG3_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG4_REQ_MASK (0x100000U) -#define ADC_ETC_DMA_CTRL_TRIG4_REQ_SHIFT (20U) -#define ADC_ETC_DMA_CTRL_TRIG4_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG4_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG4_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG5_REQ_MASK (0x200000U) -#define ADC_ETC_DMA_CTRL_TRIG5_REQ_SHIFT (21U) -#define ADC_ETC_DMA_CTRL_TRIG5_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG5_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG5_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG6_REQ_MASK (0x400000U) -#define ADC_ETC_DMA_CTRL_TRIG6_REQ_SHIFT (22U) -#define ADC_ETC_DMA_CTRL_TRIG6_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG6_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG6_REQ_MASK) - -#define ADC_ETC_DMA_CTRL_TRIG7_REQ_MASK (0x800000U) -#define ADC_ETC_DMA_CTRL_TRIG7_REQ_SHIFT (23U) -#define ADC_ETC_DMA_CTRL_TRIG7_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_DMA_CTRL_TRIG7_REQ_SHIFT)) & ADC_ETC_DMA_CTRL_TRIG7_REQ_MASK) -/*! @} */ - -/*! @name TRIGn_CTRL - ETC_TRIG0 Control Register..ETC_TRIG7 Control Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_CTRL_SW_TRIG_MASK (0x1U) -#define ADC_ETC_TRIGn_CTRL_SW_TRIG_SHIFT (0U) -#define ADC_ETC_TRIGn_CTRL_SW_TRIG(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CTRL_SW_TRIG_SHIFT)) & ADC_ETC_TRIGn_CTRL_SW_TRIG_MASK) - -#define ADC_ETC_TRIGn_CTRL_TRIG_MODE_MASK (0x10U) -#define ADC_ETC_TRIGn_CTRL_TRIG_MODE_SHIFT (4U) -#define ADC_ETC_TRIGn_CTRL_TRIG_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CTRL_TRIG_MODE_SHIFT)) & ADC_ETC_TRIGn_CTRL_TRIG_MODE_MASK) - -#define ADC_ETC_TRIGn_CTRL_TRIG_CHAIN_MASK (0x700U) -#define ADC_ETC_TRIGn_CTRL_TRIG_CHAIN_SHIFT (8U) -#define ADC_ETC_TRIGn_CTRL_TRIG_CHAIN(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CTRL_TRIG_CHAIN_SHIFT)) & ADC_ETC_TRIGn_CTRL_TRIG_CHAIN_MASK) - -#define ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY_MASK (0x7000U) -#define ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY_SHIFT (12U) -#define ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY_SHIFT)) & ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY_MASK) - -#define ADC_ETC_TRIGn_CTRL_SYNC_MODE_MASK (0x10000U) -#define ADC_ETC_TRIGn_CTRL_SYNC_MODE_SHIFT (16U) -#define ADC_ETC_TRIGn_CTRL_SYNC_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CTRL_SYNC_MODE_SHIFT)) & ADC_ETC_TRIGn_CTRL_SYNC_MODE_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_CTRL */ -#define ADC_ETC_TRIGn_CTRL_COUNT (8U) - -/*! @name TRIGn_COUNTER - ETC_TRIG0 Counter Register..ETC_TRIG7 Counter Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_COUNTER_INIT_DELAY_MASK (0xFFFFU) -#define ADC_ETC_TRIGn_COUNTER_INIT_DELAY_SHIFT (0U) -#define ADC_ETC_TRIGn_COUNTER_INIT_DELAY(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_COUNTER_INIT_DELAY_SHIFT)) & ADC_ETC_TRIGn_COUNTER_INIT_DELAY_MASK) - -#define ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL_MASK (0xFFFF0000U) -#define ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL_SHIFT (16U) -#define ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL_SHIFT)) & ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_COUNTER */ -#define ADC_ETC_TRIGn_COUNTER_COUNT (8U) - -/*! @name TRIGn_CHAIN_1_0 - ETC_TRIG Chain 0/1 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_MASK (0xFU) -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_SHIFT (0U) -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_MASK (0xFF0U) -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_SHIFT (4U) -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK (0x1000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B0_SHIFT (12U) -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_B2B0_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_IE0_MASK (0x6000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_IE0_SHIFT (13U) -#define ADC_ETC_TRIGn_CHAIN_1_0_IE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_IE0_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_IE0_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_MASK (0xF0000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_SHIFT (16U) -#define ADC_ETC_TRIGn_CHAIN_1_0_CSEL1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_MASK (0xFF00000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_SHIFT (20U) -#define ADC_ETC_TRIGn_CHAIN_1_0_HWTS1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B1_MASK (0x10000000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B1_SHIFT (28U) -#define ADC_ETC_TRIGn_CHAIN_1_0_B2B1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_B2B1_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_B2B1_MASK) - -#define ADC_ETC_TRIGn_CHAIN_1_0_IE1_MASK (0x60000000U) -#define ADC_ETC_TRIGn_CHAIN_1_0_IE1_SHIFT (29U) -#define ADC_ETC_TRIGn_CHAIN_1_0_IE1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_1_0_IE1_SHIFT)) & ADC_ETC_TRIGn_CHAIN_1_0_IE1_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_CHAIN_1_0 */ -#define ADC_ETC_TRIGn_CHAIN_1_0_COUNT (8U) - -/*! @name TRIGn_CHAIN_3_2 - ETC_TRIG Chain 2/3 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_MASK (0xFU) -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_SHIFT (0U) -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_MASK (0xFF0U) -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_SHIFT (4U) -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B2_MASK (0x1000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B2_SHIFT (12U) -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_B2B2_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_B2B2_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_IE2_MASK (0x6000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_IE2_SHIFT (13U) -#define ADC_ETC_TRIGn_CHAIN_3_2_IE2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_IE2_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_IE2_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_MASK (0xF0000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_SHIFT (16U) -#define ADC_ETC_TRIGn_CHAIN_3_2_CSEL3(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_MASK (0xFF00000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_SHIFT (20U) -#define ADC_ETC_TRIGn_CHAIN_3_2_HWTS3(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B3_MASK (0x10000000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B3_SHIFT (28U) -#define ADC_ETC_TRIGn_CHAIN_3_2_B2B3(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_B2B3_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_B2B3_MASK) - -#define ADC_ETC_TRIGn_CHAIN_3_2_IE3_MASK (0x60000000U) -#define ADC_ETC_TRIGn_CHAIN_3_2_IE3_SHIFT (29U) -#define ADC_ETC_TRIGn_CHAIN_3_2_IE3(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_3_2_IE3_SHIFT)) & ADC_ETC_TRIGn_CHAIN_3_2_IE3_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_CHAIN_3_2 */ -#define ADC_ETC_TRIGn_CHAIN_3_2_COUNT (8U) - -/*! @name TRIGn_CHAIN_5_4 - ETC_TRIG Chain 4/5 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_MASK (0xFU) -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_SHIFT (0U) -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL4(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_MASK (0xFF0U) -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_SHIFT (4U) -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS4(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B4_MASK (0x1000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B4_SHIFT (12U) -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B4(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_B2B4_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_B2B4_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_IE4_MASK (0x6000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_IE4_SHIFT (13U) -#define ADC_ETC_TRIGn_CHAIN_5_4_IE4(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_IE4_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_IE4_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_MASK (0xF0000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_SHIFT (16U) -#define ADC_ETC_TRIGn_CHAIN_5_4_CSEL5(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_MASK (0xFF00000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_SHIFT (20U) -#define ADC_ETC_TRIGn_CHAIN_5_4_HWTS5(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B5_MASK (0x10000000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B5_SHIFT (28U) -#define ADC_ETC_TRIGn_CHAIN_5_4_B2B5(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_B2B5_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_B2B5_MASK) - -#define ADC_ETC_TRIGn_CHAIN_5_4_IE5_MASK (0x60000000U) -#define ADC_ETC_TRIGn_CHAIN_5_4_IE5_SHIFT (29U) -#define ADC_ETC_TRIGn_CHAIN_5_4_IE5(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_5_4_IE5_SHIFT)) & ADC_ETC_TRIGn_CHAIN_5_4_IE5_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_CHAIN_5_4 */ -#define ADC_ETC_TRIGn_CHAIN_5_4_COUNT (8U) - -/*! @name TRIGn_CHAIN_7_6 - ETC_TRIG Chain 6/7 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_MASK (0xFU) -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_SHIFT (0U) -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL6(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_MASK (0xFF0U) -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_SHIFT (4U) -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS6(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B6_MASK (0x1000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B6_SHIFT (12U) -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B6(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_B2B6_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_B2B6_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_IE6_MASK (0x6000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_IE6_SHIFT (13U) -#define ADC_ETC_TRIGn_CHAIN_7_6_IE6(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_IE6_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_IE6_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_MASK (0xF0000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_SHIFT (16U) -#define ADC_ETC_TRIGn_CHAIN_7_6_CSEL7(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_MASK (0xFF00000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_SHIFT (20U) -#define ADC_ETC_TRIGn_CHAIN_7_6_HWTS7(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B7_MASK (0x10000000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B7_SHIFT (28U) -#define ADC_ETC_TRIGn_CHAIN_7_6_B2B7(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_B2B7_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_B2B7_MASK) - -#define ADC_ETC_TRIGn_CHAIN_7_6_IE7_MASK (0x60000000U) -#define ADC_ETC_TRIGn_CHAIN_7_6_IE7_SHIFT (29U) -#define ADC_ETC_TRIGn_CHAIN_7_6_IE7(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_CHAIN_7_6_IE7_SHIFT)) & ADC_ETC_TRIGn_CHAIN_7_6_IE7_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_CHAIN_7_6 */ -#define ADC_ETC_TRIGn_CHAIN_7_6_COUNT (8U) - -/*! @name TRIGn_RESULT_1_0 - ETC_TRIG Result Data 1/0 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_RESULT_1_0_DATA0_MASK (0xFFFU) -#define ADC_ETC_TRIGn_RESULT_1_0_DATA0_SHIFT (0U) -#define ADC_ETC_TRIGn_RESULT_1_0_DATA0(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_1_0_DATA0_SHIFT)) & ADC_ETC_TRIGn_RESULT_1_0_DATA0_MASK) - -#define ADC_ETC_TRIGn_RESULT_1_0_DATA1_MASK (0xFFF0000U) -#define ADC_ETC_TRIGn_RESULT_1_0_DATA1_SHIFT (16U) -#define ADC_ETC_TRIGn_RESULT_1_0_DATA1(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_1_0_DATA1_SHIFT)) & ADC_ETC_TRIGn_RESULT_1_0_DATA1_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_RESULT_1_0 */ -#define ADC_ETC_TRIGn_RESULT_1_0_COUNT (8U) - -/*! @name TRIGn_RESULT_3_2 - ETC_TRIG Result Data 3/2 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_RESULT_3_2_DATA2_MASK (0xFFFU) -#define ADC_ETC_TRIGn_RESULT_3_2_DATA2_SHIFT (0U) -#define ADC_ETC_TRIGn_RESULT_3_2_DATA2(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_3_2_DATA2_SHIFT)) & ADC_ETC_TRIGn_RESULT_3_2_DATA2_MASK) - -#define ADC_ETC_TRIGn_RESULT_3_2_DATA3_MASK (0xFFF0000U) -#define ADC_ETC_TRIGn_RESULT_3_2_DATA3_SHIFT (16U) -#define ADC_ETC_TRIGn_RESULT_3_2_DATA3(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_3_2_DATA3_SHIFT)) & ADC_ETC_TRIGn_RESULT_3_2_DATA3_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_RESULT_3_2 */ -#define ADC_ETC_TRIGn_RESULT_3_2_COUNT (8U) - -/*! @name TRIGn_RESULT_5_4 - ETC_TRIG Result Data 5/4 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_RESULT_5_4_DATA4_MASK (0xFFFU) -#define ADC_ETC_TRIGn_RESULT_5_4_DATA4_SHIFT (0U) -#define ADC_ETC_TRIGn_RESULT_5_4_DATA4(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_5_4_DATA4_SHIFT)) & ADC_ETC_TRIGn_RESULT_5_4_DATA4_MASK) - -#define ADC_ETC_TRIGn_RESULT_5_4_DATA5_MASK (0xFFF0000U) -#define ADC_ETC_TRIGn_RESULT_5_4_DATA5_SHIFT (16U) -#define ADC_ETC_TRIGn_RESULT_5_4_DATA5(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_5_4_DATA5_SHIFT)) & ADC_ETC_TRIGn_RESULT_5_4_DATA5_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_RESULT_5_4 */ -#define ADC_ETC_TRIGn_RESULT_5_4_COUNT (8U) - -/*! @name TRIGn_RESULT_7_6 - ETC_TRIG Result Data 7/6 Register */ -/*! @{ */ - -#define ADC_ETC_TRIGn_RESULT_7_6_DATA6_MASK (0xFFFU) -#define ADC_ETC_TRIGn_RESULT_7_6_DATA6_SHIFT (0U) -#define ADC_ETC_TRIGn_RESULT_7_6_DATA6(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_7_6_DATA6_SHIFT)) & ADC_ETC_TRIGn_RESULT_7_6_DATA6_MASK) - -#define ADC_ETC_TRIGn_RESULT_7_6_DATA7_MASK (0xFFF0000U) -#define ADC_ETC_TRIGn_RESULT_7_6_DATA7_SHIFT (16U) -#define ADC_ETC_TRIGn_RESULT_7_6_DATA7(x) (((uint32_t)(((uint32_t)(x)) << ADC_ETC_TRIGn_RESULT_7_6_DATA7_SHIFT)) & ADC_ETC_TRIGn_RESULT_7_6_DATA7_MASK) -/*! @} */ - -/* The count of ADC_ETC_TRIGn_RESULT_7_6 */ -#define ADC_ETC_TRIGn_RESULT_7_6_COUNT (8U) - - -/*! - * @} - */ /* end of group ADC_ETC_Register_Masks */ - - -/* ADC_ETC - Peripheral instance base addresses */ -/** Peripheral ADC_ETC base address */ -#define ADC_ETC_BASE (0x403B0000u) -/** Peripheral ADC_ETC base pointer */ -#define ADC_ETC ((ADC_ETC_Type *)ADC_ETC_BASE) -/** Array initializer of ADC_ETC peripheral base addresses */ -#define ADC_ETC_BASE_ADDRS { ADC_ETC_BASE } -/** Array initializer of ADC_ETC peripheral base pointers */ -#define ADC_ETC_BASE_PTRS { ADC_ETC } -/** Interrupt vectors for the ADC_ETC peripheral type */ -#define ADC_ETC_IRQS { { ADC_ETC_IRQ0_IRQn, ADC_ETC_IRQ1_IRQn, ADC_ETC_IRQ2_IRQn } } -#define ADC_ETC_FAULT_IRQS { ADC_ETC_ERROR_IRQ_IRQn } - -/*! - * @} - */ /* end of group ADC_ETC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- AIPSTZ Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup AIPSTZ_Peripheral_Access_Layer AIPSTZ Peripheral Access Layer - * @{ - */ - -/** AIPSTZ - Register Layout Typedef */ -typedef struct { - __IO uint32_t MPR; /**< Master Priviledge Registers, offset: 0x0 */ - uint8_t RESERVED_0[60]; - __IO uint32_t OPACR; /**< Off-Platform Peripheral Access Control Registers, offset: 0x40 */ - __IO uint32_t OPACR1; /**< Off-Platform Peripheral Access Control Registers, offset: 0x44 */ - __IO uint32_t OPACR2; /**< Off-Platform Peripheral Access Control Registers, offset: 0x48 */ - __IO uint32_t OPACR3; /**< Off-Platform Peripheral Access Control Registers, offset: 0x4C */ - __IO uint32_t OPACR4; /**< Off-Platform Peripheral Access Control Registers, offset: 0x50 */ -} AIPSTZ_Type; - -/* ---------------------------------------------------------------------------- - -- AIPSTZ Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup AIPSTZ_Register_Masks AIPSTZ Register Masks - * @{ - */ - -/*! @name MPR - Master Priviledge Registers */ -/*! @{ */ - -#define AIPSTZ_MPR_MPROT5_MASK (0xF00U) -#define AIPSTZ_MPR_MPROT5_SHIFT (8U) -/*! MPROT5 - * 0bxxx0..Accesses from this master are forced to user-mode (ips_supervisor_access is forced to zero) regardless of the hprot[1] access attribute. - * 0bxxx1..Accesses from this master are not forced to user-mode. The hprot[1] access attribute is used directly to determine ips_supervisor_access. - * 0bxx0x..This master is not trusted for write accesses. - * 0bxx1x..This master is trusted for write accesses. - * 0bx0xx..This master is not trusted for read accesses. - * 0bx1xx..This master is trusted for read accesses. - * 0b1xxx..Write accesses from this master are allowed to be buffered - */ -#define AIPSTZ_MPR_MPROT5(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_MPR_MPROT5_SHIFT)) & AIPSTZ_MPR_MPROT5_MASK) - -#define AIPSTZ_MPR_MPROT3_MASK (0xF0000U) -#define AIPSTZ_MPR_MPROT3_SHIFT (16U) -/*! MPROT3 - * 0bxxx0..Accesses from this master are forced to user-mode (ips_supervisor_access is forced to zero) regardless of the hprot[1] access attribute. - * 0bxxx1..Accesses from this master are not forced to user-mode. The hprot[1] access attribute is used directly to determine ips_supervisor_access. - * 0bxx0x..This master is not trusted for write accesses. - * 0bxx1x..This master is trusted for write accesses. - * 0bx0xx..This master is not trusted for read accesses. - * 0bx1xx..This master is trusted for read accesses. - * 0b1xxx..Write accesses from this master are allowed to be buffered - */ -#define AIPSTZ_MPR_MPROT3(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_MPR_MPROT3_SHIFT)) & AIPSTZ_MPR_MPROT3_MASK) - -#define AIPSTZ_MPR_MPROT2_MASK (0xF00000U) -#define AIPSTZ_MPR_MPROT2_SHIFT (20U) -/*! MPROT2 - * 0bxxx0..Accesses from this master are forced to user-mode (ips_supervisor_access is forced to zero) regardless of the hprot[1] access attribute. - * 0bxxx1..Accesses from this master are not forced to user-mode. The hprot[1] access attribute is used directly to determine ips_supervisor_access. - * 0bxx0x..This master is not trusted for write accesses. - * 0bxx1x..This master is trusted for write accesses. - * 0bx0xx..This master is not trusted for read accesses. - * 0bx1xx..This master is trusted for read accesses. - * 0b1xxx..Write accesses from this master are allowed to be buffered - */ -#define AIPSTZ_MPR_MPROT2(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_MPR_MPROT2_SHIFT)) & AIPSTZ_MPR_MPROT2_MASK) - -#define AIPSTZ_MPR_MPROT1_MASK (0xF000000U) -#define AIPSTZ_MPR_MPROT1_SHIFT (24U) -/*! MPROT1 - * 0bxxx0..Accesses from this master are forced to user-mode (ips_supervisor_access is forced to zero) regardless of the hprot[1] access attribute. - * 0bxxx1..Accesses from this master are not forced to user-mode. The hprot[1] access attribute is used directly to determine ips_supervisor_access. - * 0bxx0x..This master is not trusted for write accesses. - * 0bxx1x..This master is trusted for write accesses. - * 0bx0xx..This master is not trusted for read accesses. - * 0bx1xx..This master is trusted for read accesses. - * 0b1xxx..Write accesses from this master are allowed to be buffered - */ -#define AIPSTZ_MPR_MPROT1(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_MPR_MPROT1_SHIFT)) & AIPSTZ_MPR_MPROT1_MASK) - -#define AIPSTZ_MPR_MPROT0_MASK (0xF0000000U) -#define AIPSTZ_MPR_MPROT0_SHIFT (28U) -/*! MPROT0 - * 0bxxx0..Accesses from this master are forced to user-mode (ips_supervisor_access is forced to zero) regardless of the hprot[1] access attribute. - * 0bxxx1..Accesses from this master are not forced to user-mode. The hprot[1] access attribute is used directly to determine ips_supervisor_access. - * 0bxx0x..This master is not trusted for write accesses. - * 0bxx1x..This master is trusted for write accesses. - * 0bx0xx..This master is not trusted for read accesses. - * 0bx1xx..This master is trusted for read accesses. - * 0b1xxx..Write accesses from this master are allowed to be buffered - */ -#define AIPSTZ_MPR_MPROT0(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_MPR_MPROT0_SHIFT)) & AIPSTZ_MPR_MPROT0_MASK) -/*! @} */ - -/*! @name OPACR - Off-Platform Peripheral Access Control Registers */ -/*! @{ */ - -#define AIPSTZ_OPACR_OPAC7_MASK (0xFU) -#define AIPSTZ_OPACR_OPAC7_SHIFT (0U) -/*! OPAC7 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC7(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC7_SHIFT)) & AIPSTZ_OPACR_OPAC7_MASK) - -#define AIPSTZ_OPACR_OPAC6_MASK (0xF0U) -#define AIPSTZ_OPACR_OPAC6_SHIFT (4U) -/*! OPAC6 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC6(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC6_SHIFT)) & AIPSTZ_OPACR_OPAC6_MASK) - -#define AIPSTZ_OPACR_OPAC5_MASK (0xF00U) -#define AIPSTZ_OPACR_OPAC5_SHIFT (8U) -/*! OPAC5 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC5(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC5_SHIFT)) & AIPSTZ_OPACR_OPAC5_MASK) - -#define AIPSTZ_OPACR_OPAC4_MASK (0xF000U) -#define AIPSTZ_OPACR_OPAC4_SHIFT (12U) -/*! OPAC4 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC4(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC4_SHIFT)) & AIPSTZ_OPACR_OPAC4_MASK) - -#define AIPSTZ_OPACR_OPAC3_MASK (0xF0000U) -#define AIPSTZ_OPACR_OPAC3_SHIFT (16U) -/*! OPAC3 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC3(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC3_SHIFT)) & AIPSTZ_OPACR_OPAC3_MASK) - -#define AIPSTZ_OPACR_OPAC2_MASK (0xF00000U) -#define AIPSTZ_OPACR_OPAC2_SHIFT (20U) -/*! OPAC2 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC2(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC2_SHIFT)) & AIPSTZ_OPACR_OPAC2_MASK) - -#define AIPSTZ_OPACR_OPAC1_MASK (0xF000000U) -#define AIPSTZ_OPACR_OPAC1_SHIFT (24U) -/*! OPAC1 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC1(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC1_SHIFT)) & AIPSTZ_OPACR_OPAC1_MASK) - -#define AIPSTZ_OPACR_OPAC0_MASK (0xF0000000U) -#define AIPSTZ_OPACR_OPAC0_SHIFT (28U) -/*! OPAC0 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR_OPAC0(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR_OPAC0_SHIFT)) & AIPSTZ_OPACR_OPAC0_MASK) -/*! @} */ - -/*! @name OPACR1 - Off-Platform Peripheral Access Control Registers */ -/*! @{ */ - -#define AIPSTZ_OPACR1_OPAC15_MASK (0xFU) -#define AIPSTZ_OPACR1_OPAC15_SHIFT (0U) -/*! OPAC15 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC15(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC15_SHIFT)) & AIPSTZ_OPACR1_OPAC15_MASK) - -#define AIPSTZ_OPACR1_OPAC14_MASK (0xF0U) -#define AIPSTZ_OPACR1_OPAC14_SHIFT (4U) -/*! OPAC14 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC14(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC14_SHIFT)) & AIPSTZ_OPACR1_OPAC14_MASK) - -#define AIPSTZ_OPACR1_OPAC13_MASK (0xF00U) -#define AIPSTZ_OPACR1_OPAC13_SHIFT (8U) -/*! OPAC13 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC13(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC13_SHIFT)) & AIPSTZ_OPACR1_OPAC13_MASK) - -#define AIPSTZ_OPACR1_OPAC12_MASK (0xF000U) -#define AIPSTZ_OPACR1_OPAC12_SHIFT (12U) -/*! OPAC12 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC12(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC12_SHIFT)) & AIPSTZ_OPACR1_OPAC12_MASK) - -#define AIPSTZ_OPACR1_OPAC11_MASK (0xF0000U) -#define AIPSTZ_OPACR1_OPAC11_SHIFT (16U) -/*! OPAC11 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC11(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC11_SHIFT)) & AIPSTZ_OPACR1_OPAC11_MASK) - -#define AIPSTZ_OPACR1_OPAC10_MASK (0xF00000U) -#define AIPSTZ_OPACR1_OPAC10_SHIFT (20U) -/*! OPAC10 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC10(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC10_SHIFT)) & AIPSTZ_OPACR1_OPAC10_MASK) - -#define AIPSTZ_OPACR1_OPAC9_MASK (0xF000000U) -#define AIPSTZ_OPACR1_OPAC9_SHIFT (24U) -/*! OPAC9 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC9(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC9_SHIFT)) & AIPSTZ_OPACR1_OPAC9_MASK) - -#define AIPSTZ_OPACR1_OPAC8_MASK (0xF0000000U) -#define AIPSTZ_OPACR1_OPAC8_SHIFT (28U) -/*! OPAC8 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR1_OPAC8(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR1_OPAC8_SHIFT)) & AIPSTZ_OPACR1_OPAC8_MASK) -/*! @} */ - -/*! @name OPACR2 - Off-Platform Peripheral Access Control Registers */ -/*! @{ */ - -#define AIPSTZ_OPACR2_OPAC23_MASK (0xFU) -#define AIPSTZ_OPACR2_OPAC23_SHIFT (0U) -/*! OPAC23 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC23(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC23_SHIFT)) & AIPSTZ_OPACR2_OPAC23_MASK) - -#define AIPSTZ_OPACR2_OPAC22_MASK (0xF0U) -#define AIPSTZ_OPACR2_OPAC22_SHIFT (4U) -/*! OPAC22 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC22(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC22_SHIFT)) & AIPSTZ_OPACR2_OPAC22_MASK) - -#define AIPSTZ_OPACR2_OPAC21_MASK (0xF00U) -#define AIPSTZ_OPACR2_OPAC21_SHIFT (8U) -/*! OPAC21 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC21(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC21_SHIFT)) & AIPSTZ_OPACR2_OPAC21_MASK) - -#define AIPSTZ_OPACR2_OPAC20_MASK (0xF000U) -#define AIPSTZ_OPACR2_OPAC20_SHIFT (12U) -/*! OPAC20 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC20(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC20_SHIFT)) & AIPSTZ_OPACR2_OPAC20_MASK) - -#define AIPSTZ_OPACR2_OPAC19_MASK (0xF0000U) -#define AIPSTZ_OPACR2_OPAC19_SHIFT (16U) -/*! OPAC19 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC19(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC19_SHIFT)) & AIPSTZ_OPACR2_OPAC19_MASK) - -#define AIPSTZ_OPACR2_OPAC18_MASK (0xF00000U) -#define AIPSTZ_OPACR2_OPAC18_SHIFT (20U) -/*! OPAC18 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC18(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC18_SHIFT)) & AIPSTZ_OPACR2_OPAC18_MASK) - -#define AIPSTZ_OPACR2_OPAC17_MASK (0xF000000U) -#define AIPSTZ_OPACR2_OPAC17_SHIFT (24U) -/*! OPAC17 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC17(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC17_SHIFT)) & AIPSTZ_OPACR2_OPAC17_MASK) - -#define AIPSTZ_OPACR2_OPAC16_MASK (0xF0000000U) -#define AIPSTZ_OPACR2_OPAC16_SHIFT (28U) -/*! OPAC16 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR2_OPAC16(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR2_OPAC16_SHIFT)) & AIPSTZ_OPACR2_OPAC16_MASK) -/*! @} */ - -/*! @name OPACR3 - Off-Platform Peripheral Access Control Registers */ -/*! @{ */ - -#define AIPSTZ_OPACR3_OPAC31_MASK (0xFU) -#define AIPSTZ_OPACR3_OPAC31_SHIFT (0U) -/*! OPAC31 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC31(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC31_SHIFT)) & AIPSTZ_OPACR3_OPAC31_MASK) - -#define AIPSTZ_OPACR3_OPAC30_MASK (0xF0U) -#define AIPSTZ_OPACR3_OPAC30_SHIFT (4U) -/*! OPAC30 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC30(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC30_SHIFT)) & AIPSTZ_OPACR3_OPAC30_MASK) - -#define AIPSTZ_OPACR3_OPAC29_MASK (0xF00U) -#define AIPSTZ_OPACR3_OPAC29_SHIFT (8U) -/*! OPAC29 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC29(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC29_SHIFT)) & AIPSTZ_OPACR3_OPAC29_MASK) - -#define AIPSTZ_OPACR3_OPAC28_MASK (0xF000U) -#define AIPSTZ_OPACR3_OPAC28_SHIFT (12U) -/*! OPAC28 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC28(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC28_SHIFT)) & AIPSTZ_OPACR3_OPAC28_MASK) - -#define AIPSTZ_OPACR3_OPAC27_MASK (0xF0000U) -#define AIPSTZ_OPACR3_OPAC27_SHIFT (16U) -/*! OPAC27 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC27(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC27_SHIFT)) & AIPSTZ_OPACR3_OPAC27_MASK) - -#define AIPSTZ_OPACR3_OPAC26_MASK (0xF00000U) -#define AIPSTZ_OPACR3_OPAC26_SHIFT (20U) -/*! OPAC26 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC26(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC26_SHIFT)) & AIPSTZ_OPACR3_OPAC26_MASK) - -#define AIPSTZ_OPACR3_OPAC25_MASK (0xF000000U) -#define AIPSTZ_OPACR3_OPAC25_SHIFT (24U) -/*! OPAC25 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC25(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC25_SHIFT)) & AIPSTZ_OPACR3_OPAC25_MASK) - -#define AIPSTZ_OPACR3_OPAC24_MASK (0xF0000000U) -#define AIPSTZ_OPACR3_OPAC24_SHIFT (28U) -/*! OPAC24 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR3_OPAC24(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR3_OPAC24_SHIFT)) & AIPSTZ_OPACR3_OPAC24_MASK) -/*! @} */ - -/*! @name OPACR4 - Off-Platform Peripheral Access Control Registers */ -/*! @{ */ - -#define AIPSTZ_OPACR4_OPAC33_MASK (0xF000000U) -#define AIPSTZ_OPACR4_OPAC33_SHIFT (24U) -/*! OPAC33 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR4_OPAC33(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR4_OPAC33_SHIFT)) & AIPSTZ_OPACR4_OPAC33_MASK) - -#define AIPSTZ_OPACR4_OPAC32_MASK (0xF0000000U) -#define AIPSTZ_OPACR4_OPAC32_SHIFT (28U) -/*! OPAC32 - * 0bxxx0..Accesses from an untrusted master are allowed. - * 0bxxx1..Accesses from an untrusted master are not allowed. If an access is attempted by an untrusted master, - * the access is terminated with an error response and no peripheral access is initiated on the IPS bus. - * 0bxx0x..This peripheral allows write accesses. - * 0bxx1x..This peripheral is write protected. If a write access is attempted, the access is terminated with an - * error response and no peripheral access is initiated on the IPS bus. - * 0bx0xx..This peripheral does not require supervisor privilege level for accesses. - * 0bx1xx..This peripheral requires supervisor privilege level for accesses. The master privilege level must - * indicate supervisor via the hprot[1] access attribute, and the MPROTx[MPL] control bit for the master must - * be set. If not, the access is terminated with an error response and no peripheral access is initiated - * on the IPS bus. - * 0b1xxx..Write accesses to this peripheral are allowed to be buffered by the AIPSTZ. - */ -#define AIPSTZ_OPACR4_OPAC32(x) (((uint32_t)(((uint32_t)(x)) << AIPSTZ_OPACR4_OPAC32_SHIFT)) & AIPSTZ_OPACR4_OPAC32_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group AIPSTZ_Register_Masks */ - - -/* AIPSTZ - Peripheral instance base addresses */ -/** Peripheral AIPSTZ1 base address */ -#define AIPSTZ1_BASE (0x4007C000u) -/** Peripheral AIPSTZ1 base pointer */ -#define AIPSTZ1 ((AIPSTZ_Type *)AIPSTZ1_BASE) -/** Peripheral AIPSTZ2 base address */ -#define AIPSTZ2_BASE (0x4017C000u) -/** Peripheral AIPSTZ2 base pointer */ -#define AIPSTZ2 ((AIPSTZ_Type *)AIPSTZ2_BASE) -/** Peripheral AIPSTZ3 base address */ -#define AIPSTZ3_BASE (0x4027C000u) -/** Peripheral AIPSTZ3 base pointer */ -#define AIPSTZ3 ((AIPSTZ_Type *)AIPSTZ3_BASE) -/** Peripheral AIPSTZ4 base address */ -#define AIPSTZ4_BASE (0x4037C000u) -/** Peripheral AIPSTZ4 base pointer */ -#define AIPSTZ4 ((AIPSTZ_Type *)AIPSTZ4_BASE) -/** Array initializer of AIPSTZ peripheral base addresses */ -#define AIPSTZ_BASE_ADDRS { 0u, AIPSTZ1_BASE, AIPSTZ2_BASE, AIPSTZ3_BASE, AIPSTZ4_BASE } -/** Array initializer of AIPSTZ peripheral base pointers */ -#define AIPSTZ_BASE_PTRS { (AIPSTZ_Type *)0u, AIPSTZ1, AIPSTZ2, AIPSTZ3, AIPSTZ4 } - -/*! - * @} - */ /* end of group AIPSTZ_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- AOI Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup AOI_Peripheral_Access_Layer AOI Peripheral Access Layer - * @{ - */ - -/** AOI - Register Layout Typedef */ -typedef struct { - struct { /* offset: 0x0, array step: 0x4 */ - __IO uint16_t BFCRT01; /**< Boolean Function Term 0 and 1 Configuration Register for EVENTn, array offset: 0x0, array step: 0x4 */ - __IO uint16_t BFCRT23; /**< Boolean Function Term 2 and 3 Configuration Register for EVENTn, array offset: 0x2, array step: 0x4 */ - } BFCRT[4]; -} AOI_Type; - -/* ---------------------------------------------------------------------------- - -- AOI Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup AOI_Register_Masks AOI Register Masks - * @{ - */ - -/*! @name BFCRT01 - Boolean Function Term 0 and 1 Configuration Register for EVENTn */ -/*! @{ */ - -#define AOI_BFCRT01_PT1_DC_MASK (0x3U) -#define AOI_BFCRT01_PT1_DC_SHIFT (0U) -/*! PT1_DC - Product term 1, D input configuration - * 0b00..Force the D input in this product term to a logical zero - * 0b01..Pass the D input in this product term - * 0b10..Complement the D input in this product term - * 0b11..Force the D input in this product term to a logical one - */ -#define AOI_BFCRT01_PT1_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_DC_SHIFT)) & AOI_BFCRT01_PT1_DC_MASK) - -#define AOI_BFCRT01_PT1_CC_MASK (0xCU) -#define AOI_BFCRT01_PT1_CC_SHIFT (2U) -/*! PT1_CC - Product term 1, C input configuration - * 0b00..Force the C input in this product term to a logical zero - * 0b01..Pass the C input in this product term - * 0b10..Complement the C input in this product term - * 0b11..Force the C input in this product term to a logical one - */ -#define AOI_BFCRT01_PT1_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_CC_SHIFT)) & AOI_BFCRT01_PT1_CC_MASK) - -#define AOI_BFCRT01_PT1_BC_MASK (0x30U) -#define AOI_BFCRT01_PT1_BC_SHIFT (4U) -/*! PT1_BC - Product term 1, B input configuration - * 0b00..Force the B input in this product term to a logical zero - * 0b01..Pass the B input in this product term - * 0b10..Complement the B input in this product term - * 0b11..Force the B input in this product term to a logical one - */ -#define AOI_BFCRT01_PT1_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_BC_SHIFT)) & AOI_BFCRT01_PT1_BC_MASK) - -#define AOI_BFCRT01_PT1_AC_MASK (0xC0U) -#define AOI_BFCRT01_PT1_AC_SHIFT (6U) -/*! PT1_AC - Product term 1, A input configuration - * 0b00..Force the A input in this product term to a logical zero - * 0b01..Pass the A input in this product term - * 0b10..Complement the A input in this product term - * 0b11..Force the A input in this product term to a logical one - */ -#define AOI_BFCRT01_PT1_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_AC_SHIFT)) & AOI_BFCRT01_PT1_AC_MASK) - -#define AOI_BFCRT01_PT0_DC_MASK (0x300U) -#define AOI_BFCRT01_PT0_DC_SHIFT (8U) -/*! PT0_DC - Product term 0, D input configuration - * 0b00..Force the D input in this product term to a logical zero - * 0b01..Pass the D input in this product term - * 0b10..Complement the D input in this product term - * 0b11..Force the D input in this product term to a logical one - */ -#define AOI_BFCRT01_PT0_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_DC_SHIFT)) & AOI_BFCRT01_PT0_DC_MASK) - -#define AOI_BFCRT01_PT0_CC_MASK (0xC00U) -#define AOI_BFCRT01_PT0_CC_SHIFT (10U) -/*! PT0_CC - Product term 0, C input configuration - * 0b00..Force the C input in this product term to a logical zero - * 0b01..Pass the C input in this product term - * 0b10..Complement the C input in this product term - * 0b11..Force the C input in this product term to a logical one - */ -#define AOI_BFCRT01_PT0_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_CC_SHIFT)) & AOI_BFCRT01_PT0_CC_MASK) - -#define AOI_BFCRT01_PT0_BC_MASK (0x3000U) -#define AOI_BFCRT01_PT0_BC_SHIFT (12U) -/*! PT0_BC - Product term 0, B input configuration - * 0b00..Force the B input in this product term to a logical zero - * 0b01..Pass the B input in this product term - * 0b10..Complement the B input in this product term - * 0b11..Force the B input in this product term to a logical one - */ -#define AOI_BFCRT01_PT0_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_BC_SHIFT)) & AOI_BFCRT01_PT0_BC_MASK) - -#define AOI_BFCRT01_PT0_AC_MASK (0xC000U) -#define AOI_BFCRT01_PT0_AC_SHIFT (14U) -/*! PT0_AC - Product term 0, A input configuration - * 0b00..Force the A input in this product term to a logical zero - * 0b01..Pass the A input in this product term - * 0b10..Complement the A input in this product term - * 0b11..Force the A input in this product term to a logical one - */ -#define AOI_BFCRT01_PT0_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_AC_SHIFT)) & AOI_BFCRT01_PT0_AC_MASK) -/*! @} */ - -/* The count of AOI_BFCRT01 */ -#define AOI_BFCRT01_COUNT (4U) - -/*! @name BFCRT23 - Boolean Function Term 2 and 3 Configuration Register for EVENTn */ -/*! @{ */ - -#define AOI_BFCRT23_PT3_DC_MASK (0x3U) -#define AOI_BFCRT23_PT3_DC_SHIFT (0U) -/*! PT3_DC - Product term 3, D input configuration - * 0b00..Force the D input in this product term to a logical zero - * 0b01..Pass the D input in this product term - * 0b10..Complement the D input in this product term - * 0b11..Force the D input in this product term to a logical one - */ -#define AOI_BFCRT23_PT3_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_DC_SHIFT)) & AOI_BFCRT23_PT3_DC_MASK) - -#define AOI_BFCRT23_PT3_CC_MASK (0xCU) -#define AOI_BFCRT23_PT3_CC_SHIFT (2U) -/*! PT3_CC - Product term 3, C input configuration - * 0b00..Force the C input in this product term to a logical zero - * 0b01..Pass the C input in this product term - * 0b10..Complement the C input in this product term - * 0b11..Force the C input in this product term to a logical one - */ -#define AOI_BFCRT23_PT3_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_CC_SHIFT)) & AOI_BFCRT23_PT3_CC_MASK) - -#define AOI_BFCRT23_PT3_BC_MASK (0x30U) -#define AOI_BFCRT23_PT3_BC_SHIFT (4U) -/*! PT3_BC - Product term 3, B input configuration - * 0b00..Force the B input in this product term to a logical zero - * 0b01..Pass the B input in this product term - * 0b10..Complement the B input in this product term - * 0b11..Force the B input in this product term to a logical one - */ -#define AOI_BFCRT23_PT3_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_BC_SHIFT)) & AOI_BFCRT23_PT3_BC_MASK) - -#define AOI_BFCRT23_PT3_AC_MASK (0xC0U) -#define AOI_BFCRT23_PT3_AC_SHIFT (6U) -/*! PT3_AC - Product term 3, A input configuration - * 0b00..Force the A input in this product term to a logical zero - * 0b01..Pass the A input in this product term - * 0b10..Complement the A input in this product term - * 0b11..Force the A input in this product term to a logical one - */ -#define AOI_BFCRT23_PT3_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_AC_SHIFT)) & AOI_BFCRT23_PT3_AC_MASK) - -#define AOI_BFCRT23_PT2_DC_MASK (0x300U) -#define AOI_BFCRT23_PT2_DC_SHIFT (8U) -/*! PT2_DC - Product term 2, D input configuration - * 0b00..Force the D input in this product term to a logical zero - * 0b01..Pass the D input in this product term - * 0b10..Complement the D input in this product term - * 0b11..Force the D input in this product term to a logical one - */ -#define AOI_BFCRT23_PT2_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_DC_SHIFT)) & AOI_BFCRT23_PT2_DC_MASK) - -#define AOI_BFCRT23_PT2_CC_MASK (0xC00U) -#define AOI_BFCRT23_PT2_CC_SHIFT (10U) -/*! PT2_CC - Product term 2, C input configuration - * 0b00..Force the C input in this product term to a logical zero - * 0b01..Pass the C input in this product term - * 0b10..Complement the C input in this product term - * 0b11..Force the C input in this product term to a logical one - */ -#define AOI_BFCRT23_PT2_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_CC_SHIFT)) & AOI_BFCRT23_PT2_CC_MASK) - -#define AOI_BFCRT23_PT2_BC_MASK (0x3000U) -#define AOI_BFCRT23_PT2_BC_SHIFT (12U) -/*! PT2_BC - Product term 2, B input configuration - * 0b00..Force the B input in this product term to a logical zero - * 0b01..Pass the B input in this product term - * 0b10..Complement the B input in this product term - * 0b11..Force the B input in this product term to a logical one - */ -#define AOI_BFCRT23_PT2_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_BC_SHIFT)) & AOI_BFCRT23_PT2_BC_MASK) - -#define AOI_BFCRT23_PT2_AC_MASK (0xC000U) -#define AOI_BFCRT23_PT2_AC_SHIFT (14U) -/*! PT2_AC - Product term 2, A input configuration - * 0b00..Force the A input in this product term to a logical zero - * 0b01..Pass the A input in this product term - * 0b10..Complement the A input in this product term - * 0b11..Force the A input in this product term to a logical one - */ -#define AOI_BFCRT23_PT2_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_AC_SHIFT)) & AOI_BFCRT23_PT2_AC_MASK) -/*! @} */ - -/* The count of AOI_BFCRT23 */ -#define AOI_BFCRT23_COUNT (4U) - - -/*! - * @} - */ /* end of group AOI_Register_Masks */ - - -/* AOI - Peripheral instance base addresses */ -/** Peripheral AOI1 base address */ -#define AOI1_BASE (0x403B4000u) -/** Peripheral AOI1 base pointer */ -#define AOI1 ((AOI_Type *)AOI1_BASE) -/** Peripheral AOI2 base address */ -#define AOI2_BASE (0x403B8000u) -/** Peripheral AOI2 base pointer */ -#define AOI2 ((AOI_Type *)AOI2_BASE) -/** Array initializer of AOI peripheral base addresses */ -#define AOI_BASE_ADDRS { 0u, AOI1_BASE, AOI2_BASE } -/** Array initializer of AOI peripheral base pointers */ -#define AOI_BASE_PTRS { (AOI_Type *)0u, AOI1, AOI2 } - -/*! - * @} - */ /* end of group AOI_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- BEE Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup BEE_Peripheral_Access_Layer BEE Peripheral Access Layer - * @{ - */ - -/** BEE - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< Control Register, offset: 0x0 */ - __IO uint32_t ADDR_OFFSET0; /**< Offset region 0 Register, offset: 0x4 */ - __IO uint32_t ADDR_OFFSET1; /**< Offset region 1 Register, offset: 0x8 */ - __IO uint32_t AES_KEY0_W0; /**< AES Key 0 Register, offset: 0xC */ - __IO uint32_t AES_KEY0_W1; /**< AES Key 1 Register, offset: 0x10 */ - __IO uint32_t AES_KEY0_W2; /**< AES Key 2 Register, offset: 0x14 */ - __IO uint32_t AES_KEY0_W3; /**< AES Key 3 Register, offset: 0x18 */ - __IO uint32_t STATUS; /**< Status Register, offset: 0x1C */ - __O uint32_t CTR_NONCE0_W0; /**< NONCE00 Register, offset: 0x20 */ - __O uint32_t CTR_NONCE0_W1; /**< NONCE01 Register, offset: 0x24 */ - __O uint32_t CTR_NONCE0_W2; /**< NONCE02 Register, offset: 0x28 */ - __O uint32_t CTR_NONCE0_W3; /**< NONCE03 Register, offset: 0x2C */ - __O uint32_t CTR_NONCE1_W0; /**< NONCE10 Register, offset: 0x30 */ - __O uint32_t CTR_NONCE1_W1; /**< NONCE11 Register, offset: 0x34 */ - __O uint32_t CTR_NONCE1_W2; /**< NONCE12 Register, offset: 0x38 */ - __O uint32_t CTR_NONCE1_W3; /**< NONCE13 Register, offset: 0x3C */ - __IO uint32_t REGION1_TOP; /**< Region1 Top Address Register, offset: 0x40 */ - __IO uint32_t REGION1_BOT; /**< Region1 Bottom Address Register, offset: 0x44 */ -} BEE_Type; - -/* ---------------------------------------------------------------------------- - -- BEE Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup BEE_Register_Masks BEE Register Masks - * @{ - */ - -/*! @name CTRL - Control Register */ -/*! @{ */ - -#define BEE_CTRL_BEE_ENABLE_MASK (0x1U) -#define BEE_CTRL_BEE_ENABLE_SHIFT (0U) -/*! BEE_ENABLE - * 0b0..Disable BEE - * 0b1..Enable BEE - */ -#define BEE_CTRL_BEE_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_BEE_ENABLE_SHIFT)) & BEE_CTRL_BEE_ENABLE_MASK) - -#define BEE_CTRL_CTRL_CLK_EN_MASK (0x2U) -#define BEE_CTRL_CTRL_CLK_EN_SHIFT (1U) -#define BEE_CTRL_CTRL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_CLK_EN_SHIFT)) & BEE_CTRL_CTRL_CLK_EN_MASK) - -#define BEE_CTRL_CTRL_SFTRST_N_MASK (0x4U) -#define BEE_CTRL_CTRL_SFTRST_N_SHIFT (2U) -#define BEE_CTRL_CTRL_SFTRST_N(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_SFTRST_N_SHIFT)) & BEE_CTRL_CTRL_SFTRST_N_MASK) - -#define BEE_CTRL_KEY_VALID_MASK (0x10U) -#define BEE_CTRL_KEY_VALID_SHIFT (4U) -#define BEE_CTRL_KEY_VALID(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_KEY_VALID_SHIFT)) & BEE_CTRL_KEY_VALID_MASK) - -#define BEE_CTRL_KEY_REGION_SEL_MASK (0x20U) -#define BEE_CTRL_KEY_REGION_SEL_SHIFT (5U) -/*! KEY_REGION_SEL - * 0b0..Load AES key for region0 - * 0b1..Load AES key for region1 - */ -#define BEE_CTRL_KEY_REGION_SEL(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_KEY_REGION_SEL_SHIFT)) & BEE_CTRL_KEY_REGION_SEL_MASK) - -#define BEE_CTRL_AC_PROT_EN_MASK (0x40U) -#define BEE_CTRL_AC_PROT_EN_SHIFT (6U) -#define BEE_CTRL_AC_PROT_EN(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_AC_PROT_EN_SHIFT)) & BEE_CTRL_AC_PROT_EN_MASK) - -#define BEE_CTRL_LITTLE_ENDIAN_MASK (0x80U) -#define BEE_CTRL_LITTLE_ENDIAN_SHIFT (7U) -/*! LITTLE_ENDIAN - * 0b0..The input and output data of the AES core is swapped as below: {B15,B14,B13,B12,B11,B10,B9,B8, - * B7,B6,B5,B4,B3,B2,B1,B0} swap to {B0,B1,B2,B3,B4,B5,B6,B7, B8,B9,B10,B11,B12,B13,B14,B15}, where B0~B15 refers to - * Byte0 to Byte15. - * 0b1..The input and output data of AES core is not swapped. - */ -#define BEE_CTRL_LITTLE_ENDIAN(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_LITTLE_ENDIAN_SHIFT)) & BEE_CTRL_LITTLE_ENDIAN_MASK) - -#define BEE_CTRL_SECURITY_LEVEL_R0_MASK (0x300U) -#define BEE_CTRL_SECURITY_LEVEL_R0_SHIFT (8U) -#define BEE_CTRL_SECURITY_LEVEL_R0(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_SECURITY_LEVEL_R0_SHIFT)) & BEE_CTRL_SECURITY_LEVEL_R0_MASK) - -#define BEE_CTRL_CTRL_AES_MODE_R0_MASK (0x400U) -#define BEE_CTRL_CTRL_AES_MODE_R0_SHIFT (10U) -/*! CTRL_AES_MODE_R0 - * 0b0..ECB - * 0b1..CTR - */ -#define BEE_CTRL_CTRL_AES_MODE_R0(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_AES_MODE_R0_SHIFT)) & BEE_CTRL_CTRL_AES_MODE_R0_MASK) - -#define BEE_CTRL_SECURITY_LEVEL_R1_MASK (0x3000U) -#define BEE_CTRL_SECURITY_LEVEL_R1_SHIFT (12U) -#define BEE_CTRL_SECURITY_LEVEL_R1(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_SECURITY_LEVEL_R1_SHIFT)) & BEE_CTRL_SECURITY_LEVEL_R1_MASK) - -#define BEE_CTRL_CTRL_AES_MODE_R1_MASK (0x4000U) -#define BEE_CTRL_CTRL_AES_MODE_R1_SHIFT (14U) -/*! CTRL_AES_MODE_R1 - * 0b0..ECB - * 0b1..CTR - */ -#define BEE_CTRL_CTRL_AES_MODE_R1(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_AES_MODE_R1_SHIFT)) & BEE_CTRL_CTRL_AES_MODE_R1_MASK) - -#define BEE_CTRL_BEE_ENABLE_LOCK_MASK (0x10000U) -#define BEE_CTRL_BEE_ENABLE_LOCK_SHIFT (16U) -#define BEE_CTRL_BEE_ENABLE_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_BEE_ENABLE_LOCK_SHIFT)) & BEE_CTRL_BEE_ENABLE_LOCK_MASK) - -#define BEE_CTRL_CTRL_CLK_EN_LOCK_MASK (0x20000U) -#define BEE_CTRL_CTRL_CLK_EN_LOCK_SHIFT (17U) -#define BEE_CTRL_CTRL_CLK_EN_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_CLK_EN_LOCK_SHIFT)) & BEE_CTRL_CTRL_CLK_EN_LOCK_MASK) - -#define BEE_CTRL_CTRL_SFTRST_N_LOCK_MASK (0x40000U) -#define BEE_CTRL_CTRL_SFTRST_N_LOCK_SHIFT (18U) -#define BEE_CTRL_CTRL_SFTRST_N_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_SFTRST_N_LOCK_SHIFT)) & BEE_CTRL_CTRL_SFTRST_N_LOCK_MASK) - -#define BEE_CTRL_REGION1_ADDR_LOCK_MASK (0x80000U) -#define BEE_CTRL_REGION1_ADDR_LOCK_SHIFT (19U) -#define BEE_CTRL_REGION1_ADDR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_REGION1_ADDR_LOCK_SHIFT)) & BEE_CTRL_REGION1_ADDR_LOCK_MASK) - -#define BEE_CTRL_KEY_VALID_LOCK_MASK (0x100000U) -#define BEE_CTRL_KEY_VALID_LOCK_SHIFT (20U) -#define BEE_CTRL_KEY_VALID_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_KEY_VALID_LOCK_SHIFT)) & BEE_CTRL_KEY_VALID_LOCK_MASK) - -#define BEE_CTRL_KEY_REGION_SEL_LOCK_MASK (0x200000U) -#define BEE_CTRL_KEY_REGION_SEL_LOCK_SHIFT (21U) -#define BEE_CTRL_KEY_REGION_SEL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_KEY_REGION_SEL_LOCK_SHIFT)) & BEE_CTRL_KEY_REGION_SEL_LOCK_MASK) - -#define BEE_CTRL_AC_PROT_EN_LOCK_MASK (0x400000U) -#define BEE_CTRL_AC_PROT_EN_LOCK_SHIFT (22U) -#define BEE_CTRL_AC_PROT_EN_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_AC_PROT_EN_LOCK_SHIFT)) & BEE_CTRL_AC_PROT_EN_LOCK_MASK) - -#define BEE_CTRL_LITTLE_ENDIAN_LOCK_MASK (0x800000U) -#define BEE_CTRL_LITTLE_ENDIAN_LOCK_SHIFT (23U) -#define BEE_CTRL_LITTLE_ENDIAN_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_LITTLE_ENDIAN_LOCK_SHIFT)) & BEE_CTRL_LITTLE_ENDIAN_LOCK_MASK) - -#define BEE_CTRL_SECURITY_LEVEL_R0_LOCK_MASK (0x3000000U) -#define BEE_CTRL_SECURITY_LEVEL_R0_LOCK_SHIFT (24U) -#define BEE_CTRL_SECURITY_LEVEL_R0_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_SECURITY_LEVEL_R0_LOCK_SHIFT)) & BEE_CTRL_SECURITY_LEVEL_R0_LOCK_MASK) - -#define BEE_CTRL_CTRL_AES_MODE_R0_LOCK_MASK (0x4000000U) -#define BEE_CTRL_CTRL_AES_MODE_R0_LOCK_SHIFT (26U) -#define BEE_CTRL_CTRL_AES_MODE_R0_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_AES_MODE_R0_LOCK_SHIFT)) & BEE_CTRL_CTRL_AES_MODE_R0_LOCK_MASK) - -#define BEE_CTRL_REGION0_KEY_LOCK_MASK (0x8000000U) -#define BEE_CTRL_REGION0_KEY_LOCK_SHIFT (27U) -#define BEE_CTRL_REGION0_KEY_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_REGION0_KEY_LOCK_SHIFT)) & BEE_CTRL_REGION0_KEY_LOCK_MASK) - -#define BEE_CTRL_SECURITY_LEVEL_R1_LOCK_MASK (0x30000000U) -#define BEE_CTRL_SECURITY_LEVEL_R1_LOCK_SHIFT (28U) -#define BEE_CTRL_SECURITY_LEVEL_R1_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_SECURITY_LEVEL_R1_LOCK_SHIFT)) & BEE_CTRL_SECURITY_LEVEL_R1_LOCK_MASK) - -#define BEE_CTRL_CTRL_AES_MODE_R1_LOCK_MASK (0x40000000U) -#define BEE_CTRL_CTRL_AES_MODE_R1_LOCK_SHIFT (30U) -#define BEE_CTRL_CTRL_AES_MODE_R1_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_CTRL_AES_MODE_R1_LOCK_SHIFT)) & BEE_CTRL_CTRL_AES_MODE_R1_LOCK_MASK) - -#define BEE_CTRL_REGION1_KEY_LOCK_MASK (0x80000000U) -#define BEE_CTRL_REGION1_KEY_LOCK_SHIFT (31U) -#define BEE_CTRL_REGION1_KEY_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTRL_REGION1_KEY_LOCK_SHIFT)) & BEE_CTRL_REGION1_KEY_LOCK_MASK) -/*! @} */ - -/*! @name ADDR_OFFSET0 - Offset region 0 Register */ -/*! @{ */ - -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0_MASK (0xFFFFU) -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0_SHIFT (0U) -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0(x) (((uint32_t)(((uint32_t)(x)) << BEE_ADDR_OFFSET0_ADDR_OFFSET0_SHIFT)) & BEE_ADDR_OFFSET0_ADDR_OFFSET0_MASK) - -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0_LOCK_MASK (0xFFFF0000U) -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0_LOCK_SHIFT (16U) -#define BEE_ADDR_OFFSET0_ADDR_OFFSET0_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_ADDR_OFFSET0_ADDR_OFFSET0_LOCK_SHIFT)) & BEE_ADDR_OFFSET0_ADDR_OFFSET0_LOCK_MASK) -/*! @} */ - -/*! @name ADDR_OFFSET1 - Offset region 1 Register */ -/*! @{ */ - -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1_MASK (0xFFFFU) -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1_SHIFT (0U) -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1(x) (((uint32_t)(((uint32_t)(x)) << BEE_ADDR_OFFSET1_ADDR_OFFSET1_SHIFT)) & BEE_ADDR_OFFSET1_ADDR_OFFSET1_MASK) - -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1_LOCK_MASK (0xFFFF0000U) -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1_LOCK_SHIFT (16U) -#define BEE_ADDR_OFFSET1_ADDR_OFFSET1_LOCK(x) (((uint32_t)(((uint32_t)(x)) << BEE_ADDR_OFFSET1_ADDR_OFFSET1_LOCK_SHIFT)) & BEE_ADDR_OFFSET1_ADDR_OFFSET1_LOCK_MASK) -/*! @} */ - -/*! @name AES_KEY0_W0 - AES Key 0 Register */ -/*! @{ */ - -#define BEE_AES_KEY0_W0_KEY0_MASK (0xFFFFFFFFU) -#define BEE_AES_KEY0_W0_KEY0_SHIFT (0U) -/*! KEY0 - AES 128 key from software - */ -#define BEE_AES_KEY0_W0_KEY0(x) (((uint32_t)(((uint32_t)(x)) << BEE_AES_KEY0_W0_KEY0_SHIFT)) & BEE_AES_KEY0_W0_KEY0_MASK) -/*! @} */ - -/*! @name AES_KEY0_W1 - AES Key 1 Register */ -/*! @{ */ - -#define BEE_AES_KEY0_W1_KEY1_MASK (0xFFFFFFFFU) -#define BEE_AES_KEY0_W1_KEY1_SHIFT (0U) -/*! KEY1 - AES 128 key from software - */ -#define BEE_AES_KEY0_W1_KEY1(x) (((uint32_t)(((uint32_t)(x)) << BEE_AES_KEY0_W1_KEY1_SHIFT)) & BEE_AES_KEY0_W1_KEY1_MASK) -/*! @} */ - -/*! @name AES_KEY0_W2 - AES Key 2 Register */ -/*! @{ */ - -#define BEE_AES_KEY0_W2_KEY2_MASK (0xFFFFFFFFU) -#define BEE_AES_KEY0_W2_KEY2_SHIFT (0U) -/*! KEY2 - AES 128 key from software - */ -#define BEE_AES_KEY0_W2_KEY2(x) (((uint32_t)(((uint32_t)(x)) << BEE_AES_KEY0_W2_KEY2_SHIFT)) & BEE_AES_KEY0_W2_KEY2_MASK) -/*! @} */ - -/*! @name AES_KEY0_W3 - AES Key 3 Register */ -/*! @{ */ - -#define BEE_AES_KEY0_W3_KEY3_MASK (0xFFFFFFFFU) -#define BEE_AES_KEY0_W3_KEY3_SHIFT (0U) -/*! KEY3 - AES 128 key from software - */ -#define BEE_AES_KEY0_W3_KEY3(x) (((uint32_t)(((uint32_t)(x)) << BEE_AES_KEY0_W3_KEY3_SHIFT)) & BEE_AES_KEY0_W3_KEY3_MASK) -/*! @} */ - -/*! @name STATUS - Status Register */ -/*! @{ */ - -#define BEE_STATUS_IRQ_VEC_MASK (0xFFU) -#define BEE_STATUS_IRQ_VEC_SHIFT (0U) -#define BEE_STATUS_IRQ_VEC(x) (((uint32_t)(((uint32_t)(x)) << BEE_STATUS_IRQ_VEC_SHIFT)) & BEE_STATUS_IRQ_VEC_MASK) - -#define BEE_STATUS_BEE_IDLE_MASK (0x100U) -#define BEE_STATUS_BEE_IDLE_SHIFT (8U) -#define BEE_STATUS_BEE_IDLE(x) (((uint32_t)(((uint32_t)(x)) << BEE_STATUS_BEE_IDLE_SHIFT)) & BEE_STATUS_BEE_IDLE_MASK) -/*! @} */ - -/*! @name CTR_NONCE0_W0 - NONCE00 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE0_W0_NONCE00_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE0_W0_NONCE00_SHIFT (0U) -#define BEE_CTR_NONCE0_W0_NONCE00(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE0_W0_NONCE00_SHIFT)) & BEE_CTR_NONCE0_W0_NONCE00_MASK) -/*! @} */ - -/*! @name CTR_NONCE0_W1 - NONCE01 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE0_W1_NONCE01_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE0_W1_NONCE01_SHIFT (0U) -#define BEE_CTR_NONCE0_W1_NONCE01(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE0_W1_NONCE01_SHIFT)) & BEE_CTR_NONCE0_W1_NONCE01_MASK) -/*! @} */ - -/*! @name CTR_NONCE0_W2 - NONCE02 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE0_W2_NONCE02_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE0_W2_NONCE02_SHIFT (0U) -#define BEE_CTR_NONCE0_W2_NONCE02(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE0_W2_NONCE02_SHIFT)) & BEE_CTR_NONCE0_W2_NONCE02_MASK) -/*! @} */ - -/*! @name CTR_NONCE0_W3 - NONCE03 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE0_W3_NONCE03_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE0_W3_NONCE03_SHIFT (0U) -#define BEE_CTR_NONCE0_W3_NONCE03(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE0_W3_NONCE03_SHIFT)) & BEE_CTR_NONCE0_W3_NONCE03_MASK) -/*! @} */ - -/*! @name CTR_NONCE1_W0 - NONCE10 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE1_W0_NONCE10_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE1_W0_NONCE10_SHIFT (0U) -#define BEE_CTR_NONCE1_W0_NONCE10(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE1_W0_NONCE10_SHIFT)) & BEE_CTR_NONCE1_W0_NONCE10_MASK) -/*! @} */ - -/*! @name CTR_NONCE1_W1 - NONCE11 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE1_W1_NONCE11_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE1_W1_NONCE11_SHIFT (0U) -#define BEE_CTR_NONCE1_W1_NONCE11(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE1_W1_NONCE11_SHIFT)) & BEE_CTR_NONCE1_W1_NONCE11_MASK) -/*! @} */ - -/*! @name CTR_NONCE1_W2 - NONCE12 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE1_W2_NONCE12_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE1_W2_NONCE12_SHIFT (0U) -#define BEE_CTR_NONCE1_W2_NONCE12(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE1_W2_NONCE12_SHIFT)) & BEE_CTR_NONCE1_W2_NONCE12_MASK) -/*! @} */ - -/*! @name CTR_NONCE1_W3 - NONCE13 Register */ -/*! @{ */ - -#define BEE_CTR_NONCE1_W3_NONCE13_MASK (0xFFFFFFFFU) -#define BEE_CTR_NONCE1_W3_NONCE13_SHIFT (0U) -#define BEE_CTR_NONCE1_W3_NONCE13(x) (((uint32_t)(((uint32_t)(x)) << BEE_CTR_NONCE1_W3_NONCE13_SHIFT)) & BEE_CTR_NONCE1_W3_NONCE13_MASK) -/*! @} */ - -/*! @name REGION1_TOP - Region1 Top Address Register */ -/*! @{ */ - -#define BEE_REGION1_TOP_REGION1_TOP_MASK (0xFFFFFFFFU) -#define BEE_REGION1_TOP_REGION1_TOP_SHIFT (0U) -/*! REGION1_TOP - Address upper limit of region1 - */ -#define BEE_REGION1_TOP_REGION1_TOP(x) (((uint32_t)(((uint32_t)(x)) << BEE_REGION1_TOP_REGION1_TOP_SHIFT)) & BEE_REGION1_TOP_REGION1_TOP_MASK) -/*! @} */ - -/*! @name REGION1_BOT - Region1 Bottom Address Register */ -/*! @{ */ - -#define BEE_REGION1_BOT_REGION1_BOT_MASK (0xFFFFFFFFU) -#define BEE_REGION1_BOT_REGION1_BOT_SHIFT (0U) -/*! REGION1_BOT - Address lower limit of region1 - */ -#define BEE_REGION1_BOT_REGION1_BOT(x) (((uint32_t)(((uint32_t)(x)) << BEE_REGION1_BOT_REGION1_BOT_SHIFT)) & BEE_REGION1_BOT_REGION1_BOT_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group BEE_Register_Masks */ - - -/* BEE - Peripheral instance base addresses */ -/** Peripheral BEE base address */ -#define BEE_BASE (0x403EC000u) -/** Peripheral BEE base pointer */ -#define BEE ((BEE_Type *)BEE_BASE) -/** Array initializer of BEE peripheral base addresses */ -#define BEE_BASE_ADDRS { BEE_BASE } -/** Array initializer of BEE peripheral base pointers */ -#define BEE_BASE_PTRS { BEE } - -/*! - * @} - */ /* end of group BEE_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CAN Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CAN_Peripheral_Access_Layer CAN Peripheral Access Layer - * @{ - */ - -/** CAN - Register Layout Typedef */ -typedef struct { - __IO uint32_t MCR; /**< Module Configuration Register, offset: 0x0 */ - __IO uint32_t CTRL1; /**< Control 1 Register, offset: 0x4 */ - __IO uint32_t TIMER; /**< Free Running Timer Register, offset: 0x8 */ - uint8_t RESERVED_0[4]; - __IO uint32_t RXMGMASK; /**< Rx Mailboxes Global Mask Register, offset: 0x10 */ - __IO uint32_t RX14MASK; /**< Rx Buffer 14 Mask Register, offset: 0x14 */ - __IO uint32_t RX15MASK; /**< Rx Buffer 15 Mask Register, offset: 0x18 */ - __IO uint32_t ECR; /**< Error Counter Register, offset: 0x1C */ - __IO uint32_t ESR1; /**< Error and Status 1 Register, offset: 0x20 */ - __IO uint32_t IMASK2; /**< Interrupt Masks 2 Register, offset: 0x24 */ - __IO uint32_t IMASK1; /**< Interrupt Masks 1 Register, offset: 0x28 */ - __IO uint32_t IFLAG2; /**< Interrupt Flags 2 Register, offset: 0x2C */ - __IO uint32_t IFLAG1; /**< Interrupt Flags 1 Register, offset: 0x30 */ - __IO uint32_t CTRL2; /**< Control 2 Register, offset: 0x34 */ - __I uint32_t ESR2; /**< Error and Status 2 Register, offset: 0x38 */ - uint8_t RESERVED_1[8]; - __I uint32_t CRCR; /**< CRC Register, offset: 0x44 */ - __IO uint32_t RXFGMASK; /**< Rx FIFO Global Mask Register, offset: 0x48 */ - __I uint32_t RXFIR; /**< Rx FIFO Information Register, offset: 0x4C */ - uint8_t RESERVED_2[8]; - __I uint32_t DBG1; /**< Debug 1 register, offset: 0x58 */ - __I uint32_t DBG2; /**< Debug 2 register, offset: 0x5C */ - uint8_t RESERVED_3[32]; - struct { /* offset: 0x80, array step: 0x10 */ - __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 63 CS Register, array offset: 0x80, array step: 0x10 */ - __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 63 ID Register, array offset: 0x84, array step: 0x10 */ - __IO uint32_t WORD0; /**< Message Buffer 0 WORD0 Register..Message Buffer 63 WORD0 Register, array offset: 0x88, array step: 0x10 */ - __IO uint32_t WORD1; /**< Message Buffer 0 WORD1 Register..Message Buffer 63 WORD1 Register, array offset: 0x8C, array step: 0x10 */ - } MB[64]; - uint8_t RESERVED_4[1024]; - __IO uint32_t RXIMR[64]; /**< Rx Individual Mask Registers, array offset: 0x880, array step: 0x4 */ - uint8_t RESERVED_5[96]; - __IO uint32_t GFWR; /**< Glitch Filter Width Registers, offset: 0x9E0 */ -} CAN_Type; - -/* ---------------------------------------------------------------------------- - -- CAN Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CAN_Register_Masks CAN Register Masks - * @{ - */ - -/*! @name MCR - Module Configuration Register */ -/*! @{ */ - -#define CAN_MCR_MAXMB_MASK (0x7FU) -#define CAN_MCR_MAXMB_SHIFT (0U) -#define CAN_MCR_MAXMB(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_MAXMB_SHIFT)) & CAN_MCR_MAXMB_MASK) - -#define CAN_MCR_IDAM_MASK (0x300U) -#define CAN_MCR_IDAM_SHIFT (8U) -/*! IDAM - * 0b00..Format A One full ID (standard or extended) per ID filter Table element. - * 0b01..Format B Two full standard IDs or two partial 14-bit extended IDs per ID filter Table element. - * 0b10..Format C Four partial 8-bit IDs (standard or extended) per ID filter Table element. - * 0b11..Format D All frames rejected. - */ -#define CAN_MCR_IDAM(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_IDAM_SHIFT)) & CAN_MCR_IDAM_MASK) - -#define CAN_MCR_AEN_MASK (0x1000U) -#define CAN_MCR_AEN_SHIFT (12U) -/*! AEN - * 0b1..Abort enabled - * 0b0..Abort disabled - */ -#define CAN_MCR_AEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_AEN_SHIFT)) & CAN_MCR_AEN_MASK) - -#define CAN_MCR_LPRIOEN_MASK (0x2000U) -#define CAN_MCR_LPRIOEN_SHIFT (13U) -/*! LPRIOEN - * 0b1..Local Priority enabled - * 0b0..Local Priority disabled - */ -#define CAN_MCR_LPRIOEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_LPRIOEN_SHIFT)) & CAN_MCR_LPRIOEN_MASK) - -#define CAN_MCR_IRMQ_MASK (0x10000U) -#define CAN_MCR_IRMQ_SHIFT (16U) -/*! IRMQ - * 0b1..Individual Rx masking and queue feature are enabled. - * 0b0..Individual Rx masking and queue feature are disabled.For backward compatibility, the reading of C/S word locks the MB even if it is EMPTY. - */ -#define CAN_MCR_IRMQ(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_IRMQ_SHIFT)) & CAN_MCR_IRMQ_MASK) - -#define CAN_MCR_SRXDIS_MASK (0x20000U) -#define CAN_MCR_SRXDIS_SHIFT (17U) -/*! SRXDIS - * 0b1..Self reception disabled - * 0b0..Self reception enabled - */ -#define CAN_MCR_SRXDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SRXDIS_SHIFT)) & CAN_MCR_SRXDIS_MASK) - -#define CAN_MCR_WAKSRC_MASK (0x80000U) -#define CAN_MCR_WAKSRC_SHIFT (19U) -/*! WAKSRC - * 0b1..FLEXCAN uses the filtered FLEXCAN_RX input to detect recessive to dominant edges on the CAN bus - * 0b0..FLEXCAN uses the unfiltered FLEXCAN_RX input to detect recessive to dominant edges on the CAN bus. - */ -#define CAN_MCR_WAKSRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WAKSRC_SHIFT)) & CAN_MCR_WAKSRC_MASK) - -#define CAN_MCR_LPMACK_MASK (0x100000U) -#define CAN_MCR_LPMACK_SHIFT (20U) -/*! LPMACK - * 0b1..FLEXCAN is either in Disable Mode, or Stop mode - * 0b0..FLEXCAN not in any of the low power modes - */ -#define CAN_MCR_LPMACK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_LPMACK_SHIFT)) & CAN_MCR_LPMACK_MASK) - -#define CAN_MCR_WRNEN_MASK (0x200000U) -#define CAN_MCR_WRNEN_SHIFT (21U) -/*! WRNEN - * 0b1..TWRN_INT and RWRN_INT bits are set when the respective error counter transition from <96 to >= 96. - * 0b0..TWRN_INT and RWRN_INT bits are zero, independent of the values in the error counters. - */ -#define CAN_MCR_WRNEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WRNEN_SHIFT)) & CAN_MCR_WRNEN_MASK) - -#define CAN_MCR_SLFWAK_MASK (0x400000U) -#define CAN_MCR_SLFWAK_SHIFT (22U) -/*! SLFWAK - * 0b1..FLEXCAN Self Wake Up feature is enabled - * 0b0..FLEXCAN Self Wake Up feature is disabled - */ -#define CAN_MCR_SLFWAK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SLFWAK_SHIFT)) & CAN_MCR_SLFWAK_MASK) - -#define CAN_MCR_SUPV_MASK (0x800000U) -#define CAN_MCR_SUPV_SHIFT (23U) -/*! SUPV - * 0b1..FlexCAN is in Supervisor Mode. Affected registers allow only Supervisor access. Unrestricted access - * behaves as though the access was done to an unimplemented register location - * 0b0..FlexCAN is in User Mode. Affected registers allow both Supervisor and Unrestricted accesses - */ -#define CAN_MCR_SUPV(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SUPV_SHIFT)) & CAN_MCR_SUPV_MASK) - -#define CAN_MCR_FRZACK_MASK (0x1000000U) -#define CAN_MCR_FRZACK_SHIFT (24U) -/*! FRZACK - * 0b1..FLEXCAN in Freeze Mode, prescaler stopped - * 0b0..FLEXCAN not in Freeze Mode, prescaler running - */ -#define CAN_MCR_FRZACK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_FRZACK_SHIFT)) & CAN_MCR_FRZACK_MASK) - -#define CAN_MCR_SOFTRST_MASK (0x2000000U) -#define CAN_MCR_SOFTRST_SHIFT (25U) -/*! SOFTRST - * 0b1..Reset the registers - * 0b0..No reset request - */ -#define CAN_MCR_SOFTRST(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SOFTRST_SHIFT)) & CAN_MCR_SOFTRST_MASK) - -#define CAN_MCR_WAKMSK_MASK (0x4000000U) -#define CAN_MCR_WAKMSK_SHIFT (26U) -/*! WAKMSK - * 0b1..Wake Up Interrupt is enabled - * 0b0..Wake Up Interrupt is disabled - */ -#define CAN_MCR_WAKMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WAKMSK_SHIFT)) & CAN_MCR_WAKMSK_MASK) - -#define CAN_MCR_NOTRDY_MASK (0x8000000U) -#define CAN_MCR_NOTRDY_SHIFT (27U) -/*! NOTRDY - * 0b1..FLEXCAN module is either in Disable Mode, Stop Mode or Freeze Mode - * 0b0..FLEXCAN module is either in Normal Mode, Listen-Only Mode or Loop-Back Mode - */ -#define CAN_MCR_NOTRDY(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_NOTRDY_SHIFT)) & CAN_MCR_NOTRDY_MASK) - -#define CAN_MCR_HALT_MASK (0x10000000U) -#define CAN_MCR_HALT_SHIFT (28U) -/*! HALT - * 0b1..Enters Freeze Mode if the FRZ bit is asserted. - * 0b0..No Freeze Mode request. - */ -#define CAN_MCR_HALT(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_HALT_SHIFT)) & CAN_MCR_HALT_MASK) - -#define CAN_MCR_RFEN_MASK (0x20000000U) -#define CAN_MCR_RFEN_SHIFT (29U) -/*! RFEN - * 0b1..FIFO enabled - * 0b0..FIFO not enabled - */ -#define CAN_MCR_RFEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_RFEN_SHIFT)) & CAN_MCR_RFEN_MASK) - -#define CAN_MCR_FRZ_MASK (0x40000000U) -#define CAN_MCR_FRZ_SHIFT (30U) -/*! FRZ - * 0b1..Enabled to enter Freeze Mode - * 0b0..Not enabled to enter Freeze Mode - */ -#define CAN_MCR_FRZ(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_FRZ_SHIFT)) & CAN_MCR_FRZ_MASK) - -#define CAN_MCR_MDIS_MASK (0x80000000U) -#define CAN_MCR_MDIS_SHIFT (31U) -/*! MDIS - * 0b1..Disable the FLEXCAN module - * 0b0..Enable the FLEXCAN module - */ -#define CAN_MCR_MDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_MDIS_SHIFT)) & CAN_MCR_MDIS_MASK) -/*! @} */ - -/*! @name CTRL1 - Control 1 Register */ -/*! @{ */ - -#define CAN_CTRL1_PROPSEG_MASK (0x7U) -#define CAN_CTRL1_PROPSEG_SHIFT (0U) -#define CAN_CTRL1_PROPSEG(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PROPSEG_SHIFT)) & CAN_CTRL1_PROPSEG_MASK) - -#define CAN_CTRL1_LOM_MASK (0x8U) -#define CAN_CTRL1_LOM_SHIFT (3U) -/*! LOM - * 0b1..FLEXCAN module operates in Listen Only Mode - * 0b0..Listen Only Mode is deactivated - */ -#define CAN_CTRL1_LOM(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LOM_SHIFT)) & CAN_CTRL1_LOM_MASK) - -#define CAN_CTRL1_LBUF_MASK (0x10U) -#define CAN_CTRL1_LBUF_SHIFT (4U) -/*! LBUF - * 0b1..Lowest number buffer is transmitted first - * 0b0..Buffer with highest priority is transmitted first - */ -#define CAN_CTRL1_LBUF(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LBUF_SHIFT)) & CAN_CTRL1_LBUF_MASK) - -#define CAN_CTRL1_TSYN_MASK (0x20U) -#define CAN_CTRL1_TSYN_SHIFT (5U) -/*! TSYN - * 0b1..Timer Sync feature enabled - * 0b0..Timer Sync feature disabled - */ -#define CAN_CTRL1_TSYN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_TSYN_SHIFT)) & CAN_CTRL1_TSYN_MASK) - -#define CAN_CTRL1_BOFFREC_MASK (0x40U) -#define CAN_CTRL1_BOFFREC_SHIFT (6U) -/*! BOFFREC - * 0b1..Automatic recovering from Bus Off state disabled - * 0b0..Automatic recovering from Bus Off state enabled, according to CAN Spec 2.0 part B - */ -#define CAN_CTRL1_BOFFREC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_BOFFREC_SHIFT)) & CAN_CTRL1_BOFFREC_MASK) - -#define CAN_CTRL1_SMP_MASK (0x80U) -#define CAN_CTRL1_SMP_SHIFT (7U) -/*! SMP - * 0b1..Three samples are used to determine the value of the received bit: the regular one (sample point) and 2 - * preceding samples, a majority rule is used - * 0b0..Just one sample is used to determine the bit value - */ -#define CAN_CTRL1_SMP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_SMP_SHIFT)) & CAN_CTRL1_SMP_MASK) - -#define CAN_CTRL1_RWRNMSK_MASK (0x400U) -#define CAN_CTRL1_RWRNMSK_SHIFT (10U) -/*! RWRNMSK - * 0b1..Rx Warning Interrupt enabled - * 0b0..Rx Warning Interrupt disabled - */ -#define CAN_CTRL1_RWRNMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_RWRNMSK_SHIFT)) & CAN_CTRL1_RWRNMSK_MASK) - -#define CAN_CTRL1_TWRNMSK_MASK (0x800U) -#define CAN_CTRL1_TWRNMSK_SHIFT (11U) -/*! TWRNMSK - * 0b1..Tx Warning Interrupt enabled - * 0b0..Tx Warning Interrupt disabled - */ -#define CAN_CTRL1_TWRNMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_TWRNMSK_SHIFT)) & CAN_CTRL1_TWRNMSK_MASK) - -#define CAN_CTRL1_LPB_MASK (0x1000U) -#define CAN_CTRL1_LPB_SHIFT (12U) -/*! LPB - * 0b1..Loop Back enabled - * 0b0..Loop Back disabled - */ -#define CAN_CTRL1_LPB(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LPB_SHIFT)) & CAN_CTRL1_LPB_MASK) - -#define CAN_CTRL1_ERRMSK_MASK (0x4000U) -#define CAN_CTRL1_ERRMSK_SHIFT (14U) -/*! ERRMSK - * 0b1..Error interrupt enabled - * 0b0..Error interrupt disabled - */ -#define CAN_CTRL1_ERRMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_ERRMSK_SHIFT)) & CAN_CTRL1_ERRMSK_MASK) - -#define CAN_CTRL1_BOFFMSK_MASK (0x8000U) -#define CAN_CTRL1_BOFFMSK_SHIFT (15U) -/*! BOFFMSK - * 0b1..Bus Off interrupt enabled - * 0b0..Bus Off interrupt disabled - */ -#define CAN_CTRL1_BOFFMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_BOFFMSK_SHIFT)) & CAN_CTRL1_BOFFMSK_MASK) - -#define CAN_CTRL1_PSEG2_MASK (0x70000U) -#define CAN_CTRL1_PSEG2_SHIFT (16U) -#define CAN_CTRL1_PSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PSEG2_SHIFT)) & CAN_CTRL1_PSEG2_MASK) - -#define CAN_CTRL1_PSEG1_MASK (0x380000U) -#define CAN_CTRL1_PSEG1_SHIFT (19U) -#define CAN_CTRL1_PSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PSEG1_SHIFT)) & CAN_CTRL1_PSEG1_MASK) - -#define CAN_CTRL1_RJW_MASK (0xC00000U) -#define CAN_CTRL1_RJW_SHIFT (22U) -#define CAN_CTRL1_RJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_RJW_SHIFT)) & CAN_CTRL1_RJW_MASK) - -#define CAN_CTRL1_PRESDIV_MASK (0xFF000000U) -#define CAN_CTRL1_PRESDIV_SHIFT (24U) -#define CAN_CTRL1_PRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PRESDIV_SHIFT)) & CAN_CTRL1_PRESDIV_MASK) -/*! @} */ - -/*! @name TIMER - Free Running Timer Register */ -/*! @{ */ - -#define CAN_TIMER_TIMER_MASK (0xFFFFU) -#define CAN_TIMER_TIMER_SHIFT (0U) -#define CAN_TIMER_TIMER(x) (((uint32_t)(((uint32_t)(x)) << CAN_TIMER_TIMER_SHIFT)) & CAN_TIMER_TIMER_MASK) -/*! @} */ - -/*! @name RXMGMASK - Rx Mailboxes Global Mask Register */ -/*! @{ */ - -#define CAN_RXMGMASK_MG_MASK (0xFFFFFFFFU) -#define CAN_RXMGMASK_MG_SHIFT (0U) -/*! MG - * 0b00000000000000000000000000000001..The corresponding bit in the filter is checked against the one received - * 0b00000000000000000000000000000000..the corresponding bit in the filter is "don't care" - */ -#define CAN_RXMGMASK_MG(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXMGMASK_MG_SHIFT)) & CAN_RXMGMASK_MG_MASK) -/*! @} */ - -/*! @name RX14MASK - Rx Buffer 14 Mask Register */ -/*! @{ */ - -#define CAN_RX14MASK_RX14M_MASK (0xFFFFFFFFU) -#define CAN_RX14MASK_RX14M_SHIFT (0U) -/*! RX14M - * 0b00000000000000000000000000000001..The corresponding bit in the filter is checked - * 0b00000000000000000000000000000000..the corresponding bit in the filter is "don't care" - */ -#define CAN_RX14MASK_RX14M(x) (((uint32_t)(((uint32_t)(x)) << CAN_RX14MASK_RX14M_SHIFT)) & CAN_RX14MASK_RX14M_MASK) -/*! @} */ - -/*! @name RX15MASK - Rx Buffer 15 Mask Register */ -/*! @{ */ - -#define CAN_RX15MASK_RX15M_MASK (0xFFFFFFFFU) -#define CAN_RX15MASK_RX15M_SHIFT (0U) -/*! RX15M - * 0b00000000000000000000000000000001..The corresponding bit in the filter is checked - * 0b00000000000000000000000000000000..the corresponding bit in the filter is "don't care" - */ -#define CAN_RX15MASK_RX15M(x) (((uint32_t)(((uint32_t)(x)) << CAN_RX15MASK_RX15M_SHIFT)) & CAN_RX15MASK_RX15M_MASK) -/*! @} */ - -/*! @name ECR - Error Counter Register */ -/*! @{ */ - -#define CAN_ECR_TX_ERR_COUNTER_MASK (0xFFU) -#define CAN_ECR_TX_ERR_COUNTER_SHIFT (0U) -#define CAN_ECR_TX_ERR_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_TX_ERR_COUNTER_SHIFT)) & CAN_ECR_TX_ERR_COUNTER_MASK) - -#define CAN_ECR_RX_ERR_COUNTER_MASK (0xFF00U) -#define CAN_ECR_RX_ERR_COUNTER_SHIFT (8U) -#define CAN_ECR_RX_ERR_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_RX_ERR_COUNTER_SHIFT)) & CAN_ECR_RX_ERR_COUNTER_MASK) -/*! @} */ - -/*! @name ESR1 - Error and Status 1 Register */ -/*! @{ */ - -#define CAN_ESR1_WAKINT_MASK (0x1U) -#define CAN_ESR1_WAKINT_SHIFT (0U) -/*! WAKINT - * 0b1..Indicates a recessive to dominant transition received on the CAN bus when the FLEXCAN module is in Stop Mode - * 0b0..No such occurrence - */ -#define CAN_ESR1_WAKINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_WAKINT_SHIFT)) & CAN_ESR1_WAKINT_MASK) - -#define CAN_ESR1_ERRINT_MASK (0x2U) -#define CAN_ESR1_ERRINT_SHIFT (1U) -/*! ERRINT - * 0b1..Indicates setting of any Error Bit in the Error and Status Register - * 0b0..No such occurrence - */ -#define CAN_ESR1_ERRINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ERRINT_SHIFT)) & CAN_ESR1_ERRINT_MASK) - -#define CAN_ESR1_BOFFINT_MASK (0x4U) -#define CAN_ESR1_BOFFINT_SHIFT (2U) -/*! BOFFINT - * 0b1..FLEXCAN module entered 'Bus Off' state - * 0b0..No such occurrence - */ -#define CAN_ESR1_BOFFINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BOFFINT_SHIFT)) & CAN_ESR1_BOFFINT_MASK) - -#define CAN_ESR1_RX_MASK (0x8U) -#define CAN_ESR1_RX_SHIFT (3U) -/*! RX - * 0b1..FLEXCAN is transmitting a message - * 0b0..FLEXCAN is receiving a message - */ -#define CAN_ESR1_RX(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RX_SHIFT)) & CAN_ESR1_RX_MASK) - -#define CAN_ESR1_FLTCONF_MASK (0x30U) -#define CAN_ESR1_FLTCONF_SHIFT (4U) -/*! FLTCONF - * 0b00..Error Active - * 0b01..Error Passive - * 0b1x..Bus off - */ -#define CAN_ESR1_FLTCONF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_FLTCONF_SHIFT)) & CAN_ESR1_FLTCONF_MASK) - -#define CAN_ESR1_TX_MASK (0x40U) -#define CAN_ESR1_TX_SHIFT (6U) -/*! TX - * 0b1..FLEXCAN is transmitting a message - * 0b0..FLEXCAN is receiving a message - */ -#define CAN_ESR1_TX(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TX_SHIFT)) & CAN_ESR1_TX_MASK) - -#define CAN_ESR1_IDLE_MASK (0x80U) -#define CAN_ESR1_IDLE_SHIFT (7U) -/*! IDLE - * 0b1..CAN bus is now IDLE - * 0b0..No such occurrence - */ -#define CAN_ESR1_IDLE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_IDLE_SHIFT)) & CAN_ESR1_IDLE_MASK) - -#define CAN_ESR1_RXWRN_MASK (0x100U) -#define CAN_ESR1_RXWRN_SHIFT (8U) -/*! RXWRN - * 0b1..Rx_Err_Counter >= 96 - * 0b0..No such occurrence - */ -#define CAN_ESR1_RXWRN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RXWRN_SHIFT)) & CAN_ESR1_RXWRN_MASK) - -#define CAN_ESR1_TXWRN_MASK (0x200U) -#define CAN_ESR1_TXWRN_SHIFT (9U) -/*! TXWRN - * 0b1..TX_Err_Counter >= 96 - * 0b0..No such occurrence - */ -#define CAN_ESR1_TXWRN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TXWRN_SHIFT)) & CAN_ESR1_TXWRN_MASK) - -#define CAN_ESR1_STFERR_MASK (0x400U) -#define CAN_ESR1_STFERR_SHIFT (10U) -/*! STFERR - * 0b1..A Stuffing Error occurred since last read of this register. - * 0b0..No such occurrence. - */ -#define CAN_ESR1_STFERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_STFERR_SHIFT)) & CAN_ESR1_STFERR_MASK) - -#define CAN_ESR1_FRMERR_MASK (0x800U) -#define CAN_ESR1_FRMERR_SHIFT (11U) -/*! FRMERR - * 0b1..A Form Error occurred since last read of this register - * 0b0..No such occurrence - */ -#define CAN_ESR1_FRMERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_FRMERR_SHIFT)) & CAN_ESR1_FRMERR_MASK) - -#define CAN_ESR1_CRCERR_MASK (0x1000U) -#define CAN_ESR1_CRCERR_SHIFT (12U) -/*! CRCERR - * 0b1..A CRC error occurred since last read of this register. - * 0b0..No such occurrence - */ -#define CAN_ESR1_CRCERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_CRCERR_SHIFT)) & CAN_ESR1_CRCERR_MASK) - -#define CAN_ESR1_ACKERR_MASK (0x2000U) -#define CAN_ESR1_ACKERR_SHIFT (13U) -/*! ACKERR - * 0b1..An ACK error occurred since last read of this register - * 0b0..No such occurrence - */ -#define CAN_ESR1_ACKERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ACKERR_SHIFT)) & CAN_ESR1_ACKERR_MASK) - -#define CAN_ESR1_BIT0ERR_MASK (0x4000U) -#define CAN_ESR1_BIT0ERR_SHIFT (14U) -/*! BIT0ERR - * 0b1..At least one bit sent as dominant is received as recessive - * 0b0..No such occurrence - */ -#define CAN_ESR1_BIT0ERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT0ERR_SHIFT)) & CAN_ESR1_BIT0ERR_MASK) - -#define CAN_ESR1_BIT1ERR_MASK (0x8000U) -#define CAN_ESR1_BIT1ERR_SHIFT (15U) -/*! BIT1ERR - * 0b1..At least one bit sent as recessive is received as dominant - * 0b0..No such occurrence - */ -#define CAN_ESR1_BIT1ERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT1ERR_SHIFT)) & CAN_ESR1_BIT1ERR_MASK) - -#define CAN_ESR1_RWRNINT_MASK (0x10000U) -#define CAN_ESR1_RWRNINT_SHIFT (16U) -/*! RWRNINT - * 0b1..The Rx error counter transition from < 96 to >= 96 - * 0b0..No such occurrence - */ -#define CAN_ESR1_RWRNINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RWRNINT_SHIFT)) & CAN_ESR1_RWRNINT_MASK) - -#define CAN_ESR1_TWRNINT_MASK (0x20000U) -#define CAN_ESR1_TWRNINT_SHIFT (17U) -/*! TWRNINT - * 0b1..The Tx error counter transition from < 96 to >= 96 - * 0b0..No such occurrence - */ -#define CAN_ESR1_TWRNINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TWRNINT_SHIFT)) & CAN_ESR1_TWRNINT_MASK) - -#define CAN_ESR1_SYNCH_MASK (0x40000U) -#define CAN_ESR1_SYNCH_SHIFT (18U) -/*! SYNCH - * 0b1..FlexCAN is synchronized to the CAN bus - * 0b0..FlexCAN is not synchronized to the CAN bus - */ -#define CAN_ESR1_SYNCH(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_SYNCH_SHIFT)) & CAN_ESR1_SYNCH_MASK) -/*! @} */ - -/*! @name IMASK2 - Interrupt Masks 2 Register */ -/*! @{ */ - -#define CAN_IMASK2_BUFHM_MASK (0xFFFFFFFFU) -#define CAN_IMASK2_BUFHM_SHIFT (0U) -/*! BUFHM - * 0b00000000000000000000000000000001..The corresponding buffer Interrupt is enabled - * 0b00000000000000000000000000000000..The corresponding buffer Interrupt is disabled - */ -#define CAN_IMASK2_BUFHM(x) (((uint32_t)(((uint32_t)(x)) << CAN_IMASK2_BUFHM_SHIFT)) & CAN_IMASK2_BUFHM_MASK) -/*! @} */ - -/*! @name IMASK1 - Interrupt Masks 1 Register */ -/*! @{ */ - -#define CAN_IMASK1_BUFLM_MASK (0xFFFFFFFFU) -#define CAN_IMASK1_BUFLM_SHIFT (0U) -/*! BUFLM - * 0b00000000000000000000000000000001..The corresponding buffer Interrupt is enabled - * 0b00000000000000000000000000000000..The corresponding buffer Interrupt is disabled - */ -#define CAN_IMASK1_BUFLM(x) (((uint32_t)(((uint32_t)(x)) << CAN_IMASK1_BUFLM_SHIFT)) & CAN_IMASK1_BUFLM_MASK) -/*! @} */ - -/*! @name IFLAG2 - Interrupt Flags 2 Register */ -/*! @{ */ - -#define CAN_IFLAG2_BUFHI_MASK (0xFFFFFFFFU) -#define CAN_IFLAG2_BUFHI_SHIFT (0U) -/*! BUFHI - * 0b00000000000000000000000000000001..The corresponding buffer has successfully completed transmission or reception - * 0b00000000000000000000000000000000..No such occurrence - */ -#define CAN_IFLAG2_BUFHI(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG2_BUFHI_SHIFT)) & CAN_IFLAG2_BUFHI_MASK) -/*! @} */ - -/*! @name IFLAG1 - Interrupt Flags 1 Register */ -/*! @{ */ - -#define CAN_IFLAG1_BUF4TO0I_MASK (0x1FU) -#define CAN_IFLAG1_BUF4TO0I_SHIFT (0U) -/*! BUF4TO0I - * 0b00001..Corresponding MB completed transmission/reception - * 0b00000..No such occurrence - */ -#define CAN_IFLAG1_BUF4TO0I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF4TO0I_SHIFT)) & CAN_IFLAG1_BUF4TO0I_MASK) - -#define CAN_IFLAG1_BUF5I_MASK (0x20U) -#define CAN_IFLAG1_BUF5I_SHIFT (5U) -/*! BUF5I - * 0b1..MB5 completed transmission/reception or frames available in the FIFO - * 0b0..No such occurrence - */ -#define CAN_IFLAG1_BUF5I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF5I_SHIFT)) & CAN_IFLAG1_BUF5I_MASK) - -#define CAN_IFLAG1_BUF6I_MASK (0x40U) -#define CAN_IFLAG1_BUF6I_SHIFT (6U) -/*! BUF6I - * 0b1..MB6 completed transmission/reception or FIFO almost full - * 0b0..No such occurrence - */ -#define CAN_IFLAG1_BUF6I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF6I_SHIFT)) & CAN_IFLAG1_BUF6I_MASK) - -#define CAN_IFLAG1_BUF7I_MASK (0x80U) -#define CAN_IFLAG1_BUF7I_SHIFT (7U) -/*! BUF7I - * 0b1..MB7 completed transmission/reception or FIFO overflow - * 0b0..No such occurrence - */ -#define CAN_IFLAG1_BUF7I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF7I_SHIFT)) & CAN_IFLAG1_BUF7I_MASK) - -#define CAN_IFLAG1_BUF31TO8I_MASK (0xFFFFFF00U) -#define CAN_IFLAG1_BUF31TO8I_SHIFT (8U) -/*! BUF31TO8I - * 0b000000000000000000000001..The corresponding MB has successfully completed transmission or reception - * 0b000000000000000000000000..No such occurrence - */ -#define CAN_IFLAG1_BUF31TO8I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF31TO8I_SHIFT)) & CAN_IFLAG1_BUF31TO8I_MASK) -/*! @} */ - -/*! @name CTRL2 - Control 2 Register */ -/*! @{ */ - -#define CAN_CTRL2_EACEN_MASK (0x10000U) -#define CAN_CTRL2_EACEN_SHIFT (16U) -/*! EACEN - * 0b1..Enables the comparison of both Rx Mailbox filter's IDE and RTR bit with their corresponding bits within - * the incoming frame. Mask bits do apply. - * 0b0..Rx Mailbox filter's IDE bit is always compared and RTR is never compared despite mask bits. - */ -#define CAN_CTRL2_EACEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_EACEN_SHIFT)) & CAN_CTRL2_EACEN_MASK) - -#define CAN_CTRL2_RRS_MASK (0x20000U) -#define CAN_CTRL2_RRS_SHIFT (17U) -/*! RRS - * 0b1..Remote Request Frame is stored - * 0b0..Remote Response Frame is generated - */ -#define CAN_CTRL2_RRS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_RRS_SHIFT)) & CAN_CTRL2_RRS_MASK) - -#define CAN_CTRL2_MRP_MASK (0x40000U) -#define CAN_CTRL2_MRP_SHIFT (18U) -/*! MRP - * 0b1..Matching starts from Mailboxes and continues on Rx FIFO - * 0b0..Matching starts from Rx FIFO and continues on Mailboxes - */ -#define CAN_CTRL2_MRP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_MRP_SHIFT)) & CAN_CTRL2_MRP_MASK) - -#define CAN_CTRL2_TASD_MASK (0xF80000U) -#define CAN_CTRL2_TASD_SHIFT (19U) -#define CAN_CTRL2_TASD(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_TASD_SHIFT)) & CAN_CTRL2_TASD_MASK) - -#define CAN_CTRL2_RFFN_MASK (0xF000000U) -#define CAN_CTRL2_RFFN_SHIFT (24U) -#define CAN_CTRL2_RFFN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_RFFN_SHIFT)) & CAN_CTRL2_RFFN_MASK) - -#define CAN_CTRL2_WRMFRZ_MASK (0x10000000U) -#define CAN_CTRL2_WRMFRZ_SHIFT (28U) -/*! WRMFRZ - * 0b1..Enable unrestricted write access to FlexCAN memory - * 0b0..Keep the write access restricted in some regions of FlexCAN memory - */ -#define CAN_CTRL2_WRMFRZ(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_WRMFRZ_SHIFT)) & CAN_CTRL2_WRMFRZ_MASK) -/*! @} */ - -/*! @name ESR2 - Error and Status 2 Register */ -/*! @{ */ - -#define CAN_ESR2_IMB_MASK (0x2000U) -#define CAN_ESR2_IMB_SHIFT (13U) -/*! IMB - * 0b1..If ESR2[VPS] is asserted, there is at least one inactive Mailbox. LPTM content is the number of the first one. - * 0b0..If ESR2[VPS] is asserted, the ESR2[LPTM] is not an inactive Mailbox. - */ -#define CAN_ESR2_IMB(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_IMB_SHIFT)) & CAN_ESR2_IMB_MASK) - -#define CAN_ESR2_VPS_MASK (0x4000U) -#define CAN_ESR2_VPS_SHIFT (14U) -/*! VPS - * 0b1..Contents of IMB and LPTM are valid - * 0b0..Contents of IMB and LPTM are invalid - */ -#define CAN_ESR2_VPS(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_VPS_SHIFT)) & CAN_ESR2_VPS_MASK) - -#define CAN_ESR2_LPTM_MASK (0x7F0000U) -#define CAN_ESR2_LPTM_SHIFT (16U) -#define CAN_ESR2_LPTM(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_LPTM_SHIFT)) & CAN_ESR2_LPTM_MASK) -/*! @} */ - -/*! @name CRCR - CRC Register */ -/*! @{ */ - -#define CAN_CRCR_TXCRC_MASK (0x7FFFU) -#define CAN_CRCR_TXCRC_SHIFT (0U) -#define CAN_CRCR_TXCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CRCR_TXCRC_SHIFT)) & CAN_CRCR_TXCRC_MASK) - -#define CAN_CRCR_MBCRC_MASK (0x7F0000U) -#define CAN_CRCR_MBCRC_SHIFT (16U) -#define CAN_CRCR_MBCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CRCR_MBCRC_SHIFT)) & CAN_CRCR_MBCRC_MASK) -/*! @} */ - -/*! @name RXFGMASK - Rx FIFO Global Mask Register */ -/*! @{ */ - -#define CAN_RXFGMASK_FGM_MASK (0xFFFFFFFFU) -#define CAN_RXFGMASK_FGM_SHIFT (0U) -/*! FGM - * 0b00000000000000000000000000000001..The corresponding bit in the filter is checked - * 0b00000000000000000000000000000000..The corresponding bit in the filter is "don't care" - */ -#define CAN_RXFGMASK_FGM(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXFGMASK_FGM_SHIFT)) & CAN_RXFGMASK_FGM_MASK) -/*! @} */ - -/*! @name RXFIR - Rx FIFO Information Register */ -/*! @{ */ - -#define CAN_RXFIR_IDHIT_MASK (0x1FFU) -#define CAN_RXFIR_IDHIT_SHIFT (0U) -#define CAN_RXFIR_IDHIT(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXFIR_IDHIT_SHIFT)) & CAN_RXFIR_IDHIT_MASK) -/*! @} */ - -/*! @name DBG1 - Debug 1 register */ -/*! @{ */ - -#define CAN_DBG1_CFSM_MASK (0x3FU) -#define CAN_DBG1_CFSM_SHIFT (0U) -/*! CFSM - CAN Finite State Machine - */ -#define CAN_DBG1_CFSM(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG1_CFSM_SHIFT)) & CAN_DBG1_CFSM_MASK) - -#define CAN_DBG1_CBN_MASK (0x1F000000U) -#define CAN_DBG1_CBN_SHIFT (24U) -/*! CBN - CAN Bit Number - */ -#define CAN_DBG1_CBN(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG1_CBN_SHIFT)) & CAN_DBG1_CBN_MASK) -/*! @} */ - -/*! @name DBG2 - Debug 2 register */ -/*! @{ */ - -#define CAN_DBG2_RMP_MASK (0x7FU) -#define CAN_DBG2_RMP_SHIFT (0U) -/*! RMP - Rx Matching Pointer - */ -#define CAN_DBG2_RMP(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG2_RMP_SHIFT)) & CAN_DBG2_RMP_MASK) - -#define CAN_DBG2_MPP_MASK (0x80U) -#define CAN_DBG2_MPP_SHIFT (7U) -/*! MPP - Matching Process in Progress - * 0b0..No matching process ongoing. - * 0b1..Matching process is in progress. - */ -#define CAN_DBG2_MPP(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG2_MPP_SHIFT)) & CAN_DBG2_MPP_MASK) - -#define CAN_DBG2_TAP_MASK (0x7F00U) -#define CAN_DBG2_TAP_SHIFT (8U) -/*! TAP - Tx Arbitration Pointer - */ -#define CAN_DBG2_TAP(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG2_TAP_SHIFT)) & CAN_DBG2_TAP_MASK) - -#define CAN_DBG2_APP_MASK (0x8000U) -#define CAN_DBG2_APP_SHIFT (15U) -/*! APP - Arbitration Process in Progress - * 0b0..No matching process ongoing. - * 0b1..Matching process is in progress. - */ -#define CAN_DBG2_APP(x) (((uint32_t)(((uint32_t)(x)) << CAN_DBG2_APP_SHIFT)) & CAN_DBG2_APP_MASK) -/*! @} */ - -/*! @name CS - Message Buffer 0 CS Register..Message Buffer 63 CS Register */ -/*! @{ */ - -#define CAN_CS_TIME_STAMP_MASK (0xFFFFU) -#define CAN_CS_TIME_STAMP_SHIFT (0U) -/*! TIME_STAMP - Free-Running Counter Time stamp. This 16-bit field is a copy of the Free-Running - * Timer, captured for Tx and Rx frames at the time when the beginning of the Identifier field - * appears on the CAN bus. - */ -#define CAN_CS_TIME_STAMP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_TIME_STAMP_SHIFT)) & CAN_CS_TIME_STAMP_MASK) - -#define CAN_CS_DLC_MASK (0xF0000U) -#define CAN_CS_DLC_SHIFT (16U) -/*! DLC - Length of the data to be stored/transmitted. - */ -#define CAN_CS_DLC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_DLC_SHIFT)) & CAN_CS_DLC_MASK) - -#define CAN_CS_RTR_MASK (0x100000U) -#define CAN_CS_RTR_SHIFT (20U) -/*! RTR - Remote Transmission Request. One/zero for remote/data frame. - */ -#define CAN_CS_RTR(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_RTR_SHIFT)) & CAN_CS_RTR_MASK) - -#define CAN_CS_IDE_MASK (0x200000U) -#define CAN_CS_IDE_SHIFT (21U) -/*! IDE - ID Extended. One/zero for extended/standard format frame. - */ -#define CAN_CS_IDE(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_IDE_SHIFT)) & CAN_CS_IDE_MASK) - -#define CAN_CS_SRR_MASK (0x400000U) -#define CAN_CS_SRR_SHIFT (22U) -/*! SRR - Substitute Remote Request. Contains a fixed recessive bit. - */ -#define CAN_CS_SRR(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_SRR_SHIFT)) & CAN_CS_SRR_MASK) - -#define CAN_CS_CODE_MASK (0xF000000U) -#define CAN_CS_CODE_SHIFT (24U) -/*! CODE - Reserved - */ -#define CAN_CS_CODE(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_CODE_SHIFT)) & CAN_CS_CODE_MASK) -/*! @} */ - -/* The count of CAN_CS */ -#define CAN_CS_COUNT (64U) - -/*! @name ID - Message Buffer 0 ID Register..Message Buffer 63 ID Register */ -/*! @{ */ - -#define CAN_ID_EXT_MASK (0x3FFFFU) -#define CAN_ID_EXT_SHIFT (0U) -/*! EXT - Contains extended (LOW word) identifier of message buffer. - */ -#define CAN_ID_EXT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_EXT_SHIFT)) & CAN_ID_EXT_MASK) - -#define CAN_ID_STD_MASK (0x1FFC0000U) -#define CAN_ID_STD_SHIFT (18U) -/*! STD - Contains standard/extended (HIGH word) identifier of message buffer. - */ -#define CAN_ID_STD(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK) - -#define CAN_ID_PRIO_MASK (0xE0000000U) -#define CAN_ID_PRIO_SHIFT (29U) -/*! PRIO - Local priority. This 3-bit fieldis only used when LPRIO_EN bit is set in MCR and it only - * makes sense for Tx buffers. These bits are not transmitted. They are appended to the regular - * ID to define the transmission priority. - */ -#define CAN_ID_PRIO(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_PRIO_SHIFT)) & CAN_ID_PRIO_MASK) -/*! @} */ - -/* The count of CAN_ID */ -#define CAN_ID_COUNT (64U) - -/*! @name WORD0 - Message Buffer 0 WORD0 Register..Message Buffer 63 WORD0 Register */ -/*! @{ */ - -#define CAN_WORD0_DATA_BYTE_3_MASK (0xFFU) -#define CAN_WORD0_DATA_BYTE_3_SHIFT (0U) -/*! DATA_BYTE_3 - Data byte 3 of Rx/Tx frame. - */ -#define CAN_WORD0_DATA_BYTE_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_3_SHIFT)) & CAN_WORD0_DATA_BYTE_3_MASK) - -#define CAN_WORD0_DATA_BYTE_2_MASK (0xFF00U) -#define CAN_WORD0_DATA_BYTE_2_SHIFT (8U) -/*! DATA_BYTE_2 - Data byte 2 of Rx/Tx frame. - */ -#define CAN_WORD0_DATA_BYTE_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_2_SHIFT)) & CAN_WORD0_DATA_BYTE_2_MASK) - -#define CAN_WORD0_DATA_BYTE_1_MASK (0xFF0000U) -#define CAN_WORD0_DATA_BYTE_1_SHIFT (16U) -/*! DATA_BYTE_1 - Data byte 1 of Rx/Tx frame. - */ -#define CAN_WORD0_DATA_BYTE_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_1_SHIFT)) & CAN_WORD0_DATA_BYTE_1_MASK) - -#define CAN_WORD0_DATA_BYTE_0_MASK (0xFF000000U) -#define CAN_WORD0_DATA_BYTE_0_SHIFT (24U) -/*! DATA_BYTE_0 - Data byte 0 of Rx/Tx frame. - */ -#define CAN_WORD0_DATA_BYTE_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_0_SHIFT)) & CAN_WORD0_DATA_BYTE_0_MASK) -/*! @} */ - -/* The count of CAN_WORD0 */ -#define CAN_WORD0_COUNT (64U) - -/*! @name WORD1 - Message Buffer 0 WORD1 Register..Message Buffer 63 WORD1 Register */ -/*! @{ */ - -#define CAN_WORD1_DATA_BYTE_7_MASK (0xFFU) -#define CAN_WORD1_DATA_BYTE_7_SHIFT (0U) -/*! DATA_BYTE_7 - Data byte 7 of Rx/Tx frame. - */ -#define CAN_WORD1_DATA_BYTE_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_7_SHIFT)) & CAN_WORD1_DATA_BYTE_7_MASK) - -#define CAN_WORD1_DATA_BYTE_6_MASK (0xFF00U) -#define CAN_WORD1_DATA_BYTE_6_SHIFT (8U) -/*! DATA_BYTE_6 - Data byte 6 of Rx/Tx frame. - */ -#define CAN_WORD1_DATA_BYTE_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_6_SHIFT)) & CAN_WORD1_DATA_BYTE_6_MASK) - -#define CAN_WORD1_DATA_BYTE_5_MASK (0xFF0000U) -#define CAN_WORD1_DATA_BYTE_5_SHIFT (16U) -/*! DATA_BYTE_5 - Data byte 5 of Rx/Tx frame. - */ -#define CAN_WORD1_DATA_BYTE_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_5_SHIFT)) & CAN_WORD1_DATA_BYTE_5_MASK) - -#define CAN_WORD1_DATA_BYTE_4_MASK (0xFF000000U) -#define CAN_WORD1_DATA_BYTE_4_SHIFT (24U) -/*! DATA_BYTE_4 - Data byte 4 of Rx/Tx frame. - */ -#define CAN_WORD1_DATA_BYTE_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_4_SHIFT)) & CAN_WORD1_DATA_BYTE_4_MASK) -/*! @} */ - -/* The count of CAN_WORD1 */ -#define CAN_WORD1_COUNT (64U) - -/*! @name RXIMR - Rx Individual Mask Registers */ -/*! @{ */ - -#define CAN_RXIMR_MI_MASK (0xFFFFFFFFU) -#define CAN_RXIMR_MI_SHIFT (0U) -/*! MI - * 0b00000000000000000000000000000001..The corresponding bit in the filter is checked - * 0b00000000000000000000000000000000..the corresponding bit in the filter is "don't care" - */ -#define CAN_RXIMR_MI(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXIMR_MI_SHIFT)) & CAN_RXIMR_MI_MASK) -/*! @} */ - -/* The count of CAN_RXIMR */ -#define CAN_RXIMR_COUNT (64U) - -/*! @name GFWR - Glitch Filter Width Registers */ -/*! @{ */ - -#define CAN_GFWR_GFWR_MASK (0xFFU) -#define CAN_GFWR_GFWR_SHIFT (0U) -#define CAN_GFWR_GFWR(x) (((uint32_t)(((uint32_t)(x)) << CAN_GFWR_GFWR_SHIFT)) & CAN_GFWR_GFWR_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CAN_Register_Masks */ - - -/* CAN - Peripheral instance base addresses */ -/** Peripheral CAN1 base address */ -#define CAN1_BASE (0x401D0000u) -/** Peripheral CAN1 base pointer */ -#define CAN1 ((CAN_Type *)CAN1_BASE) -/** Peripheral CAN2 base address */ -#define CAN2_BASE (0x401D4000u) -/** Peripheral CAN2 base pointer */ -#define CAN2 ((CAN_Type *)CAN2_BASE) -/** Array initializer of CAN peripheral base addresses */ -#define CAN_BASE_ADDRS { 0u, CAN1_BASE, CAN2_BASE } -/** Array initializer of CAN peripheral base pointers */ -#define CAN_BASE_PTRS { (CAN_Type *)0u, CAN1, CAN2 } -/** Interrupt vectors for the CAN peripheral type */ -#define CAN_Rx_Warning_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -#define CAN_Tx_Warning_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -#define CAN_Wake_Up_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -#define CAN_Error_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -#define CAN_Bus_Off_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -#define CAN_ORed_Message_buffer_IRQS { NotAvail_IRQn, CAN1_IRQn, CAN2_IRQn } -/* Backward compatibility */ -#define CAN_ECR_TXERRCNT_MASK CAN_ECR_TX_ERR_COUNTER_MASK -#define CAN_ECR_TXERRCNT_SHIFT CAN_ECR_TX_ERR_COUNTER_SHIFT -#define CAN_ECR_TXERRCNT(x) CAN_ECR_TX_ERR_COUNTER(x) -#define CAN_ECR_RXERRCNT_MASK CAN_ECR_RX_ERR_COUNTER_MASK -#define CAN_ECR_RXERRCNT_SHIFT CAN_ECR_RX_ERR_COUNTER_SHIFT -#define CAN_ECR_RXERRCNT(x) CAN_ECR_RX_ERR_COUNTER(x) - - -/*! - * @} - */ /* end of group CAN_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CCM Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CCM_Peripheral_Access_Layer CCM Peripheral Access Layer - * @{ - */ - -/** CCM - Register Layout Typedef */ -typedef struct { - __IO uint32_t CCR; /**< CCM Control Register, offset: 0x0 */ - uint8_t RESERVED_0[4]; - __I uint32_t CSR; /**< CCM Status Register, offset: 0x8 */ - __IO uint32_t CCSR; /**< CCM Clock Switcher Register, offset: 0xC */ - __IO uint32_t CACRR; /**< CCM Arm Clock Root Register, offset: 0x10 */ - __IO uint32_t CBCDR; /**< CCM Bus Clock Divider Register, offset: 0x14 */ - __IO uint32_t CBCMR; /**< CCM Bus Clock Multiplexer Register, offset: 0x18 */ - __IO uint32_t CSCMR1; /**< CCM Serial Clock Multiplexer Register 1, offset: 0x1C */ - __IO uint32_t CSCMR2; /**< CCM Serial Clock Multiplexer Register 2, offset: 0x20 */ - __IO uint32_t CSCDR1; /**< CCM Serial Clock Divider Register 1, offset: 0x24 */ - __IO uint32_t CS1CDR; /**< CCM Clock Divider Register, offset: 0x28 */ - __IO uint32_t CS2CDR; /**< CCM Clock Divider Register, offset: 0x2C */ - __IO uint32_t CDCDR; /**< CCM D1 Clock Divider Register, offset: 0x30 */ - uint8_t RESERVED_1[4]; - __IO uint32_t CSCDR2; /**< CCM Serial Clock Divider Register 2, offset: 0x38 */ - __IO uint32_t CSCDR3; /**< CCM Serial Clock Divider Register 3, offset: 0x3C */ - uint8_t RESERVED_2[8]; - __I uint32_t CDHIPR; /**< CCM Divider Handshake In-Process Register, offset: 0x48 */ - uint8_t RESERVED_3[8]; - __IO uint32_t CLPCR; /**< CCM Low Power Control Register, offset: 0x54 */ - __IO uint32_t CISR; /**< CCM Interrupt Status Register, offset: 0x58 */ - __IO uint32_t CIMR; /**< CCM Interrupt Mask Register, offset: 0x5C */ - __IO uint32_t CCOSR; /**< CCM Clock Output Source Register, offset: 0x60 */ - __IO uint32_t CGPR; /**< CCM General Purpose Register, offset: 0x64 */ - __IO uint32_t CCGR0; /**< CCM Clock Gating Register 0, offset: 0x68 */ - __IO uint32_t CCGR1; /**< CCM Clock Gating Register 1, offset: 0x6C */ - __IO uint32_t CCGR2; /**< CCM Clock Gating Register 2, offset: 0x70 */ - __IO uint32_t CCGR3; /**< CCM Clock Gating Register 3, offset: 0x74 */ - __IO uint32_t CCGR4; /**< CCM Clock Gating Register 4, offset: 0x78 */ - __IO uint32_t CCGR5; /**< CCM Clock Gating Register 5, offset: 0x7C */ - __IO uint32_t CCGR6; /**< CCM Clock Gating Register 6, offset: 0x80 */ - uint8_t RESERVED_4[4]; - __IO uint32_t CMEOR; /**< CCM Module Enable Overide Register, offset: 0x88 */ -} CCM_Type; - -/* ---------------------------------------------------------------------------- - -- CCM Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CCM_Register_Masks CCM Register Masks - * @{ - */ - -/*! @name CCR - CCM Control Register */ -/*! @{ */ - -#define CCM_CCR_OSCNT_MASK (0xFFU) -#define CCM_CCR_OSCNT_SHIFT (0U) -/*! OSCNT - Oscillator ready counter value. These bits define value of 32KHz counter, that serve as - * counter for oscillator lock time (count to n+1 ckil's). This is used for oscillator lock time. - * Current estimation is ~5ms. This counter will be used in ignition sequence and in wake from - * stop sequence if sbyos bit was defined, to notify that on chip oscillator output is ready for - * the dpll_ip to use and only then the gate in dpll_ip can be opened. - */ -#define CCM_CCR_OSCNT(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCR_OSCNT_SHIFT)) & CCM_CCR_OSCNT_MASK) - -#define CCM_CCR_COSC_EN_MASK (0x1000U) -#define CCM_CCR_COSC_EN_SHIFT (12U) -/*! COSC_EN - * 0b0..disable on chip oscillator - * 0b1..enable on chip oscillator - */ -#define CCM_CCR_COSC_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCR_COSC_EN_SHIFT)) & CCM_CCR_COSC_EN_MASK) - -#define CCM_CCR_REG_BYPASS_COUNT_MASK (0x7E00000U) -#define CCM_CCR_REG_BYPASS_COUNT_SHIFT (21U) -/*! REG_BYPASS_COUNT - * 0b000000..no delay - * 0b000001..1 CKIL clock period delay - * 0b111111..63 CKIL clock periods delay - */ -#define CCM_CCR_REG_BYPASS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCR_REG_BYPASS_COUNT_SHIFT)) & CCM_CCR_REG_BYPASS_COUNT_MASK) - -#define CCM_CCR_RBC_EN_MASK (0x8000000U) -#define CCM_CCR_RBC_EN_SHIFT (27U) -/*! RBC_EN - * 0b1..REG_BYPASS_COUNTER enabled. - * 0b0..REG_BYPASS_COUNTER disabled - */ -#define CCM_CCR_RBC_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCR_RBC_EN_SHIFT)) & CCM_CCR_RBC_EN_MASK) -/*! @} */ - -/*! @name CSR - CCM Status Register */ -/*! @{ */ - -#define CCM_CSR_REF_EN_B_MASK (0x1U) -#define CCM_CSR_REF_EN_B_SHIFT (0U) -/*! REF_EN_B - * 0b0..value of CCM_REF_EN_B is '0' - * 0b1..value of CCM_REF_EN_B is '1' - */ -#define CCM_CSR_REF_EN_B(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSR_REF_EN_B_SHIFT)) & CCM_CSR_REF_EN_B_MASK) - -#define CCM_CSR_CAMP2_READY_MASK (0x8U) -#define CCM_CSR_CAMP2_READY_SHIFT (3U) -/*! CAMP2_READY - * 0b0..CAMP2 is not ready. - * 0b1..CAMP2 is ready. - */ -#define CCM_CSR_CAMP2_READY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSR_CAMP2_READY_SHIFT)) & CCM_CSR_CAMP2_READY_MASK) - -#define CCM_CSR_COSC_READY_MASK (0x20U) -#define CCM_CSR_COSC_READY_SHIFT (5U) -/*! COSC_READY - * 0b0..on board oscillator is not ready. - * 0b1..on board oscillator is ready. - */ -#define CCM_CSR_COSC_READY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSR_COSC_READY_SHIFT)) & CCM_CSR_COSC_READY_MASK) -/*! @} */ - -/*! @name CCSR - CCM Clock Switcher Register */ -/*! @{ */ - -#define CCM_CCSR_PLL3_SW_CLK_SEL_MASK (0x1U) -#define CCM_CCSR_PLL3_SW_CLK_SEL_SHIFT (0U) -/*! PLL3_SW_CLK_SEL - * 0b0..pll3_main_clk - * 0b1..pll3 bypass clock - */ -#define CCM_CCSR_PLL3_SW_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCSR_PLL3_SW_CLK_SEL_SHIFT)) & CCM_CCSR_PLL3_SW_CLK_SEL_MASK) -/*! @} */ - -/*! @name CACRR - CCM Arm Clock Root Register */ -/*! @{ */ - -#define CCM_CACRR_ARM_PODF_MASK (0x7U) -#define CCM_CACRR_ARM_PODF_SHIFT (0U) -/*! ARM_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CACRR_ARM_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CACRR_ARM_PODF_SHIFT)) & CCM_CACRR_ARM_PODF_MASK) -/*! @} */ - -/*! @name CBCDR - CCM Bus Clock Divider Register */ -/*! @{ */ - -#define CCM_CBCDR_SEMC_CLK_SEL_MASK (0x40U) -#define CCM_CBCDR_SEMC_CLK_SEL_SHIFT (6U) -/*! SEMC_CLK_SEL - * 0b0..Periph_clk output will be used as SEMC clock root - * 0b1..SEMC alternative clock will be used as SEMC clock root - */ -#define CCM_CBCDR_SEMC_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_SEMC_CLK_SEL_SHIFT)) & CCM_CBCDR_SEMC_CLK_SEL_MASK) - -#define CCM_CBCDR_SEMC_ALT_CLK_SEL_MASK (0x80U) -#define CCM_CBCDR_SEMC_ALT_CLK_SEL_SHIFT (7U) -/*! SEMC_ALT_CLK_SEL - * 0b0..PLL2 PFD2 will be selected as alternative clock for SEMC root clock - * 0b1..PLL3 PFD1 will be selected as alternative clock for SEMC root clock - */ -#define CCM_CBCDR_SEMC_ALT_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_SEMC_ALT_CLK_SEL_SHIFT)) & CCM_CBCDR_SEMC_ALT_CLK_SEL_MASK) - -#define CCM_CBCDR_IPG_PODF_MASK (0x300U) -#define CCM_CBCDR_IPG_PODF_SHIFT (8U) -/*! IPG_PODF - * 0b00..divide by 1 - * 0b01..divide by 2 - * 0b10..divide by 3 - * 0b11..divide by 4 - */ -#define CCM_CBCDR_IPG_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_IPG_PODF_SHIFT)) & CCM_CBCDR_IPG_PODF_MASK) - -#define CCM_CBCDR_AHB_PODF_MASK (0x1C00U) -#define CCM_CBCDR_AHB_PODF_SHIFT (10U) -/*! AHB_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CBCDR_AHB_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_AHB_PODF_SHIFT)) & CCM_CBCDR_AHB_PODF_MASK) - -#define CCM_CBCDR_SEMC_PODF_MASK (0x70000U) -#define CCM_CBCDR_SEMC_PODF_SHIFT (16U) -/*! SEMC_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CBCDR_SEMC_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_SEMC_PODF_SHIFT)) & CCM_CBCDR_SEMC_PODF_MASK) - -#define CCM_CBCDR_PERIPH_CLK_SEL_MASK (0x2000000U) -#define CCM_CBCDR_PERIPH_CLK_SEL_SHIFT (25U) -/*! PERIPH_CLK_SEL - * 0b0..derive clock from pre_periph_clk_sel - * 0b1..derive clock from periph_clk2_clk_divided - */ -#define CCM_CBCDR_PERIPH_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_PERIPH_CLK_SEL_SHIFT)) & CCM_CBCDR_PERIPH_CLK_SEL_MASK) - -#define CCM_CBCDR_PERIPH_CLK2_PODF_MASK (0x38000000U) -#define CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT (27U) -/*! PERIPH_CLK2_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CBCDR_PERIPH_CLK2_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT)) & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) -/*! @} */ - -/*! @name CBCMR - CCM Bus Clock Multiplexer Register */ -/*! @{ */ - -#define CCM_CBCMR_LPSPI_CLK_SEL_MASK (0x30U) -#define CCM_CBCMR_LPSPI_CLK_SEL_SHIFT (4U) -/*! LPSPI_CLK_SEL - * 0b00..derive clock from PLL3 PFD1 clk - * 0b01..derive clock from PLL3 PFD0 - * 0b10..derive clock from PLL2 - * 0b11..derive clock from PLL2 PFD2 - */ -#define CCM_CBCMR_LPSPI_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_LPSPI_CLK_SEL_SHIFT)) & CCM_CBCMR_LPSPI_CLK_SEL_MASK) - -#define CCM_CBCMR_PERIPH_CLK2_SEL_MASK (0x3000U) -#define CCM_CBCMR_PERIPH_CLK2_SEL_SHIFT (12U) -/*! PERIPH_CLK2_SEL - * 0b00..derive clock from pll3_sw_clk - * 0b01..derive clock from osc_clk (pll1_ref_clk) - * 0b10..derive clock from pll2_bypass_clk - * 0b11..reserved - */ -#define CCM_CBCMR_PERIPH_CLK2_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_PERIPH_CLK2_SEL_SHIFT)) & CCM_CBCMR_PERIPH_CLK2_SEL_MASK) - -#define CCM_CBCMR_TRACE_CLK_SEL_MASK (0xC000U) -#define CCM_CBCMR_TRACE_CLK_SEL_SHIFT (14U) -/*! TRACE_CLK_SEL - * 0b00..derive clock from PLL2 - * 0b01..derive clock from PLL2 PFD2 - * 0b10..derive clock from PLL2 PFD0 - * 0b11..derive clock from PLL2 PFD1 - */ -#define CCM_CBCMR_TRACE_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_TRACE_CLK_SEL_SHIFT)) & CCM_CBCMR_TRACE_CLK_SEL_MASK) - -#define CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK (0xC0000U) -#define CCM_CBCMR_PRE_PERIPH_CLK_SEL_SHIFT (18U) -/*! PRE_PERIPH_CLK_SEL - * 0b00..derive clock from PLL2 - * 0b01..derive clock from PLL2 PFD2 - * 0b10..derive clock from PLL2 PFD0 - * 0b11..derive clock from divided PLL1 - */ -#define CCM_CBCMR_PRE_PERIPH_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_PRE_PERIPH_CLK_SEL_SHIFT)) & CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK) - -#define CCM_CBCMR_LCDIF_PODF_MASK (0x3800000U) -#define CCM_CBCMR_LCDIF_PODF_SHIFT (23U) -/*! LCDIF_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CBCMR_LCDIF_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_LCDIF_PODF_SHIFT)) & CCM_CBCMR_LCDIF_PODF_MASK) - -#define CCM_CBCMR_LPSPI_PODF_MASK (0x1C000000U) -#define CCM_CBCMR_LPSPI_PODF_SHIFT (26U) -/*! LPSPI_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CBCMR_LPSPI_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CBCMR_LPSPI_PODF_SHIFT)) & CCM_CBCMR_LPSPI_PODF_MASK) -/*! @} */ - -/*! @name CSCMR1 - CCM Serial Clock Multiplexer Register 1 */ -/*! @{ */ - -#define CCM_CSCMR1_PERCLK_PODF_MASK (0x3FU) -#define CCM_CSCMR1_PERCLK_PODF_SHIFT (0U) -/*! PERCLK_PODF - Divider for perclk podf. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CSCMR1_PERCLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_PERCLK_PODF_SHIFT)) & CCM_CSCMR1_PERCLK_PODF_MASK) - -#define CCM_CSCMR1_PERCLK_CLK_SEL_MASK (0x40U) -#define CCM_CSCMR1_PERCLK_CLK_SEL_SHIFT (6U) -/*! PERCLK_CLK_SEL - * 0b0..derive clock from ipg clk root - * 0b1..derive clock from osc_clk - */ -#define CCM_CSCMR1_PERCLK_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_PERCLK_CLK_SEL_SHIFT)) & CCM_CSCMR1_PERCLK_CLK_SEL_MASK) - -#define CCM_CSCMR1_SAI1_CLK_SEL_MASK (0xC00U) -#define CCM_CSCMR1_SAI1_CLK_SEL_SHIFT (10U) -/*! SAI1_CLK_SEL - * 0b00..derive clock from PLL3 PFD2 - * 0b01..derive clock from PLL5 - * 0b10..derive clock from PLL4 - * 0b11..Reserved - */ -#define CCM_CSCMR1_SAI1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_SAI1_CLK_SEL_SHIFT)) & CCM_CSCMR1_SAI1_CLK_SEL_MASK) - -#define CCM_CSCMR1_SAI2_CLK_SEL_MASK (0x3000U) -#define CCM_CSCMR1_SAI2_CLK_SEL_SHIFT (12U) -/*! SAI2_CLK_SEL - * 0b00..derive clock from PLL3 PFD2 - * 0b01..derive clock from PLL5 - * 0b10..derive clock from PLL4 - * 0b11..Reserved - */ -#define CCM_CSCMR1_SAI2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_SAI2_CLK_SEL_SHIFT)) & CCM_CSCMR1_SAI2_CLK_SEL_MASK) - -#define CCM_CSCMR1_SAI3_CLK_SEL_MASK (0xC000U) -#define CCM_CSCMR1_SAI3_CLK_SEL_SHIFT (14U) -/*! SAI3_CLK_SEL - * 0b00..derive clock from PLL3 PFD2 - * 0b01..derive clock from PLL5 - * 0b10..derive clock from PLL4 - * 0b11..Reserved - */ -#define CCM_CSCMR1_SAI3_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_SAI3_CLK_SEL_SHIFT)) & CCM_CSCMR1_SAI3_CLK_SEL_MASK) - -#define CCM_CSCMR1_USDHC1_CLK_SEL_MASK (0x10000U) -#define CCM_CSCMR1_USDHC1_CLK_SEL_SHIFT (16U) -/*! USDHC1_CLK_SEL - * 0b0..derive clock from PLL2 PFD2 - * 0b1..derive clock from PLL2 PFD0 - */ -#define CCM_CSCMR1_USDHC1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_USDHC1_CLK_SEL_SHIFT)) & CCM_CSCMR1_USDHC1_CLK_SEL_MASK) - -#define CCM_CSCMR1_USDHC2_CLK_SEL_MASK (0x20000U) -#define CCM_CSCMR1_USDHC2_CLK_SEL_SHIFT (17U) -/*! USDHC2_CLK_SEL - * 0b0..derive clock from PLL2 PFD2 - * 0b1..derive clock from PLL2 PFD0 - */ -#define CCM_CSCMR1_USDHC2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_USDHC2_CLK_SEL_SHIFT)) & CCM_CSCMR1_USDHC2_CLK_SEL_MASK) - -#define CCM_CSCMR1_FLEXSPI_PODF_MASK (0x3800000U) -#define CCM_CSCMR1_FLEXSPI_PODF_SHIFT (23U) -/*! FLEXSPI_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CSCMR1_FLEXSPI_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_FLEXSPI_PODF_SHIFT)) & CCM_CSCMR1_FLEXSPI_PODF_MASK) - -#define CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK (0x60000000U) -#define CCM_CSCMR1_FLEXSPI_CLK_SEL_SHIFT (29U) -/*! FLEXSPI_CLK_SEL - * 0b00..derive clock from semc_clk_root_pre - * 0b01..derive clock from pll3_sw_clk - * 0b10..derive clock from PLL2 PFD2 - * 0b11..derive clock from PLL3 PFD0 - */ -#define CCM_CSCMR1_FLEXSPI_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR1_FLEXSPI_CLK_SEL_SHIFT)) & CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK) -/*! @} */ - -/*! @name CSCMR2 - CCM Serial Clock Multiplexer Register 2 */ -/*! @{ */ - -#define CCM_CSCMR2_CAN_CLK_PODF_MASK (0xFCU) -#define CCM_CSCMR2_CAN_CLK_PODF_SHIFT (2U) -/*! CAN_CLK_PODF - Divider for CAN clock podf. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CSCMR2_CAN_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR2_CAN_CLK_PODF_SHIFT)) & CCM_CSCMR2_CAN_CLK_PODF_MASK) - -#define CCM_CSCMR2_CAN_CLK_SEL_MASK (0x300U) -#define CCM_CSCMR2_CAN_CLK_SEL_SHIFT (8U) -/*! CAN_CLK_SEL - * 0b00..derive clock from pll3_sw_clk divided clock (60M) - * 0b01..derive clock from osc_clk (24M) - * 0b10..derive clock from pll3_sw_clk divided clock (80M) - * 0b11..Disable FlexCAN clock - */ -#define CCM_CSCMR2_CAN_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR2_CAN_CLK_SEL_SHIFT)) & CCM_CSCMR2_CAN_CLK_SEL_MASK) - -#define CCM_CSCMR2_FLEXIO2_CLK_SEL_MASK (0x180000U) -#define CCM_CSCMR2_FLEXIO2_CLK_SEL_SHIFT (19U) -/*! FLEXIO2_CLK_SEL - * 0b00..derive clock from PLL4 divided clock - * 0b01..derive clock from PLL3 PFD2 clock - * 0b10..derive clock from PLL5 clock - * 0b11..derive clock from pll3_sw_clk - */ -#define CCM_CSCMR2_FLEXIO2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCMR2_FLEXIO2_CLK_SEL_SHIFT)) & CCM_CSCMR2_FLEXIO2_CLK_SEL_MASK) -/*! @} */ - -/*! @name CSCDR1 - CCM Serial Clock Divider Register 1 */ -/*! @{ */ - -#define CCM_CSCDR1_UART_CLK_PODF_MASK (0x3FU) -#define CCM_CSCDR1_UART_CLK_PODF_SHIFT (0U) -/*! UART_CLK_PODF - Divider for uart clock podf. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CSCDR1_UART_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR1_UART_CLK_PODF_SHIFT)) & CCM_CSCDR1_UART_CLK_PODF_MASK) - -#define CCM_CSCDR1_UART_CLK_SEL_MASK (0x40U) -#define CCM_CSCDR1_UART_CLK_SEL_SHIFT (6U) -/*! UART_CLK_SEL - * 0b0..derive clock from pll3_80m - * 0b1..derive clock from osc_clk - */ -#define CCM_CSCDR1_UART_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR1_UART_CLK_SEL_SHIFT)) & CCM_CSCDR1_UART_CLK_SEL_MASK) - -#define CCM_CSCDR1_USDHC1_PODF_MASK (0x3800U) -#define CCM_CSCDR1_USDHC1_PODF_SHIFT (11U) -/*! USDHC1_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CSCDR1_USDHC1_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR1_USDHC1_PODF_SHIFT)) & CCM_CSCDR1_USDHC1_PODF_MASK) - -#define CCM_CSCDR1_USDHC2_PODF_MASK (0x70000U) -#define CCM_CSCDR1_USDHC2_PODF_SHIFT (16U) -/*! USDHC2_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CSCDR1_USDHC2_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR1_USDHC2_PODF_SHIFT)) & CCM_CSCDR1_USDHC2_PODF_MASK) - -#define CCM_CSCDR1_TRACE_PODF_MASK (0x6000000U) -#define CCM_CSCDR1_TRACE_PODF_SHIFT (25U) -/*! TRACE_PODF - * 0b00..divide by 1 - * 0b01..divide by 2 - * 0b10..divide by 3 - * 0b11..divide by 4 - */ -#define CCM_CSCDR1_TRACE_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR1_TRACE_PODF_SHIFT)) & CCM_CSCDR1_TRACE_PODF_MASK) -/*! @} */ - -/*! @name CS1CDR - CCM Clock Divider Register */ -/*! @{ */ - -#define CCM_CS1CDR_SAI1_CLK_PODF_MASK (0x3FU) -#define CCM_CS1CDR_SAI1_CLK_PODF_SHIFT (0U) -/*! SAI1_CLK_PODF - Divider for sai1 clock podf. The input clock to this divider should be lower - * than 300Mhz, the predivider can be used to achieve this. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CS1CDR_SAI1_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_SAI1_CLK_PODF_SHIFT)) & CCM_CS1CDR_SAI1_CLK_PODF_MASK) - -#define CCM_CS1CDR_SAI1_CLK_PRED_MASK (0x1C0U) -#define CCM_CS1CDR_SAI1_CLK_PRED_SHIFT (6U) -/*! SAI1_CLK_PRED - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CS1CDR_SAI1_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_SAI1_CLK_PRED_SHIFT)) & CCM_CS1CDR_SAI1_CLK_PRED_MASK) - -#define CCM_CS1CDR_FLEXIO2_CLK_PRED_MASK (0xE00U) -#define CCM_CS1CDR_FLEXIO2_CLK_PRED_SHIFT (9U) -/*! FLEXIO2_CLK_PRED - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CS1CDR_FLEXIO2_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_FLEXIO2_CLK_PRED_SHIFT)) & CCM_CS1CDR_FLEXIO2_CLK_PRED_MASK) - -#define CCM_CS1CDR_SAI3_CLK_PODF_MASK (0x3F0000U) -#define CCM_CS1CDR_SAI3_CLK_PODF_SHIFT (16U) -/*! SAI3_CLK_PODF - Divider for sai3 clock podf. The input clock to this divider should be lower - * than 300Mhz, the predivider can be used to achieve this. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CS1CDR_SAI3_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_SAI3_CLK_PODF_SHIFT)) & CCM_CS1CDR_SAI3_CLK_PODF_MASK) - -#define CCM_CS1CDR_SAI3_CLK_PRED_MASK (0x1C00000U) -#define CCM_CS1CDR_SAI3_CLK_PRED_SHIFT (22U) -/*! SAI3_CLK_PRED - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CS1CDR_SAI3_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_SAI3_CLK_PRED_SHIFT)) & CCM_CS1CDR_SAI3_CLK_PRED_MASK) - -#define CCM_CS1CDR_FLEXIO2_CLK_PODF_MASK (0xE000000U) -#define CCM_CS1CDR_FLEXIO2_CLK_PODF_SHIFT (25U) -/*! FLEXIO2_CLK_PODF - Divider for flexio2 clock. Divider should be updated when output clock is gated. - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 3 - * 0b011..Divide by 4 - * 0b100..Divide by 5 - * 0b101..Divide by 6 - * 0b110..Divide by 7 - * 0b111..Divide by 8 - */ -#define CCM_CS1CDR_FLEXIO2_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS1CDR_FLEXIO2_CLK_PODF_SHIFT)) & CCM_CS1CDR_FLEXIO2_CLK_PODF_MASK) -/*! @} */ - -/*! @name CS2CDR - CCM Clock Divider Register */ -/*! @{ */ - -#define CCM_CS2CDR_SAI2_CLK_PODF_MASK (0x3FU) -#define CCM_CS2CDR_SAI2_CLK_PODF_SHIFT (0U) -/*! SAI2_CLK_PODF - Divider for sai2 clock podf. The input clock to this divider should be lower - * than 300Mhz, the predivider can be used to achieve this. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CS2CDR_SAI2_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS2CDR_SAI2_CLK_PODF_SHIFT)) & CCM_CS2CDR_SAI2_CLK_PODF_MASK) - -#define CCM_CS2CDR_SAI2_CLK_PRED_MASK (0x1C0U) -#define CCM_CS2CDR_SAI2_CLK_PRED_SHIFT (6U) -/*! SAI2_CLK_PRED - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CS2CDR_SAI2_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CS2CDR_SAI2_CLK_PRED_SHIFT)) & CCM_CS2CDR_SAI2_CLK_PRED_MASK) -/*! @} */ - -/*! @name CDCDR - CCM D1 Clock Divider Register */ -/*! @{ */ - -#define CCM_CDCDR_FLEXIO1_CLK_SEL_MASK (0x180U) -#define CCM_CDCDR_FLEXIO1_CLK_SEL_SHIFT (7U) -/*! FLEXIO1_CLK_SEL - * 0b00..derive clock from PLL4 - * 0b01..derive clock from PLL3 PFD2 - * 0b10..derive clock from PLL5 - * 0b11..derive clock from pll3_sw_clk - */ -#define CCM_CDCDR_FLEXIO1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_FLEXIO1_CLK_SEL_SHIFT)) & CCM_CDCDR_FLEXIO1_CLK_SEL_MASK) - -#define CCM_CDCDR_FLEXIO1_CLK_PODF_MASK (0xE00U) -#define CCM_CDCDR_FLEXIO1_CLK_PODF_SHIFT (9U) -/*! FLEXIO1_CLK_PODF - Divider for flexio1 clock podf. Divider should be updated when output clock is gated. - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 3 - * 0b011..Divide by 4 - * 0b100..Divide by 5 - * 0b101..Divide by 6 - * 0b110..Divide by 7 - * 0b111..Divide by 8 - */ -#define CCM_CDCDR_FLEXIO1_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_FLEXIO1_CLK_PODF_SHIFT)) & CCM_CDCDR_FLEXIO1_CLK_PODF_MASK) - -#define CCM_CDCDR_FLEXIO1_CLK_PRED_MASK (0x7000U) -#define CCM_CDCDR_FLEXIO1_CLK_PRED_SHIFT (12U) -/*! FLEXIO1_CLK_PRED - Divider for flexio1 clock pred. Divider should be updated when output clock is gated. - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 3 - * 0b011..Divide by 4 - * 0b100..Divide by 5 - * 0b101..Divide by 6 - * 0b110..Divide by 7 - * 0b111..Divide by 8 - */ -#define CCM_CDCDR_FLEXIO1_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_FLEXIO1_CLK_PRED_SHIFT)) & CCM_CDCDR_FLEXIO1_CLK_PRED_MASK) - -#define CCM_CDCDR_SPDIF0_CLK_SEL_MASK (0x300000U) -#define CCM_CDCDR_SPDIF0_CLK_SEL_SHIFT (20U) -/*! SPDIF0_CLK_SEL - * 0b00..derive clock from PLL4 - * 0b01..derive clock from PLL3 PFD2 - * 0b10..derive clock from PLL5 - * 0b11..derive clock from pll3_sw_clk - */ -#define CCM_CDCDR_SPDIF0_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_SPDIF0_CLK_SEL_SHIFT)) & CCM_CDCDR_SPDIF0_CLK_SEL_MASK) - -#define CCM_CDCDR_SPDIF0_CLK_PODF_MASK (0x1C00000U) -#define CCM_CDCDR_SPDIF0_CLK_PODF_SHIFT (22U) -/*! SPDIF0_CLK_PODF - Divider for spdif0 clock podf. Divider should be updated when output clock is gated. - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 3 - * 0b011..Divide by 4 - * 0b100..Divide by 5 - * 0b101..Divide by 6 - * 0b110..Divide by 7 - * 0b111..Divide by 8 - */ -#define CCM_CDCDR_SPDIF0_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_SPDIF0_CLK_PODF_SHIFT)) & CCM_CDCDR_SPDIF0_CLK_PODF_MASK) - -#define CCM_CDCDR_SPDIF0_CLK_PRED_MASK (0xE000000U) -#define CCM_CDCDR_SPDIF0_CLK_PRED_SHIFT (25U) -/*! SPDIF0_CLK_PRED - Divider for spdif0 clock pred. Divider should be updated when output clock is gated. - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 3 - * 0b011..Divide by 4 - * 0b100..Divide by 5 - * 0b101..Divide by 6 - * 0b110..Divide by 7 - * 0b111..Divide by 8 - */ -#define CCM_CDCDR_SPDIF0_CLK_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDCDR_SPDIF0_CLK_PRED_SHIFT)) & CCM_CDCDR_SPDIF0_CLK_PRED_MASK) -/*! @} */ - -/*! @name CSCDR2 - CCM Serial Clock Divider Register 2 */ -/*! @{ */ - -#define CCM_CSCDR2_LCDIF_PRED_MASK (0x7000U) -#define CCM_CSCDR2_LCDIF_PRED_SHIFT (12U) -/*! LCDIF_PRED - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CSCDR2_LCDIF_PRED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR2_LCDIF_PRED_SHIFT)) & CCM_CSCDR2_LCDIF_PRED_MASK) - -#define CCM_CSCDR2_LCDIF_PRE_CLK_SEL_MASK (0x38000U) -#define CCM_CSCDR2_LCDIF_PRE_CLK_SEL_SHIFT (15U) -/*! LCDIF_PRE_CLK_SEL - * 0b000..derive clock from PLL2 - * 0b001..derive clock from PLL3 PFD3 - * 0b010..derive clock from PLL5 - * 0b011..derive clock from PLL2 PFD0 - * 0b100..derive clock from PLL2 PFD1 - * 0b101..derive clock from PLL3 PFD1 - */ -#define CCM_CSCDR2_LCDIF_PRE_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR2_LCDIF_PRE_CLK_SEL_SHIFT)) & CCM_CSCDR2_LCDIF_PRE_CLK_SEL_MASK) - -#define CCM_CSCDR2_LPI2C_CLK_SEL_MASK (0x40000U) -#define CCM_CSCDR2_LPI2C_CLK_SEL_SHIFT (18U) -/*! LPI2C_CLK_SEL - * 0b0..derive clock from pll3_60m - * 0b1..derive clock from osc_clk - */ -#define CCM_CSCDR2_LPI2C_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR2_LPI2C_CLK_SEL_SHIFT)) & CCM_CSCDR2_LPI2C_CLK_SEL_MASK) - -#define CCM_CSCDR2_LPI2C_CLK_PODF_MASK (0x1F80000U) -#define CCM_CSCDR2_LPI2C_CLK_PODF_SHIFT (19U) -/*! LPI2C_CLK_PODF - Divider for lpi2c clock podf. Divider should be updated when output clock is - * gated. The input clock to this divider should be lower than 300Mhz, the predivider can be used - * to achieve this. - * 0b000000..Divide by 1 - * 0b000001..Divide by 2 - * 0b000010..Divide by 3 - * 0b000011..Divide by 4 - * 0b000100..Divide by 5 - * 0b000101..Divide by 6 - * 0b000110..Divide by 7 - * 0b000111..Divide by 8 - * 0b001000..Divide by 9 - * 0b001001..Divide by 10 - * 0b001010..Divide by 11 - * 0b001011..Divide by 12 - * 0b001100..Divide by 13 - * 0b001101..Divide by 14 - * 0b001110..Divide by 15 - * 0b001111..Divide by 16 - * 0b010000..Divide by 17 - * 0b010001..Divide by 18 - * 0b010010..Divide by 19 - * 0b010011..Divide by 20 - * 0b010100..Divide by 21 - * 0b010101..Divide by 22 - * 0b010110..Divide by 23 - * 0b010111..Divide by 24 - * 0b011000..Divide by 25 - * 0b011001..Divide by 26 - * 0b011010..Divide by 27 - * 0b011011..Divide by 28 - * 0b011100..Divide by 29 - * 0b011101..Divide by 30 - * 0b011110..Divide by 31 - * 0b011111..Divide by 32 - * 0b100000..Divide by 33 - * 0b100001..Divide by 34 - * 0b100010..Divide by 35 - * 0b100011..Divide by 36 - * 0b100100..Divide by 37 - * 0b100101..Divide by 38 - * 0b100110..Divide by 39 - * 0b100111..Divide by 40 - * 0b101000..Divide by 41 - * 0b101001..Divide by 42 - * 0b101010..Divide by 43 - * 0b101011..Divide by 44 - * 0b101100..Divide by 45 - * 0b101101..Divide by 46 - * 0b101110..Divide by 47 - * 0b101111..Divide by 48 - * 0b110000..Divide by 49 - * 0b110001..Divide by 50 - * 0b110010..Divide by 51 - * 0b110011..Divide by 52 - * 0b110100..Divide by 53 - * 0b110101..Divide by 54 - * 0b110110..Divide by 55 - * 0b110111..Divide by 56 - * 0b111000..Divide by 57 - * 0b111001..Divide by 58 - * 0b111010..Divide by 59 - * 0b111011..Divide by 60 - * 0b111100..Divide by 61 - * 0b111101..Divide by 62 - * 0b111110..Divide by 63 - * 0b111111..Divide by 64 - */ -#define CCM_CSCDR2_LPI2C_CLK_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR2_LPI2C_CLK_PODF_SHIFT)) & CCM_CSCDR2_LPI2C_CLK_PODF_MASK) -/*! @} */ - -/*! @name CSCDR3 - CCM Serial Clock Divider Register 3 */ -/*! @{ */ - -#define CCM_CSCDR3_CSI_CLK_SEL_MASK (0x600U) -#define CCM_CSCDR3_CSI_CLK_SEL_SHIFT (9U) -/*! CSI_CLK_SEL - * 0b00..derive clock from osc_clk (24M) - * 0b01..derive clock from PLL2 PFD2 - * 0b10..derive clock from pll3_120M - * 0b11..derive clock from PLL3 PFD1 - */ -#define CCM_CSCDR3_CSI_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR3_CSI_CLK_SEL_SHIFT)) & CCM_CSCDR3_CSI_CLK_SEL_MASK) - -#define CCM_CSCDR3_CSI_PODF_MASK (0x3800U) -#define CCM_CSCDR3_CSI_PODF_SHIFT (11U) -/*! CSI_PODF - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CSCDR3_CSI_PODF(x) (((uint32_t)(((uint32_t)(x)) << CCM_CSCDR3_CSI_PODF_SHIFT)) & CCM_CSCDR3_CSI_PODF_MASK) -/*! @} */ - -/*! @name CDHIPR - CCM Divider Handshake In-Process Register */ -/*! @{ */ - -#define CCM_CDHIPR_SEMC_PODF_BUSY_MASK (0x1U) -#define CCM_CDHIPR_SEMC_PODF_BUSY_SHIFT (0U) -/*! SEMC_PODF_BUSY - * 0b0..divider is not busy and its value represents the actual division. - * 0b1..divider is busy with handshake process with module. The value read in the divider represents the previous - * value of the division factor, and after the handshake the written value of the semc_podf will be applied. - */ -#define CCM_CDHIPR_SEMC_PODF_BUSY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDHIPR_SEMC_PODF_BUSY_SHIFT)) & CCM_CDHIPR_SEMC_PODF_BUSY_MASK) - -#define CCM_CDHIPR_AHB_PODF_BUSY_MASK (0x2U) -#define CCM_CDHIPR_AHB_PODF_BUSY_SHIFT (1U) -/*! AHB_PODF_BUSY - * 0b0..divider is not busy and its value represents the actual division. - * 0b1..divider is busy with handshake process with module. The value read in the divider represents the previous - * value of the division factor, and after the handshake the written value of the ahb_podf will be applied. - */ -#define CCM_CDHIPR_AHB_PODF_BUSY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDHIPR_AHB_PODF_BUSY_SHIFT)) & CCM_CDHIPR_AHB_PODF_BUSY_MASK) - -#define CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY_MASK (0x8U) -#define CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY_SHIFT (3U) -/*! PERIPH2_CLK_SEL_BUSY - * 0b0..mux is not busy and its value represents the actual division. - * 0b1..mux is busy with handshake process with module. The value read in the periph2_clk_sel represents the - * previous value of select, and after the handshake periph2_clk_sel value will be applied. - */ -#define CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY_SHIFT)) & CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY_MASK) - -#define CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_MASK (0x20U) -#define CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_SHIFT (5U) -/*! PERIPH_CLK_SEL_BUSY - * 0b0..mux is not busy and its value represents the actual division. - * 0b1..mux is busy with handshake process with module. The value read in the periph_clk_sel represents the - * previous value of select, and after the handshake periph_clk_sel value will be applied. - */ -#define CCM_CDHIPR_PERIPH_CLK_SEL_BUSY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_SHIFT)) & CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_MASK) - -#define CCM_CDHIPR_ARM_PODF_BUSY_MASK (0x10000U) -#define CCM_CDHIPR_ARM_PODF_BUSY_SHIFT (16U) -/*! ARM_PODF_BUSY - * 0b0..divider is not busy and its value represents the actual division. - * 0b1..divider is busy with handshake process with module. The value read in the divider represents the previous - * value of the division factor, and after the handshake the written value of the arm_podf will be applied. - */ -#define CCM_CDHIPR_ARM_PODF_BUSY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CDHIPR_ARM_PODF_BUSY_SHIFT)) & CCM_CDHIPR_ARM_PODF_BUSY_MASK) -/*! @} */ - -/*! @name CLPCR - CCM Low Power Control Register */ -/*! @{ */ - -#define CCM_CLPCR_LPM_MASK (0x3U) -#define CCM_CLPCR_LPM_SHIFT (0U) -/*! LPM - * 0b00..Remain in run mode - * 0b01..Transfer to wait mode - * 0b10..Transfer to stop mode - * 0b11..Reserved - */ -#define CCM_CLPCR_LPM(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_LPM_SHIFT)) & CCM_CLPCR_LPM_MASK) - -#define CCM_CLPCR_ARM_CLK_DIS_ON_LPM_MASK (0x20U) -#define CCM_CLPCR_ARM_CLK_DIS_ON_LPM_SHIFT (5U) -/*! ARM_CLK_DIS_ON_LPM - * 0b0..ARM clock enabled on wait mode. - * 0b1..ARM clock disabled on wait mode. . - */ -#define CCM_CLPCR_ARM_CLK_DIS_ON_LPM(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_ARM_CLK_DIS_ON_LPM_SHIFT)) & CCM_CLPCR_ARM_CLK_DIS_ON_LPM_MASK) - -#define CCM_CLPCR_SBYOS_MASK (0x40U) -#define CCM_CLPCR_SBYOS_SHIFT (6U) -/*! SBYOS - * 0b0..On-chip oscillator will not be powered down, after next entrance to STOP mode. (CCM_REF_EN_B will remain - * asserted - '0' and cosc_pwrdown will remain de asserted - '0') - * 0b1..On-chip oscillator will be powered down, after next entrance to STOP mode. (CCM_REF_EN_B will be - * deasserted - '1' and cosc_pwrdown will be asserted - '1'). When returning from STOP mode, external oscillator will - * be enabled again, on-chip oscillator will return to oscillator mode, and after oscnt count, CCM will - * continue with the exit from the STOP mode process. - */ -#define CCM_CLPCR_SBYOS(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_SBYOS_SHIFT)) & CCM_CLPCR_SBYOS_MASK) - -#define CCM_CLPCR_DIS_REF_OSC_MASK (0x80U) -#define CCM_CLPCR_DIS_REF_OSC_SHIFT (7U) -/*! DIS_REF_OSC - * 0b0..external high frequency oscillator will be enabled, i.e. CCM_REF_EN_B = '0'. - * 0b1..external high frequency oscillator will be disabled, i.e. CCM_REF_EN_B = '1' - */ -#define CCM_CLPCR_DIS_REF_OSC(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_DIS_REF_OSC_SHIFT)) & CCM_CLPCR_DIS_REF_OSC_MASK) - -#define CCM_CLPCR_VSTBY_MASK (0x100U) -#define CCM_CLPCR_VSTBY_SHIFT (8U) -/*! VSTBY - * 0b0..Voltage will not be changed to standby voltage after next entrance to STOP mode. ( PMIC_STBY_REQ will remain negated - '0') - * 0b1..Voltage will be requested to change to standby voltage after next entrance to stop mode. ( PMIC_STBY_REQ will be asserted - '1'). - */ -#define CCM_CLPCR_VSTBY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_VSTBY_SHIFT)) & CCM_CLPCR_VSTBY_MASK) - -#define CCM_CLPCR_STBY_COUNT_MASK (0x600U) -#define CCM_CLPCR_STBY_COUNT_SHIFT (9U) -/*! STBY_COUNT - * 0b00..CCM will wait (1*pmic_delay_scaler)+1 ckil clock cycles - * 0b01..CCM will wait (3*pmic_delay_scaler)+1 ckil clock cycles - * 0b10..CCM will wait (7*pmic_delay_scaler)+1 ckil clock cycles - * 0b11..CCM will wait (15*pmic_delay_scaler)+1 ckil clock cycles - */ -#define CCM_CLPCR_STBY_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_STBY_COUNT_SHIFT)) & CCM_CLPCR_STBY_COUNT_MASK) - -#define CCM_CLPCR_COSC_PWRDOWN_MASK (0x800U) -#define CCM_CLPCR_COSC_PWRDOWN_SHIFT (11U) -/*! COSC_PWRDOWN - * 0b0..On chip oscillator will not be powered down, i.e. cosc_pwrdown = '0'. - * 0b1..On chip oscillator will be powered down, i.e. cosc_pwrdown = '1'. - */ -#define CCM_CLPCR_COSC_PWRDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_COSC_PWRDOWN_SHIFT)) & CCM_CLPCR_COSC_PWRDOWN_MASK) - -#define CCM_CLPCR_BYPASS_LPM_HS1_MASK (0x80000U) -#define CCM_CLPCR_BYPASS_LPM_HS1_SHIFT (19U) -#define CCM_CLPCR_BYPASS_LPM_HS1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_BYPASS_LPM_HS1_SHIFT)) & CCM_CLPCR_BYPASS_LPM_HS1_MASK) - -#define CCM_CLPCR_BYPASS_LPM_HS0_MASK (0x200000U) -#define CCM_CLPCR_BYPASS_LPM_HS0_SHIFT (21U) -#define CCM_CLPCR_BYPASS_LPM_HS0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_BYPASS_LPM_HS0_SHIFT)) & CCM_CLPCR_BYPASS_LPM_HS0_MASK) - -#define CCM_CLPCR_MASK_CORE0_WFI_MASK (0x400000U) -#define CCM_CLPCR_MASK_CORE0_WFI_SHIFT (22U) -/*! MASK_CORE0_WFI - * 0b0..WFI of core0 is not masked - * 0b1..WFI of core0 is masked - */ -#define CCM_CLPCR_MASK_CORE0_WFI(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_MASK_CORE0_WFI_SHIFT)) & CCM_CLPCR_MASK_CORE0_WFI_MASK) - -#define CCM_CLPCR_MASK_SCU_IDLE_MASK (0x4000000U) -#define CCM_CLPCR_MASK_SCU_IDLE_SHIFT (26U) -/*! MASK_SCU_IDLE - * 0b1..SCU IDLE is masked - * 0b0..SCU IDLE is not masked - */ -#define CCM_CLPCR_MASK_SCU_IDLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_MASK_SCU_IDLE_SHIFT)) & CCM_CLPCR_MASK_SCU_IDLE_MASK) - -#define CCM_CLPCR_MASK_L2CC_IDLE_MASK (0x8000000U) -#define CCM_CLPCR_MASK_L2CC_IDLE_SHIFT (27U) -/*! MASK_L2CC_IDLE - * 0b1..L2CC IDLE is masked - * 0b0..L2CC IDLE is not masked - */ -#define CCM_CLPCR_MASK_L2CC_IDLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_CLPCR_MASK_L2CC_IDLE_SHIFT)) & CCM_CLPCR_MASK_L2CC_IDLE_MASK) -/*! @} */ - -/*! @name CISR - CCM Interrupt Status Register */ -/*! @{ */ - -#define CCM_CISR_LRF_PLL_MASK (0x1U) -#define CCM_CISR_LRF_PLL_SHIFT (0U) -/*! LRF_PLL - * 0b0..interrupt is not generated due to lock ready of all enabled and not bypaseed PLLs - * 0b1..interrupt generated due to lock ready of all enabled and not bypaseed PLLs - */ -#define CCM_CISR_LRF_PLL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_LRF_PLL_SHIFT)) & CCM_CISR_LRF_PLL_MASK) - -#define CCM_CISR_COSC_READY_MASK (0x40U) -#define CCM_CISR_COSC_READY_SHIFT (6U) -/*! COSC_READY - * 0b0..interrupt is not generated due to on board oscillator ready - * 0b1..interrupt generated due to on board oscillator ready - */ -#define CCM_CISR_COSC_READY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_COSC_READY_SHIFT)) & CCM_CISR_COSC_READY_MASK) - -#define CCM_CISR_SEMC_PODF_LOADED_MASK (0x20000U) -#define CCM_CISR_SEMC_PODF_LOADED_SHIFT (17U) -/*! SEMC_PODF_LOADED - * 0b0..interrupt is not generated due to frequency change of semc_podf - * 0b1..interrupt generated due to frequency change of semc_podf - */ -#define CCM_CISR_SEMC_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_SEMC_PODF_LOADED_SHIFT)) & CCM_CISR_SEMC_PODF_LOADED_MASK) - -#define CCM_CISR_PERIPH2_CLK_SEL_LOADED_MASK (0x80000U) -#define CCM_CISR_PERIPH2_CLK_SEL_LOADED_SHIFT (19U) -/*! PERIPH2_CLK_SEL_LOADED - * 0b0..interrupt is not generated due to frequency change of periph2_clk_sel - * 0b1..interrupt generated due to frequency change of periph2_clk_sel - */ -#define CCM_CISR_PERIPH2_CLK_SEL_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_PERIPH2_CLK_SEL_LOADED_SHIFT)) & CCM_CISR_PERIPH2_CLK_SEL_LOADED_MASK) - -#define CCM_CISR_AHB_PODF_LOADED_MASK (0x100000U) -#define CCM_CISR_AHB_PODF_LOADED_SHIFT (20U) -/*! AHB_PODF_LOADED - * 0b0..interrupt is not generated due to frequency change of ahb_podf - * 0b1..interrupt generated due to frequency change of ahb_podf - */ -#define CCM_CISR_AHB_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_AHB_PODF_LOADED_SHIFT)) & CCM_CISR_AHB_PODF_LOADED_MASK) - -#define CCM_CISR_PERIPH_CLK_SEL_LOADED_MASK (0x400000U) -#define CCM_CISR_PERIPH_CLK_SEL_LOADED_SHIFT (22U) -/*! PERIPH_CLK_SEL_LOADED - * 0b0..interrupt is not generated due to update of periph_clk_sel. - * 0b1..interrupt generated due to update of periph_clk_sel. - */ -#define CCM_CISR_PERIPH_CLK_SEL_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_PERIPH_CLK_SEL_LOADED_SHIFT)) & CCM_CISR_PERIPH_CLK_SEL_LOADED_MASK) - -#define CCM_CISR_ARM_PODF_LOADED_MASK (0x4000000U) -#define CCM_CISR_ARM_PODF_LOADED_SHIFT (26U) -/*! ARM_PODF_LOADED - * 0b0..interrupt is not generated due to frequency change of arm_podf - * 0b1..interrupt generated due to frequency change of arm_podf - */ -#define CCM_CISR_ARM_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CISR_ARM_PODF_LOADED_SHIFT)) & CCM_CISR_ARM_PODF_LOADED_MASK) -/*! @} */ - -/*! @name CIMR - CCM Interrupt Mask Register */ -/*! @{ */ - -#define CCM_CIMR_MASK_LRF_PLL_MASK (0x1U) -#define CCM_CIMR_MASK_LRF_PLL_SHIFT (0U) -/*! MASK_LRF_PLL - * 0b0..don't mask interrupt due to lrf of PLLs - interrupt will be created - * 0b1..mask interrupt due to lrf of PLLs - */ -#define CCM_CIMR_MASK_LRF_PLL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_LRF_PLL_SHIFT)) & CCM_CIMR_MASK_LRF_PLL_MASK) - -#define CCM_CIMR_MASK_COSC_READY_MASK (0x40U) -#define CCM_CIMR_MASK_COSC_READY_SHIFT (6U) -/*! MASK_COSC_READY - * 0b0..don't mask interrupt due to on board oscillator ready - interrupt will be created - * 0b1..mask interrupt due to on board oscillator ready - */ -#define CCM_CIMR_MASK_COSC_READY(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_COSC_READY_SHIFT)) & CCM_CIMR_MASK_COSC_READY_MASK) - -#define CCM_CIMR_MASK_SEMC_PODF_LOADED_MASK (0x20000U) -#define CCM_CIMR_MASK_SEMC_PODF_LOADED_SHIFT (17U) -/*! MASK_SEMC_PODF_LOADED - * 0b0..don't mask interrupt due to frequency change of semc_podf - interrupt will be created - * 0b1..mask interrupt due to frequency change of semc_podf - */ -#define CCM_CIMR_MASK_SEMC_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_SEMC_PODF_LOADED_SHIFT)) & CCM_CIMR_MASK_SEMC_PODF_LOADED_MASK) - -#define CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED_MASK (0x80000U) -#define CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED_SHIFT (19U) -/*! MASK_PERIPH2_CLK_SEL_LOADED - * 0b0..don't mask interrupt due to update of periph2_clk_sel - interrupt will be created - * 0b1..mask interrupt due to update of periph2_clk_sel - */ -#define CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED_SHIFT)) & CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED_MASK) - -#define CCM_CIMR_MASK_AHB_PODF_LOADED_MASK (0x100000U) -#define CCM_CIMR_MASK_AHB_PODF_LOADED_SHIFT (20U) -/*! MASK_AHB_PODF_LOADED - * 0b0..don't mask interrupt due to frequency change of ahb_podf - interrupt will be created - * 0b1..mask interrupt due to frequency change of ahb_podf - */ -#define CCM_CIMR_MASK_AHB_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_AHB_PODF_LOADED_SHIFT)) & CCM_CIMR_MASK_AHB_PODF_LOADED_MASK) - -#define CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED_MASK (0x400000U) -#define CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED_SHIFT (22U) -/*! MASK_PERIPH_CLK_SEL_LOADED - * 0b0..don't mask interrupt due to update of periph_clk_sel - interrupt will be created - * 0b1..mask interrupt due to update of periph_clk_sel - */ -#define CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED_SHIFT)) & CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED_MASK) - -#define CCM_CIMR_ARM_PODF_LOADED_MASK (0x4000000U) -#define CCM_CIMR_ARM_PODF_LOADED_SHIFT (26U) -/*! ARM_PODF_LOADED - * 0b0..don't mask interrupt due to frequency change of arm_podf - interrupt will be created - * 0b1..mask interrupt due to frequency change of arm_podf - */ -#define CCM_CIMR_ARM_PODF_LOADED(x) (((uint32_t)(((uint32_t)(x)) << CCM_CIMR_ARM_PODF_LOADED_SHIFT)) & CCM_CIMR_ARM_PODF_LOADED_MASK) -/*! @} */ - -/*! @name CCOSR - CCM Clock Output Source Register */ -/*! @{ */ - -#define CCM_CCOSR_CLKO1_SEL_MASK (0xFU) -#define CCM_CCOSR_CLKO1_SEL_SHIFT (0U) -/*! CLKO1_SEL - * 0b0000..USB1 PLL clock (divided by 2) - * 0b0001..SYS PLL clock (divided by 2) - * 0b0011..VIDEO PLL clock (divided by 2) - * 0b0101..semc_clk_root - * 0b0110..Reserved - * 0b1010..lcdif_pix_clk_root - * 0b1011..ahb_clk_root - * 0b1100..ipg_clk_root - * 0b1101..perclk_root - * 0b1110..ckil_sync_clk_root - * 0b1111..pll4_main_clk - */ -#define CCM_CCOSR_CLKO1_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO1_SEL_SHIFT)) & CCM_CCOSR_CLKO1_SEL_MASK) - -#define CCM_CCOSR_CLKO1_DIV_MASK (0x70U) -#define CCM_CCOSR_CLKO1_DIV_SHIFT (4U) -/*! CLKO1_DIV - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CCOSR_CLKO1_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO1_DIV_SHIFT)) & CCM_CCOSR_CLKO1_DIV_MASK) - -#define CCM_CCOSR_CLKO1_EN_MASK (0x80U) -#define CCM_CCOSR_CLKO1_EN_SHIFT (7U) -/*! CLKO1_EN - * 0b0..CCM_CLKO1 disabled. - * 0b1..CCM_CLKO1 enabled. - */ -#define CCM_CCOSR_CLKO1_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO1_EN_SHIFT)) & CCM_CCOSR_CLKO1_EN_MASK) - -#define CCM_CCOSR_CLK_OUT_SEL_MASK (0x100U) -#define CCM_CCOSR_CLK_OUT_SEL_SHIFT (8U) -/*! CLK_OUT_SEL - * 0b0..CCM_CLKO1 output drives CCM_CLKO1 clock - * 0b1..CCM_CLKO1 output drives CCM_CLKO2 clock - */ -#define CCM_CCOSR_CLK_OUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLK_OUT_SEL_SHIFT)) & CCM_CCOSR_CLK_OUT_SEL_MASK) - -#define CCM_CCOSR_CLKO2_SEL_MASK (0x1F0000U) -#define CCM_CCOSR_CLKO2_SEL_SHIFT (16U) -/*! CLKO2_SEL - * 0b00011..usdhc1_clk_root - * 0b00101..wrck_clk_root - * 0b00110..lpi2c_clk_root - * 0b01011..csi_clk_root - * 0b01110..osc_clk - * 0b10001..usdhc2_clk_root - * 0b10010..sai1_clk_root - * 0b10011..sai2_clk_root - * 0b10100..sai3_clk_root - * 0b10111..can_clk_root - * 0b11011..flexspi_clk_root - * 0b11100..uart_clk_root - * 0b11101..spdif0_clk_root - * 0b11111..Reserved - */ -#define CCM_CCOSR_CLKO2_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO2_SEL_SHIFT)) & CCM_CCOSR_CLKO2_SEL_MASK) - -#define CCM_CCOSR_CLKO2_DIV_MASK (0xE00000U) -#define CCM_CCOSR_CLKO2_DIV_SHIFT (21U) -/*! CLKO2_DIV - * 0b000..divide by 1 - * 0b001..divide by 2 - * 0b010..divide by 3 - * 0b011..divide by 4 - * 0b100..divide by 5 - * 0b101..divide by 6 - * 0b110..divide by 7 - * 0b111..divide by 8 - */ -#define CCM_CCOSR_CLKO2_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO2_DIV_SHIFT)) & CCM_CCOSR_CLKO2_DIV_MASK) - -#define CCM_CCOSR_CLKO2_EN_MASK (0x1000000U) -#define CCM_CCOSR_CLKO2_EN_SHIFT (24U) -/*! CLKO2_EN - * 0b0..CCM_CLKO2 disabled. - * 0b1..CCM_CLKO2 enabled. - */ -#define CCM_CCOSR_CLKO2_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCOSR_CLKO2_EN_SHIFT)) & CCM_CCOSR_CLKO2_EN_MASK) -/*! @} */ - -/*! @name CGPR - CCM General Purpose Register */ -/*! @{ */ - -#define CCM_CGPR_PMIC_DELAY_SCALER_MASK (0x1U) -#define CCM_CGPR_PMIC_DELAY_SCALER_SHIFT (0U) -/*! PMIC_DELAY_SCALER - * 0b0..clock is not divided - * 0b1..clock is divided /8 - */ -#define CCM_CGPR_PMIC_DELAY_SCALER(x) (((uint32_t)(((uint32_t)(x)) << CCM_CGPR_PMIC_DELAY_SCALER_SHIFT)) & CCM_CGPR_PMIC_DELAY_SCALER_MASK) - -#define CCM_CGPR_EFUSE_PROG_SUPPLY_GATE_MASK (0x10U) -#define CCM_CGPR_EFUSE_PROG_SUPPLY_GATE_SHIFT (4U) -/*! EFUSE_PROG_SUPPLY_GATE - * 0b0..fuse programing supply voltage is gated off to the efuse module - * 0b1..allow fuse programing. - */ -#define CCM_CGPR_EFUSE_PROG_SUPPLY_GATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_CGPR_EFUSE_PROG_SUPPLY_GATE_SHIFT)) & CCM_CGPR_EFUSE_PROG_SUPPLY_GATE_MASK) - -#define CCM_CGPR_SYS_MEM_DS_CTRL_MASK (0xC000U) -#define CCM_CGPR_SYS_MEM_DS_CTRL_SHIFT (14U) -/*! SYS_MEM_DS_CTRL - * 0b00..Disable memory DS mode always - * 0b01..Enable memory (outside ARM platform) DS mode when system STOP and PLL are disabled - * 0b1x..enable memory (outside ARM platform) DS mode when system is in STOP mode - */ -#define CCM_CGPR_SYS_MEM_DS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CGPR_SYS_MEM_DS_CTRL_SHIFT)) & CCM_CGPR_SYS_MEM_DS_CTRL_MASK) - -#define CCM_CGPR_FPL_MASK (0x10000U) -#define CCM_CGPR_FPL_SHIFT (16U) -/*! FPL - Fast PLL enable. - * 0b0..Engage PLL enable default way. - * 0b1..Engage PLL enable 3 CKIL clocks earlier at exiting low power mode (STOP). Should be used only if 24MHz OSC was active in low power mode. - */ -#define CCM_CGPR_FPL(x) (((uint32_t)(((uint32_t)(x)) << CCM_CGPR_FPL_SHIFT)) & CCM_CGPR_FPL_MASK) - -#define CCM_CGPR_INT_MEM_CLK_LPM_MASK (0x20000U) -#define CCM_CGPR_INT_MEM_CLK_LPM_SHIFT (17U) -/*! INT_MEM_CLK_LPM - * 0b0..Disable the clock to the ARM platform memories when entering Low Power Mode - * 0b1..Keep the clocks to the ARM platform memories enabled only if an interrupt is pending when entering Low - * Power Modes (WAIT and STOP without power gating) - */ -#define CCM_CGPR_INT_MEM_CLK_LPM(x) (((uint32_t)(((uint32_t)(x)) << CCM_CGPR_INT_MEM_CLK_LPM_SHIFT)) & CCM_CGPR_INT_MEM_CLK_LPM_MASK) -/*! @} */ - -/*! @name CCGR0 - CCM Clock Gating Register 0 */ -/*! @{ */ - -#define CCM_CCGR0_CG0_MASK (0x3U) -#define CCM_CCGR0_CG0_SHIFT (0U) -#define CCM_CCGR0_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG0_SHIFT)) & CCM_CCGR0_CG0_MASK) - -#define CCM_CCGR0_CG1_MASK (0xCU) -#define CCM_CCGR0_CG1_SHIFT (2U) -#define CCM_CCGR0_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG1_SHIFT)) & CCM_CCGR0_CG1_MASK) - -#define CCM_CCGR0_CG2_MASK (0x30U) -#define CCM_CCGR0_CG2_SHIFT (4U) -#define CCM_CCGR0_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG2_SHIFT)) & CCM_CCGR0_CG2_MASK) - -#define CCM_CCGR0_CG3_MASK (0xC0U) -#define CCM_CCGR0_CG3_SHIFT (6U) -#define CCM_CCGR0_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG3_SHIFT)) & CCM_CCGR0_CG3_MASK) - -#define CCM_CCGR0_CG4_MASK (0x300U) -#define CCM_CCGR0_CG4_SHIFT (8U) -#define CCM_CCGR0_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG4_SHIFT)) & CCM_CCGR0_CG4_MASK) - -#define CCM_CCGR0_CG5_MASK (0xC00U) -#define CCM_CCGR0_CG5_SHIFT (10U) -#define CCM_CCGR0_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG5_SHIFT)) & CCM_CCGR0_CG5_MASK) - -#define CCM_CCGR0_CG6_MASK (0x3000U) -#define CCM_CCGR0_CG6_SHIFT (12U) -#define CCM_CCGR0_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG6_SHIFT)) & CCM_CCGR0_CG6_MASK) - -#define CCM_CCGR0_CG7_MASK (0xC000U) -#define CCM_CCGR0_CG7_SHIFT (14U) -#define CCM_CCGR0_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG7_SHIFT)) & CCM_CCGR0_CG7_MASK) - -#define CCM_CCGR0_CG8_MASK (0x30000U) -#define CCM_CCGR0_CG8_SHIFT (16U) -#define CCM_CCGR0_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG8_SHIFT)) & CCM_CCGR0_CG8_MASK) - -#define CCM_CCGR0_CG9_MASK (0xC0000U) -#define CCM_CCGR0_CG9_SHIFT (18U) -#define CCM_CCGR0_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG9_SHIFT)) & CCM_CCGR0_CG9_MASK) - -#define CCM_CCGR0_CG10_MASK (0x300000U) -#define CCM_CCGR0_CG10_SHIFT (20U) -#define CCM_CCGR0_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG10_SHIFT)) & CCM_CCGR0_CG10_MASK) - -#define CCM_CCGR0_CG11_MASK (0xC00000U) -#define CCM_CCGR0_CG11_SHIFT (22U) -#define CCM_CCGR0_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG11_SHIFT)) & CCM_CCGR0_CG11_MASK) - -#define CCM_CCGR0_CG12_MASK (0x3000000U) -#define CCM_CCGR0_CG12_SHIFT (24U) -#define CCM_CCGR0_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG12_SHIFT)) & CCM_CCGR0_CG12_MASK) - -#define CCM_CCGR0_CG13_MASK (0xC000000U) -#define CCM_CCGR0_CG13_SHIFT (26U) -#define CCM_CCGR0_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG13_SHIFT)) & CCM_CCGR0_CG13_MASK) - -#define CCM_CCGR0_CG14_MASK (0x30000000U) -#define CCM_CCGR0_CG14_SHIFT (28U) -#define CCM_CCGR0_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG14_SHIFT)) & CCM_CCGR0_CG14_MASK) - -#define CCM_CCGR0_CG15_MASK (0xC0000000U) -#define CCM_CCGR0_CG15_SHIFT (30U) -#define CCM_CCGR0_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR0_CG15_SHIFT)) & CCM_CCGR0_CG15_MASK) -/*! @} */ - -/*! @name CCGR1 - CCM Clock Gating Register 1 */ -/*! @{ */ - -#define CCM_CCGR1_CG0_MASK (0x3U) -#define CCM_CCGR1_CG0_SHIFT (0U) -#define CCM_CCGR1_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG0_SHIFT)) & CCM_CCGR1_CG0_MASK) - -#define CCM_CCGR1_CG1_MASK (0xCU) -#define CCM_CCGR1_CG1_SHIFT (2U) -#define CCM_CCGR1_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG1_SHIFT)) & CCM_CCGR1_CG1_MASK) - -#define CCM_CCGR1_CG2_MASK (0x30U) -#define CCM_CCGR1_CG2_SHIFT (4U) -#define CCM_CCGR1_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG2_SHIFT)) & CCM_CCGR1_CG2_MASK) - -#define CCM_CCGR1_CG3_MASK (0xC0U) -#define CCM_CCGR1_CG3_SHIFT (6U) -#define CCM_CCGR1_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG3_SHIFT)) & CCM_CCGR1_CG3_MASK) - -#define CCM_CCGR1_CG4_MASK (0x300U) -#define CCM_CCGR1_CG4_SHIFT (8U) -#define CCM_CCGR1_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG4_SHIFT)) & CCM_CCGR1_CG4_MASK) - -#define CCM_CCGR1_CG5_MASK (0xC00U) -#define CCM_CCGR1_CG5_SHIFT (10U) -#define CCM_CCGR1_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG5_SHIFT)) & CCM_CCGR1_CG5_MASK) - -#define CCM_CCGR1_CG6_MASK (0x3000U) -#define CCM_CCGR1_CG6_SHIFT (12U) -#define CCM_CCGR1_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG6_SHIFT)) & CCM_CCGR1_CG6_MASK) - -#define CCM_CCGR1_CG7_MASK (0xC000U) -#define CCM_CCGR1_CG7_SHIFT (14U) -#define CCM_CCGR1_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG7_SHIFT)) & CCM_CCGR1_CG7_MASK) - -#define CCM_CCGR1_CG8_MASK (0x30000U) -#define CCM_CCGR1_CG8_SHIFT (16U) -#define CCM_CCGR1_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG8_SHIFT)) & CCM_CCGR1_CG8_MASK) - -#define CCM_CCGR1_CG9_MASK (0xC0000U) -#define CCM_CCGR1_CG9_SHIFT (18U) -#define CCM_CCGR1_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG9_SHIFT)) & CCM_CCGR1_CG9_MASK) - -#define CCM_CCGR1_CG10_MASK (0x300000U) -#define CCM_CCGR1_CG10_SHIFT (20U) -#define CCM_CCGR1_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG10_SHIFT)) & CCM_CCGR1_CG10_MASK) - -#define CCM_CCGR1_CG11_MASK (0xC00000U) -#define CCM_CCGR1_CG11_SHIFT (22U) -#define CCM_CCGR1_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG11_SHIFT)) & CCM_CCGR1_CG11_MASK) - -#define CCM_CCGR1_CG12_MASK (0x3000000U) -#define CCM_CCGR1_CG12_SHIFT (24U) -#define CCM_CCGR1_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG12_SHIFT)) & CCM_CCGR1_CG12_MASK) - -#define CCM_CCGR1_CG13_MASK (0xC000000U) -#define CCM_CCGR1_CG13_SHIFT (26U) -#define CCM_CCGR1_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG13_SHIFT)) & CCM_CCGR1_CG13_MASK) - -#define CCM_CCGR1_CG14_MASK (0x30000000U) -#define CCM_CCGR1_CG14_SHIFT (28U) -#define CCM_CCGR1_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG14_SHIFT)) & CCM_CCGR1_CG14_MASK) - -#define CCM_CCGR1_CG15_MASK (0xC0000000U) -#define CCM_CCGR1_CG15_SHIFT (30U) -#define CCM_CCGR1_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR1_CG15_SHIFT)) & CCM_CCGR1_CG15_MASK) -/*! @} */ - -/*! @name CCGR2 - CCM Clock Gating Register 2 */ -/*! @{ */ - -#define CCM_CCGR2_CG0_MASK (0x3U) -#define CCM_CCGR2_CG0_SHIFT (0U) -#define CCM_CCGR2_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG0_SHIFT)) & CCM_CCGR2_CG0_MASK) - -#define CCM_CCGR2_CG1_MASK (0xCU) -#define CCM_CCGR2_CG1_SHIFT (2U) -#define CCM_CCGR2_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG1_SHIFT)) & CCM_CCGR2_CG1_MASK) - -#define CCM_CCGR2_CG2_MASK (0x30U) -#define CCM_CCGR2_CG2_SHIFT (4U) -#define CCM_CCGR2_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG2_SHIFT)) & CCM_CCGR2_CG2_MASK) - -#define CCM_CCGR2_CG3_MASK (0xC0U) -#define CCM_CCGR2_CG3_SHIFT (6U) -#define CCM_CCGR2_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG3_SHIFT)) & CCM_CCGR2_CG3_MASK) - -#define CCM_CCGR2_CG4_MASK (0x300U) -#define CCM_CCGR2_CG4_SHIFT (8U) -#define CCM_CCGR2_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG4_SHIFT)) & CCM_CCGR2_CG4_MASK) - -#define CCM_CCGR2_CG5_MASK (0xC00U) -#define CCM_CCGR2_CG5_SHIFT (10U) -#define CCM_CCGR2_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG5_SHIFT)) & CCM_CCGR2_CG5_MASK) - -#define CCM_CCGR2_CG6_MASK (0x3000U) -#define CCM_CCGR2_CG6_SHIFT (12U) -#define CCM_CCGR2_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG6_SHIFT)) & CCM_CCGR2_CG6_MASK) - -#define CCM_CCGR2_CG7_MASK (0xC000U) -#define CCM_CCGR2_CG7_SHIFT (14U) -#define CCM_CCGR2_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG7_SHIFT)) & CCM_CCGR2_CG7_MASK) - -#define CCM_CCGR2_CG8_MASK (0x30000U) -#define CCM_CCGR2_CG8_SHIFT (16U) -#define CCM_CCGR2_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG8_SHIFT)) & CCM_CCGR2_CG8_MASK) - -#define CCM_CCGR2_CG9_MASK (0xC0000U) -#define CCM_CCGR2_CG9_SHIFT (18U) -#define CCM_CCGR2_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG9_SHIFT)) & CCM_CCGR2_CG9_MASK) - -#define CCM_CCGR2_CG10_MASK (0x300000U) -#define CCM_CCGR2_CG10_SHIFT (20U) -#define CCM_CCGR2_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG10_SHIFT)) & CCM_CCGR2_CG10_MASK) - -#define CCM_CCGR2_CG11_MASK (0xC00000U) -#define CCM_CCGR2_CG11_SHIFT (22U) -#define CCM_CCGR2_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG11_SHIFT)) & CCM_CCGR2_CG11_MASK) - -#define CCM_CCGR2_CG12_MASK (0x3000000U) -#define CCM_CCGR2_CG12_SHIFT (24U) -#define CCM_CCGR2_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG12_SHIFT)) & CCM_CCGR2_CG12_MASK) - -#define CCM_CCGR2_CG13_MASK (0xC000000U) -#define CCM_CCGR2_CG13_SHIFT (26U) -#define CCM_CCGR2_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG13_SHIFT)) & CCM_CCGR2_CG13_MASK) - -#define CCM_CCGR2_CG14_MASK (0x30000000U) -#define CCM_CCGR2_CG14_SHIFT (28U) -#define CCM_CCGR2_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG14_SHIFT)) & CCM_CCGR2_CG14_MASK) - -#define CCM_CCGR2_CG15_MASK (0xC0000000U) -#define CCM_CCGR2_CG15_SHIFT (30U) -#define CCM_CCGR2_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR2_CG15_SHIFT)) & CCM_CCGR2_CG15_MASK) -/*! @} */ - -/*! @name CCGR3 - CCM Clock Gating Register 3 */ -/*! @{ */ - -#define CCM_CCGR3_CG0_MASK (0x3U) -#define CCM_CCGR3_CG0_SHIFT (0U) -#define CCM_CCGR3_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG0_SHIFT)) & CCM_CCGR3_CG0_MASK) - -#define CCM_CCGR3_CG1_MASK (0xCU) -#define CCM_CCGR3_CG1_SHIFT (2U) -#define CCM_CCGR3_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG1_SHIFT)) & CCM_CCGR3_CG1_MASK) - -#define CCM_CCGR3_CG2_MASK (0x30U) -#define CCM_CCGR3_CG2_SHIFT (4U) -#define CCM_CCGR3_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG2_SHIFT)) & CCM_CCGR3_CG2_MASK) - -#define CCM_CCGR3_CG3_MASK (0xC0U) -#define CCM_CCGR3_CG3_SHIFT (6U) -#define CCM_CCGR3_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG3_SHIFT)) & CCM_CCGR3_CG3_MASK) - -#define CCM_CCGR3_CG4_MASK (0x300U) -#define CCM_CCGR3_CG4_SHIFT (8U) -#define CCM_CCGR3_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG4_SHIFT)) & CCM_CCGR3_CG4_MASK) - -#define CCM_CCGR3_CG5_MASK (0xC00U) -#define CCM_CCGR3_CG5_SHIFT (10U) -#define CCM_CCGR3_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG5_SHIFT)) & CCM_CCGR3_CG5_MASK) - -#define CCM_CCGR3_CG6_MASK (0x3000U) -#define CCM_CCGR3_CG6_SHIFT (12U) -#define CCM_CCGR3_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG6_SHIFT)) & CCM_CCGR3_CG6_MASK) - -#define CCM_CCGR3_CG7_MASK (0xC000U) -#define CCM_CCGR3_CG7_SHIFT (14U) -#define CCM_CCGR3_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG7_SHIFT)) & CCM_CCGR3_CG7_MASK) - -#define CCM_CCGR3_CG8_MASK (0x30000U) -#define CCM_CCGR3_CG8_SHIFT (16U) -#define CCM_CCGR3_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG8_SHIFT)) & CCM_CCGR3_CG8_MASK) - -#define CCM_CCGR3_CG9_MASK (0xC0000U) -#define CCM_CCGR3_CG9_SHIFT (18U) -#define CCM_CCGR3_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG9_SHIFT)) & CCM_CCGR3_CG9_MASK) - -#define CCM_CCGR3_CG10_MASK (0x300000U) -#define CCM_CCGR3_CG10_SHIFT (20U) -#define CCM_CCGR3_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG10_SHIFT)) & CCM_CCGR3_CG10_MASK) - -#define CCM_CCGR3_CG11_MASK (0xC00000U) -#define CCM_CCGR3_CG11_SHIFT (22U) -#define CCM_CCGR3_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG11_SHIFT)) & CCM_CCGR3_CG11_MASK) - -#define CCM_CCGR3_CG12_MASK (0x3000000U) -#define CCM_CCGR3_CG12_SHIFT (24U) -#define CCM_CCGR3_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG12_SHIFT)) & CCM_CCGR3_CG12_MASK) - -#define CCM_CCGR3_CG13_MASK (0xC000000U) -#define CCM_CCGR3_CG13_SHIFT (26U) -#define CCM_CCGR3_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG13_SHIFT)) & CCM_CCGR3_CG13_MASK) - -#define CCM_CCGR3_CG14_MASK (0x30000000U) -#define CCM_CCGR3_CG14_SHIFT (28U) -#define CCM_CCGR3_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG14_SHIFT)) & CCM_CCGR3_CG14_MASK) - -#define CCM_CCGR3_CG15_MASK (0xC0000000U) -#define CCM_CCGR3_CG15_SHIFT (30U) -#define CCM_CCGR3_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR3_CG15_SHIFT)) & CCM_CCGR3_CG15_MASK) -/*! @} */ - -/*! @name CCGR4 - CCM Clock Gating Register 4 */ -/*! @{ */ - -#define CCM_CCGR4_CG0_MASK (0x3U) -#define CCM_CCGR4_CG0_SHIFT (0U) -#define CCM_CCGR4_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG0_SHIFT)) & CCM_CCGR4_CG0_MASK) - -#define CCM_CCGR4_CG1_MASK (0xCU) -#define CCM_CCGR4_CG1_SHIFT (2U) -#define CCM_CCGR4_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG1_SHIFT)) & CCM_CCGR4_CG1_MASK) - -#define CCM_CCGR4_CG2_MASK (0x30U) -#define CCM_CCGR4_CG2_SHIFT (4U) -#define CCM_CCGR4_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG2_SHIFT)) & CCM_CCGR4_CG2_MASK) - -#define CCM_CCGR4_CG3_MASK (0xC0U) -#define CCM_CCGR4_CG3_SHIFT (6U) -#define CCM_CCGR4_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG3_SHIFT)) & CCM_CCGR4_CG3_MASK) - -#define CCM_CCGR4_CG4_MASK (0x300U) -#define CCM_CCGR4_CG4_SHIFT (8U) -#define CCM_CCGR4_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG4_SHIFT)) & CCM_CCGR4_CG4_MASK) - -#define CCM_CCGR4_CG5_MASK (0xC00U) -#define CCM_CCGR4_CG5_SHIFT (10U) -#define CCM_CCGR4_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG5_SHIFT)) & CCM_CCGR4_CG5_MASK) - -#define CCM_CCGR4_CG6_MASK (0x3000U) -#define CCM_CCGR4_CG6_SHIFT (12U) -#define CCM_CCGR4_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG6_SHIFT)) & CCM_CCGR4_CG6_MASK) - -#define CCM_CCGR4_CG7_MASK (0xC000U) -#define CCM_CCGR4_CG7_SHIFT (14U) -#define CCM_CCGR4_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG7_SHIFT)) & CCM_CCGR4_CG7_MASK) - -#define CCM_CCGR4_CG8_MASK (0x30000U) -#define CCM_CCGR4_CG8_SHIFT (16U) -#define CCM_CCGR4_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG8_SHIFT)) & CCM_CCGR4_CG8_MASK) - -#define CCM_CCGR4_CG9_MASK (0xC0000U) -#define CCM_CCGR4_CG9_SHIFT (18U) -#define CCM_CCGR4_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG9_SHIFT)) & CCM_CCGR4_CG9_MASK) - -#define CCM_CCGR4_CG10_MASK (0x300000U) -#define CCM_CCGR4_CG10_SHIFT (20U) -#define CCM_CCGR4_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG10_SHIFT)) & CCM_CCGR4_CG10_MASK) - -#define CCM_CCGR4_CG11_MASK (0xC00000U) -#define CCM_CCGR4_CG11_SHIFT (22U) -#define CCM_CCGR4_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG11_SHIFT)) & CCM_CCGR4_CG11_MASK) - -#define CCM_CCGR4_CG12_MASK (0x3000000U) -#define CCM_CCGR4_CG12_SHIFT (24U) -#define CCM_CCGR4_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG12_SHIFT)) & CCM_CCGR4_CG12_MASK) - -#define CCM_CCGR4_CG13_MASK (0xC000000U) -#define CCM_CCGR4_CG13_SHIFT (26U) -#define CCM_CCGR4_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG13_SHIFT)) & CCM_CCGR4_CG13_MASK) - -#define CCM_CCGR4_CG14_MASK (0x30000000U) -#define CCM_CCGR4_CG14_SHIFT (28U) -#define CCM_CCGR4_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG14_SHIFT)) & CCM_CCGR4_CG14_MASK) - -#define CCM_CCGR4_CG15_MASK (0xC0000000U) -#define CCM_CCGR4_CG15_SHIFT (30U) -#define CCM_CCGR4_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR4_CG15_SHIFT)) & CCM_CCGR4_CG15_MASK) -/*! @} */ - -/*! @name CCGR5 - CCM Clock Gating Register 5 */ -/*! @{ */ - -#define CCM_CCGR5_CG0_MASK (0x3U) -#define CCM_CCGR5_CG0_SHIFT (0U) -#define CCM_CCGR5_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG0_SHIFT)) & CCM_CCGR5_CG0_MASK) - -#define CCM_CCGR5_CG1_MASK (0xCU) -#define CCM_CCGR5_CG1_SHIFT (2U) -#define CCM_CCGR5_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG1_SHIFT)) & CCM_CCGR5_CG1_MASK) - -#define CCM_CCGR5_CG2_MASK (0x30U) -#define CCM_CCGR5_CG2_SHIFT (4U) -#define CCM_CCGR5_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG2_SHIFT)) & CCM_CCGR5_CG2_MASK) - -#define CCM_CCGR5_CG3_MASK (0xC0U) -#define CCM_CCGR5_CG3_SHIFT (6U) -#define CCM_CCGR5_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG3_SHIFT)) & CCM_CCGR5_CG3_MASK) - -#define CCM_CCGR5_CG4_MASK (0x300U) -#define CCM_CCGR5_CG4_SHIFT (8U) -#define CCM_CCGR5_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG4_SHIFT)) & CCM_CCGR5_CG4_MASK) - -#define CCM_CCGR5_CG5_MASK (0xC00U) -#define CCM_CCGR5_CG5_SHIFT (10U) -#define CCM_CCGR5_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG5_SHIFT)) & CCM_CCGR5_CG5_MASK) - -#define CCM_CCGR5_CG6_MASK (0x3000U) -#define CCM_CCGR5_CG6_SHIFT (12U) -#define CCM_CCGR5_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG6_SHIFT)) & CCM_CCGR5_CG6_MASK) - -#define CCM_CCGR5_CG7_MASK (0xC000U) -#define CCM_CCGR5_CG7_SHIFT (14U) -#define CCM_CCGR5_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG7_SHIFT)) & CCM_CCGR5_CG7_MASK) - -#define CCM_CCGR5_CG8_MASK (0x30000U) -#define CCM_CCGR5_CG8_SHIFT (16U) -#define CCM_CCGR5_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG8_SHIFT)) & CCM_CCGR5_CG8_MASK) - -#define CCM_CCGR5_CG9_MASK (0xC0000U) -#define CCM_CCGR5_CG9_SHIFT (18U) -#define CCM_CCGR5_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG9_SHIFT)) & CCM_CCGR5_CG9_MASK) - -#define CCM_CCGR5_CG10_MASK (0x300000U) -#define CCM_CCGR5_CG10_SHIFT (20U) -#define CCM_CCGR5_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG10_SHIFT)) & CCM_CCGR5_CG10_MASK) - -#define CCM_CCGR5_CG11_MASK (0xC00000U) -#define CCM_CCGR5_CG11_SHIFT (22U) -#define CCM_CCGR5_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG11_SHIFT)) & CCM_CCGR5_CG11_MASK) - -#define CCM_CCGR5_CG12_MASK (0x3000000U) -#define CCM_CCGR5_CG12_SHIFT (24U) -#define CCM_CCGR5_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG12_SHIFT)) & CCM_CCGR5_CG12_MASK) - -#define CCM_CCGR5_CG13_MASK (0xC000000U) -#define CCM_CCGR5_CG13_SHIFT (26U) -#define CCM_CCGR5_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG13_SHIFT)) & CCM_CCGR5_CG13_MASK) - -#define CCM_CCGR5_CG14_MASK (0x30000000U) -#define CCM_CCGR5_CG14_SHIFT (28U) -#define CCM_CCGR5_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG14_SHIFT)) & CCM_CCGR5_CG14_MASK) - -#define CCM_CCGR5_CG15_MASK (0xC0000000U) -#define CCM_CCGR5_CG15_SHIFT (30U) -#define CCM_CCGR5_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR5_CG15_SHIFT)) & CCM_CCGR5_CG15_MASK) -/*! @} */ - -/*! @name CCGR6 - CCM Clock Gating Register 6 */ -/*! @{ */ - -#define CCM_CCGR6_CG0_MASK (0x3U) -#define CCM_CCGR6_CG0_SHIFT (0U) -#define CCM_CCGR6_CG0(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG0_SHIFT)) & CCM_CCGR6_CG0_MASK) - -#define CCM_CCGR6_CG1_MASK (0xCU) -#define CCM_CCGR6_CG1_SHIFT (2U) -#define CCM_CCGR6_CG1(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG1_SHIFT)) & CCM_CCGR6_CG1_MASK) - -#define CCM_CCGR6_CG2_MASK (0x30U) -#define CCM_CCGR6_CG2_SHIFT (4U) -#define CCM_CCGR6_CG2(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG2_SHIFT)) & CCM_CCGR6_CG2_MASK) - -#define CCM_CCGR6_CG3_MASK (0xC0U) -#define CCM_CCGR6_CG3_SHIFT (6U) -#define CCM_CCGR6_CG3(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG3_SHIFT)) & CCM_CCGR6_CG3_MASK) - -#define CCM_CCGR6_CG4_MASK (0x300U) -#define CCM_CCGR6_CG4_SHIFT (8U) -#define CCM_CCGR6_CG4(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG4_SHIFT)) & CCM_CCGR6_CG4_MASK) - -#define CCM_CCGR6_CG5_MASK (0xC00U) -#define CCM_CCGR6_CG5_SHIFT (10U) -#define CCM_CCGR6_CG5(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG5_SHIFT)) & CCM_CCGR6_CG5_MASK) - -#define CCM_CCGR6_CG6_MASK (0x3000U) -#define CCM_CCGR6_CG6_SHIFT (12U) -#define CCM_CCGR6_CG6(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG6_SHIFT)) & CCM_CCGR6_CG6_MASK) - -#define CCM_CCGR6_CG7_MASK (0xC000U) -#define CCM_CCGR6_CG7_SHIFT (14U) -#define CCM_CCGR6_CG7(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG7_SHIFT)) & CCM_CCGR6_CG7_MASK) - -#define CCM_CCGR6_CG8_MASK (0x30000U) -#define CCM_CCGR6_CG8_SHIFT (16U) -#define CCM_CCGR6_CG8(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG8_SHIFT)) & CCM_CCGR6_CG8_MASK) - -#define CCM_CCGR6_CG9_MASK (0xC0000U) -#define CCM_CCGR6_CG9_SHIFT (18U) -#define CCM_CCGR6_CG9(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG9_SHIFT)) & CCM_CCGR6_CG9_MASK) - -#define CCM_CCGR6_CG10_MASK (0x300000U) -#define CCM_CCGR6_CG10_SHIFT (20U) -#define CCM_CCGR6_CG10(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG10_SHIFT)) & CCM_CCGR6_CG10_MASK) - -#define CCM_CCGR6_CG11_MASK (0xC00000U) -#define CCM_CCGR6_CG11_SHIFT (22U) -#define CCM_CCGR6_CG11(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG11_SHIFT)) & CCM_CCGR6_CG11_MASK) - -#define CCM_CCGR6_CG12_MASK (0x3000000U) -#define CCM_CCGR6_CG12_SHIFT (24U) -#define CCM_CCGR6_CG12(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG12_SHIFT)) & CCM_CCGR6_CG12_MASK) - -#define CCM_CCGR6_CG13_MASK (0xC000000U) -#define CCM_CCGR6_CG13_SHIFT (26U) -#define CCM_CCGR6_CG13(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG13_SHIFT)) & CCM_CCGR6_CG13_MASK) - -#define CCM_CCGR6_CG14_MASK (0x30000000U) -#define CCM_CCGR6_CG14_SHIFT (28U) -#define CCM_CCGR6_CG14(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG14_SHIFT)) & CCM_CCGR6_CG14_MASK) - -#define CCM_CCGR6_CG15_MASK (0xC0000000U) -#define CCM_CCGR6_CG15_SHIFT (30U) -#define CCM_CCGR6_CG15(x) (((uint32_t)(((uint32_t)(x)) << CCM_CCGR6_CG15_SHIFT)) & CCM_CCGR6_CG15_MASK) -/*! @} */ - -/*! @name CMEOR - CCM Module Enable Overide Register */ -/*! @{ */ - -#define CCM_CMEOR_MOD_EN_OV_GPT_MASK (0x20U) -#define CCM_CMEOR_MOD_EN_OV_GPT_SHIFT (5U) -/*! MOD_EN_OV_GPT - * 0b0..don't override module enable signal - * 0b1..override module enable signal - */ -#define CCM_CMEOR_MOD_EN_OV_GPT(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_OV_GPT_SHIFT)) & CCM_CMEOR_MOD_EN_OV_GPT_MASK) - -#define CCM_CMEOR_MOD_EN_OV_PIT_MASK (0x40U) -#define CCM_CMEOR_MOD_EN_OV_PIT_SHIFT (6U) -/*! MOD_EN_OV_PIT - * 0b0..don't override module enable signal - * 0b1..override module enable signal - */ -#define CCM_CMEOR_MOD_EN_OV_PIT(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_OV_PIT_SHIFT)) & CCM_CMEOR_MOD_EN_OV_PIT_MASK) - -#define CCM_CMEOR_MOD_EN_USDHC_MASK (0x80U) -#define CCM_CMEOR_MOD_EN_USDHC_SHIFT (7U) -/*! MOD_EN_USDHC - * 0b0..don't override module enable signal - * 0b1..override module enable signal - */ -#define CCM_CMEOR_MOD_EN_USDHC(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_USDHC_SHIFT)) & CCM_CMEOR_MOD_EN_USDHC_MASK) - -#define CCM_CMEOR_MOD_EN_OV_TRNG_MASK (0x200U) -#define CCM_CMEOR_MOD_EN_OV_TRNG_SHIFT (9U) -/*! MOD_EN_OV_TRNG - * 0b0..don't override module enable signal - * 0b1..override module enable signal - */ -#define CCM_CMEOR_MOD_EN_OV_TRNG(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_OV_TRNG_SHIFT)) & CCM_CMEOR_MOD_EN_OV_TRNG_MASK) - -#define CCM_CMEOR_MOD_EN_OV_CAN2_CPI_MASK (0x10000000U) -#define CCM_CMEOR_MOD_EN_OV_CAN2_CPI_SHIFT (28U) -/*! MOD_EN_OV_CAN2_CPI - * 0b0..don't override module enable signal - * 0b1..override module enable signal - */ -#define CCM_CMEOR_MOD_EN_OV_CAN2_CPI(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_OV_CAN2_CPI_SHIFT)) & CCM_CMEOR_MOD_EN_OV_CAN2_CPI_MASK) - -#define CCM_CMEOR_MOD_EN_OV_CAN1_CPI_MASK (0x40000000U) -#define CCM_CMEOR_MOD_EN_OV_CAN1_CPI_SHIFT (30U) -/*! MOD_EN_OV_CAN1_CPI - * 0b0..don't overide module enable signal - * 0b1..overide module enable signal - */ -#define CCM_CMEOR_MOD_EN_OV_CAN1_CPI(x) (((uint32_t)(((uint32_t)(x)) << CCM_CMEOR_MOD_EN_OV_CAN1_CPI_SHIFT)) & CCM_CMEOR_MOD_EN_OV_CAN1_CPI_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CCM_Register_Masks */ - - -/* CCM - Peripheral instance base addresses */ -/** Peripheral CCM base address */ -#define CCM_BASE (0x400FC000u) -/** Peripheral CCM base pointer */ -#define CCM ((CCM_Type *)CCM_BASE) -/** Array initializer of CCM peripheral base addresses */ -#define CCM_BASE_ADDRS { CCM_BASE } -/** Array initializer of CCM peripheral base pointers */ -#define CCM_BASE_PTRS { CCM } -/** Interrupt vectors for the CCM peripheral type */ -#define CCM_IRQS { CCM_1_IRQn, CCM_2_IRQn } - -/*! - * @} - */ /* end of group CCM_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CCM_ANALOG Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CCM_ANALOG_Peripheral_Access_Layer CCM_ANALOG Peripheral Access Layer - * @{ - */ - -/** CCM_ANALOG - Register Layout Typedef */ -typedef struct { - __IO uint32_t PLL_ARM; /**< Analog ARM PLL control Register, offset: 0x0 */ - __IO uint32_t PLL_ARM_SET; /**< Analog ARM PLL control Register, offset: 0x4 */ - __IO uint32_t PLL_ARM_CLR; /**< Analog ARM PLL control Register, offset: 0x8 */ - __IO uint32_t PLL_ARM_TOG; /**< Analog ARM PLL control Register, offset: 0xC */ - __IO uint32_t PLL_USB1; /**< Analog USB1 480MHz PLL Control Register, offset: 0x10 */ - __IO uint32_t PLL_USB1_SET; /**< Analog USB1 480MHz PLL Control Register, offset: 0x14 */ - __IO uint32_t PLL_USB1_CLR; /**< Analog USB1 480MHz PLL Control Register, offset: 0x18 */ - __IO uint32_t PLL_USB1_TOG; /**< Analog USB1 480MHz PLL Control Register, offset: 0x1C */ - __IO uint32_t PLL_USB2; /**< Analog USB2 480MHz PLL Control Register, offset: 0x20 */ - __IO uint32_t PLL_USB2_SET; /**< Analog USB2 480MHz PLL Control Register, offset: 0x24 */ - __IO uint32_t PLL_USB2_CLR; /**< Analog USB2 480MHz PLL Control Register, offset: 0x28 */ - __IO uint32_t PLL_USB2_TOG; /**< Analog USB2 480MHz PLL Control Register, offset: 0x2C */ - __IO uint32_t PLL_SYS; /**< Analog System PLL Control Register, offset: 0x30 */ - __IO uint32_t PLL_SYS_SET; /**< Analog System PLL Control Register, offset: 0x34 */ - __IO uint32_t PLL_SYS_CLR; /**< Analog System PLL Control Register, offset: 0x38 */ - __IO uint32_t PLL_SYS_TOG; /**< Analog System PLL Control Register, offset: 0x3C */ - __IO uint32_t PLL_SYS_SS; /**< 528MHz System PLL Spread Spectrum Register, offset: 0x40 */ - uint8_t RESERVED_0[12]; - __IO uint32_t PLL_SYS_NUM; /**< Numerator of 528MHz System PLL Fractional Loop Divider Register, offset: 0x50 */ - uint8_t RESERVED_1[12]; - __IO uint32_t PLL_SYS_DENOM; /**< Denominator of 528MHz System PLL Fractional Loop Divider Register, offset: 0x60 */ - uint8_t RESERVED_2[12]; - __IO uint32_t PLL_AUDIO; /**< Analog Audio PLL control Register, offset: 0x70 */ - __IO uint32_t PLL_AUDIO_SET; /**< Analog Audio PLL control Register, offset: 0x74 */ - __IO uint32_t PLL_AUDIO_CLR; /**< Analog Audio PLL control Register, offset: 0x78 */ - __IO uint32_t PLL_AUDIO_TOG; /**< Analog Audio PLL control Register, offset: 0x7C */ - __IO uint32_t PLL_AUDIO_NUM; /**< Numerator of Audio PLL Fractional Loop Divider Register, offset: 0x80 */ - uint8_t RESERVED_3[12]; - __IO uint32_t PLL_AUDIO_DENOM; /**< Denominator of Audio PLL Fractional Loop Divider Register, offset: 0x90 */ - uint8_t RESERVED_4[12]; - __IO uint32_t PLL_VIDEO; /**< Analog Video PLL control Register, offset: 0xA0 */ - __IO uint32_t PLL_VIDEO_SET; /**< Analog Video PLL control Register, offset: 0xA4 */ - __IO uint32_t PLL_VIDEO_CLR; /**< Analog Video PLL control Register, offset: 0xA8 */ - __IO uint32_t PLL_VIDEO_TOG; /**< Analog Video PLL control Register, offset: 0xAC */ - __IO uint32_t PLL_VIDEO_NUM; /**< Numerator of Video PLL Fractional Loop Divider Register, offset: 0xB0 */ - uint8_t RESERVED_5[12]; - __IO uint32_t PLL_VIDEO_DENOM; /**< Denominator of Video PLL Fractional Loop Divider Register, offset: 0xC0 */ - uint8_t RESERVED_6[28]; - __IO uint32_t PLL_ENET; /**< Analog ENET PLL Control Register, offset: 0xE0 */ - __IO uint32_t PLL_ENET_SET; /**< Analog ENET PLL Control Register, offset: 0xE4 */ - __IO uint32_t PLL_ENET_CLR; /**< Analog ENET PLL Control Register, offset: 0xE8 */ - __IO uint32_t PLL_ENET_TOG; /**< Analog ENET PLL Control Register, offset: 0xEC */ - __IO uint32_t PFD_480; /**< 480MHz Clock (PLL3) Phase Fractional Divider Control Register, offset: 0xF0 */ - __IO uint32_t PFD_480_SET; /**< 480MHz Clock (PLL3) Phase Fractional Divider Control Register, offset: 0xF4 */ - __IO uint32_t PFD_480_CLR; /**< 480MHz Clock (PLL3) Phase Fractional Divider Control Register, offset: 0xF8 */ - __IO uint32_t PFD_480_TOG; /**< 480MHz Clock (PLL3) Phase Fractional Divider Control Register, offset: 0xFC */ - __IO uint32_t PFD_528; /**< 528MHz Clock (PLL2) Phase Fractional Divider Control Register, offset: 0x100 */ - __IO uint32_t PFD_528_SET; /**< 528MHz Clock (PLL2) Phase Fractional Divider Control Register, offset: 0x104 */ - __IO uint32_t PFD_528_CLR; /**< 528MHz Clock (PLL2) Phase Fractional Divider Control Register, offset: 0x108 */ - __IO uint32_t PFD_528_TOG; /**< 528MHz Clock (PLL2) Phase Fractional Divider Control Register, offset: 0x10C */ - uint8_t RESERVED_7[64]; - __IO uint32_t MISC0; /**< Miscellaneous Register 0, offset: 0x150 */ - __IO uint32_t MISC0_SET; /**< Miscellaneous Register 0, offset: 0x154 */ - __IO uint32_t MISC0_CLR; /**< Miscellaneous Register 0, offset: 0x158 */ - __IO uint32_t MISC0_TOG; /**< Miscellaneous Register 0, offset: 0x15C */ - __IO uint32_t MISC1; /**< Miscellaneous Register 1, offset: 0x160 */ - __IO uint32_t MISC1_SET; /**< Miscellaneous Register 1, offset: 0x164 */ - __IO uint32_t MISC1_CLR; /**< Miscellaneous Register 1, offset: 0x168 */ - __IO uint32_t MISC1_TOG; /**< Miscellaneous Register 1, offset: 0x16C */ - __IO uint32_t MISC2; /**< Miscellaneous Register 2, offset: 0x170 */ - __IO uint32_t MISC2_SET; /**< Miscellaneous Register 2, offset: 0x174 */ - __IO uint32_t MISC2_CLR; /**< Miscellaneous Register 2, offset: 0x178 */ - __IO uint32_t MISC2_TOG; /**< Miscellaneous Register 2, offset: 0x17C */ -} CCM_ANALOG_Type; - -/* ---------------------------------------------------------------------------- - -- CCM_ANALOG Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CCM_ANALOG_Register_Masks CCM_ANALOG Register Masks - * @{ - */ - -/*! @name PLL_ARM - Analog ARM PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ARM_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ARM_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ARM_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ARM_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ARM_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ARM_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ARM_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ARM_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ARM_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ARM_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ARM_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ARM_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ARM_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ARM_PLL_SEL_MASK (0x80000U) -#define CCM_ANALOG_PLL_ARM_PLL_SEL_SHIFT (19U) -#define CCM_ANALOG_PLL_ARM_PLL_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_PLL_SEL_SHIFT)) & CCM_ANALOG_PLL_ARM_PLL_SEL_MASK) - -#define CCM_ANALOG_PLL_ARM_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ARM_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ARM_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_LOCK_SHIFT)) & CCM_ANALOG_PLL_ARM_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ARM_SET - Analog ARM PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ARM_SET_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_ARM_SET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ARM_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ARM_SET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ARM_SET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ARM_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ARM_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ARM_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ARM_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ARM_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ARM_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_PLL_SEL_MASK (0x80000U) -#define CCM_ANALOG_PLL_ARM_SET_PLL_SEL_SHIFT (19U) -#define CCM_ANALOG_PLL_ARM_SET_PLL_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_PLL_SEL_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_PLL_SEL_MASK) - -#define CCM_ANALOG_PLL_ARM_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ARM_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ARM_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_ARM_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ARM_CLR - Analog ARM PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ARM_CLR_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_ARM_CLR_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ARM_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ARM_CLR_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ARM_CLR_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ARM_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ARM_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ARM_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_PLL_SEL_MASK (0x80000U) -#define CCM_ANALOG_PLL_ARM_CLR_PLL_SEL_SHIFT (19U) -#define CCM_ANALOG_PLL_ARM_CLR_PLL_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_PLL_SEL_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_PLL_SEL_MASK) - -#define CCM_ANALOG_PLL_ARM_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ARM_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ARM_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_ARM_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ARM_TOG - Analog ARM PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ARM_TOG_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_ARM_TOG_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ARM_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ARM_TOG_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ARM_TOG_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ARM_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ARM_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ARM_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_PLL_SEL_MASK (0x80000U) -#define CCM_ANALOG_PLL_ARM_TOG_PLL_SEL_SHIFT (19U) -#define CCM_ANALOG_PLL_ARM_TOG_PLL_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_PLL_SEL_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_PLL_SEL_MASK) - -#define CCM_ANALOG_PLL_ARM_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ARM_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ARM_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ARM_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_ARM_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB1 - Analog USB1 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB1_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB1_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB1_EN_USB_CLKS_SHIFT (6U) -/*! EN_USB_CLKS - * 0b0..PLL outputs for USBPHYn off. - * 0b1..PLL outputs for USBPHYn on. - */ -#define CCM_ANALOG_PLL_USB1_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB1_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB1_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB1_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_POWER_SHIFT)) & CCM_ANALOG_PLL_USB1_POWER_MASK) - -#define CCM_ANALOG_PLL_USB1_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB1_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB1_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB1_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB1_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB1_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB1_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB1_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB1_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB1_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB1_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB1_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB1_SET - Analog USB1 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB1_SET_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB1_SET_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB1_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB1_SET_EN_USB_CLKS_SHIFT (6U) -/*! EN_USB_CLKS - * 0b0..PLL outputs for USBPHYn off. - * 0b1..PLL outputs for USBPHYn on. - */ -#define CCM_ANALOG_PLL_USB1_SET_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB1_SET_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB1_SET_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_POWER_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_POWER_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB1_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB1_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB1_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_USB1_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB1_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB1_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB1_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB1_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB1_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB1_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB1_CLR - Analog USB1 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB1_CLR_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB1_CLR_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB1_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB1_CLR_EN_USB_CLKS_SHIFT (6U) -/*! EN_USB_CLKS - * 0b0..PLL outputs for USBPHYn off. - * 0b1..PLL outputs for USBPHYn on. - */ -#define CCM_ANALOG_PLL_USB1_CLR_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB1_CLR_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB1_CLR_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_POWER_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_POWER_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB1_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB1_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB1_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB1_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB1_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB1_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB1_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB1_TOG - Analog USB1 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB1_TOG_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB1_TOG_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB1_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB1_TOG_EN_USB_CLKS_SHIFT (6U) -/*! EN_USB_CLKS - * 0b0..PLL outputs for USBPHYn off. - * 0b1..PLL outputs for USBPHYn on. - */ -#define CCM_ANALOG_PLL_USB1_TOG_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB1_TOG_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB1_TOG_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_POWER_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_POWER_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB1_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB1_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB1_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB1_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB1_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB1_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB1_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB1_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB2 - Analog USB2 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB2_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB2_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB2_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB2_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB2_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB2_EN_USB_CLKS_SHIFT (6U) -#define CCM_ANALOG_PLL_USB2_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB2_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB2_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB2_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB2_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_POWER_SHIFT)) & CCM_ANALOG_PLL_USB2_POWER_MASK) - -#define CCM_ANALOG_PLL_USB2_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB2_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB2_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB2_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB2_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB2_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB2_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB2_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB2_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB2_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB2_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB2_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB2_SET - Analog USB2 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB2_SET_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB2_SET_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB2_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB2_SET_EN_USB_CLKS_SHIFT (6U) -#define CCM_ANALOG_PLL_USB2_SET_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB2_SET_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB2_SET_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_POWER_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_POWER_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB2_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB2_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB2_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_USB2_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB2_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB2_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB2_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB2_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB2_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB2_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB2_CLR - Analog USB2 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB2_CLR_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB2_CLR_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB2_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB2_CLR_EN_USB_CLKS_SHIFT (6U) -#define CCM_ANALOG_PLL_USB2_CLR_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB2_CLR_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB2_CLR_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_POWER_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_POWER_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB2_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB2_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB2_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB2_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB2_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB2_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB2_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_USB2_TOG - Analog USB2 480MHz PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_USB2_TOG_DIV_SELECT_MASK (0x2U) -#define CCM_ANALOG_PLL_USB2_TOG_DIV_SELECT_SHIFT (1U) -#define CCM_ANALOG_PLL_USB2_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_EN_USB_CLKS_MASK (0x40U) -#define CCM_ANALOG_PLL_USB2_TOG_EN_USB_CLKS_SHIFT (6U) -#define CCM_ANALOG_PLL_USB2_TOG_EN_USB_CLKS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_EN_USB_CLKS_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_EN_USB_CLKS_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_POWER_MASK (0x1000U) -#define CCM_ANALOG_PLL_USB2_TOG_POWER_SHIFT (12U) -#define CCM_ANALOG_PLL_USB2_TOG_POWER(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_POWER_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_POWER_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_USB2_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_USB2_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_USB2_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_USB2_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_USB2_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_USB2_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_USB2_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_USB2_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_SYS - Analog System PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK (0x1U) -#define CCM_ANALOG_PLL_SYS_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_SYS_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_SYS_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_SYS_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_SYS_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_SYS_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_SYS_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_SYS_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_ENABLE_SHIFT)) & CCM_ANALOG_PLL_SYS_ENABLE_MASK) - -#define CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_SYS_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_SYS_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_SYS_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_BYPASS_SHIFT)) & CCM_ANALOG_PLL_SYS_BYPASS_MASK) - -#define CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_SYS_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_SYS_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_SYS_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_LOCK_SHIFT)) & CCM_ANALOG_PLL_SYS_LOCK_MASK) -/*! @} */ - -/*! @name PLL_SYS_SET - Analog System PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_SET_DIV_SELECT_MASK (0x1U) -#define CCM_ANALOG_PLL_SYS_SET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_SYS_SET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_SYS_SET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_SYS_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_SYS_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_SYS_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_SYS_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_SYS_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_SYS_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_SYS_SET_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_SYS_SET_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_SYS_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_SYS_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_SYS_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_SYS_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_SYS_CLR - Analog System PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_CLR_DIV_SELECT_MASK (0x1U) -#define CCM_ANALOG_PLL_SYS_CLR_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_SYS_CLR_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_SYS_CLR_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_SYS_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_SYS_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_SYS_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_SYS_CLR_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_SYS_CLR_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_SYS_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_SYS_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_SYS_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_SYS_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_SYS_TOG - Analog System PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_TOG_DIV_SELECT_MASK (0x1U) -#define CCM_ANALOG_PLL_SYS_TOG_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_SYS_TOG_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_SYS_TOG_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_SYS_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_SYS_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - */ -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_SYS_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_SYS_TOG_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_SYS_TOG_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_SYS_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_SYS_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_SYS_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_SYS_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_SYS_SS - 528MHz System PLL Spread Spectrum Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_SS_STEP_MASK (0x7FFFU) -#define CCM_ANALOG_PLL_SYS_SS_STEP_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_SS_STEP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SS_STEP_SHIFT)) & CCM_ANALOG_PLL_SYS_SS_STEP_MASK) - -#define CCM_ANALOG_PLL_SYS_SS_ENABLE_MASK (0x8000U) -#define CCM_ANALOG_PLL_SYS_SS_ENABLE_SHIFT (15U) -/*! ENABLE - Enable bit - * 0b0..Spread spectrum modulation disabled - * 0b1..Soread spectrum modulation enabled - */ -#define CCM_ANALOG_PLL_SYS_SS_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SS_ENABLE_SHIFT)) & CCM_ANALOG_PLL_SYS_SS_ENABLE_MASK) - -#define CCM_ANALOG_PLL_SYS_SS_STOP_MASK (0xFFFF0000U) -#define CCM_ANALOG_PLL_SYS_SS_STOP_SHIFT (16U) -#define CCM_ANALOG_PLL_SYS_SS_STOP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_SS_STOP_SHIFT)) & CCM_ANALOG_PLL_SYS_SS_STOP_MASK) -/*! @} */ - -/*! @name PLL_SYS_NUM - Numerator of 528MHz System PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_NUM_A_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_SYS_NUM_A_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_NUM_A(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_NUM_A_SHIFT)) & CCM_ANALOG_PLL_SYS_NUM_A_MASK) -/*! @} */ - -/*! @name PLL_SYS_DENOM - Denominator of 528MHz System PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_SYS_DENOM_B_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_SYS_DENOM_B_SHIFT (0U) -#define CCM_ANALOG_PLL_SYS_DENOM_B(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_SYS_DENOM_B_SHIFT)) & CCM_ANALOG_PLL_SYS_DENOM_B_MASK) -/*! @} */ - -/*! @name PLL_AUDIO - Analog Audio PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_AUDIO_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_AUDIO_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_AUDIO_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_AUDIO_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_AUDIO_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_ENABLE_SHIFT)) & CCM_ANALOG_PLL_AUDIO_ENABLE_MASK) - -#define CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_AUDIO_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_AUDIO_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_AUDIO_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_BYPASS_SHIFT)) & CCM_ANALOG_PLL_AUDIO_BYPASS_MASK) - -#define CCM_ANALOG_PLL_AUDIO_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_AUDIO_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_AUDIO_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_AUDIO_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_AUDIO_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_LOCK_SHIFT)) & CCM_ANALOG_PLL_AUDIO_LOCK_MASK) -/*! @} */ - -/*! @name PLL_AUDIO_SET - Analog Audio PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_SET_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_AUDIO_SET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_AUDIO_SET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_AUDIO_SET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_AUDIO_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_AUDIO_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_AUDIO_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_AUDIO_SET_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_AUDIO_SET_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_AUDIO_SET_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_AUDIO_SET_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_AUDIO_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_AUDIO_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_AUDIO_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_AUDIO_CLR - Analog Audio PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_CLR_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_AUDIO_CLR_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_AUDIO_CLR_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_AUDIO_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_AUDIO_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_AUDIO_CLR_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_AUDIO_CLR_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_AUDIO_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_AUDIO_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_AUDIO_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_AUDIO_TOG - Analog Audio PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_TOG_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_AUDIO_TOG_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_AUDIO_TOG_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_AUDIO_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_AUDIO_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_AUDIO_TOG_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_AUDIO_TOG_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_AUDIO_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_AUDIO_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_AUDIO_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_AUDIO_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_AUDIO_NUM - Numerator of Audio PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_NUM_A_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_AUDIO_NUM_A_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_NUM_A(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_NUM_A_SHIFT)) & CCM_ANALOG_PLL_AUDIO_NUM_A_MASK) -/*! @} */ - -/*! @name PLL_AUDIO_DENOM - Denominator of Audio PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_AUDIO_DENOM_B_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_AUDIO_DENOM_B_SHIFT (0U) -#define CCM_ANALOG_PLL_AUDIO_DENOM_B(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_AUDIO_DENOM_B_SHIFT)) & CCM_ANALOG_PLL_AUDIO_DENOM_B_MASK) -/*! @} */ - -/*! @name PLL_VIDEO - Analog Video PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_VIDEO_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_VIDEO_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_VIDEO_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_VIDEO_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_VIDEO_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_ENABLE_SHIFT)) & CCM_ANALOG_PLL_VIDEO_ENABLE_MASK) - -#define CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_VIDEO_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_VIDEO_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_VIDEO_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_BYPASS_SHIFT)) & CCM_ANALOG_PLL_VIDEO_BYPASS_MASK) - -#define CCM_ANALOG_PLL_VIDEO_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_VIDEO_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_VIDEO_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_VIDEO_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_VIDEO_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_LOCK_SHIFT)) & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) -/*! @} */ - -/*! @name PLL_VIDEO_SET - Analog Video PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_VIDEO_SET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_VIDEO_SET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_VIDEO_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_VIDEO_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_VIDEO_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_VIDEO_SET_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_VIDEO_SET_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_VIDEO_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_VIDEO_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_VIDEO_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_VIDEO_CLR - Analog Video PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_VIDEO_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_VIDEO_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_VIDEO_CLR_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_VIDEO_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_VIDEO_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_VIDEO_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_VIDEO_TOG - Analog Video PLL control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_TOG_DIV_SELECT_MASK (0x7FU) -#define CCM_ANALOG_PLL_VIDEO_TOG_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_VIDEO_TOG_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_VIDEO_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_VIDEO_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_VIDEO_TOG_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_POST_DIV_SELECT_MASK (0x180000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_POST_DIV_SELECT_SHIFT (19U) -/*! POST_DIV_SELECT - * 0b00..Divide by 4. - * 0b01..Divide by 2. - * 0b10..Divide by 1. - * 0b11..Reserved - */ -#define CCM_ANALOG_PLL_VIDEO_TOG_POST_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_POST_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_POST_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_VIDEO_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_VIDEO_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_VIDEO_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_VIDEO_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PLL_VIDEO_NUM - Numerator of Video PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_NUM_A_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_VIDEO_NUM_A_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_NUM_A(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_NUM_A_SHIFT)) & CCM_ANALOG_PLL_VIDEO_NUM_A_MASK) -/*! @} */ - -/*! @name PLL_VIDEO_DENOM - Denominator of Video PLL Fractional Loop Divider Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_VIDEO_DENOM_B_MASK (0x3FFFFFFFU) -#define CCM_ANALOG_PLL_VIDEO_DENOM_B_SHIFT (0U) -#define CCM_ANALOG_PLL_VIDEO_DENOM_B(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_VIDEO_DENOM_B_SHIFT)) & CCM_ANALOG_PLL_VIDEO_DENOM_B_MASK) -/*! @} */ - -/*! @name PLL_ENET - Analog ENET PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK (0x3U) -#define CCM_ANALOG_PLL_ENET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ENET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ENET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ENET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ENET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ENET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ENET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ENET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ENET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ENET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ENET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ENET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ENET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ENET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK (0x200000U) -#define CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_SHIFT (21U) -#define CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ENET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ENET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_LOCK_SHIFT)) & CCM_ANALOG_PLL_ENET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ENET_SET - Analog ENET PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ENET_SET_DIV_SELECT_MASK (0x3U) -#define CCM_ANALOG_PLL_ENET_SET_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ENET_SET_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ENET_SET_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ENET_SET_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ENET_SET_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ENET_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ENET_SET_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ENET_SET_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ENET_SET_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ENET_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_ENET_SET_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_ENET_SET_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_ENET_25M_REF_EN_MASK (0x200000U) -#define CCM_ANALOG_PLL_ENET_SET_ENET_25M_REF_EN_SHIFT (21U) -#define CCM_ANALOG_PLL_ENET_SET_ENET_25M_REF_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_ENET_25M_REF_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_ENET_25M_REF_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_SET_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ENET_SET_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ENET_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_SET_LOCK_SHIFT)) & CCM_ANALOG_PLL_ENET_SET_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ENET_CLR - Analog ENET PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ENET_CLR_DIV_SELECT_MASK (0x3U) -#define CCM_ANALOG_PLL_ENET_CLR_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ENET_CLR_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ENET_CLR_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ENET_CLR_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ENET_CLR_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ENET_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ENET_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_ENET_CLR_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_ENET_CLR_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_ENET_25M_REF_EN_MASK (0x200000U) -#define CCM_ANALOG_PLL_ENET_CLR_ENET_25M_REF_EN_SHIFT (21U) -#define CCM_ANALOG_PLL_ENET_CLR_ENET_25M_REF_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_ENET_25M_REF_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_ENET_25M_REF_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_CLR_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ENET_CLR_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ENET_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_CLR_LOCK_SHIFT)) & CCM_ANALOG_PLL_ENET_CLR_LOCK_MASK) -/*! @} */ - -/*! @name PLL_ENET_TOG - Analog ENET PLL Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PLL_ENET_TOG_DIV_SELECT_MASK (0x3U) -#define CCM_ANALOG_PLL_ENET_TOG_DIV_SELECT_SHIFT (0U) -#define CCM_ANALOG_PLL_ENET_TOG_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_DIV_SELECT_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_DIV_SELECT_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_POWERDOWN_MASK (0x1000U) -#define CCM_ANALOG_PLL_ENET_TOG_POWERDOWN_SHIFT (12U) -#define CCM_ANALOG_PLL_ENET_TOG_POWERDOWN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_POWERDOWN_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_POWERDOWN_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_ENABLE_MASK (0x2000U) -#define CCM_ANALOG_PLL_ENET_TOG_ENABLE_SHIFT (13U) -#define CCM_ANALOG_PLL_ENET_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_ENABLE_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_ENABLE_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS_CLK_SRC_SHIFT (14U) -/*! BYPASS_CLK_SRC - * 0b00..Select the 24MHz oscillator as source. - * 0b01..Select the CLK1_N / CLK1_P as source. - * 0b10..Reserved1 - * 0b11..Reserved2 - */ -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS_CLK_SRC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_BYPASS_CLK_SRC_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_BYPASS_CLK_SRC_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS_MASK (0x10000U) -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_ENET_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_BYPASS_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_BYPASS_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_PFD_OFFSET_EN_MASK (0x40000U) -#define CCM_ANALOG_PLL_ENET_TOG_PFD_OFFSET_EN_SHIFT (18U) -#define CCM_ANALOG_PLL_ENET_TOG_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_PFD_OFFSET_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_PFD_OFFSET_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_ENET_25M_REF_EN_MASK (0x200000U) -#define CCM_ANALOG_PLL_ENET_TOG_ENET_25M_REF_EN_SHIFT (21U) -#define CCM_ANALOG_PLL_ENET_TOG_ENET_25M_REF_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_ENET_25M_REF_EN_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_ENET_25M_REF_EN_MASK) - -#define CCM_ANALOG_PLL_ENET_TOG_LOCK_MASK (0x80000000U) -#define CCM_ANALOG_PLL_ENET_TOG_LOCK_SHIFT (31U) -#define CCM_ANALOG_PLL_ENET_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PLL_ENET_TOG_LOCK_SHIFT)) & CCM_ANALOG_PLL_ENET_TOG_LOCK_MASK) -/*! @} */ - -/*! @name PFD_480 - 480MHz Clock (PLL3) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_480_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_480_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_480_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_480_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_480_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_480_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_480_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_480_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_480_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_480_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_480_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_480_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_480_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_480_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_480_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_480_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_480_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_480_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_480_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_480_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_480_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_480_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_480_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_480_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_480_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_480_SET - 480MHz Clock (PLL3) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_480_SET_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_480_SET_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_480_SET_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_480_SET_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_480_SET_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_480_SET_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_480_SET_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_480_SET_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_480_SET_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_480_SET_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_480_SET_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_480_SET_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_480_SET_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_480_SET_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_480_SET_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_480_SET_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_480_SET_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_480_SET_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_480_SET_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_480_SET_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_480_SET_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_480_SET_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_480_SET_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_SET_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_480_SET_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_480_SET_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_SET_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_SET_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_480_CLR - 480MHz Clock (PLL3) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_480_CLR_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_480_CLR_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_480_CLR_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_480_CLR_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_480_CLR_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_480_CLR_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_480_CLR_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_480_CLR_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_480_CLR_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_CLR_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_480_CLR_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_CLR_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_CLR_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_480_TOG - 480MHz Clock (PLL3) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_480_TOG_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_480_TOG_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_480_TOG_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_480_TOG_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_480_TOG_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_480_TOG_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_480_TOG_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_480_TOG_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_480_TOG_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_480_TOG_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_480_TOG_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_528 - 528MHz Clock (PLL2) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_528_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_528_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_528_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_528_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_528_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_528_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_528_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_528_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_528_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_528_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_528_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_528_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_528_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_528_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_528_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_528_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_528_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_528_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_528_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_528_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_528_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_528_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_528_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_528_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_528_SET - 528MHz Clock (PLL2) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_528_SET_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_528_SET_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_528_SET_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_528_SET_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_528_SET_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_528_SET_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_528_SET_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_528_SET_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_528_SET_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_528_SET_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_528_SET_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_528_SET_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_528_SET_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_528_SET_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_528_SET_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_528_SET_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_528_SET_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_528_SET_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_528_SET_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_528_SET_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_528_SET_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_528_SET_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_528_SET_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_SET_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_528_SET_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_528_SET_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_SET_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_SET_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_528_CLR - 528MHz Clock (PLL2) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_528_CLR_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_528_CLR_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_528_CLR_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_528_CLR_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_528_CLR_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_528_CLR_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_528_CLR_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_528_CLR_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_528_CLR_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_CLR_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_528_CLR_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_CLR_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_CLR_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name PFD_528_TOG - 528MHz Clock (PLL2) Phase Fractional Divider Control Register */ -/*! @{ */ - -#define CCM_ANALOG_PFD_528_TOG_PFD0_FRAC_MASK (0x3FU) -#define CCM_ANALOG_PFD_528_TOG_PFD0_FRAC_SHIFT (0U) -#define CCM_ANALOG_PFD_528_TOG_PFD0_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD0_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD0_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD0_STABLE_MASK (0x40U) -#define CCM_ANALOG_PFD_528_TOG_PFD0_STABLE_SHIFT (6U) -#define CCM_ANALOG_PFD_528_TOG_PFD0_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD0_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD0_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD0_CLKGATE_MASK (0x80U) -#define CCM_ANALOG_PFD_528_TOG_PFD0_CLKGATE_SHIFT (7U) -#define CCM_ANALOG_PFD_528_TOG_PFD0_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD0_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD0_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD1_FRAC_MASK (0x3F00U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_FRAC_SHIFT (8U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD1_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD1_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD1_STABLE_MASK (0x4000U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_STABLE_SHIFT (14U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD1_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD1_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD1_CLKGATE_MASK (0x8000U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_CLKGATE_SHIFT (15U) -#define CCM_ANALOG_PFD_528_TOG_PFD1_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD1_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD1_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD2_FRAC_MASK (0x3F0000U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_FRAC_SHIFT (16U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD2_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD2_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD2_STABLE_MASK (0x400000U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_STABLE_SHIFT (22U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD2_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD2_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD2_CLKGATE_MASK (0x800000U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_CLKGATE_SHIFT (23U) -#define CCM_ANALOG_PFD_528_TOG_PFD2_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD2_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD2_CLKGATE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD3_FRAC_MASK (0x3F000000U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_FRAC_SHIFT (24U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_FRAC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD3_FRAC_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD3_FRAC_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD3_STABLE_MASK (0x40000000U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_STABLE_SHIFT (30U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_STABLE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD3_STABLE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD3_STABLE_MASK) - -#define CCM_ANALOG_PFD_528_TOG_PFD3_CLKGATE_MASK (0x80000000U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_CLKGATE_SHIFT (31U) -#define CCM_ANALOG_PFD_528_TOG_PFD3_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_PFD_528_TOG_PFD3_CLKGATE_SHIFT)) & CCM_ANALOG_PFD_528_TOG_PFD3_CLKGATE_MASK) -/*! @} */ - -/*! @name MISC0 - Miscellaneous Register 0 */ -/*! @{ */ - -#define CCM_ANALOG_MISC0_REFTOP_PWD_MASK (0x1U) -#define CCM_ANALOG_MISC0_REFTOP_PWD_SHIFT (0U) -#define CCM_ANALOG_MISC0_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_REFTOP_PWD_SHIFT)) & CCM_ANALOG_MISC0_REFTOP_PWD_MASK) - -#define CCM_ANALOG_MISC0_REFTOP_SELFBIASOFF_MASK (0x8U) -#define CCM_ANALOG_MISC0_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define CCM_ANALOG_MISC0_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_REFTOP_SELFBIASOFF_SHIFT)) & CCM_ANALOG_MISC0_REFTOP_SELFBIASOFF_MASK) - -#define CCM_ANALOG_MISC0_REFTOP_VBGADJ_MASK (0x70U) -#define CCM_ANALOG_MISC0_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define CCM_ANALOG_MISC0_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_REFTOP_VBGADJ_SHIFT)) & CCM_ANALOG_MISC0_REFTOP_VBGADJ_MASK) - -#define CCM_ANALOG_MISC0_REFTOP_VBGUP_MASK (0x80U) -#define CCM_ANALOG_MISC0_REFTOP_VBGUP_SHIFT (7U) -#define CCM_ANALOG_MISC0_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_REFTOP_VBGUP_SHIFT)) & CCM_ANALOG_MISC0_REFTOP_VBGUP_MASK) - -#define CCM_ANALOG_MISC0_STOP_MODE_CONFIG_MASK (0xC00U) -#define CCM_ANALOG_MISC0_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define CCM_ANALOG_MISC0_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_STOP_MODE_CONFIG_SHIFT)) & CCM_ANALOG_MISC0_STOP_MODE_CONFIG_MASK) - -#define CCM_ANALOG_MISC0_DISCON_HIGH_SNVS_MASK (0x1000U) -#define CCM_ANALOG_MISC0_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define CCM_ANALOG_MISC0_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_DISCON_HIGH_SNVS_SHIFT)) & CCM_ANALOG_MISC0_DISCON_HIGH_SNVS_MASK) - -#define CCM_ANALOG_MISC0_OSC_I_MASK (0x6000U) -#define CCM_ANALOG_MISC0_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define CCM_ANALOG_MISC0_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_OSC_I_SHIFT)) & CCM_ANALOG_MISC0_OSC_I_MASK) - -#define CCM_ANALOG_MISC0_OSC_XTALOK_MASK (0x8000U) -#define CCM_ANALOG_MISC0_OSC_XTALOK_SHIFT (15U) -#define CCM_ANALOG_MISC0_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_OSC_XTALOK_SHIFT)) & CCM_ANALOG_MISC0_OSC_XTALOK_MASK) - -#define CCM_ANALOG_MISC0_OSC_XTALOK_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC0_OSC_XTALOK_EN_SHIFT (16U) -#define CCM_ANALOG_MISC0_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_OSC_XTALOK_EN_SHIFT)) & CCM_ANALOG_MISC0_OSC_XTALOK_EN_MASK) - -#define CCM_ANALOG_MISC0_CLKGATE_CTRL_MASK (0x2000000U) -#define CCM_ANALOG_MISC0_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define CCM_ANALOG_MISC0_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLKGATE_CTRL_SHIFT)) & CCM_ANALOG_MISC0_CLKGATE_CTRL_MASK) - -#define CCM_ANALOG_MISC0_CLKGATE_DELAY_MASK (0x1C000000U) -#define CCM_ANALOG_MISC0_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define CCM_ANALOG_MISC0_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLKGATE_DELAY_SHIFT)) & CCM_ANALOG_MISC0_CLKGATE_DELAY_MASK) - -#define CCM_ANALOG_MISC0_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define CCM_ANALOG_MISC0_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define CCM_ANALOG_MISC0_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_RTC_XTAL_SOURCE_SHIFT)) & CCM_ANALOG_MISC0_RTC_XTAL_SOURCE_MASK) - -#define CCM_ANALOG_MISC0_XTAL_24M_PWD_MASK (0x40000000U) -#define CCM_ANALOG_MISC0_XTAL_24M_PWD_SHIFT (30U) -#define CCM_ANALOG_MISC0_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_XTAL_24M_PWD_SHIFT)) & CCM_ANALOG_MISC0_XTAL_24M_PWD_MASK) -/*! @} */ - -/*! @name MISC0_SET - Miscellaneous Register 0 */ -/*! @{ */ - -#define CCM_ANALOG_MISC0_SET_REFTOP_PWD_MASK (0x1U) -#define CCM_ANALOG_MISC0_SET_REFTOP_PWD_SHIFT (0U) -#define CCM_ANALOG_MISC0_SET_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_REFTOP_PWD_SHIFT)) & CCM_ANALOG_MISC0_SET_REFTOP_PWD_MASK) - -#define CCM_ANALOG_MISC0_SET_REFTOP_SELFBIASOFF_MASK (0x8U) -#define CCM_ANALOG_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define CCM_ANALOG_MISC0_SET_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT)) & CCM_ANALOG_MISC0_SET_REFTOP_SELFBIASOFF_MASK) - -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGADJ_MASK (0x70U) -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_REFTOP_VBGADJ_SHIFT)) & CCM_ANALOG_MISC0_SET_REFTOP_VBGADJ_MASK) - -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGUP_MASK (0x80U) -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGUP_SHIFT (7U) -#define CCM_ANALOG_MISC0_SET_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_REFTOP_VBGUP_SHIFT)) & CCM_ANALOG_MISC0_SET_REFTOP_VBGUP_MASK) - -#define CCM_ANALOG_MISC0_SET_STOP_MODE_CONFIG_MASK (0xC00U) -#define CCM_ANALOG_MISC0_SET_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define CCM_ANALOG_MISC0_SET_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_STOP_MODE_CONFIG_SHIFT)) & CCM_ANALOG_MISC0_SET_STOP_MODE_CONFIG_MASK) - -#define CCM_ANALOG_MISC0_SET_DISCON_HIGH_SNVS_MASK (0x1000U) -#define CCM_ANALOG_MISC0_SET_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define CCM_ANALOG_MISC0_SET_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_DISCON_HIGH_SNVS_SHIFT)) & CCM_ANALOG_MISC0_SET_DISCON_HIGH_SNVS_MASK) - -#define CCM_ANALOG_MISC0_SET_OSC_I_MASK (0x6000U) -#define CCM_ANALOG_MISC0_SET_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define CCM_ANALOG_MISC0_SET_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_OSC_I_SHIFT)) & CCM_ANALOG_MISC0_SET_OSC_I_MASK) - -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK_MASK (0x8000U) -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK_SHIFT (15U) -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_OSC_XTALOK_SHIFT)) & CCM_ANALOG_MISC0_SET_OSC_XTALOK_MASK) - -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK_EN_SHIFT (16U) -#define CCM_ANALOG_MISC0_SET_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_OSC_XTALOK_EN_SHIFT)) & CCM_ANALOG_MISC0_SET_OSC_XTALOK_EN_MASK) - -#define CCM_ANALOG_MISC0_SET_CLKGATE_CTRL_MASK (0x2000000U) -#define CCM_ANALOG_MISC0_SET_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define CCM_ANALOG_MISC0_SET_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_CLKGATE_CTRL_SHIFT)) & CCM_ANALOG_MISC0_SET_CLKGATE_CTRL_MASK) - -#define CCM_ANALOG_MISC0_SET_CLKGATE_DELAY_MASK (0x1C000000U) -#define CCM_ANALOG_MISC0_SET_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define CCM_ANALOG_MISC0_SET_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_CLKGATE_DELAY_SHIFT)) & CCM_ANALOG_MISC0_SET_CLKGATE_DELAY_MASK) - -#define CCM_ANALOG_MISC0_SET_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define CCM_ANALOG_MISC0_SET_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define CCM_ANALOG_MISC0_SET_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_RTC_XTAL_SOURCE_SHIFT)) & CCM_ANALOG_MISC0_SET_RTC_XTAL_SOURCE_MASK) - -#define CCM_ANALOG_MISC0_SET_XTAL_24M_PWD_MASK (0x40000000U) -#define CCM_ANALOG_MISC0_SET_XTAL_24M_PWD_SHIFT (30U) -#define CCM_ANALOG_MISC0_SET_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_SET_XTAL_24M_PWD_SHIFT)) & CCM_ANALOG_MISC0_SET_XTAL_24M_PWD_MASK) -/*! @} */ - -/*! @name MISC0_CLR - Miscellaneous Register 0 */ -/*! @{ */ - -#define CCM_ANALOG_MISC0_CLR_REFTOP_PWD_MASK (0x1U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_PWD_SHIFT (0U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_REFTOP_PWD_SHIFT)) & CCM_ANALOG_MISC0_CLR_REFTOP_PWD_MASK) - -#define CCM_ANALOG_MISC0_CLR_REFTOP_SELFBIASOFF_MASK (0x8U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define CCM_ANALOG_MISC0_CLR_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT)) & CCM_ANALOG_MISC0_CLR_REFTOP_SELFBIASOFF_MASK) - -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGADJ_MASK (0x70U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_REFTOP_VBGADJ_SHIFT)) & CCM_ANALOG_MISC0_CLR_REFTOP_VBGADJ_MASK) - -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGUP_MASK (0x80U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGUP_SHIFT (7U) -#define CCM_ANALOG_MISC0_CLR_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_REFTOP_VBGUP_SHIFT)) & CCM_ANALOG_MISC0_CLR_REFTOP_VBGUP_MASK) - -#define CCM_ANALOG_MISC0_CLR_STOP_MODE_CONFIG_MASK (0xC00U) -#define CCM_ANALOG_MISC0_CLR_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define CCM_ANALOG_MISC0_CLR_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_STOP_MODE_CONFIG_SHIFT)) & CCM_ANALOG_MISC0_CLR_STOP_MODE_CONFIG_MASK) - -#define CCM_ANALOG_MISC0_CLR_DISCON_HIGH_SNVS_MASK (0x1000U) -#define CCM_ANALOG_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define CCM_ANALOG_MISC0_CLR_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT)) & CCM_ANALOG_MISC0_CLR_DISCON_HIGH_SNVS_MASK) - -#define CCM_ANALOG_MISC0_CLR_OSC_I_MASK (0x6000U) -#define CCM_ANALOG_MISC0_CLR_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define CCM_ANALOG_MISC0_CLR_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_OSC_I_SHIFT)) & CCM_ANALOG_MISC0_CLR_OSC_I_MASK) - -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK_MASK (0x8000U) -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK_SHIFT (15U) -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_OSC_XTALOK_SHIFT)) & CCM_ANALOG_MISC0_CLR_OSC_XTALOK_MASK) - -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK_EN_SHIFT (16U) -#define CCM_ANALOG_MISC0_CLR_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_OSC_XTALOK_EN_SHIFT)) & CCM_ANALOG_MISC0_CLR_OSC_XTALOK_EN_MASK) - -#define CCM_ANALOG_MISC0_CLR_CLKGATE_CTRL_MASK (0x2000000U) -#define CCM_ANALOG_MISC0_CLR_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define CCM_ANALOG_MISC0_CLR_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_CLKGATE_CTRL_SHIFT)) & CCM_ANALOG_MISC0_CLR_CLKGATE_CTRL_MASK) - -#define CCM_ANALOG_MISC0_CLR_CLKGATE_DELAY_MASK (0x1C000000U) -#define CCM_ANALOG_MISC0_CLR_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define CCM_ANALOG_MISC0_CLR_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_CLKGATE_DELAY_SHIFT)) & CCM_ANALOG_MISC0_CLR_CLKGATE_DELAY_MASK) - -#define CCM_ANALOG_MISC0_CLR_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define CCM_ANALOG_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define CCM_ANALOG_MISC0_CLR_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT)) & CCM_ANALOG_MISC0_CLR_RTC_XTAL_SOURCE_MASK) - -#define CCM_ANALOG_MISC0_CLR_XTAL_24M_PWD_MASK (0x40000000U) -#define CCM_ANALOG_MISC0_CLR_XTAL_24M_PWD_SHIFT (30U) -#define CCM_ANALOG_MISC0_CLR_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_CLR_XTAL_24M_PWD_SHIFT)) & CCM_ANALOG_MISC0_CLR_XTAL_24M_PWD_MASK) -/*! @} */ - -/*! @name MISC0_TOG - Miscellaneous Register 0 */ -/*! @{ */ - -#define CCM_ANALOG_MISC0_TOG_REFTOP_PWD_MASK (0x1U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_PWD_SHIFT (0U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_REFTOP_PWD_SHIFT)) & CCM_ANALOG_MISC0_TOG_REFTOP_PWD_MASK) - -#define CCM_ANALOG_MISC0_TOG_REFTOP_SELFBIASOFF_MASK (0x8U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define CCM_ANALOG_MISC0_TOG_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT)) & CCM_ANALOG_MISC0_TOG_REFTOP_SELFBIASOFF_MASK) - -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGADJ_MASK (0x70U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_REFTOP_VBGADJ_SHIFT)) & CCM_ANALOG_MISC0_TOG_REFTOP_VBGADJ_MASK) - -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGUP_MASK (0x80U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGUP_SHIFT (7U) -#define CCM_ANALOG_MISC0_TOG_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_REFTOP_VBGUP_SHIFT)) & CCM_ANALOG_MISC0_TOG_REFTOP_VBGUP_MASK) - -#define CCM_ANALOG_MISC0_TOG_STOP_MODE_CONFIG_MASK (0xC00U) -#define CCM_ANALOG_MISC0_TOG_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define CCM_ANALOG_MISC0_TOG_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_STOP_MODE_CONFIG_SHIFT)) & CCM_ANALOG_MISC0_TOG_STOP_MODE_CONFIG_MASK) - -#define CCM_ANALOG_MISC0_TOG_DISCON_HIGH_SNVS_MASK (0x1000U) -#define CCM_ANALOG_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define CCM_ANALOG_MISC0_TOG_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT)) & CCM_ANALOG_MISC0_TOG_DISCON_HIGH_SNVS_MASK) - -#define CCM_ANALOG_MISC0_TOG_OSC_I_MASK (0x6000U) -#define CCM_ANALOG_MISC0_TOG_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define CCM_ANALOG_MISC0_TOG_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_OSC_I_SHIFT)) & CCM_ANALOG_MISC0_TOG_OSC_I_MASK) - -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK_MASK (0x8000U) -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK_SHIFT (15U) -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_OSC_XTALOK_SHIFT)) & CCM_ANALOG_MISC0_TOG_OSC_XTALOK_MASK) - -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK_EN_SHIFT (16U) -#define CCM_ANALOG_MISC0_TOG_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_OSC_XTALOK_EN_SHIFT)) & CCM_ANALOG_MISC0_TOG_OSC_XTALOK_EN_MASK) - -#define CCM_ANALOG_MISC0_TOG_CLKGATE_CTRL_MASK (0x2000000U) -#define CCM_ANALOG_MISC0_TOG_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define CCM_ANALOG_MISC0_TOG_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_CLKGATE_CTRL_SHIFT)) & CCM_ANALOG_MISC0_TOG_CLKGATE_CTRL_MASK) - -#define CCM_ANALOG_MISC0_TOG_CLKGATE_DELAY_MASK (0x1C000000U) -#define CCM_ANALOG_MISC0_TOG_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define CCM_ANALOG_MISC0_TOG_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_CLKGATE_DELAY_SHIFT)) & CCM_ANALOG_MISC0_TOG_CLKGATE_DELAY_MASK) - -#define CCM_ANALOG_MISC0_TOG_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define CCM_ANALOG_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define CCM_ANALOG_MISC0_TOG_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT)) & CCM_ANALOG_MISC0_TOG_RTC_XTAL_SOURCE_MASK) - -#define CCM_ANALOG_MISC0_TOG_XTAL_24M_PWD_MASK (0x40000000U) -#define CCM_ANALOG_MISC0_TOG_XTAL_24M_PWD_SHIFT (30U) -#define CCM_ANALOG_MISC0_TOG_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC0_TOG_XTAL_24M_PWD_SHIFT)) & CCM_ANALOG_MISC0_TOG_XTAL_24M_PWD_MASK) -/*! @} */ - -/*! @name MISC1 - Miscellaneous Register 1 */ -/*! @{ */ - -#define CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK (0x1FU) -#define CCM_ANALOG_MISC1_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define CCM_ANALOG_MISC1_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_LVDS1_CLK_SEL_SHIFT)) & CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK) - -#define CCM_ANALOG_MISC1_LVDSCLK1_OBEN_MASK (0x400U) -#define CCM_ANALOG_MISC1_LVDSCLK1_OBEN_SHIFT (10U) -#define CCM_ANALOG_MISC1_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_LVDSCLK1_OBEN_SHIFT)) & CCM_ANALOG_MISC1_LVDSCLK1_OBEN_MASK) - -#define CCM_ANALOG_MISC1_LVDSCLK1_IBEN_MASK (0x1000U) -#define CCM_ANALOG_MISC1_LVDSCLK1_IBEN_SHIFT (12U) -#define CCM_ANALOG_MISC1_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_LVDSCLK1_IBEN_SHIFT)) & CCM_ANALOG_MISC1_LVDSCLK1_IBEN_MASK) - -#define CCM_ANALOG_MISC1_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC1_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define CCM_ANALOG_MISC1_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_PFD_480_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_PFD_480_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define CCM_ANALOG_MISC1_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define CCM_ANALOG_MISC1_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_PFD_528_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_PFD_528_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_IRQ_TEMPPANIC_MASK (0x8000000U) -#define CCM_ANALOG_MISC1_IRQ_TEMPPANIC_SHIFT (27U) -#define CCM_ANALOG_MISC1_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_IRQ_TEMPPANIC_SHIFT)) & CCM_ANALOG_MISC1_IRQ_TEMPPANIC_MASK) - -#define CCM_ANALOG_MISC1_IRQ_TEMPLOW_MASK (0x10000000U) -#define CCM_ANALOG_MISC1_IRQ_TEMPLOW_SHIFT (28U) -#define CCM_ANALOG_MISC1_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_IRQ_TEMPLOW_SHIFT)) & CCM_ANALOG_MISC1_IRQ_TEMPLOW_MASK) - -#define CCM_ANALOG_MISC1_IRQ_TEMPHIGH_MASK (0x20000000U) -#define CCM_ANALOG_MISC1_IRQ_TEMPHIGH_SHIFT (29U) -#define CCM_ANALOG_MISC1_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_IRQ_TEMPHIGH_SHIFT)) & CCM_ANALOG_MISC1_IRQ_TEMPHIGH_MASK) - -#define CCM_ANALOG_MISC1_IRQ_ANA_BO_MASK (0x40000000U) -#define CCM_ANALOG_MISC1_IRQ_ANA_BO_SHIFT (30U) -#define CCM_ANALOG_MISC1_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_IRQ_ANA_BO_SHIFT)) & CCM_ANALOG_MISC1_IRQ_ANA_BO_MASK) - -#define CCM_ANALOG_MISC1_IRQ_DIG_BO_MASK (0x80000000U) -#define CCM_ANALOG_MISC1_IRQ_DIG_BO_SHIFT (31U) -#define CCM_ANALOG_MISC1_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_IRQ_DIG_BO_SHIFT)) & CCM_ANALOG_MISC1_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_SET - Miscellaneous Register 1 */ -/*! @{ */ - -#define CCM_ANALOG_MISC1_SET_LVDS1_CLK_SEL_MASK (0x1FU) -#define CCM_ANALOG_MISC1_SET_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define CCM_ANALOG_MISC1_SET_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_LVDS1_CLK_SEL_SHIFT)) & CCM_ANALOG_MISC1_SET_LVDS1_CLK_SEL_MASK) - -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_OBEN_MASK (0x400U) -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_OBEN_SHIFT (10U) -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_LVDSCLK1_OBEN_SHIFT)) & CCM_ANALOG_MISC1_SET_LVDSCLK1_OBEN_MASK) - -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_IBEN_MASK (0x1000U) -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_IBEN_SHIFT (12U) -#define CCM_ANALOG_MISC1_SET_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_LVDSCLK1_IBEN_SHIFT)) & CCM_ANALOG_MISC1_SET_LVDSCLK1_IBEN_MASK) - -#define CCM_ANALOG_MISC1_SET_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC1_SET_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define CCM_ANALOG_MISC1_SET_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_PFD_480_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_SET_PFD_480_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_SET_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define CCM_ANALOG_MISC1_SET_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define CCM_ANALOG_MISC1_SET_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_PFD_528_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_SET_PFD_528_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPPANIC_MASK (0x8000000U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPPANIC_SHIFT (27U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_IRQ_TEMPPANIC_SHIFT)) & CCM_ANALOG_MISC1_SET_IRQ_TEMPPANIC_MASK) - -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPLOW_MASK (0x10000000U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPLOW_SHIFT (28U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_IRQ_TEMPLOW_SHIFT)) & CCM_ANALOG_MISC1_SET_IRQ_TEMPLOW_MASK) - -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPHIGH_MASK (0x20000000U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPHIGH_SHIFT (29U) -#define CCM_ANALOG_MISC1_SET_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_IRQ_TEMPHIGH_SHIFT)) & CCM_ANALOG_MISC1_SET_IRQ_TEMPHIGH_MASK) - -#define CCM_ANALOG_MISC1_SET_IRQ_ANA_BO_MASK (0x40000000U) -#define CCM_ANALOG_MISC1_SET_IRQ_ANA_BO_SHIFT (30U) -#define CCM_ANALOG_MISC1_SET_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_IRQ_ANA_BO_SHIFT)) & CCM_ANALOG_MISC1_SET_IRQ_ANA_BO_MASK) - -#define CCM_ANALOG_MISC1_SET_IRQ_DIG_BO_MASK (0x80000000U) -#define CCM_ANALOG_MISC1_SET_IRQ_DIG_BO_SHIFT (31U) -#define CCM_ANALOG_MISC1_SET_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_SET_IRQ_DIG_BO_SHIFT)) & CCM_ANALOG_MISC1_SET_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_CLR - Miscellaneous Register 1 */ -/*! @{ */ - -#define CCM_ANALOG_MISC1_CLR_LVDS1_CLK_SEL_MASK (0x1FU) -#define CCM_ANALOG_MISC1_CLR_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define CCM_ANALOG_MISC1_CLR_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_LVDS1_CLK_SEL_SHIFT)) & CCM_ANALOG_MISC1_CLR_LVDS1_CLK_SEL_MASK) - -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_OBEN_MASK (0x400U) -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_OBEN_SHIFT (10U) -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_LVDSCLK1_OBEN_SHIFT)) & CCM_ANALOG_MISC1_CLR_LVDSCLK1_OBEN_MASK) - -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_IBEN_MASK (0x1000U) -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_IBEN_SHIFT (12U) -#define CCM_ANALOG_MISC1_CLR_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_LVDSCLK1_IBEN_SHIFT)) & CCM_ANALOG_MISC1_CLR_LVDSCLK1_IBEN_MASK) - -#define CCM_ANALOG_MISC1_CLR_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC1_CLR_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define CCM_ANALOG_MISC1_CLR_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_PFD_480_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_CLR_PFD_480_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_CLR_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define CCM_ANALOG_MISC1_CLR_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define CCM_ANALOG_MISC1_CLR_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_PFD_528_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_CLR_PFD_528_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPPANIC_MASK (0x8000000U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPPANIC_SHIFT (27U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_IRQ_TEMPPANIC_SHIFT)) & CCM_ANALOG_MISC1_CLR_IRQ_TEMPPANIC_MASK) - -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPLOW_MASK (0x10000000U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPLOW_SHIFT (28U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_IRQ_TEMPLOW_SHIFT)) & CCM_ANALOG_MISC1_CLR_IRQ_TEMPLOW_MASK) - -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPHIGH_MASK (0x20000000U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPHIGH_SHIFT (29U) -#define CCM_ANALOG_MISC1_CLR_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_IRQ_TEMPHIGH_SHIFT)) & CCM_ANALOG_MISC1_CLR_IRQ_TEMPHIGH_MASK) - -#define CCM_ANALOG_MISC1_CLR_IRQ_ANA_BO_MASK (0x40000000U) -#define CCM_ANALOG_MISC1_CLR_IRQ_ANA_BO_SHIFT (30U) -#define CCM_ANALOG_MISC1_CLR_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_IRQ_ANA_BO_SHIFT)) & CCM_ANALOG_MISC1_CLR_IRQ_ANA_BO_MASK) - -#define CCM_ANALOG_MISC1_CLR_IRQ_DIG_BO_MASK (0x80000000U) -#define CCM_ANALOG_MISC1_CLR_IRQ_DIG_BO_SHIFT (31U) -#define CCM_ANALOG_MISC1_CLR_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_CLR_IRQ_DIG_BO_SHIFT)) & CCM_ANALOG_MISC1_CLR_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_TOG - Miscellaneous Register 1 */ -/*! @{ */ - -#define CCM_ANALOG_MISC1_TOG_LVDS1_CLK_SEL_MASK (0x1FU) -#define CCM_ANALOG_MISC1_TOG_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define CCM_ANALOG_MISC1_TOG_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_LVDS1_CLK_SEL_SHIFT)) & CCM_ANALOG_MISC1_TOG_LVDS1_CLK_SEL_MASK) - -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_OBEN_MASK (0x400U) -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_OBEN_SHIFT (10U) -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_LVDSCLK1_OBEN_SHIFT)) & CCM_ANALOG_MISC1_TOG_LVDSCLK1_OBEN_MASK) - -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_IBEN_MASK (0x1000U) -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_IBEN_SHIFT (12U) -#define CCM_ANALOG_MISC1_TOG_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_LVDSCLK1_IBEN_SHIFT)) & CCM_ANALOG_MISC1_TOG_LVDSCLK1_IBEN_MASK) - -#define CCM_ANALOG_MISC1_TOG_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define CCM_ANALOG_MISC1_TOG_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define CCM_ANALOG_MISC1_TOG_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_PFD_480_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_TOG_PFD_480_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_TOG_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define CCM_ANALOG_MISC1_TOG_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define CCM_ANALOG_MISC1_TOG_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_PFD_528_AUTOGATE_EN_SHIFT)) & CCM_ANALOG_MISC1_TOG_PFD_528_AUTOGATE_EN_MASK) - -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPPANIC_MASK (0x8000000U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPPANIC_SHIFT (27U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_IRQ_TEMPPANIC_SHIFT)) & CCM_ANALOG_MISC1_TOG_IRQ_TEMPPANIC_MASK) - -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPLOW_MASK (0x10000000U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPLOW_SHIFT (28U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_IRQ_TEMPLOW_SHIFT)) & CCM_ANALOG_MISC1_TOG_IRQ_TEMPLOW_MASK) - -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPHIGH_MASK (0x20000000U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPHIGH_SHIFT (29U) -#define CCM_ANALOG_MISC1_TOG_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_IRQ_TEMPHIGH_SHIFT)) & CCM_ANALOG_MISC1_TOG_IRQ_TEMPHIGH_MASK) - -#define CCM_ANALOG_MISC1_TOG_IRQ_ANA_BO_MASK (0x40000000U) -#define CCM_ANALOG_MISC1_TOG_IRQ_ANA_BO_SHIFT (30U) -#define CCM_ANALOG_MISC1_TOG_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_IRQ_ANA_BO_SHIFT)) & CCM_ANALOG_MISC1_TOG_IRQ_ANA_BO_MASK) - -#define CCM_ANALOG_MISC1_TOG_IRQ_DIG_BO_MASK (0x80000000U) -#define CCM_ANALOG_MISC1_TOG_IRQ_DIG_BO_SHIFT (31U) -#define CCM_ANALOG_MISC1_TOG_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC1_TOG_IRQ_DIG_BO_SHIFT)) & CCM_ANALOG_MISC1_TOG_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC2 - Miscellaneous Register 2 */ -/*! @{ */ - -#define CCM_ANALOG_MISC2_REG0_BO_OFFSET_MASK (0x7U) -#define CCM_ANALOG_MISC2_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG0_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_REG0_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_REG0_BO_STATUS_MASK (0x8U) -#define CCM_ANALOG_MISC2_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG0_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_REG0_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_REG0_ENABLE_BO_MASK (0x20U) -#define CCM_ANALOG_MISC2_REG0_ENABLE_BO_SHIFT (5U) -#define CCM_ANALOG_MISC2_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG0_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_REG0_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_REG0_OK_MASK (0x40U) -#define CCM_ANALOG_MISC2_REG0_OK_SHIFT (6U) -#define CCM_ANALOG_MISC2_REG0_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG0_OK_SHIFT)) & CCM_ANALOG_MISC2_REG0_OK_MASK) - -#define CCM_ANALOG_MISC2_PLL3_disable_MASK (0x80U) -#define CCM_ANALOG_MISC2_PLL3_disable_SHIFT (7U) -/*! PLL3_disable - * 0b0..PLL3 is being used by peripherals and is enabled when SoC is not in any low power mode - * 0b1..PLL3 can be disabled when the SoC is not in any low power mode - */ -#define CCM_ANALOG_MISC2_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_PLL3_disable_SHIFT)) & CCM_ANALOG_MISC2_PLL3_disable_MASK) - -#define CCM_ANALOG_MISC2_REG1_BO_OFFSET_MASK (0x700U) -#define CCM_ANALOG_MISC2_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG1_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_REG1_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_REG1_BO_STATUS_MASK (0x800U) -#define CCM_ANALOG_MISC2_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG1_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_REG1_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_REG1_ENABLE_BO_MASK (0x2000U) -#define CCM_ANALOG_MISC2_REG1_ENABLE_BO_SHIFT (13U) -#define CCM_ANALOG_MISC2_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG1_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_REG1_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_REG1_OK_MASK (0x4000U) -#define CCM_ANALOG_MISC2_REG1_OK_SHIFT (14U) -#define CCM_ANALOG_MISC2_REG1_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG1_OK_SHIFT)) & CCM_ANALOG_MISC2_REG1_OK_MASK) - -#define CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK (0x8000U) -#define CCM_ANALOG_MISC2_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_AUDIO_DIV_LSB_SHIFT)) & CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK) - -#define CCM_ANALOG_MISC2_REG2_BO_OFFSET_MASK (0x70000U) -#define CCM_ANALOG_MISC2_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG2_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_REG2_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_REG2_BO_STATUS_MASK (0x80000U) -#define CCM_ANALOG_MISC2_REG2_BO_STATUS_SHIFT (19U) -#define CCM_ANALOG_MISC2_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG2_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_REG2_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_REG2_ENABLE_BO_MASK (0x200000U) -#define CCM_ANALOG_MISC2_REG2_ENABLE_BO_SHIFT (21U) -#define CCM_ANALOG_MISC2_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG2_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_REG2_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_REG2_OK_MASK (0x400000U) -#define CCM_ANALOG_MISC2_REG2_OK_SHIFT (22U) -#define CCM_ANALOG_MISC2_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG2_OK_SHIFT)) & CCM_ANALOG_MISC2_REG2_OK_MASK) - -#define CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK (0x800000U) -#define CCM_ANALOG_MISC2_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_AUDIO_DIV_MSB_SHIFT)) & CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK) - -#define CCM_ANALOG_MISC2_REG0_STEP_TIME_MASK (0x3000000U) -#define CCM_ANALOG_MISC2_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG0_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_REG0_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_REG1_STEP_TIME_MASK (0xC000000U) -#define CCM_ANALOG_MISC2_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG1_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_REG1_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_REG2_STEP_TIME_MASK (0x30000000U) -#define CCM_ANALOG_MISC2_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_REG2_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_REG2_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_VIDEO_DIV_MASK (0xC0000000U) -#define CCM_ANALOG_MISC2_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define CCM_ANALOG_MISC2_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_VIDEO_DIV_SHIFT)) & CCM_ANALOG_MISC2_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_SET - Miscellaneous Register 2 */ -/*! @{ */ - -#define CCM_ANALOG_MISC2_SET_REG0_BO_OFFSET_MASK (0x7U) -#define CCM_ANALOG_MISC2_SET_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_SET_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG0_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_SET_REG0_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_SET_REG0_BO_STATUS_MASK (0x8U) -#define CCM_ANALOG_MISC2_SET_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_SET_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG0_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_SET_REG0_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_SET_REG0_ENABLE_BO_MASK (0x20U) -#define CCM_ANALOG_MISC2_SET_REG0_ENABLE_BO_SHIFT (5U) -#define CCM_ANALOG_MISC2_SET_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG0_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_SET_REG0_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_SET_REG0_OK_MASK (0x40U) -#define CCM_ANALOG_MISC2_SET_REG0_OK_SHIFT (6U) -#define CCM_ANALOG_MISC2_SET_REG0_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG0_OK_SHIFT)) & CCM_ANALOG_MISC2_SET_REG0_OK_MASK) - -#define CCM_ANALOG_MISC2_SET_PLL3_disable_MASK (0x80U) -#define CCM_ANALOG_MISC2_SET_PLL3_disable_SHIFT (7U) -/*! PLL3_disable - * 0b0..PLL3 is being used by peripherals and is enabled when SoC is not in any low power mode - * 0b1..PLL3 can be disabled when the SoC is not in any low power mode - */ -#define CCM_ANALOG_MISC2_SET_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_PLL3_disable_SHIFT)) & CCM_ANALOG_MISC2_SET_PLL3_disable_MASK) - -#define CCM_ANALOG_MISC2_SET_REG1_BO_OFFSET_MASK (0x700U) -#define CCM_ANALOG_MISC2_SET_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_SET_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG1_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_SET_REG1_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_SET_REG1_BO_STATUS_MASK (0x800U) -#define CCM_ANALOG_MISC2_SET_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_SET_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG1_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_SET_REG1_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_SET_REG1_ENABLE_BO_MASK (0x2000U) -#define CCM_ANALOG_MISC2_SET_REG1_ENABLE_BO_SHIFT (13U) -#define CCM_ANALOG_MISC2_SET_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG1_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_SET_REG1_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_SET_REG1_OK_MASK (0x4000U) -#define CCM_ANALOG_MISC2_SET_REG1_OK_SHIFT (14U) -#define CCM_ANALOG_MISC2_SET_REG1_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG1_OK_SHIFT)) & CCM_ANALOG_MISC2_SET_REG1_OK_MASK) - -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_LSB_MASK (0x8000U) -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_AUDIO_DIV_LSB_SHIFT)) & CCM_ANALOG_MISC2_SET_AUDIO_DIV_LSB_MASK) - -#define CCM_ANALOG_MISC2_SET_REG2_BO_OFFSET_MASK (0x70000U) -#define CCM_ANALOG_MISC2_SET_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_SET_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG2_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_SET_REG2_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_SET_REG2_BO_STATUS_MASK (0x80000U) -#define CCM_ANALOG_MISC2_SET_REG2_BO_STATUS_SHIFT (19U) -#define CCM_ANALOG_MISC2_SET_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG2_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_SET_REG2_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_SET_REG2_ENABLE_BO_MASK (0x200000U) -#define CCM_ANALOG_MISC2_SET_REG2_ENABLE_BO_SHIFT (21U) -#define CCM_ANALOG_MISC2_SET_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG2_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_SET_REG2_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_SET_REG2_OK_MASK (0x400000U) -#define CCM_ANALOG_MISC2_SET_REG2_OK_SHIFT (22U) -#define CCM_ANALOG_MISC2_SET_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG2_OK_SHIFT)) & CCM_ANALOG_MISC2_SET_REG2_OK_MASK) - -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_MSB_MASK (0x800000U) -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_SET_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_AUDIO_DIV_MSB_SHIFT)) & CCM_ANALOG_MISC2_SET_AUDIO_DIV_MSB_MASK) - -#define CCM_ANALOG_MISC2_SET_REG0_STEP_TIME_MASK (0x3000000U) -#define CCM_ANALOG_MISC2_SET_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_SET_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG0_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_SET_REG0_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_SET_REG1_STEP_TIME_MASK (0xC000000U) -#define CCM_ANALOG_MISC2_SET_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_SET_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG1_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_SET_REG1_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_SET_REG2_STEP_TIME_MASK (0x30000000U) -#define CCM_ANALOG_MISC2_SET_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_SET_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_REG2_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_SET_REG2_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_SET_VIDEO_DIV_MASK (0xC0000000U) -#define CCM_ANALOG_MISC2_SET_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define CCM_ANALOG_MISC2_SET_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_SET_VIDEO_DIV_SHIFT)) & CCM_ANALOG_MISC2_SET_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_CLR - Miscellaneous Register 2 */ -/*! @{ */ - -#define CCM_ANALOG_MISC2_CLR_REG0_BO_OFFSET_MASK (0x7U) -#define CCM_ANALOG_MISC2_CLR_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_CLR_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG0_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG0_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG0_BO_STATUS_MASK (0x8U) -#define CCM_ANALOG_MISC2_CLR_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_CLR_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG0_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG0_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG0_ENABLE_BO_MASK (0x20U) -#define CCM_ANALOG_MISC2_CLR_REG0_ENABLE_BO_SHIFT (5U) -#define CCM_ANALOG_MISC2_CLR_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG0_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG0_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG0_OK_MASK (0x40U) -#define CCM_ANALOG_MISC2_CLR_REG0_OK_SHIFT (6U) -#define CCM_ANALOG_MISC2_CLR_REG0_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG0_OK_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG0_OK_MASK) - -#define CCM_ANALOG_MISC2_CLR_PLL3_disable_MASK (0x80U) -#define CCM_ANALOG_MISC2_CLR_PLL3_disable_SHIFT (7U) -/*! PLL3_disable - * 0b0..PLL3 is being used by peripherals and is enabled when SoC is not in any low power mode - * 0b1..PLL3 can be disabled when the SoC is not in any low power mode - */ -#define CCM_ANALOG_MISC2_CLR_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_PLL3_disable_SHIFT)) & CCM_ANALOG_MISC2_CLR_PLL3_disable_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG1_BO_OFFSET_MASK (0x700U) -#define CCM_ANALOG_MISC2_CLR_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_CLR_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG1_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG1_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG1_BO_STATUS_MASK (0x800U) -#define CCM_ANALOG_MISC2_CLR_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_CLR_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG1_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG1_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG1_ENABLE_BO_MASK (0x2000U) -#define CCM_ANALOG_MISC2_CLR_REG1_ENABLE_BO_SHIFT (13U) -#define CCM_ANALOG_MISC2_CLR_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG1_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG1_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG1_OK_MASK (0x4000U) -#define CCM_ANALOG_MISC2_CLR_REG1_OK_SHIFT (14U) -#define CCM_ANALOG_MISC2_CLR_REG1_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG1_OK_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG1_OK_MASK) - -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_LSB_MASK (0x8000U) -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_AUDIO_DIV_LSB_SHIFT)) & CCM_ANALOG_MISC2_CLR_AUDIO_DIV_LSB_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG2_BO_OFFSET_MASK (0x70000U) -#define CCM_ANALOG_MISC2_CLR_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_CLR_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG2_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG2_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG2_BO_STATUS_MASK (0x80000U) -#define CCM_ANALOG_MISC2_CLR_REG2_BO_STATUS_SHIFT (19U) -#define CCM_ANALOG_MISC2_CLR_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG2_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG2_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG2_ENABLE_BO_MASK (0x200000U) -#define CCM_ANALOG_MISC2_CLR_REG2_ENABLE_BO_SHIFT (21U) -#define CCM_ANALOG_MISC2_CLR_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG2_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG2_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG2_OK_MASK (0x400000U) -#define CCM_ANALOG_MISC2_CLR_REG2_OK_SHIFT (22U) -#define CCM_ANALOG_MISC2_CLR_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG2_OK_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG2_OK_MASK) - -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_MSB_MASK (0x800000U) -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_CLR_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_AUDIO_DIV_MSB_SHIFT)) & CCM_ANALOG_MISC2_CLR_AUDIO_DIV_MSB_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG0_STEP_TIME_MASK (0x3000000U) -#define CCM_ANALOG_MISC2_CLR_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_CLR_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG0_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG0_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG1_STEP_TIME_MASK (0xC000000U) -#define CCM_ANALOG_MISC2_CLR_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_CLR_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG1_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG1_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_CLR_REG2_STEP_TIME_MASK (0x30000000U) -#define CCM_ANALOG_MISC2_CLR_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_CLR_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_REG2_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_CLR_REG2_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_CLR_VIDEO_DIV_MASK (0xC0000000U) -#define CCM_ANALOG_MISC2_CLR_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define CCM_ANALOG_MISC2_CLR_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_CLR_VIDEO_DIV_SHIFT)) & CCM_ANALOG_MISC2_CLR_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_TOG - Miscellaneous Register 2 */ -/*! @{ */ - -#define CCM_ANALOG_MISC2_TOG_REG0_BO_OFFSET_MASK (0x7U) -#define CCM_ANALOG_MISC2_TOG_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_TOG_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG0_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG0_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG0_BO_STATUS_MASK (0x8U) -#define CCM_ANALOG_MISC2_TOG_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_TOG_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG0_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG0_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG0_ENABLE_BO_MASK (0x20U) -#define CCM_ANALOG_MISC2_TOG_REG0_ENABLE_BO_SHIFT (5U) -#define CCM_ANALOG_MISC2_TOG_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG0_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG0_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG0_OK_MASK (0x40U) -#define CCM_ANALOG_MISC2_TOG_REG0_OK_SHIFT (6U) -#define CCM_ANALOG_MISC2_TOG_REG0_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG0_OK_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG0_OK_MASK) - -#define CCM_ANALOG_MISC2_TOG_PLL3_disable_MASK (0x80U) -#define CCM_ANALOG_MISC2_TOG_PLL3_disable_SHIFT (7U) -/*! PLL3_disable - * 0b0..PLL3 is being used by peripherals and is enabled when SoC is not in any low power mode - * 0b1..PLL3 can be disabled when the SoC is not in any low power mode - */ -#define CCM_ANALOG_MISC2_TOG_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_PLL3_disable_SHIFT)) & CCM_ANALOG_MISC2_TOG_PLL3_disable_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG1_BO_OFFSET_MASK (0x700U) -#define CCM_ANALOG_MISC2_TOG_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_TOG_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG1_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG1_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG1_BO_STATUS_MASK (0x800U) -#define CCM_ANALOG_MISC2_TOG_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define CCM_ANALOG_MISC2_TOG_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG1_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG1_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG1_ENABLE_BO_MASK (0x2000U) -#define CCM_ANALOG_MISC2_TOG_REG1_ENABLE_BO_SHIFT (13U) -#define CCM_ANALOG_MISC2_TOG_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG1_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG1_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG1_OK_MASK (0x4000U) -#define CCM_ANALOG_MISC2_TOG_REG1_OK_SHIFT (14U) -#define CCM_ANALOG_MISC2_TOG_REG1_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG1_OK_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG1_OK_MASK) - -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_LSB_MASK (0x8000U) -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_AUDIO_DIV_LSB_SHIFT)) & CCM_ANALOG_MISC2_TOG_AUDIO_DIV_LSB_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG2_BO_OFFSET_MASK (0x70000U) -#define CCM_ANALOG_MISC2_TOG_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define CCM_ANALOG_MISC2_TOG_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG2_BO_OFFSET_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG2_BO_OFFSET_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG2_BO_STATUS_MASK (0x80000U) -#define CCM_ANALOG_MISC2_TOG_REG2_BO_STATUS_SHIFT (19U) -#define CCM_ANALOG_MISC2_TOG_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG2_BO_STATUS_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG2_BO_STATUS_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG2_ENABLE_BO_MASK (0x200000U) -#define CCM_ANALOG_MISC2_TOG_REG2_ENABLE_BO_SHIFT (21U) -#define CCM_ANALOG_MISC2_TOG_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG2_ENABLE_BO_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG2_ENABLE_BO_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG2_OK_MASK (0x400000U) -#define CCM_ANALOG_MISC2_TOG_REG2_OK_SHIFT (22U) -#define CCM_ANALOG_MISC2_TOG_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG2_OK_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG2_OK_MASK) - -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_MSB_MASK (0x800000U) -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define CCM_ANALOG_MISC2_TOG_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_AUDIO_DIV_MSB_SHIFT)) & CCM_ANALOG_MISC2_TOG_AUDIO_DIV_MSB_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG0_STEP_TIME_MASK (0x3000000U) -#define CCM_ANALOG_MISC2_TOG_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_TOG_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG0_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG0_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG1_STEP_TIME_MASK (0xC000000U) -#define CCM_ANALOG_MISC2_TOG_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_TOG_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG1_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG1_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_TOG_REG2_STEP_TIME_MASK (0x30000000U) -#define CCM_ANALOG_MISC2_TOG_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define CCM_ANALOG_MISC2_TOG_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_REG2_STEP_TIME_SHIFT)) & CCM_ANALOG_MISC2_TOG_REG2_STEP_TIME_MASK) - -#define CCM_ANALOG_MISC2_TOG_VIDEO_DIV_MASK (0xC0000000U) -#define CCM_ANALOG_MISC2_TOG_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define CCM_ANALOG_MISC2_TOG_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << CCM_ANALOG_MISC2_TOG_VIDEO_DIV_SHIFT)) & CCM_ANALOG_MISC2_TOG_VIDEO_DIV_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CCM_ANALOG_Register_Masks */ - - -/* CCM_ANALOG - Peripheral instance base addresses */ -/** Peripheral CCM_ANALOG base address */ -#define CCM_ANALOG_BASE (0x400D8000u) -/** Peripheral CCM_ANALOG base pointer */ -#define CCM_ANALOG ((CCM_ANALOG_Type *)CCM_ANALOG_BASE) -/** Array initializer of CCM_ANALOG peripheral base addresses */ -#define CCM_ANALOG_BASE_ADDRS { CCM_ANALOG_BASE } -/** Array initializer of CCM_ANALOG peripheral base pointers */ -#define CCM_ANALOG_BASE_PTRS { CCM_ANALOG } - -/*! - * @} - */ /* end of group CCM_ANALOG_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CM7_MCM Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CM7_MCM_Peripheral_Access_Layer CM7_MCM Peripheral Access Layer - * @{ - */ - -/** CM7_MCM - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[16]; - __IO uint32_t ISCR; /**< Interrupt Status and Control Register, offset: 0x10 */ -} CM7_MCM_Type; - -/* ---------------------------------------------------------------------------- - -- CM7_MCM Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CM7_MCM_Register_Masks CM7_MCM Register Masks - * @{ - */ - -/*! @name ISCR - Interrupt Status and Control Register */ -/*! @{ */ - -#define CM7_MCM_ISCR_WABS_MASK (0x20U) -#define CM7_MCM_ISCR_WABS_SHIFT (5U) -/*! WABS - Write Abort on Slave - * 0b0..No abort - * 0b1..Abort - */ -#define CM7_MCM_ISCR_WABS(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_WABS_SHIFT)) & CM7_MCM_ISCR_WABS_MASK) - -#define CM7_MCM_ISCR_WABSO_MASK (0x40U) -#define CM7_MCM_ISCR_WABSO_SHIFT (6U) -/*! WABSO - Write Abort on Slave Overrun - * 0b0..No write abort overrun - * 0b1..Write abort overrun occurred - */ -#define CM7_MCM_ISCR_WABSO(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_WABSO_SHIFT)) & CM7_MCM_ISCR_WABSO_MASK) - -#define CM7_MCM_ISCR_FIOC_MASK (0x100U) -#define CM7_MCM_ISCR_FIOC_SHIFT (8U) -/*! FIOC - FPU Invalid Operation interrupt Status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FIOC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIOC_SHIFT)) & CM7_MCM_ISCR_FIOC_MASK) - -#define CM7_MCM_ISCR_FDZC_MASK (0x200U) -#define CM7_MCM_ISCR_FDZC_SHIFT (9U) -/*! FDZC - FPU Divide-by-Zero Interrupt Status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FDZC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FDZC_SHIFT)) & CM7_MCM_ISCR_FDZC_MASK) - -#define CM7_MCM_ISCR_FOFC_MASK (0x400U) -#define CM7_MCM_ISCR_FOFC_SHIFT (10U) -/*! FOFC - FPU Overflow interrupt status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FOFC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FOFC_SHIFT)) & CM7_MCM_ISCR_FOFC_MASK) - -#define CM7_MCM_ISCR_FUFC_MASK (0x800U) -#define CM7_MCM_ISCR_FUFC_SHIFT (11U) -/*! FUFC - FPU Underflow Interrupt Status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FUFC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FUFC_SHIFT)) & CM7_MCM_ISCR_FUFC_MASK) - -#define CM7_MCM_ISCR_FIXC_MASK (0x1000U) -#define CM7_MCM_ISCR_FIXC_SHIFT (12U) -/*! FIXC - FPU Inexact Interrupt Status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FIXC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIXC_SHIFT)) & CM7_MCM_ISCR_FIXC_MASK) - -#define CM7_MCM_ISCR_FIDC_MASK (0x8000U) -#define CM7_MCM_ISCR_FIDC_SHIFT (15U) -/*! FIDC - FPU Input Denormal Interrupt Status - * 0b0..No interrupt - * 0b1..Interrupt occured - */ -#define CM7_MCM_ISCR_FIDC(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIDC_SHIFT)) & CM7_MCM_ISCR_FIDC_MASK) - -#define CM7_MCM_ISCR_WABE_MASK (0x200000U) -#define CM7_MCM_ISCR_WABE_SHIFT (21U) -/*! WABE - TCM Write Abort Interrupt enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_WABE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_WABE_SHIFT)) & CM7_MCM_ISCR_WABE_MASK) - -#define CM7_MCM_ISCR_FIOCE_MASK (0x1000000U) -#define CM7_MCM_ISCR_FIOCE_SHIFT (24U) -/*! FIOCE - FPU Invalid Operation Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FIOCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIOCE_SHIFT)) & CM7_MCM_ISCR_FIOCE_MASK) - -#define CM7_MCM_ISCR_FDZCE_MASK (0x2000000U) -#define CM7_MCM_ISCR_FDZCE_SHIFT (25U) -/*! FDZCE - FPU Divide-by-Zero Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FDZCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FDZCE_SHIFT)) & CM7_MCM_ISCR_FDZCE_MASK) - -#define CM7_MCM_ISCR_FOFCE_MASK (0x4000000U) -#define CM7_MCM_ISCR_FOFCE_SHIFT (26U) -/*! FOFCE - FPU Overflow Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FOFCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FOFCE_SHIFT)) & CM7_MCM_ISCR_FOFCE_MASK) - -#define CM7_MCM_ISCR_FUFCE_MASK (0x8000000U) -#define CM7_MCM_ISCR_FUFCE_SHIFT (27U) -/*! FUFCE - FPU Underflow Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FUFCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FUFCE_SHIFT)) & CM7_MCM_ISCR_FUFCE_MASK) - -#define CM7_MCM_ISCR_FIXCE_MASK (0x10000000U) -#define CM7_MCM_ISCR_FIXCE_SHIFT (28U) -/*! FIXCE - FPU Inexact Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FIXCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIXCE_SHIFT)) & CM7_MCM_ISCR_FIXCE_MASK) - -#define CM7_MCM_ISCR_FIDCE_MASK (0x80000000U) -#define CM7_MCM_ISCR_FIDCE_SHIFT (31U) -/*! FIDCE - FPU Input Denormal Interrupt Enable - * 0b0..Disable interrupt - * 0b1..Enable interrupt - */ -#define CM7_MCM_ISCR_FIDCE(x) (((uint32_t)(((uint32_t)(x)) << CM7_MCM_ISCR_FIDCE_SHIFT)) & CM7_MCM_ISCR_FIDCE_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CM7_MCM_Register_Masks */ - - -/* CM7_MCM - Peripheral instance base addresses */ -/** Peripheral CM7_MCM base address */ -#define CM7_MCM_BASE (0xE0080000u) -/** Peripheral CM7_MCM base pointer */ -#define CM7_MCM ((CM7_MCM_Type *)CM7_MCM_BASE) -/** Array initializer of CM7_MCM peripheral base addresses */ -#define CM7_MCM_BASE_ADDRS { CM7_MCM_BASE } -/** Array initializer of CM7_MCM peripheral base pointers */ -#define CM7_MCM_BASE_PTRS { CM7_MCM } - -/*! - * @} - */ /* end of group CM7_MCM_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CMP Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CMP_Peripheral_Access_Layer CMP Peripheral Access Layer - * @{ - */ - -/** CMP - Register Layout Typedef */ -typedef struct { - __IO uint8_t CR0; /**< CMP Control Register 0, offset: 0x0 */ - __IO uint8_t CR1; /**< CMP Control Register 1, offset: 0x1 */ - __IO uint8_t FPR; /**< CMP Filter Period Register, offset: 0x2 */ - __IO uint8_t SCR; /**< CMP Status and Control Register, offset: 0x3 */ - __IO uint8_t DACCR; /**< DAC Control Register, offset: 0x4 */ - __IO uint8_t MUXCR; /**< MUX Control Register, offset: 0x5 */ -} CMP_Type; - -/* ---------------------------------------------------------------------------- - -- CMP Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CMP_Register_Masks CMP Register Masks - * @{ - */ - -/*! @name CR0 - CMP Control Register 0 */ -/*! @{ */ - -#define CMP_CR0_HYSTCTR_MASK (0x3U) -#define CMP_CR0_HYSTCTR_SHIFT (0U) -/*! HYSTCTR - Comparator hard block hysteresis control - * 0b00..Level 0 - * 0b01..Level 1 - * 0b10..Level 2 - * 0b11..Level 3 - */ -#define CMP_CR0_HYSTCTR(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR0_HYSTCTR_SHIFT)) & CMP_CR0_HYSTCTR_MASK) - -#define CMP_CR0_FILTER_CNT_MASK (0x70U) -#define CMP_CR0_FILTER_CNT_SHIFT (4U) -/*! FILTER_CNT - Filter Sample Count - * 0b000..Filter is disabled. If SE = 1, then COUT is a logic 0. This is not a legal state, and is not recommended. If SE = 0, COUT = COUTA. - * 0b001..One sample must agree. The comparator output is simply sampled. - * 0b010..2 consecutive samples must agree. - * 0b011..3 consecutive samples must agree. - * 0b100..4 consecutive samples must agree. - * 0b101..5 consecutive samples must agree. - * 0b110..6 consecutive samples must agree. - * 0b111..7 consecutive samples must agree. - */ -#define CMP_CR0_FILTER_CNT(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR0_FILTER_CNT_SHIFT)) & CMP_CR0_FILTER_CNT_MASK) -/*! @} */ - -/*! @name CR1 - CMP Control Register 1 */ -/*! @{ */ - -#define CMP_CR1_EN_MASK (0x1U) -#define CMP_CR1_EN_SHIFT (0U) -/*! EN - Comparator Module Enable - * 0b0..Analog Comparator is disabled. - * 0b1..Analog Comparator is enabled. - */ -#define CMP_CR1_EN(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_EN_SHIFT)) & CMP_CR1_EN_MASK) - -#define CMP_CR1_OPE_MASK (0x2U) -#define CMP_CR1_OPE_SHIFT (1U) -/*! OPE - Comparator Output Pin Enable - * 0b0..CMPO is not available on the associated CMPO output pin. If the comparator does not own the pin, this field has no effect. - * 0b1..CMPO is available on the associated CMPO output pin. The comparator output (CMPO) is driven out on the - * associated CMPO output pin if the comparator owns the pin. If the comparator does not own the field, this - * bit has no effect. - */ -#define CMP_CR1_OPE(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_OPE_SHIFT)) & CMP_CR1_OPE_MASK) - -#define CMP_CR1_COS_MASK (0x4U) -#define CMP_CR1_COS_SHIFT (2U) -/*! COS - Comparator Output Select - * 0b0..Set the filtered comparator output (CMPO) to equal COUT. - * 0b1..Set the unfiltered comparator output (CMPO) to equal COUTA. - */ -#define CMP_CR1_COS(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_COS_SHIFT)) & CMP_CR1_COS_MASK) - -#define CMP_CR1_INV_MASK (0x8U) -#define CMP_CR1_INV_SHIFT (3U) -/*! INV - Comparator INVERT - * 0b0..Does not invert the comparator output. - * 0b1..Inverts the comparator output. - */ -#define CMP_CR1_INV(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_INV_SHIFT)) & CMP_CR1_INV_MASK) - -#define CMP_CR1_PMODE_MASK (0x10U) -#define CMP_CR1_PMODE_SHIFT (4U) -/*! PMODE - Power Mode Select - * 0b0..Low-Speed (LS) Comparison mode selected. In this mode, CMP has slower output propagation delay and lower current consumption. - * 0b1..High-Speed (HS) Comparison mode selected. In this mode, CMP has faster output propagation delay and higher current consumption. - */ -#define CMP_CR1_PMODE(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_PMODE_SHIFT)) & CMP_CR1_PMODE_MASK) - -#define CMP_CR1_WE_MASK (0x40U) -#define CMP_CR1_WE_SHIFT (6U) -/*! WE - Windowing Enable - * 0b0..Windowing mode is not selected. - * 0b1..Windowing mode is selected. - */ -#define CMP_CR1_WE(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_WE_SHIFT)) & CMP_CR1_WE_MASK) - -#define CMP_CR1_SE_MASK (0x80U) -#define CMP_CR1_SE_SHIFT (7U) -/*! SE - Sample Enable - * 0b0..Sampling mode is not selected. - * 0b1..Sampling mode is selected. - */ -#define CMP_CR1_SE(x) (((uint8_t)(((uint8_t)(x)) << CMP_CR1_SE_SHIFT)) & CMP_CR1_SE_MASK) -/*! @} */ - -/*! @name FPR - CMP Filter Period Register */ -/*! @{ */ - -#define CMP_FPR_FILT_PER_MASK (0xFFU) -#define CMP_FPR_FILT_PER_SHIFT (0U) -/*! FILT_PER - Filter Sample Period - */ -#define CMP_FPR_FILT_PER(x) (((uint8_t)(((uint8_t)(x)) << CMP_FPR_FILT_PER_SHIFT)) & CMP_FPR_FILT_PER_MASK) -/*! @} */ - -/*! @name SCR - CMP Status and Control Register */ -/*! @{ */ - -#define CMP_SCR_COUT_MASK (0x1U) -#define CMP_SCR_COUT_SHIFT (0U) -/*! COUT - Analog Comparator Output - */ -#define CMP_SCR_COUT(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_COUT_SHIFT)) & CMP_SCR_COUT_MASK) - -#define CMP_SCR_CFF_MASK (0x2U) -#define CMP_SCR_CFF_SHIFT (1U) -/*! CFF - Analog Comparator Flag Falling - * 0b0..Falling-edge on COUT has not been detected. - * 0b1..Falling-edge on COUT has occurred. - */ -#define CMP_SCR_CFF(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_CFF_SHIFT)) & CMP_SCR_CFF_MASK) - -#define CMP_SCR_CFR_MASK (0x4U) -#define CMP_SCR_CFR_SHIFT (2U) -/*! CFR - Analog Comparator Flag Rising - * 0b0..Rising-edge on COUT has not been detected. - * 0b1..Rising-edge on COUT has occurred. - */ -#define CMP_SCR_CFR(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_CFR_SHIFT)) & CMP_SCR_CFR_MASK) - -#define CMP_SCR_IEF_MASK (0x8U) -#define CMP_SCR_IEF_SHIFT (3U) -/*! IEF - Comparator Interrupt Enable Falling - * 0b0..Interrupt is disabled. - * 0b1..Interrupt is enabled. - */ -#define CMP_SCR_IEF(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_IEF_SHIFT)) & CMP_SCR_IEF_MASK) - -#define CMP_SCR_IER_MASK (0x10U) -#define CMP_SCR_IER_SHIFT (4U) -/*! IER - Comparator Interrupt Enable Rising - * 0b0..Interrupt is disabled. - * 0b1..Interrupt is enabled. - */ -#define CMP_SCR_IER(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_IER_SHIFT)) & CMP_SCR_IER_MASK) - -#define CMP_SCR_DMAEN_MASK (0x40U) -#define CMP_SCR_DMAEN_SHIFT (6U) -/*! DMAEN - DMA Enable Control - * 0b0..DMA is disabled. - * 0b1..DMA is enabled. - */ -#define CMP_SCR_DMAEN(x) (((uint8_t)(((uint8_t)(x)) << CMP_SCR_DMAEN_SHIFT)) & CMP_SCR_DMAEN_MASK) -/*! @} */ - -/*! @name DACCR - DAC Control Register */ -/*! @{ */ - -#define CMP_DACCR_VOSEL_MASK (0x3FU) -#define CMP_DACCR_VOSEL_SHIFT (0U) -/*! VOSEL - DAC Output Voltage Select - */ -#define CMP_DACCR_VOSEL(x) (((uint8_t)(((uint8_t)(x)) << CMP_DACCR_VOSEL_SHIFT)) & CMP_DACCR_VOSEL_MASK) - -#define CMP_DACCR_VRSEL_MASK (0x40U) -#define CMP_DACCR_VRSEL_SHIFT (6U) -/*! VRSEL - Supply Voltage Reference Source Select - * 0b0..Vin1 is selected as resistor ladder network supply reference. - * 0b1..Vin2 is selected as resistor ladder network supply reference. - */ -#define CMP_DACCR_VRSEL(x) (((uint8_t)(((uint8_t)(x)) << CMP_DACCR_VRSEL_SHIFT)) & CMP_DACCR_VRSEL_MASK) - -#define CMP_DACCR_DACEN_MASK (0x80U) -#define CMP_DACCR_DACEN_SHIFT (7U) -/*! DACEN - DAC Enable - * 0b0..DAC is disabled. - * 0b1..DAC is enabled. - */ -#define CMP_DACCR_DACEN(x) (((uint8_t)(((uint8_t)(x)) << CMP_DACCR_DACEN_SHIFT)) & CMP_DACCR_DACEN_MASK) -/*! @} */ - -/*! @name MUXCR - MUX Control Register */ -/*! @{ */ - -#define CMP_MUXCR_MSEL_MASK (0x7U) -#define CMP_MUXCR_MSEL_SHIFT (0U) -/*! MSEL - Minus Input Mux Control - * 0b000..IN0 - * 0b001..IN1 - * 0b010..IN2 - * 0b011..IN3 - * 0b100..IN4 - * 0b101..IN5 - * 0b110..IN6 - * 0b111..IN7 - */ -#define CMP_MUXCR_MSEL(x) (((uint8_t)(((uint8_t)(x)) << CMP_MUXCR_MSEL_SHIFT)) & CMP_MUXCR_MSEL_MASK) - -#define CMP_MUXCR_PSEL_MASK (0x38U) -#define CMP_MUXCR_PSEL_SHIFT (3U) -/*! PSEL - Plus Input Mux Control - * 0b000..IN0 - * 0b001..IN1 - * 0b010..IN2 - * 0b011..IN3 - * 0b100..IN4 - * 0b101..IN5 - * 0b110..IN6 - * 0b111..IN7 - */ -#define CMP_MUXCR_PSEL(x) (((uint8_t)(((uint8_t)(x)) << CMP_MUXCR_PSEL_SHIFT)) & CMP_MUXCR_PSEL_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CMP_Register_Masks */ - - -/* CMP - Peripheral instance base addresses */ -/** Peripheral CMP1 base address */ -#define CMP1_BASE (0x40094000u) -/** Peripheral CMP1 base pointer */ -#define CMP1 ((CMP_Type *)CMP1_BASE) -/** Peripheral CMP2 base address */ -#define CMP2_BASE (0x40094008u) -/** Peripheral CMP2 base pointer */ -#define CMP2 ((CMP_Type *)CMP2_BASE) -/** Peripheral CMP3 base address */ -#define CMP3_BASE (0x40094010u) -/** Peripheral CMP3 base pointer */ -#define CMP3 ((CMP_Type *)CMP3_BASE) -/** Peripheral CMP4 base address */ -#define CMP4_BASE (0x40094018u) -/** Peripheral CMP4 base pointer */ -#define CMP4 ((CMP_Type *)CMP4_BASE) -/** Array initializer of CMP peripheral base addresses */ -#define CMP_BASE_ADDRS { 0u, CMP1_BASE, CMP2_BASE, CMP3_BASE, CMP4_BASE } -/** Array initializer of CMP peripheral base pointers */ -#define CMP_BASE_PTRS { (CMP_Type *)0u, CMP1, CMP2, CMP3, CMP4 } -/** Interrupt vectors for the CMP peripheral type */ -#define CMP_IRQS { NotAvail_IRQn, ACMP1_IRQn, ACMP2_IRQn, ACMP3_IRQn, ACMP4_IRQn } - -/*! - * @} - */ /* end of group CMP_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CSI Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CSI_Peripheral_Access_Layer CSI Peripheral Access Layer - * @{ - */ - -/** CSI - Register Layout Typedef */ -typedef struct { - __IO uint32_t CSICR1; /**< CSI Control Register 1, offset: 0x0 */ - __IO uint32_t CSICR2; /**< CSI Control Register 2, offset: 0x4 */ - __IO uint32_t CSICR3; /**< CSI Control Register 3, offset: 0x8 */ - __I uint32_t CSISTATFIFO; /**< CSI Statistic FIFO Register, offset: 0xC */ - __I uint32_t CSIRFIFO; /**< CSI RX FIFO Register, offset: 0x10 */ - __IO uint32_t CSIRXCNT; /**< CSI RX Count Register, offset: 0x14 */ - __IO uint32_t CSISR; /**< CSI Status Register, offset: 0x18 */ - uint8_t RESERVED_0[4]; - __IO uint32_t CSIDMASA_STATFIFO; /**< CSI DMA Start Address Register - for STATFIFO, offset: 0x20 */ - __IO uint32_t CSIDMATS_STATFIFO; /**< CSI DMA Transfer Size Register - for STATFIFO, offset: 0x24 */ - __IO uint32_t CSIDMASA_FB1; /**< CSI DMA Start Address Register - for Frame Buffer1, offset: 0x28 */ - __IO uint32_t CSIDMASA_FB2; /**< CSI DMA Transfer Size Register - for Frame Buffer2, offset: 0x2C */ - __IO uint32_t CSIFBUF_PARA; /**< CSI Frame Buffer Parameter Register, offset: 0x30 */ - __IO uint32_t CSIIMAG_PARA; /**< CSI Image Parameter Register, offset: 0x34 */ - uint8_t RESERVED_1[16]; - __IO uint32_t CSICR18; /**< CSI Control Register 18, offset: 0x48 */ - __IO uint32_t CSICR19; /**< CSI Control Register 19, offset: 0x4C */ -} CSI_Type; - -/* ---------------------------------------------------------------------------- - -- CSI Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CSI_Register_Masks CSI Register Masks - * @{ - */ - -/*! @name CSICR1 - CSI Control Register 1 */ -/*! @{ */ - -#define CSI_CSICR1_PIXEL_BIT_MASK (0x1U) -#define CSI_CSICR1_PIXEL_BIT_SHIFT (0U) -/*! PIXEL_BIT - * 0b0..8-bit data for each pixel - * 0b1..10-bit data for each pixel - */ -#define CSI_CSICR1_PIXEL_BIT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_PIXEL_BIT_SHIFT)) & CSI_CSICR1_PIXEL_BIT_MASK) - -#define CSI_CSICR1_REDGE_MASK (0x2U) -#define CSI_CSICR1_REDGE_SHIFT (1U) -/*! REDGE - * 0b0..Pixel data is latched at the falling edge of CSI_PIXCLK - * 0b1..Pixel data is latched at the rising edge of CSI_PIXCLK - */ -#define CSI_CSICR1_REDGE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_REDGE_SHIFT)) & CSI_CSICR1_REDGE_MASK) - -#define CSI_CSICR1_INV_PCLK_MASK (0x4U) -#define CSI_CSICR1_INV_PCLK_SHIFT (2U) -/*! INV_PCLK - * 0b0..CSI_PIXCLK is directly applied to internal circuitry - * 0b1..CSI_PIXCLK is inverted before applied to internal circuitry - */ -#define CSI_CSICR1_INV_PCLK(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_INV_PCLK_SHIFT)) & CSI_CSICR1_INV_PCLK_MASK) - -#define CSI_CSICR1_INV_DATA_MASK (0x8U) -#define CSI_CSICR1_INV_DATA_SHIFT (3U) -/*! INV_DATA - * 0b0..CSI_D[7:0] data lines are directly applied to internal circuitry - * 0b1..CSI_D[7:0] data lines are inverted before applied to internal circuitry - */ -#define CSI_CSICR1_INV_DATA(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_INV_DATA_SHIFT)) & CSI_CSICR1_INV_DATA_MASK) - -#define CSI_CSICR1_GCLK_MODE_MASK (0x10U) -#define CSI_CSICR1_GCLK_MODE_SHIFT (4U) -/*! GCLK_MODE - * 0b0..Non-gated clock mode. All incoming pixel clocks are valid. HSYNC is ignored. - * 0b1..Gated clock mode. Pixel clock signal is valid only when HSYNC is active. - */ -#define CSI_CSICR1_GCLK_MODE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_GCLK_MODE_SHIFT)) & CSI_CSICR1_GCLK_MODE_MASK) - -#define CSI_CSICR1_CLR_RXFIFO_MASK (0x20U) -#define CSI_CSICR1_CLR_RXFIFO_SHIFT (5U) -#define CSI_CSICR1_CLR_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_CLR_RXFIFO_SHIFT)) & CSI_CSICR1_CLR_RXFIFO_MASK) - -#define CSI_CSICR1_CLR_STATFIFO_MASK (0x40U) -#define CSI_CSICR1_CLR_STATFIFO_SHIFT (6U) -#define CSI_CSICR1_CLR_STATFIFO(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_CLR_STATFIFO_SHIFT)) & CSI_CSICR1_CLR_STATFIFO_MASK) - -#define CSI_CSICR1_PACK_DIR_MASK (0x80U) -#define CSI_CSICR1_PACK_DIR_SHIFT (7U) -/*! PACK_DIR - * 0b0..Pack from LSB first. For image data, 0x11, 0x22, 0x33, 0x44, it will appear as 0x44332211 in RX FIFO. For - * stat data, 0xAAAA, 0xBBBB, it will appear as 0xBBBBAAAA in STAT FIFO. - * 0b1..Pack from MSB first. For image data, 0x11, 0x22, 0x33, 0x44, it will appear as 0x11223344 in RX FIFO. For - * stat data, 0xAAAA, 0xBBBB, it will appear as 0xAAAABBBB in STAT FIFO. - */ -#define CSI_CSICR1_PACK_DIR(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_PACK_DIR_SHIFT)) & CSI_CSICR1_PACK_DIR_MASK) - -#define CSI_CSICR1_FCC_MASK (0x100U) -#define CSI_CSICR1_FCC_SHIFT (8U) -/*! FCC - * 0b0..Asynchronous FIFO clear is selected. - * 0b1..Synchronous FIFO clear is selected. - */ -#define CSI_CSICR1_FCC(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_FCC_SHIFT)) & CSI_CSICR1_FCC_MASK) - -#define CSI_CSICR1_CCIR_EN_MASK (0x400U) -#define CSI_CSICR1_CCIR_EN_SHIFT (10U) -/*! CCIR_EN - * 0b0..Traditional interface is selected. Timing interface logic is used to latch data. - * 0b1..CCIR656 interface is selected. - */ -#define CSI_CSICR1_CCIR_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_CCIR_EN_SHIFT)) & CSI_CSICR1_CCIR_EN_MASK) - -#define CSI_CSICR1_HSYNC_POL_MASK (0x800U) -#define CSI_CSICR1_HSYNC_POL_SHIFT (11U) -/*! HSYNC_POL - * 0b0..HSYNC is active low - * 0b1..HSYNC is active high - */ -#define CSI_CSICR1_HSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_HSYNC_POL_SHIFT)) & CSI_CSICR1_HSYNC_POL_MASK) - -#define CSI_CSICR1_SOF_INTEN_MASK (0x10000U) -#define CSI_CSICR1_SOF_INTEN_SHIFT (16U) -/*! SOF_INTEN - * 0b0..SOF interrupt disable - * 0b1..SOF interrupt enable - */ -#define CSI_CSICR1_SOF_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_SOF_INTEN_SHIFT)) & CSI_CSICR1_SOF_INTEN_MASK) - -#define CSI_CSICR1_SOF_POL_MASK (0x20000U) -#define CSI_CSICR1_SOF_POL_SHIFT (17U) -/*! SOF_POL - * 0b0..SOF interrupt is generated on SOF falling edge - * 0b1..SOF interrupt is generated on SOF rising edge - */ -#define CSI_CSICR1_SOF_POL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_SOF_POL_SHIFT)) & CSI_CSICR1_SOF_POL_MASK) - -#define CSI_CSICR1_RXFF_INTEN_MASK (0x40000U) -#define CSI_CSICR1_RXFF_INTEN_SHIFT (18U) -/*! RXFF_INTEN - * 0b0..RxFIFO full interrupt disable - * 0b1..RxFIFO full interrupt enable - */ -#define CSI_CSICR1_RXFF_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_RXFF_INTEN_SHIFT)) & CSI_CSICR1_RXFF_INTEN_MASK) - -#define CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK (0x80000U) -#define CSI_CSICR1_FB1_DMA_DONE_INTEN_SHIFT (19U) -/*! FB1_DMA_DONE_INTEN - * 0b0..Frame Buffer1 DMA Transfer Done interrupt disable - * 0b1..Frame Buffer1 DMA Transfer Done interrupt enable - */ -#define CSI_CSICR1_FB1_DMA_DONE_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_FB1_DMA_DONE_INTEN_SHIFT)) & CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK) - -#define CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK (0x100000U) -#define CSI_CSICR1_FB2_DMA_DONE_INTEN_SHIFT (20U) -/*! FB2_DMA_DONE_INTEN - * 0b0..Frame Buffer2 DMA Transfer Done interrupt disable - * 0b1..Frame Buffer2 DMA Transfer Done interrupt enable - */ -#define CSI_CSICR1_FB2_DMA_DONE_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_FB2_DMA_DONE_INTEN_SHIFT)) & CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK) - -#define CSI_CSICR1_STATFF_INTEN_MASK (0x200000U) -#define CSI_CSICR1_STATFF_INTEN_SHIFT (21U) -/*! STATFF_INTEN - * 0b0..STATFIFO full interrupt disable - * 0b1..STATFIFO full interrupt enable - */ -#define CSI_CSICR1_STATFF_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_STATFF_INTEN_SHIFT)) & CSI_CSICR1_STATFF_INTEN_MASK) - -#define CSI_CSICR1_SFF_DMA_DONE_INTEN_MASK (0x400000U) -#define CSI_CSICR1_SFF_DMA_DONE_INTEN_SHIFT (22U) -/*! SFF_DMA_DONE_INTEN - * 0b0..STATFIFO DMA Transfer Done interrupt disable - * 0b1..STATFIFO DMA Transfer Done interrupt enable - */ -#define CSI_CSICR1_SFF_DMA_DONE_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_SFF_DMA_DONE_INTEN_SHIFT)) & CSI_CSICR1_SFF_DMA_DONE_INTEN_MASK) - -#define CSI_CSICR1_RF_OR_INTEN_MASK (0x1000000U) -#define CSI_CSICR1_RF_OR_INTEN_SHIFT (24U) -/*! RF_OR_INTEN - * 0b0..RxFIFO overrun interrupt is disabled - * 0b1..RxFIFO overrun interrupt is enabled - */ -#define CSI_CSICR1_RF_OR_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_RF_OR_INTEN_SHIFT)) & CSI_CSICR1_RF_OR_INTEN_MASK) - -#define CSI_CSICR1_SF_OR_INTEN_MASK (0x2000000U) -#define CSI_CSICR1_SF_OR_INTEN_SHIFT (25U) -/*! SF_OR_INTEN - * 0b0..STATFIFO overrun interrupt is disabled - * 0b1..STATFIFO overrun interrupt is enabled - */ -#define CSI_CSICR1_SF_OR_INTEN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_SF_OR_INTEN_SHIFT)) & CSI_CSICR1_SF_OR_INTEN_MASK) - -#define CSI_CSICR1_COF_INT_EN_MASK (0x4000000U) -#define CSI_CSICR1_COF_INT_EN_SHIFT (26U) -/*! COF_INT_EN - * 0b0..COF interrupt is disabled - * 0b1..COF interrupt is enabled - */ -#define CSI_CSICR1_COF_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_COF_INT_EN_SHIFT)) & CSI_CSICR1_COF_INT_EN_MASK) - -#define CSI_CSICR1_CCIR_MODE_MASK (0x8000000U) -#define CSI_CSICR1_CCIR_MODE_SHIFT (27U) -/*! CCIR_MODE - * 0b0..Progressive mode is selected - * 0b1..Interlace mode is selected - */ -#define CSI_CSICR1_CCIR_MODE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_CCIR_MODE_SHIFT)) & CSI_CSICR1_CCIR_MODE_MASK) - -#define CSI_CSICR1_PrP_IF_EN_MASK (0x10000000U) -#define CSI_CSICR1_PrP_IF_EN_SHIFT (28U) -/*! PrP_IF_EN - * 0b0..CSI to PrP bus is disabled - * 0b1..CSI to PrP bus is enabled - */ -#define CSI_CSICR1_PrP_IF_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_PrP_IF_EN_SHIFT)) & CSI_CSICR1_PrP_IF_EN_MASK) - -#define CSI_CSICR1_EOF_INT_EN_MASK (0x20000000U) -#define CSI_CSICR1_EOF_INT_EN_SHIFT (29U) -/*! EOF_INT_EN - * 0b0..EOF interrupt is disabled. - * 0b1..EOF interrupt is generated when RX count value is reached. - */ -#define CSI_CSICR1_EOF_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_EOF_INT_EN_SHIFT)) & CSI_CSICR1_EOF_INT_EN_MASK) - -#define CSI_CSICR1_EXT_VSYNC_MASK (0x40000000U) -#define CSI_CSICR1_EXT_VSYNC_SHIFT (30U) -/*! EXT_VSYNC - * 0b0..Internal VSYNC mode - * 0b1..External VSYNC mode - */ -#define CSI_CSICR1_EXT_VSYNC(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_EXT_VSYNC_SHIFT)) & CSI_CSICR1_EXT_VSYNC_MASK) - -#define CSI_CSICR1_SWAP16_EN_MASK (0x80000000U) -#define CSI_CSICR1_SWAP16_EN_SHIFT (31U) -/*! SWAP16_EN - * 0b0..Disable swapping - * 0b1..Enable swapping - */ -#define CSI_CSICR1_SWAP16_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR1_SWAP16_EN_SHIFT)) & CSI_CSICR1_SWAP16_EN_MASK) -/*! @} */ - -/*! @name CSICR2 - CSI Control Register 2 */ -/*! @{ */ - -#define CSI_CSICR2_HSC_MASK (0xFFU) -#define CSI_CSICR2_HSC_SHIFT (0U) -#define CSI_CSICR2_HSC(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_HSC_SHIFT)) & CSI_CSICR2_HSC_MASK) - -#define CSI_CSICR2_VSC_MASK (0xFF00U) -#define CSI_CSICR2_VSC_SHIFT (8U) -#define CSI_CSICR2_VSC(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_VSC_SHIFT)) & CSI_CSICR2_VSC_MASK) - -#define CSI_CSICR2_LVRM_MASK (0x70000U) -#define CSI_CSICR2_LVRM_SHIFT (16U) -/*! LVRM - * 0b000..512 x 384 - * 0b001..448 x 336 - * 0b010..384 x 288 - * 0b011..384 x 256 - * 0b100..320 x 240 - * 0b101..288 x 216 - * 0b110..400 x 300 - */ -#define CSI_CSICR2_LVRM(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_LVRM_SHIFT)) & CSI_CSICR2_LVRM_MASK) - -#define CSI_CSICR2_BTS_MASK (0x180000U) -#define CSI_CSICR2_BTS_SHIFT (19U) -/*! BTS - * 0b00..GR - * 0b01..RG - * 0b10..BG - * 0b11..GB - */ -#define CSI_CSICR2_BTS(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_BTS_SHIFT)) & CSI_CSICR2_BTS_MASK) - -#define CSI_CSICR2_SCE_MASK (0x800000U) -#define CSI_CSICR2_SCE_SHIFT (23U) -/*! SCE - * 0b0..Skip count disable - * 0b1..Skip count enable - */ -#define CSI_CSICR2_SCE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_SCE_SHIFT)) & CSI_CSICR2_SCE_MASK) - -#define CSI_CSICR2_AFS_MASK (0x3000000U) -#define CSI_CSICR2_AFS_SHIFT (24U) -/*! AFS - * 0b00..Abs Diff on consecutive green pixels - * 0b01..Abs Diff on every third green pixels - * 0b1x..Abs Diff on every four green pixels - */ -#define CSI_CSICR2_AFS(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_AFS_SHIFT)) & CSI_CSICR2_AFS_MASK) - -#define CSI_CSICR2_DRM_MASK (0x4000000U) -#define CSI_CSICR2_DRM_SHIFT (26U) -/*! DRM - * 0b0..Stats grid of 8 x 6 - * 0b1..Stats grid of 8 x 12 - */ -#define CSI_CSICR2_DRM(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_DRM_SHIFT)) & CSI_CSICR2_DRM_MASK) - -#define CSI_CSICR2_DMA_BURST_TYPE_SFF_MASK (0x30000000U) -#define CSI_CSICR2_DMA_BURST_TYPE_SFF_SHIFT (28U) -/*! DMA_BURST_TYPE_SFF - * 0bx0..INCR8 - * 0b01..INCR4 - * 0b11..INCR16 - */ -#define CSI_CSICR2_DMA_BURST_TYPE_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_DMA_BURST_TYPE_SFF_SHIFT)) & CSI_CSICR2_DMA_BURST_TYPE_SFF_MASK) - -#define CSI_CSICR2_DMA_BURST_TYPE_RFF_MASK (0xC0000000U) -#define CSI_CSICR2_DMA_BURST_TYPE_RFF_SHIFT (30U) -/*! DMA_BURST_TYPE_RFF - * 0bx0..INCR8 - * 0b01..INCR4 - * 0b11..INCR16 - */ -#define CSI_CSICR2_DMA_BURST_TYPE_RFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR2_DMA_BURST_TYPE_RFF_SHIFT)) & CSI_CSICR2_DMA_BURST_TYPE_RFF_MASK) -/*! @} */ - -/*! @name CSICR3 - CSI Control Register 3 */ -/*! @{ */ - -#define CSI_CSICR3_ECC_AUTO_EN_MASK (0x1U) -#define CSI_CSICR3_ECC_AUTO_EN_SHIFT (0U) -/*! ECC_AUTO_EN - * 0b0..Auto Error correction is disabled. - * 0b1..Auto Error correction is enabled. - */ -#define CSI_CSICR3_ECC_AUTO_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_ECC_AUTO_EN_SHIFT)) & CSI_CSICR3_ECC_AUTO_EN_MASK) - -#define CSI_CSICR3_ECC_INT_EN_MASK (0x2U) -#define CSI_CSICR3_ECC_INT_EN_SHIFT (1U) -/*! ECC_INT_EN - * 0b0..No interrupt is generated when error is detected. Only the status bit ECC_INT is set. - * 0b1..Interrupt is generated when error is detected. - */ -#define CSI_CSICR3_ECC_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_ECC_INT_EN_SHIFT)) & CSI_CSICR3_ECC_INT_EN_MASK) - -#define CSI_CSICR3_ZERO_PACK_EN_MASK (0x4U) -#define CSI_CSICR3_ZERO_PACK_EN_SHIFT (2U) -/*! ZERO_PACK_EN - * 0b0..Zero packing disabled - * 0b1..Zero packing enabled - */ -#define CSI_CSICR3_ZERO_PACK_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_ZERO_PACK_EN_SHIFT)) & CSI_CSICR3_ZERO_PACK_EN_MASK) - -#define CSI_CSICR3_TWO_8BIT_SENSOR_MASK (0x8U) -#define CSI_CSICR3_TWO_8BIT_SENSOR_SHIFT (3U) -/*! TWO_8BIT_SENSOR - * 0b0..Only one sensor is connected. - * 0b1..Two 8-bit sensors are connected or one 16-bit sensor is connected. - */ -#define CSI_CSICR3_TWO_8BIT_SENSOR(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_TWO_8BIT_SENSOR_SHIFT)) & CSI_CSICR3_TWO_8BIT_SENSOR_MASK) - -#define CSI_CSICR3_RxFF_LEVEL_MASK (0x70U) -#define CSI_CSICR3_RxFF_LEVEL_SHIFT (4U) -/*! RxFF_LEVEL - * 0b000..4 Double words - * 0b001..8 Double words - * 0b010..16 Double words - * 0b011..24 Double words - * 0b100..32 Double words - * 0b101..48 Double words - * 0b110..64 Double words - * 0b111..96 Double words - */ -#define CSI_CSICR3_RxFF_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_RxFF_LEVEL_SHIFT)) & CSI_CSICR3_RxFF_LEVEL_MASK) - -#define CSI_CSICR3_HRESP_ERR_EN_MASK (0x80U) -#define CSI_CSICR3_HRESP_ERR_EN_SHIFT (7U) -/*! HRESP_ERR_EN - * 0b0..Disable hresponse error interrupt - * 0b1..Enable hresponse error interrupt - */ -#define CSI_CSICR3_HRESP_ERR_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_HRESP_ERR_EN_SHIFT)) & CSI_CSICR3_HRESP_ERR_EN_MASK) - -#define CSI_CSICR3_STATFF_LEVEL_MASK (0x700U) -#define CSI_CSICR3_STATFF_LEVEL_SHIFT (8U) -/*! STATFF_LEVEL - * 0b000..4 Double words - * 0b001..8 Double words - * 0b010..12 Double words - * 0b011..16 Double words - * 0b100..24 Double words - * 0b101..32 Double words - * 0b110..48 Double words - * 0b111..64 Double words - */ -#define CSI_CSICR3_STATFF_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_STATFF_LEVEL_SHIFT)) & CSI_CSICR3_STATFF_LEVEL_MASK) - -#define CSI_CSICR3_DMA_REQ_EN_SFF_MASK (0x800U) -#define CSI_CSICR3_DMA_REQ_EN_SFF_SHIFT (11U) -/*! DMA_REQ_EN_SFF - * 0b0..Disable the dma request - * 0b1..Enable the dma request - */ -#define CSI_CSICR3_DMA_REQ_EN_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_DMA_REQ_EN_SFF_SHIFT)) & CSI_CSICR3_DMA_REQ_EN_SFF_MASK) - -#define CSI_CSICR3_DMA_REQ_EN_RFF_MASK (0x1000U) -#define CSI_CSICR3_DMA_REQ_EN_RFF_SHIFT (12U) -/*! DMA_REQ_EN_RFF - * 0b0..Disable the dma request - * 0b1..Enable the dma request - */ -#define CSI_CSICR3_DMA_REQ_EN_RFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_DMA_REQ_EN_RFF_SHIFT)) & CSI_CSICR3_DMA_REQ_EN_RFF_MASK) - -#define CSI_CSICR3_DMA_REFLASH_SFF_MASK (0x2000U) -#define CSI_CSICR3_DMA_REFLASH_SFF_SHIFT (13U) -/*! DMA_REFLASH_SFF - * 0b0..No reflashing - * 0b1..Reflash the embedded DMA controller - */ -#define CSI_CSICR3_DMA_REFLASH_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_DMA_REFLASH_SFF_SHIFT)) & CSI_CSICR3_DMA_REFLASH_SFF_MASK) - -#define CSI_CSICR3_DMA_REFLASH_RFF_MASK (0x4000U) -#define CSI_CSICR3_DMA_REFLASH_RFF_SHIFT (14U) -/*! DMA_REFLASH_RFF - * 0b0..No reflashing - * 0b1..Reflash the embedded DMA controller - */ -#define CSI_CSICR3_DMA_REFLASH_RFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_DMA_REFLASH_RFF_SHIFT)) & CSI_CSICR3_DMA_REFLASH_RFF_MASK) - -#define CSI_CSICR3_FRMCNT_RST_MASK (0x8000U) -#define CSI_CSICR3_FRMCNT_RST_SHIFT (15U) -/*! FRMCNT_RST - * 0b0..Do not reset - * 0b1..Reset frame counter immediately - */ -#define CSI_CSICR3_FRMCNT_RST(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_FRMCNT_RST_SHIFT)) & CSI_CSICR3_FRMCNT_RST_MASK) - -#define CSI_CSICR3_FRMCNT_MASK (0xFFFF0000U) -#define CSI_CSICR3_FRMCNT_SHIFT (16U) -#define CSI_CSICR3_FRMCNT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR3_FRMCNT_SHIFT)) & CSI_CSICR3_FRMCNT_MASK) -/*! @} */ - -/*! @name CSISTATFIFO - CSI Statistic FIFO Register */ -/*! @{ */ - -#define CSI_CSISTATFIFO_STAT_MASK (0xFFFFFFFFU) -#define CSI_CSISTATFIFO_STAT_SHIFT (0U) -#define CSI_CSISTATFIFO_STAT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISTATFIFO_STAT_SHIFT)) & CSI_CSISTATFIFO_STAT_MASK) -/*! @} */ - -/*! @name CSIRFIFO - CSI RX FIFO Register */ -/*! @{ */ - -#define CSI_CSIRFIFO_IMAGE_MASK (0xFFFFFFFFU) -#define CSI_CSIRFIFO_IMAGE_SHIFT (0U) -#define CSI_CSIRFIFO_IMAGE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIRFIFO_IMAGE_SHIFT)) & CSI_CSIRFIFO_IMAGE_MASK) -/*! @} */ - -/*! @name CSIRXCNT - CSI RX Count Register */ -/*! @{ */ - -#define CSI_CSIRXCNT_RXCNT_MASK (0x3FFFFFU) -#define CSI_CSIRXCNT_RXCNT_SHIFT (0U) -#define CSI_CSIRXCNT_RXCNT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIRXCNT_RXCNT_SHIFT)) & CSI_CSIRXCNT_RXCNT_MASK) -/*! @} */ - -/*! @name CSISR - CSI Status Register */ -/*! @{ */ - -#define CSI_CSISR_DRDY_MASK (0x1U) -#define CSI_CSISR_DRDY_SHIFT (0U) -/*! DRDY - * 0b0..No data (word) is ready - * 0b1..At least 1 datum (word) is ready in RXFIFO. - */ -#define CSI_CSISR_DRDY(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DRDY_SHIFT)) & CSI_CSISR_DRDY_MASK) - -#define CSI_CSISR_ECC_INT_MASK (0x2U) -#define CSI_CSISR_ECC_INT_SHIFT (1U) -/*! ECC_INT - * 0b0..No error detected - * 0b1..Error is detected in CCIR coding - */ -#define CSI_CSISR_ECC_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_ECC_INT_SHIFT)) & CSI_CSISR_ECC_INT_MASK) - -#define CSI_CSISR_HRESP_ERR_INT_MASK (0x80U) -#define CSI_CSISR_HRESP_ERR_INT_SHIFT (7U) -/*! HRESP_ERR_INT - * 0b0..No hresponse error. - * 0b1..Hresponse error is detected. - */ -#define CSI_CSISR_HRESP_ERR_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_HRESP_ERR_INT_SHIFT)) & CSI_CSISR_HRESP_ERR_INT_MASK) - -#define CSI_CSISR_COF_INT_MASK (0x2000U) -#define CSI_CSISR_COF_INT_SHIFT (13U) -/*! COF_INT - * 0b0..Video field has no change. - * 0b1..Change of video field is detected. - */ -#define CSI_CSISR_COF_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_COF_INT_SHIFT)) & CSI_CSISR_COF_INT_MASK) - -#define CSI_CSISR_F1_INT_MASK (0x4000U) -#define CSI_CSISR_F1_INT_SHIFT (14U) -/*! F1_INT - * 0b0..Field 1 of video is not detected. - * 0b1..Field 1 of video is about to start. - */ -#define CSI_CSISR_F1_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_F1_INT_SHIFT)) & CSI_CSISR_F1_INT_MASK) - -#define CSI_CSISR_F2_INT_MASK (0x8000U) -#define CSI_CSISR_F2_INT_SHIFT (15U) -/*! F2_INT - * 0b0..Field 2 of video is not detected - * 0b1..Field 2 of video is about to start - */ -#define CSI_CSISR_F2_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_F2_INT_SHIFT)) & CSI_CSISR_F2_INT_MASK) - -#define CSI_CSISR_SOF_INT_MASK (0x10000U) -#define CSI_CSISR_SOF_INT_SHIFT (16U) -/*! SOF_INT - * 0b0..SOF is not detected. - * 0b1..SOF is detected. - */ -#define CSI_CSISR_SOF_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_SOF_INT_SHIFT)) & CSI_CSISR_SOF_INT_MASK) - -#define CSI_CSISR_EOF_INT_MASK (0x20000U) -#define CSI_CSISR_EOF_INT_SHIFT (17U) -/*! EOF_INT - * 0b0..EOF is not detected. - * 0b1..EOF is detected. - */ -#define CSI_CSISR_EOF_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_EOF_INT_SHIFT)) & CSI_CSISR_EOF_INT_MASK) - -#define CSI_CSISR_RxFF_INT_MASK (0x40000U) -#define CSI_CSISR_RxFF_INT_SHIFT (18U) -/*! RxFF_INT - * 0b0..RxFIFO is not full. - * 0b1..RxFIFO is full. - */ -#define CSI_CSISR_RxFF_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_RxFF_INT_SHIFT)) & CSI_CSISR_RxFF_INT_MASK) - -#define CSI_CSISR_DMA_TSF_DONE_FB1_MASK (0x80000U) -#define CSI_CSISR_DMA_TSF_DONE_FB1_SHIFT (19U) -/*! DMA_TSF_DONE_FB1 - * 0b0..DMA transfer is not completed. - * 0b1..DMA transfer is completed. - */ -#define CSI_CSISR_DMA_TSF_DONE_FB1(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DMA_TSF_DONE_FB1_SHIFT)) & CSI_CSISR_DMA_TSF_DONE_FB1_MASK) - -#define CSI_CSISR_DMA_TSF_DONE_FB2_MASK (0x100000U) -#define CSI_CSISR_DMA_TSF_DONE_FB2_SHIFT (20U) -/*! DMA_TSF_DONE_FB2 - * 0b0..DMA transfer is not completed. - * 0b1..DMA transfer is completed. - */ -#define CSI_CSISR_DMA_TSF_DONE_FB2(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DMA_TSF_DONE_FB2_SHIFT)) & CSI_CSISR_DMA_TSF_DONE_FB2_MASK) - -#define CSI_CSISR_STATFF_INT_MASK (0x200000U) -#define CSI_CSISR_STATFF_INT_SHIFT (21U) -/*! STATFF_INT - * 0b0..STATFIFO is not full. - * 0b1..STATFIFO is full. - */ -#define CSI_CSISR_STATFF_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_STATFF_INT_SHIFT)) & CSI_CSISR_STATFF_INT_MASK) - -#define CSI_CSISR_DMA_TSF_DONE_SFF_MASK (0x400000U) -#define CSI_CSISR_DMA_TSF_DONE_SFF_SHIFT (22U) -/*! DMA_TSF_DONE_SFF - * 0b0..DMA transfer is not completed. - * 0b1..DMA transfer is completed. - */ -#define CSI_CSISR_DMA_TSF_DONE_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DMA_TSF_DONE_SFF_SHIFT)) & CSI_CSISR_DMA_TSF_DONE_SFF_MASK) - -#define CSI_CSISR_RF_OR_INT_MASK (0x1000000U) -#define CSI_CSISR_RF_OR_INT_SHIFT (24U) -/*! RF_OR_INT - * 0b0..RXFIFO has not overflowed. - * 0b1..RXFIFO has overflowed. - */ -#define CSI_CSISR_RF_OR_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_RF_OR_INT_SHIFT)) & CSI_CSISR_RF_OR_INT_MASK) - -#define CSI_CSISR_SF_OR_INT_MASK (0x2000000U) -#define CSI_CSISR_SF_OR_INT_SHIFT (25U) -/*! SF_OR_INT - * 0b0..STATFIFO has not overflowed. - * 0b1..STATFIFO has overflowed. - */ -#define CSI_CSISR_SF_OR_INT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_SF_OR_INT_SHIFT)) & CSI_CSISR_SF_OR_INT_MASK) - -#define CSI_CSISR_DMA_FIELD1_DONE_MASK (0x4000000U) -#define CSI_CSISR_DMA_FIELD1_DONE_SHIFT (26U) -#define CSI_CSISR_DMA_FIELD1_DONE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DMA_FIELD1_DONE_SHIFT)) & CSI_CSISR_DMA_FIELD1_DONE_MASK) - -#define CSI_CSISR_DMA_FIELD0_DONE_MASK (0x8000000U) -#define CSI_CSISR_DMA_FIELD0_DONE_SHIFT (27U) -#define CSI_CSISR_DMA_FIELD0_DONE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_DMA_FIELD0_DONE_SHIFT)) & CSI_CSISR_DMA_FIELD0_DONE_MASK) - -#define CSI_CSISR_BASEADDR_CHHANGE_ERROR_MASK (0x10000000U) -#define CSI_CSISR_BASEADDR_CHHANGE_ERROR_SHIFT (28U) -#define CSI_CSISR_BASEADDR_CHHANGE_ERROR(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSISR_BASEADDR_CHHANGE_ERROR_SHIFT)) & CSI_CSISR_BASEADDR_CHHANGE_ERROR_MASK) -/*! @} */ - -/*! @name CSIDMASA_STATFIFO - CSI DMA Start Address Register - for STATFIFO */ -/*! @{ */ - -#define CSI_CSIDMASA_STATFIFO_DMA_START_ADDR_SFF_MASK (0xFFFFFFFCU) -#define CSI_CSIDMASA_STATFIFO_DMA_START_ADDR_SFF_SHIFT (2U) -#define CSI_CSIDMASA_STATFIFO_DMA_START_ADDR_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIDMASA_STATFIFO_DMA_START_ADDR_SFF_SHIFT)) & CSI_CSIDMASA_STATFIFO_DMA_START_ADDR_SFF_MASK) -/*! @} */ - -/*! @name CSIDMATS_STATFIFO - CSI DMA Transfer Size Register - for STATFIFO */ -/*! @{ */ - -#define CSI_CSIDMATS_STATFIFO_DMA_TSF_SIZE_SFF_MASK (0xFFFFFFFFU) -#define CSI_CSIDMATS_STATFIFO_DMA_TSF_SIZE_SFF_SHIFT (0U) -#define CSI_CSIDMATS_STATFIFO_DMA_TSF_SIZE_SFF(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIDMATS_STATFIFO_DMA_TSF_SIZE_SFF_SHIFT)) & CSI_CSIDMATS_STATFIFO_DMA_TSF_SIZE_SFF_MASK) -/*! @} */ - -/*! @name CSIDMASA_FB1 - CSI DMA Start Address Register - for Frame Buffer1 */ -/*! @{ */ - -#define CSI_CSIDMASA_FB1_DMA_START_ADDR_FB1_MASK (0xFFFFFFFCU) -#define CSI_CSIDMASA_FB1_DMA_START_ADDR_FB1_SHIFT (2U) -#define CSI_CSIDMASA_FB1_DMA_START_ADDR_FB1(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIDMASA_FB1_DMA_START_ADDR_FB1_SHIFT)) & CSI_CSIDMASA_FB1_DMA_START_ADDR_FB1_MASK) -/*! @} */ - -/*! @name CSIDMASA_FB2 - CSI DMA Transfer Size Register - for Frame Buffer2 */ -/*! @{ */ - -#define CSI_CSIDMASA_FB2_DMA_START_ADDR_FB2_MASK (0xFFFFFFFCU) -#define CSI_CSIDMASA_FB2_DMA_START_ADDR_FB2_SHIFT (2U) -#define CSI_CSIDMASA_FB2_DMA_START_ADDR_FB2(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIDMASA_FB2_DMA_START_ADDR_FB2_SHIFT)) & CSI_CSIDMASA_FB2_DMA_START_ADDR_FB2_MASK) -/*! @} */ - -/*! @name CSIFBUF_PARA - CSI Frame Buffer Parameter Register */ -/*! @{ */ - -#define CSI_CSIFBUF_PARA_FBUF_STRIDE_MASK (0xFFFFU) -#define CSI_CSIFBUF_PARA_FBUF_STRIDE_SHIFT (0U) -#define CSI_CSIFBUF_PARA_FBUF_STRIDE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIFBUF_PARA_FBUF_STRIDE_SHIFT)) & CSI_CSIFBUF_PARA_FBUF_STRIDE_MASK) - -#define CSI_CSIFBUF_PARA_DEINTERLACE_STRIDE_MASK (0xFFFF0000U) -#define CSI_CSIFBUF_PARA_DEINTERLACE_STRIDE_SHIFT (16U) -#define CSI_CSIFBUF_PARA_DEINTERLACE_STRIDE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIFBUF_PARA_DEINTERLACE_STRIDE_SHIFT)) & CSI_CSIFBUF_PARA_DEINTERLACE_STRIDE_MASK) -/*! @} */ - -/*! @name CSIIMAG_PARA - CSI Image Parameter Register */ -/*! @{ */ - -#define CSI_CSIIMAG_PARA_IMAGE_HEIGHT_MASK (0xFFFFU) -#define CSI_CSIIMAG_PARA_IMAGE_HEIGHT_SHIFT (0U) -#define CSI_CSIIMAG_PARA_IMAGE_HEIGHT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIIMAG_PARA_IMAGE_HEIGHT_SHIFT)) & CSI_CSIIMAG_PARA_IMAGE_HEIGHT_MASK) - -#define CSI_CSIIMAG_PARA_IMAGE_WIDTH_MASK (0xFFFF0000U) -#define CSI_CSIIMAG_PARA_IMAGE_WIDTH_SHIFT (16U) -#define CSI_CSIIMAG_PARA_IMAGE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSIIMAG_PARA_IMAGE_WIDTH_SHIFT)) & CSI_CSIIMAG_PARA_IMAGE_WIDTH_MASK) -/*! @} */ - -/*! @name CSICR18 - CSI Control Register 18 */ -/*! @{ */ - -#define CSI_CSICR18_DEINTERLACE_EN_MASK (0x4U) -#define CSI_CSICR18_DEINTERLACE_EN_SHIFT (2U) -/*! DEINTERLACE_EN - * 0b0..Deinterlace disabled - * 0b1..Deinterlace enabled - */ -#define CSI_CSICR18_DEINTERLACE_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_DEINTERLACE_EN_SHIFT)) & CSI_CSICR18_DEINTERLACE_EN_MASK) - -#define CSI_CSICR18_PARALLEL24_EN_MASK (0x8U) -#define CSI_CSICR18_PARALLEL24_EN_SHIFT (3U) -#define CSI_CSICR18_PARALLEL24_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_PARALLEL24_EN_SHIFT)) & CSI_CSICR18_PARALLEL24_EN_MASK) - -#define CSI_CSICR18_BASEADDR_SWITCH_EN_MASK (0x10U) -#define CSI_CSICR18_BASEADDR_SWITCH_EN_SHIFT (4U) -#define CSI_CSICR18_BASEADDR_SWITCH_EN(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_BASEADDR_SWITCH_EN_SHIFT)) & CSI_CSICR18_BASEADDR_SWITCH_EN_MASK) - -#define CSI_CSICR18_BASEADDR_SWITCH_SEL_MASK (0x20U) -#define CSI_CSICR18_BASEADDR_SWITCH_SEL_SHIFT (5U) -/*! BASEADDR_SWITCH_SEL - * 0b0..Switching base address at the edge of the vsync - * 0b1..Switching base address at the edge of the first data of each frame - */ -#define CSI_CSICR18_BASEADDR_SWITCH_SEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_BASEADDR_SWITCH_SEL_SHIFT)) & CSI_CSICR18_BASEADDR_SWITCH_SEL_MASK) - -#define CSI_CSICR18_FIELD0_DONE_IE_MASK (0x40U) -#define CSI_CSICR18_FIELD0_DONE_IE_SHIFT (6U) -/*! FIELD0_DONE_IE - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define CSI_CSICR18_FIELD0_DONE_IE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_FIELD0_DONE_IE_SHIFT)) & CSI_CSICR18_FIELD0_DONE_IE_MASK) - -#define CSI_CSICR18_DMA_FIELD1_DONE_IE_MASK (0x80U) -#define CSI_CSICR18_DMA_FIELD1_DONE_IE_SHIFT (7U) -/*! DMA_FIELD1_DONE_IE - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define CSI_CSICR18_DMA_FIELD1_DONE_IE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_DMA_FIELD1_DONE_IE_SHIFT)) & CSI_CSICR18_DMA_FIELD1_DONE_IE_MASK) - -#define CSI_CSICR18_LAST_DMA_REQ_SEL_MASK (0x100U) -#define CSI_CSICR18_LAST_DMA_REQ_SEL_SHIFT (8U) -/*! LAST_DMA_REQ_SEL - * 0b0..fifo_full_level - * 0b1..hburst_length - */ -#define CSI_CSICR18_LAST_DMA_REQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_LAST_DMA_REQ_SEL_SHIFT)) & CSI_CSICR18_LAST_DMA_REQ_SEL_MASK) - -#define CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_MASK (0x200U) -#define CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_SHIFT (9U) -#define CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_SHIFT)) & CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_MASK) - -#define CSI_CSICR18_RGB888A_FORMAT_SEL_MASK (0x400U) -#define CSI_CSICR18_RGB888A_FORMAT_SEL_SHIFT (10U) -/*! RGB888A_FORMAT_SEL - * 0b0..{8'h0, data[23:0]} - * 0b1..{data[23:0], 8'h0} - */ -#define CSI_CSICR18_RGB888A_FORMAT_SEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_RGB888A_FORMAT_SEL_SHIFT)) & CSI_CSICR18_RGB888A_FORMAT_SEL_MASK) - -#define CSI_CSICR18_AHB_HPROT_MASK (0xF000U) -#define CSI_CSICR18_AHB_HPROT_SHIFT (12U) -#define CSI_CSICR18_AHB_HPROT(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_AHB_HPROT_SHIFT)) & CSI_CSICR18_AHB_HPROT_MASK) - -#define CSI_CSICR18_MASK_OPTION_MASK (0xC0000U) -#define CSI_CSICR18_MASK_OPTION_SHIFT (18U) -/*! MASK_OPTION - * 0b00..Writing to memory from first completely frame, when using this option, the CSI_ENABLE should be 1. - * 0b01..Writing to memory when CSI_ENABLE is 1. - * 0b10..Writing to memory from second completely frame, when using this option, the CSI_ENABLE should be 1. - * 0b11..Writing to memory when data comes in, not matter the CSI_ENABLE is 1 or 0. - */ -#define CSI_CSICR18_MASK_OPTION(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_MASK_OPTION_SHIFT)) & CSI_CSICR18_MASK_OPTION_MASK) - -#define CSI_CSICR18_CSI_ENABLE_MASK (0x80000000U) -#define CSI_CSICR18_CSI_ENABLE_SHIFT (31U) -#define CSI_CSICR18_CSI_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR18_CSI_ENABLE_SHIFT)) & CSI_CSICR18_CSI_ENABLE_MASK) -/*! @} */ - -/*! @name CSICR19 - CSI Control Register 19 */ -/*! @{ */ - -#define CSI_CSICR19_DMA_RFIFO_HIGHEST_FIFO_LEVEL_MASK (0xFFU) -#define CSI_CSICR19_DMA_RFIFO_HIGHEST_FIFO_LEVEL_SHIFT (0U) -#define CSI_CSICR19_DMA_RFIFO_HIGHEST_FIFO_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << CSI_CSICR19_DMA_RFIFO_HIGHEST_FIFO_LEVEL_SHIFT)) & CSI_CSICR19_DMA_RFIFO_HIGHEST_FIFO_LEVEL_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CSI_Register_Masks */ - - -/* CSI - Peripheral instance base addresses */ -/** Peripheral CSI base address */ -#define CSI_BASE (0x402BC000u) -/** Peripheral CSI base pointer */ -#define CSI ((CSI_Type *)CSI_BASE) -/** Array initializer of CSI peripheral base addresses */ -#define CSI_BASE_ADDRS { CSI_BASE } -/** Array initializer of CSI peripheral base pointers */ -#define CSI_BASE_PTRS { CSI } -/** Interrupt vectors for the CSI peripheral type */ -#define CSI_IRQS { CSI_IRQn } - -/*! - * @} - */ /* end of group CSI_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- CSU Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CSU_Peripheral_Access_Layer CSU Peripheral Access Layer - * @{ - */ - -/** CSU - Register Layout Typedef */ -typedef struct { - __IO uint32_t CSL[32]; /**< Config security level register, array offset: 0x0, array step: 0x4 */ - uint8_t RESERVED_0[384]; - __IO uint32_t HP0; /**< HP0 register, offset: 0x200 */ - uint8_t RESERVED_1[20]; - __IO uint32_t SA; /**< Secure access register, offset: 0x218 */ - uint8_t RESERVED_2[316]; - __IO uint32_t HPCONTROL0; /**< HPCONTROL0 register, offset: 0x358 */ -} CSU_Type; - -/* ---------------------------------------------------------------------------- - -- CSU Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup CSU_Register_Masks CSU Register Masks - * @{ - */ - -/*! @name CSL - Config security level register */ -/*! @{ */ - -#define CSU_CSL_SUR_S2_MASK (0x1U) -#define CSU_CSL_SUR_S2_SHIFT (0U) -/*! SUR_S2 - * 0b0..The secure user read access is disabled for the second slave. - * 0b1..The secure user read access is enabled for the second slave. - */ -#define CSU_CSL_SUR_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SUR_S2_SHIFT)) & CSU_CSL_SUR_S2_MASK) - -#define CSU_CSL_SSR_S2_MASK (0x2U) -#define CSU_CSL_SSR_S2_SHIFT (1U) -/*! SSR_S2 - * 0b0..The secure supervisor read access is disabled for the second slave. - * 0b1..The secure supervisor read access is enabled for the second slave. - */ -#define CSU_CSL_SSR_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SSR_S2_SHIFT)) & CSU_CSL_SSR_S2_MASK) - -#define CSU_CSL_NUR_S2_MASK (0x4U) -#define CSU_CSL_NUR_S2_SHIFT (2U) -/*! NUR_S2 - * 0b0..The non-secure user read access is disabled for the second slave. - * 0b1..The non-secure user read access is enabled for the second slave. - */ -#define CSU_CSL_NUR_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NUR_S2_SHIFT)) & CSU_CSL_NUR_S2_MASK) - -#define CSU_CSL_NSR_S2_MASK (0x8U) -#define CSU_CSL_NSR_S2_SHIFT (3U) -/*! NSR_S2 - * 0b0..The non-secure supervisor read access is disabled for the second slave. - * 0b1..The non-secure supervisor read access is enabled for the second slave. - */ -#define CSU_CSL_NSR_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NSR_S2_SHIFT)) & CSU_CSL_NSR_S2_MASK) - -#define CSU_CSL_SUW_S2_MASK (0x10U) -#define CSU_CSL_SUW_S2_SHIFT (4U) -/*! SUW_S2 - * 0b0..The secure user write access is disabled for the second slave. - * 0b1..The secure user write access is enabled for the second slave. - */ -#define CSU_CSL_SUW_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SUW_S2_SHIFT)) & CSU_CSL_SUW_S2_MASK) - -#define CSU_CSL_SSW_S2_MASK (0x20U) -#define CSU_CSL_SSW_S2_SHIFT (5U) -/*! SSW_S2 - * 0b0..The secure supervisor write access is disabled for the second slave. - * 0b1..The secure supervisor write access is enabled for the second slave. - */ -#define CSU_CSL_SSW_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SSW_S2_SHIFT)) & CSU_CSL_SSW_S2_MASK) - -#define CSU_CSL_NUW_S2_MASK (0x40U) -#define CSU_CSL_NUW_S2_SHIFT (6U) -/*! NUW_S2 - * 0b0..The non-secure user write access is disabled for the second slave. - * 0b1..The non-secure user write access is enabled for the second slave. - */ -#define CSU_CSL_NUW_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NUW_S2_SHIFT)) & CSU_CSL_NUW_S2_MASK) - -#define CSU_CSL_NSW_S2_MASK (0x80U) -#define CSU_CSL_NSW_S2_SHIFT (7U) -/*! NSW_S2 - * 0b0..The non-secure supervisor write access is disabled for the second slave. - * 0b1..The non-secure supervisor write access is enabled for the second slave. - */ -#define CSU_CSL_NSW_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NSW_S2_SHIFT)) & CSU_CSL_NSW_S2_MASK) - -#define CSU_CSL_LOCK_S2_MASK (0x100U) -#define CSU_CSL_LOCK_S2_SHIFT (8U) -/*! LOCK_S2 - * 0b0..Not locked. Bits 7-0 can be written by the software. - * 0b1..Bits 7-0 are locked and cannot be written by the software - */ -#define CSU_CSL_LOCK_S2(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_LOCK_S2_SHIFT)) & CSU_CSL_LOCK_S2_MASK) - -#define CSU_CSL_SUR_S1_MASK (0x10000U) -#define CSU_CSL_SUR_S1_SHIFT (16U) -/*! SUR_S1 - * 0b0..The secure user read access is disabled for the first slave. - * 0b1..The secure user read access is enabled for the first slave. - */ -#define CSU_CSL_SUR_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SUR_S1_SHIFT)) & CSU_CSL_SUR_S1_MASK) - -#define CSU_CSL_SSR_S1_MASK (0x20000U) -#define CSU_CSL_SSR_S1_SHIFT (17U) -/*! SSR_S1 - * 0b0..The secure supervisor read access is disabled for the first slave. - * 0b1..The secure supervisor read access is enabled for the first slave. - */ -#define CSU_CSL_SSR_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SSR_S1_SHIFT)) & CSU_CSL_SSR_S1_MASK) - -#define CSU_CSL_NUR_S1_MASK (0x40000U) -#define CSU_CSL_NUR_S1_SHIFT (18U) -/*! NUR_S1 - * 0b0..The non-secure user read access is disabled for the first slave. - * 0b1..The non-secure user read access is enabled for the first slave. - */ -#define CSU_CSL_NUR_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NUR_S1_SHIFT)) & CSU_CSL_NUR_S1_MASK) - -#define CSU_CSL_NSR_S1_MASK (0x80000U) -#define CSU_CSL_NSR_S1_SHIFT (19U) -/*! NSR_S1 - * 0b0..The non-secure supervisor read access is disabled for the first slave. - * 0b1..The non-secure supervisor read access is enabled for the first slave. - */ -#define CSU_CSL_NSR_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NSR_S1_SHIFT)) & CSU_CSL_NSR_S1_MASK) - -#define CSU_CSL_SUW_S1_MASK (0x100000U) -#define CSU_CSL_SUW_S1_SHIFT (20U) -/*! SUW_S1 - * 0b0..The secure user write access is disabled for the first slave. - * 0b1..The secure user write access is enabled for the first slave. - */ -#define CSU_CSL_SUW_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SUW_S1_SHIFT)) & CSU_CSL_SUW_S1_MASK) - -#define CSU_CSL_SSW_S1_MASK (0x200000U) -#define CSU_CSL_SSW_S1_SHIFT (21U) -/*! SSW_S1 - * 0b0..The secure supervisor write access is disabled for the first slave. - * 0b1..The secure supervisor write access is enabled for the first slave. - */ -#define CSU_CSL_SSW_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_SSW_S1_SHIFT)) & CSU_CSL_SSW_S1_MASK) - -#define CSU_CSL_NUW_S1_MASK (0x400000U) -#define CSU_CSL_NUW_S1_SHIFT (22U) -/*! NUW_S1 - * 0b0..The non-secure user write access is disabled for the first slave. - * 0b1..The non-secure user write access is enabled for the first slave. - */ -#define CSU_CSL_NUW_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NUW_S1_SHIFT)) & CSU_CSL_NUW_S1_MASK) - -#define CSU_CSL_NSW_S1_MASK (0x800000U) -#define CSU_CSL_NSW_S1_SHIFT (23U) -/*! NSW_S1 - * 0b0..The non-secure supervisor write access is disabled for the first slave. - * 0b1..The non-secure supervisor write access is enabled for the first slave - */ -#define CSU_CSL_NSW_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_NSW_S1_SHIFT)) & CSU_CSL_NSW_S1_MASK) - -#define CSU_CSL_LOCK_S1_MASK (0x1000000U) -#define CSU_CSL_LOCK_S1_SHIFT (24U) -/*! LOCK_S1 - * 0b0..Not locked. The bits 16-23 can be written by the software. - * 0b1..The bits 16-23 are locked and can't be written by the software. - */ -#define CSU_CSL_LOCK_S1(x) (((uint32_t)(((uint32_t)(x)) << CSU_CSL_LOCK_S1_SHIFT)) & CSU_CSL_LOCK_S1_MASK) -/*! @} */ - -/* The count of CSU_CSL */ -#define CSU_CSL_COUNT (32U) - -/*! @name HP0 - HP0 register */ -/*! @{ */ - -#define CSU_HP0_HP_DMA_MASK (0x4U) -#define CSU_HP0_HP_DMA_SHIFT (2U) -/*! HP_DMA - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_DMA_SHIFT)) & CSU_HP0_HP_DMA_MASK) - -#define CSU_HP0_L_DMA_MASK (0x8U) -#define CSU_HP0_L_DMA_SHIFT (3U) -/*! L_DMA - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_DMA_SHIFT)) & CSU_HP0_L_DMA_MASK) - -#define CSU_HP0_HP_LCDIF_MASK (0x10U) -#define CSU_HP0_HP_LCDIF_SHIFT (4U) -/*! HP_LCDIF - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_LCDIF_SHIFT)) & CSU_HP0_HP_LCDIF_MASK) - -#define CSU_HP0_L_LCDIF_MASK (0x20U) -#define CSU_HP0_L_LCDIF_SHIFT (5U) -/*! L_LCDIF - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_LCDIF_SHIFT)) & CSU_HP0_L_LCDIF_MASK) - -#define CSU_HP0_HP_CSI_MASK (0x40U) -#define CSU_HP0_HP_CSI_SHIFT (6U) -/*! HP_CSI - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_CSI_SHIFT)) & CSU_HP0_HP_CSI_MASK) - -#define CSU_HP0_L_CSI_MASK (0x80U) -#define CSU_HP0_L_CSI_SHIFT (7U) -/*! L_CSI - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_CSI_SHIFT)) & CSU_HP0_L_CSI_MASK) - -#define CSU_HP0_HP_PXP_MASK (0x100U) -#define CSU_HP0_HP_PXP_SHIFT (8U) -/*! HP_PXP - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_PXP_SHIFT)) & CSU_HP0_HP_PXP_MASK) - -#define CSU_HP0_L_PXP_MASK (0x200U) -#define CSU_HP0_L_PXP_SHIFT (9U) -/*! L_PXP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_PXP_SHIFT)) & CSU_HP0_L_PXP_MASK) - -#define CSU_HP0_HP_DCP_MASK (0x400U) -#define CSU_HP0_HP_DCP_SHIFT (10U) -/*! HP_DCP - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_DCP_SHIFT)) & CSU_HP0_HP_DCP_MASK) - -#define CSU_HP0_L_DCP_MASK (0x800U) -#define CSU_HP0_L_DCP_SHIFT (11U) -/*! L_DCP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit cannot be written by the software. - */ -#define CSU_HP0_L_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_DCP_SHIFT)) & CSU_HP0_L_DCP_MASK) - -#define CSU_HP0_HP_ENET_MASK (0x4000U) -#define CSU_HP0_HP_ENET_SHIFT (14U) -/*! HP_ENET - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_ENET_SHIFT)) & CSU_HP0_HP_ENET_MASK) - -#define CSU_HP0_L_ENET_MASK (0x8000U) -#define CSU_HP0_L_ENET_SHIFT (15U) -/*! L_ENET - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_ENET_SHIFT)) & CSU_HP0_L_ENET_MASK) - -#define CSU_HP0_HP_USDHC1_MASK (0x10000U) -#define CSU_HP0_HP_USDHC1_SHIFT (16U) -/*! HP_USDHC1 - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_USDHC1_SHIFT)) & CSU_HP0_HP_USDHC1_MASK) - -#define CSU_HP0_L_USDHC1_MASK (0x20000U) -#define CSU_HP0_L_USDHC1_SHIFT (17U) -/*! L_USDHC1 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_USDHC1_SHIFT)) & CSU_HP0_L_USDHC1_MASK) - -#define CSU_HP0_HP_USDHC2_MASK (0x40000U) -#define CSU_HP0_HP_USDHC2_SHIFT (18U) -/*! HP_USDHC2 - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_USDHC2_SHIFT)) & CSU_HP0_HP_USDHC2_MASK) - -#define CSU_HP0_L_USDHC2_MASK (0x80000U) -#define CSU_HP0_L_USDHC2_SHIFT (19U) -/*! L_USDHC2 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_USDHC2_SHIFT)) & CSU_HP0_L_USDHC2_MASK) - -#define CSU_HP0_HP_TPSMP_MASK (0x100000U) -#define CSU_HP0_HP_TPSMP_SHIFT (20U) -/*! HP_TPSMP - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_TPSMP_SHIFT)) & CSU_HP0_HP_TPSMP_MASK) - -#define CSU_HP0_L_TPSMP_MASK (0x200000U) -#define CSU_HP0_L_TPSMP_SHIFT (21U) -/*! L_TPSMP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_TPSMP_SHIFT)) & CSU_HP0_L_TPSMP_MASK) - -#define CSU_HP0_HP_USB_MASK (0x400000U) -#define CSU_HP0_HP_USB_SHIFT (22U) -/*! HP_USB - * 0b0..The hprot1 input signal value is routed to the csu_hprot1 output for the corresponding master. - * 0b1..The HP register bit is routed to the csu_hprot1 output for the corresponding master. - */ -#define CSU_HP0_HP_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_HP_USB_SHIFT)) & CSU_HP0_HP_USB_MASK) - -#define CSU_HP0_L_USB_MASK (0x800000U) -#define CSU_HP0_L_USB_SHIFT (23U) -/*! L_USB - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HP0_L_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_HP0_L_USB_SHIFT)) & CSU_HP0_L_USB_MASK) -/*! @} */ - -/*! @name SA - Secure access register */ -/*! @{ */ - -#define CSU_SA_NSA_DMA_MASK (0x4U) -#define CSU_SA_NSA_DMA_SHIFT (2U) -/*! NSA_DMA - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_DMA_SHIFT)) & CSU_SA_NSA_DMA_MASK) - -#define CSU_SA_L_DMA_MASK (0x8U) -#define CSU_SA_L_DMA_SHIFT (3U) -/*! L_DMA - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_DMA_SHIFT)) & CSU_SA_L_DMA_MASK) - -#define CSU_SA_NSA_LCDIF_MASK (0x10U) -#define CSU_SA_NSA_LCDIF_SHIFT (4U) -/*! NSA_LCDIF - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_LCDIF_SHIFT)) & CSU_SA_NSA_LCDIF_MASK) - -#define CSU_SA_L_LCDIF_MASK (0x20U) -#define CSU_SA_L_LCDIF_SHIFT (5U) -/*! L_LCDIF - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_LCDIF_SHIFT)) & CSU_SA_L_LCDIF_MASK) - -#define CSU_SA_NSA_CSI_MASK (0x40U) -#define CSU_SA_NSA_CSI_SHIFT (6U) -/*! NSA_CSI - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_CSI_SHIFT)) & CSU_SA_NSA_CSI_MASK) - -#define CSU_SA_L_CSI_MASK (0x80U) -#define CSU_SA_L_CSI_SHIFT (7U) -/*! L_CSI - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_CSI_SHIFT)) & CSU_SA_L_CSI_MASK) - -#define CSU_SA_NSA_PXP_MASK (0x100U) -#define CSU_SA_NSA_PXP_SHIFT (8U) -/*! NSA_PXP - Non-Secure Access Policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_PXP_SHIFT)) & CSU_SA_NSA_PXP_MASK) - -#define CSU_SA_L_PXP_MASK (0x200U) -#define CSU_SA_L_PXP_SHIFT (9U) -/*! L_PXP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_PXP_SHIFT)) & CSU_SA_L_PXP_MASK) - -#define CSU_SA_NSA_DCP_MASK (0x400U) -#define CSU_SA_NSA_DCP_SHIFT (10U) -/*! NSA_DCP - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_DCP_SHIFT)) & CSU_SA_NSA_DCP_MASK) - -#define CSU_SA_L_DCP_MASK (0x800U) -#define CSU_SA_L_DCP_SHIFT (11U) -/*! L_DCP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_DCP_SHIFT)) & CSU_SA_L_DCP_MASK) - -#define CSU_SA_NSA_ENET_MASK (0x4000U) -#define CSU_SA_NSA_ENET_SHIFT (14U) -/*! NSA_ENET - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_ENET_SHIFT)) & CSU_SA_NSA_ENET_MASK) - -#define CSU_SA_L_ENET_MASK (0x8000U) -#define CSU_SA_L_ENET_SHIFT (15U) -/*! L_ENET - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_ENET_SHIFT)) & CSU_SA_L_ENET_MASK) - -#define CSU_SA_NSA_USDHC1_MASK (0x10000U) -#define CSU_SA_NSA_USDHC1_SHIFT (16U) -/*! NSA_USDHC1 - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_USDHC1_SHIFT)) & CSU_SA_NSA_USDHC1_MASK) - -#define CSU_SA_L_USDHC1_MASK (0x20000U) -#define CSU_SA_L_USDHC1_SHIFT (17U) -/*! L_USDHC1 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_USDHC1_SHIFT)) & CSU_SA_L_USDHC1_MASK) - -#define CSU_SA_NSA_USDHC2_MASK (0x40000U) -#define CSU_SA_NSA_USDHC2_SHIFT (18U) -/*! NSA_USDHC2 - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_USDHC2_SHIFT)) & CSU_SA_NSA_USDHC2_MASK) - -#define CSU_SA_L_USDHC2_MASK (0x80000U) -#define CSU_SA_L_USDHC2_SHIFT (19U) -/*! L_USDHC2 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_USDHC2_SHIFT)) & CSU_SA_L_USDHC2_MASK) - -#define CSU_SA_NSA_TPSMP_MASK (0x100000U) -#define CSU_SA_NSA_TPSMP_SHIFT (20U) -/*! NSA_TPSMP - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_TPSMP_SHIFT)) & CSU_SA_NSA_TPSMP_MASK) - -#define CSU_SA_L_TPSMP_MASK (0x200000U) -#define CSU_SA_L_TPSMP_SHIFT (21U) -/*! L_TPSMP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_TPSMP_SHIFT)) & CSU_SA_L_TPSMP_MASK) - -#define CSU_SA_NSA_USB_MASK (0x400000U) -#define CSU_SA_NSA_USB_SHIFT (22U) -/*! NSA_USB - Non-secure access policy indicator bit - * 0b0..Secure access for the corresponding type-1 master - * 0b1..Non-secure access for the corresponding type-1 master - */ -#define CSU_SA_NSA_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_NSA_USB_SHIFT)) & CSU_SA_NSA_USB_MASK) - -#define CSU_SA_L_USB_MASK (0x800000U) -#define CSU_SA_L_USB_SHIFT (23U) -/*! L_USB - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_SA_L_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_SA_L_USB_SHIFT)) & CSU_SA_L_USB_MASK) -/*! @} */ - -/*! @name HPCONTROL0 - HPCONTROL0 register */ -/*! @{ */ - -#define CSU_HPCONTROL0_HPC_DMA_MASK (0x4U) -#define CSU_HPCONTROL0_HPC_DMA_SHIFT (2U) -/*! HPC_DMA - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_DMA_SHIFT)) & CSU_HPCONTROL0_HPC_DMA_MASK) - -#define CSU_HPCONTROL0_L_DMA_MASK (0x8U) -#define CSU_HPCONTROL0_L_DMA_SHIFT (3U) -/*! L_DMA - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_DMA(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_DMA_SHIFT)) & CSU_HPCONTROL0_L_DMA_MASK) - -#define CSU_HPCONTROL0_HPC_LCDIF_MASK (0x10U) -#define CSU_HPCONTROL0_HPC_LCDIF_SHIFT (4U) -/*! HPC_LCDIF - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_LCDIF_SHIFT)) & CSU_HPCONTROL0_HPC_LCDIF_MASK) - -#define CSU_HPCONTROL0_L_LCDIF_MASK (0x20U) -#define CSU_HPCONTROL0_L_LCDIF_SHIFT (5U) -/*! L_LCDIF - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_LCDIF(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_LCDIF_SHIFT)) & CSU_HPCONTROL0_L_LCDIF_MASK) - -#define CSU_HPCONTROL0_HPC_CSI_MASK (0x40U) -#define CSU_HPCONTROL0_HPC_CSI_SHIFT (6U) -/*! HPC_CSI - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_CSI_SHIFT)) & CSU_HPCONTROL0_HPC_CSI_MASK) - -#define CSU_HPCONTROL0_L_CSI_MASK (0x80U) -#define CSU_HPCONTROL0_L_CSI_SHIFT (7U) -/*! L_CSI - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_CSI(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_CSI_SHIFT)) & CSU_HPCONTROL0_L_CSI_MASK) - -#define CSU_HPCONTROL0_HPC_PXP_MASK (0x100U) -#define CSU_HPCONTROL0_HPC_PXP_SHIFT (8U) -/*! HPC_PXP - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_PXP_SHIFT)) & CSU_HPCONTROL0_HPC_PXP_MASK) - -#define CSU_HPCONTROL0_L_PXP_MASK (0x200U) -#define CSU_HPCONTROL0_L_PXP_SHIFT (9U) -/*! L_PXP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_PXP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_PXP_SHIFT)) & CSU_HPCONTROL0_L_PXP_MASK) - -#define CSU_HPCONTROL0_HPC_DCP_MASK (0x400U) -#define CSU_HPCONTROL0_HPC_DCP_SHIFT (10U) -/*! HPC_DCP - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_DCP_SHIFT)) & CSU_HPCONTROL0_HPC_DCP_MASK) - -#define CSU_HPCONTROL0_L_DCP_MASK (0x800U) -#define CSU_HPCONTROL0_L_DCP_SHIFT (11U) -/*! L_DCP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_DCP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_DCP_SHIFT)) & CSU_HPCONTROL0_L_DCP_MASK) - -#define CSU_HPCONTROL0_HPC_ENET_MASK (0x4000U) -#define CSU_HPCONTROL0_HPC_ENET_SHIFT (14U) -/*! HPC_ENET - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_ENET_SHIFT)) & CSU_HPCONTROL0_HPC_ENET_MASK) - -#define CSU_HPCONTROL0_L_ENET_MASK (0x8000U) -#define CSU_HPCONTROL0_L_ENET_SHIFT (15U) -/*! L_ENET - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_ENET(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_ENET_SHIFT)) & CSU_HPCONTROL0_L_ENET_MASK) - -#define CSU_HPCONTROL0_HPC_USDHC1_MASK (0x10000U) -#define CSU_HPCONTROL0_HPC_USDHC1_SHIFT (16U) -/*! HPC_USDHC1 - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_USDHC1_SHIFT)) & CSU_HPCONTROL0_HPC_USDHC1_MASK) - -#define CSU_HPCONTROL0_L_USDHC1_MASK (0x20000U) -#define CSU_HPCONTROL0_L_USDHC1_SHIFT (17U) -/*! L_USDHC1 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_USDHC1(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_USDHC1_SHIFT)) & CSU_HPCONTROL0_L_USDHC1_MASK) - -#define CSU_HPCONTROL0_HPC_USDHC2_MASK (0x40000U) -#define CSU_HPCONTROL0_HPC_USDHC2_SHIFT (18U) -/*! HPC_USDHC2 - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_USDHC2_SHIFT)) & CSU_HPCONTROL0_HPC_USDHC2_MASK) - -#define CSU_HPCONTROL0_L_USDHC2_MASK (0x80000U) -#define CSU_HPCONTROL0_L_USDHC2_SHIFT (19U) -/*! L_USDHC2 - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_USDHC2(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_USDHC2_SHIFT)) & CSU_HPCONTROL0_L_USDHC2_MASK) - -#define CSU_HPCONTROL0_HPC_TPSMP_MASK (0x100000U) -#define CSU_HPCONTROL0_HPC_TPSMP_SHIFT (20U) -/*! HPC_TPSMP - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_TPSMP_SHIFT)) & CSU_HPCONTROL0_HPC_TPSMP_MASK) - -#define CSU_HPCONTROL0_L_TPSMP_MASK (0x200000U) -#define CSU_HPCONTROL0_L_TPSMP_SHIFT (21U) -/*! L_TPSMP - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_TPSMP(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_TPSMP_SHIFT)) & CSU_HPCONTROL0_L_TPSMP_MASK) - -#define CSU_HPCONTROL0_HPC_USB_MASK (0x400000U) -#define CSU_HPCONTROL0_HPC_USB_SHIFT (22U) -/*! HPC_USB - * 0b0..User mode for the corresponding master - * 0b1..Supervisor mode for the corresponding master - */ -#define CSU_HPCONTROL0_HPC_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_HPC_USB_SHIFT)) & CSU_HPCONTROL0_HPC_USB_MASK) - -#define CSU_HPCONTROL0_L_USB_MASK (0x800000U) -#define CSU_HPCONTROL0_L_USB_SHIFT (23U) -/*! L_USB - * 0b0..No lock-the adjacent (next lower) bit can be written by the software. - * 0b1..Lock-the adjacent (next lower) bit can't be written by the software. - */ -#define CSU_HPCONTROL0_L_USB(x) (((uint32_t)(((uint32_t)(x)) << CSU_HPCONTROL0_L_USB_SHIFT)) & CSU_HPCONTROL0_L_USB_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group CSU_Register_Masks */ - - -/* CSU - Peripheral instance base addresses */ -/** Peripheral CSU base address */ -#define CSU_BASE (0x400DC000u) -/** Peripheral CSU base pointer */ -#define CSU ((CSU_Type *)CSU_BASE) -/** Array initializer of CSU peripheral base addresses */ -#define CSU_BASE_ADDRS { CSU_BASE } -/** Array initializer of CSU peripheral base pointers */ -#define CSU_BASE_PTRS { CSU } - -/*! - * @} - */ /* end of group CSU_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- DCDC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DCDC_Peripheral_Access_Layer DCDC Peripheral Access Layer - * @{ - */ - -/** DCDC - Register Layout Typedef */ -typedef struct { - __IO uint32_t REG0; /**< DCDC Register 0, offset: 0x0 */ - __IO uint32_t REG1; /**< DCDC Register 1, offset: 0x4 */ - __IO uint32_t REG2; /**< DCDC Register 2, offset: 0x8 */ - __IO uint32_t REG3; /**< DCDC Register 3, offset: 0xC */ -} DCDC_Type; - -/* ---------------------------------------------------------------------------- - -- DCDC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DCDC_Register_Masks DCDC Register Masks - * @{ - */ - -/*! @name REG0 - DCDC Register 0 */ -/*! @{ */ - -#define DCDC_REG0_PWD_ZCD_MASK (0x1U) -#define DCDC_REG0_PWD_ZCD_SHIFT (0U) -#define DCDC_REG0_PWD_ZCD(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_ZCD_SHIFT)) & DCDC_REG0_PWD_ZCD_MASK) - -#define DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_MASK (0x2U) -#define DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_SHIFT (1U) -#define DCDC_REG0_DISABLE_AUTO_CLK_SWITCH(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_SHIFT)) & DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_MASK) - -#define DCDC_REG0_SEL_CLK_MASK (0x4U) -#define DCDC_REG0_SEL_CLK_SHIFT (2U) -#define DCDC_REG0_SEL_CLK(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_SEL_CLK_SHIFT)) & DCDC_REG0_SEL_CLK_MASK) - -#define DCDC_REG0_PWD_OSC_INT_MASK (0x8U) -#define DCDC_REG0_PWD_OSC_INT_SHIFT (3U) -#define DCDC_REG0_PWD_OSC_INT(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_OSC_INT_SHIFT)) & DCDC_REG0_PWD_OSC_INT_MASK) - -#define DCDC_REG0_PWD_CUR_SNS_CMP_MASK (0x10U) -#define DCDC_REG0_PWD_CUR_SNS_CMP_SHIFT (4U) -#define DCDC_REG0_PWD_CUR_SNS_CMP(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_CUR_SNS_CMP_SHIFT)) & DCDC_REG0_PWD_CUR_SNS_CMP_MASK) - -#define DCDC_REG0_CUR_SNS_THRSH_MASK (0xE0U) -#define DCDC_REG0_CUR_SNS_THRSH_SHIFT (5U) -#define DCDC_REG0_CUR_SNS_THRSH(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_CUR_SNS_THRSH_SHIFT)) & DCDC_REG0_CUR_SNS_THRSH_MASK) - -#define DCDC_REG0_PWD_OVERCUR_DET_MASK (0x100U) -#define DCDC_REG0_PWD_OVERCUR_DET_SHIFT (8U) -#define DCDC_REG0_PWD_OVERCUR_DET(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_OVERCUR_DET_SHIFT)) & DCDC_REG0_PWD_OVERCUR_DET_MASK) - -#define DCDC_REG0_OVERCUR_TRIG_ADJ_MASK (0x600U) -#define DCDC_REG0_OVERCUR_TRIG_ADJ_SHIFT (9U) -#define DCDC_REG0_OVERCUR_TRIG_ADJ(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_OVERCUR_TRIG_ADJ_SHIFT)) & DCDC_REG0_OVERCUR_TRIG_ADJ_MASK) - -#define DCDC_REG0_PWD_CMP_BATT_DET_MASK (0x800U) -#define DCDC_REG0_PWD_CMP_BATT_DET_SHIFT (11U) -#define DCDC_REG0_PWD_CMP_BATT_DET(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_CMP_BATT_DET_SHIFT)) & DCDC_REG0_PWD_CMP_BATT_DET_MASK) - -#define DCDC_REG0_ADJ_POSLIMIT_BUCK_MASK (0xF000U) -#define DCDC_REG0_ADJ_POSLIMIT_BUCK_SHIFT (12U) -#define DCDC_REG0_ADJ_POSLIMIT_BUCK(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_ADJ_POSLIMIT_BUCK_SHIFT)) & DCDC_REG0_ADJ_POSLIMIT_BUCK_MASK) - -#define DCDC_REG0_EN_LP_OVERLOAD_SNS_MASK (0x10000U) -#define DCDC_REG0_EN_LP_OVERLOAD_SNS_SHIFT (16U) -#define DCDC_REG0_EN_LP_OVERLOAD_SNS(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_EN_LP_OVERLOAD_SNS_SHIFT)) & DCDC_REG0_EN_LP_OVERLOAD_SNS_MASK) - -#define DCDC_REG0_PWD_HIGH_VOLT_DET_MASK (0x20000U) -#define DCDC_REG0_PWD_HIGH_VOLT_DET_SHIFT (17U) -#define DCDC_REG0_PWD_HIGH_VOLT_DET(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_HIGH_VOLT_DET_SHIFT)) & DCDC_REG0_PWD_HIGH_VOLT_DET_MASK) - -#define DCDC_REG0_LP_OVERLOAD_THRSH_MASK (0xC0000U) -#define DCDC_REG0_LP_OVERLOAD_THRSH_SHIFT (18U) -#define DCDC_REG0_LP_OVERLOAD_THRSH(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_LP_OVERLOAD_THRSH_SHIFT)) & DCDC_REG0_LP_OVERLOAD_THRSH_MASK) - -#define DCDC_REG0_LP_OVERLOAD_FREQ_SEL_MASK (0x100000U) -#define DCDC_REG0_LP_OVERLOAD_FREQ_SEL_SHIFT (20U) -#define DCDC_REG0_LP_OVERLOAD_FREQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_LP_OVERLOAD_FREQ_SEL_SHIFT)) & DCDC_REG0_LP_OVERLOAD_FREQ_SEL_MASK) - -#define DCDC_REG0_LP_HIGH_HYS_MASK (0x200000U) -#define DCDC_REG0_LP_HIGH_HYS_SHIFT (21U) -#define DCDC_REG0_LP_HIGH_HYS(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_LP_HIGH_HYS_SHIFT)) & DCDC_REG0_LP_HIGH_HYS_MASK) - -#define DCDC_REG0_PWD_CMP_OFFSET_MASK (0x4000000U) -#define DCDC_REG0_PWD_CMP_OFFSET_SHIFT (26U) -#define DCDC_REG0_PWD_CMP_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_PWD_CMP_OFFSET_SHIFT)) & DCDC_REG0_PWD_CMP_OFFSET_MASK) - -#define DCDC_REG0_XTALOK_DISABLE_MASK (0x8000000U) -#define DCDC_REG0_XTALOK_DISABLE_SHIFT (27U) -#define DCDC_REG0_XTALOK_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_XTALOK_DISABLE_SHIFT)) & DCDC_REG0_XTALOK_DISABLE_MASK) - -#define DCDC_REG0_CURRENT_ALERT_RESET_MASK (0x10000000U) -#define DCDC_REG0_CURRENT_ALERT_RESET_SHIFT (28U) -#define DCDC_REG0_CURRENT_ALERT_RESET(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_CURRENT_ALERT_RESET_SHIFT)) & DCDC_REG0_CURRENT_ALERT_RESET_MASK) - -#define DCDC_REG0_XTAL_24M_OK_MASK (0x20000000U) -#define DCDC_REG0_XTAL_24M_OK_SHIFT (29U) -#define DCDC_REG0_XTAL_24M_OK(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_XTAL_24M_OK_SHIFT)) & DCDC_REG0_XTAL_24M_OK_MASK) - -#define DCDC_REG0_STS_DC_OK_MASK (0x80000000U) -#define DCDC_REG0_STS_DC_OK_SHIFT (31U) -#define DCDC_REG0_STS_DC_OK(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG0_STS_DC_OK_SHIFT)) & DCDC_REG0_STS_DC_OK_MASK) -/*! @} */ - -/*! @name REG1 - DCDC Register 1 */ -/*! @{ */ - -#define DCDC_REG1_REG_FBK_SEL_MASK (0x180U) -#define DCDC_REG1_REG_FBK_SEL_SHIFT (7U) -#define DCDC_REG1_REG_FBK_SEL(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_REG_FBK_SEL_SHIFT)) & DCDC_REG1_REG_FBK_SEL_MASK) - -#define DCDC_REG1_REG_RLOAD_SW_MASK (0x200U) -#define DCDC_REG1_REG_RLOAD_SW_SHIFT (9U) -#define DCDC_REG1_REG_RLOAD_SW(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_REG_RLOAD_SW_SHIFT)) & DCDC_REG1_REG_RLOAD_SW_MASK) - -#define DCDC_REG1_LP_CMP_ISRC_SEL_MASK (0x3000U) -#define DCDC_REG1_LP_CMP_ISRC_SEL_SHIFT (12U) -#define DCDC_REG1_LP_CMP_ISRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_LP_CMP_ISRC_SEL_SHIFT)) & DCDC_REG1_LP_CMP_ISRC_SEL_MASK) - -#define DCDC_REG1_LOOPCTRL_HST_THRESH_MASK (0x200000U) -#define DCDC_REG1_LOOPCTRL_HST_THRESH_SHIFT (21U) -#define DCDC_REG1_LOOPCTRL_HST_THRESH(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_LOOPCTRL_HST_THRESH_SHIFT)) & DCDC_REG1_LOOPCTRL_HST_THRESH_MASK) - -#define DCDC_REG1_LOOPCTRL_EN_HYST_MASK (0x800000U) -#define DCDC_REG1_LOOPCTRL_EN_HYST_SHIFT (23U) -#define DCDC_REG1_LOOPCTRL_EN_HYST(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_LOOPCTRL_EN_HYST_SHIFT)) & DCDC_REG1_LOOPCTRL_EN_HYST_MASK) - -#define DCDC_REG1_VBG_TRIM_MASK (0x1F000000U) -#define DCDC_REG1_VBG_TRIM_SHIFT (24U) -#define DCDC_REG1_VBG_TRIM(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG1_VBG_TRIM_SHIFT)) & DCDC_REG1_VBG_TRIM_MASK) -/*! @} */ - -/*! @name REG2 - DCDC Register 2 */ -/*! @{ */ - -#define DCDC_REG2_LOOPCTRL_DC_C_MASK (0x3U) -#define DCDC_REG2_LOOPCTRL_DC_C_SHIFT (0U) -#define DCDC_REG2_LOOPCTRL_DC_C(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_DC_C_SHIFT)) & DCDC_REG2_LOOPCTRL_DC_C_MASK) - -#define DCDC_REG2_LOOPCTRL_DC_R_MASK (0x3CU) -#define DCDC_REG2_LOOPCTRL_DC_R_SHIFT (2U) -#define DCDC_REG2_LOOPCTRL_DC_R(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_DC_R_SHIFT)) & DCDC_REG2_LOOPCTRL_DC_R_MASK) - -#define DCDC_REG2_LOOPCTRL_DC_FF_MASK (0x1C0U) -#define DCDC_REG2_LOOPCTRL_DC_FF_SHIFT (6U) -#define DCDC_REG2_LOOPCTRL_DC_FF(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_DC_FF_SHIFT)) & DCDC_REG2_LOOPCTRL_DC_FF_MASK) - -#define DCDC_REG2_LOOPCTRL_EN_RCSCALE_MASK (0xE00U) -#define DCDC_REG2_LOOPCTRL_EN_RCSCALE_SHIFT (9U) -#define DCDC_REG2_LOOPCTRL_EN_RCSCALE(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_EN_RCSCALE_SHIFT)) & DCDC_REG2_LOOPCTRL_EN_RCSCALE_MASK) - -#define DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_MASK (0x1000U) -#define DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_SHIFT (12U) -#define DCDC_REG2_LOOPCTRL_RCSCALE_THRSH(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_SHIFT)) & DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_MASK) - -#define DCDC_REG2_LOOPCTRL_HYST_SIGN_MASK (0x2000U) -#define DCDC_REG2_LOOPCTRL_HYST_SIGN_SHIFT (13U) -#define DCDC_REG2_LOOPCTRL_HYST_SIGN(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_LOOPCTRL_HYST_SIGN_SHIFT)) & DCDC_REG2_LOOPCTRL_HYST_SIGN_MASK) - -#define DCDC_REG2_DISABLE_PULSE_SKIP_MASK (0x8000000U) -#define DCDC_REG2_DISABLE_PULSE_SKIP_SHIFT (27U) -#define DCDC_REG2_DISABLE_PULSE_SKIP(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_DISABLE_PULSE_SKIP_SHIFT)) & DCDC_REG2_DISABLE_PULSE_SKIP_MASK) - -#define DCDC_REG2_DCM_SET_CTRL_MASK (0x10000000U) -#define DCDC_REG2_DCM_SET_CTRL_SHIFT (28U) -#define DCDC_REG2_DCM_SET_CTRL(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG2_DCM_SET_CTRL_SHIFT)) & DCDC_REG2_DCM_SET_CTRL_MASK) -/*! @} */ - -/*! @name REG3 - DCDC Register 3 */ -/*! @{ */ - -#define DCDC_REG3_TRG_MASK (0x1FU) -#define DCDC_REG3_TRG_SHIFT (0U) -#define DCDC_REG3_TRG(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_TRG_SHIFT)) & DCDC_REG3_TRG_MASK) - -#define DCDC_REG3_TARGET_LP_MASK (0x700U) -#define DCDC_REG3_TARGET_LP_SHIFT (8U) -#define DCDC_REG3_TARGET_LP(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_TARGET_LP_SHIFT)) & DCDC_REG3_TARGET_LP_MASK) - -#define DCDC_REG3_MINPWR_DC_HALFCLK_MASK (0x1000000U) -#define DCDC_REG3_MINPWR_DC_HALFCLK_SHIFT (24U) -#define DCDC_REG3_MINPWR_DC_HALFCLK(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_MINPWR_DC_HALFCLK_SHIFT)) & DCDC_REG3_MINPWR_DC_HALFCLK_MASK) - -#define DCDC_REG3_MISC_DELAY_TIMING_MASK (0x8000000U) -#define DCDC_REG3_MISC_DELAY_TIMING_SHIFT (27U) -#define DCDC_REG3_MISC_DELAY_TIMING(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_MISC_DELAY_TIMING_SHIFT)) & DCDC_REG3_MISC_DELAY_TIMING_MASK) - -#define DCDC_REG3_MISC_DISABLEFET_LOGIC_MASK (0x10000000U) -#define DCDC_REG3_MISC_DISABLEFET_LOGIC_SHIFT (28U) -#define DCDC_REG3_MISC_DISABLEFET_LOGIC(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_MISC_DISABLEFET_LOGIC_SHIFT)) & DCDC_REG3_MISC_DISABLEFET_LOGIC_MASK) - -#define DCDC_REG3_DISABLE_STEP_MASK (0x40000000U) -#define DCDC_REG3_DISABLE_STEP_SHIFT (30U) -#define DCDC_REG3_DISABLE_STEP(x) (((uint32_t)(((uint32_t)(x)) << DCDC_REG3_DISABLE_STEP_SHIFT)) & DCDC_REG3_DISABLE_STEP_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group DCDC_Register_Masks */ - - -/* DCDC - Peripheral instance base addresses */ -/** Peripheral DCDC base address */ -#define DCDC_BASE (0x40080000u) -/** Peripheral DCDC base pointer */ -#define DCDC ((DCDC_Type *)DCDC_BASE) -/** Array initializer of DCDC peripheral base addresses */ -#define DCDC_BASE_ADDRS { DCDC_BASE } -/** Array initializer of DCDC peripheral base pointers */ -#define DCDC_BASE_PTRS { DCDC } -/** Interrupt vectors for the DCDC peripheral type */ -#define DCDC_IRQS { DCDC_IRQn } - -/*! - * @} - */ /* end of group DCDC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- DCP Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DCP_Peripheral_Access_Layer DCP Peripheral Access Layer - * @{ - */ - -/** DCP - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< DCP control register 0, offset: 0x0 */ - __IO uint32_t CTRL_SET; /**< DCP control register 0, offset: 0x4 */ - __IO uint32_t CTRL_CLR; /**< DCP control register 0, offset: 0x8 */ - __IO uint32_t CTRL_TOG; /**< DCP control register 0, offset: 0xC */ - __IO uint32_t STAT; /**< DCP status register, offset: 0x10 */ - __IO uint32_t STAT_SET; /**< DCP status register, offset: 0x14 */ - __IO uint32_t STAT_CLR; /**< DCP status register, offset: 0x18 */ - __IO uint32_t STAT_TOG; /**< DCP status register, offset: 0x1C */ - __IO uint32_t CHANNELCTRL; /**< DCP channel control register, offset: 0x20 */ - __IO uint32_t CHANNELCTRL_SET; /**< DCP channel control register, offset: 0x24 */ - __IO uint32_t CHANNELCTRL_CLR; /**< DCP channel control register, offset: 0x28 */ - __IO uint32_t CHANNELCTRL_TOG; /**< DCP channel control register, offset: 0x2C */ - __IO uint32_t CAPABILITY0; /**< DCP capability 0 register, offset: 0x30 */ - uint8_t RESERVED_0[12]; - __I uint32_t CAPABILITY1; /**< DCP capability 1 register, offset: 0x40 */ - uint8_t RESERVED_1[12]; - __IO uint32_t CONTEXT; /**< DCP context buffer pointer, offset: 0x50 */ - uint8_t RESERVED_2[12]; - __IO uint32_t KEY; /**< DCP key index, offset: 0x60 */ - uint8_t RESERVED_3[12]; - __IO uint32_t KEYDATA; /**< DCP key data, offset: 0x70 */ - uint8_t RESERVED_4[12]; - __I uint32_t PACKET0; /**< DCP work packet 0 status register, offset: 0x80 */ - uint8_t RESERVED_5[12]; - __I uint32_t PACKET1; /**< DCP work packet 1 status register, offset: 0x90 */ - uint8_t RESERVED_6[12]; - __I uint32_t PACKET2; /**< DCP work packet 2 status register, offset: 0xA0 */ - uint8_t RESERVED_7[12]; - __I uint32_t PACKET3; /**< DCP work packet 3 status register, offset: 0xB0 */ - uint8_t RESERVED_8[12]; - __I uint32_t PACKET4; /**< DCP work packet 4 status register, offset: 0xC0 */ - uint8_t RESERVED_9[12]; - __I uint32_t PACKET5; /**< DCP work packet 5 status register, offset: 0xD0 */ - uint8_t RESERVED_10[12]; - __I uint32_t PACKET6; /**< DCP work packet 6 status register, offset: 0xE0 */ - uint8_t RESERVED_11[28]; - __IO uint32_t CH0CMDPTR; /**< DCP channel 0 command pointer address register, offset: 0x100 */ - uint8_t RESERVED_12[12]; - __IO uint32_t CH0SEMA; /**< DCP channel 0 semaphore register, offset: 0x110 */ - uint8_t RESERVED_13[12]; - __IO uint32_t CH0STAT; /**< DCP channel 0 status register, offset: 0x120 */ - __IO uint32_t CH0STAT_SET; /**< DCP channel 0 status register, offset: 0x124 */ - __IO uint32_t CH0STAT_CLR; /**< DCP channel 0 status register, offset: 0x128 */ - __IO uint32_t CH0STAT_TOG; /**< DCP channel 0 status register, offset: 0x12C */ - __IO uint32_t CH0OPTS; /**< DCP channel 0 options register, offset: 0x130 */ - __IO uint32_t CH0OPTS_SET; /**< DCP channel 0 options register, offset: 0x134 */ - __IO uint32_t CH0OPTS_CLR; /**< DCP channel 0 options register, offset: 0x138 */ - __IO uint32_t CH0OPTS_TOG; /**< DCP channel 0 options register, offset: 0x13C */ - __IO uint32_t CH1CMDPTR; /**< DCP channel 1 command pointer address register, offset: 0x140 */ - uint8_t RESERVED_14[12]; - __IO uint32_t CH1SEMA; /**< DCP channel 1 semaphore register, offset: 0x150 */ - uint8_t RESERVED_15[12]; - __IO uint32_t CH1STAT; /**< DCP channel 1 status register, offset: 0x160 */ - __IO uint32_t CH1STAT_SET; /**< DCP channel 1 status register, offset: 0x164 */ - __IO uint32_t CH1STAT_CLR; /**< DCP channel 1 status register, offset: 0x168 */ - __IO uint32_t CH1STAT_TOG; /**< DCP channel 1 status register, offset: 0x16C */ - __IO uint32_t CH1OPTS; /**< DCP channel 1 options register, offset: 0x170 */ - __IO uint32_t CH1OPTS_SET; /**< DCP channel 1 options register, offset: 0x174 */ - __IO uint32_t CH1OPTS_CLR; /**< DCP channel 1 options register, offset: 0x178 */ - __IO uint32_t CH1OPTS_TOG; /**< DCP channel 1 options register, offset: 0x17C */ - __IO uint32_t CH2CMDPTR; /**< DCP channel 2 command pointer address register, offset: 0x180 */ - uint8_t RESERVED_16[12]; - __IO uint32_t CH2SEMA; /**< DCP channel 2 semaphore register, offset: 0x190 */ - uint8_t RESERVED_17[12]; - __IO uint32_t CH2STAT; /**< DCP channel 2 status register, offset: 0x1A0 */ - __IO uint32_t CH2STAT_SET; /**< DCP channel 2 status register, offset: 0x1A4 */ - __IO uint32_t CH2STAT_CLR; /**< DCP channel 2 status register, offset: 0x1A8 */ - __IO uint32_t CH2STAT_TOG; /**< DCP channel 2 status register, offset: 0x1AC */ - __IO uint32_t CH2OPTS; /**< DCP channel 2 options register, offset: 0x1B0 */ - __IO uint32_t CH2OPTS_SET; /**< DCP channel 2 options register, offset: 0x1B4 */ - __IO uint32_t CH2OPTS_CLR; /**< DCP channel 2 options register, offset: 0x1B8 */ - __IO uint32_t CH2OPTS_TOG; /**< DCP channel 2 options register, offset: 0x1BC */ - __IO uint32_t CH3CMDPTR; /**< DCP channel 3 command pointer address register, offset: 0x1C0 */ - uint8_t RESERVED_18[12]; - __IO uint32_t CH3SEMA; /**< DCP channel 3 semaphore register, offset: 0x1D0 */ - uint8_t RESERVED_19[12]; - __IO uint32_t CH3STAT; /**< DCP channel 3 status register, offset: 0x1E0 */ - __IO uint32_t CH3STAT_SET; /**< DCP channel 3 status register, offset: 0x1E4 */ - __IO uint32_t CH3STAT_CLR; /**< DCP channel 3 status register, offset: 0x1E8 */ - __IO uint32_t CH3STAT_TOG; /**< DCP channel 3 status register, offset: 0x1EC */ - __IO uint32_t CH3OPTS; /**< DCP channel 3 options register, offset: 0x1F0 */ - __IO uint32_t CH3OPTS_SET; /**< DCP channel 3 options register, offset: 0x1F4 */ - __IO uint32_t CH3OPTS_CLR; /**< DCP channel 3 options register, offset: 0x1F8 */ - __IO uint32_t CH3OPTS_TOG; /**< DCP channel 3 options register, offset: 0x1FC */ - uint8_t RESERVED_20[512]; - __IO uint32_t DBGSELECT; /**< DCP debug select register, offset: 0x400 */ - uint8_t RESERVED_21[12]; - __I uint32_t DBGDATA; /**< DCP debug data register, offset: 0x410 */ - uint8_t RESERVED_22[12]; - __IO uint32_t PAGETABLE; /**< DCP page table register, offset: 0x420 */ - uint8_t RESERVED_23[12]; - __I uint32_t VERSION; /**< DCP version register, offset: 0x430 */ -} DCP_Type; - -/* ---------------------------------------------------------------------------- - -- DCP Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DCP_Register_Masks DCP Register Masks - * @{ - */ - -/*! @name CTRL - DCP control register 0 */ -/*! @{ */ - -#define DCP_CTRL_CHANNEL_INTERRUPT_ENABLE_MASK (0xFFU) -#define DCP_CTRL_CHANNEL_INTERRUPT_ENABLE_SHIFT (0U) -/*! CHANNEL_INTERRUPT_ENABLE - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CTRL_CHANNEL_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CHANNEL_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_CHANNEL_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_RSVD_CSC_INTERRUPT_ENABLE_MASK (0x100U) -#define DCP_CTRL_RSVD_CSC_INTERRUPT_ENABLE_SHIFT (8U) -#define DCP_CTRL_RSVD_CSC_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_RSVD_CSC_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_RSVD_CSC_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_ENABLE_CONTEXT_SWITCHING_MASK (0x200000U) -#define DCP_CTRL_ENABLE_CONTEXT_SWITCHING_SHIFT (21U) -#define DCP_CTRL_ENABLE_CONTEXT_SWITCHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_ENABLE_CONTEXT_SWITCHING_SHIFT)) & DCP_CTRL_ENABLE_CONTEXT_SWITCHING_MASK) - -#define DCP_CTRL_ENABLE_CONTEXT_CACHING_MASK (0x400000U) -#define DCP_CTRL_ENABLE_CONTEXT_CACHING_SHIFT (22U) -#define DCP_CTRL_ENABLE_CONTEXT_CACHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_ENABLE_CONTEXT_CACHING_SHIFT)) & DCP_CTRL_ENABLE_CONTEXT_CACHING_MASK) - -#define DCP_CTRL_GATHER_RESIDUAL_WRITES_MASK (0x800000U) -#define DCP_CTRL_GATHER_RESIDUAL_WRITES_SHIFT (23U) -#define DCP_CTRL_GATHER_RESIDUAL_WRITES(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_GATHER_RESIDUAL_WRITES_SHIFT)) & DCP_CTRL_GATHER_RESIDUAL_WRITES_MASK) - -#define DCP_CTRL_PRESENT_SHA_MASK (0x10000000U) -#define DCP_CTRL_PRESENT_SHA_SHIFT (28U) -/*! PRESENT_SHA - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_PRESENT_SHA(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_PRESENT_SHA_SHIFT)) & DCP_CTRL_PRESENT_SHA_MASK) - -#define DCP_CTRL_PRESENT_CRYPTO_MASK (0x20000000U) -#define DCP_CTRL_PRESENT_CRYPTO_SHIFT (29U) -/*! PRESENT_CRYPTO - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_PRESENT_CRYPTO(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_PRESENT_CRYPTO_SHIFT)) & DCP_CTRL_PRESENT_CRYPTO_MASK) - -#define DCP_CTRL_CLKGATE_MASK (0x40000000U) -#define DCP_CTRL_CLKGATE_SHIFT (30U) -#define DCP_CTRL_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLKGATE_SHIFT)) & DCP_CTRL_CLKGATE_MASK) - -#define DCP_CTRL_SFTRST_MASK (0x80000000U) -#define DCP_CTRL_SFTRST_SHIFT (31U) -#define DCP_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SFTRST_SHIFT)) & DCP_CTRL_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_SET - DCP control register 0 */ -/*! @{ */ - -#define DCP_CTRL_SET_CHANNEL_INTERRUPT_ENABLE_MASK (0xFFU) -#define DCP_CTRL_SET_CHANNEL_INTERRUPT_ENABLE_SHIFT (0U) -/*! CHANNEL_INTERRUPT_ENABLE - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CTRL_SET_CHANNEL_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_CHANNEL_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_SET_CHANNEL_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_SET_RSVD_CSC_INTERRUPT_ENABLE_MASK (0x100U) -#define DCP_CTRL_SET_RSVD_CSC_INTERRUPT_ENABLE_SHIFT (8U) -#define DCP_CTRL_SET_RSVD_CSC_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_RSVD_CSC_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_SET_RSVD_CSC_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_SET_ENABLE_CONTEXT_SWITCHING_MASK (0x200000U) -#define DCP_CTRL_SET_ENABLE_CONTEXT_SWITCHING_SHIFT (21U) -#define DCP_CTRL_SET_ENABLE_CONTEXT_SWITCHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_ENABLE_CONTEXT_SWITCHING_SHIFT)) & DCP_CTRL_SET_ENABLE_CONTEXT_SWITCHING_MASK) - -#define DCP_CTRL_SET_ENABLE_CONTEXT_CACHING_MASK (0x400000U) -#define DCP_CTRL_SET_ENABLE_CONTEXT_CACHING_SHIFT (22U) -#define DCP_CTRL_SET_ENABLE_CONTEXT_CACHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_ENABLE_CONTEXT_CACHING_SHIFT)) & DCP_CTRL_SET_ENABLE_CONTEXT_CACHING_MASK) - -#define DCP_CTRL_SET_GATHER_RESIDUAL_WRITES_MASK (0x800000U) -#define DCP_CTRL_SET_GATHER_RESIDUAL_WRITES_SHIFT (23U) -#define DCP_CTRL_SET_GATHER_RESIDUAL_WRITES(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_GATHER_RESIDUAL_WRITES_SHIFT)) & DCP_CTRL_SET_GATHER_RESIDUAL_WRITES_MASK) - -#define DCP_CTRL_SET_PRESENT_SHA_MASK (0x10000000U) -#define DCP_CTRL_SET_PRESENT_SHA_SHIFT (28U) -/*! PRESENT_SHA - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_SET_PRESENT_SHA(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_PRESENT_SHA_SHIFT)) & DCP_CTRL_SET_PRESENT_SHA_MASK) - -#define DCP_CTRL_SET_PRESENT_CRYPTO_MASK (0x20000000U) -#define DCP_CTRL_SET_PRESENT_CRYPTO_SHIFT (29U) -/*! PRESENT_CRYPTO - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_SET_PRESENT_CRYPTO(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_PRESENT_CRYPTO_SHIFT)) & DCP_CTRL_SET_PRESENT_CRYPTO_MASK) - -#define DCP_CTRL_SET_CLKGATE_MASK (0x40000000U) -#define DCP_CTRL_SET_CLKGATE_SHIFT (30U) -#define DCP_CTRL_SET_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_CLKGATE_SHIFT)) & DCP_CTRL_SET_CLKGATE_MASK) - -#define DCP_CTRL_SET_SFTRST_MASK (0x80000000U) -#define DCP_CTRL_SET_SFTRST_SHIFT (31U) -#define DCP_CTRL_SET_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_SET_SFTRST_SHIFT)) & DCP_CTRL_SET_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_CLR - DCP control register 0 */ -/*! @{ */ - -#define DCP_CTRL_CLR_CHANNEL_INTERRUPT_ENABLE_MASK (0xFFU) -#define DCP_CTRL_CLR_CHANNEL_INTERRUPT_ENABLE_SHIFT (0U) -/*! CHANNEL_INTERRUPT_ENABLE - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CTRL_CLR_CHANNEL_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_CHANNEL_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_CLR_CHANNEL_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_CLR_RSVD_CSC_INTERRUPT_ENABLE_MASK (0x100U) -#define DCP_CTRL_CLR_RSVD_CSC_INTERRUPT_ENABLE_SHIFT (8U) -#define DCP_CTRL_CLR_RSVD_CSC_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_RSVD_CSC_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_CLR_RSVD_CSC_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_CLR_ENABLE_CONTEXT_SWITCHING_MASK (0x200000U) -#define DCP_CTRL_CLR_ENABLE_CONTEXT_SWITCHING_SHIFT (21U) -#define DCP_CTRL_CLR_ENABLE_CONTEXT_SWITCHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_ENABLE_CONTEXT_SWITCHING_SHIFT)) & DCP_CTRL_CLR_ENABLE_CONTEXT_SWITCHING_MASK) - -#define DCP_CTRL_CLR_ENABLE_CONTEXT_CACHING_MASK (0x400000U) -#define DCP_CTRL_CLR_ENABLE_CONTEXT_CACHING_SHIFT (22U) -#define DCP_CTRL_CLR_ENABLE_CONTEXT_CACHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_ENABLE_CONTEXT_CACHING_SHIFT)) & DCP_CTRL_CLR_ENABLE_CONTEXT_CACHING_MASK) - -#define DCP_CTRL_CLR_GATHER_RESIDUAL_WRITES_MASK (0x800000U) -#define DCP_CTRL_CLR_GATHER_RESIDUAL_WRITES_SHIFT (23U) -#define DCP_CTRL_CLR_GATHER_RESIDUAL_WRITES(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_GATHER_RESIDUAL_WRITES_SHIFT)) & DCP_CTRL_CLR_GATHER_RESIDUAL_WRITES_MASK) - -#define DCP_CTRL_CLR_PRESENT_SHA_MASK (0x10000000U) -#define DCP_CTRL_CLR_PRESENT_SHA_SHIFT (28U) -/*! PRESENT_SHA - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_CLR_PRESENT_SHA(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_PRESENT_SHA_SHIFT)) & DCP_CTRL_CLR_PRESENT_SHA_MASK) - -#define DCP_CTRL_CLR_PRESENT_CRYPTO_MASK (0x20000000U) -#define DCP_CTRL_CLR_PRESENT_CRYPTO_SHIFT (29U) -/*! PRESENT_CRYPTO - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_CLR_PRESENT_CRYPTO(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_PRESENT_CRYPTO_SHIFT)) & DCP_CTRL_CLR_PRESENT_CRYPTO_MASK) - -#define DCP_CTRL_CLR_CLKGATE_MASK (0x40000000U) -#define DCP_CTRL_CLR_CLKGATE_SHIFT (30U) -#define DCP_CTRL_CLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_CLKGATE_SHIFT)) & DCP_CTRL_CLR_CLKGATE_MASK) - -#define DCP_CTRL_CLR_SFTRST_MASK (0x80000000U) -#define DCP_CTRL_CLR_SFTRST_SHIFT (31U) -#define DCP_CTRL_CLR_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_CLR_SFTRST_SHIFT)) & DCP_CTRL_CLR_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_TOG - DCP control register 0 */ -/*! @{ */ - -#define DCP_CTRL_TOG_CHANNEL_INTERRUPT_ENABLE_MASK (0xFFU) -#define DCP_CTRL_TOG_CHANNEL_INTERRUPT_ENABLE_SHIFT (0U) -/*! CHANNEL_INTERRUPT_ENABLE - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CTRL_TOG_CHANNEL_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_CHANNEL_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_TOG_CHANNEL_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_TOG_RSVD_CSC_INTERRUPT_ENABLE_MASK (0x100U) -#define DCP_CTRL_TOG_RSVD_CSC_INTERRUPT_ENABLE_SHIFT (8U) -#define DCP_CTRL_TOG_RSVD_CSC_INTERRUPT_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_RSVD_CSC_INTERRUPT_ENABLE_SHIFT)) & DCP_CTRL_TOG_RSVD_CSC_INTERRUPT_ENABLE_MASK) - -#define DCP_CTRL_TOG_ENABLE_CONTEXT_SWITCHING_MASK (0x200000U) -#define DCP_CTRL_TOG_ENABLE_CONTEXT_SWITCHING_SHIFT (21U) -#define DCP_CTRL_TOG_ENABLE_CONTEXT_SWITCHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_ENABLE_CONTEXT_SWITCHING_SHIFT)) & DCP_CTRL_TOG_ENABLE_CONTEXT_SWITCHING_MASK) - -#define DCP_CTRL_TOG_ENABLE_CONTEXT_CACHING_MASK (0x400000U) -#define DCP_CTRL_TOG_ENABLE_CONTEXT_CACHING_SHIFT (22U) -#define DCP_CTRL_TOG_ENABLE_CONTEXT_CACHING(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_ENABLE_CONTEXT_CACHING_SHIFT)) & DCP_CTRL_TOG_ENABLE_CONTEXT_CACHING_MASK) - -#define DCP_CTRL_TOG_GATHER_RESIDUAL_WRITES_MASK (0x800000U) -#define DCP_CTRL_TOG_GATHER_RESIDUAL_WRITES_SHIFT (23U) -#define DCP_CTRL_TOG_GATHER_RESIDUAL_WRITES(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_GATHER_RESIDUAL_WRITES_SHIFT)) & DCP_CTRL_TOG_GATHER_RESIDUAL_WRITES_MASK) - -#define DCP_CTRL_TOG_PRESENT_SHA_MASK (0x10000000U) -#define DCP_CTRL_TOG_PRESENT_SHA_SHIFT (28U) -/*! PRESENT_SHA - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_TOG_PRESENT_SHA(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_PRESENT_SHA_SHIFT)) & DCP_CTRL_TOG_PRESENT_SHA_MASK) - -#define DCP_CTRL_TOG_PRESENT_CRYPTO_MASK (0x20000000U) -#define DCP_CTRL_TOG_PRESENT_CRYPTO_SHIFT (29U) -/*! PRESENT_CRYPTO - * 0b1..Present - * 0b0..Absent - */ -#define DCP_CTRL_TOG_PRESENT_CRYPTO(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_PRESENT_CRYPTO_SHIFT)) & DCP_CTRL_TOG_PRESENT_CRYPTO_MASK) - -#define DCP_CTRL_TOG_CLKGATE_MASK (0x40000000U) -#define DCP_CTRL_TOG_CLKGATE_SHIFT (30U) -#define DCP_CTRL_TOG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_CLKGATE_SHIFT)) & DCP_CTRL_TOG_CLKGATE_MASK) - -#define DCP_CTRL_TOG_SFTRST_MASK (0x80000000U) -#define DCP_CTRL_TOG_SFTRST_SHIFT (31U) -#define DCP_CTRL_TOG_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CTRL_TOG_SFTRST_SHIFT)) & DCP_CTRL_TOG_SFTRST_MASK) -/*! @} */ - -/*! @name STAT - DCP status register */ -/*! @{ */ - -#define DCP_STAT_IRQ_MASK (0xFU) -#define DCP_STAT_IRQ_SHIFT (0U) -#define DCP_STAT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_IRQ_SHIFT)) & DCP_STAT_IRQ_MASK) - -#define DCP_STAT_RSVD_IRQ_MASK (0x100U) -#define DCP_STAT_RSVD_IRQ_SHIFT (8U) -#define DCP_STAT_RSVD_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_RSVD_IRQ_SHIFT)) & DCP_STAT_RSVD_IRQ_MASK) - -#define DCP_STAT_READY_CHANNELS_MASK (0xFF0000U) -#define DCP_STAT_READY_CHANNELS_SHIFT (16U) -/*! READY_CHANNELS - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_STAT_READY_CHANNELS(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_READY_CHANNELS_SHIFT)) & DCP_STAT_READY_CHANNELS_MASK) - -#define DCP_STAT_CUR_CHANNEL_MASK (0xF000000U) -#define DCP_STAT_CUR_CHANNEL_SHIFT (24U) -/*! CUR_CHANNEL - * 0b0000..None - * 0b0001..CH0 - * 0b0010..CH1 - * 0b0011..CH2 - * 0b0100..CH3 - */ -#define DCP_STAT_CUR_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CUR_CHANNEL_SHIFT)) & DCP_STAT_CUR_CHANNEL_MASK) - -#define DCP_STAT_OTP_KEY_READY_MASK (0x10000000U) -#define DCP_STAT_OTP_KEY_READY_SHIFT (28U) -#define DCP_STAT_OTP_KEY_READY(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_OTP_KEY_READY_SHIFT)) & DCP_STAT_OTP_KEY_READY_MASK) -/*! @} */ - -/*! @name STAT_SET - DCP status register */ -/*! @{ */ - -#define DCP_STAT_SET_IRQ_MASK (0xFU) -#define DCP_STAT_SET_IRQ_SHIFT (0U) -#define DCP_STAT_SET_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_SET_IRQ_SHIFT)) & DCP_STAT_SET_IRQ_MASK) - -#define DCP_STAT_SET_RSVD_IRQ_MASK (0x100U) -#define DCP_STAT_SET_RSVD_IRQ_SHIFT (8U) -#define DCP_STAT_SET_RSVD_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_SET_RSVD_IRQ_SHIFT)) & DCP_STAT_SET_RSVD_IRQ_MASK) - -#define DCP_STAT_SET_READY_CHANNELS_MASK (0xFF0000U) -#define DCP_STAT_SET_READY_CHANNELS_SHIFT (16U) -/*! READY_CHANNELS - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_STAT_SET_READY_CHANNELS(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_SET_READY_CHANNELS_SHIFT)) & DCP_STAT_SET_READY_CHANNELS_MASK) - -#define DCP_STAT_SET_CUR_CHANNEL_MASK (0xF000000U) -#define DCP_STAT_SET_CUR_CHANNEL_SHIFT (24U) -/*! CUR_CHANNEL - * 0b0000..None - * 0b0001..CH0 - * 0b0010..CH1 - * 0b0011..CH2 - * 0b0100..CH3 - */ -#define DCP_STAT_SET_CUR_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_SET_CUR_CHANNEL_SHIFT)) & DCP_STAT_SET_CUR_CHANNEL_MASK) - -#define DCP_STAT_SET_OTP_KEY_READY_MASK (0x10000000U) -#define DCP_STAT_SET_OTP_KEY_READY_SHIFT (28U) -#define DCP_STAT_SET_OTP_KEY_READY(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_SET_OTP_KEY_READY_SHIFT)) & DCP_STAT_SET_OTP_KEY_READY_MASK) -/*! @} */ - -/*! @name STAT_CLR - DCP status register */ -/*! @{ */ - -#define DCP_STAT_CLR_IRQ_MASK (0xFU) -#define DCP_STAT_CLR_IRQ_SHIFT (0U) -#define DCP_STAT_CLR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CLR_IRQ_SHIFT)) & DCP_STAT_CLR_IRQ_MASK) - -#define DCP_STAT_CLR_RSVD_IRQ_MASK (0x100U) -#define DCP_STAT_CLR_RSVD_IRQ_SHIFT (8U) -#define DCP_STAT_CLR_RSVD_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CLR_RSVD_IRQ_SHIFT)) & DCP_STAT_CLR_RSVD_IRQ_MASK) - -#define DCP_STAT_CLR_READY_CHANNELS_MASK (0xFF0000U) -#define DCP_STAT_CLR_READY_CHANNELS_SHIFT (16U) -/*! READY_CHANNELS - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_STAT_CLR_READY_CHANNELS(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CLR_READY_CHANNELS_SHIFT)) & DCP_STAT_CLR_READY_CHANNELS_MASK) - -#define DCP_STAT_CLR_CUR_CHANNEL_MASK (0xF000000U) -#define DCP_STAT_CLR_CUR_CHANNEL_SHIFT (24U) -/*! CUR_CHANNEL - * 0b0000..None - * 0b0001..CH0 - * 0b0010..CH1 - * 0b0011..CH2 - * 0b0100..CH3 - */ -#define DCP_STAT_CLR_CUR_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CLR_CUR_CHANNEL_SHIFT)) & DCP_STAT_CLR_CUR_CHANNEL_MASK) - -#define DCP_STAT_CLR_OTP_KEY_READY_MASK (0x10000000U) -#define DCP_STAT_CLR_OTP_KEY_READY_SHIFT (28U) -#define DCP_STAT_CLR_OTP_KEY_READY(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_CLR_OTP_KEY_READY_SHIFT)) & DCP_STAT_CLR_OTP_KEY_READY_MASK) -/*! @} */ - -/*! @name STAT_TOG - DCP status register */ -/*! @{ */ - -#define DCP_STAT_TOG_IRQ_MASK (0xFU) -#define DCP_STAT_TOG_IRQ_SHIFT (0U) -#define DCP_STAT_TOG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_TOG_IRQ_SHIFT)) & DCP_STAT_TOG_IRQ_MASK) - -#define DCP_STAT_TOG_RSVD_IRQ_MASK (0x100U) -#define DCP_STAT_TOG_RSVD_IRQ_SHIFT (8U) -#define DCP_STAT_TOG_RSVD_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_TOG_RSVD_IRQ_SHIFT)) & DCP_STAT_TOG_RSVD_IRQ_MASK) - -#define DCP_STAT_TOG_READY_CHANNELS_MASK (0xFF0000U) -#define DCP_STAT_TOG_READY_CHANNELS_SHIFT (16U) -/*! READY_CHANNELS - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_STAT_TOG_READY_CHANNELS(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_TOG_READY_CHANNELS_SHIFT)) & DCP_STAT_TOG_READY_CHANNELS_MASK) - -#define DCP_STAT_TOG_CUR_CHANNEL_MASK (0xF000000U) -#define DCP_STAT_TOG_CUR_CHANNEL_SHIFT (24U) -/*! CUR_CHANNEL - * 0b0000..None - * 0b0001..CH0 - * 0b0010..CH1 - * 0b0011..CH2 - * 0b0100..CH3 - */ -#define DCP_STAT_TOG_CUR_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_TOG_CUR_CHANNEL_SHIFT)) & DCP_STAT_TOG_CUR_CHANNEL_MASK) - -#define DCP_STAT_TOG_OTP_KEY_READY_MASK (0x10000000U) -#define DCP_STAT_TOG_OTP_KEY_READY_SHIFT (28U) -#define DCP_STAT_TOG_OTP_KEY_READY(x) (((uint32_t)(((uint32_t)(x)) << DCP_STAT_TOG_OTP_KEY_READY_SHIFT)) & DCP_STAT_TOG_OTP_KEY_READY_MASK) -/*! @} */ - -/*! @name CHANNELCTRL - DCP channel control register */ -/*! @{ */ - -#define DCP_CHANNELCTRL_ENABLE_CHANNEL_MASK (0xFFU) -#define DCP_CHANNELCTRL_ENABLE_CHANNEL_SHIFT (0U) -/*! ENABLE_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_ENABLE_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_ENABLE_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_ENABLE_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_HIGH_PRIORITY_CHANNEL_MASK (0xFF00U) -#define DCP_CHANNELCTRL_HIGH_PRIORITY_CHANNEL_SHIFT (8U) -/*! HIGH_PRIORITY_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_HIGH_PRIORITY_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_HIGH_PRIORITY_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_HIGH_PRIORITY_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_CH0_IRQ_MERGED_MASK (0x10000U) -#define DCP_CHANNELCTRL_CH0_IRQ_MERGED_SHIFT (16U) -#define DCP_CHANNELCTRL_CH0_IRQ_MERGED(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_CH0_IRQ_MERGED_SHIFT)) & DCP_CHANNELCTRL_CH0_IRQ_MERGED_MASK) - -#define DCP_CHANNELCTRL_RSVD_MASK (0xFFFE0000U) -#define DCP_CHANNELCTRL_RSVD_SHIFT (17U) -#define DCP_CHANNELCTRL_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_RSVD_SHIFT)) & DCP_CHANNELCTRL_RSVD_MASK) -/*! @} */ - -/*! @name CHANNELCTRL_SET - DCP channel control register */ -/*! @{ */ - -#define DCP_CHANNELCTRL_SET_ENABLE_CHANNEL_MASK (0xFFU) -#define DCP_CHANNELCTRL_SET_ENABLE_CHANNEL_SHIFT (0U) -/*! ENABLE_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_SET_ENABLE_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_SET_ENABLE_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_SET_ENABLE_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_SET_HIGH_PRIORITY_CHANNEL_MASK (0xFF00U) -#define DCP_CHANNELCTRL_SET_HIGH_PRIORITY_CHANNEL_SHIFT (8U) -/*! HIGH_PRIORITY_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_SET_HIGH_PRIORITY_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_SET_HIGH_PRIORITY_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_SET_HIGH_PRIORITY_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_SET_CH0_IRQ_MERGED_MASK (0x10000U) -#define DCP_CHANNELCTRL_SET_CH0_IRQ_MERGED_SHIFT (16U) -#define DCP_CHANNELCTRL_SET_CH0_IRQ_MERGED(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_SET_CH0_IRQ_MERGED_SHIFT)) & DCP_CHANNELCTRL_SET_CH0_IRQ_MERGED_MASK) - -#define DCP_CHANNELCTRL_SET_RSVD_MASK (0xFFFE0000U) -#define DCP_CHANNELCTRL_SET_RSVD_SHIFT (17U) -#define DCP_CHANNELCTRL_SET_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_SET_RSVD_SHIFT)) & DCP_CHANNELCTRL_SET_RSVD_MASK) -/*! @} */ - -/*! @name CHANNELCTRL_CLR - DCP channel control register */ -/*! @{ */ - -#define DCP_CHANNELCTRL_CLR_ENABLE_CHANNEL_MASK (0xFFU) -#define DCP_CHANNELCTRL_CLR_ENABLE_CHANNEL_SHIFT (0U) -/*! ENABLE_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_CLR_ENABLE_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_CLR_ENABLE_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_CLR_ENABLE_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_CLR_HIGH_PRIORITY_CHANNEL_MASK (0xFF00U) -#define DCP_CHANNELCTRL_CLR_HIGH_PRIORITY_CHANNEL_SHIFT (8U) -/*! HIGH_PRIORITY_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_CLR_HIGH_PRIORITY_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_CLR_HIGH_PRIORITY_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_CLR_HIGH_PRIORITY_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_CLR_CH0_IRQ_MERGED_MASK (0x10000U) -#define DCP_CHANNELCTRL_CLR_CH0_IRQ_MERGED_SHIFT (16U) -#define DCP_CHANNELCTRL_CLR_CH0_IRQ_MERGED(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_CLR_CH0_IRQ_MERGED_SHIFT)) & DCP_CHANNELCTRL_CLR_CH0_IRQ_MERGED_MASK) - -#define DCP_CHANNELCTRL_CLR_RSVD_MASK (0xFFFE0000U) -#define DCP_CHANNELCTRL_CLR_RSVD_SHIFT (17U) -#define DCP_CHANNELCTRL_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_CLR_RSVD_SHIFT)) & DCP_CHANNELCTRL_CLR_RSVD_MASK) -/*! @} */ - -/*! @name CHANNELCTRL_TOG - DCP channel control register */ -/*! @{ */ - -#define DCP_CHANNELCTRL_TOG_ENABLE_CHANNEL_MASK (0xFFU) -#define DCP_CHANNELCTRL_TOG_ENABLE_CHANNEL_SHIFT (0U) -/*! ENABLE_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_TOG_ENABLE_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_TOG_ENABLE_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_TOG_ENABLE_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_TOG_HIGH_PRIORITY_CHANNEL_MASK (0xFF00U) -#define DCP_CHANNELCTRL_TOG_HIGH_PRIORITY_CHANNEL_SHIFT (8U) -/*! HIGH_PRIORITY_CHANNEL - * 0b00000001..CH0 - * 0b00000010..CH1 - * 0b00000100..CH2 - * 0b00001000..CH3 - */ -#define DCP_CHANNELCTRL_TOG_HIGH_PRIORITY_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_TOG_HIGH_PRIORITY_CHANNEL_SHIFT)) & DCP_CHANNELCTRL_TOG_HIGH_PRIORITY_CHANNEL_MASK) - -#define DCP_CHANNELCTRL_TOG_CH0_IRQ_MERGED_MASK (0x10000U) -#define DCP_CHANNELCTRL_TOG_CH0_IRQ_MERGED_SHIFT (16U) -#define DCP_CHANNELCTRL_TOG_CH0_IRQ_MERGED(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_TOG_CH0_IRQ_MERGED_SHIFT)) & DCP_CHANNELCTRL_TOG_CH0_IRQ_MERGED_MASK) - -#define DCP_CHANNELCTRL_TOG_RSVD_MASK (0xFFFE0000U) -#define DCP_CHANNELCTRL_TOG_RSVD_SHIFT (17U) -#define DCP_CHANNELCTRL_TOG_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CHANNELCTRL_TOG_RSVD_SHIFT)) & DCP_CHANNELCTRL_TOG_RSVD_MASK) -/*! @} */ - -/*! @name CAPABILITY0 - DCP capability 0 register */ -/*! @{ */ - -#define DCP_CAPABILITY0_NUM_KEYS_MASK (0xFFU) -#define DCP_CAPABILITY0_NUM_KEYS_SHIFT (0U) -#define DCP_CAPABILITY0_NUM_KEYS(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY0_NUM_KEYS_SHIFT)) & DCP_CAPABILITY0_NUM_KEYS_MASK) - -#define DCP_CAPABILITY0_NUM_CHANNELS_MASK (0xF00U) -#define DCP_CAPABILITY0_NUM_CHANNELS_SHIFT (8U) -#define DCP_CAPABILITY0_NUM_CHANNELS(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY0_NUM_CHANNELS_SHIFT)) & DCP_CAPABILITY0_NUM_CHANNELS_MASK) - -#define DCP_CAPABILITY0_RSVD_MASK (0x1FFFF000U) -#define DCP_CAPABILITY0_RSVD_SHIFT (12U) -#define DCP_CAPABILITY0_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY0_RSVD_SHIFT)) & DCP_CAPABILITY0_RSVD_MASK) - -#define DCP_CAPABILITY0_DISABLE_UNIQUE_KEY_MASK (0x20000000U) -#define DCP_CAPABILITY0_DISABLE_UNIQUE_KEY_SHIFT (29U) -#define DCP_CAPABILITY0_DISABLE_UNIQUE_KEY(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY0_DISABLE_UNIQUE_KEY_SHIFT)) & DCP_CAPABILITY0_DISABLE_UNIQUE_KEY_MASK) - -#define DCP_CAPABILITY0_DISABLE_DECRYPT_MASK (0x80000000U) -#define DCP_CAPABILITY0_DISABLE_DECRYPT_SHIFT (31U) -#define DCP_CAPABILITY0_DISABLE_DECRYPT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY0_DISABLE_DECRYPT_SHIFT)) & DCP_CAPABILITY0_DISABLE_DECRYPT_MASK) -/*! @} */ - -/*! @name CAPABILITY1 - DCP capability 1 register */ -/*! @{ */ - -#define DCP_CAPABILITY1_CIPHER_ALGORITHMS_MASK (0xFFFFU) -#define DCP_CAPABILITY1_CIPHER_ALGORITHMS_SHIFT (0U) -/*! CIPHER_ALGORITHMS - * 0b0000000000000001..AES128 - */ -#define DCP_CAPABILITY1_CIPHER_ALGORITHMS(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY1_CIPHER_ALGORITHMS_SHIFT)) & DCP_CAPABILITY1_CIPHER_ALGORITHMS_MASK) - -#define DCP_CAPABILITY1_HASH_ALGORITHMS_MASK (0xFFFF0000U) -#define DCP_CAPABILITY1_HASH_ALGORITHMS_SHIFT (16U) -/*! HASH_ALGORITHMS - * 0b0000000000000001..SHA1 - * 0b0000000000000010..CRC32 - * 0b0000000000000100..SHA256 - */ -#define DCP_CAPABILITY1_HASH_ALGORITHMS(x) (((uint32_t)(((uint32_t)(x)) << DCP_CAPABILITY1_HASH_ALGORITHMS_SHIFT)) & DCP_CAPABILITY1_HASH_ALGORITHMS_MASK) -/*! @} */ - -/*! @name CONTEXT - DCP context buffer pointer */ -/*! @{ */ - -#define DCP_CONTEXT_ADDR_MASK (0xFFFFFFFFU) -#define DCP_CONTEXT_ADDR_SHIFT (0U) -#define DCP_CONTEXT_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_CONTEXT_ADDR_SHIFT)) & DCP_CONTEXT_ADDR_MASK) -/*! @} */ - -/*! @name KEY - DCP key index */ -/*! @{ */ - -#define DCP_KEY_SUBWORD_MASK (0x3U) -#define DCP_KEY_SUBWORD_SHIFT (0U) -#define DCP_KEY_SUBWORD(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEY_SUBWORD_SHIFT)) & DCP_KEY_SUBWORD_MASK) - -#define DCP_KEY_RSVD_SUBWORD_MASK (0xCU) -#define DCP_KEY_RSVD_SUBWORD_SHIFT (2U) -#define DCP_KEY_RSVD_SUBWORD(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEY_RSVD_SUBWORD_SHIFT)) & DCP_KEY_RSVD_SUBWORD_MASK) - -#define DCP_KEY_INDEX_MASK (0x30U) -#define DCP_KEY_INDEX_SHIFT (4U) -#define DCP_KEY_INDEX(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEY_INDEX_SHIFT)) & DCP_KEY_INDEX_MASK) - -#define DCP_KEY_RSVD_INDEX_MASK (0xC0U) -#define DCP_KEY_RSVD_INDEX_SHIFT (6U) -#define DCP_KEY_RSVD_INDEX(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEY_RSVD_INDEX_SHIFT)) & DCP_KEY_RSVD_INDEX_MASK) - -#define DCP_KEY_RSVD_MASK (0xFFFFFF00U) -#define DCP_KEY_RSVD_SHIFT (8U) -#define DCP_KEY_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEY_RSVD_SHIFT)) & DCP_KEY_RSVD_MASK) -/*! @} */ - -/*! @name KEYDATA - DCP key data */ -/*! @{ */ - -#define DCP_KEYDATA_DATA_MASK (0xFFFFFFFFU) -#define DCP_KEYDATA_DATA_SHIFT (0U) -#define DCP_KEYDATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << DCP_KEYDATA_DATA_SHIFT)) & DCP_KEYDATA_DATA_MASK) -/*! @} */ - -/*! @name PACKET0 - DCP work packet 0 status register */ -/*! @{ */ - -#define DCP_PACKET0_ADDR_MASK (0xFFFFFFFFU) -#define DCP_PACKET0_ADDR_SHIFT (0U) -#define DCP_PACKET0_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET0_ADDR_SHIFT)) & DCP_PACKET0_ADDR_MASK) -/*! @} */ - -/*! @name PACKET1 - DCP work packet 1 status register */ -/*! @{ */ - -#define DCP_PACKET1_INTERRUPT_MASK (0x1U) -#define DCP_PACKET1_INTERRUPT_SHIFT (0U) -#define DCP_PACKET1_INTERRUPT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_INTERRUPT_SHIFT)) & DCP_PACKET1_INTERRUPT_MASK) - -#define DCP_PACKET1_DECR_SEMAPHORE_MASK (0x2U) -#define DCP_PACKET1_DECR_SEMAPHORE_SHIFT (1U) -#define DCP_PACKET1_DECR_SEMAPHORE(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_DECR_SEMAPHORE_SHIFT)) & DCP_PACKET1_DECR_SEMAPHORE_MASK) - -#define DCP_PACKET1_CHAIN_MASK (0x4U) -#define DCP_PACKET1_CHAIN_SHIFT (2U) -#define DCP_PACKET1_CHAIN(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CHAIN_SHIFT)) & DCP_PACKET1_CHAIN_MASK) - -#define DCP_PACKET1_CHAIN_CONTIGUOUS_MASK (0x8U) -#define DCP_PACKET1_CHAIN_CONTIGUOUS_SHIFT (3U) -#define DCP_PACKET1_CHAIN_CONTIGUOUS(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CHAIN_CONTIGUOUS_SHIFT)) & DCP_PACKET1_CHAIN_CONTIGUOUS_MASK) - -#define DCP_PACKET1_ENABLE_MEMCOPY_MASK (0x10U) -#define DCP_PACKET1_ENABLE_MEMCOPY_SHIFT (4U) -#define DCP_PACKET1_ENABLE_MEMCOPY(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_ENABLE_MEMCOPY_SHIFT)) & DCP_PACKET1_ENABLE_MEMCOPY_MASK) - -#define DCP_PACKET1_ENABLE_CIPHER_MASK (0x20U) -#define DCP_PACKET1_ENABLE_CIPHER_SHIFT (5U) -#define DCP_PACKET1_ENABLE_CIPHER(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_ENABLE_CIPHER_SHIFT)) & DCP_PACKET1_ENABLE_CIPHER_MASK) - -#define DCP_PACKET1_ENABLE_HASH_MASK (0x40U) -#define DCP_PACKET1_ENABLE_HASH_SHIFT (6U) -#define DCP_PACKET1_ENABLE_HASH(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_ENABLE_HASH_SHIFT)) & DCP_PACKET1_ENABLE_HASH_MASK) - -#define DCP_PACKET1_ENABLE_BLIT_MASK (0x80U) -#define DCP_PACKET1_ENABLE_BLIT_SHIFT (7U) -#define DCP_PACKET1_ENABLE_BLIT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_ENABLE_BLIT_SHIFT)) & DCP_PACKET1_ENABLE_BLIT_MASK) - -#define DCP_PACKET1_CIPHER_ENCRYPT_MASK (0x100U) -#define DCP_PACKET1_CIPHER_ENCRYPT_SHIFT (8U) -/*! CIPHER_ENCRYPT - * 0b1..ENCRYPT - * 0b0..DECRYPT - */ -#define DCP_PACKET1_CIPHER_ENCRYPT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CIPHER_ENCRYPT_SHIFT)) & DCP_PACKET1_CIPHER_ENCRYPT_MASK) - -#define DCP_PACKET1_CIPHER_INIT_MASK (0x200U) -#define DCP_PACKET1_CIPHER_INIT_SHIFT (9U) -#define DCP_PACKET1_CIPHER_INIT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CIPHER_INIT_SHIFT)) & DCP_PACKET1_CIPHER_INIT_MASK) - -#define DCP_PACKET1_OTP_KEY_MASK (0x400U) -#define DCP_PACKET1_OTP_KEY_SHIFT (10U) -#define DCP_PACKET1_OTP_KEY(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_OTP_KEY_SHIFT)) & DCP_PACKET1_OTP_KEY_MASK) - -#define DCP_PACKET1_PAYLOAD_KEY_MASK (0x800U) -#define DCP_PACKET1_PAYLOAD_KEY_SHIFT (11U) -#define DCP_PACKET1_PAYLOAD_KEY(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_PAYLOAD_KEY_SHIFT)) & DCP_PACKET1_PAYLOAD_KEY_MASK) - -#define DCP_PACKET1_HASH_INIT_MASK (0x1000U) -#define DCP_PACKET1_HASH_INIT_SHIFT (12U) -#define DCP_PACKET1_HASH_INIT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_HASH_INIT_SHIFT)) & DCP_PACKET1_HASH_INIT_MASK) - -#define DCP_PACKET1_HASH_TERM_MASK (0x2000U) -#define DCP_PACKET1_HASH_TERM_SHIFT (13U) -#define DCP_PACKET1_HASH_TERM(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_HASH_TERM_SHIFT)) & DCP_PACKET1_HASH_TERM_MASK) - -#define DCP_PACKET1_CHECK_HASH_MASK (0x4000U) -#define DCP_PACKET1_CHECK_HASH_SHIFT (14U) -#define DCP_PACKET1_CHECK_HASH(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CHECK_HASH_SHIFT)) & DCP_PACKET1_CHECK_HASH_MASK) - -#define DCP_PACKET1_HASH_OUTPUT_MASK (0x8000U) -#define DCP_PACKET1_HASH_OUTPUT_SHIFT (15U) -/*! HASH_OUTPUT - * 0b0..INPUT - * 0b1..OUTPUT - */ -#define DCP_PACKET1_HASH_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_HASH_OUTPUT_SHIFT)) & DCP_PACKET1_HASH_OUTPUT_MASK) - -#define DCP_PACKET1_CONSTANT_FILL_MASK (0x10000U) -#define DCP_PACKET1_CONSTANT_FILL_SHIFT (16U) -#define DCP_PACKET1_CONSTANT_FILL(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_CONSTANT_FILL_SHIFT)) & DCP_PACKET1_CONSTANT_FILL_MASK) - -#define DCP_PACKET1_TEST_SEMA_IRQ_MASK (0x20000U) -#define DCP_PACKET1_TEST_SEMA_IRQ_SHIFT (17U) -#define DCP_PACKET1_TEST_SEMA_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_TEST_SEMA_IRQ_SHIFT)) & DCP_PACKET1_TEST_SEMA_IRQ_MASK) - -#define DCP_PACKET1_KEY_BYTESWAP_MASK (0x40000U) -#define DCP_PACKET1_KEY_BYTESWAP_SHIFT (18U) -#define DCP_PACKET1_KEY_BYTESWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_KEY_BYTESWAP_SHIFT)) & DCP_PACKET1_KEY_BYTESWAP_MASK) - -#define DCP_PACKET1_KEY_WORDSWAP_MASK (0x80000U) -#define DCP_PACKET1_KEY_WORDSWAP_SHIFT (19U) -#define DCP_PACKET1_KEY_WORDSWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_KEY_WORDSWAP_SHIFT)) & DCP_PACKET1_KEY_WORDSWAP_MASK) - -#define DCP_PACKET1_INPUT_BYTESWAP_MASK (0x100000U) -#define DCP_PACKET1_INPUT_BYTESWAP_SHIFT (20U) -#define DCP_PACKET1_INPUT_BYTESWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_INPUT_BYTESWAP_SHIFT)) & DCP_PACKET1_INPUT_BYTESWAP_MASK) - -#define DCP_PACKET1_INPUT_WORDSWAP_MASK (0x200000U) -#define DCP_PACKET1_INPUT_WORDSWAP_SHIFT (21U) -#define DCP_PACKET1_INPUT_WORDSWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_INPUT_WORDSWAP_SHIFT)) & DCP_PACKET1_INPUT_WORDSWAP_MASK) - -#define DCP_PACKET1_OUTPUT_BYTESWAP_MASK (0x400000U) -#define DCP_PACKET1_OUTPUT_BYTESWAP_SHIFT (22U) -#define DCP_PACKET1_OUTPUT_BYTESWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_OUTPUT_BYTESWAP_SHIFT)) & DCP_PACKET1_OUTPUT_BYTESWAP_MASK) - -#define DCP_PACKET1_OUTPUT_WORDSWAP_MASK (0x800000U) -#define DCP_PACKET1_OUTPUT_WORDSWAP_SHIFT (23U) -#define DCP_PACKET1_OUTPUT_WORDSWAP(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_OUTPUT_WORDSWAP_SHIFT)) & DCP_PACKET1_OUTPUT_WORDSWAP_MASK) - -#define DCP_PACKET1_TAG_MASK (0xFF000000U) -#define DCP_PACKET1_TAG_SHIFT (24U) -#define DCP_PACKET1_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET1_TAG_SHIFT)) & DCP_PACKET1_TAG_MASK) -/*! @} */ - -/*! @name PACKET2 - DCP work packet 2 status register */ -/*! @{ */ - -#define DCP_PACKET2_CIPHER_SELECT_MASK (0xFU) -#define DCP_PACKET2_CIPHER_SELECT_SHIFT (0U) -/*! CIPHER_SELECT - * 0b0000..AES128 - */ -#define DCP_PACKET2_CIPHER_SELECT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_CIPHER_SELECT_SHIFT)) & DCP_PACKET2_CIPHER_SELECT_MASK) - -#define DCP_PACKET2_CIPHER_MODE_MASK (0xF0U) -#define DCP_PACKET2_CIPHER_MODE_SHIFT (4U) -/*! CIPHER_MODE - * 0b0000..ECB - * 0b0001..CBC - */ -#define DCP_PACKET2_CIPHER_MODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_CIPHER_MODE_SHIFT)) & DCP_PACKET2_CIPHER_MODE_MASK) - -#define DCP_PACKET2_KEY_SELECT_MASK (0xFF00U) -#define DCP_PACKET2_KEY_SELECT_SHIFT (8U) -/*! KEY_SELECT - * 0b00000000..KEY0 - * 0b00000001..KEY1 - * 0b00000010..KEY2 - * 0b00000011..KEY3 - * 0b11111110..UNIQUE_KEY - * 0b11111111..OTP_KEY - */ -#define DCP_PACKET2_KEY_SELECT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_KEY_SELECT_SHIFT)) & DCP_PACKET2_KEY_SELECT_MASK) - -#define DCP_PACKET2_HASH_SELECT_MASK (0xF0000U) -#define DCP_PACKET2_HASH_SELECT_SHIFT (16U) -/*! HASH_SELECT - * 0b0000..SHA1 - * 0b0001..CRC32 - * 0b0010..SHA256 - */ -#define DCP_PACKET2_HASH_SELECT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_HASH_SELECT_SHIFT)) & DCP_PACKET2_HASH_SELECT_MASK) - -#define DCP_PACKET2_RSVD_MASK (0xF00000U) -#define DCP_PACKET2_RSVD_SHIFT (20U) -#define DCP_PACKET2_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_RSVD_SHIFT)) & DCP_PACKET2_RSVD_MASK) - -#define DCP_PACKET2_CIPHER_CFG_MASK (0xFF000000U) -#define DCP_PACKET2_CIPHER_CFG_SHIFT (24U) -#define DCP_PACKET2_CIPHER_CFG(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET2_CIPHER_CFG_SHIFT)) & DCP_PACKET2_CIPHER_CFG_MASK) -/*! @} */ - -/*! @name PACKET3 - DCP work packet 3 status register */ -/*! @{ */ - -#define DCP_PACKET3_ADDR_MASK (0xFFFFFFFFU) -#define DCP_PACKET3_ADDR_SHIFT (0U) -#define DCP_PACKET3_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET3_ADDR_SHIFT)) & DCP_PACKET3_ADDR_MASK) -/*! @} */ - -/*! @name PACKET4 - DCP work packet 4 status register */ -/*! @{ */ - -#define DCP_PACKET4_ADDR_MASK (0xFFFFFFFFU) -#define DCP_PACKET4_ADDR_SHIFT (0U) -#define DCP_PACKET4_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET4_ADDR_SHIFT)) & DCP_PACKET4_ADDR_MASK) -/*! @} */ - -/*! @name PACKET5 - DCP work packet 5 status register */ -/*! @{ */ - -#define DCP_PACKET5_COUNT_MASK (0xFFFFFFFFU) -#define DCP_PACKET5_COUNT_SHIFT (0U) -#define DCP_PACKET5_COUNT(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET5_COUNT_SHIFT)) & DCP_PACKET5_COUNT_MASK) -/*! @} */ - -/*! @name PACKET6 - DCP work packet 6 status register */ -/*! @{ */ - -#define DCP_PACKET6_ADDR_MASK (0xFFFFFFFFU) -#define DCP_PACKET6_ADDR_SHIFT (0U) -#define DCP_PACKET6_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_PACKET6_ADDR_SHIFT)) & DCP_PACKET6_ADDR_MASK) -/*! @} */ - -/*! @name CH0CMDPTR - DCP channel 0 command pointer address register */ -/*! @{ */ - -#define DCP_CH0CMDPTR_ADDR_MASK (0xFFFFFFFFU) -#define DCP_CH0CMDPTR_ADDR_SHIFT (0U) -#define DCP_CH0CMDPTR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0CMDPTR_ADDR_SHIFT)) & DCP_CH0CMDPTR_ADDR_MASK) -/*! @} */ - -/*! @name CH0SEMA - DCP channel 0 semaphore register */ -/*! @{ */ - -#define DCP_CH0SEMA_INCREMENT_MASK (0xFFU) -#define DCP_CH0SEMA_INCREMENT_SHIFT (0U) -#define DCP_CH0SEMA_INCREMENT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0SEMA_INCREMENT_SHIFT)) & DCP_CH0SEMA_INCREMENT_MASK) - -#define DCP_CH0SEMA_VALUE_MASK (0xFF0000U) -#define DCP_CH0SEMA_VALUE_SHIFT (16U) -#define DCP_CH0SEMA_VALUE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0SEMA_VALUE_SHIFT)) & DCP_CH0SEMA_VALUE_MASK) -/*! @} */ - -/*! @name CH0STAT - DCP channel 0 status register */ -/*! @{ */ - -#define DCP_CH0STAT_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH0STAT_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH0STAT_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_RSVD_COMPLETE_SHIFT)) & DCP_CH0STAT_RSVD_COMPLETE_MASK) - -#define DCP_CH0STAT_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH0STAT_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH0STAT_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_HASH_MISMATCH_SHIFT)) & DCP_CH0STAT_HASH_MISMATCH_MASK) - -#define DCP_CH0STAT_ERROR_SETUP_MASK (0x4U) -#define DCP_CH0STAT_ERROR_SETUP_SHIFT (2U) -#define DCP_CH0STAT_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_SETUP_SHIFT)) & DCP_CH0STAT_ERROR_SETUP_MASK) - -#define DCP_CH0STAT_ERROR_PACKET_MASK (0x8U) -#define DCP_CH0STAT_ERROR_PACKET_SHIFT (3U) -#define DCP_CH0STAT_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_PACKET_SHIFT)) & DCP_CH0STAT_ERROR_PACKET_MASK) - -#define DCP_CH0STAT_ERROR_SRC_MASK (0x10U) -#define DCP_CH0STAT_ERROR_SRC_SHIFT (4U) -#define DCP_CH0STAT_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_SRC_SHIFT)) & DCP_CH0STAT_ERROR_SRC_MASK) - -#define DCP_CH0STAT_ERROR_DST_MASK (0x20U) -#define DCP_CH0STAT_ERROR_DST_SHIFT (5U) -#define DCP_CH0STAT_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_DST_SHIFT)) & DCP_CH0STAT_ERROR_DST_MASK) - -#define DCP_CH0STAT_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH0STAT_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH0STAT_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_PAGEFAULT_SHIFT)) & DCP_CH0STAT_ERROR_PAGEFAULT_MASK) - -#define DCP_CH0STAT_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH0STAT_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error signalled because the next pointer is 0x00000000 - * 0b00000010..Error signalled because the semaphore is non-zero and neither chain bit is set - * 0b00000011..Error signalled because an error is reported reading/writing the context buffer - * 0b00000100..Error signalled because an error is reported reading/writing the payload - * 0b00000101..Error signalled because the control packet specifies an invalid mode select (for instance, blit + hash) - */ -#define DCP_CH0STAT_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_ERROR_CODE_SHIFT)) & DCP_CH0STAT_ERROR_CODE_MASK) - -#define DCP_CH0STAT_TAG_MASK (0xFF000000U) -#define DCP_CH0STAT_TAG_SHIFT (24U) -#define DCP_CH0STAT_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TAG_SHIFT)) & DCP_CH0STAT_TAG_MASK) -/*! @} */ - -/*! @name CH0STAT_SET - DCP channel 0 status register */ -/*! @{ */ - -#define DCP_CH0STAT_SET_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH0STAT_SET_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH0STAT_SET_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_RSVD_COMPLETE_SHIFT)) & DCP_CH0STAT_SET_RSVD_COMPLETE_MASK) - -#define DCP_CH0STAT_SET_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH0STAT_SET_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH0STAT_SET_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_HASH_MISMATCH_SHIFT)) & DCP_CH0STAT_SET_HASH_MISMATCH_MASK) - -#define DCP_CH0STAT_SET_ERROR_SETUP_MASK (0x4U) -#define DCP_CH0STAT_SET_ERROR_SETUP_SHIFT (2U) -#define DCP_CH0STAT_SET_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_SETUP_SHIFT)) & DCP_CH0STAT_SET_ERROR_SETUP_MASK) - -#define DCP_CH0STAT_SET_ERROR_PACKET_MASK (0x8U) -#define DCP_CH0STAT_SET_ERROR_PACKET_SHIFT (3U) -#define DCP_CH0STAT_SET_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_PACKET_SHIFT)) & DCP_CH0STAT_SET_ERROR_PACKET_MASK) - -#define DCP_CH0STAT_SET_ERROR_SRC_MASK (0x10U) -#define DCP_CH0STAT_SET_ERROR_SRC_SHIFT (4U) -#define DCP_CH0STAT_SET_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_SRC_SHIFT)) & DCP_CH0STAT_SET_ERROR_SRC_MASK) - -#define DCP_CH0STAT_SET_ERROR_DST_MASK (0x20U) -#define DCP_CH0STAT_SET_ERROR_DST_SHIFT (5U) -#define DCP_CH0STAT_SET_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_DST_SHIFT)) & DCP_CH0STAT_SET_ERROR_DST_MASK) - -#define DCP_CH0STAT_SET_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH0STAT_SET_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH0STAT_SET_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_PAGEFAULT_SHIFT)) & DCP_CH0STAT_SET_ERROR_PAGEFAULT_MASK) - -#define DCP_CH0STAT_SET_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH0STAT_SET_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error signalled because the next pointer is 0x00000000 - * 0b00000010..Error signalled because the semaphore is non-zero and neither chain bit is set - * 0b00000011..Error signalled because an error is reported reading/writing the context buffer - * 0b00000100..Error signalled because an error is reported reading/writing the payload - * 0b00000101..Error signalled because the control packet specifies an invalid mode select (for instance, blit + hash) - */ -#define DCP_CH0STAT_SET_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_ERROR_CODE_SHIFT)) & DCP_CH0STAT_SET_ERROR_CODE_MASK) - -#define DCP_CH0STAT_SET_TAG_MASK (0xFF000000U) -#define DCP_CH0STAT_SET_TAG_SHIFT (24U) -#define DCP_CH0STAT_SET_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_SET_TAG_SHIFT)) & DCP_CH0STAT_SET_TAG_MASK) -/*! @} */ - -/*! @name CH0STAT_CLR - DCP channel 0 status register */ -/*! @{ */ - -#define DCP_CH0STAT_CLR_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH0STAT_CLR_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH0STAT_CLR_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_RSVD_COMPLETE_SHIFT)) & DCP_CH0STAT_CLR_RSVD_COMPLETE_MASK) - -#define DCP_CH0STAT_CLR_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH0STAT_CLR_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH0STAT_CLR_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_HASH_MISMATCH_SHIFT)) & DCP_CH0STAT_CLR_HASH_MISMATCH_MASK) - -#define DCP_CH0STAT_CLR_ERROR_SETUP_MASK (0x4U) -#define DCP_CH0STAT_CLR_ERROR_SETUP_SHIFT (2U) -#define DCP_CH0STAT_CLR_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_SETUP_SHIFT)) & DCP_CH0STAT_CLR_ERROR_SETUP_MASK) - -#define DCP_CH0STAT_CLR_ERROR_PACKET_MASK (0x8U) -#define DCP_CH0STAT_CLR_ERROR_PACKET_SHIFT (3U) -#define DCP_CH0STAT_CLR_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_PACKET_SHIFT)) & DCP_CH0STAT_CLR_ERROR_PACKET_MASK) - -#define DCP_CH0STAT_CLR_ERROR_SRC_MASK (0x10U) -#define DCP_CH0STAT_CLR_ERROR_SRC_SHIFT (4U) -#define DCP_CH0STAT_CLR_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_SRC_SHIFT)) & DCP_CH0STAT_CLR_ERROR_SRC_MASK) - -#define DCP_CH0STAT_CLR_ERROR_DST_MASK (0x20U) -#define DCP_CH0STAT_CLR_ERROR_DST_SHIFT (5U) -#define DCP_CH0STAT_CLR_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_DST_SHIFT)) & DCP_CH0STAT_CLR_ERROR_DST_MASK) - -#define DCP_CH0STAT_CLR_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH0STAT_CLR_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH0STAT_CLR_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_PAGEFAULT_SHIFT)) & DCP_CH0STAT_CLR_ERROR_PAGEFAULT_MASK) - -#define DCP_CH0STAT_CLR_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH0STAT_CLR_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error signalled because the next pointer is 0x00000000 - * 0b00000010..Error signalled because the semaphore is non-zero and neither chain bit is set - * 0b00000011..Error signalled because an error is reported reading/writing the context buffer - * 0b00000100..Error signalled because an error is reported reading/writing the payload - * 0b00000101..Error signalled because the control packet specifies an invalid mode select (for instance, blit + hash) - */ -#define DCP_CH0STAT_CLR_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_ERROR_CODE_SHIFT)) & DCP_CH0STAT_CLR_ERROR_CODE_MASK) - -#define DCP_CH0STAT_CLR_TAG_MASK (0xFF000000U) -#define DCP_CH0STAT_CLR_TAG_SHIFT (24U) -#define DCP_CH0STAT_CLR_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_CLR_TAG_SHIFT)) & DCP_CH0STAT_CLR_TAG_MASK) -/*! @} */ - -/*! @name CH0STAT_TOG - DCP channel 0 status register */ -/*! @{ */ - -#define DCP_CH0STAT_TOG_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH0STAT_TOG_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH0STAT_TOG_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_RSVD_COMPLETE_SHIFT)) & DCP_CH0STAT_TOG_RSVD_COMPLETE_MASK) - -#define DCP_CH0STAT_TOG_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH0STAT_TOG_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH0STAT_TOG_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_HASH_MISMATCH_SHIFT)) & DCP_CH0STAT_TOG_HASH_MISMATCH_MASK) - -#define DCP_CH0STAT_TOG_ERROR_SETUP_MASK (0x4U) -#define DCP_CH0STAT_TOG_ERROR_SETUP_SHIFT (2U) -#define DCP_CH0STAT_TOG_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_SETUP_SHIFT)) & DCP_CH0STAT_TOG_ERROR_SETUP_MASK) - -#define DCP_CH0STAT_TOG_ERROR_PACKET_MASK (0x8U) -#define DCP_CH0STAT_TOG_ERROR_PACKET_SHIFT (3U) -#define DCP_CH0STAT_TOG_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_PACKET_SHIFT)) & DCP_CH0STAT_TOG_ERROR_PACKET_MASK) - -#define DCP_CH0STAT_TOG_ERROR_SRC_MASK (0x10U) -#define DCP_CH0STAT_TOG_ERROR_SRC_SHIFT (4U) -#define DCP_CH0STAT_TOG_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_SRC_SHIFT)) & DCP_CH0STAT_TOG_ERROR_SRC_MASK) - -#define DCP_CH0STAT_TOG_ERROR_DST_MASK (0x20U) -#define DCP_CH0STAT_TOG_ERROR_DST_SHIFT (5U) -#define DCP_CH0STAT_TOG_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_DST_SHIFT)) & DCP_CH0STAT_TOG_ERROR_DST_MASK) - -#define DCP_CH0STAT_TOG_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH0STAT_TOG_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH0STAT_TOG_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_PAGEFAULT_SHIFT)) & DCP_CH0STAT_TOG_ERROR_PAGEFAULT_MASK) - -#define DCP_CH0STAT_TOG_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH0STAT_TOG_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error signalled because the next pointer is 0x00000000 - * 0b00000010..Error signalled because the semaphore is non-zero and neither chain bit is set - * 0b00000011..Error signalled because an error is reported reading/writing the context buffer - * 0b00000100..Error signalled because an error is reported reading/writing the payload - * 0b00000101..Error signalled because the control packet specifies an invalid mode select (for instance, blit + hash) - */ -#define DCP_CH0STAT_TOG_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_ERROR_CODE_SHIFT)) & DCP_CH0STAT_TOG_ERROR_CODE_MASK) - -#define DCP_CH0STAT_TOG_TAG_MASK (0xFF000000U) -#define DCP_CH0STAT_TOG_TAG_SHIFT (24U) -#define DCP_CH0STAT_TOG_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0STAT_TOG_TAG_SHIFT)) & DCP_CH0STAT_TOG_TAG_MASK) -/*! @} */ - -/*! @name CH0OPTS - DCP channel 0 options register */ -/*! @{ */ - -#define DCP_CH0OPTS_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH0OPTS_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH0OPTS_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_RECOVERY_TIMER_SHIFT)) & DCP_CH0OPTS_RECOVERY_TIMER_MASK) - -#define DCP_CH0OPTS_RSVD_MASK (0xFFFF0000U) -#define DCP_CH0OPTS_RSVD_SHIFT (16U) -#define DCP_CH0OPTS_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_RSVD_SHIFT)) & DCP_CH0OPTS_RSVD_MASK) -/*! @} */ - -/*! @name CH0OPTS_SET - DCP channel 0 options register */ -/*! @{ */ - -#define DCP_CH0OPTS_SET_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH0OPTS_SET_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH0OPTS_SET_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_SET_RECOVERY_TIMER_SHIFT)) & DCP_CH0OPTS_SET_RECOVERY_TIMER_MASK) - -#define DCP_CH0OPTS_SET_RSVD_MASK (0xFFFF0000U) -#define DCP_CH0OPTS_SET_RSVD_SHIFT (16U) -#define DCP_CH0OPTS_SET_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_SET_RSVD_SHIFT)) & DCP_CH0OPTS_SET_RSVD_MASK) -/*! @} */ - -/*! @name CH0OPTS_CLR - DCP channel 0 options register */ -/*! @{ */ - -#define DCP_CH0OPTS_CLR_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH0OPTS_CLR_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH0OPTS_CLR_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_CLR_RECOVERY_TIMER_SHIFT)) & DCP_CH0OPTS_CLR_RECOVERY_TIMER_MASK) - -#define DCP_CH0OPTS_CLR_RSVD_MASK (0xFFFF0000U) -#define DCP_CH0OPTS_CLR_RSVD_SHIFT (16U) -#define DCP_CH0OPTS_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_CLR_RSVD_SHIFT)) & DCP_CH0OPTS_CLR_RSVD_MASK) -/*! @} */ - -/*! @name CH0OPTS_TOG - DCP channel 0 options register */ -/*! @{ */ - -#define DCP_CH0OPTS_TOG_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH0OPTS_TOG_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH0OPTS_TOG_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_TOG_RECOVERY_TIMER_SHIFT)) & DCP_CH0OPTS_TOG_RECOVERY_TIMER_MASK) - -#define DCP_CH0OPTS_TOG_RSVD_MASK (0xFFFF0000U) -#define DCP_CH0OPTS_TOG_RSVD_SHIFT (16U) -#define DCP_CH0OPTS_TOG_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH0OPTS_TOG_RSVD_SHIFT)) & DCP_CH0OPTS_TOG_RSVD_MASK) -/*! @} */ - -/*! @name CH1CMDPTR - DCP channel 1 command pointer address register */ -/*! @{ */ - -#define DCP_CH1CMDPTR_ADDR_MASK (0xFFFFFFFFU) -#define DCP_CH1CMDPTR_ADDR_SHIFT (0U) -#define DCP_CH1CMDPTR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1CMDPTR_ADDR_SHIFT)) & DCP_CH1CMDPTR_ADDR_MASK) -/*! @} */ - -/*! @name CH1SEMA - DCP channel 1 semaphore register */ -/*! @{ */ - -#define DCP_CH1SEMA_INCREMENT_MASK (0xFFU) -#define DCP_CH1SEMA_INCREMENT_SHIFT (0U) -#define DCP_CH1SEMA_INCREMENT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1SEMA_INCREMENT_SHIFT)) & DCP_CH1SEMA_INCREMENT_MASK) - -#define DCP_CH1SEMA_VALUE_MASK (0xFF0000U) -#define DCP_CH1SEMA_VALUE_SHIFT (16U) -#define DCP_CH1SEMA_VALUE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1SEMA_VALUE_SHIFT)) & DCP_CH1SEMA_VALUE_MASK) -/*! @} */ - -/*! @name CH1STAT - DCP channel 1 status register */ -/*! @{ */ - -#define DCP_CH1STAT_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH1STAT_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH1STAT_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_RSVD_COMPLETE_SHIFT)) & DCP_CH1STAT_RSVD_COMPLETE_MASK) - -#define DCP_CH1STAT_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH1STAT_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH1STAT_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_HASH_MISMATCH_SHIFT)) & DCP_CH1STAT_HASH_MISMATCH_MASK) - -#define DCP_CH1STAT_ERROR_SETUP_MASK (0x4U) -#define DCP_CH1STAT_ERROR_SETUP_SHIFT (2U) -#define DCP_CH1STAT_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_SETUP_SHIFT)) & DCP_CH1STAT_ERROR_SETUP_MASK) - -#define DCP_CH1STAT_ERROR_PACKET_MASK (0x8U) -#define DCP_CH1STAT_ERROR_PACKET_SHIFT (3U) -#define DCP_CH1STAT_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_PACKET_SHIFT)) & DCP_CH1STAT_ERROR_PACKET_MASK) - -#define DCP_CH1STAT_ERROR_SRC_MASK (0x10U) -#define DCP_CH1STAT_ERROR_SRC_SHIFT (4U) -#define DCP_CH1STAT_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_SRC_SHIFT)) & DCP_CH1STAT_ERROR_SRC_MASK) - -#define DCP_CH1STAT_ERROR_DST_MASK (0x20U) -#define DCP_CH1STAT_ERROR_DST_SHIFT (5U) -#define DCP_CH1STAT_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_DST_SHIFT)) & DCP_CH1STAT_ERROR_DST_MASK) - -#define DCP_CH1STAT_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH1STAT_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH1STAT_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_PAGEFAULT_SHIFT)) & DCP_CH1STAT_ERROR_PAGEFAULT_MASK) - -#define DCP_CH1STAT_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH1STAT_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported when reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported when reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH1STAT_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_ERROR_CODE_SHIFT)) & DCP_CH1STAT_ERROR_CODE_MASK) - -#define DCP_CH1STAT_TAG_MASK (0xFF000000U) -#define DCP_CH1STAT_TAG_SHIFT (24U) -#define DCP_CH1STAT_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TAG_SHIFT)) & DCP_CH1STAT_TAG_MASK) -/*! @} */ - -/*! @name CH1STAT_SET - DCP channel 1 status register */ -/*! @{ */ - -#define DCP_CH1STAT_SET_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH1STAT_SET_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH1STAT_SET_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_RSVD_COMPLETE_SHIFT)) & DCP_CH1STAT_SET_RSVD_COMPLETE_MASK) - -#define DCP_CH1STAT_SET_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH1STAT_SET_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH1STAT_SET_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_HASH_MISMATCH_SHIFT)) & DCP_CH1STAT_SET_HASH_MISMATCH_MASK) - -#define DCP_CH1STAT_SET_ERROR_SETUP_MASK (0x4U) -#define DCP_CH1STAT_SET_ERROR_SETUP_SHIFT (2U) -#define DCP_CH1STAT_SET_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_SETUP_SHIFT)) & DCP_CH1STAT_SET_ERROR_SETUP_MASK) - -#define DCP_CH1STAT_SET_ERROR_PACKET_MASK (0x8U) -#define DCP_CH1STAT_SET_ERROR_PACKET_SHIFT (3U) -#define DCP_CH1STAT_SET_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_PACKET_SHIFT)) & DCP_CH1STAT_SET_ERROR_PACKET_MASK) - -#define DCP_CH1STAT_SET_ERROR_SRC_MASK (0x10U) -#define DCP_CH1STAT_SET_ERROR_SRC_SHIFT (4U) -#define DCP_CH1STAT_SET_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_SRC_SHIFT)) & DCP_CH1STAT_SET_ERROR_SRC_MASK) - -#define DCP_CH1STAT_SET_ERROR_DST_MASK (0x20U) -#define DCP_CH1STAT_SET_ERROR_DST_SHIFT (5U) -#define DCP_CH1STAT_SET_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_DST_SHIFT)) & DCP_CH1STAT_SET_ERROR_DST_MASK) - -#define DCP_CH1STAT_SET_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH1STAT_SET_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH1STAT_SET_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_PAGEFAULT_SHIFT)) & DCP_CH1STAT_SET_ERROR_PAGEFAULT_MASK) - -#define DCP_CH1STAT_SET_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH1STAT_SET_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported when reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported when reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH1STAT_SET_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_ERROR_CODE_SHIFT)) & DCP_CH1STAT_SET_ERROR_CODE_MASK) - -#define DCP_CH1STAT_SET_TAG_MASK (0xFF000000U) -#define DCP_CH1STAT_SET_TAG_SHIFT (24U) -#define DCP_CH1STAT_SET_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_SET_TAG_SHIFT)) & DCP_CH1STAT_SET_TAG_MASK) -/*! @} */ - -/*! @name CH1STAT_CLR - DCP channel 1 status register */ -/*! @{ */ - -#define DCP_CH1STAT_CLR_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH1STAT_CLR_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH1STAT_CLR_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_RSVD_COMPLETE_SHIFT)) & DCP_CH1STAT_CLR_RSVD_COMPLETE_MASK) - -#define DCP_CH1STAT_CLR_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH1STAT_CLR_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH1STAT_CLR_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_HASH_MISMATCH_SHIFT)) & DCP_CH1STAT_CLR_HASH_MISMATCH_MASK) - -#define DCP_CH1STAT_CLR_ERROR_SETUP_MASK (0x4U) -#define DCP_CH1STAT_CLR_ERROR_SETUP_SHIFT (2U) -#define DCP_CH1STAT_CLR_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_SETUP_SHIFT)) & DCP_CH1STAT_CLR_ERROR_SETUP_MASK) - -#define DCP_CH1STAT_CLR_ERROR_PACKET_MASK (0x8U) -#define DCP_CH1STAT_CLR_ERROR_PACKET_SHIFT (3U) -#define DCP_CH1STAT_CLR_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_PACKET_SHIFT)) & DCP_CH1STAT_CLR_ERROR_PACKET_MASK) - -#define DCP_CH1STAT_CLR_ERROR_SRC_MASK (0x10U) -#define DCP_CH1STAT_CLR_ERROR_SRC_SHIFT (4U) -#define DCP_CH1STAT_CLR_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_SRC_SHIFT)) & DCP_CH1STAT_CLR_ERROR_SRC_MASK) - -#define DCP_CH1STAT_CLR_ERROR_DST_MASK (0x20U) -#define DCP_CH1STAT_CLR_ERROR_DST_SHIFT (5U) -#define DCP_CH1STAT_CLR_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_DST_SHIFT)) & DCP_CH1STAT_CLR_ERROR_DST_MASK) - -#define DCP_CH1STAT_CLR_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH1STAT_CLR_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH1STAT_CLR_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_PAGEFAULT_SHIFT)) & DCP_CH1STAT_CLR_ERROR_PAGEFAULT_MASK) - -#define DCP_CH1STAT_CLR_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH1STAT_CLR_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported when reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported when reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH1STAT_CLR_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_ERROR_CODE_SHIFT)) & DCP_CH1STAT_CLR_ERROR_CODE_MASK) - -#define DCP_CH1STAT_CLR_TAG_MASK (0xFF000000U) -#define DCP_CH1STAT_CLR_TAG_SHIFT (24U) -#define DCP_CH1STAT_CLR_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_CLR_TAG_SHIFT)) & DCP_CH1STAT_CLR_TAG_MASK) -/*! @} */ - -/*! @name CH1STAT_TOG - DCP channel 1 status register */ -/*! @{ */ - -#define DCP_CH1STAT_TOG_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH1STAT_TOG_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH1STAT_TOG_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_RSVD_COMPLETE_SHIFT)) & DCP_CH1STAT_TOG_RSVD_COMPLETE_MASK) - -#define DCP_CH1STAT_TOG_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH1STAT_TOG_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH1STAT_TOG_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_HASH_MISMATCH_SHIFT)) & DCP_CH1STAT_TOG_HASH_MISMATCH_MASK) - -#define DCP_CH1STAT_TOG_ERROR_SETUP_MASK (0x4U) -#define DCP_CH1STAT_TOG_ERROR_SETUP_SHIFT (2U) -#define DCP_CH1STAT_TOG_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_SETUP_SHIFT)) & DCP_CH1STAT_TOG_ERROR_SETUP_MASK) - -#define DCP_CH1STAT_TOG_ERROR_PACKET_MASK (0x8U) -#define DCP_CH1STAT_TOG_ERROR_PACKET_SHIFT (3U) -#define DCP_CH1STAT_TOG_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_PACKET_SHIFT)) & DCP_CH1STAT_TOG_ERROR_PACKET_MASK) - -#define DCP_CH1STAT_TOG_ERROR_SRC_MASK (0x10U) -#define DCP_CH1STAT_TOG_ERROR_SRC_SHIFT (4U) -#define DCP_CH1STAT_TOG_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_SRC_SHIFT)) & DCP_CH1STAT_TOG_ERROR_SRC_MASK) - -#define DCP_CH1STAT_TOG_ERROR_DST_MASK (0x20U) -#define DCP_CH1STAT_TOG_ERROR_DST_SHIFT (5U) -#define DCP_CH1STAT_TOG_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_DST_SHIFT)) & DCP_CH1STAT_TOG_ERROR_DST_MASK) - -#define DCP_CH1STAT_TOG_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH1STAT_TOG_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH1STAT_TOG_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_PAGEFAULT_SHIFT)) & DCP_CH1STAT_TOG_ERROR_PAGEFAULT_MASK) - -#define DCP_CH1STAT_TOG_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH1STAT_TOG_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported when reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported when reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH1STAT_TOG_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_ERROR_CODE_SHIFT)) & DCP_CH1STAT_TOG_ERROR_CODE_MASK) - -#define DCP_CH1STAT_TOG_TAG_MASK (0xFF000000U) -#define DCP_CH1STAT_TOG_TAG_SHIFT (24U) -#define DCP_CH1STAT_TOG_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1STAT_TOG_TAG_SHIFT)) & DCP_CH1STAT_TOG_TAG_MASK) -/*! @} */ - -/*! @name CH1OPTS - DCP channel 1 options register */ -/*! @{ */ - -#define DCP_CH1OPTS_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH1OPTS_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH1OPTS_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_RECOVERY_TIMER_SHIFT)) & DCP_CH1OPTS_RECOVERY_TIMER_MASK) - -#define DCP_CH1OPTS_RSVD_MASK (0xFFFF0000U) -#define DCP_CH1OPTS_RSVD_SHIFT (16U) -#define DCP_CH1OPTS_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_RSVD_SHIFT)) & DCP_CH1OPTS_RSVD_MASK) -/*! @} */ - -/*! @name CH1OPTS_SET - DCP channel 1 options register */ -/*! @{ */ - -#define DCP_CH1OPTS_SET_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH1OPTS_SET_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH1OPTS_SET_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_SET_RECOVERY_TIMER_SHIFT)) & DCP_CH1OPTS_SET_RECOVERY_TIMER_MASK) - -#define DCP_CH1OPTS_SET_RSVD_MASK (0xFFFF0000U) -#define DCP_CH1OPTS_SET_RSVD_SHIFT (16U) -#define DCP_CH1OPTS_SET_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_SET_RSVD_SHIFT)) & DCP_CH1OPTS_SET_RSVD_MASK) -/*! @} */ - -/*! @name CH1OPTS_CLR - DCP channel 1 options register */ -/*! @{ */ - -#define DCP_CH1OPTS_CLR_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH1OPTS_CLR_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH1OPTS_CLR_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_CLR_RECOVERY_TIMER_SHIFT)) & DCP_CH1OPTS_CLR_RECOVERY_TIMER_MASK) - -#define DCP_CH1OPTS_CLR_RSVD_MASK (0xFFFF0000U) -#define DCP_CH1OPTS_CLR_RSVD_SHIFT (16U) -#define DCP_CH1OPTS_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_CLR_RSVD_SHIFT)) & DCP_CH1OPTS_CLR_RSVD_MASK) -/*! @} */ - -/*! @name CH1OPTS_TOG - DCP channel 1 options register */ -/*! @{ */ - -#define DCP_CH1OPTS_TOG_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH1OPTS_TOG_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH1OPTS_TOG_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_TOG_RECOVERY_TIMER_SHIFT)) & DCP_CH1OPTS_TOG_RECOVERY_TIMER_MASK) - -#define DCP_CH1OPTS_TOG_RSVD_MASK (0xFFFF0000U) -#define DCP_CH1OPTS_TOG_RSVD_SHIFT (16U) -#define DCP_CH1OPTS_TOG_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH1OPTS_TOG_RSVD_SHIFT)) & DCP_CH1OPTS_TOG_RSVD_MASK) -/*! @} */ - -/*! @name CH2CMDPTR - DCP channel 2 command pointer address register */ -/*! @{ */ - -#define DCP_CH2CMDPTR_ADDR_MASK (0xFFFFFFFFU) -#define DCP_CH2CMDPTR_ADDR_SHIFT (0U) -#define DCP_CH2CMDPTR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2CMDPTR_ADDR_SHIFT)) & DCP_CH2CMDPTR_ADDR_MASK) -/*! @} */ - -/*! @name CH2SEMA - DCP channel 2 semaphore register */ -/*! @{ */ - -#define DCP_CH2SEMA_INCREMENT_MASK (0xFFU) -#define DCP_CH2SEMA_INCREMENT_SHIFT (0U) -#define DCP_CH2SEMA_INCREMENT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2SEMA_INCREMENT_SHIFT)) & DCP_CH2SEMA_INCREMENT_MASK) - -#define DCP_CH2SEMA_VALUE_MASK (0xFF0000U) -#define DCP_CH2SEMA_VALUE_SHIFT (16U) -#define DCP_CH2SEMA_VALUE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2SEMA_VALUE_SHIFT)) & DCP_CH2SEMA_VALUE_MASK) -/*! @} */ - -/*! @name CH2STAT - DCP channel 2 status register */ -/*! @{ */ - -#define DCP_CH2STAT_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH2STAT_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH2STAT_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_RSVD_COMPLETE_SHIFT)) & DCP_CH2STAT_RSVD_COMPLETE_MASK) - -#define DCP_CH2STAT_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH2STAT_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH2STAT_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_HASH_MISMATCH_SHIFT)) & DCP_CH2STAT_HASH_MISMATCH_MASK) - -#define DCP_CH2STAT_ERROR_SETUP_MASK (0x4U) -#define DCP_CH2STAT_ERROR_SETUP_SHIFT (2U) -#define DCP_CH2STAT_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_SETUP_SHIFT)) & DCP_CH2STAT_ERROR_SETUP_MASK) - -#define DCP_CH2STAT_ERROR_PACKET_MASK (0x8U) -#define DCP_CH2STAT_ERROR_PACKET_SHIFT (3U) -#define DCP_CH2STAT_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_PACKET_SHIFT)) & DCP_CH2STAT_ERROR_PACKET_MASK) - -#define DCP_CH2STAT_ERROR_SRC_MASK (0x10U) -#define DCP_CH2STAT_ERROR_SRC_SHIFT (4U) -#define DCP_CH2STAT_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_SRC_SHIFT)) & DCP_CH2STAT_ERROR_SRC_MASK) - -#define DCP_CH2STAT_ERROR_DST_MASK (0x20U) -#define DCP_CH2STAT_ERROR_DST_SHIFT (5U) -#define DCP_CH2STAT_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_DST_SHIFT)) & DCP_CH2STAT_ERROR_DST_MASK) - -#define DCP_CH2STAT_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH2STAT_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH2STAT_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_PAGEFAULT_SHIFT)) & DCP_CH2STAT_ERROR_PAGEFAULT_MASK) - -#define DCP_CH2STAT_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH2STAT_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for instance, blit + hash). - */ -#define DCP_CH2STAT_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_ERROR_CODE_SHIFT)) & DCP_CH2STAT_ERROR_CODE_MASK) - -#define DCP_CH2STAT_TAG_MASK (0xFF000000U) -#define DCP_CH2STAT_TAG_SHIFT (24U) -#define DCP_CH2STAT_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TAG_SHIFT)) & DCP_CH2STAT_TAG_MASK) -/*! @} */ - -/*! @name CH2STAT_SET - DCP channel 2 status register */ -/*! @{ */ - -#define DCP_CH2STAT_SET_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH2STAT_SET_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH2STAT_SET_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_RSVD_COMPLETE_SHIFT)) & DCP_CH2STAT_SET_RSVD_COMPLETE_MASK) - -#define DCP_CH2STAT_SET_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH2STAT_SET_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH2STAT_SET_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_HASH_MISMATCH_SHIFT)) & DCP_CH2STAT_SET_HASH_MISMATCH_MASK) - -#define DCP_CH2STAT_SET_ERROR_SETUP_MASK (0x4U) -#define DCP_CH2STAT_SET_ERROR_SETUP_SHIFT (2U) -#define DCP_CH2STAT_SET_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_SETUP_SHIFT)) & DCP_CH2STAT_SET_ERROR_SETUP_MASK) - -#define DCP_CH2STAT_SET_ERROR_PACKET_MASK (0x8U) -#define DCP_CH2STAT_SET_ERROR_PACKET_SHIFT (3U) -#define DCP_CH2STAT_SET_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_PACKET_SHIFT)) & DCP_CH2STAT_SET_ERROR_PACKET_MASK) - -#define DCP_CH2STAT_SET_ERROR_SRC_MASK (0x10U) -#define DCP_CH2STAT_SET_ERROR_SRC_SHIFT (4U) -#define DCP_CH2STAT_SET_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_SRC_SHIFT)) & DCP_CH2STAT_SET_ERROR_SRC_MASK) - -#define DCP_CH2STAT_SET_ERROR_DST_MASK (0x20U) -#define DCP_CH2STAT_SET_ERROR_DST_SHIFT (5U) -#define DCP_CH2STAT_SET_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_DST_SHIFT)) & DCP_CH2STAT_SET_ERROR_DST_MASK) - -#define DCP_CH2STAT_SET_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH2STAT_SET_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH2STAT_SET_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_PAGEFAULT_SHIFT)) & DCP_CH2STAT_SET_ERROR_PAGEFAULT_MASK) - -#define DCP_CH2STAT_SET_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH2STAT_SET_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for instance, blit + hash). - */ -#define DCP_CH2STAT_SET_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_ERROR_CODE_SHIFT)) & DCP_CH2STAT_SET_ERROR_CODE_MASK) - -#define DCP_CH2STAT_SET_TAG_MASK (0xFF000000U) -#define DCP_CH2STAT_SET_TAG_SHIFT (24U) -#define DCP_CH2STAT_SET_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_SET_TAG_SHIFT)) & DCP_CH2STAT_SET_TAG_MASK) -/*! @} */ - -/*! @name CH2STAT_CLR - DCP channel 2 status register */ -/*! @{ */ - -#define DCP_CH2STAT_CLR_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH2STAT_CLR_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH2STAT_CLR_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_RSVD_COMPLETE_SHIFT)) & DCP_CH2STAT_CLR_RSVD_COMPLETE_MASK) - -#define DCP_CH2STAT_CLR_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH2STAT_CLR_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH2STAT_CLR_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_HASH_MISMATCH_SHIFT)) & DCP_CH2STAT_CLR_HASH_MISMATCH_MASK) - -#define DCP_CH2STAT_CLR_ERROR_SETUP_MASK (0x4U) -#define DCP_CH2STAT_CLR_ERROR_SETUP_SHIFT (2U) -#define DCP_CH2STAT_CLR_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_SETUP_SHIFT)) & DCP_CH2STAT_CLR_ERROR_SETUP_MASK) - -#define DCP_CH2STAT_CLR_ERROR_PACKET_MASK (0x8U) -#define DCP_CH2STAT_CLR_ERROR_PACKET_SHIFT (3U) -#define DCP_CH2STAT_CLR_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_PACKET_SHIFT)) & DCP_CH2STAT_CLR_ERROR_PACKET_MASK) - -#define DCP_CH2STAT_CLR_ERROR_SRC_MASK (0x10U) -#define DCP_CH2STAT_CLR_ERROR_SRC_SHIFT (4U) -#define DCP_CH2STAT_CLR_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_SRC_SHIFT)) & DCP_CH2STAT_CLR_ERROR_SRC_MASK) - -#define DCP_CH2STAT_CLR_ERROR_DST_MASK (0x20U) -#define DCP_CH2STAT_CLR_ERROR_DST_SHIFT (5U) -#define DCP_CH2STAT_CLR_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_DST_SHIFT)) & DCP_CH2STAT_CLR_ERROR_DST_MASK) - -#define DCP_CH2STAT_CLR_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH2STAT_CLR_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH2STAT_CLR_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_PAGEFAULT_SHIFT)) & DCP_CH2STAT_CLR_ERROR_PAGEFAULT_MASK) - -#define DCP_CH2STAT_CLR_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH2STAT_CLR_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for instance, blit + hash). - */ -#define DCP_CH2STAT_CLR_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_ERROR_CODE_SHIFT)) & DCP_CH2STAT_CLR_ERROR_CODE_MASK) - -#define DCP_CH2STAT_CLR_TAG_MASK (0xFF000000U) -#define DCP_CH2STAT_CLR_TAG_SHIFT (24U) -#define DCP_CH2STAT_CLR_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_CLR_TAG_SHIFT)) & DCP_CH2STAT_CLR_TAG_MASK) -/*! @} */ - -/*! @name CH2STAT_TOG - DCP channel 2 status register */ -/*! @{ */ - -#define DCP_CH2STAT_TOG_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH2STAT_TOG_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH2STAT_TOG_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_RSVD_COMPLETE_SHIFT)) & DCP_CH2STAT_TOG_RSVD_COMPLETE_MASK) - -#define DCP_CH2STAT_TOG_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH2STAT_TOG_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH2STAT_TOG_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_HASH_MISMATCH_SHIFT)) & DCP_CH2STAT_TOG_HASH_MISMATCH_MASK) - -#define DCP_CH2STAT_TOG_ERROR_SETUP_MASK (0x4U) -#define DCP_CH2STAT_TOG_ERROR_SETUP_SHIFT (2U) -#define DCP_CH2STAT_TOG_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_SETUP_SHIFT)) & DCP_CH2STAT_TOG_ERROR_SETUP_MASK) - -#define DCP_CH2STAT_TOG_ERROR_PACKET_MASK (0x8U) -#define DCP_CH2STAT_TOG_ERROR_PACKET_SHIFT (3U) -#define DCP_CH2STAT_TOG_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_PACKET_SHIFT)) & DCP_CH2STAT_TOG_ERROR_PACKET_MASK) - -#define DCP_CH2STAT_TOG_ERROR_SRC_MASK (0x10U) -#define DCP_CH2STAT_TOG_ERROR_SRC_SHIFT (4U) -#define DCP_CH2STAT_TOG_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_SRC_SHIFT)) & DCP_CH2STAT_TOG_ERROR_SRC_MASK) - -#define DCP_CH2STAT_TOG_ERROR_DST_MASK (0x20U) -#define DCP_CH2STAT_TOG_ERROR_DST_SHIFT (5U) -#define DCP_CH2STAT_TOG_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_DST_SHIFT)) & DCP_CH2STAT_TOG_ERROR_DST_MASK) - -#define DCP_CH2STAT_TOG_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH2STAT_TOG_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH2STAT_TOG_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_PAGEFAULT_SHIFT)) & DCP_CH2STAT_TOG_ERROR_PAGEFAULT_MASK) - -#define DCP_CH2STAT_TOG_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH2STAT_TOG_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for instance, blit + hash). - */ -#define DCP_CH2STAT_TOG_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_ERROR_CODE_SHIFT)) & DCP_CH2STAT_TOG_ERROR_CODE_MASK) - -#define DCP_CH2STAT_TOG_TAG_MASK (0xFF000000U) -#define DCP_CH2STAT_TOG_TAG_SHIFT (24U) -#define DCP_CH2STAT_TOG_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2STAT_TOG_TAG_SHIFT)) & DCP_CH2STAT_TOG_TAG_MASK) -/*! @} */ - -/*! @name CH2OPTS - DCP channel 2 options register */ -/*! @{ */ - -#define DCP_CH2OPTS_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH2OPTS_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH2OPTS_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_RECOVERY_TIMER_SHIFT)) & DCP_CH2OPTS_RECOVERY_TIMER_MASK) - -#define DCP_CH2OPTS_RSVD_MASK (0xFFFF0000U) -#define DCP_CH2OPTS_RSVD_SHIFT (16U) -#define DCP_CH2OPTS_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_RSVD_SHIFT)) & DCP_CH2OPTS_RSVD_MASK) -/*! @} */ - -/*! @name CH2OPTS_SET - DCP channel 2 options register */ -/*! @{ */ - -#define DCP_CH2OPTS_SET_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH2OPTS_SET_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH2OPTS_SET_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_SET_RECOVERY_TIMER_SHIFT)) & DCP_CH2OPTS_SET_RECOVERY_TIMER_MASK) - -#define DCP_CH2OPTS_SET_RSVD_MASK (0xFFFF0000U) -#define DCP_CH2OPTS_SET_RSVD_SHIFT (16U) -#define DCP_CH2OPTS_SET_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_SET_RSVD_SHIFT)) & DCP_CH2OPTS_SET_RSVD_MASK) -/*! @} */ - -/*! @name CH2OPTS_CLR - DCP channel 2 options register */ -/*! @{ */ - -#define DCP_CH2OPTS_CLR_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH2OPTS_CLR_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH2OPTS_CLR_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_CLR_RECOVERY_TIMER_SHIFT)) & DCP_CH2OPTS_CLR_RECOVERY_TIMER_MASK) - -#define DCP_CH2OPTS_CLR_RSVD_MASK (0xFFFF0000U) -#define DCP_CH2OPTS_CLR_RSVD_SHIFT (16U) -#define DCP_CH2OPTS_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_CLR_RSVD_SHIFT)) & DCP_CH2OPTS_CLR_RSVD_MASK) -/*! @} */ - -/*! @name CH2OPTS_TOG - DCP channel 2 options register */ -/*! @{ */ - -#define DCP_CH2OPTS_TOG_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH2OPTS_TOG_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH2OPTS_TOG_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_TOG_RECOVERY_TIMER_SHIFT)) & DCP_CH2OPTS_TOG_RECOVERY_TIMER_MASK) - -#define DCP_CH2OPTS_TOG_RSVD_MASK (0xFFFF0000U) -#define DCP_CH2OPTS_TOG_RSVD_SHIFT (16U) -#define DCP_CH2OPTS_TOG_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH2OPTS_TOG_RSVD_SHIFT)) & DCP_CH2OPTS_TOG_RSVD_MASK) -/*! @} */ - -/*! @name CH3CMDPTR - DCP channel 3 command pointer address register */ -/*! @{ */ - -#define DCP_CH3CMDPTR_ADDR_MASK (0xFFFFFFFFU) -#define DCP_CH3CMDPTR_ADDR_SHIFT (0U) -#define DCP_CH3CMDPTR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3CMDPTR_ADDR_SHIFT)) & DCP_CH3CMDPTR_ADDR_MASK) -/*! @} */ - -/*! @name CH3SEMA - DCP channel 3 semaphore register */ -/*! @{ */ - -#define DCP_CH3SEMA_INCREMENT_MASK (0xFFU) -#define DCP_CH3SEMA_INCREMENT_SHIFT (0U) -#define DCP_CH3SEMA_INCREMENT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3SEMA_INCREMENT_SHIFT)) & DCP_CH3SEMA_INCREMENT_MASK) - -#define DCP_CH3SEMA_VALUE_MASK (0xFF0000U) -#define DCP_CH3SEMA_VALUE_SHIFT (16U) -#define DCP_CH3SEMA_VALUE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3SEMA_VALUE_SHIFT)) & DCP_CH3SEMA_VALUE_MASK) -/*! @} */ - -/*! @name CH3STAT - DCP channel 3 status register */ -/*! @{ */ - -#define DCP_CH3STAT_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH3STAT_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH3STAT_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_RSVD_COMPLETE_SHIFT)) & DCP_CH3STAT_RSVD_COMPLETE_MASK) - -#define DCP_CH3STAT_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH3STAT_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH3STAT_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_HASH_MISMATCH_SHIFT)) & DCP_CH3STAT_HASH_MISMATCH_MASK) - -#define DCP_CH3STAT_ERROR_SETUP_MASK (0x4U) -#define DCP_CH3STAT_ERROR_SETUP_SHIFT (2U) -#define DCP_CH3STAT_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_SETUP_SHIFT)) & DCP_CH3STAT_ERROR_SETUP_MASK) - -#define DCP_CH3STAT_ERROR_PACKET_MASK (0x8U) -#define DCP_CH3STAT_ERROR_PACKET_SHIFT (3U) -#define DCP_CH3STAT_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_PACKET_SHIFT)) & DCP_CH3STAT_ERROR_PACKET_MASK) - -#define DCP_CH3STAT_ERROR_SRC_MASK (0x10U) -#define DCP_CH3STAT_ERROR_SRC_SHIFT (4U) -#define DCP_CH3STAT_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_SRC_SHIFT)) & DCP_CH3STAT_ERROR_SRC_MASK) - -#define DCP_CH3STAT_ERROR_DST_MASK (0x20U) -#define DCP_CH3STAT_ERROR_DST_SHIFT (5U) -#define DCP_CH3STAT_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_DST_SHIFT)) & DCP_CH3STAT_ERROR_DST_MASK) - -#define DCP_CH3STAT_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH3STAT_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH3STAT_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_PAGEFAULT_SHIFT)) & DCP_CH3STAT_ERROR_PAGEFAULT_MASK) - -#define DCP_CH3STAT_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH3STAT_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH3STAT_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_ERROR_CODE_SHIFT)) & DCP_CH3STAT_ERROR_CODE_MASK) - -#define DCP_CH3STAT_TAG_MASK (0xFF000000U) -#define DCP_CH3STAT_TAG_SHIFT (24U) -#define DCP_CH3STAT_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TAG_SHIFT)) & DCP_CH3STAT_TAG_MASK) -/*! @} */ - -/*! @name CH3STAT_SET - DCP channel 3 status register */ -/*! @{ */ - -#define DCP_CH3STAT_SET_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH3STAT_SET_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH3STAT_SET_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_RSVD_COMPLETE_SHIFT)) & DCP_CH3STAT_SET_RSVD_COMPLETE_MASK) - -#define DCP_CH3STAT_SET_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH3STAT_SET_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH3STAT_SET_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_HASH_MISMATCH_SHIFT)) & DCP_CH3STAT_SET_HASH_MISMATCH_MASK) - -#define DCP_CH3STAT_SET_ERROR_SETUP_MASK (0x4U) -#define DCP_CH3STAT_SET_ERROR_SETUP_SHIFT (2U) -#define DCP_CH3STAT_SET_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_SETUP_SHIFT)) & DCP_CH3STAT_SET_ERROR_SETUP_MASK) - -#define DCP_CH3STAT_SET_ERROR_PACKET_MASK (0x8U) -#define DCP_CH3STAT_SET_ERROR_PACKET_SHIFT (3U) -#define DCP_CH3STAT_SET_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_PACKET_SHIFT)) & DCP_CH3STAT_SET_ERROR_PACKET_MASK) - -#define DCP_CH3STAT_SET_ERROR_SRC_MASK (0x10U) -#define DCP_CH3STAT_SET_ERROR_SRC_SHIFT (4U) -#define DCP_CH3STAT_SET_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_SRC_SHIFT)) & DCP_CH3STAT_SET_ERROR_SRC_MASK) - -#define DCP_CH3STAT_SET_ERROR_DST_MASK (0x20U) -#define DCP_CH3STAT_SET_ERROR_DST_SHIFT (5U) -#define DCP_CH3STAT_SET_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_DST_SHIFT)) & DCP_CH3STAT_SET_ERROR_DST_MASK) - -#define DCP_CH3STAT_SET_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH3STAT_SET_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH3STAT_SET_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_PAGEFAULT_SHIFT)) & DCP_CH3STAT_SET_ERROR_PAGEFAULT_MASK) - -#define DCP_CH3STAT_SET_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH3STAT_SET_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH3STAT_SET_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_ERROR_CODE_SHIFT)) & DCP_CH3STAT_SET_ERROR_CODE_MASK) - -#define DCP_CH3STAT_SET_TAG_MASK (0xFF000000U) -#define DCP_CH3STAT_SET_TAG_SHIFT (24U) -#define DCP_CH3STAT_SET_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_SET_TAG_SHIFT)) & DCP_CH3STAT_SET_TAG_MASK) -/*! @} */ - -/*! @name CH3STAT_CLR - DCP channel 3 status register */ -/*! @{ */ - -#define DCP_CH3STAT_CLR_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH3STAT_CLR_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH3STAT_CLR_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_RSVD_COMPLETE_SHIFT)) & DCP_CH3STAT_CLR_RSVD_COMPLETE_MASK) - -#define DCP_CH3STAT_CLR_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH3STAT_CLR_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH3STAT_CLR_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_HASH_MISMATCH_SHIFT)) & DCP_CH3STAT_CLR_HASH_MISMATCH_MASK) - -#define DCP_CH3STAT_CLR_ERROR_SETUP_MASK (0x4U) -#define DCP_CH3STAT_CLR_ERROR_SETUP_SHIFT (2U) -#define DCP_CH3STAT_CLR_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_SETUP_SHIFT)) & DCP_CH3STAT_CLR_ERROR_SETUP_MASK) - -#define DCP_CH3STAT_CLR_ERROR_PACKET_MASK (0x8U) -#define DCP_CH3STAT_CLR_ERROR_PACKET_SHIFT (3U) -#define DCP_CH3STAT_CLR_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_PACKET_SHIFT)) & DCP_CH3STAT_CLR_ERROR_PACKET_MASK) - -#define DCP_CH3STAT_CLR_ERROR_SRC_MASK (0x10U) -#define DCP_CH3STAT_CLR_ERROR_SRC_SHIFT (4U) -#define DCP_CH3STAT_CLR_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_SRC_SHIFT)) & DCP_CH3STAT_CLR_ERROR_SRC_MASK) - -#define DCP_CH3STAT_CLR_ERROR_DST_MASK (0x20U) -#define DCP_CH3STAT_CLR_ERROR_DST_SHIFT (5U) -#define DCP_CH3STAT_CLR_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_DST_SHIFT)) & DCP_CH3STAT_CLR_ERROR_DST_MASK) - -#define DCP_CH3STAT_CLR_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH3STAT_CLR_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH3STAT_CLR_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_PAGEFAULT_SHIFT)) & DCP_CH3STAT_CLR_ERROR_PAGEFAULT_MASK) - -#define DCP_CH3STAT_CLR_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH3STAT_CLR_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH3STAT_CLR_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_ERROR_CODE_SHIFT)) & DCP_CH3STAT_CLR_ERROR_CODE_MASK) - -#define DCP_CH3STAT_CLR_TAG_MASK (0xFF000000U) -#define DCP_CH3STAT_CLR_TAG_SHIFT (24U) -#define DCP_CH3STAT_CLR_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_CLR_TAG_SHIFT)) & DCP_CH3STAT_CLR_TAG_MASK) -/*! @} */ - -/*! @name CH3STAT_TOG - DCP channel 3 status register */ -/*! @{ */ - -#define DCP_CH3STAT_TOG_RSVD_COMPLETE_MASK (0x1U) -#define DCP_CH3STAT_TOG_RSVD_COMPLETE_SHIFT (0U) -#define DCP_CH3STAT_TOG_RSVD_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_RSVD_COMPLETE_SHIFT)) & DCP_CH3STAT_TOG_RSVD_COMPLETE_MASK) - -#define DCP_CH3STAT_TOG_HASH_MISMATCH_MASK (0x2U) -#define DCP_CH3STAT_TOG_HASH_MISMATCH_SHIFT (1U) -#define DCP_CH3STAT_TOG_HASH_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_HASH_MISMATCH_SHIFT)) & DCP_CH3STAT_TOG_HASH_MISMATCH_MASK) - -#define DCP_CH3STAT_TOG_ERROR_SETUP_MASK (0x4U) -#define DCP_CH3STAT_TOG_ERROR_SETUP_SHIFT (2U) -#define DCP_CH3STAT_TOG_ERROR_SETUP(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_SETUP_SHIFT)) & DCP_CH3STAT_TOG_ERROR_SETUP_MASK) - -#define DCP_CH3STAT_TOG_ERROR_PACKET_MASK (0x8U) -#define DCP_CH3STAT_TOG_ERROR_PACKET_SHIFT (3U) -#define DCP_CH3STAT_TOG_ERROR_PACKET(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_PACKET_SHIFT)) & DCP_CH3STAT_TOG_ERROR_PACKET_MASK) - -#define DCP_CH3STAT_TOG_ERROR_SRC_MASK (0x10U) -#define DCP_CH3STAT_TOG_ERROR_SRC_SHIFT (4U) -#define DCP_CH3STAT_TOG_ERROR_SRC(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_SRC_SHIFT)) & DCP_CH3STAT_TOG_ERROR_SRC_MASK) - -#define DCP_CH3STAT_TOG_ERROR_DST_MASK (0x20U) -#define DCP_CH3STAT_TOG_ERROR_DST_SHIFT (5U) -#define DCP_CH3STAT_TOG_ERROR_DST(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_DST_SHIFT)) & DCP_CH3STAT_TOG_ERROR_DST_MASK) - -#define DCP_CH3STAT_TOG_ERROR_PAGEFAULT_MASK (0x40U) -#define DCP_CH3STAT_TOG_ERROR_PAGEFAULT_SHIFT (6U) -#define DCP_CH3STAT_TOG_ERROR_PAGEFAULT(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_PAGEFAULT_SHIFT)) & DCP_CH3STAT_TOG_ERROR_PAGEFAULT_MASK) - -#define DCP_CH3STAT_TOG_ERROR_CODE_MASK (0xFF0000U) -#define DCP_CH3STAT_TOG_ERROR_CODE_SHIFT (16U) -/*! ERROR_CODE - * 0b00000001..Error is signalled because the next pointer is 0x00000000. - * 0b00000010..Error is signalled because the semaphore is of a non-zero value and neither of the chain bits is set. - * 0b00000011..Error is signalled because an error was reported while reading/writing the context buffer. - * 0b00000100..Error is signalled because an error was reported while reading/writing the payload. - * 0b00000101..Error is signalled because the control packet specifies an invalid mode select (for example, blit + hash). - */ -#define DCP_CH3STAT_TOG_ERROR_CODE(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_ERROR_CODE_SHIFT)) & DCP_CH3STAT_TOG_ERROR_CODE_MASK) - -#define DCP_CH3STAT_TOG_TAG_MASK (0xFF000000U) -#define DCP_CH3STAT_TOG_TAG_SHIFT (24U) -#define DCP_CH3STAT_TOG_TAG(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3STAT_TOG_TAG_SHIFT)) & DCP_CH3STAT_TOG_TAG_MASK) -/*! @} */ - -/*! @name CH3OPTS - DCP channel 3 options register */ -/*! @{ */ - -#define DCP_CH3OPTS_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH3OPTS_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH3OPTS_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_RECOVERY_TIMER_SHIFT)) & DCP_CH3OPTS_RECOVERY_TIMER_MASK) - -#define DCP_CH3OPTS_RSVD_MASK (0xFFFF0000U) -#define DCP_CH3OPTS_RSVD_SHIFT (16U) -#define DCP_CH3OPTS_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_RSVD_SHIFT)) & DCP_CH3OPTS_RSVD_MASK) -/*! @} */ - -/*! @name CH3OPTS_SET - DCP channel 3 options register */ -/*! @{ */ - -#define DCP_CH3OPTS_SET_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH3OPTS_SET_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH3OPTS_SET_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_SET_RECOVERY_TIMER_SHIFT)) & DCP_CH3OPTS_SET_RECOVERY_TIMER_MASK) - -#define DCP_CH3OPTS_SET_RSVD_MASK (0xFFFF0000U) -#define DCP_CH3OPTS_SET_RSVD_SHIFT (16U) -#define DCP_CH3OPTS_SET_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_SET_RSVD_SHIFT)) & DCP_CH3OPTS_SET_RSVD_MASK) -/*! @} */ - -/*! @name CH3OPTS_CLR - DCP channel 3 options register */ -/*! @{ */ - -#define DCP_CH3OPTS_CLR_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH3OPTS_CLR_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH3OPTS_CLR_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_CLR_RECOVERY_TIMER_SHIFT)) & DCP_CH3OPTS_CLR_RECOVERY_TIMER_MASK) - -#define DCP_CH3OPTS_CLR_RSVD_MASK (0xFFFF0000U) -#define DCP_CH3OPTS_CLR_RSVD_SHIFT (16U) -#define DCP_CH3OPTS_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_CLR_RSVD_SHIFT)) & DCP_CH3OPTS_CLR_RSVD_MASK) -/*! @} */ - -/*! @name CH3OPTS_TOG - DCP channel 3 options register */ -/*! @{ */ - -#define DCP_CH3OPTS_TOG_RECOVERY_TIMER_MASK (0xFFFFU) -#define DCP_CH3OPTS_TOG_RECOVERY_TIMER_SHIFT (0U) -#define DCP_CH3OPTS_TOG_RECOVERY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_TOG_RECOVERY_TIMER_SHIFT)) & DCP_CH3OPTS_TOG_RECOVERY_TIMER_MASK) - -#define DCP_CH3OPTS_TOG_RSVD_MASK (0xFFFF0000U) -#define DCP_CH3OPTS_TOG_RSVD_SHIFT (16U) -#define DCP_CH3OPTS_TOG_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_CH3OPTS_TOG_RSVD_SHIFT)) & DCP_CH3OPTS_TOG_RSVD_MASK) -/*! @} */ - -/*! @name DBGSELECT - DCP debug select register */ -/*! @{ */ - -#define DCP_DBGSELECT_INDEX_MASK (0xFFU) -#define DCP_DBGSELECT_INDEX_SHIFT (0U) -/*! INDEX - * 0b00000001..CONTROL - * 0b00010000..OTPKEY0 - * 0b00010001..OTPKEY1 - * 0b00010010..OTPKEY2 - * 0b00010011..OTPKEY3 - */ -#define DCP_DBGSELECT_INDEX(x) (((uint32_t)(((uint32_t)(x)) << DCP_DBGSELECT_INDEX_SHIFT)) & DCP_DBGSELECT_INDEX_MASK) - -#define DCP_DBGSELECT_RSVD_MASK (0xFFFFFF00U) -#define DCP_DBGSELECT_RSVD_SHIFT (8U) -#define DCP_DBGSELECT_RSVD(x) (((uint32_t)(((uint32_t)(x)) << DCP_DBGSELECT_RSVD_SHIFT)) & DCP_DBGSELECT_RSVD_MASK) -/*! @} */ - -/*! @name DBGDATA - DCP debug data register */ -/*! @{ */ - -#define DCP_DBGDATA_DATA_MASK (0xFFFFFFFFU) -#define DCP_DBGDATA_DATA_SHIFT (0U) -#define DCP_DBGDATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << DCP_DBGDATA_DATA_SHIFT)) & DCP_DBGDATA_DATA_MASK) -/*! @} */ - -/*! @name PAGETABLE - DCP page table register */ -/*! @{ */ - -#define DCP_PAGETABLE_ENABLE_MASK (0x1U) -#define DCP_PAGETABLE_ENABLE_SHIFT (0U) -#define DCP_PAGETABLE_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << DCP_PAGETABLE_ENABLE_SHIFT)) & DCP_PAGETABLE_ENABLE_MASK) - -#define DCP_PAGETABLE_FLUSH_MASK (0x2U) -#define DCP_PAGETABLE_FLUSH_SHIFT (1U) -#define DCP_PAGETABLE_FLUSH(x) (((uint32_t)(((uint32_t)(x)) << DCP_PAGETABLE_FLUSH_SHIFT)) & DCP_PAGETABLE_FLUSH_MASK) - -#define DCP_PAGETABLE_BASE_MASK (0xFFFFFFFCU) -#define DCP_PAGETABLE_BASE_SHIFT (2U) -#define DCP_PAGETABLE_BASE(x) (((uint32_t)(((uint32_t)(x)) << DCP_PAGETABLE_BASE_SHIFT)) & DCP_PAGETABLE_BASE_MASK) -/*! @} */ - -/*! @name VERSION - DCP version register */ -/*! @{ */ - -#define DCP_VERSION_STEP_MASK (0xFFFFU) -#define DCP_VERSION_STEP_SHIFT (0U) -#define DCP_VERSION_STEP(x) (((uint32_t)(((uint32_t)(x)) << DCP_VERSION_STEP_SHIFT)) & DCP_VERSION_STEP_MASK) - -#define DCP_VERSION_MINOR_MASK (0xFF0000U) -#define DCP_VERSION_MINOR_SHIFT (16U) -#define DCP_VERSION_MINOR(x) (((uint32_t)(((uint32_t)(x)) << DCP_VERSION_MINOR_SHIFT)) & DCP_VERSION_MINOR_MASK) - -#define DCP_VERSION_MAJOR_MASK (0xFF000000U) -#define DCP_VERSION_MAJOR_SHIFT (24U) -#define DCP_VERSION_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << DCP_VERSION_MAJOR_SHIFT)) & DCP_VERSION_MAJOR_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group DCP_Register_Masks */ - - -/* DCP - Peripheral instance base addresses */ -/** Peripheral DCP base address */ -#define DCP_BASE (0x402FC000u) -/** Peripheral DCP base pointer */ -#define DCP ((DCP_Type *)DCP_BASE) -/** Array initializer of DCP peripheral base addresses */ -#define DCP_BASE_ADDRS { DCP_BASE } -/** Array initializer of DCP peripheral base pointers */ -#define DCP_BASE_PTRS { DCP } -/** Interrupt vectors for the DCP peripheral type */ -#define DCP_IRQS { DCP_IRQn } -#define DCP_VMI_IRQS { DCP_VMI_IRQn } - -/*! - * @} - */ /* end of group DCP_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- DMA Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DMA_Peripheral_Access_Layer DMA Peripheral Access Layer - * @{ - */ - -/** DMA - Register Layout Typedef */ -typedef struct { - __IO uint32_t CR; /**< Control Register, offset: 0x0 */ - __I uint32_t ES; /**< Error Status Register, offset: 0x4 */ - uint8_t RESERVED_0[4]; - __IO uint32_t ERQ; /**< Enable Request Register, offset: 0xC */ - uint8_t RESERVED_1[4]; - __IO uint32_t EEI; /**< Enable Error Interrupt Register, offset: 0x14 */ - __O uint8_t CEEI; /**< Clear Enable Error Interrupt Register, offset: 0x18 */ - __O uint8_t SEEI; /**< Set Enable Error Interrupt Register, offset: 0x19 */ - __O uint8_t CERQ; /**< Clear Enable Request Register, offset: 0x1A */ - __O uint8_t SERQ; /**< Set Enable Request Register, offset: 0x1B */ - __O uint8_t CDNE; /**< Clear DONE Status Bit Register, offset: 0x1C */ - __O uint8_t SSRT; /**< Set START Bit Register, offset: 0x1D */ - __O uint8_t CERR; /**< Clear Error Register, offset: 0x1E */ - __O uint8_t CINT; /**< Clear Interrupt Request Register, offset: 0x1F */ - uint8_t RESERVED_2[4]; - __IO uint32_t INT; /**< Interrupt Request Register, offset: 0x24 */ - uint8_t RESERVED_3[4]; - __IO uint32_t ERR; /**< Error Register, offset: 0x2C */ - uint8_t RESERVED_4[4]; - __I uint32_t HRS; /**< Hardware Request Status Register, offset: 0x34 */ - uint8_t RESERVED_5[12]; - __IO uint32_t EARS; /**< Enable Asynchronous Request in Stop Register, offset: 0x44 */ - uint8_t RESERVED_6[184]; - __IO uint8_t DCHPRI3; /**< Channel n Priority Register, offset: 0x100 */ - __IO uint8_t DCHPRI2; /**< Channel n Priority Register, offset: 0x101 */ - __IO uint8_t DCHPRI1; /**< Channel n Priority Register, offset: 0x102 */ - __IO uint8_t DCHPRI0; /**< Channel n Priority Register, offset: 0x103 */ - __IO uint8_t DCHPRI7; /**< Channel n Priority Register, offset: 0x104 */ - __IO uint8_t DCHPRI6; /**< Channel n Priority Register, offset: 0x105 */ - __IO uint8_t DCHPRI5; /**< Channel n Priority Register, offset: 0x106 */ - __IO uint8_t DCHPRI4; /**< Channel n Priority Register, offset: 0x107 */ - __IO uint8_t DCHPRI11; /**< Channel n Priority Register, offset: 0x108 */ - __IO uint8_t DCHPRI10; /**< Channel n Priority Register, offset: 0x109 */ - __IO uint8_t DCHPRI9; /**< Channel n Priority Register, offset: 0x10A */ - __IO uint8_t DCHPRI8; /**< Channel n Priority Register, offset: 0x10B */ - __IO uint8_t DCHPRI15; /**< Channel n Priority Register, offset: 0x10C */ - __IO uint8_t DCHPRI14; /**< Channel n Priority Register, offset: 0x10D */ - __IO uint8_t DCHPRI13; /**< Channel n Priority Register, offset: 0x10E */ - __IO uint8_t DCHPRI12; /**< Channel n Priority Register, offset: 0x10F */ - __IO uint8_t DCHPRI19; /**< Channel n Priority Register, offset: 0x110 */ - __IO uint8_t DCHPRI18; /**< Channel n Priority Register, offset: 0x111 */ - __IO uint8_t DCHPRI17; /**< Channel n Priority Register, offset: 0x112 */ - __IO uint8_t DCHPRI16; /**< Channel n Priority Register, offset: 0x113 */ - __IO uint8_t DCHPRI23; /**< Channel n Priority Register, offset: 0x114 */ - __IO uint8_t DCHPRI22; /**< Channel n Priority Register, offset: 0x115 */ - __IO uint8_t DCHPRI21; /**< Channel n Priority Register, offset: 0x116 */ - __IO uint8_t DCHPRI20; /**< Channel n Priority Register, offset: 0x117 */ - __IO uint8_t DCHPRI27; /**< Channel n Priority Register, offset: 0x118 */ - __IO uint8_t DCHPRI26; /**< Channel n Priority Register, offset: 0x119 */ - __IO uint8_t DCHPRI25; /**< Channel n Priority Register, offset: 0x11A */ - __IO uint8_t DCHPRI24; /**< Channel n Priority Register, offset: 0x11B */ - __IO uint8_t DCHPRI31; /**< Channel n Priority Register, offset: 0x11C */ - __IO uint8_t DCHPRI30; /**< Channel n Priority Register, offset: 0x11D */ - __IO uint8_t DCHPRI29; /**< Channel n Priority Register, offset: 0x11E */ - __IO uint8_t DCHPRI28; /**< Channel n Priority Register, offset: 0x11F */ - uint8_t RESERVED_7[3808]; - struct { /* offset: 0x1000, array step: 0x20 */ - __IO uint32_t SADDR; /**< TCD Source Address, array offset: 0x1000, array step: 0x20 */ - __IO uint16_t SOFF; /**< TCD Signed Source Address Offset, array offset: 0x1004, array step: 0x20 */ - __IO uint16_t ATTR; /**< TCD Transfer Attributes, array offset: 0x1006, array step: 0x20 */ - union { /* offset: 0x1008, array step: 0x20 */ - __IO uint32_t NBYTES_MLNO; /**< TCD Minor Byte Count (Minor Loop Mapping Disabled), array offset: 0x1008, array step: 0x20 */ - __IO uint32_t NBYTES_MLOFFNO; /**< TCD Signed Minor Loop Offset (Minor Loop Mapping Enabled and Offset Disabled), array offset: 0x1008, array step: 0x20 */ - __IO uint32_t NBYTES_MLOFFYES; /**< TCD Signed Minor Loop Offset (Minor Loop Mapping and Offset Enabled), array offset: 0x1008, array step: 0x20 */ - }; - __IO int32_t SLAST; /**< TCD Last Source Address Adjustment, array offset: 0x100C, array step: 0x20 */ - __IO uint32_t DADDR; /**< TCD Destination Address, array offset: 0x1010, array step: 0x20 */ - __IO uint16_t DOFF; /**< TCD Signed Destination Address Offset, array offset: 0x1014, array step: 0x20 */ - union { /* offset: 0x1016, array step: 0x20 */ - __IO uint16_t CITER_ELINKNO; /**< TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled), array offset: 0x1016, array step: 0x20 */ - __IO uint16_t CITER_ELINKYES; /**< TCD Current Minor Loop Link, Major Loop Count (Channel Linking Enabled), array offset: 0x1016, array step: 0x20 */ - }; - __IO int32_t DLAST_SGA; /**< TCD Last Destination Address Adjustment/Scatter Gather Address, array offset: 0x1018, array step: 0x20 */ - __IO uint16_t CSR; /**< TCD Control and Status, array offset: 0x101C, array step: 0x20 */ - union { /* offset: 0x101E, array step: 0x20 */ - __IO uint16_t BITER_ELINKNO; /**< TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Disabled), array offset: 0x101E, array step: 0x20 */ - __IO uint16_t BITER_ELINKYES; /**< TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Enabled), array offset: 0x101E, array step: 0x20 */ - }; - } TCD[32]; -} DMA_Type; - -/* ---------------------------------------------------------------------------- - -- DMA Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DMA_Register_Masks DMA Register Masks - * @{ - */ - -/*! @name CR - Control Register */ -/*! @{ */ - -#define DMA_CR_EDBG_MASK (0x2U) -#define DMA_CR_EDBG_SHIFT (1U) -/*! EDBG - Enable Debug - * 0b0..When in debug mode, the DMA continues to operate. - * 0b1..When in debug mode, the DMA stalls the start of a new channel. Executing channels are allowed to - * complete. Channel execution resumes when the system exits debug mode or the EDBG bit is cleared. - */ -#define DMA_CR_EDBG(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_EDBG_SHIFT)) & DMA_CR_EDBG_MASK) - -#define DMA_CR_ERCA_MASK (0x4U) -#define DMA_CR_ERCA_SHIFT (2U) -/*! ERCA - Enable Round Robin Channel Arbitration - * 0b0..Fixed priority arbitration is used for channel selection within each group. - * 0b1..Round robin arbitration is used for channel selection within each group. - */ -#define DMA_CR_ERCA(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_ERCA_SHIFT)) & DMA_CR_ERCA_MASK) - -#define DMA_CR_ERGA_MASK (0x8U) -#define DMA_CR_ERGA_SHIFT (3U) -/*! ERGA - Enable Round Robin Group Arbitration - * 0b0..Fixed priority arbitration is used for selection among the groups. - * 0b1..Round robin arbitration is used for selection among the groups. - */ -#define DMA_CR_ERGA(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_ERGA_SHIFT)) & DMA_CR_ERGA_MASK) - -#define DMA_CR_HOE_MASK (0x10U) -#define DMA_CR_HOE_SHIFT (4U) -/*! HOE - Halt On Error - * 0b0..Normal operation - * 0b1..Any error causes the HALT bit to set. Subsequently, all service requests are ignored until the HALT bit is cleared. - */ -#define DMA_CR_HOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_HOE_SHIFT)) & DMA_CR_HOE_MASK) - -#define DMA_CR_HALT_MASK (0x20U) -#define DMA_CR_HALT_SHIFT (5U) -/*! HALT - Halt DMA Operations - * 0b0..Normal operation - * 0b1..Stall the start of any new channels. Executing channels are allowed to complete. Channel execution resumes when this bit is cleared. - */ -#define DMA_CR_HALT(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_HALT_SHIFT)) & DMA_CR_HALT_MASK) - -#define DMA_CR_CLM_MASK (0x40U) -#define DMA_CR_CLM_SHIFT (6U) -/*! CLM - Continuous Link Mode - * 0b0..A minor loop channel link made to itself goes through channel arbitration before being activated again. - * 0b1..A minor loop channel link made to itself does not go through channel arbitration before being activated - * again. Upon minor loop completion, the channel activates again if that channel has a minor loop channel - * link enabled and the link channel is itself. This effectively applies the minor loop offsets and restarts the - * next minor loop. - */ -#define DMA_CR_CLM(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_CLM_SHIFT)) & DMA_CR_CLM_MASK) - -#define DMA_CR_EMLM_MASK (0x80U) -#define DMA_CR_EMLM_SHIFT (7U) -/*! EMLM - Enable Minor Loop Mapping - * 0b0..Disabled. TCDn.word2 is defined as a 32-bit NBYTES field. - * 0b1..Enabled. TCDn.word2 is redefined to include individual enable fields, an offset field, and the NBYTES - * field. The individual enable fields allow the minor loop offset to be applied to the source address, the - * destination address, or both. The NBYTES field is reduced when either offset is enabled. - */ -#define DMA_CR_EMLM(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_EMLM_SHIFT)) & DMA_CR_EMLM_MASK) - -#define DMA_CR_GRP0PRI_MASK (0x100U) -#define DMA_CR_GRP0PRI_SHIFT (8U) -/*! GRP0PRI - Channel Group 0 Priority - */ -#define DMA_CR_GRP0PRI(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_GRP0PRI_SHIFT)) & DMA_CR_GRP0PRI_MASK) - -#define DMA_CR_GRP1PRI_MASK (0x400U) -#define DMA_CR_GRP1PRI_SHIFT (10U) -/*! GRP1PRI - Channel Group 1 Priority - */ -#define DMA_CR_GRP1PRI(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_GRP1PRI_SHIFT)) & DMA_CR_GRP1PRI_MASK) - -#define DMA_CR_ECX_MASK (0x10000U) -#define DMA_CR_ECX_SHIFT (16U) -/*! ECX - Error Cancel Transfer - * 0b0..Normal operation - * 0b1..Cancel the remaining data transfer in the same fashion as the CX bit. Stop the executing channel and - * force the minor loop to finish. The cancel takes effect after the last write of the current read/write - * sequence. The ECX bit clears itself after the cancel is honored. In addition to cancelling the transfer, ECX - * treats the cancel as an error condition, thus updating the Error Status register (DMAx_ES) and generating an - * optional error interrupt. - */ -#define DMA_CR_ECX(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_ECX_SHIFT)) & DMA_CR_ECX_MASK) - -#define DMA_CR_CX_MASK (0x20000U) -#define DMA_CR_CX_SHIFT (17U) -/*! CX - Cancel Transfer - * 0b0..Normal operation - * 0b1..Cancel the remaining data transfer. Stop the executing channel and force the minor loop to finish. The - * cancel takes effect after the last write of the current read/write sequence. The CX bit clears itself after - * the cancel has been honored. This cancel retires the channel normally as if the minor loop was completed. - */ -#define DMA_CR_CX(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_CX_SHIFT)) & DMA_CR_CX_MASK) - -#define DMA_CR_ACTIVE_MASK (0x80000000U) -#define DMA_CR_ACTIVE_SHIFT (31U) -/*! ACTIVE - DMA Active Status - * 0b0..eDMA is idle. - * 0b1..eDMA is executing a channel. - */ -#define DMA_CR_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CR_ACTIVE_SHIFT)) & DMA_CR_ACTIVE_MASK) -/*! @} */ - -/*! @name ES - Error Status Register */ -/*! @{ */ - -#define DMA_ES_DBE_MASK (0x1U) -#define DMA_ES_DBE_SHIFT (0U) -/*! DBE - Destination Bus Error - * 0b0..No destination bus error - * 0b1..The last recorded error was a bus error on a destination write - */ -#define DMA_ES_DBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_DBE_SHIFT)) & DMA_ES_DBE_MASK) - -#define DMA_ES_SBE_MASK (0x2U) -#define DMA_ES_SBE_SHIFT (1U) -/*! SBE - Source Bus Error - * 0b0..No source bus error - * 0b1..The last recorded error was a bus error on a source read - */ -#define DMA_ES_SBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_SBE_SHIFT)) & DMA_ES_SBE_MASK) - -#define DMA_ES_SGE_MASK (0x4U) -#define DMA_ES_SGE_SHIFT (2U) -/*! SGE - Scatter/Gather Configuration Error - * 0b0..No scatter/gather configuration error - * 0b1..The last recorded error was a configuration error detected in the TCDn_DLASTSGA field. This field is - * checked at the beginning of a scatter/gather operation after major loop completion if TCDn_CSR[ESG] is - * enabled. TCDn_DLASTSGA is not on a 32 byte boundary. - */ -#define DMA_ES_SGE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_SGE_SHIFT)) & DMA_ES_SGE_MASK) - -#define DMA_ES_NCE_MASK (0x8U) -#define DMA_ES_NCE_SHIFT (3U) -/*! NCE - NBYTES/CITER Configuration Error - * 0b0..No NBYTES/CITER configuration error - * 0b1..The last recorded error was a configuration error detected in the TCDn_NBYTES or TCDn_CITER fields. - * TCDn_NBYTES is not a multiple of TCDn_ATTR[SSIZE] and TCDn_ATTR[DSIZE], or TCDn_CITER[CITER] is equal to zero, - * or TCDn_CITER[ELINK] is not equal to TCDn_BITER[ELINK] - */ -#define DMA_ES_NCE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_NCE_SHIFT)) & DMA_ES_NCE_MASK) - -#define DMA_ES_DOE_MASK (0x10U) -#define DMA_ES_DOE_SHIFT (4U) -/*! DOE - Destination Offset Error - * 0b0..No destination offset configuration error - * 0b1..The last recorded error was a configuration error detected in the TCDn_DOFF field. TCDn_DOFF is inconsistent with TCDn_ATTR[DSIZE]. - */ -#define DMA_ES_DOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_DOE_SHIFT)) & DMA_ES_DOE_MASK) - -#define DMA_ES_DAE_MASK (0x20U) -#define DMA_ES_DAE_SHIFT (5U) -/*! DAE - Destination Address Error - * 0b0..No destination address configuration error - * 0b1..The last recorded error was a configuration error detected in the TCDn_DADDR field. TCDn_DADDR is inconsistent with TCDn_ATTR[DSIZE]. - */ -#define DMA_ES_DAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_DAE_SHIFT)) & DMA_ES_DAE_MASK) - -#define DMA_ES_SOE_MASK (0x40U) -#define DMA_ES_SOE_SHIFT (6U) -/*! SOE - Source Offset Error - * 0b0..No source offset configuration error - * 0b1..The last recorded error was a configuration error detected in the TCDn_SOFF field. TCDn_SOFF is inconsistent with TCDn_ATTR[SSIZE]. - */ -#define DMA_ES_SOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_SOE_SHIFT)) & DMA_ES_SOE_MASK) - -#define DMA_ES_SAE_MASK (0x80U) -#define DMA_ES_SAE_SHIFT (7U) -/*! SAE - Source Address Error - * 0b0..No source address configuration error. - * 0b1..The last recorded error was a configuration error detected in the TCDn_SADDR field. TCDn_SADDR is inconsistent with TCDn_ATTR[SSIZE]. - */ -#define DMA_ES_SAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_SAE_SHIFT)) & DMA_ES_SAE_MASK) - -#define DMA_ES_ERRCHN_MASK (0x1F00U) -#define DMA_ES_ERRCHN_SHIFT (8U) -/*! ERRCHN - Error Channel Number or Canceled Channel Number - */ -#define DMA_ES_ERRCHN(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_ERRCHN_SHIFT)) & DMA_ES_ERRCHN_MASK) - -#define DMA_ES_CPE_MASK (0x4000U) -#define DMA_ES_CPE_SHIFT (14U) -/*! CPE - Channel Priority Error - * 0b0..No channel priority error - * 0b1..The last recorded error was a configuration error in the channel priorities within a group. Channel - * priorities within a group are not unique. - */ -#define DMA_ES_CPE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_CPE_SHIFT)) & DMA_ES_CPE_MASK) - -#define DMA_ES_GPE_MASK (0x8000U) -#define DMA_ES_GPE_SHIFT (15U) -/*! GPE - Group Priority Error - * 0b0..No group priority error - * 0b1..The last recorded error was a configuration error among the group priorities. All group priorities are not unique. - */ -#define DMA_ES_GPE(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_GPE_SHIFT)) & DMA_ES_GPE_MASK) - -#define DMA_ES_ECX_MASK (0x10000U) -#define DMA_ES_ECX_SHIFT (16U) -/*! ECX - Transfer Canceled - * 0b0..No canceled transfers - * 0b1..The last recorded entry was a canceled transfer by the error cancel transfer input - */ -#define DMA_ES_ECX(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_ECX_SHIFT)) & DMA_ES_ECX_MASK) - -#define DMA_ES_VLD_MASK (0x80000000U) -#define DMA_ES_VLD_SHIFT (31U) -/*! VLD - VLD - * 0b0..No ERR bits are set. - * 0b1..At least one ERR bit is set indicating a valid error exists that has not been cleared. - */ -#define DMA_ES_VLD(x) (((uint32_t)(((uint32_t)(x)) << DMA_ES_VLD_SHIFT)) & DMA_ES_VLD_MASK) -/*! @} */ - -/*! @name ERQ - Enable Request Register */ -/*! @{ */ - -#define DMA_ERQ_ERQ0_MASK (0x1U) -#define DMA_ERQ_ERQ0_SHIFT (0U) -/*! ERQ0 - Enable DMA Request 0 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ0(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ0_SHIFT)) & DMA_ERQ_ERQ0_MASK) - -#define DMA_ERQ_ERQ1_MASK (0x2U) -#define DMA_ERQ_ERQ1_SHIFT (1U) -/*! ERQ1 - Enable DMA Request 1 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ1(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ1_SHIFT)) & DMA_ERQ_ERQ1_MASK) - -#define DMA_ERQ_ERQ2_MASK (0x4U) -#define DMA_ERQ_ERQ2_SHIFT (2U) -/*! ERQ2 - Enable DMA Request 2 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ2(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ2_SHIFT)) & DMA_ERQ_ERQ2_MASK) - -#define DMA_ERQ_ERQ3_MASK (0x8U) -#define DMA_ERQ_ERQ3_SHIFT (3U) -/*! ERQ3 - Enable DMA Request 3 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ3(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ3_SHIFT)) & DMA_ERQ_ERQ3_MASK) - -#define DMA_ERQ_ERQ4_MASK (0x10U) -#define DMA_ERQ_ERQ4_SHIFT (4U) -/*! ERQ4 - Enable DMA Request 4 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ4(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ4_SHIFT)) & DMA_ERQ_ERQ4_MASK) - -#define DMA_ERQ_ERQ5_MASK (0x20U) -#define DMA_ERQ_ERQ5_SHIFT (5U) -/*! ERQ5 - Enable DMA Request 5 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ5(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ5_SHIFT)) & DMA_ERQ_ERQ5_MASK) - -#define DMA_ERQ_ERQ6_MASK (0x40U) -#define DMA_ERQ_ERQ6_SHIFT (6U) -/*! ERQ6 - Enable DMA Request 6 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ6(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ6_SHIFT)) & DMA_ERQ_ERQ6_MASK) - -#define DMA_ERQ_ERQ7_MASK (0x80U) -#define DMA_ERQ_ERQ7_SHIFT (7U) -/*! ERQ7 - Enable DMA Request 7 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ7(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ7_SHIFT)) & DMA_ERQ_ERQ7_MASK) - -#define DMA_ERQ_ERQ8_MASK (0x100U) -#define DMA_ERQ_ERQ8_SHIFT (8U) -/*! ERQ8 - Enable DMA Request 8 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ8(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ8_SHIFT)) & DMA_ERQ_ERQ8_MASK) - -#define DMA_ERQ_ERQ9_MASK (0x200U) -#define DMA_ERQ_ERQ9_SHIFT (9U) -/*! ERQ9 - Enable DMA Request 9 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ9(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ9_SHIFT)) & DMA_ERQ_ERQ9_MASK) - -#define DMA_ERQ_ERQ10_MASK (0x400U) -#define DMA_ERQ_ERQ10_SHIFT (10U) -/*! ERQ10 - Enable DMA Request 10 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ10(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ10_SHIFT)) & DMA_ERQ_ERQ10_MASK) - -#define DMA_ERQ_ERQ11_MASK (0x800U) -#define DMA_ERQ_ERQ11_SHIFT (11U) -/*! ERQ11 - Enable DMA Request 11 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ11(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ11_SHIFT)) & DMA_ERQ_ERQ11_MASK) - -#define DMA_ERQ_ERQ12_MASK (0x1000U) -#define DMA_ERQ_ERQ12_SHIFT (12U) -/*! ERQ12 - Enable DMA Request 12 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ12(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ12_SHIFT)) & DMA_ERQ_ERQ12_MASK) - -#define DMA_ERQ_ERQ13_MASK (0x2000U) -#define DMA_ERQ_ERQ13_SHIFT (13U) -/*! ERQ13 - Enable DMA Request 13 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ13(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ13_SHIFT)) & DMA_ERQ_ERQ13_MASK) - -#define DMA_ERQ_ERQ14_MASK (0x4000U) -#define DMA_ERQ_ERQ14_SHIFT (14U) -/*! ERQ14 - Enable DMA Request 14 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ14(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ14_SHIFT)) & DMA_ERQ_ERQ14_MASK) - -#define DMA_ERQ_ERQ15_MASK (0x8000U) -#define DMA_ERQ_ERQ15_SHIFT (15U) -/*! ERQ15 - Enable DMA Request 15 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ15(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ15_SHIFT)) & DMA_ERQ_ERQ15_MASK) - -#define DMA_ERQ_ERQ16_MASK (0x10000U) -#define DMA_ERQ_ERQ16_SHIFT (16U) -/*! ERQ16 - Enable DMA Request 16 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ16(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ16_SHIFT)) & DMA_ERQ_ERQ16_MASK) - -#define DMA_ERQ_ERQ17_MASK (0x20000U) -#define DMA_ERQ_ERQ17_SHIFT (17U) -/*! ERQ17 - Enable DMA Request 17 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ17(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ17_SHIFT)) & DMA_ERQ_ERQ17_MASK) - -#define DMA_ERQ_ERQ18_MASK (0x40000U) -#define DMA_ERQ_ERQ18_SHIFT (18U) -/*! ERQ18 - Enable DMA Request 18 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ18(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ18_SHIFT)) & DMA_ERQ_ERQ18_MASK) - -#define DMA_ERQ_ERQ19_MASK (0x80000U) -#define DMA_ERQ_ERQ19_SHIFT (19U) -/*! ERQ19 - Enable DMA Request 19 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ19(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ19_SHIFT)) & DMA_ERQ_ERQ19_MASK) - -#define DMA_ERQ_ERQ20_MASK (0x100000U) -#define DMA_ERQ_ERQ20_SHIFT (20U) -/*! ERQ20 - Enable DMA Request 20 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ20(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ20_SHIFT)) & DMA_ERQ_ERQ20_MASK) - -#define DMA_ERQ_ERQ21_MASK (0x200000U) -#define DMA_ERQ_ERQ21_SHIFT (21U) -/*! ERQ21 - Enable DMA Request 21 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ21(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ21_SHIFT)) & DMA_ERQ_ERQ21_MASK) - -#define DMA_ERQ_ERQ22_MASK (0x400000U) -#define DMA_ERQ_ERQ22_SHIFT (22U) -/*! ERQ22 - Enable DMA Request 22 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ22(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ22_SHIFT)) & DMA_ERQ_ERQ22_MASK) - -#define DMA_ERQ_ERQ23_MASK (0x800000U) -#define DMA_ERQ_ERQ23_SHIFT (23U) -/*! ERQ23 - Enable DMA Request 23 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ23(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ23_SHIFT)) & DMA_ERQ_ERQ23_MASK) - -#define DMA_ERQ_ERQ24_MASK (0x1000000U) -#define DMA_ERQ_ERQ24_SHIFT (24U) -/*! ERQ24 - Enable DMA Request 24 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ24(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ24_SHIFT)) & DMA_ERQ_ERQ24_MASK) - -#define DMA_ERQ_ERQ25_MASK (0x2000000U) -#define DMA_ERQ_ERQ25_SHIFT (25U) -/*! ERQ25 - Enable DMA Request 25 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ25(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ25_SHIFT)) & DMA_ERQ_ERQ25_MASK) - -#define DMA_ERQ_ERQ26_MASK (0x4000000U) -#define DMA_ERQ_ERQ26_SHIFT (26U) -/*! ERQ26 - Enable DMA Request 26 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ26(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ26_SHIFT)) & DMA_ERQ_ERQ26_MASK) - -#define DMA_ERQ_ERQ27_MASK (0x8000000U) -#define DMA_ERQ_ERQ27_SHIFT (27U) -/*! ERQ27 - Enable DMA Request 27 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ27(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ27_SHIFT)) & DMA_ERQ_ERQ27_MASK) - -#define DMA_ERQ_ERQ28_MASK (0x10000000U) -#define DMA_ERQ_ERQ28_SHIFT (28U) -/*! ERQ28 - Enable DMA Request 28 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ28(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ28_SHIFT)) & DMA_ERQ_ERQ28_MASK) - -#define DMA_ERQ_ERQ29_MASK (0x20000000U) -#define DMA_ERQ_ERQ29_SHIFT (29U) -/*! ERQ29 - Enable DMA Request 29 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ29(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ29_SHIFT)) & DMA_ERQ_ERQ29_MASK) - -#define DMA_ERQ_ERQ30_MASK (0x40000000U) -#define DMA_ERQ_ERQ30_SHIFT (30U) -/*! ERQ30 - Enable DMA Request 30 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ30(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ30_SHIFT)) & DMA_ERQ_ERQ30_MASK) - -#define DMA_ERQ_ERQ31_MASK (0x80000000U) -#define DMA_ERQ_ERQ31_SHIFT (31U) -/*! ERQ31 - Enable DMA Request 31 - * 0b0..The DMA request signal for the corresponding channel is disabled - * 0b1..The DMA request signal for the corresponding channel is enabled - */ -#define DMA_ERQ_ERQ31(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERQ_ERQ31_SHIFT)) & DMA_ERQ_ERQ31_MASK) -/*! @} */ - -/*! @name EEI - Enable Error Interrupt Register */ -/*! @{ */ - -#define DMA_EEI_EEI0_MASK (0x1U) -#define DMA_EEI_EEI0_SHIFT (0U) -/*! EEI0 - Enable Error Interrupt 0 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI0(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI0_SHIFT)) & DMA_EEI_EEI0_MASK) - -#define DMA_EEI_EEI1_MASK (0x2U) -#define DMA_EEI_EEI1_SHIFT (1U) -/*! EEI1 - Enable Error Interrupt 1 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI1(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI1_SHIFT)) & DMA_EEI_EEI1_MASK) - -#define DMA_EEI_EEI2_MASK (0x4U) -#define DMA_EEI_EEI2_SHIFT (2U) -/*! EEI2 - Enable Error Interrupt 2 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI2(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI2_SHIFT)) & DMA_EEI_EEI2_MASK) - -#define DMA_EEI_EEI3_MASK (0x8U) -#define DMA_EEI_EEI3_SHIFT (3U) -/*! EEI3 - Enable Error Interrupt 3 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI3(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI3_SHIFT)) & DMA_EEI_EEI3_MASK) - -#define DMA_EEI_EEI4_MASK (0x10U) -#define DMA_EEI_EEI4_SHIFT (4U) -/*! EEI4 - Enable Error Interrupt 4 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI4(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI4_SHIFT)) & DMA_EEI_EEI4_MASK) - -#define DMA_EEI_EEI5_MASK (0x20U) -#define DMA_EEI_EEI5_SHIFT (5U) -/*! EEI5 - Enable Error Interrupt 5 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI5(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI5_SHIFT)) & DMA_EEI_EEI5_MASK) - -#define DMA_EEI_EEI6_MASK (0x40U) -#define DMA_EEI_EEI6_SHIFT (6U) -/*! EEI6 - Enable Error Interrupt 6 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI6(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI6_SHIFT)) & DMA_EEI_EEI6_MASK) - -#define DMA_EEI_EEI7_MASK (0x80U) -#define DMA_EEI_EEI7_SHIFT (7U) -/*! EEI7 - Enable Error Interrupt 7 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI7(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI7_SHIFT)) & DMA_EEI_EEI7_MASK) - -#define DMA_EEI_EEI8_MASK (0x100U) -#define DMA_EEI_EEI8_SHIFT (8U) -/*! EEI8 - Enable Error Interrupt 8 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI8(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI8_SHIFT)) & DMA_EEI_EEI8_MASK) - -#define DMA_EEI_EEI9_MASK (0x200U) -#define DMA_EEI_EEI9_SHIFT (9U) -/*! EEI9 - Enable Error Interrupt 9 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI9(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI9_SHIFT)) & DMA_EEI_EEI9_MASK) - -#define DMA_EEI_EEI10_MASK (0x400U) -#define DMA_EEI_EEI10_SHIFT (10U) -/*! EEI10 - Enable Error Interrupt 10 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI10(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI10_SHIFT)) & DMA_EEI_EEI10_MASK) - -#define DMA_EEI_EEI11_MASK (0x800U) -#define DMA_EEI_EEI11_SHIFT (11U) -/*! EEI11 - Enable Error Interrupt 11 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI11(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI11_SHIFT)) & DMA_EEI_EEI11_MASK) - -#define DMA_EEI_EEI12_MASK (0x1000U) -#define DMA_EEI_EEI12_SHIFT (12U) -/*! EEI12 - Enable Error Interrupt 12 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI12(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI12_SHIFT)) & DMA_EEI_EEI12_MASK) - -#define DMA_EEI_EEI13_MASK (0x2000U) -#define DMA_EEI_EEI13_SHIFT (13U) -/*! EEI13 - Enable Error Interrupt 13 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI13(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI13_SHIFT)) & DMA_EEI_EEI13_MASK) - -#define DMA_EEI_EEI14_MASK (0x4000U) -#define DMA_EEI_EEI14_SHIFT (14U) -/*! EEI14 - Enable Error Interrupt 14 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI14(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI14_SHIFT)) & DMA_EEI_EEI14_MASK) - -#define DMA_EEI_EEI15_MASK (0x8000U) -#define DMA_EEI_EEI15_SHIFT (15U) -/*! EEI15 - Enable Error Interrupt 15 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI15(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI15_SHIFT)) & DMA_EEI_EEI15_MASK) - -#define DMA_EEI_EEI16_MASK (0x10000U) -#define DMA_EEI_EEI16_SHIFT (16U) -/*! EEI16 - Enable Error Interrupt 16 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI16(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI16_SHIFT)) & DMA_EEI_EEI16_MASK) - -#define DMA_EEI_EEI17_MASK (0x20000U) -#define DMA_EEI_EEI17_SHIFT (17U) -/*! EEI17 - Enable Error Interrupt 17 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI17(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI17_SHIFT)) & DMA_EEI_EEI17_MASK) - -#define DMA_EEI_EEI18_MASK (0x40000U) -#define DMA_EEI_EEI18_SHIFT (18U) -/*! EEI18 - Enable Error Interrupt 18 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI18(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI18_SHIFT)) & DMA_EEI_EEI18_MASK) - -#define DMA_EEI_EEI19_MASK (0x80000U) -#define DMA_EEI_EEI19_SHIFT (19U) -/*! EEI19 - Enable Error Interrupt 19 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI19(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI19_SHIFT)) & DMA_EEI_EEI19_MASK) - -#define DMA_EEI_EEI20_MASK (0x100000U) -#define DMA_EEI_EEI20_SHIFT (20U) -/*! EEI20 - Enable Error Interrupt 20 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI20(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI20_SHIFT)) & DMA_EEI_EEI20_MASK) - -#define DMA_EEI_EEI21_MASK (0x200000U) -#define DMA_EEI_EEI21_SHIFT (21U) -/*! EEI21 - Enable Error Interrupt 21 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI21(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI21_SHIFT)) & DMA_EEI_EEI21_MASK) - -#define DMA_EEI_EEI22_MASK (0x400000U) -#define DMA_EEI_EEI22_SHIFT (22U) -/*! EEI22 - Enable Error Interrupt 22 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI22(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI22_SHIFT)) & DMA_EEI_EEI22_MASK) - -#define DMA_EEI_EEI23_MASK (0x800000U) -#define DMA_EEI_EEI23_SHIFT (23U) -/*! EEI23 - Enable Error Interrupt 23 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI23(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI23_SHIFT)) & DMA_EEI_EEI23_MASK) - -#define DMA_EEI_EEI24_MASK (0x1000000U) -#define DMA_EEI_EEI24_SHIFT (24U) -/*! EEI24 - Enable Error Interrupt 24 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI24(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI24_SHIFT)) & DMA_EEI_EEI24_MASK) - -#define DMA_EEI_EEI25_MASK (0x2000000U) -#define DMA_EEI_EEI25_SHIFT (25U) -/*! EEI25 - Enable Error Interrupt 25 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI25(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI25_SHIFT)) & DMA_EEI_EEI25_MASK) - -#define DMA_EEI_EEI26_MASK (0x4000000U) -#define DMA_EEI_EEI26_SHIFT (26U) -/*! EEI26 - Enable Error Interrupt 26 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI26(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI26_SHIFT)) & DMA_EEI_EEI26_MASK) - -#define DMA_EEI_EEI27_MASK (0x8000000U) -#define DMA_EEI_EEI27_SHIFT (27U) -/*! EEI27 - Enable Error Interrupt 27 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI27(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI27_SHIFT)) & DMA_EEI_EEI27_MASK) - -#define DMA_EEI_EEI28_MASK (0x10000000U) -#define DMA_EEI_EEI28_SHIFT (28U) -/*! EEI28 - Enable Error Interrupt 28 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI28(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI28_SHIFT)) & DMA_EEI_EEI28_MASK) - -#define DMA_EEI_EEI29_MASK (0x20000000U) -#define DMA_EEI_EEI29_SHIFT (29U) -/*! EEI29 - Enable Error Interrupt 29 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI29(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI29_SHIFT)) & DMA_EEI_EEI29_MASK) - -#define DMA_EEI_EEI30_MASK (0x40000000U) -#define DMA_EEI_EEI30_SHIFT (30U) -/*! EEI30 - Enable Error Interrupt 30 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI30(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI30_SHIFT)) & DMA_EEI_EEI30_MASK) - -#define DMA_EEI_EEI31_MASK (0x80000000U) -#define DMA_EEI_EEI31_SHIFT (31U) -/*! EEI31 - Enable Error Interrupt 31 - * 0b0..The error signal for corresponding channel does not generate an error interrupt - * 0b1..The assertion of the error signal for corresponding channel generates an error interrupt request - */ -#define DMA_EEI_EEI31(x) (((uint32_t)(((uint32_t)(x)) << DMA_EEI_EEI31_SHIFT)) & DMA_EEI_EEI31_MASK) -/*! @} */ - -/*! @name CEEI - Clear Enable Error Interrupt Register */ -/*! @{ */ - -#define DMA_CEEI_CEEI_MASK (0x1FU) -#define DMA_CEEI_CEEI_SHIFT (0U) -/*! CEEI - Clear Enable Error Interrupt - */ -#define DMA_CEEI_CEEI(x) (((uint8_t)(((uint8_t)(x)) << DMA_CEEI_CEEI_SHIFT)) & DMA_CEEI_CEEI_MASK) - -#define DMA_CEEI_CAEE_MASK (0x40U) -#define DMA_CEEI_CAEE_SHIFT (6U) -/*! CAEE - Clear All Enable Error Interrupts - * 0b0..Clear only the EEI bit specified in the CEEI field - * 0b1..Clear all bits in EEI - */ -#define DMA_CEEI_CAEE(x) (((uint8_t)(((uint8_t)(x)) << DMA_CEEI_CAEE_SHIFT)) & DMA_CEEI_CAEE_MASK) - -#define DMA_CEEI_NOP_MASK (0x80U) -#define DMA_CEEI_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_CEEI_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_CEEI_NOP_SHIFT)) & DMA_CEEI_NOP_MASK) -/*! @} */ - -/*! @name SEEI - Set Enable Error Interrupt Register */ -/*! @{ */ - -#define DMA_SEEI_SEEI_MASK (0x1FU) -#define DMA_SEEI_SEEI_SHIFT (0U) -/*! SEEI - Set Enable Error Interrupt - */ -#define DMA_SEEI_SEEI(x) (((uint8_t)(((uint8_t)(x)) << DMA_SEEI_SEEI_SHIFT)) & DMA_SEEI_SEEI_MASK) - -#define DMA_SEEI_SAEE_MASK (0x40U) -#define DMA_SEEI_SAEE_SHIFT (6U) -/*! SAEE - Sets All Enable Error Interrupts - * 0b0..Set only the EEI bit specified in the SEEI field. - * 0b1..Sets all bits in EEI - */ -#define DMA_SEEI_SAEE(x) (((uint8_t)(((uint8_t)(x)) << DMA_SEEI_SAEE_SHIFT)) & DMA_SEEI_SAEE_MASK) - -#define DMA_SEEI_NOP_MASK (0x80U) -#define DMA_SEEI_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_SEEI_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_SEEI_NOP_SHIFT)) & DMA_SEEI_NOP_MASK) -/*! @} */ - -/*! @name CERQ - Clear Enable Request Register */ -/*! @{ */ - -#define DMA_CERQ_CERQ_MASK (0x1FU) -#define DMA_CERQ_CERQ_SHIFT (0U) -/*! CERQ - Clear Enable Request - */ -#define DMA_CERQ_CERQ(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERQ_CERQ_SHIFT)) & DMA_CERQ_CERQ_MASK) - -#define DMA_CERQ_CAER_MASK (0x40U) -#define DMA_CERQ_CAER_SHIFT (6U) -/*! CAER - Clear All Enable Requests - * 0b0..Clear only the ERQ bit specified in the CERQ field - * 0b1..Clear all bits in ERQ - */ -#define DMA_CERQ_CAER(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERQ_CAER_SHIFT)) & DMA_CERQ_CAER_MASK) - -#define DMA_CERQ_NOP_MASK (0x80U) -#define DMA_CERQ_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_CERQ_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERQ_NOP_SHIFT)) & DMA_CERQ_NOP_MASK) -/*! @} */ - -/*! @name SERQ - Set Enable Request Register */ -/*! @{ */ - -#define DMA_SERQ_SERQ_MASK (0x1FU) -#define DMA_SERQ_SERQ_SHIFT (0U) -/*! SERQ - Set Enable Request - */ -#define DMA_SERQ_SERQ(x) (((uint8_t)(((uint8_t)(x)) << DMA_SERQ_SERQ_SHIFT)) & DMA_SERQ_SERQ_MASK) - -#define DMA_SERQ_SAER_MASK (0x40U) -#define DMA_SERQ_SAER_SHIFT (6U) -/*! SAER - Set All Enable Requests - * 0b0..Set only the ERQ bit specified in the SERQ field - * 0b1..Set all bits in ERQ - */ -#define DMA_SERQ_SAER(x) (((uint8_t)(((uint8_t)(x)) << DMA_SERQ_SAER_SHIFT)) & DMA_SERQ_SAER_MASK) - -#define DMA_SERQ_NOP_MASK (0x80U) -#define DMA_SERQ_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_SERQ_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_SERQ_NOP_SHIFT)) & DMA_SERQ_NOP_MASK) -/*! @} */ - -/*! @name CDNE - Clear DONE Status Bit Register */ -/*! @{ */ - -#define DMA_CDNE_CDNE_MASK (0x1FU) -#define DMA_CDNE_CDNE_SHIFT (0U) -/*! CDNE - Clear DONE Bit - */ -#define DMA_CDNE_CDNE(x) (((uint8_t)(((uint8_t)(x)) << DMA_CDNE_CDNE_SHIFT)) & DMA_CDNE_CDNE_MASK) - -#define DMA_CDNE_CADN_MASK (0x40U) -#define DMA_CDNE_CADN_SHIFT (6U) -/*! CADN - Clears All DONE Bits - * 0b0..Clears only the TCDn_CSR[DONE] bit specified in the CDNE field - * 0b1..Clears all bits in TCDn_CSR[DONE] - */ -#define DMA_CDNE_CADN(x) (((uint8_t)(((uint8_t)(x)) << DMA_CDNE_CADN_SHIFT)) & DMA_CDNE_CADN_MASK) - -#define DMA_CDNE_NOP_MASK (0x80U) -#define DMA_CDNE_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_CDNE_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_CDNE_NOP_SHIFT)) & DMA_CDNE_NOP_MASK) -/*! @} */ - -/*! @name SSRT - Set START Bit Register */ -/*! @{ */ - -#define DMA_SSRT_SSRT_MASK (0x1FU) -#define DMA_SSRT_SSRT_SHIFT (0U) -/*! SSRT - Set START Bit - */ -#define DMA_SSRT_SSRT(x) (((uint8_t)(((uint8_t)(x)) << DMA_SSRT_SSRT_SHIFT)) & DMA_SSRT_SSRT_MASK) - -#define DMA_SSRT_SAST_MASK (0x40U) -#define DMA_SSRT_SAST_SHIFT (6U) -/*! SAST - Set All START Bits (activates all channels) - * 0b0..Set only the TCDn_CSR[START] bit specified in the SSRT field - * 0b1..Set all bits in TCDn_CSR[START] - */ -#define DMA_SSRT_SAST(x) (((uint8_t)(((uint8_t)(x)) << DMA_SSRT_SAST_SHIFT)) & DMA_SSRT_SAST_MASK) - -#define DMA_SSRT_NOP_MASK (0x80U) -#define DMA_SSRT_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_SSRT_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_SSRT_NOP_SHIFT)) & DMA_SSRT_NOP_MASK) -/*! @} */ - -/*! @name CERR - Clear Error Register */ -/*! @{ */ - -#define DMA_CERR_CERR_MASK (0x1FU) -#define DMA_CERR_CERR_SHIFT (0U) -/*! CERR - Clear Error Indicator - */ -#define DMA_CERR_CERR(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERR_CERR_SHIFT)) & DMA_CERR_CERR_MASK) - -#define DMA_CERR_CAEI_MASK (0x40U) -#define DMA_CERR_CAEI_SHIFT (6U) -/*! CAEI - Clear All Error Indicators - * 0b0..Clear only the ERR bit specified in the CERR field - * 0b1..Clear all bits in ERR - */ -#define DMA_CERR_CAEI(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERR_CAEI_SHIFT)) & DMA_CERR_CAEI_MASK) - -#define DMA_CERR_NOP_MASK (0x80U) -#define DMA_CERR_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_CERR_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_CERR_NOP_SHIFT)) & DMA_CERR_NOP_MASK) -/*! @} */ - -/*! @name CINT - Clear Interrupt Request Register */ -/*! @{ */ - -#define DMA_CINT_CINT_MASK (0x1FU) -#define DMA_CINT_CINT_SHIFT (0U) -/*! CINT - Clear Interrupt Request - */ -#define DMA_CINT_CINT(x) (((uint8_t)(((uint8_t)(x)) << DMA_CINT_CINT_SHIFT)) & DMA_CINT_CINT_MASK) - -#define DMA_CINT_CAIR_MASK (0x40U) -#define DMA_CINT_CAIR_SHIFT (6U) -/*! CAIR - Clear All Interrupt Requests - * 0b0..Clear only the INT bit specified in the CINT field - * 0b1..Clear all bits in INT - */ -#define DMA_CINT_CAIR(x) (((uint8_t)(((uint8_t)(x)) << DMA_CINT_CAIR_SHIFT)) & DMA_CINT_CAIR_MASK) - -#define DMA_CINT_NOP_MASK (0x80U) -#define DMA_CINT_NOP_SHIFT (7U) -/*! NOP - No Op enable - * 0b0..Normal operation - * 0b1..No operation, ignore the other bits in this register - */ -#define DMA_CINT_NOP(x) (((uint8_t)(((uint8_t)(x)) << DMA_CINT_NOP_SHIFT)) & DMA_CINT_NOP_MASK) -/*! @} */ - -/*! @name INT - Interrupt Request Register */ -/*! @{ */ - -#define DMA_INT_INT0_MASK (0x1U) -#define DMA_INT_INT0_SHIFT (0U) -/*! INT0 - Interrupt Request 0 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT0(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT0_SHIFT)) & DMA_INT_INT0_MASK) - -#define DMA_INT_INT1_MASK (0x2U) -#define DMA_INT_INT1_SHIFT (1U) -/*! INT1 - Interrupt Request 1 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT1(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT1_SHIFT)) & DMA_INT_INT1_MASK) - -#define DMA_INT_INT2_MASK (0x4U) -#define DMA_INT_INT2_SHIFT (2U) -/*! INT2 - Interrupt Request 2 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT2(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT2_SHIFT)) & DMA_INT_INT2_MASK) - -#define DMA_INT_INT3_MASK (0x8U) -#define DMA_INT_INT3_SHIFT (3U) -/*! INT3 - Interrupt Request 3 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT3(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT3_SHIFT)) & DMA_INT_INT3_MASK) - -#define DMA_INT_INT4_MASK (0x10U) -#define DMA_INT_INT4_SHIFT (4U) -/*! INT4 - Interrupt Request 4 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT4(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT4_SHIFT)) & DMA_INT_INT4_MASK) - -#define DMA_INT_INT5_MASK (0x20U) -#define DMA_INT_INT5_SHIFT (5U) -/*! INT5 - Interrupt Request 5 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT5(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT5_SHIFT)) & DMA_INT_INT5_MASK) - -#define DMA_INT_INT6_MASK (0x40U) -#define DMA_INT_INT6_SHIFT (6U) -/*! INT6 - Interrupt Request 6 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT6(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT6_SHIFT)) & DMA_INT_INT6_MASK) - -#define DMA_INT_INT7_MASK (0x80U) -#define DMA_INT_INT7_SHIFT (7U) -/*! INT7 - Interrupt Request 7 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT7(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT7_SHIFT)) & DMA_INT_INT7_MASK) - -#define DMA_INT_INT8_MASK (0x100U) -#define DMA_INT_INT8_SHIFT (8U) -/*! INT8 - Interrupt Request 8 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT8(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT8_SHIFT)) & DMA_INT_INT8_MASK) - -#define DMA_INT_INT9_MASK (0x200U) -#define DMA_INT_INT9_SHIFT (9U) -/*! INT9 - Interrupt Request 9 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT9(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT9_SHIFT)) & DMA_INT_INT9_MASK) - -#define DMA_INT_INT10_MASK (0x400U) -#define DMA_INT_INT10_SHIFT (10U) -/*! INT10 - Interrupt Request 10 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT10(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT10_SHIFT)) & DMA_INT_INT10_MASK) - -#define DMA_INT_INT11_MASK (0x800U) -#define DMA_INT_INT11_SHIFT (11U) -/*! INT11 - Interrupt Request 11 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT11(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT11_SHIFT)) & DMA_INT_INT11_MASK) - -#define DMA_INT_INT12_MASK (0x1000U) -#define DMA_INT_INT12_SHIFT (12U) -/*! INT12 - Interrupt Request 12 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT12(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT12_SHIFT)) & DMA_INT_INT12_MASK) - -#define DMA_INT_INT13_MASK (0x2000U) -#define DMA_INT_INT13_SHIFT (13U) -/*! INT13 - Interrupt Request 13 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT13(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT13_SHIFT)) & DMA_INT_INT13_MASK) - -#define DMA_INT_INT14_MASK (0x4000U) -#define DMA_INT_INT14_SHIFT (14U) -/*! INT14 - Interrupt Request 14 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT14(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT14_SHIFT)) & DMA_INT_INT14_MASK) - -#define DMA_INT_INT15_MASK (0x8000U) -#define DMA_INT_INT15_SHIFT (15U) -/*! INT15 - Interrupt Request 15 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT15(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT15_SHIFT)) & DMA_INT_INT15_MASK) - -#define DMA_INT_INT16_MASK (0x10000U) -#define DMA_INT_INT16_SHIFT (16U) -/*! INT16 - Interrupt Request 16 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT16(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT16_SHIFT)) & DMA_INT_INT16_MASK) - -#define DMA_INT_INT17_MASK (0x20000U) -#define DMA_INT_INT17_SHIFT (17U) -/*! INT17 - Interrupt Request 17 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT17(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT17_SHIFT)) & DMA_INT_INT17_MASK) - -#define DMA_INT_INT18_MASK (0x40000U) -#define DMA_INT_INT18_SHIFT (18U) -/*! INT18 - Interrupt Request 18 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT18(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT18_SHIFT)) & DMA_INT_INT18_MASK) - -#define DMA_INT_INT19_MASK (0x80000U) -#define DMA_INT_INT19_SHIFT (19U) -/*! INT19 - Interrupt Request 19 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT19(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT19_SHIFT)) & DMA_INT_INT19_MASK) - -#define DMA_INT_INT20_MASK (0x100000U) -#define DMA_INT_INT20_SHIFT (20U) -/*! INT20 - Interrupt Request 20 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT20(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT20_SHIFT)) & DMA_INT_INT20_MASK) - -#define DMA_INT_INT21_MASK (0x200000U) -#define DMA_INT_INT21_SHIFT (21U) -/*! INT21 - Interrupt Request 21 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT21(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT21_SHIFT)) & DMA_INT_INT21_MASK) - -#define DMA_INT_INT22_MASK (0x400000U) -#define DMA_INT_INT22_SHIFT (22U) -/*! INT22 - Interrupt Request 22 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT22(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT22_SHIFT)) & DMA_INT_INT22_MASK) - -#define DMA_INT_INT23_MASK (0x800000U) -#define DMA_INT_INT23_SHIFT (23U) -/*! INT23 - Interrupt Request 23 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT23(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT23_SHIFT)) & DMA_INT_INT23_MASK) - -#define DMA_INT_INT24_MASK (0x1000000U) -#define DMA_INT_INT24_SHIFT (24U) -/*! INT24 - Interrupt Request 24 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT24(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT24_SHIFT)) & DMA_INT_INT24_MASK) - -#define DMA_INT_INT25_MASK (0x2000000U) -#define DMA_INT_INT25_SHIFT (25U) -/*! INT25 - Interrupt Request 25 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT25(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT25_SHIFT)) & DMA_INT_INT25_MASK) - -#define DMA_INT_INT26_MASK (0x4000000U) -#define DMA_INT_INT26_SHIFT (26U) -/*! INT26 - Interrupt Request 26 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT26(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT26_SHIFT)) & DMA_INT_INT26_MASK) - -#define DMA_INT_INT27_MASK (0x8000000U) -#define DMA_INT_INT27_SHIFT (27U) -/*! INT27 - Interrupt Request 27 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT27(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT27_SHIFT)) & DMA_INT_INT27_MASK) - -#define DMA_INT_INT28_MASK (0x10000000U) -#define DMA_INT_INT28_SHIFT (28U) -/*! INT28 - Interrupt Request 28 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT28(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT28_SHIFT)) & DMA_INT_INT28_MASK) - -#define DMA_INT_INT29_MASK (0x20000000U) -#define DMA_INT_INT29_SHIFT (29U) -/*! INT29 - Interrupt Request 29 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT29(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT29_SHIFT)) & DMA_INT_INT29_MASK) - -#define DMA_INT_INT30_MASK (0x40000000U) -#define DMA_INT_INT30_SHIFT (30U) -/*! INT30 - Interrupt Request 30 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT30(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT30_SHIFT)) & DMA_INT_INT30_MASK) - -#define DMA_INT_INT31_MASK (0x80000000U) -#define DMA_INT_INT31_SHIFT (31U) -/*! INT31 - Interrupt Request 31 - * 0b0..The interrupt request for corresponding channel is cleared - * 0b1..The interrupt request for corresponding channel is active - */ -#define DMA_INT_INT31(x) (((uint32_t)(((uint32_t)(x)) << DMA_INT_INT31_SHIFT)) & DMA_INT_INT31_MASK) -/*! @} */ - -/*! @name ERR - Error Register */ -/*! @{ */ - -#define DMA_ERR_ERR0_MASK (0x1U) -#define DMA_ERR_ERR0_SHIFT (0U) -/*! ERR0 - Error In Channel 0 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR0(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR0_SHIFT)) & DMA_ERR_ERR0_MASK) - -#define DMA_ERR_ERR1_MASK (0x2U) -#define DMA_ERR_ERR1_SHIFT (1U) -/*! ERR1 - Error In Channel 1 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR1(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR1_SHIFT)) & DMA_ERR_ERR1_MASK) - -#define DMA_ERR_ERR2_MASK (0x4U) -#define DMA_ERR_ERR2_SHIFT (2U) -/*! ERR2 - Error In Channel 2 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR2(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR2_SHIFT)) & DMA_ERR_ERR2_MASK) - -#define DMA_ERR_ERR3_MASK (0x8U) -#define DMA_ERR_ERR3_SHIFT (3U) -/*! ERR3 - Error In Channel 3 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR3(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR3_SHIFT)) & DMA_ERR_ERR3_MASK) - -#define DMA_ERR_ERR4_MASK (0x10U) -#define DMA_ERR_ERR4_SHIFT (4U) -/*! ERR4 - Error In Channel 4 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR4(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR4_SHIFT)) & DMA_ERR_ERR4_MASK) - -#define DMA_ERR_ERR5_MASK (0x20U) -#define DMA_ERR_ERR5_SHIFT (5U) -/*! ERR5 - Error In Channel 5 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR5(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR5_SHIFT)) & DMA_ERR_ERR5_MASK) - -#define DMA_ERR_ERR6_MASK (0x40U) -#define DMA_ERR_ERR6_SHIFT (6U) -/*! ERR6 - Error In Channel 6 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR6(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR6_SHIFT)) & DMA_ERR_ERR6_MASK) - -#define DMA_ERR_ERR7_MASK (0x80U) -#define DMA_ERR_ERR7_SHIFT (7U) -/*! ERR7 - Error In Channel 7 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR7(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR7_SHIFT)) & DMA_ERR_ERR7_MASK) - -#define DMA_ERR_ERR8_MASK (0x100U) -#define DMA_ERR_ERR8_SHIFT (8U) -/*! ERR8 - Error In Channel 8 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR8(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR8_SHIFT)) & DMA_ERR_ERR8_MASK) - -#define DMA_ERR_ERR9_MASK (0x200U) -#define DMA_ERR_ERR9_SHIFT (9U) -/*! ERR9 - Error In Channel 9 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR9(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR9_SHIFT)) & DMA_ERR_ERR9_MASK) - -#define DMA_ERR_ERR10_MASK (0x400U) -#define DMA_ERR_ERR10_SHIFT (10U) -/*! ERR10 - Error In Channel 10 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR10(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR10_SHIFT)) & DMA_ERR_ERR10_MASK) - -#define DMA_ERR_ERR11_MASK (0x800U) -#define DMA_ERR_ERR11_SHIFT (11U) -/*! ERR11 - Error In Channel 11 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR11(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR11_SHIFT)) & DMA_ERR_ERR11_MASK) - -#define DMA_ERR_ERR12_MASK (0x1000U) -#define DMA_ERR_ERR12_SHIFT (12U) -/*! ERR12 - Error In Channel 12 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR12(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR12_SHIFT)) & DMA_ERR_ERR12_MASK) - -#define DMA_ERR_ERR13_MASK (0x2000U) -#define DMA_ERR_ERR13_SHIFT (13U) -/*! ERR13 - Error In Channel 13 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR13(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR13_SHIFT)) & DMA_ERR_ERR13_MASK) - -#define DMA_ERR_ERR14_MASK (0x4000U) -#define DMA_ERR_ERR14_SHIFT (14U) -/*! ERR14 - Error In Channel 14 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR14(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR14_SHIFT)) & DMA_ERR_ERR14_MASK) - -#define DMA_ERR_ERR15_MASK (0x8000U) -#define DMA_ERR_ERR15_SHIFT (15U) -/*! ERR15 - Error In Channel 15 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR15(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR15_SHIFT)) & DMA_ERR_ERR15_MASK) - -#define DMA_ERR_ERR16_MASK (0x10000U) -#define DMA_ERR_ERR16_SHIFT (16U) -/*! ERR16 - Error In Channel 16 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR16(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR16_SHIFT)) & DMA_ERR_ERR16_MASK) - -#define DMA_ERR_ERR17_MASK (0x20000U) -#define DMA_ERR_ERR17_SHIFT (17U) -/*! ERR17 - Error In Channel 17 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR17(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR17_SHIFT)) & DMA_ERR_ERR17_MASK) - -#define DMA_ERR_ERR18_MASK (0x40000U) -#define DMA_ERR_ERR18_SHIFT (18U) -/*! ERR18 - Error In Channel 18 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR18(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR18_SHIFT)) & DMA_ERR_ERR18_MASK) - -#define DMA_ERR_ERR19_MASK (0x80000U) -#define DMA_ERR_ERR19_SHIFT (19U) -/*! ERR19 - Error In Channel 19 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR19(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR19_SHIFT)) & DMA_ERR_ERR19_MASK) - -#define DMA_ERR_ERR20_MASK (0x100000U) -#define DMA_ERR_ERR20_SHIFT (20U) -/*! ERR20 - Error In Channel 20 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR20(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR20_SHIFT)) & DMA_ERR_ERR20_MASK) - -#define DMA_ERR_ERR21_MASK (0x200000U) -#define DMA_ERR_ERR21_SHIFT (21U) -/*! ERR21 - Error In Channel 21 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR21(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR21_SHIFT)) & DMA_ERR_ERR21_MASK) - -#define DMA_ERR_ERR22_MASK (0x400000U) -#define DMA_ERR_ERR22_SHIFT (22U) -/*! ERR22 - Error In Channel 22 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR22(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR22_SHIFT)) & DMA_ERR_ERR22_MASK) - -#define DMA_ERR_ERR23_MASK (0x800000U) -#define DMA_ERR_ERR23_SHIFT (23U) -/*! ERR23 - Error In Channel 23 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR23(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR23_SHIFT)) & DMA_ERR_ERR23_MASK) - -#define DMA_ERR_ERR24_MASK (0x1000000U) -#define DMA_ERR_ERR24_SHIFT (24U) -/*! ERR24 - Error In Channel 24 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR24(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR24_SHIFT)) & DMA_ERR_ERR24_MASK) - -#define DMA_ERR_ERR25_MASK (0x2000000U) -#define DMA_ERR_ERR25_SHIFT (25U) -/*! ERR25 - Error In Channel 25 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR25(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR25_SHIFT)) & DMA_ERR_ERR25_MASK) - -#define DMA_ERR_ERR26_MASK (0x4000000U) -#define DMA_ERR_ERR26_SHIFT (26U) -/*! ERR26 - Error In Channel 26 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR26(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR26_SHIFT)) & DMA_ERR_ERR26_MASK) - -#define DMA_ERR_ERR27_MASK (0x8000000U) -#define DMA_ERR_ERR27_SHIFT (27U) -/*! ERR27 - Error In Channel 27 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR27(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR27_SHIFT)) & DMA_ERR_ERR27_MASK) - -#define DMA_ERR_ERR28_MASK (0x10000000U) -#define DMA_ERR_ERR28_SHIFT (28U) -/*! ERR28 - Error In Channel 28 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR28(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR28_SHIFT)) & DMA_ERR_ERR28_MASK) - -#define DMA_ERR_ERR29_MASK (0x20000000U) -#define DMA_ERR_ERR29_SHIFT (29U) -/*! ERR29 - Error In Channel 29 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR29(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR29_SHIFT)) & DMA_ERR_ERR29_MASK) - -#define DMA_ERR_ERR30_MASK (0x40000000U) -#define DMA_ERR_ERR30_SHIFT (30U) -/*! ERR30 - Error In Channel 30 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR30(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR30_SHIFT)) & DMA_ERR_ERR30_MASK) - -#define DMA_ERR_ERR31_MASK (0x80000000U) -#define DMA_ERR_ERR31_SHIFT (31U) -/*! ERR31 - Error In Channel 31 - * 0b0..An error in this channel has not occurred - * 0b1..An error in this channel has occurred - */ -#define DMA_ERR_ERR31(x) (((uint32_t)(((uint32_t)(x)) << DMA_ERR_ERR31_SHIFT)) & DMA_ERR_ERR31_MASK) -/*! @} */ - -/*! @name HRS - Hardware Request Status Register */ -/*! @{ */ - -#define DMA_HRS_HRS0_MASK (0x1U) -#define DMA_HRS_HRS0_SHIFT (0U) -/*! HRS0 - Hardware Request Status Channel 0 - * 0b0..A hardware service request for channel 0 is not present - * 0b1..A hardware service request for channel 0 is present - */ -#define DMA_HRS_HRS0(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS0_SHIFT)) & DMA_HRS_HRS0_MASK) - -#define DMA_HRS_HRS1_MASK (0x2U) -#define DMA_HRS_HRS1_SHIFT (1U) -/*! HRS1 - Hardware Request Status Channel 1 - * 0b0..A hardware service request for channel 1 is not present - * 0b1..A hardware service request for channel 1 is present - */ -#define DMA_HRS_HRS1(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS1_SHIFT)) & DMA_HRS_HRS1_MASK) - -#define DMA_HRS_HRS2_MASK (0x4U) -#define DMA_HRS_HRS2_SHIFT (2U) -/*! HRS2 - Hardware Request Status Channel 2 - * 0b0..A hardware service request for channel 2 is not present - * 0b1..A hardware service request for channel 2 is present - */ -#define DMA_HRS_HRS2(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS2_SHIFT)) & DMA_HRS_HRS2_MASK) - -#define DMA_HRS_HRS3_MASK (0x8U) -#define DMA_HRS_HRS3_SHIFT (3U) -/*! HRS3 - Hardware Request Status Channel 3 - * 0b0..A hardware service request for channel 3 is not present - * 0b1..A hardware service request for channel 3 is present - */ -#define DMA_HRS_HRS3(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS3_SHIFT)) & DMA_HRS_HRS3_MASK) - -#define DMA_HRS_HRS4_MASK (0x10U) -#define DMA_HRS_HRS4_SHIFT (4U) -/*! HRS4 - Hardware Request Status Channel 4 - * 0b0..A hardware service request for channel 4 is not present - * 0b1..A hardware service request for channel 4 is present - */ -#define DMA_HRS_HRS4(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS4_SHIFT)) & DMA_HRS_HRS4_MASK) - -#define DMA_HRS_HRS5_MASK (0x20U) -#define DMA_HRS_HRS5_SHIFT (5U) -/*! HRS5 - Hardware Request Status Channel 5 - * 0b0..A hardware service request for channel 5 is not present - * 0b1..A hardware service request for channel 5 is present - */ -#define DMA_HRS_HRS5(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS5_SHIFT)) & DMA_HRS_HRS5_MASK) - -#define DMA_HRS_HRS6_MASK (0x40U) -#define DMA_HRS_HRS6_SHIFT (6U) -/*! HRS6 - Hardware Request Status Channel 6 - * 0b0..A hardware service request for channel 6 is not present - * 0b1..A hardware service request for channel 6 is present - */ -#define DMA_HRS_HRS6(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS6_SHIFT)) & DMA_HRS_HRS6_MASK) - -#define DMA_HRS_HRS7_MASK (0x80U) -#define DMA_HRS_HRS7_SHIFT (7U) -/*! HRS7 - Hardware Request Status Channel 7 - * 0b0..A hardware service request for channel 7 is not present - * 0b1..A hardware service request for channel 7 is present - */ -#define DMA_HRS_HRS7(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS7_SHIFT)) & DMA_HRS_HRS7_MASK) - -#define DMA_HRS_HRS8_MASK (0x100U) -#define DMA_HRS_HRS8_SHIFT (8U) -/*! HRS8 - Hardware Request Status Channel 8 - * 0b0..A hardware service request for channel 8 is not present - * 0b1..A hardware service request for channel 8 is present - */ -#define DMA_HRS_HRS8(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS8_SHIFT)) & DMA_HRS_HRS8_MASK) - -#define DMA_HRS_HRS9_MASK (0x200U) -#define DMA_HRS_HRS9_SHIFT (9U) -/*! HRS9 - Hardware Request Status Channel 9 - * 0b0..A hardware service request for channel 9 is not present - * 0b1..A hardware service request for channel 9 is present - */ -#define DMA_HRS_HRS9(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS9_SHIFT)) & DMA_HRS_HRS9_MASK) - -#define DMA_HRS_HRS10_MASK (0x400U) -#define DMA_HRS_HRS10_SHIFT (10U) -/*! HRS10 - Hardware Request Status Channel 10 - * 0b0..A hardware service request for channel 10 is not present - * 0b1..A hardware service request for channel 10 is present - */ -#define DMA_HRS_HRS10(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS10_SHIFT)) & DMA_HRS_HRS10_MASK) - -#define DMA_HRS_HRS11_MASK (0x800U) -#define DMA_HRS_HRS11_SHIFT (11U) -/*! HRS11 - Hardware Request Status Channel 11 - * 0b0..A hardware service request for channel 11 is not present - * 0b1..A hardware service request for channel 11 is present - */ -#define DMA_HRS_HRS11(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS11_SHIFT)) & DMA_HRS_HRS11_MASK) - -#define DMA_HRS_HRS12_MASK (0x1000U) -#define DMA_HRS_HRS12_SHIFT (12U) -/*! HRS12 - Hardware Request Status Channel 12 - * 0b0..A hardware service request for channel 12 is not present - * 0b1..A hardware service request for channel 12 is present - */ -#define DMA_HRS_HRS12(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS12_SHIFT)) & DMA_HRS_HRS12_MASK) - -#define DMA_HRS_HRS13_MASK (0x2000U) -#define DMA_HRS_HRS13_SHIFT (13U) -/*! HRS13 - Hardware Request Status Channel 13 - * 0b0..A hardware service request for channel 13 is not present - * 0b1..A hardware service request for channel 13 is present - */ -#define DMA_HRS_HRS13(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS13_SHIFT)) & DMA_HRS_HRS13_MASK) - -#define DMA_HRS_HRS14_MASK (0x4000U) -#define DMA_HRS_HRS14_SHIFT (14U) -/*! HRS14 - Hardware Request Status Channel 14 - * 0b0..A hardware service request for channel 14 is not present - * 0b1..A hardware service request for channel 14 is present - */ -#define DMA_HRS_HRS14(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS14_SHIFT)) & DMA_HRS_HRS14_MASK) - -#define DMA_HRS_HRS15_MASK (0x8000U) -#define DMA_HRS_HRS15_SHIFT (15U) -/*! HRS15 - Hardware Request Status Channel 15 - * 0b0..A hardware service request for channel 15 is not present - * 0b1..A hardware service request for channel 15 is present - */ -#define DMA_HRS_HRS15(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS15_SHIFT)) & DMA_HRS_HRS15_MASK) - -#define DMA_HRS_HRS16_MASK (0x10000U) -#define DMA_HRS_HRS16_SHIFT (16U) -/*! HRS16 - Hardware Request Status Channel 16 - * 0b0..A hardware service request for channel 16 is not present - * 0b1..A hardware service request for channel 16 is present - */ -#define DMA_HRS_HRS16(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS16_SHIFT)) & DMA_HRS_HRS16_MASK) - -#define DMA_HRS_HRS17_MASK (0x20000U) -#define DMA_HRS_HRS17_SHIFT (17U) -/*! HRS17 - Hardware Request Status Channel 17 - * 0b0..A hardware service request for channel 17 is not present - * 0b1..A hardware service request for channel 17 is present - */ -#define DMA_HRS_HRS17(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS17_SHIFT)) & DMA_HRS_HRS17_MASK) - -#define DMA_HRS_HRS18_MASK (0x40000U) -#define DMA_HRS_HRS18_SHIFT (18U) -/*! HRS18 - Hardware Request Status Channel 18 - * 0b0..A hardware service request for channel 18 is not present - * 0b1..A hardware service request for channel 18 is present - */ -#define DMA_HRS_HRS18(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS18_SHIFT)) & DMA_HRS_HRS18_MASK) - -#define DMA_HRS_HRS19_MASK (0x80000U) -#define DMA_HRS_HRS19_SHIFT (19U) -/*! HRS19 - Hardware Request Status Channel 19 - * 0b0..A hardware service request for channel 19 is not present - * 0b1..A hardware service request for channel 19 is present - */ -#define DMA_HRS_HRS19(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS19_SHIFT)) & DMA_HRS_HRS19_MASK) - -#define DMA_HRS_HRS20_MASK (0x100000U) -#define DMA_HRS_HRS20_SHIFT (20U) -/*! HRS20 - Hardware Request Status Channel 20 - * 0b0..A hardware service request for channel 20 is not present - * 0b1..A hardware service request for channel 20 is present - */ -#define DMA_HRS_HRS20(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS20_SHIFT)) & DMA_HRS_HRS20_MASK) - -#define DMA_HRS_HRS21_MASK (0x200000U) -#define DMA_HRS_HRS21_SHIFT (21U) -/*! HRS21 - Hardware Request Status Channel 21 - * 0b0..A hardware service request for channel 21 is not present - * 0b1..A hardware service request for channel 21 is present - */ -#define DMA_HRS_HRS21(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS21_SHIFT)) & DMA_HRS_HRS21_MASK) - -#define DMA_HRS_HRS22_MASK (0x400000U) -#define DMA_HRS_HRS22_SHIFT (22U) -/*! HRS22 - Hardware Request Status Channel 22 - * 0b0..A hardware service request for channel 22 is not present - * 0b1..A hardware service request for channel 22 is present - */ -#define DMA_HRS_HRS22(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS22_SHIFT)) & DMA_HRS_HRS22_MASK) - -#define DMA_HRS_HRS23_MASK (0x800000U) -#define DMA_HRS_HRS23_SHIFT (23U) -/*! HRS23 - Hardware Request Status Channel 23 - * 0b0..A hardware service request for channel 23 is not present - * 0b1..A hardware service request for channel 23 is present - */ -#define DMA_HRS_HRS23(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS23_SHIFT)) & DMA_HRS_HRS23_MASK) - -#define DMA_HRS_HRS24_MASK (0x1000000U) -#define DMA_HRS_HRS24_SHIFT (24U) -/*! HRS24 - Hardware Request Status Channel 24 - * 0b0..A hardware service request for channel 24 is not present - * 0b1..A hardware service request for channel 24 is present - */ -#define DMA_HRS_HRS24(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS24_SHIFT)) & DMA_HRS_HRS24_MASK) - -#define DMA_HRS_HRS25_MASK (0x2000000U) -#define DMA_HRS_HRS25_SHIFT (25U) -/*! HRS25 - Hardware Request Status Channel 25 - * 0b0..A hardware service request for channel 25 is not present - * 0b1..A hardware service request for channel 25 is present - */ -#define DMA_HRS_HRS25(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS25_SHIFT)) & DMA_HRS_HRS25_MASK) - -#define DMA_HRS_HRS26_MASK (0x4000000U) -#define DMA_HRS_HRS26_SHIFT (26U) -/*! HRS26 - Hardware Request Status Channel 26 - * 0b0..A hardware service request for channel 26 is not present - * 0b1..A hardware service request for channel 26 is present - */ -#define DMA_HRS_HRS26(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS26_SHIFT)) & DMA_HRS_HRS26_MASK) - -#define DMA_HRS_HRS27_MASK (0x8000000U) -#define DMA_HRS_HRS27_SHIFT (27U) -/*! HRS27 - Hardware Request Status Channel 27 - * 0b0..A hardware service request for channel 27 is not present - * 0b1..A hardware service request for channel 27 is present - */ -#define DMA_HRS_HRS27(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS27_SHIFT)) & DMA_HRS_HRS27_MASK) - -#define DMA_HRS_HRS28_MASK (0x10000000U) -#define DMA_HRS_HRS28_SHIFT (28U) -/*! HRS28 - Hardware Request Status Channel 28 - * 0b0..A hardware service request for channel 28 is not present - * 0b1..A hardware service request for channel 28 is present - */ -#define DMA_HRS_HRS28(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS28_SHIFT)) & DMA_HRS_HRS28_MASK) - -#define DMA_HRS_HRS29_MASK (0x20000000U) -#define DMA_HRS_HRS29_SHIFT (29U) -/*! HRS29 - Hardware Request Status Channel 29 - * 0b0..A hardware service request for channel 29 is not preset - * 0b1..A hardware service request for channel 29 is present - */ -#define DMA_HRS_HRS29(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS29_SHIFT)) & DMA_HRS_HRS29_MASK) - -#define DMA_HRS_HRS30_MASK (0x40000000U) -#define DMA_HRS_HRS30_SHIFT (30U) -/*! HRS30 - Hardware Request Status Channel 30 - * 0b0..A hardware service request for channel 30 is not present - * 0b1..A hardware service request for channel 30 is present - */ -#define DMA_HRS_HRS30(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS30_SHIFT)) & DMA_HRS_HRS30_MASK) - -#define DMA_HRS_HRS31_MASK (0x80000000U) -#define DMA_HRS_HRS31_SHIFT (31U) -/*! HRS31 - Hardware Request Status Channel 31 - * 0b0..A hardware service request for channel 31 is not present - * 0b1..A hardware service request for channel 31 is present - */ -#define DMA_HRS_HRS31(x) (((uint32_t)(((uint32_t)(x)) << DMA_HRS_HRS31_SHIFT)) & DMA_HRS_HRS31_MASK) -/*! @} */ - -/*! @name EARS - Enable Asynchronous Request in Stop Register */ -/*! @{ */ - -#define DMA_EARS_EDREQ_0_MASK (0x1U) -#define DMA_EARS_EDREQ_0_SHIFT (0U) -/*! EDREQ_0 - Enable asynchronous DMA request in stop mode for channel 0. - * 0b0..Disable asynchronous DMA request for channel 0. - * 0b1..Enable asynchronous DMA request for channel 0. - */ -#define DMA_EARS_EDREQ_0(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_0_SHIFT)) & DMA_EARS_EDREQ_0_MASK) - -#define DMA_EARS_EDREQ_1_MASK (0x2U) -#define DMA_EARS_EDREQ_1_SHIFT (1U) -/*! EDREQ_1 - Enable asynchronous DMA request in stop mode for channel 1. - * 0b0..Disable asynchronous DMA request for channel 1 - * 0b1..Enable asynchronous DMA request for channel 1. - */ -#define DMA_EARS_EDREQ_1(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_1_SHIFT)) & DMA_EARS_EDREQ_1_MASK) - -#define DMA_EARS_EDREQ_2_MASK (0x4U) -#define DMA_EARS_EDREQ_2_SHIFT (2U) -/*! EDREQ_2 - Enable asynchronous DMA request in stop mode for channel 2. - * 0b0..Disable asynchronous DMA request for channel 2. - * 0b1..Enable asynchronous DMA request for channel 2. - */ -#define DMA_EARS_EDREQ_2(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_2_SHIFT)) & DMA_EARS_EDREQ_2_MASK) - -#define DMA_EARS_EDREQ_3_MASK (0x8U) -#define DMA_EARS_EDREQ_3_SHIFT (3U) -/*! EDREQ_3 - Enable asynchronous DMA request in stop mode for channel 3. - * 0b0..Disable asynchronous DMA request for channel 3. - * 0b1..Enable asynchronous DMA request for channel 3. - */ -#define DMA_EARS_EDREQ_3(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_3_SHIFT)) & DMA_EARS_EDREQ_3_MASK) - -#define DMA_EARS_EDREQ_4_MASK (0x10U) -#define DMA_EARS_EDREQ_4_SHIFT (4U) -/*! EDREQ_4 - Enable asynchronous DMA request in stop mode for channel 4 - * 0b0..Disable asynchronous DMA request for channel 4. - * 0b1..Enable asynchronous DMA request for channel 4. - */ -#define DMA_EARS_EDREQ_4(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_4_SHIFT)) & DMA_EARS_EDREQ_4_MASK) - -#define DMA_EARS_EDREQ_5_MASK (0x20U) -#define DMA_EARS_EDREQ_5_SHIFT (5U) -/*! EDREQ_5 - Enable asynchronous DMA request in stop mode for channel 5 - * 0b0..Disable asynchronous DMA request for channel 5. - * 0b1..Enable asynchronous DMA request for channel 5. - */ -#define DMA_EARS_EDREQ_5(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_5_SHIFT)) & DMA_EARS_EDREQ_5_MASK) - -#define DMA_EARS_EDREQ_6_MASK (0x40U) -#define DMA_EARS_EDREQ_6_SHIFT (6U) -/*! EDREQ_6 - Enable asynchronous DMA request in stop mode for channel 6 - * 0b0..Disable asynchronous DMA request for channel 6. - * 0b1..Enable asynchronous DMA request for channel 6. - */ -#define DMA_EARS_EDREQ_6(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_6_SHIFT)) & DMA_EARS_EDREQ_6_MASK) - -#define DMA_EARS_EDREQ_7_MASK (0x80U) -#define DMA_EARS_EDREQ_7_SHIFT (7U) -/*! EDREQ_7 - Enable asynchronous DMA request in stop mode for channel 7 - * 0b0..Disable asynchronous DMA request for channel 7. - * 0b1..Enable asynchronous DMA request for channel 7. - */ -#define DMA_EARS_EDREQ_7(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_7_SHIFT)) & DMA_EARS_EDREQ_7_MASK) - -#define DMA_EARS_EDREQ_8_MASK (0x100U) -#define DMA_EARS_EDREQ_8_SHIFT (8U) -/*! EDREQ_8 - Enable asynchronous DMA request in stop mode for channel 8 - * 0b0..Disable asynchronous DMA request for channel 8. - * 0b1..Enable asynchronous DMA request for channel 8. - */ -#define DMA_EARS_EDREQ_8(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_8_SHIFT)) & DMA_EARS_EDREQ_8_MASK) - -#define DMA_EARS_EDREQ_9_MASK (0x200U) -#define DMA_EARS_EDREQ_9_SHIFT (9U) -/*! EDREQ_9 - Enable asynchronous DMA request in stop mode for channel 9 - * 0b0..Disable asynchronous DMA request for channel 9. - * 0b1..Enable asynchronous DMA request for channel 9. - */ -#define DMA_EARS_EDREQ_9(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_9_SHIFT)) & DMA_EARS_EDREQ_9_MASK) - -#define DMA_EARS_EDREQ_10_MASK (0x400U) -#define DMA_EARS_EDREQ_10_SHIFT (10U) -/*! EDREQ_10 - Enable asynchronous DMA request in stop mode for channel 10 - * 0b0..Disable asynchronous DMA request for channel 10. - * 0b1..Enable asynchronous DMA request for channel 10. - */ -#define DMA_EARS_EDREQ_10(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_10_SHIFT)) & DMA_EARS_EDREQ_10_MASK) - -#define DMA_EARS_EDREQ_11_MASK (0x800U) -#define DMA_EARS_EDREQ_11_SHIFT (11U) -/*! EDREQ_11 - Enable asynchronous DMA request in stop mode for channel 11 - * 0b0..Disable asynchronous DMA request for channel 11. - * 0b1..Enable asynchronous DMA request for channel 11. - */ -#define DMA_EARS_EDREQ_11(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_11_SHIFT)) & DMA_EARS_EDREQ_11_MASK) - -#define DMA_EARS_EDREQ_12_MASK (0x1000U) -#define DMA_EARS_EDREQ_12_SHIFT (12U) -/*! EDREQ_12 - Enable asynchronous DMA request in stop mode for channel 12 - * 0b0..Disable asynchronous DMA request for channel 12. - * 0b1..Enable asynchronous DMA request for channel 12. - */ -#define DMA_EARS_EDREQ_12(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_12_SHIFT)) & DMA_EARS_EDREQ_12_MASK) - -#define DMA_EARS_EDREQ_13_MASK (0x2000U) -#define DMA_EARS_EDREQ_13_SHIFT (13U) -/*! EDREQ_13 - Enable asynchronous DMA request in stop mode for channel 13 - * 0b0..Disable asynchronous DMA request for channel 13. - * 0b1..Enable asynchronous DMA request for channel 13. - */ -#define DMA_EARS_EDREQ_13(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_13_SHIFT)) & DMA_EARS_EDREQ_13_MASK) - -#define DMA_EARS_EDREQ_14_MASK (0x4000U) -#define DMA_EARS_EDREQ_14_SHIFT (14U) -/*! EDREQ_14 - Enable asynchronous DMA request in stop mode for channel 14 - * 0b0..Disable asynchronous DMA request for channel 14. - * 0b1..Enable asynchronous DMA request for channel 14. - */ -#define DMA_EARS_EDREQ_14(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_14_SHIFT)) & DMA_EARS_EDREQ_14_MASK) - -#define DMA_EARS_EDREQ_15_MASK (0x8000U) -#define DMA_EARS_EDREQ_15_SHIFT (15U) -/*! EDREQ_15 - Enable asynchronous DMA request in stop mode for channel 15 - * 0b0..Disable asynchronous DMA request for channel 15. - * 0b1..Enable asynchronous DMA request for channel 15. - */ -#define DMA_EARS_EDREQ_15(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_15_SHIFT)) & DMA_EARS_EDREQ_15_MASK) - -#define DMA_EARS_EDREQ_16_MASK (0x10000U) -#define DMA_EARS_EDREQ_16_SHIFT (16U) -/*! EDREQ_16 - Enable asynchronous DMA request in stop mode for channel 16 - * 0b0..Disable asynchronous DMA request for channel 16 - * 0b1..Enable asynchronous DMA request for channel 16 - */ -#define DMA_EARS_EDREQ_16(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_16_SHIFT)) & DMA_EARS_EDREQ_16_MASK) - -#define DMA_EARS_EDREQ_17_MASK (0x20000U) -#define DMA_EARS_EDREQ_17_SHIFT (17U) -/*! EDREQ_17 - Enable asynchronous DMA request in stop mode for channel 17 - * 0b0..Disable asynchronous DMA request for channel 17 - * 0b1..Enable asynchronous DMA request for channel 17 - */ -#define DMA_EARS_EDREQ_17(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_17_SHIFT)) & DMA_EARS_EDREQ_17_MASK) - -#define DMA_EARS_EDREQ_18_MASK (0x40000U) -#define DMA_EARS_EDREQ_18_SHIFT (18U) -/*! EDREQ_18 - Enable asynchronous DMA request in stop mode for channel 18 - * 0b0..Disable asynchronous DMA request for channel 18 - * 0b1..Enable asynchronous DMA request for channel 18 - */ -#define DMA_EARS_EDREQ_18(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_18_SHIFT)) & DMA_EARS_EDREQ_18_MASK) - -#define DMA_EARS_EDREQ_19_MASK (0x80000U) -#define DMA_EARS_EDREQ_19_SHIFT (19U) -/*! EDREQ_19 - Enable asynchronous DMA request in stop mode for channel 19 - * 0b0..Disable asynchronous DMA request for channel 19 - * 0b1..Enable asynchronous DMA request for channel 19 - */ -#define DMA_EARS_EDREQ_19(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_19_SHIFT)) & DMA_EARS_EDREQ_19_MASK) - -#define DMA_EARS_EDREQ_20_MASK (0x100000U) -#define DMA_EARS_EDREQ_20_SHIFT (20U) -/*! EDREQ_20 - Enable asynchronous DMA request in stop mode for channel 20 - * 0b0..Disable asynchronous DMA request for channel 20 - * 0b1..Enable asynchronous DMA request for channel 20 - */ -#define DMA_EARS_EDREQ_20(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_20_SHIFT)) & DMA_EARS_EDREQ_20_MASK) - -#define DMA_EARS_EDREQ_21_MASK (0x200000U) -#define DMA_EARS_EDREQ_21_SHIFT (21U) -/*! EDREQ_21 - Enable asynchronous DMA request in stop mode for channel 21 - * 0b0..Disable asynchronous DMA request for channel 21 - * 0b1..Enable asynchronous DMA request for channel 21 - */ -#define DMA_EARS_EDREQ_21(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_21_SHIFT)) & DMA_EARS_EDREQ_21_MASK) - -#define DMA_EARS_EDREQ_22_MASK (0x400000U) -#define DMA_EARS_EDREQ_22_SHIFT (22U) -/*! EDREQ_22 - Enable asynchronous DMA request in stop mode for channel 22 - * 0b0..Disable asynchronous DMA request for channel 22 - * 0b1..Enable asynchronous DMA request for channel 22 - */ -#define DMA_EARS_EDREQ_22(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_22_SHIFT)) & DMA_EARS_EDREQ_22_MASK) - -#define DMA_EARS_EDREQ_23_MASK (0x800000U) -#define DMA_EARS_EDREQ_23_SHIFT (23U) -/*! EDREQ_23 - Enable asynchronous DMA request in stop mode for channel 23 - * 0b0..Disable asynchronous DMA request for channel 23 - * 0b1..Enable asynchronous DMA request for channel 23 - */ -#define DMA_EARS_EDREQ_23(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_23_SHIFT)) & DMA_EARS_EDREQ_23_MASK) - -#define DMA_EARS_EDREQ_24_MASK (0x1000000U) -#define DMA_EARS_EDREQ_24_SHIFT (24U) -/*! EDREQ_24 - Enable asynchronous DMA request in stop mode for channel 24 - * 0b0..Disable asynchronous DMA request for channel 24 - * 0b1..Enable asynchronous DMA request for channel 24 - */ -#define DMA_EARS_EDREQ_24(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_24_SHIFT)) & DMA_EARS_EDREQ_24_MASK) - -#define DMA_EARS_EDREQ_25_MASK (0x2000000U) -#define DMA_EARS_EDREQ_25_SHIFT (25U) -/*! EDREQ_25 - Enable asynchronous DMA request in stop mode for channel 25 - * 0b0..Disable asynchronous DMA request for channel 25 - * 0b1..Enable asynchronous DMA request for channel 25 - */ -#define DMA_EARS_EDREQ_25(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_25_SHIFT)) & DMA_EARS_EDREQ_25_MASK) - -#define DMA_EARS_EDREQ_26_MASK (0x4000000U) -#define DMA_EARS_EDREQ_26_SHIFT (26U) -/*! EDREQ_26 - Enable asynchronous DMA request in stop mode for channel 26 - * 0b0..Disable asynchronous DMA request for channel 26 - * 0b1..Enable asynchronous DMA request for channel 26 - */ -#define DMA_EARS_EDREQ_26(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_26_SHIFT)) & DMA_EARS_EDREQ_26_MASK) - -#define DMA_EARS_EDREQ_27_MASK (0x8000000U) -#define DMA_EARS_EDREQ_27_SHIFT (27U) -/*! EDREQ_27 - Enable asynchronous DMA request in stop mode for channel 27 - * 0b0..Disable asynchronous DMA request for channel 27 - * 0b1..Enable asynchronous DMA request for channel 27 - */ -#define DMA_EARS_EDREQ_27(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_27_SHIFT)) & DMA_EARS_EDREQ_27_MASK) - -#define DMA_EARS_EDREQ_28_MASK (0x10000000U) -#define DMA_EARS_EDREQ_28_SHIFT (28U) -/*! EDREQ_28 - Enable asynchronous DMA request in stop mode for channel 28 - * 0b0..Disable asynchronous DMA request for channel 28 - * 0b1..Enable asynchronous DMA request for channel 28 - */ -#define DMA_EARS_EDREQ_28(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_28_SHIFT)) & DMA_EARS_EDREQ_28_MASK) - -#define DMA_EARS_EDREQ_29_MASK (0x20000000U) -#define DMA_EARS_EDREQ_29_SHIFT (29U) -/*! EDREQ_29 - Enable asynchronous DMA request in stop mode for channel 29 - * 0b0..Disable asynchronous DMA request for channel 29 - * 0b1..Enable asynchronous DMA request for channel 29 - */ -#define DMA_EARS_EDREQ_29(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_29_SHIFT)) & DMA_EARS_EDREQ_29_MASK) - -#define DMA_EARS_EDREQ_30_MASK (0x40000000U) -#define DMA_EARS_EDREQ_30_SHIFT (30U) -/*! EDREQ_30 - Enable asynchronous DMA request in stop mode for channel 30 - * 0b0..Disable asynchronous DMA request for channel 30 - * 0b1..Enable asynchronous DMA request for channel 30 - */ -#define DMA_EARS_EDREQ_30(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_30_SHIFT)) & DMA_EARS_EDREQ_30_MASK) - -#define DMA_EARS_EDREQ_31_MASK (0x80000000U) -#define DMA_EARS_EDREQ_31_SHIFT (31U) -/*! EDREQ_31 - Enable asynchronous DMA request in stop mode for channel 31 - * 0b0..Disable asynchronous DMA request for channel 31 - * 0b1..Enable asynchronous DMA request for channel 31 - */ -#define DMA_EARS_EDREQ_31(x) (((uint32_t)(((uint32_t)(x)) << DMA_EARS_EDREQ_31_SHIFT)) & DMA_EARS_EDREQ_31_MASK) -/*! @} */ - -/*! @name DCHPRI3 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI3_CHPRI_MASK (0xFU) -#define DMA_DCHPRI3_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI3_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI3_CHPRI_SHIFT)) & DMA_DCHPRI3_CHPRI_MASK) - -#define DMA_DCHPRI3_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI3_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI3_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI3_GRPPRI_SHIFT)) & DMA_DCHPRI3_GRPPRI_MASK) - -#define DMA_DCHPRI3_DPA_MASK (0x40U) -#define DMA_DCHPRI3_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI3_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI3_DPA_SHIFT)) & DMA_DCHPRI3_DPA_MASK) - -#define DMA_DCHPRI3_ECP_MASK (0x80U) -#define DMA_DCHPRI3_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI3_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI3_ECP_SHIFT)) & DMA_DCHPRI3_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI2 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI2_CHPRI_MASK (0xFU) -#define DMA_DCHPRI2_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI2_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI2_CHPRI_SHIFT)) & DMA_DCHPRI2_CHPRI_MASK) - -#define DMA_DCHPRI2_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI2_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI2_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI2_GRPPRI_SHIFT)) & DMA_DCHPRI2_GRPPRI_MASK) - -#define DMA_DCHPRI2_DPA_MASK (0x40U) -#define DMA_DCHPRI2_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI2_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI2_DPA_SHIFT)) & DMA_DCHPRI2_DPA_MASK) - -#define DMA_DCHPRI2_ECP_MASK (0x80U) -#define DMA_DCHPRI2_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI2_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI2_ECP_SHIFT)) & DMA_DCHPRI2_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI1 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI1_CHPRI_MASK (0xFU) -#define DMA_DCHPRI1_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI1_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI1_CHPRI_SHIFT)) & DMA_DCHPRI1_CHPRI_MASK) - -#define DMA_DCHPRI1_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI1_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI1_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI1_GRPPRI_SHIFT)) & DMA_DCHPRI1_GRPPRI_MASK) - -#define DMA_DCHPRI1_DPA_MASK (0x40U) -#define DMA_DCHPRI1_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI1_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI1_DPA_SHIFT)) & DMA_DCHPRI1_DPA_MASK) - -#define DMA_DCHPRI1_ECP_MASK (0x80U) -#define DMA_DCHPRI1_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI1_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI1_ECP_SHIFT)) & DMA_DCHPRI1_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI0 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI0_CHPRI_MASK (0xFU) -#define DMA_DCHPRI0_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI0_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI0_CHPRI_SHIFT)) & DMA_DCHPRI0_CHPRI_MASK) - -#define DMA_DCHPRI0_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI0_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI0_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI0_GRPPRI_SHIFT)) & DMA_DCHPRI0_GRPPRI_MASK) - -#define DMA_DCHPRI0_DPA_MASK (0x40U) -#define DMA_DCHPRI0_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI0_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI0_DPA_SHIFT)) & DMA_DCHPRI0_DPA_MASK) - -#define DMA_DCHPRI0_ECP_MASK (0x80U) -#define DMA_DCHPRI0_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI0_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI0_ECP_SHIFT)) & DMA_DCHPRI0_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI7 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI7_CHPRI_MASK (0xFU) -#define DMA_DCHPRI7_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI7_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI7_CHPRI_SHIFT)) & DMA_DCHPRI7_CHPRI_MASK) - -#define DMA_DCHPRI7_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI7_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI7_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI7_GRPPRI_SHIFT)) & DMA_DCHPRI7_GRPPRI_MASK) - -#define DMA_DCHPRI7_DPA_MASK (0x40U) -#define DMA_DCHPRI7_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI7_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI7_DPA_SHIFT)) & DMA_DCHPRI7_DPA_MASK) - -#define DMA_DCHPRI7_ECP_MASK (0x80U) -#define DMA_DCHPRI7_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI7_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI7_ECP_SHIFT)) & DMA_DCHPRI7_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI6 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI6_CHPRI_MASK (0xFU) -#define DMA_DCHPRI6_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI6_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI6_CHPRI_SHIFT)) & DMA_DCHPRI6_CHPRI_MASK) - -#define DMA_DCHPRI6_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI6_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI6_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI6_GRPPRI_SHIFT)) & DMA_DCHPRI6_GRPPRI_MASK) - -#define DMA_DCHPRI6_DPA_MASK (0x40U) -#define DMA_DCHPRI6_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI6_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI6_DPA_SHIFT)) & DMA_DCHPRI6_DPA_MASK) - -#define DMA_DCHPRI6_ECP_MASK (0x80U) -#define DMA_DCHPRI6_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI6_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI6_ECP_SHIFT)) & DMA_DCHPRI6_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI5 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI5_CHPRI_MASK (0xFU) -#define DMA_DCHPRI5_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI5_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI5_CHPRI_SHIFT)) & DMA_DCHPRI5_CHPRI_MASK) - -#define DMA_DCHPRI5_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI5_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI5_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI5_GRPPRI_SHIFT)) & DMA_DCHPRI5_GRPPRI_MASK) - -#define DMA_DCHPRI5_DPA_MASK (0x40U) -#define DMA_DCHPRI5_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI5_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI5_DPA_SHIFT)) & DMA_DCHPRI5_DPA_MASK) - -#define DMA_DCHPRI5_ECP_MASK (0x80U) -#define DMA_DCHPRI5_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI5_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI5_ECP_SHIFT)) & DMA_DCHPRI5_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI4 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI4_CHPRI_MASK (0xFU) -#define DMA_DCHPRI4_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI4_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI4_CHPRI_SHIFT)) & DMA_DCHPRI4_CHPRI_MASK) - -#define DMA_DCHPRI4_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI4_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI4_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI4_GRPPRI_SHIFT)) & DMA_DCHPRI4_GRPPRI_MASK) - -#define DMA_DCHPRI4_DPA_MASK (0x40U) -#define DMA_DCHPRI4_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI4_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI4_DPA_SHIFT)) & DMA_DCHPRI4_DPA_MASK) - -#define DMA_DCHPRI4_ECP_MASK (0x80U) -#define DMA_DCHPRI4_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI4_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI4_ECP_SHIFT)) & DMA_DCHPRI4_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI11 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI11_CHPRI_MASK (0xFU) -#define DMA_DCHPRI11_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI11_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI11_CHPRI_SHIFT)) & DMA_DCHPRI11_CHPRI_MASK) - -#define DMA_DCHPRI11_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI11_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI11_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI11_GRPPRI_SHIFT)) & DMA_DCHPRI11_GRPPRI_MASK) - -#define DMA_DCHPRI11_DPA_MASK (0x40U) -#define DMA_DCHPRI11_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI11_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI11_DPA_SHIFT)) & DMA_DCHPRI11_DPA_MASK) - -#define DMA_DCHPRI11_ECP_MASK (0x80U) -#define DMA_DCHPRI11_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI11_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI11_ECP_SHIFT)) & DMA_DCHPRI11_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI10 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI10_CHPRI_MASK (0xFU) -#define DMA_DCHPRI10_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI10_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI10_CHPRI_SHIFT)) & DMA_DCHPRI10_CHPRI_MASK) - -#define DMA_DCHPRI10_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI10_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI10_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI10_GRPPRI_SHIFT)) & DMA_DCHPRI10_GRPPRI_MASK) - -#define DMA_DCHPRI10_DPA_MASK (0x40U) -#define DMA_DCHPRI10_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI10_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI10_DPA_SHIFT)) & DMA_DCHPRI10_DPA_MASK) - -#define DMA_DCHPRI10_ECP_MASK (0x80U) -#define DMA_DCHPRI10_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI10_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI10_ECP_SHIFT)) & DMA_DCHPRI10_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI9 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI9_CHPRI_MASK (0xFU) -#define DMA_DCHPRI9_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI9_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI9_CHPRI_SHIFT)) & DMA_DCHPRI9_CHPRI_MASK) - -#define DMA_DCHPRI9_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI9_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI9_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI9_GRPPRI_SHIFT)) & DMA_DCHPRI9_GRPPRI_MASK) - -#define DMA_DCHPRI9_DPA_MASK (0x40U) -#define DMA_DCHPRI9_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI9_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI9_DPA_SHIFT)) & DMA_DCHPRI9_DPA_MASK) - -#define DMA_DCHPRI9_ECP_MASK (0x80U) -#define DMA_DCHPRI9_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI9_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI9_ECP_SHIFT)) & DMA_DCHPRI9_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI8 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI8_CHPRI_MASK (0xFU) -#define DMA_DCHPRI8_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI8_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI8_CHPRI_SHIFT)) & DMA_DCHPRI8_CHPRI_MASK) - -#define DMA_DCHPRI8_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI8_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI8_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI8_GRPPRI_SHIFT)) & DMA_DCHPRI8_GRPPRI_MASK) - -#define DMA_DCHPRI8_DPA_MASK (0x40U) -#define DMA_DCHPRI8_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI8_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI8_DPA_SHIFT)) & DMA_DCHPRI8_DPA_MASK) - -#define DMA_DCHPRI8_ECP_MASK (0x80U) -#define DMA_DCHPRI8_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI8_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI8_ECP_SHIFT)) & DMA_DCHPRI8_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI15 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI15_CHPRI_MASK (0xFU) -#define DMA_DCHPRI15_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI15_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI15_CHPRI_SHIFT)) & DMA_DCHPRI15_CHPRI_MASK) - -#define DMA_DCHPRI15_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI15_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI15_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI15_GRPPRI_SHIFT)) & DMA_DCHPRI15_GRPPRI_MASK) - -#define DMA_DCHPRI15_DPA_MASK (0x40U) -#define DMA_DCHPRI15_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI15_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI15_DPA_SHIFT)) & DMA_DCHPRI15_DPA_MASK) - -#define DMA_DCHPRI15_ECP_MASK (0x80U) -#define DMA_DCHPRI15_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI15_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI15_ECP_SHIFT)) & DMA_DCHPRI15_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI14 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI14_CHPRI_MASK (0xFU) -#define DMA_DCHPRI14_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI14_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI14_CHPRI_SHIFT)) & DMA_DCHPRI14_CHPRI_MASK) - -#define DMA_DCHPRI14_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI14_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI14_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI14_GRPPRI_SHIFT)) & DMA_DCHPRI14_GRPPRI_MASK) - -#define DMA_DCHPRI14_DPA_MASK (0x40U) -#define DMA_DCHPRI14_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI14_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI14_DPA_SHIFT)) & DMA_DCHPRI14_DPA_MASK) - -#define DMA_DCHPRI14_ECP_MASK (0x80U) -#define DMA_DCHPRI14_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI14_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI14_ECP_SHIFT)) & DMA_DCHPRI14_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI13 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI13_CHPRI_MASK (0xFU) -#define DMA_DCHPRI13_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI13_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI13_CHPRI_SHIFT)) & DMA_DCHPRI13_CHPRI_MASK) - -#define DMA_DCHPRI13_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI13_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI13_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI13_GRPPRI_SHIFT)) & DMA_DCHPRI13_GRPPRI_MASK) - -#define DMA_DCHPRI13_DPA_MASK (0x40U) -#define DMA_DCHPRI13_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI13_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI13_DPA_SHIFT)) & DMA_DCHPRI13_DPA_MASK) - -#define DMA_DCHPRI13_ECP_MASK (0x80U) -#define DMA_DCHPRI13_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI13_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI13_ECP_SHIFT)) & DMA_DCHPRI13_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI12 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI12_CHPRI_MASK (0xFU) -#define DMA_DCHPRI12_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI12_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI12_CHPRI_SHIFT)) & DMA_DCHPRI12_CHPRI_MASK) - -#define DMA_DCHPRI12_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI12_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI12_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI12_GRPPRI_SHIFT)) & DMA_DCHPRI12_GRPPRI_MASK) - -#define DMA_DCHPRI12_DPA_MASK (0x40U) -#define DMA_DCHPRI12_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI12_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI12_DPA_SHIFT)) & DMA_DCHPRI12_DPA_MASK) - -#define DMA_DCHPRI12_ECP_MASK (0x80U) -#define DMA_DCHPRI12_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI12_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI12_ECP_SHIFT)) & DMA_DCHPRI12_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI19 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI19_CHPRI_MASK (0xFU) -#define DMA_DCHPRI19_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI19_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI19_CHPRI_SHIFT)) & DMA_DCHPRI19_CHPRI_MASK) - -#define DMA_DCHPRI19_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI19_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI19_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI19_GRPPRI_SHIFT)) & DMA_DCHPRI19_GRPPRI_MASK) - -#define DMA_DCHPRI19_DPA_MASK (0x40U) -#define DMA_DCHPRI19_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI19_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI19_DPA_SHIFT)) & DMA_DCHPRI19_DPA_MASK) - -#define DMA_DCHPRI19_ECP_MASK (0x80U) -#define DMA_DCHPRI19_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI19_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI19_ECP_SHIFT)) & DMA_DCHPRI19_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI18 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI18_CHPRI_MASK (0xFU) -#define DMA_DCHPRI18_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI18_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI18_CHPRI_SHIFT)) & DMA_DCHPRI18_CHPRI_MASK) - -#define DMA_DCHPRI18_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI18_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI18_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI18_GRPPRI_SHIFT)) & DMA_DCHPRI18_GRPPRI_MASK) - -#define DMA_DCHPRI18_DPA_MASK (0x40U) -#define DMA_DCHPRI18_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI18_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI18_DPA_SHIFT)) & DMA_DCHPRI18_DPA_MASK) - -#define DMA_DCHPRI18_ECP_MASK (0x80U) -#define DMA_DCHPRI18_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI18_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI18_ECP_SHIFT)) & DMA_DCHPRI18_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI17 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI17_CHPRI_MASK (0xFU) -#define DMA_DCHPRI17_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI17_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI17_CHPRI_SHIFT)) & DMA_DCHPRI17_CHPRI_MASK) - -#define DMA_DCHPRI17_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI17_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI17_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI17_GRPPRI_SHIFT)) & DMA_DCHPRI17_GRPPRI_MASK) - -#define DMA_DCHPRI17_DPA_MASK (0x40U) -#define DMA_DCHPRI17_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI17_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI17_DPA_SHIFT)) & DMA_DCHPRI17_DPA_MASK) - -#define DMA_DCHPRI17_ECP_MASK (0x80U) -#define DMA_DCHPRI17_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI17_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI17_ECP_SHIFT)) & DMA_DCHPRI17_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI16 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI16_CHPRI_MASK (0xFU) -#define DMA_DCHPRI16_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI16_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI16_CHPRI_SHIFT)) & DMA_DCHPRI16_CHPRI_MASK) - -#define DMA_DCHPRI16_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI16_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI16_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI16_GRPPRI_SHIFT)) & DMA_DCHPRI16_GRPPRI_MASK) - -#define DMA_DCHPRI16_DPA_MASK (0x40U) -#define DMA_DCHPRI16_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI16_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI16_DPA_SHIFT)) & DMA_DCHPRI16_DPA_MASK) - -#define DMA_DCHPRI16_ECP_MASK (0x80U) -#define DMA_DCHPRI16_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI16_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI16_ECP_SHIFT)) & DMA_DCHPRI16_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI23 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI23_CHPRI_MASK (0xFU) -#define DMA_DCHPRI23_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI23_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI23_CHPRI_SHIFT)) & DMA_DCHPRI23_CHPRI_MASK) - -#define DMA_DCHPRI23_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI23_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI23_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI23_GRPPRI_SHIFT)) & DMA_DCHPRI23_GRPPRI_MASK) - -#define DMA_DCHPRI23_DPA_MASK (0x40U) -#define DMA_DCHPRI23_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI23_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI23_DPA_SHIFT)) & DMA_DCHPRI23_DPA_MASK) - -#define DMA_DCHPRI23_ECP_MASK (0x80U) -#define DMA_DCHPRI23_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI23_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI23_ECP_SHIFT)) & DMA_DCHPRI23_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI22 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI22_CHPRI_MASK (0xFU) -#define DMA_DCHPRI22_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI22_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI22_CHPRI_SHIFT)) & DMA_DCHPRI22_CHPRI_MASK) - -#define DMA_DCHPRI22_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI22_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI22_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI22_GRPPRI_SHIFT)) & DMA_DCHPRI22_GRPPRI_MASK) - -#define DMA_DCHPRI22_DPA_MASK (0x40U) -#define DMA_DCHPRI22_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI22_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI22_DPA_SHIFT)) & DMA_DCHPRI22_DPA_MASK) - -#define DMA_DCHPRI22_ECP_MASK (0x80U) -#define DMA_DCHPRI22_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI22_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI22_ECP_SHIFT)) & DMA_DCHPRI22_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI21 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI21_CHPRI_MASK (0xFU) -#define DMA_DCHPRI21_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI21_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI21_CHPRI_SHIFT)) & DMA_DCHPRI21_CHPRI_MASK) - -#define DMA_DCHPRI21_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI21_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI21_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI21_GRPPRI_SHIFT)) & DMA_DCHPRI21_GRPPRI_MASK) - -#define DMA_DCHPRI21_DPA_MASK (0x40U) -#define DMA_DCHPRI21_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI21_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI21_DPA_SHIFT)) & DMA_DCHPRI21_DPA_MASK) - -#define DMA_DCHPRI21_ECP_MASK (0x80U) -#define DMA_DCHPRI21_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI21_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI21_ECP_SHIFT)) & DMA_DCHPRI21_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI20 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI20_CHPRI_MASK (0xFU) -#define DMA_DCHPRI20_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI20_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI20_CHPRI_SHIFT)) & DMA_DCHPRI20_CHPRI_MASK) - -#define DMA_DCHPRI20_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI20_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI20_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI20_GRPPRI_SHIFT)) & DMA_DCHPRI20_GRPPRI_MASK) - -#define DMA_DCHPRI20_DPA_MASK (0x40U) -#define DMA_DCHPRI20_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI20_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI20_DPA_SHIFT)) & DMA_DCHPRI20_DPA_MASK) - -#define DMA_DCHPRI20_ECP_MASK (0x80U) -#define DMA_DCHPRI20_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI20_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI20_ECP_SHIFT)) & DMA_DCHPRI20_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI27 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI27_CHPRI_MASK (0xFU) -#define DMA_DCHPRI27_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI27_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI27_CHPRI_SHIFT)) & DMA_DCHPRI27_CHPRI_MASK) - -#define DMA_DCHPRI27_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI27_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI27_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI27_GRPPRI_SHIFT)) & DMA_DCHPRI27_GRPPRI_MASK) - -#define DMA_DCHPRI27_DPA_MASK (0x40U) -#define DMA_DCHPRI27_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI27_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI27_DPA_SHIFT)) & DMA_DCHPRI27_DPA_MASK) - -#define DMA_DCHPRI27_ECP_MASK (0x80U) -#define DMA_DCHPRI27_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI27_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI27_ECP_SHIFT)) & DMA_DCHPRI27_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI26 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI26_CHPRI_MASK (0xFU) -#define DMA_DCHPRI26_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI26_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI26_CHPRI_SHIFT)) & DMA_DCHPRI26_CHPRI_MASK) - -#define DMA_DCHPRI26_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI26_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI26_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI26_GRPPRI_SHIFT)) & DMA_DCHPRI26_GRPPRI_MASK) - -#define DMA_DCHPRI26_DPA_MASK (0x40U) -#define DMA_DCHPRI26_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI26_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI26_DPA_SHIFT)) & DMA_DCHPRI26_DPA_MASK) - -#define DMA_DCHPRI26_ECP_MASK (0x80U) -#define DMA_DCHPRI26_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI26_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI26_ECP_SHIFT)) & DMA_DCHPRI26_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI25 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI25_CHPRI_MASK (0xFU) -#define DMA_DCHPRI25_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI25_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI25_CHPRI_SHIFT)) & DMA_DCHPRI25_CHPRI_MASK) - -#define DMA_DCHPRI25_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI25_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI25_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI25_GRPPRI_SHIFT)) & DMA_DCHPRI25_GRPPRI_MASK) - -#define DMA_DCHPRI25_DPA_MASK (0x40U) -#define DMA_DCHPRI25_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI25_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI25_DPA_SHIFT)) & DMA_DCHPRI25_DPA_MASK) - -#define DMA_DCHPRI25_ECP_MASK (0x80U) -#define DMA_DCHPRI25_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI25_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI25_ECP_SHIFT)) & DMA_DCHPRI25_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI24 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI24_CHPRI_MASK (0xFU) -#define DMA_DCHPRI24_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI24_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI24_CHPRI_SHIFT)) & DMA_DCHPRI24_CHPRI_MASK) - -#define DMA_DCHPRI24_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI24_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI24_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI24_GRPPRI_SHIFT)) & DMA_DCHPRI24_GRPPRI_MASK) - -#define DMA_DCHPRI24_DPA_MASK (0x40U) -#define DMA_DCHPRI24_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI24_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI24_DPA_SHIFT)) & DMA_DCHPRI24_DPA_MASK) - -#define DMA_DCHPRI24_ECP_MASK (0x80U) -#define DMA_DCHPRI24_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI24_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI24_ECP_SHIFT)) & DMA_DCHPRI24_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI31 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI31_CHPRI_MASK (0xFU) -#define DMA_DCHPRI31_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI31_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI31_CHPRI_SHIFT)) & DMA_DCHPRI31_CHPRI_MASK) - -#define DMA_DCHPRI31_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI31_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI31_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI31_GRPPRI_SHIFT)) & DMA_DCHPRI31_GRPPRI_MASK) - -#define DMA_DCHPRI31_DPA_MASK (0x40U) -#define DMA_DCHPRI31_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI31_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI31_DPA_SHIFT)) & DMA_DCHPRI31_DPA_MASK) - -#define DMA_DCHPRI31_ECP_MASK (0x80U) -#define DMA_DCHPRI31_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI31_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI31_ECP_SHIFT)) & DMA_DCHPRI31_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI30 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI30_CHPRI_MASK (0xFU) -#define DMA_DCHPRI30_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI30_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI30_CHPRI_SHIFT)) & DMA_DCHPRI30_CHPRI_MASK) - -#define DMA_DCHPRI30_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI30_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI30_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI30_GRPPRI_SHIFT)) & DMA_DCHPRI30_GRPPRI_MASK) - -#define DMA_DCHPRI30_DPA_MASK (0x40U) -#define DMA_DCHPRI30_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI30_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI30_DPA_SHIFT)) & DMA_DCHPRI30_DPA_MASK) - -#define DMA_DCHPRI30_ECP_MASK (0x80U) -#define DMA_DCHPRI30_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI30_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI30_ECP_SHIFT)) & DMA_DCHPRI30_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI29 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI29_CHPRI_MASK (0xFU) -#define DMA_DCHPRI29_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI29_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI29_CHPRI_SHIFT)) & DMA_DCHPRI29_CHPRI_MASK) - -#define DMA_DCHPRI29_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI29_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI29_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI29_GRPPRI_SHIFT)) & DMA_DCHPRI29_GRPPRI_MASK) - -#define DMA_DCHPRI29_DPA_MASK (0x40U) -#define DMA_DCHPRI29_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI29_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI29_DPA_SHIFT)) & DMA_DCHPRI29_DPA_MASK) - -#define DMA_DCHPRI29_ECP_MASK (0x80U) -#define DMA_DCHPRI29_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI29_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI29_ECP_SHIFT)) & DMA_DCHPRI29_ECP_MASK) -/*! @} */ - -/*! @name DCHPRI28 - Channel n Priority Register */ -/*! @{ */ - -#define DMA_DCHPRI28_CHPRI_MASK (0xFU) -#define DMA_DCHPRI28_CHPRI_SHIFT (0U) -/*! CHPRI - Channel n Arbitration Priority - */ -#define DMA_DCHPRI28_CHPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI28_CHPRI_SHIFT)) & DMA_DCHPRI28_CHPRI_MASK) - -#define DMA_DCHPRI28_GRPPRI_MASK (0x30U) -#define DMA_DCHPRI28_GRPPRI_SHIFT (4U) -/*! GRPPRI - Channel n Current Group Priority - */ -#define DMA_DCHPRI28_GRPPRI(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI28_GRPPRI_SHIFT)) & DMA_DCHPRI28_GRPPRI_MASK) - -#define DMA_DCHPRI28_DPA_MASK (0x40U) -#define DMA_DCHPRI28_DPA_SHIFT (6U) -/*! DPA - Disable Preempt Ability. This field resets to 0. - * 0b0..Channel n can suspend a lower priority channel. - * 0b1..Channel n cannot suspend any channel, regardless of channel priority. - */ -#define DMA_DCHPRI28_DPA(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI28_DPA_SHIFT)) & DMA_DCHPRI28_DPA_MASK) - -#define DMA_DCHPRI28_ECP_MASK (0x80U) -#define DMA_DCHPRI28_ECP_SHIFT (7U) -/*! ECP - Enable Channel Preemption. This field resets to 0. - * 0b0..Channel n cannot be suspended by a higher priority channel's service request. - * 0b1..Channel n can be temporarily suspended by the service request of a higher priority channel. - */ -#define DMA_DCHPRI28_ECP(x) (((uint8_t)(((uint8_t)(x)) << DMA_DCHPRI28_ECP_SHIFT)) & DMA_DCHPRI28_ECP_MASK) -/*! @} */ - -/*! @name SADDR - TCD Source Address */ -/*! @{ */ - -#define DMA_SADDR_SADDR_MASK (0xFFFFFFFFU) -#define DMA_SADDR_SADDR_SHIFT (0U) -/*! SADDR - Source Address - */ -#define DMA_SADDR_SADDR(x) (((uint32_t)(((uint32_t)(x)) << DMA_SADDR_SADDR_SHIFT)) & DMA_SADDR_SADDR_MASK) -/*! @} */ - -/* The count of DMA_SADDR */ -#define DMA_SADDR_COUNT (32U) - -/*! @name SOFF - TCD Signed Source Address Offset */ -/*! @{ */ - -#define DMA_SOFF_SOFF_MASK (0xFFFFU) -#define DMA_SOFF_SOFF_SHIFT (0U) -/*! SOFF - Source address signed offset - */ -#define DMA_SOFF_SOFF(x) (((uint16_t)(((uint16_t)(x)) << DMA_SOFF_SOFF_SHIFT)) & DMA_SOFF_SOFF_MASK) -/*! @} */ - -/* The count of DMA_SOFF */ -#define DMA_SOFF_COUNT (32U) - -/*! @name ATTR - TCD Transfer Attributes */ -/*! @{ */ - -#define DMA_ATTR_DSIZE_MASK (0x7U) -#define DMA_ATTR_DSIZE_SHIFT (0U) -/*! DSIZE - Destination data transfer size - */ -#define DMA_ATTR_DSIZE(x) (((uint16_t)(((uint16_t)(x)) << DMA_ATTR_DSIZE_SHIFT)) & DMA_ATTR_DSIZE_MASK) - -#define DMA_ATTR_DMOD_MASK (0xF8U) -#define DMA_ATTR_DMOD_SHIFT (3U) -/*! DMOD - Destination Address Modulo - */ -#define DMA_ATTR_DMOD(x) (((uint16_t)(((uint16_t)(x)) << DMA_ATTR_DMOD_SHIFT)) & DMA_ATTR_DMOD_MASK) - -#define DMA_ATTR_SSIZE_MASK (0x700U) -#define DMA_ATTR_SSIZE_SHIFT (8U) -/*! SSIZE - Source data transfer size - * 0b000..8-bit - * 0b001..16-bit - * 0b010..32-bit - * 0b011..64-bit - * 0b100..Reserved - * 0b101..32-byte burst (4 beats of 64 bits) - * 0b110..Reserved - * 0b111..Reserved - */ -#define DMA_ATTR_SSIZE(x) (((uint16_t)(((uint16_t)(x)) << DMA_ATTR_SSIZE_SHIFT)) & DMA_ATTR_SSIZE_MASK) - -#define DMA_ATTR_SMOD_MASK (0xF800U) -#define DMA_ATTR_SMOD_SHIFT (11U) -/*! SMOD - Source Address Modulo - * 0b00000..Source address modulo feature is disabled - * 0b00001-0b11111..This value defines a specific address range specified to be the value after SADDR + SOFF - * calculation is performed on the original register value. Setting this field provides the ability - * to implement a circular data queue easily. For data queues requiring power-of-2 size bytes, the - * queue should start at a 0-modulo-size address and the SMOD field should be set to the - * appropriate value for the queue, freezing the desired number of upper address bits. The value - * programmed into this field specifies the number of lower address bits allowed to change. For a - * circular queue application, the SOFF is typically set to the transfer size to implement - * post-increment addressing with the SMOD function constraining the addresses to a 0-modulo-size range. - */ -#define DMA_ATTR_SMOD(x) (((uint16_t)(((uint16_t)(x)) << DMA_ATTR_SMOD_SHIFT)) & DMA_ATTR_SMOD_MASK) -/*! @} */ - -/* The count of DMA_ATTR */ -#define DMA_ATTR_COUNT (32U) - -/*! @name NBYTES_MLNO - TCD Minor Byte Count (Minor Loop Mapping Disabled) */ -/*! @{ */ - -#define DMA_NBYTES_MLNO_NBYTES_MASK (0xFFFFFFFFU) -#define DMA_NBYTES_MLNO_NBYTES_SHIFT (0U) -/*! NBYTES - Minor Byte Transfer Count - */ -#define DMA_NBYTES_MLNO_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLNO_NBYTES_SHIFT)) & DMA_NBYTES_MLNO_NBYTES_MASK) -/*! @} */ - -/* The count of DMA_NBYTES_MLNO */ -#define DMA_NBYTES_MLNO_COUNT (32U) - -/*! @name NBYTES_MLOFFNO - TCD Signed Minor Loop Offset (Minor Loop Mapping Enabled and Offset Disabled) */ -/*! @{ */ - -#define DMA_NBYTES_MLOFFNO_NBYTES_MASK (0x3FFFFFFFU) -#define DMA_NBYTES_MLOFFNO_NBYTES_SHIFT (0U) -/*! NBYTES - Minor Byte Transfer Count - */ -#define DMA_NBYTES_MLOFFNO_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFNO_NBYTES_SHIFT)) & DMA_NBYTES_MLOFFNO_NBYTES_MASK) - -#define DMA_NBYTES_MLOFFNO_DMLOE_MASK (0x40000000U) -#define DMA_NBYTES_MLOFFNO_DMLOE_SHIFT (30U) -/*! DMLOE - Destination Minor Loop Offset enable - * 0b0..The minor loop offset is not applied to the DADDR - * 0b1..The minor loop offset is applied to the DADDR - */ -#define DMA_NBYTES_MLOFFNO_DMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFNO_DMLOE_SHIFT)) & DMA_NBYTES_MLOFFNO_DMLOE_MASK) - -#define DMA_NBYTES_MLOFFNO_SMLOE_MASK (0x80000000U) -#define DMA_NBYTES_MLOFFNO_SMLOE_SHIFT (31U) -/*! SMLOE - Source Minor Loop Offset Enable - * 0b0..The minor loop offset is not applied to the SADDR - * 0b1..The minor loop offset is applied to the SADDR - */ -#define DMA_NBYTES_MLOFFNO_SMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFNO_SMLOE_SHIFT)) & DMA_NBYTES_MLOFFNO_SMLOE_MASK) -/*! @} */ - -/* The count of DMA_NBYTES_MLOFFNO */ -#define DMA_NBYTES_MLOFFNO_COUNT (32U) - -/*! @name NBYTES_MLOFFYES - TCD Signed Minor Loop Offset (Minor Loop Mapping and Offset Enabled) */ -/*! @{ */ - -#define DMA_NBYTES_MLOFFYES_NBYTES_MASK (0x3FFU) -#define DMA_NBYTES_MLOFFYES_NBYTES_SHIFT (0U) -/*! NBYTES - Minor Byte Transfer Count - */ -#define DMA_NBYTES_MLOFFYES_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFYES_NBYTES_SHIFT)) & DMA_NBYTES_MLOFFYES_NBYTES_MASK) - -#define DMA_NBYTES_MLOFFYES_MLOFF_MASK (0x3FFFFC00U) -#define DMA_NBYTES_MLOFFYES_MLOFF_SHIFT (10U) -/*! MLOFF - If SMLOE or DMLOE is set, this field represents a sign-extended offset applied to the - * source or destination address to form the next-state value after the minor loop completes. - */ -#define DMA_NBYTES_MLOFFYES_MLOFF(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFYES_MLOFF_SHIFT)) & DMA_NBYTES_MLOFFYES_MLOFF_MASK) - -#define DMA_NBYTES_MLOFFYES_DMLOE_MASK (0x40000000U) -#define DMA_NBYTES_MLOFFYES_DMLOE_SHIFT (30U) -/*! DMLOE - Destination Minor Loop Offset enable - * 0b0..The minor loop offset is not applied to the DADDR - * 0b1..The minor loop offset is applied to the DADDR - */ -#define DMA_NBYTES_MLOFFYES_DMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFYES_DMLOE_SHIFT)) & DMA_NBYTES_MLOFFYES_DMLOE_MASK) - -#define DMA_NBYTES_MLOFFYES_SMLOE_MASK (0x80000000U) -#define DMA_NBYTES_MLOFFYES_SMLOE_SHIFT (31U) -/*! SMLOE - Source Minor Loop Offset Enable - * 0b0..The minor loop offset is not applied to the SADDR - * 0b1..The minor loop offset is applied to the SADDR - */ -#define DMA_NBYTES_MLOFFYES_SMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_NBYTES_MLOFFYES_SMLOE_SHIFT)) & DMA_NBYTES_MLOFFYES_SMLOE_MASK) -/*! @} */ - -/* The count of DMA_NBYTES_MLOFFYES */ -#define DMA_NBYTES_MLOFFYES_COUNT (32U) - -/*! @name SLAST - TCD Last Source Address Adjustment */ -/*! @{ */ - -#define DMA_SLAST_SLAST_MASK (0xFFFFFFFFU) -#define DMA_SLAST_SLAST_SHIFT (0U) -/*! SLAST - Last Source Address Adjustment - */ -#define DMA_SLAST_SLAST(x) (((uint32_t)(((uint32_t)(x)) << DMA_SLAST_SLAST_SHIFT)) & DMA_SLAST_SLAST_MASK) -/*! @} */ - -/* The count of DMA_SLAST */ -#define DMA_SLAST_COUNT (32U) - -/*! @name DADDR - TCD Destination Address */ -/*! @{ */ - -#define DMA_DADDR_DADDR_MASK (0xFFFFFFFFU) -#define DMA_DADDR_DADDR_SHIFT (0U) -/*! DADDR - Destination Address - */ -#define DMA_DADDR_DADDR(x) (((uint32_t)(((uint32_t)(x)) << DMA_DADDR_DADDR_SHIFT)) & DMA_DADDR_DADDR_MASK) -/*! @} */ - -/* The count of DMA_DADDR */ -#define DMA_DADDR_COUNT (32U) - -/*! @name DOFF - TCD Signed Destination Address Offset */ -/*! @{ */ - -#define DMA_DOFF_DOFF_MASK (0xFFFFU) -#define DMA_DOFF_DOFF_SHIFT (0U) -/*! DOFF - Destination Address Signed Offset - */ -#define DMA_DOFF_DOFF(x) (((uint16_t)(((uint16_t)(x)) << DMA_DOFF_DOFF_SHIFT)) & DMA_DOFF_DOFF_MASK) -/*! @} */ - -/* The count of DMA_DOFF */ -#define DMA_DOFF_COUNT (32U) - -/*! @name CITER_ELINKNO - TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled) */ -/*! @{ */ - -#define DMA_CITER_ELINKNO_CITER_MASK (0x7FFFU) -#define DMA_CITER_ELINKNO_CITER_SHIFT (0U) -/*! CITER - Current Major Iteration Count - */ -#define DMA_CITER_ELINKNO_CITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_CITER_ELINKNO_CITER_SHIFT)) & DMA_CITER_ELINKNO_CITER_MASK) - -#define DMA_CITER_ELINKNO_ELINK_MASK (0x8000U) -#define DMA_CITER_ELINKNO_ELINK_SHIFT (15U) -/*! ELINK - Enable channel-to-channel linking on minor-loop complete - * 0b0..The channel-to-channel linking is disabled - * 0b1..The channel-to-channel linking is enabled - */ -#define DMA_CITER_ELINKNO_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_CITER_ELINKNO_ELINK_SHIFT)) & DMA_CITER_ELINKNO_ELINK_MASK) -/*! @} */ - -/* The count of DMA_CITER_ELINKNO */ -#define DMA_CITER_ELINKNO_COUNT (32U) - -/*! @name CITER_ELINKYES - TCD Current Minor Loop Link, Major Loop Count (Channel Linking Enabled) */ -/*! @{ */ - -#define DMA_CITER_ELINKYES_CITER_MASK (0x1FFU) -#define DMA_CITER_ELINKYES_CITER_SHIFT (0U) -/*! CITER - Current Major Iteration Count - */ -#define DMA_CITER_ELINKYES_CITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_CITER_ELINKYES_CITER_SHIFT)) & DMA_CITER_ELINKYES_CITER_MASK) - -#define DMA_CITER_ELINKYES_LINKCH_MASK (0x3E00U) -#define DMA_CITER_ELINKYES_LINKCH_SHIFT (9U) -/*! LINKCH - Minor Loop Link Channel Number - */ -#define DMA_CITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_CITER_ELINKYES_LINKCH_SHIFT)) & DMA_CITER_ELINKYES_LINKCH_MASK) - -#define DMA_CITER_ELINKYES_ELINK_MASK (0x8000U) -#define DMA_CITER_ELINKYES_ELINK_SHIFT (15U) -/*! ELINK - Enable channel-to-channel linking on minor-loop complete - * 0b0..The channel-to-channel linking is disabled - * 0b1..The channel-to-channel linking is enabled - */ -#define DMA_CITER_ELINKYES_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_CITER_ELINKYES_ELINK_SHIFT)) & DMA_CITER_ELINKYES_ELINK_MASK) -/*! @} */ - -/* The count of DMA_CITER_ELINKYES */ -#define DMA_CITER_ELINKYES_COUNT (32U) - -/*! @name DLAST_SGA - TCD Last Destination Address Adjustment/Scatter Gather Address */ -/*! @{ */ - -#define DMA_DLAST_SGA_DLASTSGA_MASK (0xFFFFFFFFU) -#define DMA_DLAST_SGA_DLASTSGA_SHIFT (0U) -/*! DLASTSGA - DLASTSGA - */ -#define DMA_DLAST_SGA_DLASTSGA(x) (((uint32_t)(((uint32_t)(x)) << DMA_DLAST_SGA_DLASTSGA_SHIFT)) & DMA_DLAST_SGA_DLASTSGA_MASK) -/*! @} */ - -/* The count of DMA_DLAST_SGA */ -#define DMA_DLAST_SGA_COUNT (32U) - -/*! @name CSR - TCD Control and Status */ -/*! @{ */ - -#define DMA_CSR_START_MASK (0x1U) -#define DMA_CSR_START_SHIFT (0U) -/*! START - Channel Start - * 0b0..The channel is not explicitly started. - * 0b1..The channel is explicitly started via a software initiated service request. - */ -#define DMA_CSR_START(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_START_SHIFT)) & DMA_CSR_START_MASK) - -#define DMA_CSR_INTMAJOR_MASK (0x2U) -#define DMA_CSR_INTMAJOR_SHIFT (1U) -/*! INTMAJOR - Enable an interrupt when major iteration count completes. - * 0b0..The end-of-major loop interrupt is disabled. - * 0b1..The end-of-major loop interrupt is enabled. - */ -#define DMA_CSR_INTMAJOR(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_INTMAJOR_SHIFT)) & DMA_CSR_INTMAJOR_MASK) - -#define DMA_CSR_INTHALF_MASK (0x4U) -#define DMA_CSR_INTHALF_SHIFT (2U) -/*! INTHALF - Enable an interrupt when major counter is half complete. - * 0b0..The half-point interrupt is disabled. - * 0b1..The half-point interrupt is enabled. - */ -#define DMA_CSR_INTHALF(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_INTHALF_SHIFT)) & DMA_CSR_INTHALF_MASK) - -#define DMA_CSR_DREQ_MASK (0x8U) -#define DMA_CSR_DREQ_SHIFT (3U) -/*! DREQ - Disable Request - * 0b0..The channel's ERQ bit is not affected. - * 0b1..The channel's ERQ bit is cleared when the major loop is complete. - */ -#define DMA_CSR_DREQ(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_DREQ_SHIFT)) & DMA_CSR_DREQ_MASK) - -#define DMA_CSR_ESG_MASK (0x10U) -#define DMA_CSR_ESG_SHIFT (4U) -/*! ESG - Enable Scatter/Gather Processing - * 0b0..The current channel's TCD is normal format. - * 0b1..The current channel's TCD specifies a scatter gather format. The DLASTSGA field provides a memory pointer - * to the next TCD to be loaded into this channel after the major loop completes its execution. - */ -#define DMA_CSR_ESG(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_ESG_SHIFT)) & DMA_CSR_ESG_MASK) - -#define DMA_CSR_MAJORELINK_MASK (0x20U) -#define DMA_CSR_MAJORELINK_SHIFT (5U) -/*! MAJORELINK - Enable channel-to-channel linking on major loop complete - * 0b0..The channel-to-channel linking is disabled. - * 0b1..The channel-to-channel linking is enabled. - */ -#define DMA_CSR_MAJORELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_MAJORELINK_SHIFT)) & DMA_CSR_MAJORELINK_MASK) - -#define DMA_CSR_ACTIVE_MASK (0x40U) -#define DMA_CSR_ACTIVE_SHIFT (6U) -/*! ACTIVE - Channel Active - */ -#define DMA_CSR_ACTIVE(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_ACTIVE_SHIFT)) & DMA_CSR_ACTIVE_MASK) - -#define DMA_CSR_DONE_MASK (0x80U) -#define DMA_CSR_DONE_SHIFT (7U) -/*! DONE - Channel Done - */ -#define DMA_CSR_DONE(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_DONE_SHIFT)) & DMA_CSR_DONE_MASK) - -#define DMA_CSR_MAJORLINKCH_MASK (0x1F00U) -#define DMA_CSR_MAJORLINKCH_SHIFT (8U) -/*! MAJORLINKCH - Major Loop Link Channel Number - */ -#define DMA_CSR_MAJORLINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_MAJORLINKCH_SHIFT)) & DMA_CSR_MAJORLINKCH_MASK) - -#define DMA_CSR_BWC_MASK (0xC000U) -#define DMA_CSR_BWC_SHIFT (14U) -/*! BWC - Bandwidth Control - * 0b00..No eDMA engine stalls. - * 0b01..Reserved - * 0b10..eDMA engine stalls for 4 cycles after each R/W. - * 0b11..eDMA engine stalls for 8 cycles after each R/W. - */ -#define DMA_CSR_BWC(x) (((uint16_t)(((uint16_t)(x)) << DMA_CSR_BWC_SHIFT)) & DMA_CSR_BWC_MASK) -/*! @} */ - -/* The count of DMA_CSR */ -#define DMA_CSR_COUNT (32U) - -/*! @name BITER_ELINKNO - TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Disabled) */ -/*! @{ */ - -#define DMA_BITER_ELINKNO_BITER_MASK (0x7FFFU) -#define DMA_BITER_ELINKNO_BITER_SHIFT (0U) -/*! BITER - Starting Major Iteration Count - */ -#define DMA_BITER_ELINKNO_BITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_BITER_ELINKNO_BITER_SHIFT)) & DMA_BITER_ELINKNO_BITER_MASK) - -#define DMA_BITER_ELINKNO_ELINK_MASK (0x8000U) -#define DMA_BITER_ELINKNO_ELINK_SHIFT (15U) -/*! ELINK - Enables channel-to-channel linking on minor loop complete - * 0b0..The channel-to-channel linking is disabled - * 0b1..The channel-to-channel linking is enabled - */ -#define DMA_BITER_ELINKNO_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_BITER_ELINKNO_ELINK_SHIFT)) & DMA_BITER_ELINKNO_ELINK_MASK) -/*! @} */ - -/* The count of DMA_BITER_ELINKNO */ -#define DMA_BITER_ELINKNO_COUNT (32U) - -/*! @name BITER_ELINKYES - TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Enabled) */ -/*! @{ */ - -#define DMA_BITER_ELINKYES_BITER_MASK (0x1FFU) -#define DMA_BITER_ELINKYES_BITER_SHIFT (0U) -/*! BITER - Starting major iteration count - */ -#define DMA_BITER_ELINKYES_BITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_BITER_ELINKYES_BITER_SHIFT)) & DMA_BITER_ELINKYES_BITER_MASK) - -#define DMA_BITER_ELINKYES_LINKCH_MASK (0x3E00U) -#define DMA_BITER_ELINKYES_LINKCH_SHIFT (9U) -/*! LINKCH - Link Channel Number - */ -#define DMA_BITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_BITER_ELINKYES_LINKCH_SHIFT)) & DMA_BITER_ELINKYES_LINKCH_MASK) - -#define DMA_BITER_ELINKYES_ELINK_MASK (0x8000U) -#define DMA_BITER_ELINKYES_ELINK_SHIFT (15U) -/*! ELINK - Enables channel-to-channel linking on minor loop complete - * 0b0..The channel-to-channel linking is disabled - * 0b1..The channel-to-channel linking is enabled - */ -#define DMA_BITER_ELINKYES_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_BITER_ELINKYES_ELINK_SHIFT)) & DMA_BITER_ELINKYES_ELINK_MASK) -/*! @} */ - -/* The count of DMA_BITER_ELINKYES */ -#define DMA_BITER_ELINKYES_COUNT (32U) - - -/*! - * @} - */ /* end of group DMA_Register_Masks */ - - -/* DMA - Peripheral instance base addresses */ -/** Peripheral DMA0 base address */ -#define DMA0_BASE (0x400E8000u) -/** Peripheral DMA0 base pointer */ -#define DMA0 ((DMA_Type *)DMA0_BASE) -/** Array initializer of DMA peripheral base addresses */ -#define DMA_BASE_ADDRS { DMA0_BASE } -/** Array initializer of DMA peripheral base pointers */ -#define DMA_BASE_PTRS { DMA0 } -/** Interrupt vectors for the DMA peripheral type */ -#define DMA_CHN_IRQS { { DMA0_DMA16_IRQn, DMA1_DMA17_IRQn, DMA2_DMA18_IRQn, DMA3_DMA19_IRQn, DMA4_DMA20_IRQn, DMA5_DMA21_IRQn, DMA6_DMA22_IRQn, DMA7_DMA23_IRQn, DMA8_DMA24_IRQn, DMA9_DMA25_IRQn, DMA10_DMA26_IRQn, DMA11_DMA27_IRQn, DMA12_DMA28_IRQn, DMA13_DMA29_IRQn, DMA14_DMA30_IRQn, DMA15_DMA31_IRQn, DMA0_DMA16_IRQn, DMA1_DMA17_IRQn, DMA2_DMA18_IRQn, DMA3_DMA19_IRQn, DMA4_DMA20_IRQn, DMA5_DMA21_IRQn, DMA6_DMA22_IRQn, DMA7_DMA23_IRQn, DMA8_DMA24_IRQn, DMA9_DMA25_IRQn, DMA10_DMA26_IRQn, DMA11_DMA27_IRQn, DMA12_DMA28_IRQn, DMA13_DMA29_IRQn, DMA14_DMA30_IRQn, DMA15_DMA31_IRQn } } -#define DMA_ERROR_IRQS { DMA_ERROR_IRQn } - -/*! - * @} - */ /* end of group DMA_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- DMAMUX Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DMAMUX_Peripheral_Access_Layer DMAMUX Peripheral Access Layer - * @{ - */ - -/** DMAMUX - Register Layout Typedef */ -typedef struct { - __IO uint32_t CHCFG[32]; /**< Channel 0 Configuration Register..Channel 31 Configuration Register, array offset: 0x0, array step: 0x4 */ -} DMAMUX_Type; - -/* ---------------------------------------------------------------------------- - -- DMAMUX Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup DMAMUX_Register_Masks DMAMUX Register Masks - * @{ - */ - -/*! @name CHCFG - Channel 0 Configuration Register..Channel 31 Configuration Register */ -/*! @{ */ - -#define DMAMUX_CHCFG_SOURCE_MASK (0x7FU) -#define DMAMUX_CHCFG_SOURCE_SHIFT (0U) -/*! SOURCE - DMA Channel Source (Slot Number) - */ -#define DMAMUX_CHCFG_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << DMAMUX_CHCFG_SOURCE_SHIFT)) & DMAMUX_CHCFG_SOURCE_MASK) - -#define DMAMUX_CHCFG_A_ON_MASK (0x20000000U) -#define DMAMUX_CHCFG_A_ON_SHIFT (29U) -/*! A_ON - DMA Channel Always Enable - * 0b0..DMA Channel Always ON function is disabled - * 0b1..DMA Channel Always ON function is enabled - */ -#define DMAMUX_CHCFG_A_ON(x) (((uint32_t)(((uint32_t)(x)) << DMAMUX_CHCFG_A_ON_SHIFT)) & DMAMUX_CHCFG_A_ON_MASK) - -#define DMAMUX_CHCFG_TRIG_MASK (0x40000000U) -#define DMAMUX_CHCFG_TRIG_SHIFT (30U) -/*! TRIG - DMA Channel Trigger Enable - * 0b0..Triggering is disabled. If triggering is disabled and ENBL is set, the DMA Channel will simply route the - * specified source to the DMA channel. (Normal mode) - * 0b1..Triggering is enabled. If triggering is enabled and ENBL is set, the DMA_CH_MUX is in Periodic Trigger mode. - */ -#define DMAMUX_CHCFG_TRIG(x) (((uint32_t)(((uint32_t)(x)) << DMAMUX_CHCFG_TRIG_SHIFT)) & DMAMUX_CHCFG_TRIG_MASK) - -#define DMAMUX_CHCFG_ENBL_MASK (0x80000000U) -#define DMAMUX_CHCFG_ENBL_SHIFT (31U) -/*! ENBL - DMA Mux Channel Enable - * 0b0..DMA Mux channel is disabled - * 0b1..DMA Mux channel is enabled - */ -#define DMAMUX_CHCFG_ENBL(x) (((uint32_t)(((uint32_t)(x)) << DMAMUX_CHCFG_ENBL_SHIFT)) & DMAMUX_CHCFG_ENBL_MASK) -/*! @} */ - -/* The count of DMAMUX_CHCFG */ -#define DMAMUX_CHCFG_COUNT (32U) - - -/*! - * @} - */ /* end of group DMAMUX_Register_Masks */ - - -/* DMAMUX - Peripheral instance base addresses */ -/** Peripheral DMAMUX base address */ -#define DMAMUX_BASE (0x400EC000u) -/** Peripheral DMAMUX base pointer */ -#define DMAMUX ((DMAMUX_Type *)DMAMUX_BASE) -/** Array initializer of DMAMUX peripheral base addresses */ -#define DMAMUX_BASE_ADDRS { DMAMUX_BASE } -/** Array initializer of DMAMUX peripheral base pointers */ -#define DMAMUX_BASE_PTRS { DMAMUX } - -/*! - * @} - */ /* end of group DMAMUX_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- ENC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ENC_Peripheral_Access_Layer ENC Peripheral Access Layer - * @{ - */ - -/** ENC - Register Layout Typedef */ -typedef struct { - __IO uint16_t CTRL; /**< Control Register, offset: 0x0 */ - __IO uint16_t FILT; /**< Input Filter Register, offset: 0x2 */ - __IO uint16_t WTR; /**< Watchdog Timeout Register, offset: 0x4 */ - __IO uint16_t POSD; /**< Position Difference Counter Register, offset: 0x6 */ - __I uint16_t POSDH; /**< Position Difference Hold Register, offset: 0x8 */ - __IO uint16_t REV; /**< Revolution Counter Register, offset: 0xA */ - __I uint16_t REVH; /**< Revolution Hold Register, offset: 0xC */ - __IO uint16_t UPOS; /**< Upper Position Counter Register, offset: 0xE */ - __IO uint16_t LPOS; /**< Lower Position Counter Register, offset: 0x10 */ - __I uint16_t UPOSH; /**< Upper Position Hold Register, offset: 0x12 */ - __I uint16_t LPOSH; /**< Lower Position Hold Register, offset: 0x14 */ - __IO uint16_t UINIT; /**< Upper Initialization Register, offset: 0x16 */ - __IO uint16_t LINIT; /**< Lower Initialization Register, offset: 0x18 */ - __I uint16_t IMR; /**< Input Monitor Register, offset: 0x1A */ - __IO uint16_t TST; /**< Test Register, offset: 0x1C */ - __IO uint16_t CTRL2; /**< Control 2 Register, offset: 0x1E */ - __IO uint16_t UMOD; /**< Upper Modulus Register, offset: 0x20 */ - __IO uint16_t LMOD; /**< Lower Modulus Register, offset: 0x22 */ - __IO uint16_t UCOMP; /**< Upper Position Compare Register, offset: 0x24 */ - __IO uint16_t LCOMP; /**< Lower Position Compare Register, offset: 0x26 */ -} ENC_Type; - -/* ---------------------------------------------------------------------------- - -- ENC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ENC_Register_Masks ENC Register Masks - * @{ - */ - -/*! @name CTRL - Control Register */ -/*! @{ */ - -#define ENC_CTRL_CMPIE_MASK (0x1U) -#define ENC_CTRL_CMPIE_SHIFT (0U) -/*! CMPIE - Compare Interrupt Enable - * 0b0..Compare interrupt is disabled - * 0b1..Compare interrupt is enabled - */ -#define ENC_CTRL_CMPIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_CMPIE_SHIFT)) & ENC_CTRL_CMPIE_MASK) - -#define ENC_CTRL_CMPIRQ_MASK (0x2U) -#define ENC_CTRL_CMPIRQ_SHIFT (1U) -/*! CMPIRQ - Compare Interrupt Request - * 0b0..No match has occurred - * 0b1..COMP match has occurred - */ -#define ENC_CTRL_CMPIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_CMPIRQ_SHIFT)) & ENC_CTRL_CMPIRQ_MASK) - -#define ENC_CTRL_WDE_MASK (0x4U) -#define ENC_CTRL_WDE_SHIFT (2U) -/*! WDE - Watchdog Enable - * 0b0..Watchdog timer is disabled - * 0b1..Watchdog timer is enabled - */ -#define ENC_CTRL_WDE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_WDE_SHIFT)) & ENC_CTRL_WDE_MASK) - -#define ENC_CTRL_DIE_MASK (0x8U) -#define ENC_CTRL_DIE_SHIFT (3U) -/*! DIE - Watchdog Timeout Interrupt Enable - * 0b0..Watchdog timer interrupt is disabled - * 0b1..Watchdog timer interrupt is enabled - */ -#define ENC_CTRL_DIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_DIE_SHIFT)) & ENC_CTRL_DIE_MASK) - -#define ENC_CTRL_DIRQ_MASK (0x10U) -#define ENC_CTRL_DIRQ_SHIFT (4U) -/*! DIRQ - Watchdog Timeout Interrupt Request - * 0b0..No interrupt has occurred - * 0b1..Watchdog timeout interrupt has occurred - */ -#define ENC_CTRL_DIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_DIRQ_SHIFT)) & ENC_CTRL_DIRQ_MASK) - -#define ENC_CTRL_XNE_MASK (0x20U) -#define ENC_CTRL_XNE_SHIFT (5U) -/*! XNE - Use Negative Edge of INDEX Pulse - * 0b0..Use positive transition edge of INDEX pulse - * 0b1..Use negative transition edge of INDEX pulse - */ -#define ENC_CTRL_XNE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_XNE_SHIFT)) & ENC_CTRL_XNE_MASK) - -#define ENC_CTRL_XIP_MASK (0x40U) -#define ENC_CTRL_XIP_SHIFT (6U) -/*! XIP - INDEX Triggered Initialization of Position Counters UPOS and LPOS - * 0b0..No action - * 0b1..INDEX pulse initializes the position counter - */ -#define ENC_CTRL_XIP(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_XIP_SHIFT)) & ENC_CTRL_XIP_MASK) - -#define ENC_CTRL_XIE_MASK (0x80U) -#define ENC_CTRL_XIE_SHIFT (7U) -/*! XIE - INDEX Pulse Interrupt Enable - * 0b0..INDEX pulse interrupt is disabled - * 0b1..INDEX pulse interrupt is enabled - */ -#define ENC_CTRL_XIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_XIE_SHIFT)) & ENC_CTRL_XIE_MASK) - -#define ENC_CTRL_XIRQ_MASK (0x100U) -#define ENC_CTRL_XIRQ_SHIFT (8U) -/*! XIRQ - INDEX Pulse Interrupt Request - * 0b0..No interrupt has occurred - * 0b1..INDEX pulse interrupt has occurred - */ -#define ENC_CTRL_XIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_XIRQ_SHIFT)) & ENC_CTRL_XIRQ_MASK) - -#define ENC_CTRL_PH1_MASK (0x200U) -#define ENC_CTRL_PH1_SHIFT (9U) -/*! PH1 - Enable Signal Phase Count Mode - * 0b0..Use standard quadrature decoder where PHASEA and PHASEB represent a two phase quadrature signal. - * 0b1..Bypass the quadrature decoder. A positive transition of the PHASEA input generates a count signal. The - * PHASEB input and the REV bit control the counter direction. If CTRL[REV] = 0, PHASEB = 0, then count up If - * CTRL[REV] = 0, PHASEB = 1, then count down If CTRL[REV] = 1, PHASEB = 0, then count down If CTRL[REV] = 1, - * PHASEB = 1, then count up - */ -#define ENC_CTRL_PH1(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_PH1_SHIFT)) & ENC_CTRL_PH1_MASK) - -#define ENC_CTRL_REV_MASK (0x400U) -#define ENC_CTRL_REV_SHIFT (10U) -/*! REV - Enable Reverse Direction Counting - * 0b0..Count normally - * 0b1..Count in the reverse direction - */ -#define ENC_CTRL_REV(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_REV_SHIFT)) & ENC_CTRL_REV_MASK) - -#define ENC_CTRL_SWIP_MASK (0x800U) -#define ENC_CTRL_SWIP_SHIFT (11U) -/*! SWIP - Software Triggered Initialization of Position Counters UPOS and LPOS - * 0b0..No action - * 0b1..Initialize position counter - */ -#define ENC_CTRL_SWIP(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_SWIP_SHIFT)) & ENC_CTRL_SWIP_MASK) - -#define ENC_CTRL_HNE_MASK (0x1000U) -#define ENC_CTRL_HNE_SHIFT (12U) -/*! HNE - Use Negative Edge of HOME Input - * 0b0..Use positive going edge-to-trigger initialization of position counters UPOS and LPOS - * 0b1..Use negative going edge-to-trigger initialization of position counters UPOS and LPOS - */ -#define ENC_CTRL_HNE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_HNE_SHIFT)) & ENC_CTRL_HNE_MASK) - -#define ENC_CTRL_HIP_MASK (0x2000U) -#define ENC_CTRL_HIP_SHIFT (13U) -/*! HIP - Enable HOME to Initialize Position Counters UPOS and LPOS - * 0b0..No action - * 0b1..HOME signal initializes the position counter - */ -#define ENC_CTRL_HIP(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_HIP_SHIFT)) & ENC_CTRL_HIP_MASK) - -#define ENC_CTRL_HIE_MASK (0x4000U) -#define ENC_CTRL_HIE_SHIFT (14U) -/*! HIE - HOME Interrupt Enable - * 0b0..Disable HOME interrupts - * 0b1..Enable HOME interrupts - */ -#define ENC_CTRL_HIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_HIE_SHIFT)) & ENC_CTRL_HIE_MASK) - -#define ENC_CTRL_HIRQ_MASK (0x8000U) -#define ENC_CTRL_HIRQ_SHIFT (15U) -/*! HIRQ - HOME Signal Transition Interrupt Request - * 0b0..No interrupt - * 0b1..HOME signal transition interrupt request - */ -#define ENC_CTRL_HIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL_HIRQ_SHIFT)) & ENC_CTRL_HIRQ_MASK) -/*! @} */ - -/*! @name FILT - Input Filter Register */ -/*! @{ */ - -#define ENC_FILT_FILT_PER_MASK (0xFFU) -#define ENC_FILT_FILT_PER_SHIFT (0U) -/*! FILT_PER - Input Filter Sample Period - */ -#define ENC_FILT_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << ENC_FILT_FILT_PER_SHIFT)) & ENC_FILT_FILT_PER_MASK) - -#define ENC_FILT_FILT_CNT_MASK (0x700U) -#define ENC_FILT_FILT_CNT_SHIFT (8U) -/*! FILT_CNT - Input Filter Sample Count - */ -#define ENC_FILT_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << ENC_FILT_FILT_CNT_SHIFT)) & ENC_FILT_FILT_CNT_MASK) -/*! @} */ - -/*! @name WTR - Watchdog Timeout Register */ -/*! @{ */ - -#define ENC_WTR_WDOG_MASK (0xFFFFU) -#define ENC_WTR_WDOG_SHIFT (0U) -#define ENC_WTR_WDOG(x) (((uint16_t)(((uint16_t)(x)) << ENC_WTR_WDOG_SHIFT)) & ENC_WTR_WDOG_MASK) -/*! @} */ - -/*! @name POSD - Position Difference Counter Register */ -/*! @{ */ - -#define ENC_POSD_POSD_MASK (0xFFFFU) -#define ENC_POSD_POSD_SHIFT (0U) -#define ENC_POSD_POSD(x) (((uint16_t)(((uint16_t)(x)) << ENC_POSD_POSD_SHIFT)) & ENC_POSD_POSD_MASK) -/*! @} */ - -/*! @name POSDH - Position Difference Hold Register */ -/*! @{ */ - -#define ENC_POSDH_POSDH_MASK (0xFFFFU) -#define ENC_POSDH_POSDH_SHIFT (0U) -#define ENC_POSDH_POSDH(x) (((uint16_t)(((uint16_t)(x)) << ENC_POSDH_POSDH_SHIFT)) & ENC_POSDH_POSDH_MASK) -/*! @} */ - -/*! @name REV - Revolution Counter Register */ -/*! @{ */ - -#define ENC_REV_REV_MASK (0xFFFFU) -#define ENC_REV_REV_SHIFT (0U) -#define ENC_REV_REV(x) (((uint16_t)(((uint16_t)(x)) << ENC_REV_REV_SHIFT)) & ENC_REV_REV_MASK) -/*! @} */ - -/*! @name REVH - Revolution Hold Register */ -/*! @{ */ - -#define ENC_REVH_REVH_MASK (0xFFFFU) -#define ENC_REVH_REVH_SHIFT (0U) -#define ENC_REVH_REVH(x) (((uint16_t)(((uint16_t)(x)) << ENC_REVH_REVH_SHIFT)) & ENC_REVH_REVH_MASK) -/*! @} */ - -/*! @name UPOS - Upper Position Counter Register */ -/*! @{ */ - -#define ENC_UPOS_POS_MASK (0xFFFFU) -#define ENC_UPOS_POS_SHIFT (0U) -#define ENC_UPOS_POS(x) (((uint16_t)(((uint16_t)(x)) << ENC_UPOS_POS_SHIFT)) & ENC_UPOS_POS_MASK) -/*! @} */ - -/*! @name LPOS - Lower Position Counter Register */ -/*! @{ */ - -#define ENC_LPOS_POS_MASK (0xFFFFU) -#define ENC_LPOS_POS_SHIFT (0U) -#define ENC_LPOS_POS(x) (((uint16_t)(((uint16_t)(x)) << ENC_LPOS_POS_SHIFT)) & ENC_LPOS_POS_MASK) -/*! @} */ - -/*! @name UPOSH - Upper Position Hold Register */ -/*! @{ */ - -#define ENC_UPOSH_POSH_MASK (0xFFFFU) -#define ENC_UPOSH_POSH_SHIFT (0U) -#define ENC_UPOSH_POSH(x) (((uint16_t)(((uint16_t)(x)) << ENC_UPOSH_POSH_SHIFT)) & ENC_UPOSH_POSH_MASK) -/*! @} */ - -/*! @name LPOSH - Lower Position Hold Register */ -/*! @{ */ - -#define ENC_LPOSH_POSH_MASK (0xFFFFU) -#define ENC_LPOSH_POSH_SHIFT (0U) -#define ENC_LPOSH_POSH(x) (((uint16_t)(((uint16_t)(x)) << ENC_LPOSH_POSH_SHIFT)) & ENC_LPOSH_POSH_MASK) -/*! @} */ - -/*! @name UINIT - Upper Initialization Register */ -/*! @{ */ - -#define ENC_UINIT_INIT_MASK (0xFFFFU) -#define ENC_UINIT_INIT_SHIFT (0U) -#define ENC_UINIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << ENC_UINIT_INIT_SHIFT)) & ENC_UINIT_INIT_MASK) -/*! @} */ - -/*! @name LINIT - Lower Initialization Register */ -/*! @{ */ - -#define ENC_LINIT_INIT_MASK (0xFFFFU) -#define ENC_LINIT_INIT_SHIFT (0U) -#define ENC_LINIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << ENC_LINIT_INIT_SHIFT)) & ENC_LINIT_INIT_MASK) -/*! @} */ - -/*! @name IMR - Input Monitor Register */ -/*! @{ */ - -#define ENC_IMR_HOME_MASK (0x1U) -#define ENC_IMR_HOME_SHIFT (0U) -#define ENC_IMR_HOME(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_HOME_SHIFT)) & ENC_IMR_HOME_MASK) - -#define ENC_IMR_INDEX_MASK (0x2U) -#define ENC_IMR_INDEX_SHIFT (1U) -#define ENC_IMR_INDEX(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_INDEX_SHIFT)) & ENC_IMR_INDEX_MASK) - -#define ENC_IMR_PHB_MASK (0x4U) -#define ENC_IMR_PHB_SHIFT (2U) -#define ENC_IMR_PHB(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_PHB_SHIFT)) & ENC_IMR_PHB_MASK) - -#define ENC_IMR_PHA_MASK (0x8U) -#define ENC_IMR_PHA_SHIFT (3U) -#define ENC_IMR_PHA(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_PHA_SHIFT)) & ENC_IMR_PHA_MASK) - -#define ENC_IMR_FHOM_MASK (0x10U) -#define ENC_IMR_FHOM_SHIFT (4U) -#define ENC_IMR_FHOM(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_FHOM_SHIFT)) & ENC_IMR_FHOM_MASK) - -#define ENC_IMR_FIND_MASK (0x20U) -#define ENC_IMR_FIND_SHIFT (5U) -#define ENC_IMR_FIND(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_FIND_SHIFT)) & ENC_IMR_FIND_MASK) - -#define ENC_IMR_FPHB_MASK (0x40U) -#define ENC_IMR_FPHB_SHIFT (6U) -#define ENC_IMR_FPHB(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_FPHB_SHIFT)) & ENC_IMR_FPHB_MASK) - -#define ENC_IMR_FPHA_MASK (0x80U) -#define ENC_IMR_FPHA_SHIFT (7U) -#define ENC_IMR_FPHA(x) (((uint16_t)(((uint16_t)(x)) << ENC_IMR_FPHA_SHIFT)) & ENC_IMR_FPHA_MASK) -/*! @} */ - -/*! @name TST - Test Register */ -/*! @{ */ - -#define ENC_TST_TEST_COUNT_MASK (0xFFU) -#define ENC_TST_TEST_COUNT_SHIFT (0U) -#define ENC_TST_TEST_COUNT(x) (((uint16_t)(((uint16_t)(x)) << ENC_TST_TEST_COUNT_SHIFT)) & ENC_TST_TEST_COUNT_MASK) - -#define ENC_TST_TEST_PERIOD_MASK (0x1F00U) -#define ENC_TST_TEST_PERIOD_SHIFT (8U) -#define ENC_TST_TEST_PERIOD(x) (((uint16_t)(((uint16_t)(x)) << ENC_TST_TEST_PERIOD_SHIFT)) & ENC_TST_TEST_PERIOD_MASK) - -#define ENC_TST_QDN_MASK (0x2000U) -#define ENC_TST_QDN_SHIFT (13U) -/*! QDN - Quadrature Decoder Negative Signal - * 0b0..Leaves quadrature decoder signal in a positive direction - * 0b1..Generates a negative quadrature decoder signal - */ -#define ENC_TST_QDN(x) (((uint16_t)(((uint16_t)(x)) << ENC_TST_QDN_SHIFT)) & ENC_TST_QDN_MASK) - -#define ENC_TST_TCE_MASK (0x4000U) -#define ENC_TST_TCE_SHIFT (14U) -/*! TCE - Test Counter Enable - * 0b0..Test count is not enabled - * 0b1..Test count is enabled - */ -#define ENC_TST_TCE(x) (((uint16_t)(((uint16_t)(x)) << ENC_TST_TCE_SHIFT)) & ENC_TST_TCE_MASK) - -#define ENC_TST_TEN_MASK (0x8000U) -#define ENC_TST_TEN_SHIFT (15U) -/*! TEN - Test Mode Enable - * 0b0..Test module is not enabled - * 0b1..Test module is enabled - */ -#define ENC_TST_TEN(x) (((uint16_t)(((uint16_t)(x)) << ENC_TST_TEN_SHIFT)) & ENC_TST_TEN_MASK) -/*! @} */ - -/*! @name CTRL2 - Control 2 Register */ -/*! @{ */ - -#define ENC_CTRL2_UPDHLD_MASK (0x1U) -#define ENC_CTRL2_UPDHLD_SHIFT (0U) -/*! UPDHLD - Update Hold Registers - * 0b0..Disable updates of hold registers on rising edge of TRIGGER - * 0b1..Enable updates of hold registers on rising edge of TRIGGER - */ -#define ENC_CTRL2_UPDHLD(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_UPDHLD_SHIFT)) & ENC_CTRL2_UPDHLD_MASK) - -#define ENC_CTRL2_UPDPOS_MASK (0x2U) -#define ENC_CTRL2_UPDPOS_SHIFT (1U) -/*! UPDPOS - Update Position Registers - * 0b0..No action for POSD, REV, UPOS and LPOS on rising edge of TRIGGER - * 0b1..Clear POSD, REV, UPOS and LPOS on rising edge of TRIGGER - */ -#define ENC_CTRL2_UPDPOS(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_UPDPOS_SHIFT)) & ENC_CTRL2_UPDPOS_MASK) - -#define ENC_CTRL2_MOD_MASK (0x4U) -#define ENC_CTRL2_MOD_SHIFT (2U) -/*! MOD - Enable Modulo Counting - * 0b0..Disable modulo counting - * 0b1..Enable modulo counting - */ -#define ENC_CTRL2_MOD(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_MOD_SHIFT)) & ENC_CTRL2_MOD_MASK) - -#define ENC_CTRL2_DIR_MASK (0x8U) -#define ENC_CTRL2_DIR_SHIFT (3U) -/*! DIR - Count Direction Flag - * 0b0..Last count was in the down direction - * 0b1..Last count was in the up direction - */ -#define ENC_CTRL2_DIR(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_DIR_SHIFT)) & ENC_CTRL2_DIR_MASK) - -#define ENC_CTRL2_RUIE_MASK (0x10U) -#define ENC_CTRL2_RUIE_SHIFT (4U) -/*! RUIE - Roll-under Interrupt Enable - * 0b0..Roll-under interrupt is disabled - * 0b1..Roll-under interrupt is enabled - */ -#define ENC_CTRL2_RUIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_RUIE_SHIFT)) & ENC_CTRL2_RUIE_MASK) - -#define ENC_CTRL2_RUIRQ_MASK (0x20U) -#define ENC_CTRL2_RUIRQ_SHIFT (5U) -/*! RUIRQ - Roll-under Interrupt Request - * 0b0..No roll-under has occurred - * 0b1..Roll-under has occurred - */ -#define ENC_CTRL2_RUIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_RUIRQ_SHIFT)) & ENC_CTRL2_RUIRQ_MASK) - -#define ENC_CTRL2_ROIE_MASK (0x40U) -#define ENC_CTRL2_ROIE_SHIFT (6U) -/*! ROIE - Roll-over Interrupt Enable - * 0b0..Roll-over interrupt is disabled - * 0b1..Roll-over interrupt is enabled - */ -#define ENC_CTRL2_ROIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_ROIE_SHIFT)) & ENC_CTRL2_ROIE_MASK) - -#define ENC_CTRL2_ROIRQ_MASK (0x80U) -#define ENC_CTRL2_ROIRQ_SHIFT (7U) -/*! ROIRQ - Roll-over Interrupt Request - * 0b0..No roll-over has occurred - * 0b1..Roll-over has occurred - */ -#define ENC_CTRL2_ROIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_ROIRQ_SHIFT)) & ENC_CTRL2_ROIRQ_MASK) - -#define ENC_CTRL2_REVMOD_MASK (0x100U) -#define ENC_CTRL2_REVMOD_SHIFT (8U) -/*! REVMOD - Revolution Counter Modulus Enable - * 0b0..Use INDEX pulse to increment/decrement revolution counter (REV). - * 0b1..Use modulus counting roll-over/under to increment/decrement revolution counter (REV). - */ -#define ENC_CTRL2_REVMOD(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_REVMOD_SHIFT)) & ENC_CTRL2_REVMOD_MASK) - -#define ENC_CTRL2_OUTCTL_MASK (0x200U) -#define ENC_CTRL2_OUTCTL_SHIFT (9U) -/*! OUTCTL - Output Control - * 0b0..POSMATCH pulses when a match occurs between the position counters (POS) and the compare value (COMP). - * 0b1..POSMATCH pulses when the UPOS, LPOS, REV, or POSD registers are read. - */ -#define ENC_CTRL2_OUTCTL(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_OUTCTL_SHIFT)) & ENC_CTRL2_OUTCTL_MASK) - -#define ENC_CTRL2_SABIE_MASK (0x400U) -#define ENC_CTRL2_SABIE_SHIFT (10U) -/*! SABIE - Simultaneous PHASEA and PHASEB Change Interrupt Enable - * 0b0..Simultaneous PHASEA and PHASEB change interrupt disabled. - * 0b1..Simultaneous PHASEA and PHASEB change interrupt enabled. - */ -#define ENC_CTRL2_SABIE(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_SABIE_SHIFT)) & ENC_CTRL2_SABIE_MASK) - -#define ENC_CTRL2_SABIRQ_MASK (0x800U) -#define ENC_CTRL2_SABIRQ_SHIFT (11U) -/*! SABIRQ - Simultaneous PHASEA and PHASEB Change Interrupt Request - * 0b0..No simultaneous change of PHASEA and PHASEB has occurred. - * 0b1..A simultaneous change of PHASEA and PHASEB has occurred. - */ -#define ENC_CTRL2_SABIRQ(x) (((uint16_t)(((uint16_t)(x)) << ENC_CTRL2_SABIRQ_SHIFT)) & ENC_CTRL2_SABIRQ_MASK) -/*! @} */ - -/*! @name UMOD - Upper Modulus Register */ -/*! @{ */ - -#define ENC_UMOD_MOD_MASK (0xFFFFU) -#define ENC_UMOD_MOD_SHIFT (0U) -#define ENC_UMOD_MOD(x) (((uint16_t)(((uint16_t)(x)) << ENC_UMOD_MOD_SHIFT)) & ENC_UMOD_MOD_MASK) -/*! @} */ - -/*! @name LMOD - Lower Modulus Register */ -/*! @{ */ - -#define ENC_LMOD_MOD_MASK (0xFFFFU) -#define ENC_LMOD_MOD_SHIFT (0U) -#define ENC_LMOD_MOD(x) (((uint16_t)(((uint16_t)(x)) << ENC_LMOD_MOD_SHIFT)) & ENC_LMOD_MOD_MASK) -/*! @} */ - -/*! @name UCOMP - Upper Position Compare Register */ -/*! @{ */ - -#define ENC_UCOMP_COMP_MASK (0xFFFFU) -#define ENC_UCOMP_COMP_SHIFT (0U) -#define ENC_UCOMP_COMP(x) (((uint16_t)(((uint16_t)(x)) << ENC_UCOMP_COMP_SHIFT)) & ENC_UCOMP_COMP_MASK) -/*! @} */ - -/*! @name LCOMP - Lower Position Compare Register */ -/*! @{ */ - -#define ENC_LCOMP_COMP_MASK (0xFFFFU) -#define ENC_LCOMP_COMP_SHIFT (0U) -#define ENC_LCOMP_COMP(x) (((uint16_t)(((uint16_t)(x)) << ENC_LCOMP_COMP_SHIFT)) & ENC_LCOMP_COMP_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group ENC_Register_Masks */ - - -/* ENC - Peripheral instance base addresses */ -/** Peripheral ENC1 base address */ -#define ENC1_BASE (0x403C8000u) -/** Peripheral ENC1 base pointer */ -#define ENC1 ((ENC_Type *)ENC1_BASE) -/** Peripheral ENC2 base address */ -#define ENC2_BASE (0x403CC000u) -/** Peripheral ENC2 base pointer */ -#define ENC2 ((ENC_Type *)ENC2_BASE) -/** Peripheral ENC3 base address */ -#define ENC3_BASE (0x403D0000u) -/** Peripheral ENC3 base pointer */ -#define ENC3 ((ENC_Type *)ENC3_BASE) -/** Peripheral ENC4 base address */ -#define ENC4_BASE (0x403D4000u) -/** Peripheral ENC4 base pointer */ -#define ENC4 ((ENC_Type *)ENC4_BASE) -/** Array initializer of ENC peripheral base addresses */ -#define ENC_BASE_ADDRS { 0u, ENC1_BASE, ENC2_BASE, ENC3_BASE, ENC4_BASE } -/** Array initializer of ENC peripheral base pointers */ -#define ENC_BASE_PTRS { (ENC_Type *)0u, ENC1, ENC2, ENC3, ENC4 } -/** Interrupt vectors for the ENC peripheral type */ -#define ENC_COMPARE_IRQS { NotAvail_IRQn, ENC1_IRQn, ENC2_IRQn, ENC3_IRQn, ENC4_IRQn } -#define ENC_HOME_IRQS { NotAvail_IRQn, ENC1_IRQn, ENC2_IRQn, ENC3_IRQn, ENC4_IRQn } -#define ENC_WDOG_IRQS { NotAvail_IRQn, ENC1_IRQn, ENC2_IRQn, ENC3_IRQn, ENC4_IRQn } -#define ENC_INDEX_IRQS { NotAvail_IRQn, ENC1_IRQn, ENC2_IRQn, ENC3_IRQn, ENC4_IRQn } -#define ENC_INPUT_SWITCH_IRQS { NotAvail_IRQn, ENC1_IRQn, ENC2_IRQn, ENC3_IRQn, ENC4_IRQn } - -/*! - * @} - */ /* end of group ENC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- ENET Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ENET_Peripheral_Access_Layer ENET Peripheral Access Layer - * @{ - */ - -/** ENET - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[4]; - __IO uint32_t EIR; /**< Interrupt Event Register, offset: 0x4 */ - __IO uint32_t EIMR; /**< Interrupt Mask Register, offset: 0x8 */ - uint8_t RESERVED_1[4]; - __IO uint32_t RDAR; /**< Receive Descriptor Active Register, offset: 0x10 */ - __IO uint32_t TDAR; /**< Transmit Descriptor Active Register, offset: 0x14 */ - uint8_t RESERVED_2[12]; - __IO uint32_t ECR; /**< Ethernet Control Register, offset: 0x24 */ - uint8_t RESERVED_3[24]; - __IO uint32_t MMFR; /**< MII Management Frame Register, offset: 0x40 */ - __IO uint32_t MSCR; /**< MII Speed Control Register, offset: 0x44 */ - uint8_t RESERVED_4[28]; - __IO uint32_t MIBC; /**< MIB Control Register, offset: 0x64 */ - uint8_t RESERVED_5[28]; - __IO uint32_t RCR; /**< Receive Control Register, offset: 0x84 */ - uint8_t RESERVED_6[60]; - __IO uint32_t TCR; /**< Transmit Control Register, offset: 0xC4 */ - uint8_t RESERVED_7[28]; - __IO uint32_t PALR; /**< Physical Address Lower Register, offset: 0xE4 */ - __IO uint32_t PAUR; /**< Physical Address Upper Register, offset: 0xE8 */ - __IO uint32_t OPD; /**< Opcode/Pause Duration Register, offset: 0xEC */ - __IO uint32_t TXIC; /**< Transmit Interrupt Coalescing Register, offset: 0xF0 */ - uint8_t RESERVED_8[12]; - __IO uint32_t RXIC; /**< Receive Interrupt Coalescing Register, offset: 0x100 */ - uint8_t RESERVED_9[20]; - __IO uint32_t IAUR; /**< Descriptor Individual Upper Address Register, offset: 0x118 */ - __IO uint32_t IALR; /**< Descriptor Individual Lower Address Register, offset: 0x11C */ - __IO uint32_t GAUR; /**< Descriptor Group Upper Address Register, offset: 0x120 */ - __IO uint32_t GALR; /**< Descriptor Group Lower Address Register, offset: 0x124 */ - uint8_t RESERVED_10[28]; - __IO uint32_t TFWR; /**< Transmit FIFO Watermark Register, offset: 0x144 */ - uint8_t RESERVED_11[56]; - __IO uint32_t RDSR; /**< Receive Descriptor Ring Start Register, offset: 0x180 */ - __IO uint32_t TDSR; /**< Transmit Buffer Descriptor Ring Start Register, offset: 0x184 */ - __IO uint32_t MRBR; /**< Maximum Receive Buffer Size Register, offset: 0x188 */ - uint8_t RESERVED_12[4]; - __IO uint32_t RSFL; /**< Receive FIFO Section Full Threshold, offset: 0x190 */ - __IO uint32_t RSEM; /**< Receive FIFO Section Empty Threshold, offset: 0x194 */ - __IO uint32_t RAEM; /**< Receive FIFO Almost Empty Threshold, offset: 0x198 */ - __IO uint32_t RAFL; /**< Receive FIFO Almost Full Threshold, offset: 0x19C */ - __IO uint32_t TSEM; /**< Transmit FIFO Section Empty Threshold, offset: 0x1A0 */ - __IO uint32_t TAEM; /**< Transmit FIFO Almost Empty Threshold, offset: 0x1A4 */ - __IO uint32_t TAFL; /**< Transmit FIFO Almost Full Threshold, offset: 0x1A8 */ - __IO uint32_t TIPG; /**< Transmit Inter-Packet Gap, offset: 0x1AC */ - __IO uint32_t FTRL; /**< Frame Truncation Length, offset: 0x1B0 */ - uint8_t RESERVED_13[12]; - __IO uint32_t TACC; /**< Transmit Accelerator Function Configuration, offset: 0x1C0 */ - __IO uint32_t RACC; /**< Receive Accelerator Function Configuration, offset: 0x1C4 */ - uint8_t RESERVED_14[56]; - uint32_t RMON_T_DROP; /**< Reserved Statistic Register, offset: 0x200 */ - __I uint32_t RMON_T_PACKETS; /**< Tx Packet Count Statistic Register, offset: 0x204 */ - __I uint32_t RMON_T_BC_PKT; /**< Tx Broadcast Packets Statistic Register, offset: 0x208 */ - __I uint32_t RMON_T_MC_PKT; /**< Tx Multicast Packets Statistic Register, offset: 0x20C */ - __I uint32_t RMON_T_CRC_ALIGN; /**< Tx Packets with CRC/Align Error Statistic Register, offset: 0x210 */ - __I uint32_t RMON_T_UNDERSIZE; /**< Tx Packets Less Than Bytes and Good CRC Statistic Register, offset: 0x214 */ - __I uint32_t RMON_T_OVERSIZE; /**< Tx Packets GT MAX_FL bytes and Good CRC Statistic Register, offset: 0x218 */ - __I uint32_t RMON_T_FRAG; /**< Tx Packets Less Than 64 Bytes and Bad CRC Statistic Register, offset: 0x21C */ - __I uint32_t RMON_T_JAB; /**< Tx Packets Greater Than MAX_FL bytes and Bad CRC Statistic Register, offset: 0x220 */ - __I uint32_t RMON_T_COL; /**< Tx Collision Count Statistic Register, offset: 0x224 */ - __I uint32_t RMON_T_P64; /**< Tx 64-Byte Packets Statistic Register, offset: 0x228 */ - __I uint32_t RMON_T_P65TO127; /**< Tx 65- to 127-byte Packets Statistic Register, offset: 0x22C */ - __I uint32_t RMON_T_P128TO255; /**< Tx 128- to 255-byte Packets Statistic Register, offset: 0x230 */ - __I uint32_t RMON_T_P256TO511; /**< Tx 256- to 511-byte Packets Statistic Register, offset: 0x234 */ - __I uint32_t RMON_T_P512TO1023; /**< Tx 512- to 1023-byte Packets Statistic Register, offset: 0x238 */ - __I uint32_t RMON_T_P1024TO2047; /**< Tx 1024- to 2047-byte Packets Statistic Register, offset: 0x23C */ - __I uint32_t RMON_T_P_GTE2048; /**< Tx Packets Greater Than 2048 Bytes Statistic Register, offset: 0x240 */ - __I uint32_t RMON_T_OCTETS; /**< Tx Octets Statistic Register, offset: 0x244 */ - uint32_t IEEE_T_DROP; /**< Reserved Statistic Register, offset: 0x248 */ - __I uint32_t IEEE_T_FRAME_OK; /**< Frames Transmitted OK Statistic Register, offset: 0x24C */ - __I uint32_t IEEE_T_1COL; /**< Frames Transmitted with Single Collision Statistic Register, offset: 0x250 */ - __I uint32_t IEEE_T_MCOL; /**< Frames Transmitted with Multiple Collisions Statistic Register, offset: 0x254 */ - __I uint32_t IEEE_T_DEF; /**< Frames Transmitted after Deferral Delay Statistic Register, offset: 0x258 */ - __I uint32_t IEEE_T_LCOL; /**< Frames Transmitted with Late Collision Statistic Register, offset: 0x25C */ - __I uint32_t IEEE_T_EXCOL; /**< Frames Transmitted with Excessive Collisions Statistic Register, offset: 0x260 */ - __I uint32_t IEEE_T_MACERR; /**< Frames Transmitted with Tx FIFO Underrun Statistic Register, offset: 0x264 */ - __I uint32_t IEEE_T_CSERR; /**< Frames Transmitted with Carrier Sense Error Statistic Register, offset: 0x268 */ - __I uint32_t IEEE_T_SQE; /**< Reserved Statistic Register, offset: 0x26C */ - __I uint32_t IEEE_T_FDXFC; /**< Flow Control Pause Frames Transmitted Statistic Register, offset: 0x270 */ - __I uint32_t IEEE_T_OCTETS_OK; /**< Octet Count for Frames Transmitted w/o Error Statistic Register, offset: 0x274 */ - uint8_t RESERVED_15[12]; - __I uint32_t RMON_R_PACKETS; /**< Rx Packet Count Statistic Register, offset: 0x284 */ - __I uint32_t RMON_R_BC_PKT; /**< Rx Broadcast Packets Statistic Register, offset: 0x288 */ - __I uint32_t RMON_R_MC_PKT; /**< Rx Multicast Packets Statistic Register, offset: 0x28C */ - __I uint32_t RMON_R_CRC_ALIGN; /**< Rx Packets with CRC/Align Error Statistic Register, offset: 0x290 */ - __I uint32_t RMON_R_UNDERSIZE; /**< Rx Packets with Less Than 64 Bytes and Good CRC Statistic Register, offset: 0x294 */ - __I uint32_t RMON_R_OVERSIZE; /**< Rx Packets Greater Than MAX_FL and Good CRC Statistic Register, offset: 0x298 */ - __I uint32_t RMON_R_FRAG; /**< Rx Packets Less Than 64 Bytes and Bad CRC Statistic Register, offset: 0x29C */ - __I uint32_t RMON_R_JAB; /**< Rx Packets Greater Than MAX_FL Bytes and Bad CRC Statistic Register, offset: 0x2A0 */ - uint32_t RMON_R_RESVD_0; /**< Reserved Statistic Register, offset: 0x2A4 */ - __I uint32_t RMON_R_P64; /**< Rx 64-Byte Packets Statistic Register, offset: 0x2A8 */ - __I uint32_t RMON_R_P65TO127; /**< Rx 65- to 127-Byte Packets Statistic Register, offset: 0x2AC */ - __I uint32_t RMON_R_P128TO255; /**< Rx 128- to 255-Byte Packets Statistic Register, offset: 0x2B0 */ - __I uint32_t RMON_R_P256TO511; /**< Rx 256- to 511-Byte Packets Statistic Register, offset: 0x2B4 */ - __I uint32_t RMON_R_P512TO1023; /**< Rx 512- to 1023-Byte Packets Statistic Register, offset: 0x2B8 */ - __I uint32_t RMON_R_P1024TO2047; /**< Rx 1024- to 2047-Byte Packets Statistic Register, offset: 0x2BC */ - __I uint32_t RMON_R_P_GTE2048; /**< Rx Packets Greater than 2048 Bytes Statistic Register, offset: 0x2C0 */ - __I uint32_t RMON_R_OCTETS; /**< Rx Octets Statistic Register, offset: 0x2C4 */ - __I uint32_t IEEE_R_DROP; /**< Frames not Counted Correctly Statistic Register, offset: 0x2C8 */ - __I uint32_t IEEE_R_FRAME_OK; /**< Frames Received OK Statistic Register, offset: 0x2CC */ - __I uint32_t IEEE_R_CRC; /**< Frames Received with CRC Error Statistic Register, offset: 0x2D0 */ - __I uint32_t IEEE_R_ALIGN; /**< Frames Received with Alignment Error Statistic Register, offset: 0x2D4 */ - __I uint32_t IEEE_R_MACERR; /**< Receive FIFO Overflow Count Statistic Register, offset: 0x2D8 */ - __I uint32_t IEEE_R_FDXFC; /**< Flow Control Pause Frames Received Statistic Register, offset: 0x2DC */ - __I uint32_t IEEE_R_OCTETS_OK; /**< Octet Count for Frames Received without Error Statistic Register, offset: 0x2E0 */ - uint8_t RESERVED_16[284]; - __IO uint32_t ATCR; /**< Adjustable Timer Control Register, offset: 0x400 */ - __IO uint32_t ATVR; /**< Timer Value Register, offset: 0x404 */ - __IO uint32_t ATOFF; /**< Timer Offset Register, offset: 0x408 */ - __IO uint32_t ATPER; /**< Timer Period Register, offset: 0x40C */ - __IO uint32_t ATCOR; /**< Timer Correction Register, offset: 0x410 */ - __IO uint32_t ATINC; /**< Time-Stamping Clock Period Register, offset: 0x414 */ - __I uint32_t ATSTMP; /**< Timestamp of Last Transmitted Frame, offset: 0x418 */ - uint8_t RESERVED_17[488]; - __IO uint32_t TGSR; /**< Timer Global Status Register, offset: 0x604 */ - struct { /* offset: 0x608, array step: 0x8 */ - __IO uint32_t TCSR; /**< Timer Control Status Register, array offset: 0x608, array step: 0x8 */ - __IO uint32_t TCCR; /**< Timer Compare Capture Register, array offset: 0x60C, array step: 0x8 */ - } CHANNEL[4]; -} ENET_Type; - -/* ---------------------------------------------------------------------------- - -- ENET Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ENET_Register_Masks ENET Register Masks - * @{ - */ - -/*! @name EIR - Interrupt Event Register */ -/*! @{ */ - -#define ENET_EIR_TS_TIMER_MASK (0x8000U) -#define ENET_EIR_TS_TIMER_SHIFT (15U) -/*! TS_TIMER - Timestamp Timer - */ -#define ENET_EIR_TS_TIMER(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TS_TIMER_SHIFT)) & ENET_EIR_TS_TIMER_MASK) - -#define ENET_EIR_TS_AVAIL_MASK (0x10000U) -#define ENET_EIR_TS_AVAIL_SHIFT (16U) -/*! TS_AVAIL - Transmit Timestamp Available - */ -#define ENET_EIR_TS_AVAIL(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TS_AVAIL_SHIFT)) & ENET_EIR_TS_AVAIL_MASK) - -#define ENET_EIR_WAKEUP_MASK (0x20000U) -#define ENET_EIR_WAKEUP_SHIFT (17U) -/*! WAKEUP - Node Wakeup Request Indication - */ -#define ENET_EIR_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_WAKEUP_SHIFT)) & ENET_EIR_WAKEUP_MASK) - -#define ENET_EIR_PLR_MASK (0x40000U) -#define ENET_EIR_PLR_SHIFT (18U) -/*! PLR - Payload Receive Error - */ -#define ENET_EIR_PLR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_PLR_SHIFT)) & ENET_EIR_PLR_MASK) - -#define ENET_EIR_UN_MASK (0x80000U) -#define ENET_EIR_UN_SHIFT (19U) -/*! UN - Transmit FIFO Underrun - */ -#define ENET_EIR_UN(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_UN_SHIFT)) & ENET_EIR_UN_MASK) - -#define ENET_EIR_RL_MASK (0x100000U) -#define ENET_EIR_RL_SHIFT (20U) -/*! RL - Collision Retry Limit - */ -#define ENET_EIR_RL(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RL_SHIFT)) & ENET_EIR_RL_MASK) - -#define ENET_EIR_LC_MASK (0x200000U) -#define ENET_EIR_LC_SHIFT (21U) -/*! LC - Late Collision - */ -#define ENET_EIR_LC(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_LC_SHIFT)) & ENET_EIR_LC_MASK) - -#define ENET_EIR_EBERR_MASK (0x400000U) -#define ENET_EIR_EBERR_SHIFT (22U) -/*! EBERR - Ethernet Bus Error - */ -#define ENET_EIR_EBERR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_EBERR_SHIFT)) & ENET_EIR_EBERR_MASK) - -#define ENET_EIR_MII_MASK (0x800000U) -#define ENET_EIR_MII_SHIFT (23U) -/*! MII - MII Interrupt. - */ -#define ENET_EIR_MII(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_MII_SHIFT)) & ENET_EIR_MII_MASK) - -#define ENET_EIR_RXB_MASK (0x1000000U) -#define ENET_EIR_RXB_SHIFT (24U) -/*! RXB - Receive Buffer Interrupt - */ -#define ENET_EIR_RXB(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RXB_SHIFT)) & ENET_EIR_RXB_MASK) - -#define ENET_EIR_RXF_MASK (0x2000000U) -#define ENET_EIR_RXF_SHIFT (25U) -/*! RXF - Receive Frame Interrupt - */ -#define ENET_EIR_RXF(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RXF_SHIFT)) & ENET_EIR_RXF_MASK) - -#define ENET_EIR_TXB_MASK (0x4000000U) -#define ENET_EIR_TXB_SHIFT (26U) -/*! TXB - Transmit Buffer Interrupt - */ -#define ENET_EIR_TXB(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TXB_SHIFT)) & ENET_EIR_TXB_MASK) - -#define ENET_EIR_TXF_MASK (0x8000000U) -#define ENET_EIR_TXF_SHIFT (27U) -/*! TXF - Transmit Frame Interrupt - */ -#define ENET_EIR_TXF(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TXF_SHIFT)) & ENET_EIR_TXF_MASK) - -#define ENET_EIR_GRA_MASK (0x10000000U) -#define ENET_EIR_GRA_SHIFT (28U) -/*! GRA - Graceful Stop Complete - */ -#define ENET_EIR_GRA(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_GRA_SHIFT)) & ENET_EIR_GRA_MASK) - -#define ENET_EIR_BABT_MASK (0x20000000U) -#define ENET_EIR_BABT_SHIFT (29U) -/*! BABT - Babbling Transmit Error - */ -#define ENET_EIR_BABT(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_BABT_SHIFT)) & ENET_EIR_BABT_MASK) - -#define ENET_EIR_BABR_MASK (0x40000000U) -#define ENET_EIR_BABR_SHIFT (30U) -/*! BABR - Babbling Receive Error - */ -#define ENET_EIR_BABR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIR_BABR_SHIFT)) & ENET_EIR_BABR_MASK) -/*! @} */ - -/*! @name EIMR - Interrupt Mask Register */ -/*! @{ */ - -#define ENET_EIMR_TS_TIMER_MASK (0x8000U) -#define ENET_EIMR_TS_TIMER_SHIFT (15U) -/*! TS_TIMER - TS_TIMER Interrupt Mask - */ -#define ENET_EIMR_TS_TIMER(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TS_TIMER_SHIFT)) & ENET_EIMR_TS_TIMER_MASK) - -#define ENET_EIMR_TS_AVAIL_MASK (0x10000U) -#define ENET_EIMR_TS_AVAIL_SHIFT (16U) -/*! TS_AVAIL - TS_AVAIL Interrupt Mask - */ -#define ENET_EIMR_TS_AVAIL(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TS_AVAIL_SHIFT)) & ENET_EIMR_TS_AVAIL_MASK) - -#define ENET_EIMR_WAKEUP_MASK (0x20000U) -#define ENET_EIMR_WAKEUP_SHIFT (17U) -/*! WAKEUP - WAKEUP Interrupt Mask - */ -#define ENET_EIMR_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_WAKEUP_SHIFT)) & ENET_EIMR_WAKEUP_MASK) - -#define ENET_EIMR_PLR_MASK (0x40000U) -#define ENET_EIMR_PLR_SHIFT (18U) -/*! PLR - PLR Interrupt Mask - */ -#define ENET_EIMR_PLR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_PLR_SHIFT)) & ENET_EIMR_PLR_MASK) - -#define ENET_EIMR_UN_MASK (0x80000U) -#define ENET_EIMR_UN_SHIFT (19U) -/*! UN - UN Interrupt Mask - */ -#define ENET_EIMR_UN(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_UN_SHIFT)) & ENET_EIMR_UN_MASK) - -#define ENET_EIMR_RL_MASK (0x100000U) -#define ENET_EIMR_RL_SHIFT (20U) -/*! RL - RL Interrupt Mask - */ -#define ENET_EIMR_RL(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RL_SHIFT)) & ENET_EIMR_RL_MASK) - -#define ENET_EIMR_LC_MASK (0x200000U) -#define ENET_EIMR_LC_SHIFT (21U) -/*! LC - LC Interrupt Mask - */ -#define ENET_EIMR_LC(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_LC_SHIFT)) & ENET_EIMR_LC_MASK) - -#define ENET_EIMR_EBERR_MASK (0x400000U) -#define ENET_EIMR_EBERR_SHIFT (22U) -/*! EBERR - EBERR Interrupt Mask - */ -#define ENET_EIMR_EBERR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_EBERR_SHIFT)) & ENET_EIMR_EBERR_MASK) - -#define ENET_EIMR_MII_MASK (0x800000U) -#define ENET_EIMR_MII_SHIFT (23U) -/*! MII - MII Interrupt Mask - */ -#define ENET_EIMR_MII(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_MII_SHIFT)) & ENET_EIMR_MII_MASK) - -#define ENET_EIMR_RXB_MASK (0x1000000U) -#define ENET_EIMR_RXB_SHIFT (24U) -/*! RXB - RXB Interrupt Mask - */ -#define ENET_EIMR_RXB(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RXB_SHIFT)) & ENET_EIMR_RXB_MASK) - -#define ENET_EIMR_RXF_MASK (0x2000000U) -#define ENET_EIMR_RXF_SHIFT (25U) -/*! RXF - RXF Interrupt Mask - */ -#define ENET_EIMR_RXF(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RXF_SHIFT)) & ENET_EIMR_RXF_MASK) - -#define ENET_EIMR_TXB_MASK (0x4000000U) -#define ENET_EIMR_TXB_SHIFT (26U) -/*! TXB - TXB Interrupt Mask - * 0b0..The corresponding interrupt source is masked. - * 0b1..The corresponding interrupt source is not masked. - */ -#define ENET_EIMR_TXB(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TXB_SHIFT)) & ENET_EIMR_TXB_MASK) - -#define ENET_EIMR_TXF_MASK (0x8000000U) -#define ENET_EIMR_TXF_SHIFT (27U) -/*! TXF - TXF Interrupt Mask - * 0b0..The corresponding interrupt source is masked. - * 0b1..The corresponding interrupt source is not masked. - */ -#define ENET_EIMR_TXF(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TXF_SHIFT)) & ENET_EIMR_TXF_MASK) - -#define ENET_EIMR_GRA_MASK (0x10000000U) -#define ENET_EIMR_GRA_SHIFT (28U) -/*! GRA - GRA Interrupt Mask - * 0b0..The corresponding interrupt source is masked. - * 0b1..The corresponding interrupt source is not masked. - */ -#define ENET_EIMR_GRA(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_GRA_SHIFT)) & ENET_EIMR_GRA_MASK) - -#define ENET_EIMR_BABT_MASK (0x20000000U) -#define ENET_EIMR_BABT_SHIFT (29U) -/*! BABT - BABT Interrupt Mask - * 0b0..The corresponding interrupt source is masked. - * 0b1..The corresponding interrupt source is not masked. - */ -#define ENET_EIMR_BABT(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_BABT_SHIFT)) & ENET_EIMR_BABT_MASK) - -#define ENET_EIMR_BABR_MASK (0x40000000U) -#define ENET_EIMR_BABR_SHIFT (30U) -/*! BABR - BABR Interrupt Mask - * 0b0..The corresponding interrupt source is masked. - * 0b1..The corresponding interrupt source is not masked. - */ -#define ENET_EIMR_BABR(x) (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_BABR_SHIFT)) & ENET_EIMR_BABR_MASK) -/*! @} */ - -/*! @name RDAR - Receive Descriptor Active Register */ -/*! @{ */ - -#define ENET_RDAR_RDAR_MASK (0x1000000U) -#define ENET_RDAR_RDAR_SHIFT (24U) -/*! RDAR - Receive Descriptor Active - */ -#define ENET_RDAR_RDAR(x) (((uint32_t)(((uint32_t)(x)) << ENET_RDAR_RDAR_SHIFT)) & ENET_RDAR_RDAR_MASK) -/*! @} */ - -/*! @name TDAR - Transmit Descriptor Active Register */ -/*! @{ */ - -#define ENET_TDAR_TDAR_MASK (0x1000000U) -#define ENET_TDAR_TDAR_SHIFT (24U) -/*! TDAR - Transmit Descriptor Active - */ -#define ENET_TDAR_TDAR(x) (((uint32_t)(((uint32_t)(x)) << ENET_TDAR_TDAR_SHIFT)) & ENET_TDAR_TDAR_MASK) -/*! @} */ - -/*! @name ECR - Ethernet Control Register */ -/*! @{ */ - -#define ENET_ECR_RESET_MASK (0x1U) -#define ENET_ECR_RESET_SHIFT (0U) -/*! RESET - Ethernet MAC Reset - */ -#define ENET_ECR_RESET(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_RESET_SHIFT)) & ENET_ECR_RESET_MASK) - -#define ENET_ECR_ETHEREN_MASK (0x2U) -#define ENET_ECR_ETHEREN_SHIFT (1U) -/*! ETHEREN - Ethernet Enable - * 0b0..Reception immediately stops and transmission stops after a bad CRC is appended to any currently transmitted frame. - * 0b1..MAC is enabled, and reception and transmission are possible. - */ -#define ENET_ECR_ETHEREN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_ETHEREN_SHIFT)) & ENET_ECR_ETHEREN_MASK) - -#define ENET_ECR_MAGICEN_MASK (0x4U) -#define ENET_ECR_MAGICEN_SHIFT (2U) -/*! MAGICEN - Magic Packet Detection Enable - * 0b0..Magic detection logic disabled. - * 0b1..The MAC core detects magic packets and asserts EIR[WAKEUP] when a frame is detected. - */ -#define ENET_ECR_MAGICEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_MAGICEN_SHIFT)) & ENET_ECR_MAGICEN_MASK) - -#define ENET_ECR_SLEEP_MASK (0x8U) -#define ENET_ECR_SLEEP_SHIFT (3U) -/*! SLEEP - Sleep Mode Enable - * 0b0..Normal operating mode. - * 0b1..Sleep mode. - */ -#define ENET_ECR_SLEEP(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_SLEEP_SHIFT)) & ENET_ECR_SLEEP_MASK) - -#define ENET_ECR_EN1588_MASK (0x10U) -#define ENET_ECR_EN1588_SHIFT (4U) -/*! EN1588 - EN1588 Enable - * 0b0..Legacy FEC buffer descriptors and functions enabled. - * 0b1..Enhanced frame time-stamping functions enabled. - */ -#define ENET_ECR_EN1588(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_EN1588_SHIFT)) & ENET_ECR_EN1588_MASK) - -#define ENET_ECR_DBGEN_MASK (0x40U) -#define ENET_ECR_DBGEN_SHIFT (6U) -/*! DBGEN - Debug Enable - * 0b0..MAC continues operation in debug mode. - * 0b1..MAC enters hardware freeze mode when the processor is in debug mode. - */ -#define ENET_ECR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_DBGEN_SHIFT)) & ENET_ECR_DBGEN_MASK) - -#define ENET_ECR_DBSWP_MASK (0x100U) -#define ENET_ECR_DBSWP_SHIFT (8U) -/*! DBSWP - Descriptor Byte Swapping Enable - * 0b0..The buffer descriptor bytes are not swapped to support big-endian devices. - * 0b1..The buffer descriptor bytes are swapped to support little-endian devices. - */ -#define ENET_ECR_DBSWP(x) (((uint32_t)(((uint32_t)(x)) << ENET_ECR_DBSWP_SHIFT)) & ENET_ECR_DBSWP_MASK) -/*! @} */ - -/*! @name MMFR - MII Management Frame Register */ -/*! @{ */ - -#define ENET_MMFR_DATA_MASK (0xFFFFU) -#define ENET_MMFR_DATA_SHIFT (0U) -/*! DATA - Management Frame Data - */ -#define ENET_MMFR_DATA(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_DATA_SHIFT)) & ENET_MMFR_DATA_MASK) - -#define ENET_MMFR_TA_MASK (0x30000U) -#define ENET_MMFR_TA_SHIFT (16U) -/*! TA - Turn Around - */ -#define ENET_MMFR_TA(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_TA_SHIFT)) & ENET_MMFR_TA_MASK) - -#define ENET_MMFR_RA_MASK (0x7C0000U) -#define ENET_MMFR_RA_SHIFT (18U) -/*! RA - Register Address - */ -#define ENET_MMFR_RA(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_RA_SHIFT)) & ENET_MMFR_RA_MASK) - -#define ENET_MMFR_PA_MASK (0xF800000U) -#define ENET_MMFR_PA_SHIFT (23U) -/*! PA - PHY Address - */ -#define ENET_MMFR_PA(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_PA_SHIFT)) & ENET_MMFR_PA_MASK) - -#define ENET_MMFR_OP_MASK (0x30000000U) -#define ENET_MMFR_OP_SHIFT (28U) -/*! OP - Operation Code - */ -#define ENET_MMFR_OP(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_OP_SHIFT)) & ENET_MMFR_OP_MASK) - -#define ENET_MMFR_ST_MASK (0xC0000000U) -#define ENET_MMFR_ST_SHIFT (30U) -/*! ST - Start Of Frame Delimiter - */ -#define ENET_MMFR_ST(x) (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_ST_SHIFT)) & ENET_MMFR_ST_MASK) -/*! @} */ - -/*! @name MSCR - MII Speed Control Register */ -/*! @{ */ - -#define ENET_MSCR_MII_SPEED_MASK (0x7EU) -#define ENET_MSCR_MII_SPEED_SHIFT (1U) -/*! MII_SPEED - MII Speed - */ -#define ENET_MSCR_MII_SPEED(x) (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_MII_SPEED_SHIFT)) & ENET_MSCR_MII_SPEED_MASK) - -#define ENET_MSCR_DIS_PRE_MASK (0x80U) -#define ENET_MSCR_DIS_PRE_SHIFT (7U) -/*! DIS_PRE - Disable Preamble - * 0b0..Preamble enabled. - * 0b1..Preamble (32 ones) is not prepended to the MII management frame. - */ -#define ENET_MSCR_DIS_PRE(x) (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_DIS_PRE_SHIFT)) & ENET_MSCR_DIS_PRE_MASK) - -#define ENET_MSCR_HOLDTIME_MASK (0x700U) -#define ENET_MSCR_HOLDTIME_SHIFT (8U) -/*! HOLDTIME - Hold time On MDIO Output - * 0b000..1 internal module clock cycle - * 0b001..2 internal module clock cycles - * 0b010..3 internal module clock cycles - * 0b111..8 internal module clock cycles - */ -#define ENET_MSCR_HOLDTIME(x) (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_HOLDTIME_SHIFT)) & ENET_MSCR_HOLDTIME_MASK) -/*! @} */ - -/*! @name MIBC - MIB Control Register */ -/*! @{ */ - -#define ENET_MIBC_MIB_CLEAR_MASK (0x20000000U) -#define ENET_MIBC_MIB_CLEAR_SHIFT (29U) -/*! MIB_CLEAR - MIB Clear - * 0b0..See note above. - * 0b1..All statistics counters are reset to 0. - */ -#define ENET_MIBC_MIB_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_CLEAR_SHIFT)) & ENET_MIBC_MIB_CLEAR_MASK) - -#define ENET_MIBC_MIB_IDLE_MASK (0x40000000U) -#define ENET_MIBC_MIB_IDLE_SHIFT (30U) -/*! MIB_IDLE - MIB Idle - * 0b0..The MIB block is updating MIB counters. - * 0b1..The MIB block is not currently updating any MIB counters. - */ -#define ENET_MIBC_MIB_IDLE(x) (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_IDLE_SHIFT)) & ENET_MIBC_MIB_IDLE_MASK) - -#define ENET_MIBC_MIB_DIS_MASK (0x80000000U) -#define ENET_MIBC_MIB_DIS_SHIFT (31U) -/*! MIB_DIS - Disable MIB Logic - * 0b0..MIB logic is enabled. - * 0b1..MIB logic is disabled. The MIB logic halts and does not update any MIB counters. - */ -#define ENET_MIBC_MIB_DIS(x) (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_DIS_SHIFT)) & ENET_MIBC_MIB_DIS_MASK) -/*! @} */ - -/*! @name RCR - Receive Control Register */ -/*! @{ */ - -#define ENET_RCR_LOOP_MASK (0x1U) -#define ENET_RCR_LOOP_SHIFT (0U) -/*! LOOP - Internal Loopback - * 0b0..Loopback disabled. - * 0b1..Transmitted frames are looped back internal to the device and transmit MII output signals are not asserted. DRT must be cleared. - */ -#define ENET_RCR_LOOP(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_LOOP_SHIFT)) & ENET_RCR_LOOP_MASK) - -#define ENET_RCR_DRT_MASK (0x2U) -#define ENET_RCR_DRT_SHIFT (1U) -/*! DRT - Disable Receive On Transmit - * 0b0..Receive path operates independently of transmit (i.e., full-duplex mode). Can also be used to monitor transmit activity in half-duplex mode. - * 0b1..Disable reception of frames while transmitting. (Normally used for half-duplex mode.) - */ -#define ENET_RCR_DRT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_DRT_SHIFT)) & ENET_RCR_DRT_MASK) - -#define ENET_RCR_MII_MODE_MASK (0x4U) -#define ENET_RCR_MII_MODE_SHIFT (2U) -/*! MII_MODE - Media Independent Interface Mode - * 0b0..Reserved. - * 0b1..MII or RMII mode, as indicated by the RMII_MODE field. - */ -#define ENET_RCR_MII_MODE(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_MII_MODE_SHIFT)) & ENET_RCR_MII_MODE_MASK) - -#define ENET_RCR_PROM_MASK (0x8U) -#define ENET_RCR_PROM_SHIFT (3U) -/*! PROM - Promiscuous Mode - * 0b0..Disabled. - * 0b1..Enabled. - */ -#define ENET_RCR_PROM(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PROM_SHIFT)) & ENET_RCR_PROM_MASK) - -#define ENET_RCR_BC_REJ_MASK (0x10U) -#define ENET_RCR_BC_REJ_SHIFT (4U) -/*! BC_REJ - Broadcast Frame Reject - */ -#define ENET_RCR_BC_REJ(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_BC_REJ_SHIFT)) & ENET_RCR_BC_REJ_MASK) - -#define ENET_RCR_FCE_MASK (0x20U) -#define ENET_RCR_FCE_SHIFT (5U) -/*! FCE - Flow Control Enable - */ -#define ENET_RCR_FCE(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_FCE_SHIFT)) & ENET_RCR_FCE_MASK) - -#define ENET_RCR_RMII_MODE_MASK (0x100U) -#define ENET_RCR_RMII_MODE_SHIFT (8U) -/*! RMII_MODE - RMII Mode Enable - * 0b0..MAC configured for MII mode. - * 0b1..MAC configured for RMII operation. - */ -#define ENET_RCR_RMII_MODE(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_RMII_MODE_SHIFT)) & ENET_RCR_RMII_MODE_MASK) - -#define ENET_RCR_RMII_10T_MASK (0x200U) -#define ENET_RCR_RMII_10T_SHIFT (9U) -/*! RMII_10T - * 0b0..100-Mbit/s operation. - * 0b1..10-Mbit/s operation. - */ -#define ENET_RCR_RMII_10T(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_RMII_10T_SHIFT)) & ENET_RCR_RMII_10T_MASK) - -#define ENET_RCR_PADEN_MASK (0x1000U) -#define ENET_RCR_PADEN_SHIFT (12U) -/*! PADEN - Enable Frame Padding Remove On Receive - * 0b0..No padding is removed on receive by the MAC. - * 0b1..Padding is removed from received frames. - */ -#define ENET_RCR_PADEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PADEN_SHIFT)) & ENET_RCR_PADEN_MASK) - -#define ENET_RCR_PAUFWD_MASK (0x2000U) -#define ENET_RCR_PAUFWD_SHIFT (13U) -/*! PAUFWD - Terminate/Forward Pause Frames - * 0b0..Pause frames are terminated and discarded in the MAC. - * 0b1..Pause frames are forwarded to the user application. - */ -#define ENET_RCR_PAUFWD(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PAUFWD_SHIFT)) & ENET_RCR_PAUFWD_MASK) - -#define ENET_RCR_CRCFWD_MASK (0x4000U) -#define ENET_RCR_CRCFWD_SHIFT (14U) -/*! CRCFWD - Terminate/Forward Received CRC - * 0b0..The CRC field of received frames is transmitted to the user application. - * 0b1..The CRC field is stripped from the frame. - */ -#define ENET_RCR_CRCFWD(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_CRCFWD_SHIFT)) & ENET_RCR_CRCFWD_MASK) - -#define ENET_RCR_CFEN_MASK (0x8000U) -#define ENET_RCR_CFEN_SHIFT (15U) -/*! CFEN - MAC Control Frame Enable - * 0b0..MAC control frames with any opcode other than 0x0001 (pause frame) are accepted and forwarded to the client interface. - * 0b1..MAC control frames with any opcode other than 0x0001 (pause frame) are silently discarded. - */ -#define ENET_RCR_CFEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_CFEN_SHIFT)) & ENET_RCR_CFEN_MASK) - -#define ENET_RCR_MAX_FL_MASK (0x3FFF0000U) -#define ENET_RCR_MAX_FL_SHIFT (16U) -/*! MAX_FL - Maximum Frame Length - */ -#define ENET_RCR_MAX_FL(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_MAX_FL_SHIFT)) & ENET_RCR_MAX_FL_MASK) - -#define ENET_RCR_NLC_MASK (0x40000000U) -#define ENET_RCR_NLC_SHIFT (30U) -/*! NLC - Payload Length Check Disable - * 0b0..The payload length check is disabled. - * 0b1..The core checks the frame's payload length with the frame length/type field. Errors are indicated in the EIR[PLR] field. - */ -#define ENET_RCR_NLC(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_NLC_SHIFT)) & ENET_RCR_NLC_MASK) - -#define ENET_RCR_GRS_MASK (0x80000000U) -#define ENET_RCR_GRS_SHIFT (31U) -/*! GRS - Graceful Receive Stopped - */ -#define ENET_RCR_GRS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RCR_GRS_SHIFT)) & ENET_RCR_GRS_MASK) -/*! @} */ - -/*! @name TCR - Transmit Control Register */ -/*! @{ */ - -#define ENET_TCR_GTS_MASK (0x1U) -#define ENET_TCR_GTS_SHIFT (0U) -/*! GTS - Graceful Transmit Stop - */ -#define ENET_TCR_GTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_GTS_SHIFT)) & ENET_TCR_GTS_MASK) - -#define ENET_TCR_FDEN_MASK (0x4U) -#define ENET_TCR_FDEN_SHIFT (2U) -/*! FDEN - Full-Duplex Enable - */ -#define ENET_TCR_FDEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_FDEN_SHIFT)) & ENET_TCR_FDEN_MASK) - -#define ENET_TCR_TFC_PAUSE_MASK (0x8U) -#define ENET_TCR_TFC_PAUSE_SHIFT (3U) -/*! TFC_PAUSE - Transmit Frame Control Pause - * 0b0..No PAUSE frame transmitted. - * 0b1..The MAC stops transmission of data frames after the current transmission is complete. - */ -#define ENET_TCR_TFC_PAUSE(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_TFC_PAUSE_SHIFT)) & ENET_TCR_TFC_PAUSE_MASK) - -#define ENET_TCR_RFC_PAUSE_MASK (0x10U) -#define ENET_TCR_RFC_PAUSE_SHIFT (4U) -/*! RFC_PAUSE - Receive Frame Control Pause - */ -#define ENET_TCR_RFC_PAUSE(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_RFC_PAUSE_SHIFT)) & ENET_TCR_RFC_PAUSE_MASK) - -#define ENET_TCR_ADDSEL_MASK (0xE0U) -#define ENET_TCR_ADDSEL_SHIFT (5U) -/*! ADDSEL - Source MAC Address Select On Transmit - * 0b000..Node MAC address programmed on PADDR1/2 registers. - * 0b100..Reserved. - * 0b101..Reserved. - * 0b110..Reserved. - */ -#define ENET_TCR_ADDSEL(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_ADDSEL_SHIFT)) & ENET_TCR_ADDSEL_MASK) - -#define ENET_TCR_ADDINS_MASK (0x100U) -#define ENET_TCR_ADDINS_SHIFT (8U) -/*! ADDINS - Set MAC Address On Transmit - * 0b0..The source MAC address is not modified by the MAC. - * 0b1..The MAC overwrites the source MAC address with the programmed MAC address according to ADDSEL. - */ -#define ENET_TCR_ADDINS(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_ADDINS_SHIFT)) & ENET_TCR_ADDINS_MASK) - -#define ENET_TCR_CRCFWD_MASK (0x200U) -#define ENET_TCR_CRCFWD_SHIFT (9U) -/*! CRCFWD - Forward Frame From Application With CRC - * 0b0..TxBD[TC] controls whether the frame has a CRC from the application. - * 0b1..The transmitter does not append any CRC to transmitted frames, as it is expecting a frame with CRC from the application. - */ -#define ENET_TCR_CRCFWD(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCR_CRCFWD_SHIFT)) & ENET_TCR_CRCFWD_MASK) -/*! @} */ - -/*! @name PALR - Physical Address Lower Register */ -/*! @{ */ - -#define ENET_PALR_PADDR1_MASK (0xFFFFFFFFU) -#define ENET_PALR_PADDR1_SHIFT (0U) -/*! PADDR1 - Pause Address - */ -#define ENET_PALR_PADDR1(x) (((uint32_t)(((uint32_t)(x)) << ENET_PALR_PADDR1_SHIFT)) & ENET_PALR_PADDR1_MASK) -/*! @} */ - -/*! @name PAUR - Physical Address Upper Register */ -/*! @{ */ - -#define ENET_PAUR_TYPE_MASK (0xFFFFU) -#define ENET_PAUR_TYPE_SHIFT (0U) -/*! TYPE - Type Field In PAUSE Frames - */ -#define ENET_PAUR_TYPE(x) (((uint32_t)(((uint32_t)(x)) << ENET_PAUR_TYPE_SHIFT)) & ENET_PAUR_TYPE_MASK) - -#define ENET_PAUR_PADDR2_MASK (0xFFFF0000U) -#define ENET_PAUR_PADDR2_SHIFT (16U) -#define ENET_PAUR_PADDR2(x) (((uint32_t)(((uint32_t)(x)) << ENET_PAUR_PADDR2_SHIFT)) & ENET_PAUR_PADDR2_MASK) -/*! @} */ - -/*! @name OPD - Opcode/Pause Duration Register */ -/*! @{ */ - -#define ENET_OPD_PAUSE_DUR_MASK (0xFFFFU) -#define ENET_OPD_PAUSE_DUR_SHIFT (0U) -/*! PAUSE_DUR - Pause Duration - */ -#define ENET_OPD_PAUSE_DUR(x) (((uint32_t)(((uint32_t)(x)) << ENET_OPD_PAUSE_DUR_SHIFT)) & ENET_OPD_PAUSE_DUR_MASK) - -#define ENET_OPD_OPCODE_MASK (0xFFFF0000U) -#define ENET_OPD_OPCODE_SHIFT (16U) -/*! OPCODE - Opcode Field In PAUSE Frames - */ -#define ENET_OPD_OPCODE(x) (((uint32_t)(((uint32_t)(x)) << ENET_OPD_OPCODE_SHIFT)) & ENET_OPD_OPCODE_MASK) -/*! @} */ - -/*! @name TXIC - Transmit Interrupt Coalescing Register */ -/*! @{ */ - -#define ENET_TXIC_ICTT_MASK (0xFFFFU) -#define ENET_TXIC_ICTT_SHIFT (0U) -/*! ICTT - Interrupt coalescing timer threshold - */ -#define ENET_TXIC_ICTT(x) (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICTT_SHIFT)) & ENET_TXIC_ICTT_MASK) - -#define ENET_TXIC_ICFT_MASK (0xFF00000U) -#define ENET_TXIC_ICFT_SHIFT (20U) -/*! ICFT - Interrupt coalescing frame count threshold - */ -#define ENET_TXIC_ICFT(x) (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICFT_SHIFT)) & ENET_TXIC_ICFT_MASK) - -#define ENET_TXIC_ICCS_MASK (0x40000000U) -#define ENET_TXIC_ICCS_SHIFT (30U) -/*! ICCS - Interrupt Coalescing Timer Clock Source Select - * 0b0..Use MII/GMII TX clocks. - * 0b1..Use ENET system clock. - */ -#define ENET_TXIC_ICCS(x) (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICCS_SHIFT)) & ENET_TXIC_ICCS_MASK) - -#define ENET_TXIC_ICEN_MASK (0x80000000U) -#define ENET_TXIC_ICEN_SHIFT (31U) -/*! ICEN - Interrupt Coalescing Enable - * 0b0..Disable Interrupt coalescing. - * 0b1..Enable Interrupt coalescing. - */ -#define ENET_TXIC_ICEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICEN_SHIFT)) & ENET_TXIC_ICEN_MASK) -/*! @} */ - -/*! @name RXIC - Receive Interrupt Coalescing Register */ -/*! @{ */ - -#define ENET_RXIC_ICTT_MASK (0xFFFFU) -#define ENET_RXIC_ICTT_SHIFT (0U) -/*! ICTT - Interrupt coalescing timer threshold - */ -#define ENET_RXIC_ICTT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICTT_SHIFT)) & ENET_RXIC_ICTT_MASK) - -#define ENET_RXIC_ICFT_MASK (0xFF00000U) -#define ENET_RXIC_ICFT_SHIFT (20U) -/*! ICFT - Interrupt coalescing frame count threshold - */ -#define ENET_RXIC_ICFT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICFT_SHIFT)) & ENET_RXIC_ICFT_MASK) - -#define ENET_RXIC_ICCS_MASK (0x40000000U) -#define ENET_RXIC_ICCS_SHIFT (30U) -/*! ICCS - Interrupt Coalescing Timer Clock Source Select - * 0b0..Use MII/GMII TX clocks. - * 0b1..Use ENET system clock. - */ -#define ENET_RXIC_ICCS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICCS_SHIFT)) & ENET_RXIC_ICCS_MASK) - -#define ENET_RXIC_ICEN_MASK (0x80000000U) -#define ENET_RXIC_ICEN_SHIFT (31U) -/*! ICEN - Interrupt Coalescing Enable - * 0b0..Disable Interrupt coalescing. - * 0b1..Enable Interrupt coalescing. - */ -#define ENET_RXIC_ICEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICEN_SHIFT)) & ENET_RXIC_ICEN_MASK) -/*! @} */ - -/*! @name IAUR - Descriptor Individual Upper Address Register */ -/*! @{ */ - -#define ENET_IAUR_IADDR1_MASK (0xFFFFFFFFU) -#define ENET_IAUR_IADDR1_SHIFT (0U) -#define ENET_IAUR_IADDR1(x) (((uint32_t)(((uint32_t)(x)) << ENET_IAUR_IADDR1_SHIFT)) & ENET_IAUR_IADDR1_MASK) -/*! @} */ - -/*! @name IALR - Descriptor Individual Lower Address Register */ -/*! @{ */ - -#define ENET_IALR_IADDR2_MASK (0xFFFFFFFFU) -#define ENET_IALR_IADDR2_SHIFT (0U) -#define ENET_IALR_IADDR2(x) (((uint32_t)(((uint32_t)(x)) << ENET_IALR_IADDR2_SHIFT)) & ENET_IALR_IADDR2_MASK) -/*! @} */ - -/*! @name GAUR - Descriptor Group Upper Address Register */ -/*! @{ */ - -#define ENET_GAUR_GADDR1_MASK (0xFFFFFFFFU) -#define ENET_GAUR_GADDR1_SHIFT (0U) -#define ENET_GAUR_GADDR1(x) (((uint32_t)(((uint32_t)(x)) << ENET_GAUR_GADDR1_SHIFT)) & ENET_GAUR_GADDR1_MASK) -/*! @} */ - -/*! @name GALR - Descriptor Group Lower Address Register */ -/*! @{ */ - -#define ENET_GALR_GADDR2_MASK (0xFFFFFFFFU) -#define ENET_GALR_GADDR2_SHIFT (0U) -#define ENET_GALR_GADDR2(x) (((uint32_t)(((uint32_t)(x)) << ENET_GALR_GADDR2_SHIFT)) & ENET_GALR_GADDR2_MASK) -/*! @} */ - -/*! @name TFWR - Transmit FIFO Watermark Register */ -/*! @{ */ - -#define ENET_TFWR_TFWR_MASK (0x3FU) -#define ENET_TFWR_TFWR_SHIFT (0U) -/*! TFWR - Transmit FIFO Write - * 0b000000..64 bytes written. - * 0b000001..64 bytes written. - * 0b000010..128 bytes written. - * 0b000011..192 bytes written. - * 0b011111..1984 bytes written. - */ -#define ENET_TFWR_TFWR(x) (((uint32_t)(((uint32_t)(x)) << ENET_TFWR_TFWR_SHIFT)) & ENET_TFWR_TFWR_MASK) - -#define ENET_TFWR_STRFWD_MASK (0x100U) -#define ENET_TFWR_STRFWD_SHIFT (8U) -/*! STRFWD - Store And Forward Enable - * 0b0..Reset. The transmission start threshold is programmed in TFWR[TFWR]. - * 0b1..Enabled. - */ -#define ENET_TFWR_STRFWD(x) (((uint32_t)(((uint32_t)(x)) << ENET_TFWR_STRFWD_SHIFT)) & ENET_TFWR_STRFWD_MASK) -/*! @} */ - -/*! @name RDSR - Receive Descriptor Ring Start Register */ -/*! @{ */ - -#define ENET_RDSR_R_DES_START_MASK (0xFFFFFFF8U) -#define ENET_RDSR_R_DES_START_SHIFT (3U) -#define ENET_RDSR_R_DES_START(x) (((uint32_t)(((uint32_t)(x)) << ENET_RDSR_R_DES_START_SHIFT)) & ENET_RDSR_R_DES_START_MASK) -/*! @} */ - -/*! @name TDSR - Transmit Buffer Descriptor Ring Start Register */ -/*! @{ */ - -#define ENET_TDSR_X_DES_START_MASK (0xFFFFFFF8U) -#define ENET_TDSR_X_DES_START_SHIFT (3U) -#define ENET_TDSR_X_DES_START(x) (((uint32_t)(((uint32_t)(x)) << ENET_TDSR_X_DES_START_SHIFT)) & ENET_TDSR_X_DES_START_MASK) -/*! @} */ - -/*! @name MRBR - Maximum Receive Buffer Size Register */ -/*! @{ */ - -#define ENET_MRBR_R_BUF_SIZE_MASK (0x3FF0U) -#define ENET_MRBR_R_BUF_SIZE_SHIFT (4U) -#define ENET_MRBR_R_BUF_SIZE(x) (((uint32_t)(((uint32_t)(x)) << ENET_MRBR_R_BUF_SIZE_SHIFT)) & ENET_MRBR_R_BUF_SIZE_MASK) -/*! @} */ - -/*! @name RSFL - Receive FIFO Section Full Threshold */ -/*! @{ */ - -#define ENET_RSFL_RX_SECTION_FULL_MASK (0xFFU) -#define ENET_RSFL_RX_SECTION_FULL_SHIFT (0U) -/*! RX_SECTION_FULL - Value Of Receive FIFO Section Full Threshold - */ -#define ENET_RSFL_RX_SECTION_FULL(x) (((uint32_t)(((uint32_t)(x)) << ENET_RSFL_RX_SECTION_FULL_SHIFT)) & ENET_RSFL_RX_SECTION_FULL_MASK) -/*! @} */ - -/*! @name RSEM - Receive FIFO Section Empty Threshold */ -/*! @{ */ - -#define ENET_RSEM_RX_SECTION_EMPTY_MASK (0xFFU) -#define ENET_RSEM_RX_SECTION_EMPTY_SHIFT (0U) -/*! RX_SECTION_EMPTY - Value Of The Receive FIFO Section Empty Threshold - */ -#define ENET_RSEM_RX_SECTION_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << ENET_RSEM_RX_SECTION_EMPTY_SHIFT)) & ENET_RSEM_RX_SECTION_EMPTY_MASK) - -#define ENET_RSEM_STAT_SECTION_EMPTY_MASK (0x1F0000U) -#define ENET_RSEM_STAT_SECTION_EMPTY_SHIFT (16U) -/*! STAT_SECTION_EMPTY - RX Status FIFO Section Empty Threshold - */ -#define ENET_RSEM_STAT_SECTION_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << ENET_RSEM_STAT_SECTION_EMPTY_SHIFT)) & ENET_RSEM_STAT_SECTION_EMPTY_MASK) -/*! @} */ - -/*! @name RAEM - Receive FIFO Almost Empty Threshold */ -/*! @{ */ - -#define ENET_RAEM_RX_ALMOST_EMPTY_MASK (0xFFU) -#define ENET_RAEM_RX_ALMOST_EMPTY_SHIFT (0U) -/*! RX_ALMOST_EMPTY - Value Of The Receive FIFO Almost Empty Threshold - */ -#define ENET_RAEM_RX_ALMOST_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << ENET_RAEM_RX_ALMOST_EMPTY_SHIFT)) & ENET_RAEM_RX_ALMOST_EMPTY_MASK) -/*! @} */ - -/*! @name RAFL - Receive FIFO Almost Full Threshold */ -/*! @{ */ - -#define ENET_RAFL_RX_ALMOST_FULL_MASK (0xFFU) -#define ENET_RAFL_RX_ALMOST_FULL_SHIFT (0U) -/*! RX_ALMOST_FULL - Value Of The Receive FIFO Almost Full Threshold - */ -#define ENET_RAFL_RX_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << ENET_RAFL_RX_ALMOST_FULL_SHIFT)) & ENET_RAFL_RX_ALMOST_FULL_MASK) -/*! @} */ - -/*! @name TSEM - Transmit FIFO Section Empty Threshold */ -/*! @{ */ - -#define ENET_TSEM_TX_SECTION_EMPTY_MASK (0xFFU) -#define ENET_TSEM_TX_SECTION_EMPTY_SHIFT (0U) -/*! TX_SECTION_EMPTY - Value Of The Transmit FIFO Section Empty Threshold - */ -#define ENET_TSEM_TX_SECTION_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << ENET_TSEM_TX_SECTION_EMPTY_SHIFT)) & ENET_TSEM_TX_SECTION_EMPTY_MASK) -/*! @} */ - -/*! @name TAEM - Transmit FIFO Almost Empty Threshold */ -/*! @{ */ - -#define ENET_TAEM_TX_ALMOST_EMPTY_MASK (0xFFU) -#define ENET_TAEM_TX_ALMOST_EMPTY_SHIFT (0U) -/*! TX_ALMOST_EMPTY - Value of Transmit FIFO Almost Empty Threshold - */ -#define ENET_TAEM_TX_ALMOST_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << ENET_TAEM_TX_ALMOST_EMPTY_SHIFT)) & ENET_TAEM_TX_ALMOST_EMPTY_MASK) -/*! @} */ - -/*! @name TAFL - Transmit FIFO Almost Full Threshold */ -/*! @{ */ - -#define ENET_TAFL_TX_ALMOST_FULL_MASK (0xFFU) -#define ENET_TAFL_TX_ALMOST_FULL_SHIFT (0U) -/*! TX_ALMOST_FULL - Value Of The Transmit FIFO Almost Full Threshold - */ -#define ENET_TAFL_TX_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << ENET_TAFL_TX_ALMOST_FULL_SHIFT)) & ENET_TAFL_TX_ALMOST_FULL_MASK) -/*! @} */ - -/*! @name TIPG - Transmit Inter-Packet Gap */ -/*! @{ */ - -#define ENET_TIPG_IPG_MASK (0x1FU) -#define ENET_TIPG_IPG_SHIFT (0U) -/*! IPG - Transmit Inter-Packet Gap - */ -#define ENET_TIPG_IPG(x) (((uint32_t)(((uint32_t)(x)) << ENET_TIPG_IPG_SHIFT)) & ENET_TIPG_IPG_MASK) -/*! @} */ - -/*! @name FTRL - Frame Truncation Length */ -/*! @{ */ - -#define ENET_FTRL_TRUNC_FL_MASK (0x3FFFU) -#define ENET_FTRL_TRUNC_FL_SHIFT (0U) -/*! TRUNC_FL - Frame Truncation Length - */ -#define ENET_FTRL_TRUNC_FL(x) (((uint32_t)(((uint32_t)(x)) << ENET_FTRL_TRUNC_FL_SHIFT)) & ENET_FTRL_TRUNC_FL_MASK) -/*! @} */ - -/*! @name TACC - Transmit Accelerator Function Configuration */ -/*! @{ */ - -#define ENET_TACC_SHIFT16_MASK (0x1U) -#define ENET_TACC_SHIFT16_SHIFT (0U) -/*! SHIFT16 - TX FIFO Shift-16 - * 0b0..Disabled. - * 0b1..Indicates to the transmit data FIFO that the written frames contain two additional octets before the - * frame data. This means the actual frame begins at bit 16 of the first word written into the FIFO. This - * function allows putting the frame payload on a 32-bit boundary in memory, as the 14-byte Ethernet header is - * extended to a 16-byte header. - */ -#define ENET_TACC_SHIFT16(x) (((uint32_t)(((uint32_t)(x)) << ENET_TACC_SHIFT16_SHIFT)) & ENET_TACC_SHIFT16_MASK) - -#define ENET_TACC_IPCHK_MASK (0x8U) -#define ENET_TACC_IPCHK_SHIFT (3U) -/*! IPCHK - * 0b0..Checksum is not inserted. - * 0b1..If an IP frame is transmitted, the checksum is inserted automatically. The IP header checksum field must - * be cleared. If a non-IP frame is transmitted the frame is not modified. - */ -#define ENET_TACC_IPCHK(x) (((uint32_t)(((uint32_t)(x)) << ENET_TACC_IPCHK_SHIFT)) & ENET_TACC_IPCHK_MASK) - -#define ENET_TACC_PROCHK_MASK (0x10U) -#define ENET_TACC_PROCHK_SHIFT (4U) -/*! PROCHK - * 0b0..Checksum not inserted. - * 0b1..If an IP frame with a known protocol is transmitted, the checksum is inserted automatically into the - * frame. The checksum field must be cleared. The other frames are not modified. - */ -#define ENET_TACC_PROCHK(x) (((uint32_t)(((uint32_t)(x)) << ENET_TACC_PROCHK_SHIFT)) & ENET_TACC_PROCHK_MASK) -/*! @} */ - -/*! @name RACC - Receive Accelerator Function Configuration */ -/*! @{ */ - -#define ENET_RACC_PADREM_MASK (0x1U) -#define ENET_RACC_PADREM_SHIFT (0U) -/*! PADREM - Enable Padding Removal For Short IP Frames - * 0b0..Padding not removed. - * 0b1..Any bytes following the IP payload section of the frame are removed from the frame. - */ -#define ENET_RACC_PADREM(x) (((uint32_t)(((uint32_t)(x)) << ENET_RACC_PADREM_SHIFT)) & ENET_RACC_PADREM_MASK) - -#define ENET_RACC_IPDIS_MASK (0x2U) -#define ENET_RACC_IPDIS_SHIFT (1U) -/*! IPDIS - Enable Discard Of Frames With Wrong IPv4 Header Checksum - * 0b0..Frames with wrong IPv4 header checksum are not discarded. - * 0b1..If an IPv4 frame is received with a mismatching header checksum, the frame is discarded. IPv6 has no - * header checksum and is not affected by this setting. Discarding is only available when the RX FIFO operates in - * store and forward mode (RSFL cleared). - */ -#define ENET_RACC_IPDIS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RACC_IPDIS_SHIFT)) & ENET_RACC_IPDIS_MASK) - -#define ENET_RACC_PRODIS_MASK (0x4U) -#define ENET_RACC_PRODIS_SHIFT (2U) -/*! PRODIS - Enable Discard Of Frames With Wrong Protocol Checksum - * 0b0..Frames with wrong checksum are not discarded. - * 0b1..If a TCP/IP, UDP/IP, or ICMP/IP frame is received that has a wrong TCP, UDP, or ICMP checksum, the frame - * is discarded. Discarding is only available when the RX FIFO operates in store and forward mode (RSFL - * cleared). - */ -#define ENET_RACC_PRODIS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RACC_PRODIS_SHIFT)) & ENET_RACC_PRODIS_MASK) - -#define ENET_RACC_LINEDIS_MASK (0x40U) -#define ENET_RACC_LINEDIS_SHIFT (6U) -/*! LINEDIS - Enable Discard Of Frames With MAC Layer Errors - * 0b0..Frames with errors are not discarded. - * 0b1..Any frame received with a CRC, length, or PHY error is automatically discarded and not forwarded to the user application interface. - */ -#define ENET_RACC_LINEDIS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RACC_LINEDIS_SHIFT)) & ENET_RACC_LINEDIS_MASK) - -#define ENET_RACC_SHIFT16_MASK (0x80U) -#define ENET_RACC_SHIFT16_SHIFT (7U) -/*! SHIFT16 - RX FIFO Shift-16 - * 0b0..Disabled. - * 0b1..Instructs the MAC to write two additional bytes in front of each frame received into the RX FIFO. - */ -#define ENET_RACC_SHIFT16(x) (((uint32_t)(((uint32_t)(x)) << ENET_RACC_SHIFT16_SHIFT)) & ENET_RACC_SHIFT16_MASK) -/*! @} */ - -/*! @name RMON_T_PACKETS - Tx Packet Count Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_PACKETS_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_PACKETS_TXPKTS_SHIFT (0U) -/*! TXPKTS - Packet count - */ -#define ENET_RMON_T_PACKETS_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_PACKETS_TXPKTS_SHIFT)) & ENET_RMON_T_PACKETS_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_BC_PKT - Tx Broadcast Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_BC_PKT_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_BC_PKT_TXPKTS_SHIFT (0U) -/*! TXPKTS - Broadcast packets - */ -#define ENET_RMON_T_BC_PKT_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_BC_PKT_TXPKTS_SHIFT)) & ENET_RMON_T_BC_PKT_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_MC_PKT - Tx Multicast Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_MC_PKT_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_MC_PKT_TXPKTS_SHIFT (0U) -/*! TXPKTS - Multicast packets - */ -#define ENET_RMON_T_MC_PKT_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_MC_PKT_TXPKTS_SHIFT)) & ENET_RMON_T_MC_PKT_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_CRC_ALIGN - Tx Packets with CRC/Align Error Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_CRC_ALIGN_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_CRC_ALIGN_TXPKTS_SHIFT (0U) -/*! TXPKTS - Packets with CRC/align error - */ -#define ENET_RMON_T_CRC_ALIGN_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_CRC_ALIGN_TXPKTS_SHIFT)) & ENET_RMON_T_CRC_ALIGN_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_UNDERSIZE - Tx Packets Less Than Bytes and Good CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_UNDERSIZE_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_UNDERSIZE_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of transmit packets less than 64 bytes with good CRC - */ -#define ENET_RMON_T_UNDERSIZE_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_UNDERSIZE_TXPKTS_SHIFT)) & ENET_RMON_T_UNDERSIZE_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_OVERSIZE - Tx Packets GT MAX_FL bytes and Good CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_OVERSIZE_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_OVERSIZE_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of transmit packets greater than MAX_FL bytes with good CRC - */ -#define ENET_RMON_T_OVERSIZE_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_OVERSIZE_TXPKTS_SHIFT)) & ENET_RMON_T_OVERSIZE_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_FRAG - Tx Packets Less Than 64 Bytes and Bad CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_FRAG_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_FRAG_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of packets less than 64 bytes with bad CRC - */ -#define ENET_RMON_T_FRAG_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_FRAG_TXPKTS_SHIFT)) & ENET_RMON_T_FRAG_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_JAB - Tx Packets Greater Than MAX_FL bytes and Bad CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_JAB_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_JAB_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of transmit packets greater than MAX_FL bytes and bad CRC - */ -#define ENET_RMON_T_JAB_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_JAB_TXPKTS_SHIFT)) & ENET_RMON_T_JAB_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_COL - Tx Collision Count Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_COL_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_COL_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of transmit collisions - */ -#define ENET_RMON_T_COL_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_COL_TXPKTS_SHIFT)) & ENET_RMON_T_COL_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P64 - Tx 64-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P64_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P64_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 64-byte transmit packets - */ -#define ENET_RMON_T_P64_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P64_TXPKTS_SHIFT)) & ENET_RMON_T_P64_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P65TO127 - Tx 65- to 127-byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P65TO127_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P65TO127_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 65- to 127-byte transmit packets - */ -#define ENET_RMON_T_P65TO127_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P65TO127_TXPKTS_SHIFT)) & ENET_RMON_T_P65TO127_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P128TO255 - Tx 128- to 255-byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P128TO255_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P128TO255_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 128- to 255-byte transmit packets - */ -#define ENET_RMON_T_P128TO255_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P128TO255_TXPKTS_SHIFT)) & ENET_RMON_T_P128TO255_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P256TO511 - Tx 256- to 511-byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P256TO511_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P256TO511_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 256- to 511-byte transmit packets - */ -#define ENET_RMON_T_P256TO511_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P256TO511_TXPKTS_SHIFT)) & ENET_RMON_T_P256TO511_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P512TO1023 - Tx 512- to 1023-byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P512TO1023_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P512TO1023_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 512- to 1023-byte transmit packets - */ -#define ENET_RMON_T_P512TO1023_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P512TO1023_TXPKTS_SHIFT)) & ENET_RMON_T_P512TO1023_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P1024TO2047 - Tx 1024- to 2047-byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P1024TO2047_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P1024TO2047_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of 1024- to 2047-byte transmit packets - */ -#define ENET_RMON_T_P1024TO2047_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P1024TO2047_TXPKTS_SHIFT)) & ENET_RMON_T_P1024TO2047_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_P_GTE2048 - Tx Packets Greater Than 2048 Bytes Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_P_GTE2048_TXPKTS_MASK (0xFFFFU) -#define ENET_RMON_T_P_GTE2048_TXPKTS_SHIFT (0U) -/*! TXPKTS - Number of transmit packets greater than 2048 bytes - */ -#define ENET_RMON_T_P_GTE2048_TXPKTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P_GTE2048_TXPKTS_SHIFT)) & ENET_RMON_T_P_GTE2048_TXPKTS_MASK) -/*! @} */ - -/*! @name RMON_T_OCTETS - Tx Octets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_T_OCTETS_TXOCTS_MASK (0xFFFFFFFFU) -#define ENET_RMON_T_OCTETS_TXOCTS_SHIFT (0U) -/*! TXOCTS - Number of transmit octets - */ -#define ENET_RMON_T_OCTETS_TXOCTS(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_OCTETS_TXOCTS_SHIFT)) & ENET_RMON_T_OCTETS_TXOCTS_MASK) -/*! @} */ - -/*! @name IEEE_T_FRAME_OK - Frames Transmitted OK Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_FRAME_OK_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_FRAME_OK_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted OK - */ -#define ENET_IEEE_T_FRAME_OK_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_FRAME_OK_COUNT_SHIFT)) & ENET_IEEE_T_FRAME_OK_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_1COL - Frames Transmitted with Single Collision Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_1COL_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_1COL_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with one collision - */ -#define ENET_IEEE_T_1COL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_1COL_COUNT_SHIFT)) & ENET_IEEE_T_1COL_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_MCOL - Frames Transmitted with Multiple Collisions Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_MCOL_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_MCOL_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with multiple collisions - */ -#define ENET_IEEE_T_MCOL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_MCOL_COUNT_SHIFT)) & ENET_IEEE_T_MCOL_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_DEF - Frames Transmitted after Deferral Delay Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_DEF_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_DEF_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with deferral delay - */ -#define ENET_IEEE_T_DEF_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_DEF_COUNT_SHIFT)) & ENET_IEEE_T_DEF_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_LCOL - Frames Transmitted with Late Collision Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_LCOL_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_LCOL_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with late collision - */ -#define ENET_IEEE_T_LCOL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_LCOL_COUNT_SHIFT)) & ENET_IEEE_T_LCOL_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_EXCOL - Frames Transmitted with Excessive Collisions Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_EXCOL_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_EXCOL_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with excessive collisions - */ -#define ENET_IEEE_T_EXCOL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_EXCOL_COUNT_SHIFT)) & ENET_IEEE_T_EXCOL_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_MACERR - Frames Transmitted with Tx FIFO Underrun Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_MACERR_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_MACERR_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with transmit FIFO underrun - */ -#define ENET_IEEE_T_MACERR_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_MACERR_COUNT_SHIFT)) & ENET_IEEE_T_MACERR_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_CSERR - Frames Transmitted with Carrier Sense Error Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_CSERR_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_CSERR_COUNT_SHIFT (0U) -/*! COUNT - Number of frames transmitted with carrier sense error - */ -#define ENET_IEEE_T_CSERR_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_CSERR_COUNT_SHIFT)) & ENET_IEEE_T_CSERR_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_SQE - Reserved Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_SQE_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_SQE_COUNT_SHIFT (0U) -#define ENET_IEEE_T_SQE_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_SQE_COUNT_SHIFT)) & ENET_IEEE_T_SQE_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_FDXFC - Flow Control Pause Frames Transmitted Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_FDXFC_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_T_FDXFC_COUNT_SHIFT (0U) -/*! COUNT - Number of flow-control pause frames transmitted - */ -#define ENET_IEEE_T_FDXFC_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_FDXFC_COUNT_SHIFT)) & ENET_IEEE_T_FDXFC_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_T_OCTETS_OK - Octet Count for Frames Transmitted w/o Error Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_T_OCTETS_OK_COUNT_MASK (0xFFFFFFFFU) -#define ENET_IEEE_T_OCTETS_OK_COUNT_SHIFT (0U) -/*! COUNT - Octet count for frames transmitted without error Counts total octets (includes header and FCS fields). - */ -#define ENET_IEEE_T_OCTETS_OK_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_OCTETS_OK_COUNT_SHIFT)) & ENET_IEEE_T_OCTETS_OK_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_PACKETS - Rx Packet Count Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_PACKETS_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_PACKETS_COUNT_SHIFT (0U) -/*! COUNT - Number of packets received - */ -#define ENET_RMON_R_PACKETS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_PACKETS_COUNT_SHIFT)) & ENET_RMON_R_PACKETS_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_BC_PKT - Rx Broadcast Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_BC_PKT_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_BC_PKT_COUNT_SHIFT (0U) -/*! COUNT - Number of receive broadcast packets - */ -#define ENET_RMON_R_BC_PKT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_BC_PKT_COUNT_SHIFT)) & ENET_RMON_R_BC_PKT_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_MC_PKT - Rx Multicast Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_MC_PKT_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_MC_PKT_COUNT_SHIFT (0U) -/*! COUNT - Number of receive multicast packets - */ -#define ENET_RMON_R_MC_PKT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_MC_PKT_COUNT_SHIFT)) & ENET_RMON_R_MC_PKT_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_CRC_ALIGN - Rx Packets with CRC/Align Error Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_CRC_ALIGN_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_CRC_ALIGN_COUNT_SHIFT (0U) -/*! COUNT - Number of receive packets with CRC or align error - */ -#define ENET_RMON_R_CRC_ALIGN_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_CRC_ALIGN_COUNT_SHIFT)) & ENET_RMON_R_CRC_ALIGN_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_UNDERSIZE - Rx Packets with Less Than 64 Bytes and Good CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_UNDERSIZE_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_UNDERSIZE_COUNT_SHIFT (0U) -/*! COUNT - Number of receive packets with less than 64 bytes and good CRC - */ -#define ENET_RMON_R_UNDERSIZE_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_UNDERSIZE_COUNT_SHIFT)) & ENET_RMON_R_UNDERSIZE_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_OVERSIZE - Rx Packets Greater Than MAX_FL and Good CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_OVERSIZE_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_OVERSIZE_COUNT_SHIFT (0U) -/*! COUNT - Number of receive packets greater than MAX_FL and good CRC - */ -#define ENET_RMON_R_OVERSIZE_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_OVERSIZE_COUNT_SHIFT)) & ENET_RMON_R_OVERSIZE_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_FRAG - Rx Packets Less Than 64 Bytes and Bad CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_FRAG_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_FRAG_COUNT_SHIFT (0U) -/*! COUNT - Number of receive packets with less than 64 bytes and bad CRC - */ -#define ENET_RMON_R_FRAG_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_FRAG_COUNT_SHIFT)) & ENET_RMON_R_FRAG_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_JAB - Rx Packets Greater Than MAX_FL Bytes and Bad CRC Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_JAB_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_JAB_COUNT_SHIFT (0U) -/*! COUNT - Number of receive packets greater than MAX_FL and bad CRC - */ -#define ENET_RMON_R_JAB_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_JAB_COUNT_SHIFT)) & ENET_RMON_R_JAB_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P64 - Rx 64-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P64_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P64_COUNT_SHIFT (0U) -/*! COUNT - Number of 64-byte receive packets - */ -#define ENET_RMON_R_P64_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P64_COUNT_SHIFT)) & ENET_RMON_R_P64_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P65TO127 - Rx 65- to 127-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P65TO127_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P65TO127_COUNT_SHIFT (0U) -/*! COUNT - Number of 65- to 127-byte recieve packets - */ -#define ENET_RMON_R_P65TO127_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P65TO127_COUNT_SHIFT)) & ENET_RMON_R_P65TO127_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P128TO255 - Rx 128- to 255-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P128TO255_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P128TO255_COUNT_SHIFT (0U) -/*! COUNT - Number of 128- to 255-byte recieve packets - */ -#define ENET_RMON_R_P128TO255_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P128TO255_COUNT_SHIFT)) & ENET_RMON_R_P128TO255_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P256TO511 - Rx 256- to 511-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P256TO511_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P256TO511_COUNT_SHIFT (0U) -/*! COUNT - Number of 256- to 511-byte recieve packets - */ -#define ENET_RMON_R_P256TO511_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P256TO511_COUNT_SHIFT)) & ENET_RMON_R_P256TO511_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P512TO1023 - Rx 512- to 1023-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P512TO1023_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P512TO1023_COUNT_SHIFT (0U) -/*! COUNT - Number of 512- to 1023-byte recieve packets - */ -#define ENET_RMON_R_P512TO1023_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P512TO1023_COUNT_SHIFT)) & ENET_RMON_R_P512TO1023_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P1024TO2047 - Rx 1024- to 2047-Byte Packets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P1024TO2047_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P1024TO2047_COUNT_SHIFT (0U) -/*! COUNT - Number of 1024- to 2047-byte recieve packets - */ -#define ENET_RMON_R_P1024TO2047_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P1024TO2047_COUNT_SHIFT)) & ENET_RMON_R_P1024TO2047_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_P_GTE2048 - Rx Packets Greater than 2048 Bytes Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_P_GTE2048_COUNT_MASK (0xFFFFU) -#define ENET_RMON_R_P_GTE2048_COUNT_SHIFT (0U) -/*! COUNT - Number of greater-than-2048-byte recieve packets - */ -#define ENET_RMON_R_P_GTE2048_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P_GTE2048_COUNT_SHIFT)) & ENET_RMON_R_P_GTE2048_COUNT_MASK) -/*! @} */ - -/*! @name RMON_R_OCTETS - Rx Octets Statistic Register */ -/*! @{ */ - -#define ENET_RMON_R_OCTETS_COUNT_MASK (0xFFFFFFFFU) -#define ENET_RMON_R_OCTETS_COUNT_SHIFT (0U) -/*! COUNT - Number of receive octets - */ -#define ENET_RMON_R_OCTETS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_OCTETS_COUNT_SHIFT)) & ENET_RMON_R_OCTETS_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_DROP - Frames not Counted Correctly Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_DROP_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_DROP_COUNT_SHIFT (0U) -/*! COUNT - Frame count - */ -#define ENET_IEEE_R_DROP_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_DROP_COUNT_SHIFT)) & ENET_IEEE_R_DROP_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_FRAME_OK - Frames Received OK Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_FRAME_OK_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_FRAME_OK_COUNT_SHIFT (0U) -/*! COUNT - Number of frames received OK - */ -#define ENET_IEEE_R_FRAME_OK_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_FRAME_OK_COUNT_SHIFT)) & ENET_IEEE_R_FRAME_OK_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_CRC - Frames Received with CRC Error Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_CRC_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_CRC_COUNT_SHIFT (0U) -/*! COUNT - Number of frames received with CRC error - */ -#define ENET_IEEE_R_CRC_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_CRC_COUNT_SHIFT)) & ENET_IEEE_R_CRC_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_ALIGN - Frames Received with Alignment Error Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_ALIGN_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_ALIGN_COUNT_SHIFT (0U) -/*! COUNT - Number of frames received with alignment error - */ -#define ENET_IEEE_R_ALIGN_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_ALIGN_COUNT_SHIFT)) & ENET_IEEE_R_ALIGN_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_MACERR - Receive FIFO Overflow Count Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_MACERR_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_MACERR_COUNT_SHIFT (0U) -/*! COUNT - Receive FIFO overflow count - */ -#define ENET_IEEE_R_MACERR_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_MACERR_COUNT_SHIFT)) & ENET_IEEE_R_MACERR_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_FDXFC - Flow Control Pause Frames Received Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_FDXFC_COUNT_MASK (0xFFFFU) -#define ENET_IEEE_R_FDXFC_COUNT_SHIFT (0U) -/*! COUNT - Number of flow-control pause frames received - */ -#define ENET_IEEE_R_FDXFC_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_FDXFC_COUNT_SHIFT)) & ENET_IEEE_R_FDXFC_COUNT_MASK) -/*! @} */ - -/*! @name IEEE_R_OCTETS_OK - Octet Count for Frames Received without Error Statistic Register */ -/*! @{ */ - -#define ENET_IEEE_R_OCTETS_OK_COUNT_MASK (0xFFFFFFFFU) -#define ENET_IEEE_R_OCTETS_OK_COUNT_SHIFT (0U) -/*! COUNT - Number of octets for frames received without error - */ -#define ENET_IEEE_R_OCTETS_OK_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_OCTETS_OK_COUNT_SHIFT)) & ENET_IEEE_R_OCTETS_OK_COUNT_MASK) -/*! @} */ - -/*! @name ATCR - Adjustable Timer Control Register */ -/*! @{ */ - -#define ENET_ATCR_EN_MASK (0x1U) -#define ENET_ATCR_EN_SHIFT (0U) -/*! EN - Enable Timer - * 0b0..The timer stops at the current value. - * 0b1..The timer starts incrementing. - */ -#define ENET_ATCR_EN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_EN_SHIFT)) & ENET_ATCR_EN_MASK) - -#define ENET_ATCR_OFFEN_MASK (0x4U) -#define ENET_ATCR_OFFEN_SHIFT (2U) -/*! OFFEN - Enable One-Shot Offset Event - * 0b0..Disable. - * 0b1..The timer can be reset to zero when the given offset time is reached (offset event). The field is cleared - * when the offset event is reached, so no further event occurs until the field is set again. The timer - * offset value must be set before setting this field. - */ -#define ENET_ATCR_OFFEN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_OFFEN_SHIFT)) & ENET_ATCR_OFFEN_MASK) - -#define ENET_ATCR_OFFRST_MASK (0x8U) -#define ENET_ATCR_OFFRST_SHIFT (3U) -/*! OFFRST - Reset Timer On Offset Event - * 0b0..The timer is not affected and no action occurs, besides clearing OFFEN, when the offset is reached. - * 0b1..If OFFEN is set, the timer resets to zero when the offset setting is reached. The offset event does not cause a timer interrupt. - */ -#define ENET_ATCR_OFFRST(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_OFFRST_SHIFT)) & ENET_ATCR_OFFRST_MASK) - -#define ENET_ATCR_PEREN_MASK (0x10U) -#define ENET_ATCR_PEREN_SHIFT (4U) -/*! PEREN - Enable Periodical Event - * 0b0..Disable. - * 0b1..A period event interrupt can be generated (EIR[TS_TIMER]) and the event signal output is asserted when - * the timer wraps around according to the periodic setting ATPER. The timer period value must be set before - * setting this bit. Not all devices contain the event signal output. See the chip configuration details. - */ -#define ENET_ATCR_PEREN(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_PEREN_SHIFT)) & ENET_ATCR_PEREN_MASK) - -#define ENET_ATCR_PINPER_MASK (0x80U) -#define ENET_ATCR_PINPER_SHIFT (7U) -/*! PINPER - * 0b0..Disable. - * 0b1..Enable. - */ -#define ENET_ATCR_PINPER(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_PINPER_SHIFT)) & ENET_ATCR_PINPER_MASK) - -#define ENET_ATCR_RESTART_MASK (0x200U) -#define ENET_ATCR_RESTART_SHIFT (9U) -/*! RESTART - Reset Timer - */ -#define ENET_ATCR_RESTART(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_RESTART_SHIFT)) & ENET_ATCR_RESTART_MASK) - -#define ENET_ATCR_CAPTURE_MASK (0x800U) -#define ENET_ATCR_CAPTURE_SHIFT (11U) -/*! CAPTURE - Capture Timer Value - * 0b0..No effect. - * 0b1..The current time is captured and can be read from the ATVR register. - */ -#define ENET_ATCR_CAPTURE(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_CAPTURE_SHIFT)) & ENET_ATCR_CAPTURE_MASK) - -#define ENET_ATCR_SLAVE_MASK (0x2000U) -#define ENET_ATCR_SLAVE_SHIFT (13U) -/*! SLAVE - Enable Timer Slave Mode - * 0b0..The timer is active and all configuration fields in this register are relevant. - * 0b1..The internal timer is disabled and the externally provided timer value is used. All other fields, except - * CAPTURE, in this register have no effect. CAPTURE can still be used to capture the current timer value. - */ -#define ENET_ATCR_SLAVE(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_SLAVE_SHIFT)) & ENET_ATCR_SLAVE_MASK) -/*! @} */ - -/*! @name ATVR - Timer Value Register */ -/*! @{ */ - -#define ENET_ATVR_ATIME_MASK (0xFFFFFFFFU) -#define ENET_ATVR_ATIME_SHIFT (0U) -#define ENET_ATVR_ATIME(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATVR_ATIME_SHIFT)) & ENET_ATVR_ATIME_MASK) -/*! @} */ - -/*! @name ATOFF - Timer Offset Register */ -/*! @{ */ - -#define ENET_ATOFF_OFFSET_MASK (0xFFFFFFFFU) -#define ENET_ATOFF_OFFSET_SHIFT (0U) -#define ENET_ATOFF_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATOFF_OFFSET_SHIFT)) & ENET_ATOFF_OFFSET_MASK) -/*! @} */ - -/*! @name ATPER - Timer Period Register */ -/*! @{ */ - -#define ENET_ATPER_PERIOD_MASK (0xFFFFFFFFU) -#define ENET_ATPER_PERIOD_SHIFT (0U) -#define ENET_ATPER_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATPER_PERIOD_SHIFT)) & ENET_ATPER_PERIOD_MASK) -/*! @} */ - -/*! @name ATCOR - Timer Correction Register */ -/*! @{ */ - -#define ENET_ATCOR_COR_MASK (0x7FFFFFFFU) -#define ENET_ATCOR_COR_SHIFT (0U) -/*! COR - Correction Counter Wrap-Around Value - */ -#define ENET_ATCOR_COR(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATCOR_COR_SHIFT)) & ENET_ATCOR_COR_MASK) -/*! @} */ - -/*! @name ATINC - Time-Stamping Clock Period Register */ -/*! @{ */ - -#define ENET_ATINC_INC_MASK (0x7FU) -#define ENET_ATINC_INC_SHIFT (0U) -/*! INC - Clock Period Of The Timestamping Clock (ts_clk) In Nanoseconds - */ -#define ENET_ATINC_INC(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATINC_INC_SHIFT)) & ENET_ATINC_INC_MASK) - -#define ENET_ATINC_INC_CORR_MASK (0x7F00U) -#define ENET_ATINC_INC_CORR_SHIFT (8U) -/*! INC_CORR - Correction Increment Value - */ -#define ENET_ATINC_INC_CORR(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATINC_INC_CORR_SHIFT)) & ENET_ATINC_INC_CORR_MASK) -/*! @} */ - -/*! @name ATSTMP - Timestamp of Last Transmitted Frame */ -/*! @{ */ - -#define ENET_ATSTMP_TIMESTAMP_MASK (0xFFFFFFFFU) -#define ENET_ATSTMP_TIMESTAMP_SHIFT (0U) -#define ENET_ATSTMP_TIMESTAMP(x) (((uint32_t)(((uint32_t)(x)) << ENET_ATSTMP_TIMESTAMP_SHIFT)) & ENET_ATSTMP_TIMESTAMP_MASK) -/*! @} */ - -/*! @name TGSR - Timer Global Status Register */ -/*! @{ */ - -#define ENET_TGSR_TF0_MASK (0x1U) -#define ENET_TGSR_TF0_SHIFT (0U) -/*! TF0 - Copy Of Timer Flag For Channel 0 - * 0b0..Timer Flag for Channel 0 is clear - * 0b1..Timer Flag for Channel 0 is set - */ -#define ENET_TGSR_TF0(x) (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF0_SHIFT)) & ENET_TGSR_TF0_MASK) - -#define ENET_TGSR_TF1_MASK (0x2U) -#define ENET_TGSR_TF1_SHIFT (1U) -/*! TF1 - Copy Of Timer Flag For Channel 1 - * 0b0..Timer Flag for Channel 1 is clear - * 0b1..Timer Flag for Channel 1 is set - */ -#define ENET_TGSR_TF1(x) (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF1_SHIFT)) & ENET_TGSR_TF1_MASK) - -#define ENET_TGSR_TF2_MASK (0x4U) -#define ENET_TGSR_TF2_SHIFT (2U) -/*! TF2 - Copy Of Timer Flag For Channel 2 - * 0b0..Timer Flag for Channel 2 is clear - * 0b1..Timer Flag for Channel 2 is set - */ -#define ENET_TGSR_TF2(x) (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF2_SHIFT)) & ENET_TGSR_TF2_MASK) - -#define ENET_TGSR_TF3_MASK (0x8U) -#define ENET_TGSR_TF3_SHIFT (3U) -/*! TF3 - Copy Of Timer Flag For Channel 3 - * 0b0..Timer Flag for Channel 3 is clear - * 0b1..Timer Flag for Channel 3 is set - */ -#define ENET_TGSR_TF3(x) (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF3_SHIFT)) & ENET_TGSR_TF3_MASK) -/*! @} */ - -/*! @name TCSR - Timer Control Status Register */ -/*! @{ */ - -#define ENET_TCSR_TDRE_MASK (0x1U) -#define ENET_TCSR_TDRE_SHIFT (0U) -/*! TDRE - Timer DMA Request Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define ENET_TCSR_TDRE(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TDRE_SHIFT)) & ENET_TCSR_TDRE_MASK) - -#define ENET_TCSR_TMODE_MASK (0x3CU) -#define ENET_TCSR_TMODE_SHIFT (2U) -/*! TMODE - Timer Mode - * 0b0000..Timer Channel is disabled. - * 0b0001..Timer Channel is configured for Input Capture on rising edge. - * 0b0010..Timer Channel is configured for Input Capture on falling edge. - * 0b0011..Timer Channel is configured for Input Capture on both edges. - * 0b0100..Timer Channel is configured for Output Compare - software only. - * 0b0101..Timer Channel is configured for Output Compare - toggle output on compare. - * 0b0110..Timer Channel is configured for Output Compare - clear output on compare. - * 0b0111..Timer Channel is configured for Output Compare - set output on compare. - * 0b1000..Reserved - * 0b1010..Timer Channel is configured for Output Compare - clear output on compare, set output on overflow. - * 0b10x1..Timer Channel is configured for Output Compare - set output on compare, clear output on overflow. - * 0b110x..Reserved - * 0b1110..Timer Channel is configured for Output Compare - pulse output low on compare for 1 to 32 1588-clock cycles as specified by TPWC. - * 0b1111..Timer Channel is configured for Output Compare - pulse output high on compare for 1 to 32 1588-clock cycles as specified by TPWC. - */ -#define ENET_TCSR_TMODE(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TMODE_SHIFT)) & ENET_TCSR_TMODE_MASK) - -#define ENET_TCSR_TIE_MASK (0x40U) -#define ENET_TCSR_TIE_SHIFT (6U) -/*! TIE - Timer Interrupt Enable - * 0b0..Interrupt is disabled - * 0b1..Interrupt is enabled - */ -#define ENET_TCSR_TIE(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TIE_SHIFT)) & ENET_TCSR_TIE_MASK) - -#define ENET_TCSR_TF_MASK (0x80U) -#define ENET_TCSR_TF_SHIFT (7U) -/*! TF - Timer Flag - * 0b0..Input Capture or Output Compare has not occurred. - * 0b1..Input Capture or Output Compare has occurred. - */ -#define ENET_TCSR_TF(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TF_SHIFT)) & ENET_TCSR_TF_MASK) - -#define ENET_TCSR_TPWC_MASK (0xF800U) -#define ENET_TCSR_TPWC_SHIFT (11U) -/*! TPWC - Timer PulseWidth Control - * 0b00000..Pulse width is one 1588-clock cycle. - * 0b00001..Pulse width is two 1588-clock cycles. - * 0b00010..Pulse width is three 1588-clock cycles. - * 0b00011..Pulse width is four 1588-clock cycles. - * 0b11111..Pulse width is 32 1588-clock cycles. - */ -#define ENET_TCSR_TPWC(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TPWC_SHIFT)) & ENET_TCSR_TPWC_MASK) -/*! @} */ - -/* The count of ENET_TCSR */ -#define ENET_TCSR_COUNT (4U) - -/*! @name TCCR - Timer Compare Capture Register */ -/*! @{ */ - -#define ENET_TCCR_TCC_MASK (0xFFFFFFFFU) -#define ENET_TCCR_TCC_SHIFT (0U) -/*! TCC - Timer Capture Compare - */ -#define ENET_TCCR_TCC(x) (((uint32_t)(((uint32_t)(x)) << ENET_TCCR_TCC_SHIFT)) & ENET_TCCR_TCC_MASK) -/*! @} */ - -/* The count of ENET_TCCR */ -#define ENET_TCCR_COUNT (4U) - - -/*! - * @} - */ /* end of group ENET_Register_Masks */ - - -/* ENET - Peripheral instance base addresses */ -/** Peripheral ENET base address */ -#define ENET_BASE (0x402D8000u) -/** Peripheral ENET base pointer */ -#define ENET ((ENET_Type *)ENET_BASE) -/** Array initializer of ENET peripheral base addresses */ -#define ENET_BASE_ADDRS { ENET_BASE } -/** Array initializer of ENET peripheral base pointers */ -#define ENET_BASE_PTRS { ENET } -/** Interrupt vectors for the ENET peripheral type */ -#define ENET_Transmit_IRQS { ENET_IRQn } -#define ENET_Receive_IRQS { ENET_IRQn } -#define ENET_Error_IRQS { ENET_IRQn } -#define ENET_1588_Timer_IRQS { ENET_1588_Timer_IRQn } -#define ENET_Ts_IRQS { ENET_1588_Timer_IRQn } -/* ENET Buffer Descriptor and Buffer Address Alignment. */ -#define ENET_BUFF_ALIGNMENT (64U) - - -/*! - * @} - */ /* end of group ENET_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- EWM Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup EWM_Peripheral_Access_Layer EWM Peripheral Access Layer - * @{ - */ - -/** EWM - Register Layout Typedef */ -typedef struct { - __IO uint8_t CTRL; /**< Control Register, offset: 0x0 */ - __O uint8_t SERV; /**< Service Register, offset: 0x1 */ - __IO uint8_t CMPL; /**< Compare Low Register, offset: 0x2 */ - __IO uint8_t CMPH; /**< Compare High Register, offset: 0x3 */ - __IO uint8_t CLKCTRL; /**< Clock Control Register, offset: 0x4 */ - __IO uint8_t CLKPRESCALER; /**< Clock Prescaler Register, offset: 0x5 */ -} EWM_Type; - -/* ---------------------------------------------------------------------------- - -- EWM Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup EWM_Register_Masks EWM Register Masks - * @{ - */ - -/*! @name CTRL - Control Register */ -/*! @{ */ - -#define EWM_CTRL_EWMEN_MASK (0x1U) -#define EWM_CTRL_EWMEN_SHIFT (0U) -/*! EWMEN - EWM enable. - */ -#define EWM_CTRL_EWMEN(x) (((uint8_t)(((uint8_t)(x)) << EWM_CTRL_EWMEN_SHIFT)) & EWM_CTRL_EWMEN_MASK) - -#define EWM_CTRL_ASSIN_MASK (0x2U) -#define EWM_CTRL_ASSIN_SHIFT (1U) -/*! ASSIN - EWM_in's Assertion State Select. - */ -#define EWM_CTRL_ASSIN(x) (((uint8_t)(((uint8_t)(x)) << EWM_CTRL_ASSIN_SHIFT)) & EWM_CTRL_ASSIN_MASK) - -#define EWM_CTRL_INEN_MASK (0x4U) -#define EWM_CTRL_INEN_SHIFT (2U) -/*! INEN - Input Enable. - */ -#define EWM_CTRL_INEN(x) (((uint8_t)(((uint8_t)(x)) << EWM_CTRL_INEN_SHIFT)) & EWM_CTRL_INEN_MASK) - -#define EWM_CTRL_INTEN_MASK (0x8U) -#define EWM_CTRL_INTEN_SHIFT (3U) -/*! INTEN - Interrupt Enable. - */ -#define EWM_CTRL_INTEN(x) (((uint8_t)(((uint8_t)(x)) << EWM_CTRL_INTEN_SHIFT)) & EWM_CTRL_INTEN_MASK) -/*! @} */ - -/*! @name SERV - Service Register */ -/*! @{ */ - -#define EWM_SERV_SERVICE_MASK (0xFFU) -#define EWM_SERV_SERVICE_SHIFT (0U) -/*! SERVICE - SERVICE - */ -#define EWM_SERV_SERVICE(x) (((uint8_t)(((uint8_t)(x)) << EWM_SERV_SERVICE_SHIFT)) & EWM_SERV_SERVICE_MASK) -/*! @} */ - -/*! @name CMPL - Compare Low Register */ -/*! @{ */ - -#define EWM_CMPL_COMPAREL_MASK (0xFFU) -#define EWM_CMPL_COMPAREL_SHIFT (0U) -/*! COMPAREL - COMPAREL - */ -#define EWM_CMPL_COMPAREL(x) (((uint8_t)(((uint8_t)(x)) << EWM_CMPL_COMPAREL_SHIFT)) & EWM_CMPL_COMPAREL_MASK) -/*! @} */ - -/*! @name CMPH - Compare High Register */ -/*! @{ */ - -#define EWM_CMPH_COMPAREH_MASK (0xFFU) -#define EWM_CMPH_COMPAREH_SHIFT (0U) -/*! COMPAREH - COMPAREH - */ -#define EWM_CMPH_COMPAREH(x) (((uint8_t)(((uint8_t)(x)) << EWM_CMPH_COMPAREH_SHIFT)) & EWM_CMPH_COMPAREH_MASK) -/*! @} */ - -/*! @name CLKCTRL - Clock Control Register */ -/*! @{ */ - -#define EWM_CLKCTRL_CLKSEL_MASK (0x3U) -#define EWM_CLKCTRL_CLKSEL_SHIFT (0U) -/*! CLKSEL - CLKSEL - */ -#define EWM_CLKCTRL_CLKSEL(x) (((uint8_t)(((uint8_t)(x)) << EWM_CLKCTRL_CLKSEL_SHIFT)) & EWM_CLKCTRL_CLKSEL_MASK) -/*! @} */ - -/*! @name CLKPRESCALER - Clock Prescaler Register */ -/*! @{ */ - -#define EWM_CLKPRESCALER_CLK_DIV_MASK (0xFFU) -#define EWM_CLKPRESCALER_CLK_DIV_SHIFT (0U) -/*! CLK_DIV - CLK_DIV - */ -#define EWM_CLKPRESCALER_CLK_DIV(x) (((uint8_t)(((uint8_t)(x)) << EWM_CLKPRESCALER_CLK_DIV_SHIFT)) & EWM_CLKPRESCALER_CLK_DIV_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group EWM_Register_Masks */ - - -/* EWM - Peripheral instance base addresses */ -/** Peripheral EWM base address */ -#define EWM_BASE (0x400B4000u) -/** Peripheral EWM base pointer */ -#define EWM ((EWM_Type *)EWM_BASE) -/** Array initializer of EWM peripheral base addresses */ -#define EWM_BASE_ADDRS { EWM_BASE } -/** Array initializer of EWM peripheral base pointers */ -#define EWM_BASE_PTRS { EWM } -/** Interrupt vectors for the EWM peripheral type */ -#define EWM_IRQS { EWM_IRQn } - -/*! - * @} - */ /* end of group EWM_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- FLEXIO Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXIO_Peripheral_Access_Layer FLEXIO Peripheral Access Layer - * @{ - */ - -/** FLEXIO - Register Layout Typedef */ -typedef struct { - __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ - __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ - __IO uint32_t CTRL; /**< FlexIO Control Register, offset: 0x8 */ - __I uint32_t PIN; /**< Pin State Register, offset: 0xC */ - __IO uint32_t SHIFTSTAT; /**< Shifter Status Register, offset: 0x10 */ - __IO uint32_t SHIFTERR; /**< Shifter Error Register, offset: 0x14 */ - __IO uint32_t TIMSTAT; /**< Timer Status Register, offset: 0x18 */ - uint8_t RESERVED_0[4]; - __IO uint32_t SHIFTSIEN; /**< Shifter Status Interrupt Enable, offset: 0x20 */ - __IO uint32_t SHIFTEIEN; /**< Shifter Error Interrupt Enable, offset: 0x24 */ - __IO uint32_t TIMIEN; /**< Timer Interrupt Enable Register, offset: 0x28 */ - uint8_t RESERVED_1[4]; - __IO uint32_t SHIFTSDEN; /**< Shifter Status DMA Enable, offset: 0x30 */ - uint8_t RESERVED_2[12]; - __IO uint32_t SHIFTSTATE; /**< Shifter State Register, offset: 0x40 */ - uint8_t RESERVED_3[60]; - __IO uint32_t SHIFTCTL[4]; /**< Shifter Control N Register, array offset: 0x80, array step: 0x4 */ - uint8_t RESERVED_4[112]; - __IO uint32_t SHIFTCFG[4]; /**< Shifter Configuration N Register, array offset: 0x100, array step: 0x4 */ - uint8_t RESERVED_5[240]; - __IO uint32_t SHIFTBUF[4]; /**< Shifter Buffer N Register, array offset: 0x200, array step: 0x4 */ - uint8_t RESERVED_6[112]; - __IO uint32_t SHIFTBUFBIS[4]; /**< Shifter Buffer N Bit Swapped Register, array offset: 0x280, array step: 0x4 */ - uint8_t RESERVED_7[112]; - __IO uint32_t SHIFTBUFBYS[4]; /**< Shifter Buffer N Byte Swapped Register, array offset: 0x300, array step: 0x4 */ - uint8_t RESERVED_8[112]; - __IO uint32_t SHIFTBUFBBS[4]; /**< Shifter Buffer N Bit Byte Swapped Register, array offset: 0x380, array step: 0x4 */ - uint8_t RESERVED_9[112]; - __IO uint32_t TIMCTL[4]; /**< Timer Control N Register, array offset: 0x400, array step: 0x4 */ - uint8_t RESERVED_10[112]; - __IO uint32_t TIMCFG[4]; /**< Timer Configuration N Register, array offset: 0x480, array step: 0x4 */ - uint8_t RESERVED_11[112]; - __IO uint32_t TIMCMP[4]; /**< Timer Compare N Register, array offset: 0x500, array step: 0x4 */ - uint8_t RESERVED_12[368]; - __IO uint32_t SHIFTBUFNBS[4]; /**< Shifter Buffer N Nibble Byte Swapped Register, array offset: 0x680, array step: 0x4 */ - uint8_t RESERVED_13[112]; - __IO uint32_t SHIFTBUFHWS[4]; /**< Shifter Buffer N Half Word Swapped Register, array offset: 0x700, array step: 0x4 */ - uint8_t RESERVED_14[112]; - __IO uint32_t SHIFTBUFNIS[4]; /**< Shifter Buffer N Nibble Swapped Register, array offset: 0x780, array step: 0x4 */ -} FLEXIO_Type; - -/* ---------------------------------------------------------------------------- - -- FLEXIO Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXIO_Register_Masks FLEXIO Register Masks - * @{ - */ - -/*! @name VERID - Version ID Register */ -/*! @{ */ - -#define FLEXIO_VERID_FEATURE_MASK (0xFFFFU) -#define FLEXIO_VERID_FEATURE_SHIFT (0U) -/*! FEATURE - Feature Specification Number - * 0b0000000000000000..Standard features implemented. - * 0b0000000000000001..Supports state, logic and parallel modes. - */ -#define FLEXIO_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_FEATURE_SHIFT)) & FLEXIO_VERID_FEATURE_MASK) - -#define FLEXIO_VERID_MINOR_MASK (0xFF0000U) -#define FLEXIO_VERID_MINOR_SHIFT (16U) -/*! MINOR - Minor Version Number - */ -#define FLEXIO_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_MINOR_SHIFT)) & FLEXIO_VERID_MINOR_MASK) - -#define FLEXIO_VERID_MAJOR_MASK (0xFF000000U) -#define FLEXIO_VERID_MAJOR_SHIFT (24U) -/*! MAJOR - Major Version Number - */ -#define FLEXIO_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_MAJOR_SHIFT)) & FLEXIO_VERID_MAJOR_MASK) -/*! @} */ - -/*! @name PARAM - Parameter Register */ -/*! @{ */ - -#define FLEXIO_PARAM_SHIFTER_MASK (0xFFU) -#define FLEXIO_PARAM_SHIFTER_SHIFT (0U) -/*! SHIFTER - Shifter Number - */ -#define FLEXIO_PARAM_SHIFTER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_SHIFTER_SHIFT)) & FLEXIO_PARAM_SHIFTER_MASK) - -#define FLEXIO_PARAM_TIMER_MASK (0xFF00U) -#define FLEXIO_PARAM_TIMER_SHIFT (8U) -/*! TIMER - Timer Number - */ -#define FLEXIO_PARAM_TIMER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_TIMER_SHIFT)) & FLEXIO_PARAM_TIMER_MASK) - -#define FLEXIO_PARAM_PIN_MASK (0xFF0000U) -#define FLEXIO_PARAM_PIN_SHIFT (16U) -/*! PIN - Pin Number - */ -#define FLEXIO_PARAM_PIN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_PIN_SHIFT)) & FLEXIO_PARAM_PIN_MASK) - -#define FLEXIO_PARAM_TRIGGER_MASK (0xFF000000U) -#define FLEXIO_PARAM_TRIGGER_SHIFT (24U) -/*! TRIGGER - Trigger Number - */ -#define FLEXIO_PARAM_TRIGGER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_TRIGGER_SHIFT)) & FLEXIO_PARAM_TRIGGER_MASK) -/*! @} */ - -/*! @name CTRL - FlexIO Control Register */ -/*! @{ */ - -#define FLEXIO_CTRL_FLEXEN_MASK (0x1U) -#define FLEXIO_CTRL_FLEXEN_SHIFT (0U) -/*! FLEXEN - FlexIO Enable - * 0b0..FlexIO module is disabled. - * 0b1..FlexIO module is enabled. - */ -#define FLEXIO_CTRL_FLEXEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_FLEXEN_SHIFT)) & FLEXIO_CTRL_FLEXEN_MASK) - -#define FLEXIO_CTRL_SWRST_MASK (0x2U) -#define FLEXIO_CTRL_SWRST_SHIFT (1U) -/*! SWRST - Software Reset - * 0b0..Software reset is disabled - * 0b1..Software reset is enabled, all FlexIO registers except the Control Register are reset. - */ -#define FLEXIO_CTRL_SWRST(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_SWRST_SHIFT)) & FLEXIO_CTRL_SWRST_MASK) - -#define FLEXIO_CTRL_FASTACC_MASK (0x4U) -#define FLEXIO_CTRL_FASTACC_SHIFT (2U) -/*! FASTACC - Fast Access - * 0b0..Configures for normal register accesses to FlexIO - * 0b1..Configures for fast register accesses to FlexIO - */ -#define FLEXIO_CTRL_FASTACC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_FASTACC_SHIFT)) & FLEXIO_CTRL_FASTACC_MASK) - -#define FLEXIO_CTRL_DBGE_MASK (0x40000000U) -#define FLEXIO_CTRL_DBGE_SHIFT (30U) -/*! DBGE - Debug Enable - * 0b0..FlexIO is disabled in debug modes. - * 0b1..FlexIO is enabled in debug modes - */ -#define FLEXIO_CTRL_DBGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_DBGE_SHIFT)) & FLEXIO_CTRL_DBGE_MASK) - -#define FLEXIO_CTRL_DOZEN_MASK (0x80000000U) -#define FLEXIO_CTRL_DOZEN_SHIFT (31U) -/*! DOZEN - Doze Enable - * 0b0..FlexIO enabled in Doze modes. - * 0b1..FlexIO disabled in Doze modes. - */ -#define FLEXIO_CTRL_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_DOZEN_SHIFT)) & FLEXIO_CTRL_DOZEN_MASK) -/*! @} */ - -/*! @name PIN - Pin State Register */ -/*! @{ */ - -#define FLEXIO_PIN_PDI_MASK (0xFFFFFFFFU) -#define FLEXIO_PIN_PDI_SHIFT (0U) -/*! PDI - Pin Data Input - */ -#define FLEXIO_PIN_PDI(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PIN_PDI_SHIFT)) & FLEXIO_PIN_PDI_MASK) -/*! @} */ - -/*! @name SHIFTSTAT - Shifter Status Register */ -/*! @{ */ - -#define FLEXIO_SHIFTSTAT_SSF_MASK (0xFU) -#define FLEXIO_SHIFTSTAT_SSF_SHIFT (0U) -/*! SSF - Shifter Status Flag - */ -#define FLEXIO_SHIFTSTAT_SSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSTAT_SSF_SHIFT)) & FLEXIO_SHIFTSTAT_SSF_MASK) -/*! @} */ - -/*! @name SHIFTERR - Shifter Error Register */ -/*! @{ */ - -#define FLEXIO_SHIFTERR_SEF_MASK (0xFU) -#define FLEXIO_SHIFTERR_SEF_SHIFT (0U) -/*! SEF - Shifter Error Flags - */ -#define FLEXIO_SHIFTERR_SEF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTERR_SEF_SHIFT)) & FLEXIO_SHIFTERR_SEF_MASK) -/*! @} */ - -/*! @name TIMSTAT - Timer Status Register */ -/*! @{ */ - -#define FLEXIO_TIMSTAT_TSF_MASK (0xFU) -#define FLEXIO_TIMSTAT_TSF_SHIFT (0U) -/*! TSF - Timer Status Flags - */ -#define FLEXIO_TIMSTAT_TSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMSTAT_TSF_SHIFT)) & FLEXIO_TIMSTAT_TSF_MASK) -/*! @} */ - -/*! @name SHIFTSIEN - Shifter Status Interrupt Enable */ -/*! @{ */ - -#define FLEXIO_SHIFTSIEN_SSIE_MASK (0xFU) -#define FLEXIO_SHIFTSIEN_SSIE_SHIFT (0U) -/*! SSIE - Shifter Status Interrupt Enable - */ -#define FLEXIO_SHIFTSIEN_SSIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSIEN_SSIE_SHIFT)) & FLEXIO_SHIFTSIEN_SSIE_MASK) -/*! @} */ - -/*! @name SHIFTEIEN - Shifter Error Interrupt Enable */ -/*! @{ */ - -#define FLEXIO_SHIFTEIEN_SEIE_MASK (0xFU) -#define FLEXIO_SHIFTEIEN_SEIE_SHIFT (0U) -/*! SEIE - Shifter Error Interrupt Enable - */ -#define FLEXIO_SHIFTEIEN_SEIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTEIEN_SEIE_SHIFT)) & FLEXIO_SHIFTEIEN_SEIE_MASK) -/*! @} */ - -/*! @name TIMIEN - Timer Interrupt Enable Register */ -/*! @{ */ - -#define FLEXIO_TIMIEN_TEIE_MASK (0xFU) -#define FLEXIO_TIMIEN_TEIE_SHIFT (0U) -/*! TEIE - Timer Status Interrupt Enable - */ -#define FLEXIO_TIMIEN_TEIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMIEN_TEIE_SHIFT)) & FLEXIO_TIMIEN_TEIE_MASK) -/*! @} */ - -/*! @name SHIFTSDEN - Shifter Status DMA Enable */ -/*! @{ */ - -#define FLEXIO_SHIFTSDEN_SSDE_MASK (0xFU) -#define FLEXIO_SHIFTSDEN_SSDE_SHIFT (0U) -/*! SSDE - Shifter Status DMA Enable - */ -#define FLEXIO_SHIFTSDEN_SSDE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSDEN_SSDE_SHIFT)) & FLEXIO_SHIFTSDEN_SSDE_MASK) -/*! @} */ - -/*! @name SHIFTSTATE - Shifter State Register */ -/*! @{ */ - -#define FLEXIO_SHIFTSTATE_STATE_MASK (0x7U) -#define FLEXIO_SHIFTSTATE_STATE_SHIFT (0U) -/*! STATE - Current State Pointer - */ -#define FLEXIO_SHIFTSTATE_STATE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSTATE_STATE_SHIFT)) & FLEXIO_SHIFTSTATE_STATE_MASK) -/*! @} */ - -/*! @name SHIFTCTL - Shifter Control N Register */ -/*! @{ */ - -#define FLEXIO_SHIFTCTL_SMOD_MASK (0x7U) -#define FLEXIO_SHIFTCTL_SMOD_SHIFT (0U) -/*! SMOD - Shifter Mode - * 0b000..Disabled. - * 0b001..Receive mode. Captures the current Shifter content into the SHIFTBUF on expiration of the Timer. - * 0b010..Transmit mode. Load SHIFTBUF contents into the Shifter on expiration of the Timer. - * 0b011..Reserved. - * 0b100..Match Store mode. Shifter data is compared to SHIFTBUF content on expiration of the Timer. - * 0b101..Match Continuous mode. Shifter data is continuously compared to SHIFTBUF contents. - * 0b110..State mode. SHIFTBUF contents are used for storing programmable state attributes. - * 0b111..Logic mode. SHIFTBUF contents are used for implementing programmable logic look up table. - */ -#define FLEXIO_SHIFTCTL_SMOD(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_SMOD_SHIFT)) & FLEXIO_SHIFTCTL_SMOD_MASK) - -#define FLEXIO_SHIFTCTL_PINPOL_MASK (0x80U) -#define FLEXIO_SHIFTCTL_PINPOL_SHIFT (7U) -/*! PINPOL - Shifter Pin Polarity - * 0b0..Pin is active high - * 0b1..Pin is active low - */ -#define FLEXIO_SHIFTCTL_PINPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINPOL_SHIFT)) & FLEXIO_SHIFTCTL_PINPOL_MASK) - -#define FLEXIO_SHIFTCTL_PINSEL_MASK (0x1F00U) -#define FLEXIO_SHIFTCTL_PINSEL_SHIFT (8U) -/*! PINSEL - Shifter Pin Select - */ -#define FLEXIO_SHIFTCTL_PINSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINSEL_SHIFT)) & FLEXIO_SHIFTCTL_PINSEL_MASK) - -#define FLEXIO_SHIFTCTL_PINCFG_MASK (0x30000U) -#define FLEXIO_SHIFTCTL_PINCFG_SHIFT (16U) -/*! PINCFG - Shifter Pin Configuration - * 0b00..Shifter pin output disabled - * 0b01..Shifter pin open drain or bidirectional output enable - * 0b10..Shifter pin bidirectional output data - * 0b11..Shifter pin output - */ -#define FLEXIO_SHIFTCTL_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINCFG_SHIFT)) & FLEXIO_SHIFTCTL_PINCFG_MASK) - -#define FLEXIO_SHIFTCTL_TIMPOL_MASK (0x800000U) -#define FLEXIO_SHIFTCTL_TIMPOL_SHIFT (23U) -/*! TIMPOL - Timer Polarity - * 0b0..Shift on posedge of Shift clock - * 0b1..Shift on negedge of Shift clock - */ -#define FLEXIO_SHIFTCTL_TIMPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_TIMPOL_SHIFT)) & FLEXIO_SHIFTCTL_TIMPOL_MASK) - -#define FLEXIO_SHIFTCTL_TIMSEL_MASK (0x3000000U) -#define FLEXIO_SHIFTCTL_TIMSEL_SHIFT (24U) -/*! TIMSEL - Timer Select - */ -#define FLEXIO_SHIFTCTL_TIMSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_TIMSEL_SHIFT)) & FLEXIO_SHIFTCTL_TIMSEL_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTCTL */ -#define FLEXIO_SHIFTCTL_COUNT (4U) - -/*! @name SHIFTCFG - Shifter Configuration N Register */ -/*! @{ */ - -#define FLEXIO_SHIFTCFG_SSTART_MASK (0x3U) -#define FLEXIO_SHIFTCFG_SSTART_SHIFT (0U) -/*! SSTART - Shifter Start bit - * 0b00..Start bit disabled for transmitter/receiver/match store, transmitter loads data on enable - * 0b01..Start bit disabled for transmitter/receiver/match store, transmitter loads data on first shift - * 0b10..Transmitter outputs start bit value 0 before loading data on first shift, receiver/match store sets error flag if start bit is not 0 - * 0b11..Transmitter outputs start bit value 1 before loading data on first shift, receiver/match store sets error flag if start bit is not 1 - */ -#define FLEXIO_SHIFTCFG_SSTART(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_SSTART_SHIFT)) & FLEXIO_SHIFTCFG_SSTART_MASK) - -#define FLEXIO_SHIFTCFG_SSTOP_MASK (0x30U) -#define FLEXIO_SHIFTCFG_SSTOP_SHIFT (4U) -/*! SSTOP - Shifter Stop bit - * 0b00..Stop bit disabled for transmitter/receiver/match store - * 0b01..Reserved for transmitter/receiver/match store - * 0b10..Transmitter outputs stop bit value 0 on store, receiver/match store sets error flag if stop bit is not 0 - * 0b11..Transmitter outputs stop bit value 1 on store, receiver/match store sets error flag if stop bit is not 1 - */ -#define FLEXIO_SHIFTCFG_SSTOP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_SSTOP_SHIFT)) & FLEXIO_SHIFTCFG_SSTOP_MASK) - -#define FLEXIO_SHIFTCFG_INSRC_MASK (0x100U) -#define FLEXIO_SHIFTCFG_INSRC_SHIFT (8U) -/*! INSRC - Input Source - * 0b0..Pin - * 0b1..Shifter N+1 Output - */ -#define FLEXIO_SHIFTCFG_INSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_INSRC_SHIFT)) & FLEXIO_SHIFTCFG_INSRC_MASK) - -#define FLEXIO_SHIFTCFG_PWIDTH_MASK (0x1F0000U) -#define FLEXIO_SHIFTCFG_PWIDTH_SHIFT (16U) -/*! PWIDTH - Parallel Width - */ -#define FLEXIO_SHIFTCFG_PWIDTH(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_PWIDTH_SHIFT)) & FLEXIO_SHIFTCFG_PWIDTH_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTCFG */ -#define FLEXIO_SHIFTCFG_COUNT (4U) - -/*! @name SHIFTBUF - Shifter Buffer N Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUF_SHIFTBUF_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUF_SHIFTBUF_SHIFT (0U) -/*! SHIFTBUF - Shift Buffer - */ -#define FLEXIO_SHIFTBUF_SHIFTBUF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUF_SHIFTBUF_SHIFT)) & FLEXIO_SHIFTBUF_SHIFTBUF_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUF */ -#define FLEXIO_SHIFTBUF_COUNT (4U) - -/*! @name SHIFTBUFBIS - Shifter Buffer N Bit Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_SHIFT (0U) -/*! SHIFTBUFBIS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_SHIFT)) & FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFBIS */ -#define FLEXIO_SHIFTBUFBIS_COUNT (4U) - -/*! @name SHIFTBUFBYS - Shifter Buffer N Byte Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_SHIFT (0U) -/*! SHIFTBUFBYS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_SHIFT)) & FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFBYS */ -#define FLEXIO_SHIFTBUFBYS_COUNT (4U) - -/*! @name SHIFTBUFBBS - Shifter Buffer N Bit Byte Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_SHIFT (0U) -/*! SHIFTBUFBBS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_SHIFT)) & FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFBBS */ -#define FLEXIO_SHIFTBUFBBS_COUNT (4U) - -/*! @name TIMCTL - Timer Control N Register */ -/*! @{ */ - -#define FLEXIO_TIMCTL_TIMOD_MASK (0x3U) -#define FLEXIO_TIMCTL_TIMOD_SHIFT (0U) -/*! TIMOD - Timer Mode - * 0b00..Timer Disabled. - * 0b01..Dual 8-bit counters baud mode. - * 0b10..Dual 8-bit counters PWM high mode. - * 0b11..Single 16-bit counter mode. - */ -#define FLEXIO_TIMCTL_TIMOD(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TIMOD_SHIFT)) & FLEXIO_TIMCTL_TIMOD_MASK) - -#define FLEXIO_TIMCTL_PINPOL_MASK (0x80U) -#define FLEXIO_TIMCTL_PINPOL_SHIFT (7U) -/*! PINPOL - Timer Pin Polarity - * 0b0..Pin is active high - * 0b1..Pin is active low - */ -#define FLEXIO_TIMCTL_PINPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINPOL_SHIFT)) & FLEXIO_TIMCTL_PINPOL_MASK) - -#define FLEXIO_TIMCTL_PINSEL_MASK (0x1F00U) -#define FLEXIO_TIMCTL_PINSEL_SHIFT (8U) -/*! PINSEL - Timer Pin Select - */ -#define FLEXIO_TIMCTL_PINSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINSEL_SHIFT)) & FLEXIO_TIMCTL_PINSEL_MASK) - -#define FLEXIO_TIMCTL_PINCFG_MASK (0x30000U) -#define FLEXIO_TIMCTL_PINCFG_SHIFT (16U) -/*! PINCFG - Timer Pin Configuration - * 0b00..Timer pin output disabled - * 0b01..Timer pin open drain or bidirectional output enable - * 0b10..Timer pin bidirectional output data - * 0b11..Timer pin output - */ -#define FLEXIO_TIMCTL_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINCFG_SHIFT)) & FLEXIO_TIMCTL_PINCFG_MASK) - -#define FLEXIO_TIMCTL_TRGSRC_MASK (0x400000U) -#define FLEXIO_TIMCTL_TRGSRC_SHIFT (22U) -/*! TRGSRC - Trigger Source - * 0b0..External trigger selected - * 0b1..Internal trigger selected - */ -#define FLEXIO_TIMCTL_TRGSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGSRC_SHIFT)) & FLEXIO_TIMCTL_TRGSRC_MASK) - -#define FLEXIO_TIMCTL_TRGPOL_MASK (0x800000U) -#define FLEXIO_TIMCTL_TRGPOL_SHIFT (23U) -/*! TRGPOL - Trigger Polarity - * 0b0..Trigger active high - * 0b1..Trigger active low - */ -#define FLEXIO_TIMCTL_TRGPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGPOL_SHIFT)) & FLEXIO_TIMCTL_TRGPOL_MASK) - -#define FLEXIO_TIMCTL_TRGSEL_MASK (0x3F000000U) -#define FLEXIO_TIMCTL_TRGSEL_SHIFT (24U) -/*! TRGSEL - Trigger Select - */ -#define FLEXIO_TIMCTL_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGSEL_SHIFT)) & FLEXIO_TIMCTL_TRGSEL_MASK) -/*! @} */ - -/* The count of FLEXIO_TIMCTL */ -#define FLEXIO_TIMCTL_COUNT (4U) - -/*! @name TIMCFG - Timer Configuration N Register */ -/*! @{ */ - -#define FLEXIO_TIMCFG_TSTART_MASK (0x2U) -#define FLEXIO_TIMCFG_TSTART_SHIFT (1U) -/*! TSTART - Timer Start Bit - * 0b0..Start bit disabled - * 0b1..Start bit enabled - */ -#define FLEXIO_TIMCFG_TSTART(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TSTART_SHIFT)) & FLEXIO_TIMCFG_TSTART_MASK) - -#define FLEXIO_TIMCFG_TSTOP_MASK (0x30U) -#define FLEXIO_TIMCFG_TSTOP_SHIFT (4U) -/*! TSTOP - Timer Stop Bit - * 0b00..Stop bit disabled - * 0b01..Stop bit is enabled on timer compare - * 0b10..Stop bit is enabled on timer disable - * 0b11..Stop bit is enabled on timer compare and timer disable - */ -#define FLEXIO_TIMCFG_TSTOP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TSTOP_SHIFT)) & FLEXIO_TIMCFG_TSTOP_MASK) - -#define FLEXIO_TIMCFG_TIMENA_MASK (0x700U) -#define FLEXIO_TIMCFG_TIMENA_SHIFT (8U) -/*! TIMENA - Timer Enable - * 0b000..Timer always enabled - * 0b001..Timer enabled on Timer N-1 enable - * 0b010..Timer enabled on Trigger high - * 0b011..Timer enabled on Trigger high and Pin high - * 0b100..Timer enabled on Pin rising edge - * 0b101..Timer enabled on Pin rising edge and Trigger high - * 0b110..Timer enabled on Trigger rising edge - * 0b111..Timer enabled on Trigger rising or falling edge - */ -#define FLEXIO_TIMCFG_TIMENA(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMENA_SHIFT)) & FLEXIO_TIMCFG_TIMENA_MASK) - -#define FLEXIO_TIMCFG_TIMDIS_MASK (0x7000U) -#define FLEXIO_TIMCFG_TIMDIS_SHIFT (12U) -/*! TIMDIS - Timer Disable - * 0b000..Timer never disabled - * 0b001..Timer disabled on Timer N-1 disable - * 0b010..Timer disabled on Timer compare (upper 8-bits match and decrement) - * 0b011..Timer disabled on Timer compare (upper 8-bits match and decrement) and Trigger Low - * 0b100..Timer disabled on Pin rising or falling edge - * 0b101..Timer disabled on Pin rising or falling edge provided Trigger is high - * 0b110..Timer disabled on Trigger falling edge - * 0b111..Reserved - */ -#define FLEXIO_TIMCFG_TIMDIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMDIS_SHIFT)) & FLEXIO_TIMCFG_TIMDIS_MASK) - -#define FLEXIO_TIMCFG_TIMRST_MASK (0x70000U) -#define FLEXIO_TIMCFG_TIMRST_SHIFT (16U) -/*! TIMRST - Timer Reset - * 0b000..Timer never reset - * 0b001..Reserved - * 0b010..Timer reset on Timer Pin equal to Timer Output - * 0b011..Timer reset on Timer Trigger equal to Timer Output - * 0b100..Timer reset on Timer Pin rising edge - * 0b101..Reserved - * 0b110..Timer reset on Trigger rising edge - * 0b111..Timer reset on Trigger rising or falling edge - */ -#define FLEXIO_TIMCFG_TIMRST(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMRST_SHIFT)) & FLEXIO_TIMCFG_TIMRST_MASK) - -#define FLEXIO_TIMCFG_TIMDEC_MASK (0x300000U) -#define FLEXIO_TIMCFG_TIMDEC_SHIFT (20U) -/*! TIMDEC - Timer Decrement - * 0b00..Decrement counter on FlexIO clock, Shift clock equals Timer output. - * 0b01..Decrement counter on Trigger input (both edges), Shift clock equals Timer output. - * 0b10..Decrement counter on Pin input (both edges), Shift clock equals Pin input. - * 0b11..Decrement counter on Trigger input (both edges), Shift clock equals Trigger input. - */ -#define FLEXIO_TIMCFG_TIMDEC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMDEC_SHIFT)) & FLEXIO_TIMCFG_TIMDEC_MASK) - -#define FLEXIO_TIMCFG_TIMOUT_MASK (0x3000000U) -#define FLEXIO_TIMCFG_TIMOUT_SHIFT (24U) -/*! TIMOUT - Timer Output - * 0b00..Timer output is logic one when enabled and is not affected by timer reset - * 0b01..Timer output is logic zero when enabled and is not affected by timer reset - * 0b10..Timer output is logic one when enabled and on timer reset - * 0b11..Timer output is logic zero when enabled and on timer reset - */ -#define FLEXIO_TIMCFG_TIMOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMOUT_SHIFT)) & FLEXIO_TIMCFG_TIMOUT_MASK) -/*! @} */ - -/* The count of FLEXIO_TIMCFG */ -#define FLEXIO_TIMCFG_COUNT (4U) - -/*! @name TIMCMP - Timer Compare N Register */ -/*! @{ */ - -#define FLEXIO_TIMCMP_CMP_MASK (0xFFFFU) -#define FLEXIO_TIMCMP_CMP_SHIFT (0U) -/*! CMP - Timer Compare Value - */ -#define FLEXIO_TIMCMP_CMP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCMP_CMP_SHIFT)) & FLEXIO_TIMCMP_CMP_MASK) -/*! @} */ - -/* The count of FLEXIO_TIMCMP */ -#define FLEXIO_TIMCMP_COUNT (4U) - -/*! @name SHIFTBUFNBS - Shifter Buffer N Nibble Byte Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_SHIFT (0U) -/*! SHIFTBUFNBS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_SHIFT)) & FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFNBS */ -#define FLEXIO_SHIFTBUFNBS_COUNT (4U) - -/*! @name SHIFTBUFHWS - Shifter Buffer N Half Word Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_SHIFT (0U) -/*! SHIFTBUFHWS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_SHIFT)) & FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFHWS */ -#define FLEXIO_SHIFTBUFHWS_COUNT (4U) - -/*! @name SHIFTBUFNIS - Shifter Buffer N Nibble Swapped Register */ -/*! @{ */ - -#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_MASK (0xFFFFFFFFU) -#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_SHIFT (0U) -/*! SHIFTBUFNIS - Shift Buffer - */ -#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_SHIFT)) & FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_MASK) -/*! @} */ - -/* The count of FLEXIO_SHIFTBUFNIS */ -#define FLEXIO_SHIFTBUFNIS_COUNT (4U) - - -/*! - * @} - */ /* end of group FLEXIO_Register_Masks */ - - -/* FLEXIO - Peripheral instance base addresses */ -/** Peripheral FLEXIO1 base address */ -#define FLEXIO1_BASE (0x401AC000u) -/** Peripheral FLEXIO1 base pointer */ -#define FLEXIO1 ((FLEXIO_Type *)FLEXIO1_BASE) -/** Peripheral FLEXIO2 base address */ -#define FLEXIO2_BASE (0x401B0000u) -/** Peripheral FLEXIO2 base pointer */ -#define FLEXIO2 ((FLEXIO_Type *)FLEXIO2_BASE) -/** Array initializer of FLEXIO peripheral base addresses */ -#define FLEXIO_BASE_ADDRS { 0u, FLEXIO1_BASE, FLEXIO2_BASE } -/** Array initializer of FLEXIO peripheral base pointers */ -#define FLEXIO_BASE_PTRS { (FLEXIO_Type *)0u, FLEXIO1, FLEXIO2 } -/** Interrupt vectors for the FLEXIO peripheral type */ -#define FLEXIO_IRQS { NotAvail_IRQn, FLEXIO1_IRQn, FLEXIO2_IRQn } - -/*! - * @} - */ /* end of group FLEXIO_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- FLEXRAM Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXRAM_Peripheral_Access_Layer FLEXRAM Peripheral Access Layer - * @{ - */ - -/** FLEXRAM - Register Layout Typedef */ -typedef struct { - __IO uint32_t TCM_CTRL; /**< TCM CRTL Register, offset: 0x0 */ - uint8_t RESERVED_0[12]; - __IO uint32_t INT_STATUS; /**< Interrupt Status Register, offset: 0x10 */ - __IO uint32_t INT_STAT_EN; /**< Interrupt Status Enable Register, offset: 0x14 */ - __IO uint32_t INT_SIG_EN; /**< Interrupt Enable Register, offset: 0x18 */ -} FLEXRAM_Type; - -/* ---------------------------------------------------------------------------- - -- FLEXRAM Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXRAM_Register_Masks FLEXRAM Register Masks - * @{ - */ - -/*! @name TCM_CTRL - TCM CRTL Register */ -/*! @{ */ - -#define FLEXRAM_TCM_CTRL_TCM_WWAIT_EN_MASK (0x1U) -#define FLEXRAM_TCM_CTRL_TCM_WWAIT_EN_SHIFT (0U) -/*! TCM_WWAIT_EN - TCM Write Wait Mode Enable - * 0b0..TCM write fast mode: Write RAM accesses are expected to be finished in 1-cycle. - * 0b1..TCM write wait mode: Write RAM accesses are expected to be finished in 2-cycles. - */ -#define FLEXRAM_TCM_CTRL_TCM_WWAIT_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_TCM_CTRL_TCM_WWAIT_EN_SHIFT)) & FLEXRAM_TCM_CTRL_TCM_WWAIT_EN_MASK) - -#define FLEXRAM_TCM_CTRL_TCM_RWAIT_EN_MASK (0x2U) -#define FLEXRAM_TCM_CTRL_TCM_RWAIT_EN_SHIFT (1U) -/*! TCM_RWAIT_EN - TCM Read Wait Mode Enable - * 0b0..TCM read fast mode: Read RAM accesses are expected to be finished in 1-cycle. - * 0b1..TCM read wait mode: Read RAM accesses are expected to be finished in 2-cycles. - */ -#define FLEXRAM_TCM_CTRL_TCM_RWAIT_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_TCM_CTRL_TCM_RWAIT_EN_SHIFT)) & FLEXRAM_TCM_CTRL_TCM_RWAIT_EN_MASK) - -#define FLEXRAM_TCM_CTRL_FORCE_CLK_ON_MASK (0x4U) -#define FLEXRAM_TCM_CTRL_FORCE_CLK_ON_SHIFT (2U) -/*! FORCE_CLK_ON - Force RAM Clock Always On - */ -#define FLEXRAM_TCM_CTRL_FORCE_CLK_ON(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_TCM_CTRL_FORCE_CLK_ON_SHIFT)) & FLEXRAM_TCM_CTRL_FORCE_CLK_ON_MASK) -/*! @} */ - -/*! @name INT_STATUS - Interrupt Status Register */ -/*! @{ */ - -#define FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK (0x8U) -#define FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_SHIFT (3U) -/*! ITCM_ERR_STATUS - ITCM Access Error Status - * 0b0..ITCM access error does not happen - * 0b1..ITCM access error happens. - */ -#define FLEXRAM_INT_STATUS_ITCM_ERR_STATUS(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_SHIFT)) & FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK) - -#define FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK (0x10U) -#define FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_SHIFT (4U) -/*! DTCM_ERR_STATUS - DTCM Access Error Status - * 0b0..DTCM access error does not happen - * 0b1..DTCM access error happens. - */ -#define FLEXRAM_INT_STATUS_DTCM_ERR_STATUS(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_SHIFT)) & FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK) - -#define FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK (0x20U) -#define FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_SHIFT (5U) -/*! OCRAM_ERR_STATUS - OCRAM Access Error Status - * 0b0..OCRAM access error does not happen - * 0b1..OCRAM access error happens. - */ -#define FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_SHIFT)) & FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK) -/*! @} */ - -/*! @name INT_STAT_EN - Interrupt Status Enable Register */ -/*! @{ */ - -#define FLEXRAM_INT_STAT_EN_ITCM_ERR_STAT_EN_MASK (0x8U) -#define FLEXRAM_INT_STAT_EN_ITCM_ERR_STAT_EN_SHIFT (3U) -/*! ITCM_ERR_STAT_EN - ITCM Access Error Status Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_STAT_EN_ITCM_ERR_STAT_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STAT_EN_ITCM_ERR_STAT_EN_SHIFT)) & FLEXRAM_INT_STAT_EN_ITCM_ERR_STAT_EN_MASK) - -#define FLEXRAM_INT_STAT_EN_DTCM_ERR_STAT_EN_MASK (0x10U) -#define FLEXRAM_INT_STAT_EN_DTCM_ERR_STAT_EN_SHIFT (4U) -/*! DTCM_ERR_STAT_EN - DTCM Access Error Status Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_STAT_EN_DTCM_ERR_STAT_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STAT_EN_DTCM_ERR_STAT_EN_SHIFT)) & FLEXRAM_INT_STAT_EN_DTCM_ERR_STAT_EN_MASK) - -#define FLEXRAM_INT_STAT_EN_OCRAM_ERR_STAT_EN_MASK (0x20U) -#define FLEXRAM_INT_STAT_EN_OCRAM_ERR_STAT_EN_SHIFT (5U) -/*! OCRAM_ERR_STAT_EN - OCRAM Access Error Status Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_STAT_EN_OCRAM_ERR_STAT_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_STAT_EN_OCRAM_ERR_STAT_EN_SHIFT)) & FLEXRAM_INT_STAT_EN_OCRAM_ERR_STAT_EN_MASK) -/*! @} */ - -/*! @name INT_SIG_EN - Interrupt Enable Register */ -/*! @{ */ - -#define FLEXRAM_INT_SIG_EN_ITCM_ERR_SIG_EN_MASK (0x8U) -#define FLEXRAM_INT_SIG_EN_ITCM_ERR_SIG_EN_SHIFT (3U) -/*! ITCM_ERR_SIG_EN - ITCM Access Error Interrupt Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_SIG_EN_ITCM_ERR_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_SIG_EN_ITCM_ERR_SIG_EN_SHIFT)) & FLEXRAM_INT_SIG_EN_ITCM_ERR_SIG_EN_MASK) - -#define FLEXRAM_INT_SIG_EN_DTCM_ERR_SIG_EN_MASK (0x10U) -#define FLEXRAM_INT_SIG_EN_DTCM_ERR_SIG_EN_SHIFT (4U) -/*! DTCM_ERR_SIG_EN - DTCM Access Error Interrupt Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_SIG_EN_DTCM_ERR_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_SIG_EN_DTCM_ERR_SIG_EN_SHIFT)) & FLEXRAM_INT_SIG_EN_DTCM_ERR_SIG_EN_MASK) - -#define FLEXRAM_INT_SIG_EN_OCRAM_ERR_SIG_EN_MASK (0x20U) -#define FLEXRAM_INT_SIG_EN_OCRAM_ERR_SIG_EN_SHIFT (5U) -/*! OCRAM_ERR_SIG_EN - OCRAM Access Error Interrupt Enable - * 0b0..Masked - * 0b1..Enabled - */ -#define FLEXRAM_INT_SIG_EN_OCRAM_ERR_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << FLEXRAM_INT_SIG_EN_OCRAM_ERR_SIG_EN_SHIFT)) & FLEXRAM_INT_SIG_EN_OCRAM_ERR_SIG_EN_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group FLEXRAM_Register_Masks */ - - -/* FLEXRAM - Peripheral instance base addresses */ -/** Peripheral FLEXRAM base address */ -#define FLEXRAM_BASE (0x400B0000u) -/** Peripheral FLEXRAM base pointer */ -#define FLEXRAM ((FLEXRAM_Type *)FLEXRAM_BASE) -/** Array initializer of FLEXRAM peripheral base addresses */ -#define FLEXRAM_BASE_ADDRS { FLEXRAM_BASE } -/** Array initializer of FLEXRAM peripheral base pointers */ -#define FLEXRAM_BASE_PTRS { FLEXRAM } -/** Interrupt vectors for the FLEXRAM peripheral type */ -#define FLEXRAM_IRQS { FLEXRAM_IRQn } - -/*! - * @} - */ /* end of group FLEXRAM_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- FLEXSPI Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXSPI_Peripheral_Access_Layer FLEXSPI Peripheral Access Layer - * @{ - */ - -/** FLEXSPI - Register Layout Typedef */ -typedef struct { - __IO uint32_t MCR0; /**< Module Control Register 0, offset: 0x0 */ - __IO uint32_t MCR1; /**< Module Control Register 1, offset: 0x4 */ - __IO uint32_t MCR2; /**< Module Control Register 2, offset: 0x8 */ - __IO uint32_t AHBCR; /**< AHB Bus Control Register, offset: 0xC */ - __IO uint32_t INTEN; /**< Interrupt Enable Register, offset: 0x10 */ - __IO uint32_t INTR; /**< Interrupt Register, offset: 0x14 */ - __IO uint32_t LUTKEY; /**< LUT Key Register, offset: 0x18 */ - __IO uint32_t LUTCR; /**< LUT Control Register, offset: 0x1C */ - __IO uint32_t AHBRXBUFCR0[4]; /**< AHB RX Buffer 0 Control Register 0..AHB RX Buffer 3 Control Register 0, array offset: 0x20, array step: 0x4 */ - uint8_t RESERVED_0[48]; - __IO uint32_t FLSHCR0[4]; /**< Flash A1 Control Register 0..Flash B2 Control Register 0, array offset: 0x60, array step: 0x4 */ - __IO uint32_t FLSHCR1[4]; /**< Flash A1 Control Register 1..Flash B2 Control Register 1, array offset: 0x70, array step: 0x4 */ - __IO uint32_t FLSHCR2[4]; /**< Flash A1 Control Register 2..Flash B2 Control Register 2, array offset: 0x80, array step: 0x4 */ - uint8_t RESERVED_1[4]; - __IO uint32_t FLSHCR4; /**< Flash Control Register 4, offset: 0x94 */ - uint8_t RESERVED_2[8]; - __IO uint32_t IPCR0; /**< IP Control Register 0, offset: 0xA0 */ - __IO uint32_t IPCR1; /**< IP Control Register 1, offset: 0xA4 */ - uint8_t RESERVED_3[8]; - __IO uint32_t IPCMD; /**< IP Command Register, offset: 0xB0 */ - uint8_t RESERVED_4[4]; - __IO uint32_t IPRXFCR; /**< IP RX FIFO Control Register, offset: 0xB8 */ - __IO uint32_t IPTXFCR; /**< IP TX FIFO Control Register, offset: 0xBC */ - __IO uint32_t DLLCR[2]; /**< DLL Control Register 0, array offset: 0xC0, array step: 0x4 */ - uint8_t RESERVED_5[24]; - __I uint32_t STS0; /**< Status Register 0, offset: 0xE0 */ - __I uint32_t STS1; /**< Status Register 1, offset: 0xE4 */ - __I uint32_t STS2; /**< Status Register 2, offset: 0xE8 */ - __I uint32_t AHBSPNDSTS; /**< AHB Suspend Status Register, offset: 0xEC */ - __I uint32_t IPRXFSTS; /**< IP RX FIFO Status Register, offset: 0xF0 */ - __I uint32_t IPTXFSTS; /**< IP TX FIFO Status Register, offset: 0xF4 */ - uint8_t RESERVED_6[8]; - __I uint32_t RFDR[32]; /**< IP RX FIFO Data Register 0..IP RX FIFO Data Register 31, array offset: 0x100, array step: 0x4 */ - __O uint32_t TFDR[32]; /**< IP TX FIFO Data Register 0..IP TX FIFO Data Register 31, array offset: 0x180, array step: 0x4 */ - __IO uint32_t LUT[64]; /**< LUT 0..LUT 63, array offset: 0x200, array step: 0x4 */ -} FLEXSPI_Type; - -/* ---------------------------------------------------------------------------- - -- FLEXSPI Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup FLEXSPI_Register_Masks FLEXSPI Register Masks - * @{ - */ - -/*! @name MCR0 - Module Control Register 0 */ -/*! @{ */ - -#define FLEXSPI_MCR0_SWRESET_MASK (0x1U) -#define FLEXSPI_MCR0_SWRESET_SHIFT (0U) -/*! SWRESET - Software Reset - */ -#define FLEXSPI_MCR0_SWRESET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SWRESET_SHIFT)) & FLEXSPI_MCR0_SWRESET_MASK) - -#define FLEXSPI_MCR0_MDIS_MASK (0x2U) -#define FLEXSPI_MCR0_MDIS_SHIFT (1U) -/*! MDIS - Module Disable - */ -#define FLEXSPI_MCR0_MDIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_MDIS_SHIFT)) & FLEXSPI_MCR0_MDIS_MASK) - -#define FLEXSPI_MCR0_RXCLKSRC_MASK (0x30U) -#define FLEXSPI_MCR0_RXCLKSRC_SHIFT (4U) -/*! RXCLKSRC - Sample Clock source selection for Flash Reading - * 0b00..Dummy Read strobe generated by FlexSPI Controller and loopback internally. - * 0b01..Dummy Read strobe generated by FlexSPI Controller and loopback from DQS pad. - * 0b10..Reserved - * 0b11..Flash provided Read strobe and input from DQS pad - */ -#define FLEXSPI_MCR0_RXCLKSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_RXCLKSRC_SHIFT)) & FLEXSPI_MCR0_RXCLKSRC_MASK) - -#define FLEXSPI_MCR0_ARDFEN_MASK (0x40U) -#define FLEXSPI_MCR0_ARDFEN_SHIFT (6U) -/*! ARDFEN - Enable AHB bus Read Access to IP RX FIFO. - * 0b0..IP RX FIFO should be read by IP Bus. AHB Bus read access to IP RX FIFO memory space will get bus error response. - * 0b1..IP RX FIFO should be read by AHB Bus. IP Bus read access to IP RX FIFO memory space will always return data zero but no bus error response. - */ -#define FLEXSPI_MCR0_ARDFEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ARDFEN_SHIFT)) & FLEXSPI_MCR0_ARDFEN_MASK) - -#define FLEXSPI_MCR0_ATDFEN_MASK (0x80U) -#define FLEXSPI_MCR0_ATDFEN_SHIFT (7U) -/*! ATDFEN - Enable AHB bus Write Access to IP TX FIFO. - * 0b0..IP TX FIFO should be written by IP Bus. AHB Bus write access to IP TX FIFO memory space will get bus error response. - * 0b1..IP TX FIFO should be written by AHB Bus. IP Bus write access to IP TX FIFO memory space will be ignored but no bus error response. - */ -#define FLEXSPI_MCR0_ATDFEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ATDFEN_SHIFT)) & FLEXSPI_MCR0_ATDFEN_MASK) - -#define FLEXSPI_MCR0_HSEN_MASK (0x800U) -#define FLEXSPI_MCR0_HSEN_SHIFT (11U) -/*! HSEN - Half Speed Serial Flash access Enable. - * 0b0..Disable divide by 2 of serial flash clock for half speed commands. - * 0b1..Enable divide by 2 of serial flash clock for half speed commands. - */ -#define FLEXSPI_MCR0_HSEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_HSEN_SHIFT)) & FLEXSPI_MCR0_HSEN_MASK) - -#define FLEXSPI_MCR0_DOZEEN_MASK (0x1000U) -#define FLEXSPI_MCR0_DOZEEN_SHIFT (12U) -/*! DOZEEN - Doze mode enable bit - * 0b0..Doze mode support disabled. AHB clock and serial clock will not be gated off when there is doze mode request from system. - * 0b1..Doze mode support enabled. AHB clock and serial clock will be gated off when there is doze mode request from system. - */ -#define FLEXSPI_MCR0_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_DOZEEN_SHIFT)) & FLEXSPI_MCR0_DOZEEN_MASK) - -#define FLEXSPI_MCR0_COMBINATIONEN_MASK (0x2000U) -#define FLEXSPI_MCR0_COMBINATIONEN_SHIFT (13U) -/*! COMBINATIONEN - This bit is to support Flash Octal mode access by combining Port A and B Data pins (SIOA[3:0] and SIOB[3:0]). - * 0b0..Disable. - * 0b1..Enable. - */ -#define FLEXSPI_MCR0_COMBINATIONEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_COMBINATIONEN_SHIFT)) & FLEXSPI_MCR0_COMBINATIONEN_MASK) - -#define FLEXSPI_MCR0_SCKFREERUNEN_MASK (0x4000U) -#define FLEXSPI_MCR0_SCKFREERUNEN_SHIFT (14U) -/*! SCKFREERUNEN - This bit is used to force SCK output free-running. For FPGA applications, - * external device may use SCK clock as reference clock to its internal PLL. If SCK free-running is - * enabled, data sampling with loopback clock from SCK pad is not supported (MCR0[RXCLKSRC]=2). - * 0b0..Disable. - * 0b1..Enable. - */ -#define FLEXSPI_MCR0_SCKFREERUNEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SCKFREERUNEN_SHIFT)) & FLEXSPI_MCR0_SCKFREERUNEN_MASK) - -#define FLEXSPI_MCR0_IPGRANTWAIT_MASK (0xFF0000U) -#define FLEXSPI_MCR0_IPGRANTWAIT_SHIFT (16U) -/*! IPGRANTWAIT - Time out wait cycle for IP command grant. - */ -#define FLEXSPI_MCR0_IPGRANTWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_IPGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_IPGRANTWAIT_MASK) - -#define FLEXSPI_MCR0_AHBGRANTWAIT_MASK (0xFF000000U) -#define FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT (24U) -/*! AHBGRANTWAIT - Timeout wait cycle for AHB command grant. - */ -#define FLEXSPI_MCR0_AHBGRANTWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_AHBGRANTWAIT_MASK) -/*! @} */ - -/*! @name MCR1 - Module Control Register 1 */ -/*! @{ */ - -#define FLEXSPI_MCR1_AHBBUSWAIT_MASK (0xFFFFU) -#define FLEXSPI_MCR1_AHBBUSWAIT_SHIFT (0U) -#define FLEXSPI_MCR1_AHBBUSWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_AHBBUSWAIT_SHIFT)) & FLEXSPI_MCR1_AHBBUSWAIT_MASK) - -#define FLEXSPI_MCR1_SEQWAIT_MASK (0xFFFF0000U) -#define FLEXSPI_MCR1_SEQWAIT_SHIFT (16U) -#define FLEXSPI_MCR1_SEQWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_SEQWAIT_SHIFT)) & FLEXSPI_MCR1_SEQWAIT_MASK) -/*! @} */ - -/*! @name MCR2 - Module Control Register 2 */ -/*! @{ */ - -#define FLEXSPI_MCR2_CLRAHBBUFOPT_MASK (0x800U) -#define FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT (11U) -/*! CLRAHBBUFOPT - This bit determines whether AHB RX Buffer and AHB TX Buffer will be cleaned - * automaticaly when FlexSPI returns STOP mode ACK. Software should set this bit if AHB RX Buffer or - * AHB TX Buffer will be powered off in STOP mode. Otherwise AHB read access after exiting STOP - * mode may hit AHB RX Buffer or AHB TX Buffer but their data entries are invalid. - * 0b0..AHB RX/TX Buffer will not be cleaned automatically when FlexSPI return Stop mode ACK. - * 0b1..AHB RX/TX Buffer will be cleaned automatically when FlexSPI return Stop mode ACK. - */ -#define FLEXSPI_MCR2_CLRAHBBUFOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT)) & FLEXSPI_MCR2_CLRAHBBUFOPT_MASK) - -#define FLEXSPI_MCR2_CLRLEARNPHASE_MASK (0x4000U) -#define FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT (14U) -/*! CLRLEARNPHASE - The sampling clock phase selection will be reset to phase 0 when this bit is - * written with 0x1. This bit will be auto-cleared immediately. - */ -#define FLEXSPI_MCR2_CLRLEARNPHASE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT)) & FLEXSPI_MCR2_CLRLEARNPHASE_MASK) - -#define FLEXSPI_MCR2_SAMEDEVICEEN_MASK (0x8000U) -#define FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT (15U) -/*! SAMEDEVICEEN - All external devices are same devices (both in types and size) for A1/A2/B1/B2. - * 0b0..In Individual mode, FLSHA1CRx/FLSHA2CRx/FLSHB1CRx/FLSHB2CRx register setting will be applied to Flash - * A1/A2/B1/B2 seperately. In Parallel mode, FLSHA1CRx register setting will be applied to Flash A1 and B1, - * FLSHA2CRx register setting will be applied to Flash A2 and B2. FLSHB1CRx/FLSHB2CRx register settings will be - * ignored. - * 0b1..FLSHA1CR0/FLSHA1CR1/FLSHA1CR2 register settings will be applied to Flash A1/A2/B1/B2. FLSHA2CRx/FLSHB1CRx/FLSHB2CRx will be ignored. - */ -#define FLEXSPI_MCR2_SAMEDEVICEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT)) & FLEXSPI_MCR2_SAMEDEVICEEN_MASK) - -#define FLEXSPI_MCR2_SCKBDIFFOPT_MASK (0x80000U) -#define FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT (19U) -/*! SCKBDIFFOPT - SCKB pad can be used as SCKA differential clock output (inverted clock to SCKA). - * In this case, port B flash access is not available. After change the value of this feild, - * MCR0[SWRESET] should be set. - * 0b1..SCKB pad is used as port A SCK inverted clock output (Differential clock to SCKA). Port B flash access is not available. - * 0b0..SCKB pad is used as port B SCK clock output. Port B flash access is available. - */ -#define FLEXSPI_MCR2_SCKBDIFFOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT)) & FLEXSPI_MCR2_SCKBDIFFOPT_MASK) - -#define FLEXSPI_MCR2_RESUMEWAIT_MASK (0xFF000000U) -#define FLEXSPI_MCR2_RESUMEWAIT_SHIFT (24U) -/*! RESUMEWAIT - Wait cycle (in AHB clock cycle) for idle state before suspended command sequence resumed. - */ -#define FLEXSPI_MCR2_RESUMEWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RESUMEWAIT_SHIFT)) & FLEXSPI_MCR2_RESUMEWAIT_MASK) -/*! @} */ - -/*! @name AHBCR - AHB Bus Control Register */ -/*! @{ */ - -#define FLEXSPI_AHBCR_APAREN_MASK (0x1U) -#define FLEXSPI_AHBCR_APAREN_SHIFT (0U) -/*! APAREN - Parallel mode enabled for AHB triggered Command (both read and write) . - * 0b0..Flash will be accessed in Individual mode. - * 0b1..Flash will be accessed in Parallel mode. - */ -#define FLEXSPI_AHBCR_APAREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_APAREN_SHIFT)) & FLEXSPI_AHBCR_APAREN_MASK) - -#define FLEXSPI_AHBCR_CACHABLEEN_MASK (0x8U) -#define FLEXSPI_AHBCR_CACHABLEEN_SHIFT (3U) -/*! CACHABLEEN - Enable AHB bus cachable read access support. - * 0b0..Disabled. When there is AHB bus cachable read access, FlexSPI will not check whether it hit AHB TX Buffer. - * 0b1..Enabled. When there is AHB bus cachable read access, FlexSPI will check whether it hit AHB TX Buffer first. - */ -#define FLEXSPI_AHBCR_CACHABLEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CACHABLEEN_SHIFT)) & FLEXSPI_AHBCR_CACHABLEEN_MASK) - -#define FLEXSPI_AHBCR_BUFFERABLEEN_MASK (0x10U) -#define FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT (4U) -/*! BUFFERABLEEN - Enable AHB bus bufferable write access support. This field affects the last beat - * of AHB write access, refer for more details about AHB bufferable write. - * 0b0..Disabled. For all AHB write access (no matter bufferable or non-bufferable ), FlexSPI will return AHB Bus - * ready after all data is transmitted to External device and AHB command finished. - * 0b1..Enabled. For AHB bufferable write access, FlexSPI will return AHB Bus ready when the AHB command is - * granted by arbitrator and will not wait for AHB command finished. - */ -#define FLEXSPI_AHBCR_BUFFERABLEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT)) & FLEXSPI_AHBCR_BUFFERABLEEN_MASK) - -#define FLEXSPI_AHBCR_PREFETCHEN_MASK (0x20U) -#define FLEXSPI_AHBCR_PREFETCHEN_SHIFT (5U) -/*! PREFETCHEN - AHB Read Prefetch Enable. - */ -#define FLEXSPI_AHBCR_PREFETCHEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_PREFETCHEN_SHIFT)) & FLEXSPI_AHBCR_PREFETCHEN_MASK) - -#define FLEXSPI_AHBCR_READADDROPT_MASK (0x40U) -#define FLEXSPI_AHBCR_READADDROPT_SHIFT (6U) -/*! READADDROPT - AHB Read Address option bit. This option bit is intend to remove AHB burst start address alignment limitation. - * 0b0..There is AHB read burst start address alignment limitation when flash is accessed in parallel mode or flash is wordaddressable. - * 0b1..There is no AHB read burst start address alignment limitation. FlexSPI will fetch more datas than AHB - * burst required to meet the alignment requirement. - */ -#define FLEXSPI_AHBCR_READADDROPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_READADDROPT_SHIFT)) & FLEXSPI_AHBCR_READADDROPT_MASK) -/*! @} */ - -/*! @name INTEN - Interrupt Enable Register */ -/*! @{ */ - -#define FLEXSPI_INTEN_IPCMDDONEEN_MASK (0x1U) -#define FLEXSPI_INTEN_IPCMDDONEEN_SHIFT (0U) -/*! IPCMDDONEEN - IP triggered Command Sequences Execution finished interrupt enable. - */ -#define FLEXSPI_INTEN_IPCMDDONEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDDONEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDDONEEN_MASK) - -#define FLEXSPI_INTEN_IPCMDGEEN_MASK (0x2U) -#define FLEXSPI_INTEN_IPCMDGEEN_SHIFT (1U) -/*! IPCMDGEEN - IP triggered Command Sequences Grant Timeout interrupt enable. - */ -#define FLEXSPI_INTEN_IPCMDGEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDGEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDGEEN_MASK) - -#define FLEXSPI_INTEN_AHBCMDGEEN_MASK (0x4U) -#define FLEXSPI_INTEN_AHBCMDGEEN_SHIFT (2U) -/*! AHBCMDGEEN - AHB triggered Command Sequences Grant Timeout interrupt enable. - */ -#define FLEXSPI_INTEN_AHBCMDGEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDGEEN_SHIFT)) & FLEXSPI_INTEN_AHBCMDGEEN_MASK) - -#define FLEXSPI_INTEN_IPCMDERREN_MASK (0x8U) -#define FLEXSPI_INTEN_IPCMDERREN_SHIFT (3U) -/*! IPCMDERREN - IP triggered Command Sequences Error Detected interrupt enable. - */ -#define FLEXSPI_INTEN_IPCMDERREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDERREN_SHIFT)) & FLEXSPI_INTEN_IPCMDERREN_MASK) - -#define FLEXSPI_INTEN_AHBCMDERREN_MASK (0x10U) -#define FLEXSPI_INTEN_AHBCMDERREN_SHIFT (4U) -/*! AHBCMDERREN - AHB triggered Command Sequences Error Detected interrupt enable. - */ -#define FLEXSPI_INTEN_AHBCMDERREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDERREN_SHIFT)) & FLEXSPI_INTEN_AHBCMDERREN_MASK) - -#define FLEXSPI_INTEN_IPRXWAEN_MASK (0x20U) -#define FLEXSPI_INTEN_IPRXWAEN_SHIFT (5U) -/*! IPRXWAEN - IP RX FIFO WaterMark available interrupt enable. - */ -#define FLEXSPI_INTEN_IPRXWAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPRXWAEN_SHIFT)) & FLEXSPI_INTEN_IPRXWAEN_MASK) - -#define FLEXSPI_INTEN_IPTXWEEN_MASK (0x40U) -#define FLEXSPI_INTEN_IPTXWEEN_SHIFT (6U) -/*! IPTXWEEN - IP TX FIFO WaterMark empty interrupt enable. - */ -#define FLEXSPI_INTEN_IPTXWEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPTXWEEN_SHIFT)) & FLEXSPI_INTEN_IPTXWEEN_MASK) - -#define FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK (0x100U) -#define FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT (8U) -/*! SCKSTOPBYRDEN - SCK is stopped during command sequence because Async RX FIFO full interrupt enable. - */ -#define FLEXSPI_INTEN_SCKSTOPBYRDEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK) - -#define FLEXSPI_INTEN_SCKSTOPBYWREN_MASK (0x200U) -#define FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT (9U) -/*! SCKSTOPBYWREN - SCK is stopped during command sequence because Async TX FIFO empty interrupt enable. - */ -#define FLEXSPI_INTEN_SCKSTOPBYWREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYWREN_MASK) - -#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK (0x400U) -#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT (10U) -/*! AHBBUSTIMEOUTEN - AHB Bus timeout interrupt.Refer Interrupts chapter for more details. - */ -#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK) - -#define FLEXSPI_INTEN_SEQTIMEOUTEN_MASK (0x800U) -#define FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT (11U) -/*! SEQTIMEOUTEN - Sequence execution timeout interrupt enable.Refer Interrupts chapter for more details. - */ -#define FLEXSPI_INTEN_SEQTIMEOUTEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_SEQTIMEOUTEN_MASK) -/*! @} */ - -/*! @name INTR - Interrupt Register */ -/*! @{ */ - -#define FLEXSPI_INTR_IPCMDDONE_MASK (0x1U) -#define FLEXSPI_INTR_IPCMDDONE_SHIFT (0U) -/*! IPCMDDONE - IP triggered Command Sequences Execution finished interrupt. This interrupt is also - * generated when there is IPCMDGE or IPCMDERR interrupt generated. - */ -#define FLEXSPI_INTR_IPCMDDONE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDDONE_SHIFT)) & FLEXSPI_INTR_IPCMDDONE_MASK) - -#define FLEXSPI_INTR_IPCMDGE_MASK (0x2U) -#define FLEXSPI_INTR_IPCMDGE_SHIFT (1U) -/*! IPCMDGE - IP triggered Command Sequences Grant Timeout interrupt. - */ -#define FLEXSPI_INTR_IPCMDGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDGE_SHIFT)) & FLEXSPI_INTR_IPCMDGE_MASK) - -#define FLEXSPI_INTR_AHBCMDGE_MASK (0x4U) -#define FLEXSPI_INTR_AHBCMDGE_SHIFT (2U) -/*! AHBCMDGE - AHB triggered Command Sequences Grant Timeout interrupt. - */ -#define FLEXSPI_INTR_AHBCMDGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDGE_SHIFT)) & FLEXSPI_INTR_AHBCMDGE_MASK) - -#define FLEXSPI_INTR_IPCMDERR_MASK (0x8U) -#define FLEXSPI_INTR_IPCMDERR_SHIFT (3U) -/*! IPCMDERR - IP triggered Command Sequences Error Detected interrupt. When an error detected for - * IP command, this command will be ignored and not executed at all. - */ -#define FLEXSPI_INTR_IPCMDERR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDERR_SHIFT)) & FLEXSPI_INTR_IPCMDERR_MASK) - -#define FLEXSPI_INTR_AHBCMDERR_MASK (0x10U) -#define FLEXSPI_INTR_AHBCMDERR_SHIFT (4U) -/*! AHBCMDERR - AHB triggered Command Sequences Error Detected interrupt. When an error detected for - * AHB command, this command will be ignored and not executed at all. - */ -#define FLEXSPI_INTR_AHBCMDERR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDERR_SHIFT)) & FLEXSPI_INTR_AHBCMDERR_MASK) - -#define FLEXSPI_INTR_IPRXWA_MASK (0x20U) -#define FLEXSPI_INTR_IPRXWA_SHIFT (5U) -/*! IPRXWA - IP RX FIFO watermark available interrupt. - */ -#define FLEXSPI_INTR_IPRXWA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPRXWA_SHIFT)) & FLEXSPI_INTR_IPRXWA_MASK) - -#define FLEXSPI_INTR_IPTXWE_MASK (0x40U) -#define FLEXSPI_INTR_IPTXWE_SHIFT (6U) -/*! IPTXWE - IP TX FIFO watermark empty interrupt. - */ -#define FLEXSPI_INTR_IPTXWE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPTXWE_SHIFT)) & FLEXSPI_INTR_IPTXWE_MASK) - -#define FLEXSPI_INTR_SCKSTOPBYRD_MASK (0x100U) -#define FLEXSPI_INTR_SCKSTOPBYRD_SHIFT (8U) -/*! SCKSTOPBYRD - SCK is stopped during command sequence because Async RX FIFO full interrupt. - */ -#define FLEXSPI_INTR_SCKSTOPBYRD(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYRD_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYRD_MASK) - -#define FLEXSPI_INTR_SCKSTOPBYWR_MASK (0x200U) -#define FLEXSPI_INTR_SCKSTOPBYWR_SHIFT (9U) -/*! SCKSTOPBYWR - SCK is stopped during command sequence because Async TX FIFO empty interrupt. - */ -#define FLEXSPI_INTR_SCKSTOPBYWR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYWR_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYWR_MASK) - -#define FLEXSPI_INTR_AHBBUSTIMEOUT_MASK (0x400U) -#define FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT (10U) -/*! AHBBUSTIMEOUT - AHB Bus timeout interrupt.Refer Interrupts chapter for more details. - */ -#define FLEXSPI_INTR_AHBBUSTIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT)) & FLEXSPI_INTR_AHBBUSTIMEOUT_MASK) - -#define FLEXSPI_INTR_SEQTIMEOUT_MASK (0x800U) -#define FLEXSPI_INTR_SEQTIMEOUT_SHIFT (11U) -/*! SEQTIMEOUT - Sequence execution timeout interrupt. - */ -#define FLEXSPI_INTR_SEQTIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SEQTIMEOUT_SHIFT)) & FLEXSPI_INTR_SEQTIMEOUT_MASK) -/*! @} */ - -/*! @name LUTKEY - LUT Key Register */ -/*! @{ */ - -#define FLEXSPI_LUTKEY_KEY_MASK (0xFFFFFFFFU) -#define FLEXSPI_LUTKEY_KEY_SHIFT (0U) -/*! KEY - The Key to lock or unlock LUT. - */ -#define FLEXSPI_LUTKEY_KEY(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTKEY_KEY_SHIFT)) & FLEXSPI_LUTKEY_KEY_MASK) -/*! @} */ - -/*! @name LUTCR - LUT Control Register */ -/*! @{ */ - -#define FLEXSPI_LUTCR_LOCK_MASK (0x1U) -#define FLEXSPI_LUTCR_LOCK_SHIFT (0U) -/*! LOCK - Lock LUT - */ -#define FLEXSPI_LUTCR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_LOCK_SHIFT)) & FLEXSPI_LUTCR_LOCK_MASK) - -#define FLEXSPI_LUTCR_UNLOCK_MASK (0x2U) -#define FLEXSPI_LUTCR_UNLOCK_SHIFT (1U) -/*! UNLOCK - Unlock LUT - */ -#define FLEXSPI_LUTCR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_UNLOCK_SHIFT)) & FLEXSPI_LUTCR_UNLOCK_MASK) -/*! @} */ - -/*! @name AHBRXBUFCR0 - AHB RX Buffer 0 Control Register 0..AHB RX Buffer 3 Control Register 0 */ -/*! @{ */ - -#define FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK (0xFFU) -#define FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT (0U) -/*! BUFSZ - AHB RX Buffer Size in 64 bits.Refer AHB RX Buffer Management for more details. - */ -#define FLEXSPI_AHBRXBUFCR0_BUFSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT)) & FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK) - -#define FLEXSPI_AHBRXBUFCR0_MSTRID_MASK (0xF0000U) -#define FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT (16U) -/*! MSTRID - This AHB RX Buffer is assigned according to AHB Master with ID (MSTR_ID). Please refer to for AHB RX Buffer allocation. - */ -#define FLEXSPI_AHBRXBUFCR0_MSTRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT)) & FLEXSPI_AHBRXBUFCR0_MSTRID_MASK) - -#define FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK (0x3000000U) -#define FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT (24U) -/*! PRIORITY - This priority for AHB Master Read which this AHB RX Buffer is assigned. Refer for more details. - */ -#define FLEXSPI_AHBRXBUFCR0_PRIORITY(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK) - -#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK (0x80000000U) -#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT (31U) -/*! PREFETCHEN - AHB Read Prefetch Enable for current AHB RX Buffer corresponding Master. - */ -#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK) -/*! @} */ - -/* The count of FLEXSPI_AHBRXBUFCR0 */ -#define FLEXSPI_AHBRXBUFCR0_COUNT (4U) - -/*! @name FLSHCR0 - Flash A1 Control Register 0..Flash B2 Control Register 0 */ -/*! @{ */ - -#define FLEXSPI_FLSHCR0_FLSHSZ_MASK (0x7FFFFFU) -#define FLEXSPI_FLSHCR0_FLSHSZ_SHIFT (0U) -/*! FLSHSZ - Flash Size in KByte. - */ -#define FLEXSPI_FLSHCR0_FLSHSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_FLSHSZ_SHIFT)) & FLEXSPI_FLSHCR0_FLSHSZ_MASK) -/*! @} */ - -/* The count of FLEXSPI_FLSHCR0 */ -#define FLEXSPI_FLSHCR0_COUNT (4U) - -/*! @name FLSHCR1 - Flash A1 Control Register 1..Flash B2 Control Register 1 */ -/*! @{ */ - -#define FLEXSPI_FLSHCR1_TCSS_MASK (0x1FU) -#define FLEXSPI_FLSHCR1_TCSS_SHIFT (0U) -/*! TCSS - Serial Flash CS setup time. - */ -#define FLEXSPI_FLSHCR1_TCSS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSS_SHIFT)) & FLEXSPI_FLSHCR1_TCSS_MASK) - -#define FLEXSPI_FLSHCR1_TCSH_MASK (0x3E0U) -#define FLEXSPI_FLSHCR1_TCSH_SHIFT (5U) -/*! TCSH - Serial Flash CS Hold time. - */ -#define FLEXSPI_FLSHCR1_TCSH(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSH_SHIFT)) & FLEXSPI_FLSHCR1_TCSH_MASK) - -#define FLEXSPI_FLSHCR1_WA_MASK (0x400U) -#define FLEXSPI_FLSHCR1_WA_SHIFT (10U) -/*! WA - Word Addressable. - */ -#define FLEXSPI_FLSHCR1_WA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_WA_SHIFT)) & FLEXSPI_FLSHCR1_WA_MASK) - -#define FLEXSPI_FLSHCR1_CAS_MASK (0x7800U) -#define FLEXSPI_FLSHCR1_CAS_SHIFT (11U) -/*! CAS - Column Address Size. - */ -#define FLEXSPI_FLSHCR1_CAS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CAS_SHIFT)) & FLEXSPI_FLSHCR1_CAS_MASK) - -#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK (0x8000U) -#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT (15U) -/*! CSINTERVALUNIT - CS interval unit - * 0b0..The CS interval unit is 1 serial clock cycle - * 0b1..The CS interval unit is 256 serial clock cycle - */ -#define FLEXSPI_FLSHCR1_CSINTERVALUNIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK) - -#define FLEXSPI_FLSHCR1_CSINTERVAL_MASK (0xFFFF0000U) -#define FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT (16U) -/*! CSINTERVAL - This field is used to set the minimum interval between flash device Chip selection - * deassertion and flash device Chip selection assertion. If external flash has a limitation on - * the interval between command sequences, this field should be set accordingly. If there is no - * limitation, set this field with value 0x0. - */ -#define FLEXSPI_FLSHCR1_CSINTERVAL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVAL_MASK) -/*! @} */ - -/* The count of FLEXSPI_FLSHCR1 */ -#define FLEXSPI_FLSHCR1_COUNT (4U) - -/*! @name FLSHCR2 - Flash A1 Control Register 2..Flash B2 Control Register 2 */ -/*! @{ */ - -#define FLEXSPI_FLSHCR2_ARDSEQID_MASK (0xFU) -#define FLEXSPI_FLSHCR2_ARDSEQID_SHIFT (0U) -/*! ARDSEQID - Sequence Index for AHB Read triggered Command in LUT. - */ -#define FLEXSPI_FLSHCR2_ARDSEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQID_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQID_MASK) - -#define FLEXSPI_FLSHCR2_ARDSEQNUM_MASK (0xE0U) -#define FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT (5U) -/*! ARDSEQNUM - Sequence Number for AHB Read triggered Command in LUT. - */ -#define FLEXSPI_FLSHCR2_ARDSEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQNUM_MASK) - -#define FLEXSPI_FLSHCR2_AWRSEQID_MASK (0xF00U) -#define FLEXSPI_FLSHCR2_AWRSEQID_SHIFT (8U) -/*! AWRSEQID - Sequence Index for AHB Write triggered Command. - */ -#define FLEXSPI_FLSHCR2_AWRSEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQID_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQID_MASK) - -#define FLEXSPI_FLSHCR2_AWRSEQNUM_MASK (0xE000U) -#define FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT (13U) -/*! AWRSEQNUM - Sequence Number for AHB Write triggered Command. - */ -#define FLEXSPI_FLSHCR2_AWRSEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQNUM_MASK) - -#define FLEXSPI_FLSHCR2_AWRWAIT_MASK (0xFFF0000U) -#define FLEXSPI_FLSHCR2_AWRWAIT_SHIFT (16U) -#define FLEXSPI_FLSHCR2_AWRWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAIT_MASK) - -#define FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK (0x70000000U) -#define FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT (28U) -/*! AWRWAITUNIT - AWRWAIT unit - * 0b000..The AWRWAIT unit is 2 ahb clock cycle - * 0b001..The AWRWAIT unit is 8 ahb clock cycle - * 0b010..The AWRWAIT unit is 32 ahb clock cycle - * 0b011..The AWRWAIT unit is 128 ahb clock cycle - * 0b100..The AWRWAIT unit is 512 ahb clock cycle - * 0b101..The AWRWAIT unit is 2048 ahb clock cycle - * 0b110..The AWRWAIT unit is 8192 ahb clock cycle - * 0b111..The AWRWAIT unit is 32768 ahb clock cycle - */ -#define FLEXSPI_FLSHCR2_AWRWAITUNIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK) - -#define FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK (0x80000000U) -#define FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT (31U) -/*! CLRINSTRPTR - Clear the instruction pointer which is internally saved pointer by JMP_ON_CS. - * Refer Programmable Sequence Engine for details. - */ -#define FLEXSPI_FLSHCR2_CLRINSTRPTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT)) & FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK) -/*! @} */ - -/* The count of FLEXSPI_FLSHCR2 */ -#define FLEXSPI_FLSHCR2_COUNT (4U) - -/*! @name FLSHCR4 - Flash Control Register 4 */ -/*! @{ */ - -#define FLEXSPI_FLSHCR4_WMOPT1_MASK (0x1U) -#define FLEXSPI_FLSHCR4_WMOPT1_SHIFT (0U) -/*! WMOPT1 - Write mask option bit 1. This option bit could be used to remove AHB write burst start address alignment limitation. - * 0b0..DQS pin will be used as Write Mask when writing to external device. There is no limitation on AHB write - * burst start address alignment when flash is accessed in individual mode. - * 0b1..DQS pin will not be used as Write Mask when writing to external device. There is limitation on AHB write - * burst start address alignment when flash is accessed in individual mode. - */ -#define FLEXSPI_FLSHCR4_WMOPT1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMOPT1_SHIFT)) & FLEXSPI_FLSHCR4_WMOPT1_MASK) - -#define FLEXSPI_FLSHCR4_WMENA_MASK (0x4U) -#define FLEXSPI_FLSHCR4_WMENA_SHIFT (2U) -/*! WMENA - Write mask enable bit for flash device on port A. When write mask function is needed for - * memory device on port A, this bit must be set. - * 0b0..Write mask is disabled, DQS(RWDS) pin will be un-driven when writing to external device. - * 0b1..Write mask is enabled, DQS(RWDS) pin will be driven by FlexSPI as write mask output when writing to external device. - */ -#define FLEXSPI_FLSHCR4_WMENA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENA_SHIFT)) & FLEXSPI_FLSHCR4_WMENA_MASK) - -#define FLEXSPI_FLSHCR4_WMENB_MASK (0x8U) -#define FLEXSPI_FLSHCR4_WMENB_SHIFT (3U) -/*! WMENB - Write mask enable bit for flash device on port B. When write mask function is needed for - * memory device on port B, this bit must be set. - * 0b0..Write mask is disabled, DQS(RWDS) pin will be un-driven when writing to external device. - * 0b1..Write mask is enabled, DQS(RWDS) pin will be driven by FlexSPI as write mask output when writing to external device. - */ -#define FLEXSPI_FLSHCR4_WMENB(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENB_SHIFT)) & FLEXSPI_FLSHCR4_WMENB_MASK) -/*! @} */ - -/*! @name IPCR0 - IP Control Register 0 */ -/*! @{ */ - -#define FLEXSPI_IPCR0_SFAR_MASK (0xFFFFFFFFU) -#define FLEXSPI_IPCR0_SFAR_SHIFT (0U) -/*! SFAR - Serial Flash Address for IP command. - */ -#define FLEXSPI_IPCR0_SFAR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR0_SFAR_SHIFT)) & FLEXSPI_IPCR0_SFAR_MASK) -/*! @} */ - -/*! @name IPCR1 - IP Control Register 1 */ -/*! @{ */ - -#define FLEXSPI_IPCR1_IDATSZ_MASK (0xFFFFU) -#define FLEXSPI_IPCR1_IDATSZ_SHIFT (0U) -/*! IDATSZ - Flash Read/Program Data Size (in Bytes) for IP command. - */ -#define FLEXSPI_IPCR1_IDATSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_IDATSZ_SHIFT)) & FLEXSPI_IPCR1_IDATSZ_MASK) - -#define FLEXSPI_IPCR1_ISEQID_MASK (0xF0000U) -#define FLEXSPI_IPCR1_ISEQID_SHIFT (16U) -/*! ISEQID - Sequence Index in LUT for IP command. - */ -#define FLEXSPI_IPCR1_ISEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQID_SHIFT)) & FLEXSPI_IPCR1_ISEQID_MASK) - -#define FLEXSPI_IPCR1_ISEQNUM_MASK (0x7000000U) -#define FLEXSPI_IPCR1_ISEQNUM_SHIFT (24U) -/*! ISEQNUM - Sequence Number for IP command: ISEQNUM+1. - */ -#define FLEXSPI_IPCR1_ISEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQNUM_SHIFT)) & FLEXSPI_IPCR1_ISEQNUM_MASK) - -#define FLEXSPI_IPCR1_IPAREN_MASK (0x80000000U) -#define FLEXSPI_IPCR1_IPAREN_SHIFT (31U) -/*! IPAREN - Parallel mode Enabled for IP command. - * 0b0..Flash will be accessed in Individual mode. - * 0b1..Flash will be accessed in Parallel mode. - */ -#define FLEXSPI_IPCR1_IPAREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_IPAREN_SHIFT)) & FLEXSPI_IPCR1_IPAREN_MASK) -/*! @} */ - -/*! @name IPCMD - IP Command Register */ -/*! @{ */ - -#define FLEXSPI_IPCMD_TRG_MASK (0x1U) -#define FLEXSPI_IPCMD_TRG_SHIFT (0U) -/*! TRG - Setting this bit will trigger an IP Command. - */ -#define FLEXSPI_IPCMD_TRG(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCMD_TRG_SHIFT)) & FLEXSPI_IPCMD_TRG_MASK) -/*! @} */ - -/*! @name IPRXFCR - IP RX FIFO Control Register */ -/*! @{ */ - -#define FLEXSPI_IPRXFCR_CLRIPRXF_MASK (0x1U) -#define FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT (0U) -/*! CLRIPRXF - Clear all valid data entries in IP RX FIFO. - */ -#define FLEXSPI_IPRXFCR_CLRIPRXF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT)) & FLEXSPI_IPRXFCR_CLRIPRXF_MASK) - -#define FLEXSPI_IPRXFCR_RXDMAEN_MASK (0x2U) -#define FLEXSPI_IPRXFCR_RXDMAEN_SHIFT (1U) -/*! RXDMAEN - IP RX FIFO reading by DMA enabled. - * 0b0..IP RX FIFO would be read by processor. - * 0b1..IP RX FIFO would be read by DMA. - */ -#define FLEXSPI_IPRXFCR_RXDMAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXDMAEN_SHIFT)) & FLEXSPI_IPRXFCR_RXDMAEN_MASK) - -#define FLEXSPI_IPRXFCR_RXWMRK_MASK (0x3CU) -#define FLEXSPI_IPRXFCR_RXWMRK_SHIFT (2U) -/*! RXWMRK - Watermark level is (RXWMRK+1)*64 Bits. - */ -#define FLEXSPI_IPRXFCR_RXWMRK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXWMRK_SHIFT)) & FLEXSPI_IPRXFCR_RXWMRK_MASK) -/*! @} */ - -/*! @name IPTXFCR - IP TX FIFO Control Register */ -/*! @{ */ - -#define FLEXSPI_IPTXFCR_CLRIPTXF_MASK (0x1U) -#define FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT (0U) -/*! CLRIPTXF - Clear all valid data entries in IP TX FIFO. - */ -#define FLEXSPI_IPTXFCR_CLRIPTXF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT)) & FLEXSPI_IPTXFCR_CLRIPTXF_MASK) - -#define FLEXSPI_IPTXFCR_TXDMAEN_MASK (0x2U) -#define FLEXSPI_IPTXFCR_TXDMAEN_SHIFT (1U) -/*! TXDMAEN - IP TX FIFO filling by DMA enabled. - * 0b0..IP TX FIFO would be filled by processor. - * 0b1..IP TX FIFO would be filled by DMA. - */ -#define FLEXSPI_IPTXFCR_TXDMAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXDMAEN_SHIFT)) & FLEXSPI_IPTXFCR_TXDMAEN_MASK) - -#define FLEXSPI_IPTXFCR_TXWMRK_MASK (0x3CU) -#define FLEXSPI_IPTXFCR_TXWMRK_SHIFT (2U) -/*! TXWMRK - Watermark level is (TXWMRK+1)*64 Bits. - */ -#define FLEXSPI_IPTXFCR_TXWMRK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXWMRK_SHIFT)) & FLEXSPI_IPTXFCR_TXWMRK_MASK) -/*! @} */ - -/*! @name DLLCR - DLL Control Register 0 */ -/*! @{ */ - -#define FLEXSPI_DLLCR_DLLEN_MASK (0x1U) -#define FLEXSPI_DLLCR_DLLEN_SHIFT (0U) -/*! DLLEN - DLL calibration enable. - */ -#define FLEXSPI_DLLCR_DLLEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLEN_SHIFT)) & FLEXSPI_DLLCR_DLLEN_MASK) - -#define FLEXSPI_DLLCR_DLLRESET_MASK (0x2U) -#define FLEXSPI_DLLCR_DLLRESET_SHIFT (1U) -/*! DLLRESET - Software could force a reset on DLL by setting this field to 0x1. This will cause the - * DLL to lose lock and re-calibrate to detect an ref_clock half period phase shift. The reset - * action is edge triggered, so software need to clear this bit after set this bit (no delay - * limitation). - */ -#define FLEXSPI_DLLCR_DLLRESET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLRESET_SHIFT)) & FLEXSPI_DLLCR_DLLRESET_MASK) - -#define FLEXSPI_DLLCR_SLVDLYTARGET_MASK (0x78U) -#define FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT (3U) -/*! SLVDLYTARGET - The delay target for slave delay line is: ((SLVDLYTARGET+1) * 1/32 * clock cycle of reference clock (serial clock). - */ -#define FLEXSPI_DLLCR_SLVDLYTARGET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT)) & FLEXSPI_DLLCR_SLVDLYTARGET_MASK) - -#define FLEXSPI_DLLCR_OVRDEN_MASK (0x100U) -#define FLEXSPI_DLLCR_OVRDEN_SHIFT (8U) -/*! OVRDEN - Slave clock delay line delay cell number selection override enable. - */ -#define FLEXSPI_DLLCR_OVRDEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDEN_SHIFT)) & FLEXSPI_DLLCR_OVRDEN_MASK) - -#define FLEXSPI_DLLCR_OVRDVAL_MASK (0x7E00U) -#define FLEXSPI_DLLCR_OVRDVAL_SHIFT (9U) -/*! OVRDVAL - Slave clock delay line delay cell number selection override value. - */ -#define FLEXSPI_DLLCR_OVRDVAL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDVAL_SHIFT)) & FLEXSPI_DLLCR_OVRDVAL_MASK) -/*! @} */ - -/* The count of FLEXSPI_DLLCR */ -#define FLEXSPI_DLLCR_COUNT (2U) - -/*! @name STS0 - Status Register 0 */ -/*! @{ */ - -#define FLEXSPI_STS0_SEQIDLE_MASK (0x1U) -#define FLEXSPI_STS0_SEQIDLE_SHIFT (0U) -/*! SEQIDLE - This status bit indicates the state machine in SEQ_CTL is idle and there is command - * sequence executing on FlexSPI interface. - */ -#define FLEXSPI_STS0_SEQIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_SEQIDLE_SHIFT)) & FLEXSPI_STS0_SEQIDLE_MASK) - -#define FLEXSPI_STS0_ARBIDLE_MASK (0x2U) -#define FLEXSPI_STS0_ARBIDLE_SHIFT (1U) -/*! ARBIDLE - This status bit indicates the state machine in ARB_CTL is busy and there is command - * sequence granted by arbitrator and not finished yet on FlexSPI interface. When ARB_CTL state - * (ARBIDLE=0x1) is idle, there will be no transaction on FlexSPI interface also (SEQIDLE=0x1). So - * this bit should be polled to wait for FlexSPI controller become idle instead of SEQIDLE. - */ -#define FLEXSPI_STS0_ARBIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBIDLE_SHIFT)) & FLEXSPI_STS0_ARBIDLE_MASK) - -#define FLEXSPI_STS0_ARBCMDSRC_MASK (0xCU) -#define FLEXSPI_STS0_ARBCMDSRC_SHIFT (2U) -/*! ARBCMDSRC - This status field indicates the trigger source of current command sequence granted - * by arbitrator. This field value is meaningless when ARB_CTL is not busy (STS0[ARBIDLE]=0x1). - * 0b00..Triggered by AHB read command (triggered by AHB read). - * 0b01..Triggered by AHB write command (triggered by AHB Write). - * 0b10..Triggered by IP command (triggered by setting register bit IPCMD.TRG). - * 0b11..Triggered by suspended command (resumed). - */ -#define FLEXSPI_STS0_ARBCMDSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBCMDSRC_SHIFT)) & FLEXSPI_STS0_ARBCMDSRC_MASK) -/*! @} */ - -/*! @name STS1 - Status Register 1 */ -/*! @{ */ - -#define FLEXSPI_STS1_AHBCMDERRID_MASK (0xFU) -#define FLEXSPI_STS1_AHBCMDERRID_SHIFT (0U) -/*! AHBCMDERRID - Indicates the sequence index when an AHB command error is detected. This field - * will be cleared when INTR[AHBCMDERR] is write-1-clear(w1c). - */ -#define FLEXSPI_STS1_AHBCMDERRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRID_SHIFT)) & FLEXSPI_STS1_AHBCMDERRID_MASK) - -#define FLEXSPI_STS1_AHBCMDERRCODE_MASK (0xF00U) -#define FLEXSPI_STS1_AHBCMDERRCODE_SHIFT (8U) -/*! AHBCMDERRCODE - Indicates the Error Code when AHB command Error detected. This field will be - * cleared when INTR[AHBCMDERR] is write-1-clear(w1c). - * 0b0000..No error. - * 0b0010..AHB Write command with JMP_ON_CS instruction used in the sequence. - * 0b0011..There is unknown instruction opcode in the sequence. - * 0b0100..Instruction DUMMY_SDR/DUMMY_RWDS_SDR used in DDR sequence. - * 0b0101..Instruction DUMMY_DDR/DUMMY_RWDS_DDR used in SDR sequence. - * 0b1110..Sequence execution timeout. - */ -#define FLEXSPI_STS1_AHBCMDERRCODE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRCODE_SHIFT)) & FLEXSPI_STS1_AHBCMDERRCODE_MASK) - -#define FLEXSPI_STS1_IPCMDERRID_MASK (0xF0000U) -#define FLEXSPI_STS1_IPCMDERRID_SHIFT (16U) -/*! IPCMDERRID - Indicates the sequence Index when IP command error detected. This field will be - * cleared when INTR[IPCMDERR] is write-1-clear(w1c). - */ -#define FLEXSPI_STS1_IPCMDERRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRID_SHIFT)) & FLEXSPI_STS1_IPCMDERRID_MASK) - -#define FLEXSPI_STS1_IPCMDERRCODE_MASK (0xF000000U) -#define FLEXSPI_STS1_IPCMDERRCODE_SHIFT (24U) -/*! IPCMDERRCODE - Indicates the Error Code when IP command Error detected. This field will be - * cleared when INTR[IPCMDERR] is write-1-clear(w1c). - * 0b0000..No error. - * 0b0010..IP command with JMP_ON_CS instruction used in the sequence. - * 0b0011..There is unknown instruction opcode in the sequence. - * 0b0100..Instruction DUMMY_SDR/DUMMY_RWDS_SDR used in DDR sequence. - * 0b0101..Instruction DUMMY_DDR/DUMMY_RWDS_DDR used in SDR sequence. - * 0b0110..Flash access start address exceed the whole flash address range (A1/A2/B1/B2). - * 0b1110..Sequence execution timeout. - * 0b1111..Flash boundary crossed. - */ -#define FLEXSPI_STS1_IPCMDERRCODE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRCODE_SHIFT)) & FLEXSPI_STS1_IPCMDERRCODE_MASK) -/*! @} */ - -/*! @name STS2 - Status Register 2 */ -/*! @{ */ - -#define FLEXSPI_STS2_ASLVLOCK_MASK (0x1U) -#define FLEXSPI_STS2_ASLVLOCK_SHIFT (0U) -/*! ASLVLOCK - Flash A sample clock slave delay line locked. - */ -#define FLEXSPI_STS2_ASLVLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVLOCK_SHIFT)) & FLEXSPI_STS2_ASLVLOCK_MASK) - -#define FLEXSPI_STS2_AREFLOCK_MASK (0x2U) -#define FLEXSPI_STS2_AREFLOCK_SHIFT (1U) -/*! AREFLOCK - Flash A sample clock reference delay line locked. - */ -#define FLEXSPI_STS2_AREFLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFLOCK_SHIFT)) & FLEXSPI_STS2_AREFLOCK_MASK) - -#define FLEXSPI_STS2_ASLVSEL_MASK (0xFCU) -#define FLEXSPI_STS2_ASLVSEL_SHIFT (2U) -/*! ASLVSEL - Flash A sample clock slave delay line delay cell number selection . - */ -#define FLEXSPI_STS2_ASLVSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVSEL_SHIFT)) & FLEXSPI_STS2_ASLVSEL_MASK) - -#define FLEXSPI_STS2_AREFSEL_MASK (0x3F00U) -#define FLEXSPI_STS2_AREFSEL_SHIFT (8U) -/*! AREFSEL - Flash A sample clock reference delay line delay cell number selection. - */ -#define FLEXSPI_STS2_AREFSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFSEL_SHIFT)) & FLEXSPI_STS2_AREFSEL_MASK) - -#define FLEXSPI_STS2_BSLVLOCK_MASK (0x10000U) -#define FLEXSPI_STS2_BSLVLOCK_SHIFT (16U) -/*! BSLVLOCK - Flash B sample clock slave delay line locked. - */ -#define FLEXSPI_STS2_BSLVLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVLOCK_SHIFT)) & FLEXSPI_STS2_BSLVLOCK_MASK) - -#define FLEXSPI_STS2_BREFLOCK_MASK (0x20000U) -#define FLEXSPI_STS2_BREFLOCK_SHIFT (17U) -/*! BREFLOCK - Flash B sample clock reference delay line locked. - */ -#define FLEXSPI_STS2_BREFLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFLOCK_SHIFT)) & FLEXSPI_STS2_BREFLOCK_MASK) - -#define FLEXSPI_STS2_BSLVSEL_MASK (0xFC0000U) -#define FLEXSPI_STS2_BSLVSEL_SHIFT (18U) -/*! BSLVSEL - Flash B sample clock slave delay line delay cell number selection. - */ -#define FLEXSPI_STS2_BSLVSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVSEL_SHIFT)) & FLEXSPI_STS2_BSLVSEL_MASK) - -#define FLEXSPI_STS2_BREFSEL_MASK (0x3F000000U) -#define FLEXSPI_STS2_BREFSEL_SHIFT (24U) -/*! BREFSEL - Flash B sample clock reference delay line delay cell number selection. - */ -#define FLEXSPI_STS2_BREFSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFSEL_SHIFT)) & FLEXSPI_STS2_BREFSEL_MASK) -/*! @} */ - -/*! @name AHBSPNDSTS - AHB Suspend Status Register */ -/*! @{ */ - -#define FLEXSPI_AHBSPNDSTS_ACTIVE_MASK (0x1U) -#define FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT (0U) -/*! ACTIVE - Indicates if an AHB read prefetch command sequence has been suspended. - */ -#define FLEXSPI_AHBSPNDSTS_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT)) & FLEXSPI_AHBSPNDSTS_ACTIVE_MASK) - -#define FLEXSPI_AHBSPNDSTS_BUFID_MASK (0xEU) -#define FLEXSPI_AHBSPNDSTS_BUFID_SHIFT (1U) -/*! BUFID - AHB RX BUF ID for suspended command sequence. - */ -#define FLEXSPI_AHBSPNDSTS_BUFID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_BUFID_SHIFT)) & FLEXSPI_AHBSPNDSTS_BUFID_MASK) - -#define FLEXSPI_AHBSPNDSTS_DATLFT_MASK (0xFFFF0000U) -#define FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT (16U) -/*! DATLFT - Left Data size for suspended command sequence (in byte). - */ -#define FLEXSPI_AHBSPNDSTS_DATLFT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT)) & FLEXSPI_AHBSPNDSTS_DATLFT_MASK) -/*! @} */ - -/*! @name IPRXFSTS - IP RX FIFO Status Register */ -/*! @{ */ - -#define FLEXSPI_IPRXFSTS_FILL_MASK (0xFFU) -#define FLEXSPI_IPRXFSTS_FILL_SHIFT (0U) -/*! FILL - Fill level of IP RX FIFO. - */ -#define FLEXSPI_IPRXFSTS_FILL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_FILL_SHIFT)) & FLEXSPI_IPRXFSTS_FILL_MASK) - -#define FLEXSPI_IPRXFSTS_RDCNTR_MASK (0xFFFF0000U) -#define FLEXSPI_IPRXFSTS_RDCNTR_SHIFT (16U) -/*! RDCNTR - Total Read Data Counter: RDCNTR * 64 Bits. - */ -#define FLEXSPI_IPRXFSTS_RDCNTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_RDCNTR_SHIFT)) & FLEXSPI_IPRXFSTS_RDCNTR_MASK) -/*! @} */ - -/*! @name IPTXFSTS - IP TX FIFO Status Register */ -/*! @{ */ - -#define FLEXSPI_IPTXFSTS_FILL_MASK (0xFFU) -#define FLEXSPI_IPTXFSTS_FILL_SHIFT (0U) -/*! FILL - Fill level of IP TX FIFO. - */ -#define FLEXSPI_IPTXFSTS_FILL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_FILL_SHIFT)) & FLEXSPI_IPTXFSTS_FILL_MASK) - -#define FLEXSPI_IPTXFSTS_WRCNTR_MASK (0xFFFF0000U) -#define FLEXSPI_IPTXFSTS_WRCNTR_SHIFT (16U) -/*! WRCNTR - Total Write Data Counter: WRCNTR * 64 Bits. - */ -#define FLEXSPI_IPTXFSTS_WRCNTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_WRCNTR_SHIFT)) & FLEXSPI_IPTXFSTS_WRCNTR_MASK) -/*! @} */ - -/*! @name RFDR - IP RX FIFO Data Register 0..IP RX FIFO Data Register 31 */ -/*! @{ */ - -#define FLEXSPI_RFDR_RXDATA_MASK (0xFFFFFFFFU) -#define FLEXSPI_RFDR_RXDATA_SHIFT (0U) -/*! RXDATA - RX Data - */ -#define FLEXSPI_RFDR_RXDATA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_RFDR_RXDATA_SHIFT)) & FLEXSPI_RFDR_RXDATA_MASK) -/*! @} */ - -/* The count of FLEXSPI_RFDR */ -#define FLEXSPI_RFDR_COUNT (32U) - -/*! @name TFDR - IP TX FIFO Data Register 0..IP TX FIFO Data Register 31 */ -/*! @{ */ - -#define FLEXSPI_TFDR_TXDATA_MASK (0xFFFFFFFFU) -#define FLEXSPI_TFDR_TXDATA_SHIFT (0U) -/*! TXDATA - TX Data - */ -#define FLEXSPI_TFDR_TXDATA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_TFDR_TXDATA_SHIFT)) & FLEXSPI_TFDR_TXDATA_MASK) -/*! @} */ - -/* The count of FLEXSPI_TFDR */ -#define FLEXSPI_TFDR_COUNT (32U) - -/*! @name LUT - LUT 0..LUT 63 */ -/*! @{ */ - -#define FLEXSPI_LUT_OPERAND0_MASK (0xFFU) -#define FLEXSPI_LUT_OPERAND0_SHIFT (0U) -/*! OPERAND0 - OPERAND0 - */ -#define FLEXSPI_LUT_OPERAND0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND0_SHIFT)) & FLEXSPI_LUT_OPERAND0_MASK) - -#define FLEXSPI_LUT_NUM_PADS0_MASK (0x300U) -#define FLEXSPI_LUT_NUM_PADS0_SHIFT (8U) -/*! NUM_PADS0 - NUM_PADS0 - */ -#define FLEXSPI_LUT_NUM_PADS0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS0_SHIFT)) & FLEXSPI_LUT_NUM_PADS0_MASK) - -#define FLEXSPI_LUT_OPCODE0_MASK (0xFC00U) -#define FLEXSPI_LUT_OPCODE0_SHIFT (10U) -/*! OPCODE0 - OPCODE - */ -#define FLEXSPI_LUT_OPCODE0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE0_SHIFT)) & FLEXSPI_LUT_OPCODE0_MASK) - -#define FLEXSPI_LUT_OPERAND1_MASK (0xFF0000U) -#define FLEXSPI_LUT_OPERAND1_SHIFT (16U) -/*! OPERAND1 - OPERAND1 - */ -#define FLEXSPI_LUT_OPERAND1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND1_SHIFT)) & FLEXSPI_LUT_OPERAND1_MASK) - -#define FLEXSPI_LUT_NUM_PADS1_MASK (0x3000000U) -#define FLEXSPI_LUT_NUM_PADS1_SHIFT (24U) -/*! NUM_PADS1 - NUM_PADS1 - */ -#define FLEXSPI_LUT_NUM_PADS1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS1_SHIFT)) & FLEXSPI_LUT_NUM_PADS1_MASK) - -#define FLEXSPI_LUT_OPCODE1_MASK (0xFC000000U) -#define FLEXSPI_LUT_OPCODE1_SHIFT (26U) -/*! OPCODE1 - OPCODE1 - */ -#define FLEXSPI_LUT_OPCODE1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE1_SHIFT)) & FLEXSPI_LUT_OPCODE1_MASK) -/*! @} */ - -/* The count of FLEXSPI_LUT */ -#define FLEXSPI_LUT_COUNT (64U) - - -/*! - * @} - */ /* end of group FLEXSPI_Register_Masks */ - - -/* FLEXSPI - Peripheral instance base addresses */ -/** Peripheral FLEXSPI base address */ -#define FLEXSPI_BASE (0x402A8000u) -/** Peripheral FLEXSPI base pointer */ -#define FLEXSPI ((FLEXSPI_Type *)FLEXSPI_BASE) -/** Array initializer of FLEXSPI peripheral base addresses */ -#define FLEXSPI_BASE_ADDRS { FLEXSPI_BASE } -/** Array initializer of FLEXSPI peripheral base pointers */ -#define FLEXSPI_BASE_PTRS { FLEXSPI } -/** Interrupt vectors for the FLEXSPI peripheral type */ -#define FLEXSPI_IRQS { FLEXSPI_IRQn } -/* FlexSPI AMBA address. */ -#define FlexSPI_AMBA_BASE (0x60000000U) -/* FlexSPI ASFM address. */ -#define FlexSPI_ASFM_BASE (0x00000000U) -/* Base Address of AHB address space mapped to IP RX FIFO. */ -#define FlexSPI_ARDF_BASE (0x7FC00000U) -/* Base Address of AHB address space mapped to IP TX FIFO. */ -#define FlexSPI_ATDF_BASE (0x7F800000U) - - -/*! - * @} - */ /* end of group FLEXSPI_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- GPC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPC_Peripheral_Access_Layer GPC Peripheral Access Layer - * @{ - */ - -/** GPC - Register Layout Typedef */ -typedef struct { - __IO uint32_t CNTR; /**< GPC Interface control register, offset: 0x0 */ - uint8_t RESERVED_0[4]; - __IO uint32_t IMR[4]; /**< IRQ masking register 1..IRQ masking register 4, array offset: 0x8, array step: 0x4 */ - __I uint32_t ISR[4]; /**< IRQ status resister 1..IRQ status resister 4, array offset: 0x18, array step: 0x4 */ - uint8_t RESERVED_1[12]; - __IO uint32_t IMR5; /**< IRQ masking register 5, offset: 0x34 */ - __I uint32_t ISR5; /**< IRQ status resister 5, offset: 0x38 */ -} GPC_Type; - -/* ---------------------------------------------------------------------------- - -- GPC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPC_Register_Masks GPC Register Masks - * @{ - */ - -/*! @name CNTR - GPC Interface control register */ -/*! @{ */ - -#define GPC_CNTR_MEGA_PDN_REQ_MASK (0x4U) -#define GPC_CNTR_MEGA_PDN_REQ_SHIFT (2U) -/*! MEGA_PDN_REQ - * 0b0..No Request - * 0b1..Request power down sequence - */ -#define GPC_CNTR_MEGA_PDN_REQ(x) (((uint32_t)(((uint32_t)(x)) << GPC_CNTR_MEGA_PDN_REQ_SHIFT)) & GPC_CNTR_MEGA_PDN_REQ_MASK) - -#define GPC_CNTR_MEGA_PUP_REQ_MASK (0x8U) -#define GPC_CNTR_MEGA_PUP_REQ_SHIFT (3U) -/*! MEGA_PUP_REQ - * 0b0..No Request - * 0b1..Request power up sequence - */ -#define GPC_CNTR_MEGA_PUP_REQ(x) (((uint32_t)(((uint32_t)(x)) << GPC_CNTR_MEGA_PUP_REQ_SHIFT)) & GPC_CNTR_MEGA_PUP_REQ_MASK) - -#define GPC_CNTR_PDRAM0_PGE_MASK (0x400000U) -#define GPC_CNTR_PDRAM0_PGE_SHIFT (22U) -/*! PDRAM0_PGE - * 0b1..FlexRAM PDRAM0 domain (bank1-7) will be power down once when CPU core is power down. - * 0b0..FlexRAM PDRAM0 domain (bank1-7) will keep power on even if CPU core is power down. - */ -#define GPC_CNTR_PDRAM0_PGE(x) (((uint32_t)(((uint32_t)(x)) << GPC_CNTR_PDRAM0_PGE_SHIFT)) & GPC_CNTR_PDRAM0_PGE_MASK) -/*! @} */ - -/*! @name IMR - IRQ masking register 1..IRQ masking register 4 */ -/*! @{ */ - -#define GPC_IMR_IMR1_MASK (0xFFFFFFFFU) -#define GPC_IMR_IMR1_SHIFT (0U) -#define GPC_IMR_IMR1(x) (((uint32_t)(((uint32_t)(x)) << GPC_IMR_IMR1_SHIFT)) & GPC_IMR_IMR1_MASK) - -#define GPC_IMR_IMR2_MASK (0xFFFFFFFFU) -#define GPC_IMR_IMR2_SHIFT (0U) -#define GPC_IMR_IMR2(x) (((uint32_t)(((uint32_t)(x)) << GPC_IMR_IMR2_SHIFT)) & GPC_IMR_IMR2_MASK) - -#define GPC_IMR_IMR3_MASK (0xFFFFFFFFU) -#define GPC_IMR_IMR3_SHIFT (0U) -#define GPC_IMR_IMR3(x) (((uint32_t)(((uint32_t)(x)) << GPC_IMR_IMR3_SHIFT)) & GPC_IMR_IMR3_MASK) - -#define GPC_IMR_IMR4_MASK (0xFFFFFFFFU) -#define GPC_IMR_IMR4_SHIFT (0U) -#define GPC_IMR_IMR4(x) (((uint32_t)(((uint32_t)(x)) << GPC_IMR_IMR4_SHIFT)) & GPC_IMR_IMR4_MASK) -/*! @} */ - -/* The count of GPC_IMR */ -#define GPC_IMR_COUNT (4U) - -/*! @name ISR - IRQ status resister 1..IRQ status resister 4 */ -/*! @{ */ - -#define GPC_ISR_ISR1_MASK (0xFFFFFFFFU) -#define GPC_ISR_ISR1_SHIFT (0U) -#define GPC_ISR_ISR1(x) (((uint32_t)(((uint32_t)(x)) << GPC_ISR_ISR1_SHIFT)) & GPC_ISR_ISR1_MASK) - -#define GPC_ISR_ISR2_MASK (0xFFFFFFFFU) -#define GPC_ISR_ISR2_SHIFT (0U) -#define GPC_ISR_ISR2(x) (((uint32_t)(((uint32_t)(x)) << GPC_ISR_ISR2_SHIFT)) & GPC_ISR_ISR2_MASK) - -#define GPC_ISR_ISR3_MASK (0xFFFFFFFFU) -#define GPC_ISR_ISR3_SHIFT (0U) -#define GPC_ISR_ISR3(x) (((uint32_t)(((uint32_t)(x)) << GPC_ISR_ISR3_SHIFT)) & GPC_ISR_ISR3_MASK) - -#define GPC_ISR_ISR4_MASK (0xFFFFFFFFU) -#define GPC_ISR_ISR4_SHIFT (0U) -#define GPC_ISR_ISR4(x) (((uint32_t)(((uint32_t)(x)) << GPC_ISR_ISR4_SHIFT)) & GPC_ISR_ISR4_MASK) -/*! @} */ - -/* The count of GPC_ISR */ -#define GPC_ISR_COUNT (4U) - -/*! @name IMR5 - IRQ masking register 5 */ -/*! @{ */ - -#define GPC_IMR5_IMR5_MASK (0xFFFFFFFFU) -#define GPC_IMR5_IMR5_SHIFT (0U) -#define GPC_IMR5_IMR5(x) (((uint32_t)(((uint32_t)(x)) << GPC_IMR5_IMR5_SHIFT)) & GPC_IMR5_IMR5_MASK) -/*! @} */ - -/*! @name ISR5 - IRQ status resister 5 */ -/*! @{ */ - -#define GPC_ISR5_ISR4_MASK (0xFFFFFFFFU) -#define GPC_ISR5_ISR4_SHIFT (0U) -#define GPC_ISR5_ISR4(x) (((uint32_t)(((uint32_t)(x)) << GPC_ISR5_ISR4_SHIFT)) & GPC_ISR5_ISR4_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group GPC_Register_Masks */ - - -/* GPC - Peripheral instance base addresses */ -/** Peripheral GPC base address */ -#define GPC_BASE (0x400F4000u) -/** Peripheral GPC base pointer */ -#define GPC ((GPC_Type *)GPC_BASE) -/** Array initializer of GPC peripheral base addresses */ -#define GPC_BASE_ADDRS { GPC_BASE } -/** Array initializer of GPC peripheral base pointers */ -#define GPC_BASE_PTRS { GPC } -/** Interrupt vectors for the GPC peripheral type */ -#define GPC_IRQS { GPC_IRQn } - -/*! - * @} - */ /* end of group GPC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- GPIO Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer - * @{ - */ - -/** GPIO - Register Layout Typedef */ -typedef struct { - __IO uint32_t DR; /**< GPIO data register, offset: 0x0 */ - __IO uint32_t GDIR; /**< GPIO direction register, offset: 0x4 */ - __I uint32_t PSR; /**< GPIO pad status register, offset: 0x8 */ - __IO uint32_t ICR1; /**< GPIO interrupt configuration register1, offset: 0xC */ - __IO uint32_t ICR2; /**< GPIO interrupt configuration register2, offset: 0x10 */ - __IO uint32_t IMR; /**< GPIO interrupt mask register, offset: 0x14 */ - __IO uint32_t ISR; /**< GPIO interrupt status register, offset: 0x18 */ - __IO uint32_t EDGE_SEL; /**< GPIO edge select register, offset: 0x1C */ - uint8_t RESERVED_0[100]; - __O uint32_t DR_SET; /**< GPIO data register SET, offset: 0x84 */ - __O uint32_t DR_CLEAR; /**< GPIO data register CLEAR, offset: 0x88 */ - __O uint32_t DR_TOGGLE; /**< GPIO data register TOGGLE, offset: 0x8C */ -} GPIO_Type; - -/* ---------------------------------------------------------------------------- - -- GPIO Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPIO_Register_Masks GPIO Register Masks - * @{ - */ - -/*! @name DR - GPIO data register */ -/*! @{ */ - -#define GPIO_DR_DR_MASK (0xFFFFFFFFU) -#define GPIO_DR_DR_SHIFT (0U) -/*! DR - DR - */ -#define GPIO_DR_DR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_DR_DR_SHIFT)) & GPIO_DR_DR_MASK) -/*! @} */ - -/*! @name GDIR - GPIO direction register */ -/*! @{ */ - -#define GPIO_GDIR_GDIR_MASK (0xFFFFFFFFU) -#define GPIO_GDIR_GDIR_SHIFT (0U) -/*! GDIR - GDIR - */ -#define GPIO_GDIR_GDIR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GDIR_GDIR_SHIFT)) & GPIO_GDIR_GDIR_MASK) -/*! @} */ - -/*! @name PSR - GPIO pad status register */ -/*! @{ */ - -#define GPIO_PSR_PSR_MASK (0xFFFFFFFFU) -#define GPIO_PSR_PSR_SHIFT (0U) -/*! PSR - PSR - */ -#define GPIO_PSR_PSR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSR_PSR_SHIFT)) & GPIO_PSR_PSR_MASK) -/*! @} */ - -/*! @name ICR1 - GPIO interrupt configuration register1 */ -/*! @{ */ - -#define GPIO_ICR1_ICR0_MASK (0x3U) -#define GPIO_ICR1_ICR0_SHIFT (0U) -/*! ICR0 - ICR0 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR0_SHIFT)) & GPIO_ICR1_ICR0_MASK) - -#define GPIO_ICR1_ICR1_MASK (0xCU) -#define GPIO_ICR1_ICR1_SHIFT (2U) -/*! ICR1 - ICR1 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR1_SHIFT)) & GPIO_ICR1_ICR1_MASK) - -#define GPIO_ICR1_ICR2_MASK (0x30U) -#define GPIO_ICR1_ICR2_SHIFT (4U) -/*! ICR2 - ICR2 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR2_SHIFT)) & GPIO_ICR1_ICR2_MASK) - -#define GPIO_ICR1_ICR3_MASK (0xC0U) -#define GPIO_ICR1_ICR3_SHIFT (6U) -/*! ICR3 - ICR3 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR3_SHIFT)) & GPIO_ICR1_ICR3_MASK) - -#define GPIO_ICR1_ICR4_MASK (0x300U) -#define GPIO_ICR1_ICR4_SHIFT (8U) -/*! ICR4 - ICR4 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR4_SHIFT)) & GPIO_ICR1_ICR4_MASK) - -#define GPIO_ICR1_ICR5_MASK (0xC00U) -#define GPIO_ICR1_ICR5_SHIFT (10U) -/*! ICR5 - ICR5 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR5_SHIFT)) & GPIO_ICR1_ICR5_MASK) - -#define GPIO_ICR1_ICR6_MASK (0x3000U) -#define GPIO_ICR1_ICR6_SHIFT (12U) -/*! ICR6 - ICR6 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR6_SHIFT)) & GPIO_ICR1_ICR6_MASK) - -#define GPIO_ICR1_ICR7_MASK (0xC000U) -#define GPIO_ICR1_ICR7_SHIFT (14U) -/*! ICR7 - ICR7 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR7_SHIFT)) & GPIO_ICR1_ICR7_MASK) - -#define GPIO_ICR1_ICR8_MASK (0x30000U) -#define GPIO_ICR1_ICR8_SHIFT (16U) -/*! ICR8 - ICR8 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR8_SHIFT)) & GPIO_ICR1_ICR8_MASK) - -#define GPIO_ICR1_ICR9_MASK (0xC0000U) -#define GPIO_ICR1_ICR9_SHIFT (18U) -/*! ICR9 - ICR9 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR9_SHIFT)) & GPIO_ICR1_ICR9_MASK) - -#define GPIO_ICR1_ICR10_MASK (0x300000U) -#define GPIO_ICR1_ICR10_SHIFT (20U) -/*! ICR10 - ICR10 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR10_SHIFT)) & GPIO_ICR1_ICR10_MASK) - -#define GPIO_ICR1_ICR11_MASK (0xC00000U) -#define GPIO_ICR1_ICR11_SHIFT (22U) -/*! ICR11 - ICR11 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR11_SHIFT)) & GPIO_ICR1_ICR11_MASK) - -#define GPIO_ICR1_ICR12_MASK (0x3000000U) -#define GPIO_ICR1_ICR12_SHIFT (24U) -/*! ICR12 - ICR12 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR12_SHIFT)) & GPIO_ICR1_ICR12_MASK) - -#define GPIO_ICR1_ICR13_MASK (0xC000000U) -#define GPIO_ICR1_ICR13_SHIFT (26U) -/*! ICR13 - ICR13 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR13_SHIFT)) & GPIO_ICR1_ICR13_MASK) - -#define GPIO_ICR1_ICR14_MASK (0x30000000U) -#define GPIO_ICR1_ICR14_SHIFT (28U) -/*! ICR14 - ICR14 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR14_SHIFT)) & GPIO_ICR1_ICR14_MASK) - -#define GPIO_ICR1_ICR15_MASK (0xC0000000U) -#define GPIO_ICR1_ICR15_SHIFT (30U) -/*! ICR15 - ICR15 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR1_ICR15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR15_SHIFT)) & GPIO_ICR1_ICR15_MASK) -/*! @} */ - -/*! @name ICR2 - GPIO interrupt configuration register2 */ -/*! @{ */ - -#define GPIO_ICR2_ICR16_MASK (0x3U) -#define GPIO_ICR2_ICR16_SHIFT (0U) -/*! ICR16 - ICR16 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR16_SHIFT)) & GPIO_ICR2_ICR16_MASK) - -#define GPIO_ICR2_ICR17_MASK (0xCU) -#define GPIO_ICR2_ICR17_SHIFT (2U) -/*! ICR17 - ICR17 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR17_SHIFT)) & GPIO_ICR2_ICR17_MASK) - -#define GPIO_ICR2_ICR18_MASK (0x30U) -#define GPIO_ICR2_ICR18_SHIFT (4U) -/*! ICR18 - ICR18 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR18_SHIFT)) & GPIO_ICR2_ICR18_MASK) - -#define GPIO_ICR2_ICR19_MASK (0xC0U) -#define GPIO_ICR2_ICR19_SHIFT (6U) -/*! ICR19 - ICR19 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR19_SHIFT)) & GPIO_ICR2_ICR19_MASK) - -#define GPIO_ICR2_ICR20_MASK (0x300U) -#define GPIO_ICR2_ICR20_SHIFT (8U) -/*! ICR20 - ICR20 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR20_SHIFT)) & GPIO_ICR2_ICR20_MASK) - -#define GPIO_ICR2_ICR21_MASK (0xC00U) -#define GPIO_ICR2_ICR21_SHIFT (10U) -/*! ICR21 - ICR21 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR21_SHIFT)) & GPIO_ICR2_ICR21_MASK) - -#define GPIO_ICR2_ICR22_MASK (0x3000U) -#define GPIO_ICR2_ICR22_SHIFT (12U) -/*! ICR22 - ICR22 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR22_SHIFT)) & GPIO_ICR2_ICR22_MASK) - -#define GPIO_ICR2_ICR23_MASK (0xC000U) -#define GPIO_ICR2_ICR23_SHIFT (14U) -/*! ICR23 - ICR23 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR23_SHIFT)) & GPIO_ICR2_ICR23_MASK) - -#define GPIO_ICR2_ICR24_MASK (0x30000U) -#define GPIO_ICR2_ICR24_SHIFT (16U) -/*! ICR24 - ICR24 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR24_SHIFT)) & GPIO_ICR2_ICR24_MASK) - -#define GPIO_ICR2_ICR25_MASK (0xC0000U) -#define GPIO_ICR2_ICR25_SHIFT (18U) -/*! ICR25 - ICR25 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR25_SHIFT)) & GPIO_ICR2_ICR25_MASK) - -#define GPIO_ICR2_ICR26_MASK (0x300000U) -#define GPIO_ICR2_ICR26_SHIFT (20U) -/*! ICR26 - ICR26 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR26_SHIFT)) & GPIO_ICR2_ICR26_MASK) - -#define GPIO_ICR2_ICR27_MASK (0xC00000U) -#define GPIO_ICR2_ICR27_SHIFT (22U) -/*! ICR27 - ICR27 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR27_SHIFT)) & GPIO_ICR2_ICR27_MASK) - -#define GPIO_ICR2_ICR28_MASK (0x3000000U) -#define GPIO_ICR2_ICR28_SHIFT (24U) -/*! ICR28 - ICR28 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR28_SHIFT)) & GPIO_ICR2_ICR28_MASK) - -#define GPIO_ICR2_ICR29_MASK (0xC000000U) -#define GPIO_ICR2_ICR29_SHIFT (26U) -/*! ICR29 - ICR29 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR29_SHIFT)) & GPIO_ICR2_ICR29_MASK) - -#define GPIO_ICR2_ICR30_MASK (0x30000000U) -#define GPIO_ICR2_ICR30_SHIFT (28U) -/*! ICR30 - ICR30 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR30_SHIFT)) & GPIO_ICR2_ICR30_MASK) - -#define GPIO_ICR2_ICR31_MASK (0xC0000000U) -#define GPIO_ICR2_ICR31_SHIFT (30U) -/*! ICR31 - ICR31 - * 0b00..Interrupt n is low-level sensitive. - * 0b01..Interrupt n is high-level sensitive. - * 0b10..Interrupt n is rising-edge sensitive. - * 0b11..Interrupt n is falling-edge sensitive. - */ -#define GPIO_ICR2_ICR31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR31_SHIFT)) & GPIO_ICR2_ICR31_MASK) -/*! @} */ - -/*! @name IMR - GPIO interrupt mask register */ -/*! @{ */ - -#define GPIO_IMR_IMR_MASK (0xFFFFFFFFU) -#define GPIO_IMR_IMR_SHIFT (0U) -/*! IMR - IMR - */ -#define GPIO_IMR_IMR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_IMR_IMR_SHIFT)) & GPIO_IMR_IMR_MASK) -/*! @} */ - -/*! @name ISR - GPIO interrupt status register */ -/*! @{ */ - -#define GPIO_ISR_ISR_MASK (0xFFFFFFFFU) -#define GPIO_ISR_ISR_SHIFT (0U) -/*! ISR - ISR - */ -#define GPIO_ISR_ISR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISR_ISR_SHIFT)) & GPIO_ISR_ISR_MASK) -/*! @} */ - -/*! @name EDGE_SEL - GPIO edge select register */ -/*! @{ */ - -#define GPIO_EDGE_SEL_GPIO_EDGE_SEL_MASK (0xFFFFFFFFU) -#define GPIO_EDGE_SEL_GPIO_EDGE_SEL_SHIFT (0U) -/*! GPIO_EDGE_SEL - GPIO_EDGE_SEL - */ -#define GPIO_EDGE_SEL_GPIO_EDGE_SEL(x) (((uint32_t)(((uint32_t)(x)) << GPIO_EDGE_SEL_GPIO_EDGE_SEL_SHIFT)) & GPIO_EDGE_SEL_GPIO_EDGE_SEL_MASK) -/*! @} */ - -/*! @name DR_SET - GPIO data register SET */ -/*! @{ */ - -#define GPIO_DR_SET_DR_SET_MASK (0xFFFFFFFFU) -#define GPIO_DR_SET_DR_SET_SHIFT (0U) -/*! DR_SET - DR_SET - */ -#define GPIO_DR_SET_DR_SET(x) (((uint32_t)(((uint32_t)(x)) << GPIO_DR_SET_DR_SET_SHIFT)) & GPIO_DR_SET_DR_SET_MASK) -/*! @} */ - -/*! @name DR_CLEAR - GPIO data register CLEAR */ -/*! @{ */ - -#define GPIO_DR_CLEAR_DR_CLEAR_MASK (0xFFFFFFFFU) -#define GPIO_DR_CLEAR_DR_CLEAR_SHIFT (0U) -/*! DR_CLEAR - DR_CLEAR - */ -#define GPIO_DR_CLEAR_DR_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_DR_CLEAR_DR_CLEAR_SHIFT)) & GPIO_DR_CLEAR_DR_CLEAR_MASK) -/*! @} */ - -/*! @name DR_TOGGLE - GPIO data register TOGGLE */ -/*! @{ */ - -#define GPIO_DR_TOGGLE_DR_TOGGLE_MASK (0xFFFFFFFFU) -#define GPIO_DR_TOGGLE_DR_TOGGLE_SHIFT (0U) -/*! DR_TOGGLE - DR_TOGGLE - */ -#define GPIO_DR_TOGGLE_DR_TOGGLE(x) (((uint32_t)(((uint32_t)(x)) << GPIO_DR_TOGGLE_DR_TOGGLE_SHIFT)) & GPIO_DR_TOGGLE_DR_TOGGLE_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group GPIO_Register_Masks */ - - -/* GPIO - Peripheral instance base addresses */ -/** Peripheral GPIO1 base address */ -#define GPIO1_BASE (0x401B8000u) -/** Peripheral GPIO1 base pointer */ -#define GPIO1 ((GPIO_Type *)GPIO1_BASE) -/** Peripheral GPIO2 base address */ -#define GPIO2_BASE (0x401BC000u) -/** Peripheral GPIO2 base pointer */ -#define GPIO2 ((GPIO_Type *)GPIO2_BASE) -/** Peripheral GPIO3 base address */ -#define GPIO3_BASE (0x401C0000u) -/** Peripheral GPIO3 base pointer */ -#define GPIO3 ((GPIO_Type *)GPIO3_BASE) -/** Peripheral GPIO4 base address */ -#define GPIO4_BASE (0x401C4000u) -/** Peripheral GPIO4 base pointer */ -#define GPIO4 ((GPIO_Type *)GPIO4_BASE) -/** Peripheral GPIO5 base address */ -#define GPIO5_BASE (0x400C0000u) -/** Peripheral GPIO5 base pointer */ -#define GPIO5 ((GPIO_Type *)GPIO5_BASE) -/** Array initializer of GPIO peripheral base addresses */ -#define GPIO_BASE_ADDRS { 0u, GPIO1_BASE, GPIO2_BASE, GPIO3_BASE, GPIO4_BASE, GPIO5_BASE } -/** Array initializer of GPIO peripheral base pointers */ -#define GPIO_BASE_PTRS { (GPIO_Type *)0u, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5 } -/** Interrupt vectors for the GPIO peripheral type */ -#define GPIO_IRQS { NotAvail_IRQn, GPIO1_INT0_IRQn, GPIO1_INT1_IRQn, GPIO1_INT2_IRQn, GPIO1_INT3_IRQn, GPIO1_INT4_IRQn, GPIO1_INT5_IRQn, GPIO1_INT6_IRQn, GPIO1_INT7_IRQn, NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn } -#define GPIO_COMBINED_LOW_IRQS { NotAvail_IRQn, GPIO1_Combined_0_15_IRQn, GPIO2_Combined_0_15_IRQn, GPIO3_Combined_0_15_IRQn, GPIO4_Combined_0_15_IRQn, GPIO5_Combined_0_15_IRQn } -#define GPIO_COMBINED_HIGH_IRQS { NotAvail_IRQn, GPIO1_Combined_16_31_IRQn, GPIO2_Combined_16_31_IRQn, GPIO3_Combined_16_31_IRQn, GPIO4_Combined_16_31_IRQn, GPIO5_Combined_16_31_IRQn } - -/*! - * @} - */ /* end of group GPIO_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- GPT Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPT_Peripheral_Access_Layer GPT Peripheral Access Layer - * @{ - */ - -/** GPT - Register Layout Typedef */ -typedef struct { - __IO uint32_t CR; /**< GPT Control Register, offset: 0x0 */ - __IO uint32_t PR; /**< GPT Prescaler Register, offset: 0x4 */ - __IO uint32_t SR; /**< GPT Status Register, offset: 0x8 */ - __IO uint32_t IR; /**< GPT Interrupt Register, offset: 0xC */ - __IO uint32_t OCR[3]; /**< GPT Output Compare Register 1..GPT Output Compare Register 3, array offset: 0x10, array step: 0x4 */ - __I uint32_t ICR[2]; /**< GPT Input Capture Register 1..GPT Input Capture Register 2, array offset: 0x1C, array step: 0x4 */ - __I uint32_t CNT; /**< GPT Counter Register, offset: 0x24 */ -} GPT_Type; - -/* ---------------------------------------------------------------------------- - -- GPT Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup GPT_Register_Masks GPT Register Masks - * @{ - */ - -/*! @name CR - GPT Control Register */ -/*! @{ */ - -#define GPT_CR_EN_MASK (0x1U) -#define GPT_CR_EN_SHIFT (0U) -/*! EN - * 0b0..GPT is disabled. - * 0b1..GPT is enabled. - */ -#define GPT_CR_EN(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_EN_SHIFT)) & GPT_CR_EN_MASK) - -#define GPT_CR_ENMOD_MASK (0x2U) -#define GPT_CR_ENMOD_SHIFT (1U) -/*! ENMOD - * 0b0..GPT counter will retain its value when it is disabled. - * 0b1..GPT counter value is reset to 0 when it is disabled. - */ -#define GPT_CR_ENMOD(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_ENMOD_SHIFT)) & GPT_CR_ENMOD_MASK) - -#define GPT_CR_DBGEN_MASK (0x4U) -#define GPT_CR_DBGEN_SHIFT (2U) -/*! DBGEN - * 0b0..GPT is disabled in debug mode. - * 0b1..GPT is enabled in debug mode. - */ -#define GPT_CR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_DBGEN_SHIFT)) & GPT_CR_DBGEN_MASK) - -#define GPT_CR_WAITEN_MASK (0x8U) -#define GPT_CR_WAITEN_SHIFT (3U) -/*! WAITEN - * 0b0..GPT is disabled in wait mode. - * 0b1..GPT is enabled in wait mode. - */ -#define GPT_CR_WAITEN(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_WAITEN_SHIFT)) & GPT_CR_WAITEN_MASK) - -#define GPT_CR_DOZEEN_MASK (0x10U) -#define GPT_CR_DOZEEN_SHIFT (4U) -/*! DOZEEN - * 0b0..GPT is disabled in doze mode. - * 0b1..GPT is enabled in doze mode. - */ -#define GPT_CR_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_DOZEEN_SHIFT)) & GPT_CR_DOZEEN_MASK) - -#define GPT_CR_STOPEN_MASK (0x20U) -#define GPT_CR_STOPEN_SHIFT (5U) -/*! STOPEN - * 0b0..GPT is disabled in Stop mode. - * 0b1..GPT is enabled in Stop mode. - */ -#define GPT_CR_STOPEN(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_STOPEN_SHIFT)) & GPT_CR_STOPEN_MASK) - -#define GPT_CR_CLKSRC_MASK (0x1C0U) -#define GPT_CR_CLKSRC_SHIFT (6U) -/*! CLKSRC - * 0b000..No clock - * 0b001..Peripheral Clock (ipg_clk) - * 0b010..High Frequency Reference Clock (ipg_clk_highfreq) - * 0b011..External Clock - * 0b100..Low Frequency Reference Clock (ipg_clk_32k) - * 0b101..Crystal oscillator as Reference Clock (ipg_clk_24M) - */ -#define GPT_CR_CLKSRC(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_CLKSRC_SHIFT)) & GPT_CR_CLKSRC_MASK) - -#define GPT_CR_FRR_MASK (0x200U) -#define GPT_CR_FRR_SHIFT (9U) -/*! FRR - * 0b0..Restart mode - * 0b1..Free-Run mode - */ -#define GPT_CR_FRR(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_FRR_SHIFT)) & GPT_CR_FRR_MASK) - -#define GPT_CR_EN_24M_MASK (0x400U) -#define GPT_CR_EN_24M_SHIFT (10U) -/*! EN_24M - * 0b0..24M clock disabled - * 0b1..24M clock enabled - */ -#define GPT_CR_EN_24M(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_EN_24M_SHIFT)) & GPT_CR_EN_24M_MASK) - -#define GPT_CR_SWR_MASK (0x8000U) -#define GPT_CR_SWR_SHIFT (15U) -/*! SWR - * 0b0..GPT is not in reset state - * 0b1..GPT is in reset state - */ -#define GPT_CR_SWR(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_SWR_SHIFT)) & GPT_CR_SWR_MASK) - -#define GPT_CR_IM1_MASK (0x30000U) -#define GPT_CR_IM1_SHIFT (16U) -#define GPT_CR_IM1(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_IM1_SHIFT)) & GPT_CR_IM1_MASK) - -#define GPT_CR_IM2_MASK (0xC0000U) -#define GPT_CR_IM2_SHIFT (18U) -/*! IM2 - * 0b00..capture disabled - * 0b01..capture on rising edge only - * 0b10..capture on falling edge only - * 0b11..capture on both edges - */ -#define GPT_CR_IM2(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_IM2_SHIFT)) & GPT_CR_IM2_MASK) - -#define GPT_CR_OM1_MASK (0x700000U) -#define GPT_CR_OM1_SHIFT (20U) -#define GPT_CR_OM1(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_OM1_SHIFT)) & GPT_CR_OM1_MASK) - -#define GPT_CR_OM2_MASK (0x3800000U) -#define GPT_CR_OM2_SHIFT (23U) -#define GPT_CR_OM2(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_OM2_SHIFT)) & GPT_CR_OM2_MASK) - -#define GPT_CR_OM3_MASK (0x1C000000U) -#define GPT_CR_OM3_SHIFT (26U) -/*! OM3 - * 0b000..Output disconnected. No response on pin. - * 0b001..Toggle output pin - * 0b010..Clear output pin - * 0b011..Set output pin - * 0b1xx..Generate an active low pulse (that is one input clock wide) on the output pin. - */ -#define GPT_CR_OM3(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_OM3_SHIFT)) & GPT_CR_OM3_MASK) - -#define GPT_CR_FO1_MASK (0x20000000U) -#define GPT_CR_FO1_SHIFT (29U) -#define GPT_CR_FO1(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_FO1_SHIFT)) & GPT_CR_FO1_MASK) - -#define GPT_CR_FO2_MASK (0x40000000U) -#define GPT_CR_FO2_SHIFT (30U) -#define GPT_CR_FO2(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_FO2_SHIFT)) & GPT_CR_FO2_MASK) - -#define GPT_CR_FO3_MASK (0x80000000U) -#define GPT_CR_FO3_SHIFT (31U) -/*! FO3 - * 0b0..Writing a 0 has no effect. - * 0b1..Causes the programmed pin action on the timer Output Compare n pin; the OFn flag is not set. - */ -#define GPT_CR_FO3(x) (((uint32_t)(((uint32_t)(x)) << GPT_CR_FO3_SHIFT)) & GPT_CR_FO3_MASK) -/*! @} */ - -/*! @name PR - GPT Prescaler Register */ -/*! @{ */ - -#define GPT_PR_PRESCALER_MASK (0xFFFU) -#define GPT_PR_PRESCALER_SHIFT (0U) -/*! PRESCALER - * 0b000000000000..Divide by 1 - * 0b000000000001..Divide by 2 - * 0b111111111111..Divide by 4096 - */ -#define GPT_PR_PRESCALER(x) (((uint32_t)(((uint32_t)(x)) << GPT_PR_PRESCALER_SHIFT)) & GPT_PR_PRESCALER_MASK) - -#define GPT_PR_PRESCALER24M_MASK (0xF000U) -#define GPT_PR_PRESCALER24M_SHIFT (12U) -/*! PRESCALER24M - * 0b0000..Divide by 1 - * 0b0001..Divide by 2 - * 0b1111..Divide by 16 - */ -#define GPT_PR_PRESCALER24M(x) (((uint32_t)(((uint32_t)(x)) << GPT_PR_PRESCALER24M_SHIFT)) & GPT_PR_PRESCALER24M_MASK) -/*! @} */ - -/*! @name SR - GPT Status Register */ -/*! @{ */ - -#define GPT_SR_OF1_MASK (0x1U) -#define GPT_SR_OF1_SHIFT (0U) -#define GPT_SR_OF1(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_OF1_SHIFT)) & GPT_SR_OF1_MASK) - -#define GPT_SR_OF2_MASK (0x2U) -#define GPT_SR_OF2_SHIFT (1U) -#define GPT_SR_OF2(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_OF2_SHIFT)) & GPT_SR_OF2_MASK) - -#define GPT_SR_OF3_MASK (0x4U) -#define GPT_SR_OF3_SHIFT (2U) -/*! OF3 - * 0b0..Compare event has not occurred. - * 0b1..Compare event has occurred. - */ -#define GPT_SR_OF3(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_OF3_SHIFT)) & GPT_SR_OF3_MASK) - -#define GPT_SR_IF1_MASK (0x8U) -#define GPT_SR_IF1_SHIFT (3U) -#define GPT_SR_IF1(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_IF1_SHIFT)) & GPT_SR_IF1_MASK) - -#define GPT_SR_IF2_MASK (0x10U) -#define GPT_SR_IF2_SHIFT (4U) -/*! IF2 - * 0b0..Capture event has not occurred. - * 0b1..Capture event has occurred. - */ -#define GPT_SR_IF2(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_IF2_SHIFT)) & GPT_SR_IF2_MASK) - -#define GPT_SR_ROV_MASK (0x20U) -#define GPT_SR_ROV_SHIFT (5U) -/*! ROV - * 0b0..Rollover has not occurred. - * 0b1..Rollover has occurred. - */ -#define GPT_SR_ROV(x) (((uint32_t)(((uint32_t)(x)) << GPT_SR_ROV_SHIFT)) & GPT_SR_ROV_MASK) -/*! @} */ - -/*! @name IR - GPT Interrupt Register */ -/*! @{ */ - -#define GPT_IR_OF1IE_MASK (0x1U) -#define GPT_IR_OF1IE_SHIFT (0U) -#define GPT_IR_OF1IE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_OF1IE_SHIFT)) & GPT_IR_OF1IE_MASK) - -#define GPT_IR_OF2IE_MASK (0x2U) -#define GPT_IR_OF2IE_SHIFT (1U) -#define GPT_IR_OF2IE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_OF2IE_SHIFT)) & GPT_IR_OF2IE_MASK) - -#define GPT_IR_OF3IE_MASK (0x4U) -#define GPT_IR_OF3IE_SHIFT (2U) -/*! OF3IE - * 0b0..Output Compare Channel n interrupt is disabled. - * 0b1..Output Compare Channel n interrupt is enabled. - */ -#define GPT_IR_OF3IE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_OF3IE_SHIFT)) & GPT_IR_OF3IE_MASK) - -#define GPT_IR_IF1IE_MASK (0x8U) -#define GPT_IR_IF1IE_SHIFT (3U) -#define GPT_IR_IF1IE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_IF1IE_SHIFT)) & GPT_IR_IF1IE_MASK) - -#define GPT_IR_IF2IE_MASK (0x10U) -#define GPT_IR_IF2IE_SHIFT (4U) -/*! IF2IE - * 0b0..IF2IE Input Capture n Interrupt Enable is disabled. - * 0b1..IF2IE Input Capture n Interrupt Enable is enabled. - */ -#define GPT_IR_IF2IE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_IF2IE_SHIFT)) & GPT_IR_IF2IE_MASK) - -#define GPT_IR_ROVIE_MASK (0x20U) -#define GPT_IR_ROVIE_SHIFT (5U) -/*! ROVIE - * 0b0..Rollover interrupt is disabled. - * 0b1..Rollover interrupt enabled. - */ -#define GPT_IR_ROVIE(x) (((uint32_t)(((uint32_t)(x)) << GPT_IR_ROVIE_SHIFT)) & GPT_IR_ROVIE_MASK) -/*! @} */ - -/*! @name OCR - GPT Output Compare Register 1..GPT Output Compare Register 3 */ -/*! @{ */ - -#define GPT_OCR_COMP_MASK (0xFFFFFFFFU) -#define GPT_OCR_COMP_SHIFT (0U) -#define GPT_OCR_COMP(x) (((uint32_t)(((uint32_t)(x)) << GPT_OCR_COMP_SHIFT)) & GPT_OCR_COMP_MASK) -/*! @} */ - -/* The count of GPT_OCR */ -#define GPT_OCR_COUNT (3U) - -/*! @name ICR - GPT Input Capture Register 1..GPT Input Capture Register 2 */ -/*! @{ */ - -#define GPT_ICR_CAPT_MASK (0xFFFFFFFFU) -#define GPT_ICR_CAPT_SHIFT (0U) -#define GPT_ICR_CAPT(x) (((uint32_t)(((uint32_t)(x)) << GPT_ICR_CAPT_SHIFT)) & GPT_ICR_CAPT_MASK) -/*! @} */ - -/* The count of GPT_ICR */ -#define GPT_ICR_COUNT (2U) - -/*! @name CNT - GPT Counter Register */ -/*! @{ */ - -#define GPT_CNT_COUNT_MASK (0xFFFFFFFFU) -#define GPT_CNT_COUNT_SHIFT (0U) -#define GPT_CNT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << GPT_CNT_COUNT_SHIFT)) & GPT_CNT_COUNT_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group GPT_Register_Masks */ - - -/* GPT - Peripheral instance base addresses */ -/** Peripheral GPT1 base address */ -#define GPT1_BASE (0x401EC000u) -/** Peripheral GPT1 base pointer */ -#define GPT1 ((GPT_Type *)GPT1_BASE) -/** Peripheral GPT2 base address */ -#define GPT2_BASE (0x401F0000u) -/** Peripheral GPT2 base pointer */ -#define GPT2 ((GPT_Type *)GPT2_BASE) -/** Array initializer of GPT peripheral base addresses */ -#define GPT_BASE_ADDRS { 0u, GPT1_BASE, GPT2_BASE } -/** Array initializer of GPT peripheral base pointers */ -#define GPT_BASE_PTRS { (GPT_Type *)0u, GPT1, GPT2 } -/** Interrupt vectors for the GPT peripheral type */ -#define GPT_IRQS { NotAvail_IRQn, GPT1_IRQn, GPT2_IRQn } - -/*! - * @} - */ /* end of group GPT_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- I2S Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup I2S_Peripheral_Access_Layer I2S Peripheral Access Layer - * @{ - */ - -/** I2S - Register Layout Typedef */ -typedef struct { - __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ - __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ - __IO uint32_t TCSR; /**< SAI Transmit Control Register, offset: 0x8 */ - __IO uint32_t TCR1; /**< SAI Transmit Configuration 1 Register, offset: 0xC */ - __IO uint32_t TCR2; /**< SAI Transmit Configuration 2 Register, offset: 0x10 */ - __IO uint32_t TCR3; /**< SAI Transmit Configuration 3 Register, offset: 0x14 */ - __IO uint32_t TCR4; /**< SAI Transmit Configuration 4 Register, offset: 0x18 */ - __IO uint32_t TCR5; /**< SAI Transmit Configuration 5 Register, offset: 0x1C */ - __O uint32_t TDR[4]; /**< SAI Transmit Data Register, array offset: 0x20, array step: 0x4 */ - uint8_t RESERVED_0[16]; - __I uint32_t TFR[4]; /**< SAI Transmit FIFO Register, array offset: 0x40, array step: 0x4 */ - uint8_t RESERVED_1[16]; - __IO uint32_t TMR; /**< SAI Transmit Mask Register, offset: 0x60 */ - uint8_t RESERVED_2[36]; - __IO uint32_t RCSR; /**< SAI Receive Control Register, offset: 0x88 */ - __IO uint32_t RCR1; /**< SAI Receive Configuration 1 Register, offset: 0x8C */ - __IO uint32_t RCR2; /**< SAI Receive Configuration 2 Register, offset: 0x90 */ - __IO uint32_t RCR3; /**< SAI Receive Configuration 3 Register, offset: 0x94 */ - __IO uint32_t RCR4; /**< SAI Receive Configuration 4 Register, offset: 0x98 */ - __IO uint32_t RCR5; /**< SAI Receive Configuration 5 Register, offset: 0x9C */ - __I uint32_t RDR[4]; /**< SAI Receive Data Register, array offset: 0xA0, array step: 0x4 */ - uint8_t RESERVED_3[16]; - __I uint32_t RFR[4]; /**< SAI Receive FIFO Register, array offset: 0xC0, array step: 0x4 */ - uint8_t RESERVED_4[16]; - __IO uint32_t RMR; /**< SAI Receive Mask Register, offset: 0xE0 */ -} I2S_Type; - -/* ---------------------------------------------------------------------------- - -- I2S Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup I2S_Register_Masks I2S Register Masks - * @{ - */ - -/*! @name VERID - Version ID Register */ -/*! @{ */ - -#define I2S_VERID_FEATURE_MASK (0xFFFFU) -#define I2S_VERID_FEATURE_SHIFT (0U) -/*! FEATURE - Feature Specification Number - * 0b0000000000000000..Standard feature set. - */ -#define I2S_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << I2S_VERID_FEATURE_SHIFT)) & I2S_VERID_FEATURE_MASK) - -#define I2S_VERID_MINOR_MASK (0xFF0000U) -#define I2S_VERID_MINOR_SHIFT (16U) -/*! MINOR - Minor Version Number - */ -#define I2S_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << I2S_VERID_MINOR_SHIFT)) & I2S_VERID_MINOR_MASK) - -#define I2S_VERID_MAJOR_MASK (0xFF000000U) -#define I2S_VERID_MAJOR_SHIFT (24U) -/*! MAJOR - Major Version Number - */ -#define I2S_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << I2S_VERID_MAJOR_SHIFT)) & I2S_VERID_MAJOR_MASK) -/*! @} */ - -/*! @name PARAM - Parameter Register */ -/*! @{ */ - -#define I2S_PARAM_DATALINE_MASK (0xFU) -#define I2S_PARAM_DATALINE_SHIFT (0U) -/*! DATALINE - Number of Datalines - */ -#define I2S_PARAM_DATALINE(x) (((uint32_t)(((uint32_t)(x)) << I2S_PARAM_DATALINE_SHIFT)) & I2S_PARAM_DATALINE_MASK) - -#define I2S_PARAM_FIFO_MASK (0xF00U) -#define I2S_PARAM_FIFO_SHIFT (8U) -/*! FIFO - FIFO Size - */ -#define I2S_PARAM_FIFO(x) (((uint32_t)(((uint32_t)(x)) << I2S_PARAM_FIFO_SHIFT)) & I2S_PARAM_FIFO_MASK) - -#define I2S_PARAM_FRAME_MASK (0xF0000U) -#define I2S_PARAM_FRAME_SHIFT (16U) -/*! FRAME - Frame Size - */ -#define I2S_PARAM_FRAME(x) (((uint32_t)(((uint32_t)(x)) << I2S_PARAM_FRAME_SHIFT)) & I2S_PARAM_FRAME_MASK) -/*! @} */ - -/*! @name TCSR - SAI Transmit Control Register */ -/*! @{ */ - -#define I2S_TCSR_FRDE_MASK (0x1U) -#define I2S_TCSR_FRDE_SHIFT (0U) -/*! FRDE - FIFO Request DMA Enable - * 0b0..Disables the DMA request. - * 0b1..Enables the DMA request. - */ -#define I2S_TCSR_FRDE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FRDE_SHIFT)) & I2S_TCSR_FRDE_MASK) - -#define I2S_TCSR_FWDE_MASK (0x2U) -#define I2S_TCSR_FWDE_SHIFT (1U) -/*! FWDE - FIFO Warning DMA Enable - * 0b0..Disables the DMA request. - * 0b1..Enables the DMA request. - */ -#define I2S_TCSR_FWDE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FWDE_SHIFT)) & I2S_TCSR_FWDE_MASK) - -#define I2S_TCSR_FRIE_MASK (0x100U) -#define I2S_TCSR_FRIE_SHIFT (8U) -/*! FRIE - FIFO Request Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_TCSR_FRIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FRIE_SHIFT)) & I2S_TCSR_FRIE_MASK) - -#define I2S_TCSR_FWIE_MASK (0x200U) -#define I2S_TCSR_FWIE_SHIFT (9U) -/*! FWIE - FIFO Warning Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_TCSR_FWIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FWIE_SHIFT)) & I2S_TCSR_FWIE_MASK) - -#define I2S_TCSR_FEIE_MASK (0x400U) -#define I2S_TCSR_FEIE_SHIFT (10U) -/*! FEIE - FIFO Error Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_TCSR_FEIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FEIE_SHIFT)) & I2S_TCSR_FEIE_MASK) - -#define I2S_TCSR_SEIE_MASK (0x800U) -#define I2S_TCSR_SEIE_SHIFT (11U) -/*! SEIE - Sync Error Interrupt Enable - * 0b0..Disables interrupt. - * 0b1..Enables interrupt. - */ -#define I2S_TCSR_SEIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_SEIE_SHIFT)) & I2S_TCSR_SEIE_MASK) - -#define I2S_TCSR_WSIE_MASK (0x1000U) -#define I2S_TCSR_WSIE_SHIFT (12U) -/*! WSIE - Word Start Interrupt Enable - * 0b0..Disables interrupt. - * 0b1..Enables interrupt. - */ -#define I2S_TCSR_WSIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_WSIE_SHIFT)) & I2S_TCSR_WSIE_MASK) - -#define I2S_TCSR_FRF_MASK (0x10000U) -#define I2S_TCSR_FRF_SHIFT (16U) -/*! FRF - FIFO Request Flag - * 0b0..Transmit FIFO watermark has not been reached. - * 0b1..Transmit FIFO watermark has been reached. - */ -#define I2S_TCSR_FRF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FRF_SHIFT)) & I2S_TCSR_FRF_MASK) - -#define I2S_TCSR_FWF_MASK (0x20000U) -#define I2S_TCSR_FWF_SHIFT (17U) -/*! FWF - FIFO Warning Flag - * 0b0..No enabled transmit FIFO is empty. - * 0b1..Enabled transmit FIFO is empty. - */ -#define I2S_TCSR_FWF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FWF_SHIFT)) & I2S_TCSR_FWF_MASK) - -#define I2S_TCSR_FEF_MASK (0x40000U) -#define I2S_TCSR_FEF_SHIFT (18U) -/*! FEF - FIFO Error Flag - * 0b0..Transmit underrun not detected. - * 0b1..Transmit underrun detected. - */ -#define I2S_TCSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FEF_SHIFT)) & I2S_TCSR_FEF_MASK) - -#define I2S_TCSR_SEF_MASK (0x80000U) -#define I2S_TCSR_SEF_SHIFT (19U) -/*! SEF - Sync Error Flag - * 0b0..Sync error not detected. - * 0b1..Frame sync error detected. - */ -#define I2S_TCSR_SEF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_SEF_SHIFT)) & I2S_TCSR_SEF_MASK) - -#define I2S_TCSR_WSF_MASK (0x100000U) -#define I2S_TCSR_WSF_SHIFT (20U) -/*! WSF - Word Start Flag - * 0b0..Start of word not detected. - * 0b1..Start of word detected. - */ -#define I2S_TCSR_WSF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_WSF_SHIFT)) & I2S_TCSR_WSF_MASK) - -#define I2S_TCSR_SR_MASK (0x1000000U) -#define I2S_TCSR_SR_SHIFT (24U) -/*! SR - Software Reset - * 0b0..No effect. - * 0b1..Software reset. - */ -#define I2S_TCSR_SR(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_SR_SHIFT)) & I2S_TCSR_SR_MASK) - -#define I2S_TCSR_FR_MASK (0x2000000U) -#define I2S_TCSR_FR_SHIFT (25U) -/*! FR - FIFO Reset - * 0b0..No effect. - * 0b1..FIFO reset. - */ -#define I2S_TCSR_FR(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_FR_SHIFT)) & I2S_TCSR_FR_MASK) - -#define I2S_TCSR_BCE_MASK (0x10000000U) -#define I2S_TCSR_BCE_SHIFT (28U) -/*! BCE - Bit Clock Enable - * 0b0..Transmit bit clock is disabled. - * 0b1..Transmit bit clock is enabled. - */ -#define I2S_TCSR_BCE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_BCE_SHIFT)) & I2S_TCSR_BCE_MASK) - -#define I2S_TCSR_DBGE_MASK (0x20000000U) -#define I2S_TCSR_DBGE_SHIFT (29U) -/*! DBGE - Debug Enable - * 0b0..Transmitter is disabled in Debug mode, after completing the current frame. - * 0b1..Transmitter is enabled in Debug mode. - */ -#define I2S_TCSR_DBGE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_DBGE_SHIFT)) & I2S_TCSR_DBGE_MASK) - -#define I2S_TCSR_STOPE_MASK (0x40000000U) -#define I2S_TCSR_STOPE_SHIFT (30U) -/*! STOPE - Stop Enable - * 0b0..Transmitter disabled in Stop mode. - * 0b1..Transmitter enabled in Stop mode. - */ -#define I2S_TCSR_STOPE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_STOPE_SHIFT)) & I2S_TCSR_STOPE_MASK) - -#define I2S_TCSR_TE_MASK (0x80000000U) -#define I2S_TCSR_TE_SHIFT (31U) -/*! TE - Transmitter Enable - * 0b0..Transmitter is disabled. - * 0b1..Transmitter is enabled, or transmitter has been disabled and has not yet reached end of frame. - */ -#define I2S_TCSR_TE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCSR_TE_SHIFT)) & I2S_TCSR_TE_MASK) -/*! @} */ - -/*! @name TCR1 - SAI Transmit Configuration 1 Register */ -/*! @{ */ - -#define I2S_TCR1_TFW_MASK (0x1FU) -#define I2S_TCR1_TFW_SHIFT (0U) -/*! TFW - Transmit FIFO Watermark - */ -#define I2S_TCR1_TFW(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR1_TFW_SHIFT)) & I2S_TCR1_TFW_MASK) -/*! @} */ - -/*! @name TCR2 - SAI Transmit Configuration 2 Register */ -/*! @{ */ - -#define I2S_TCR2_DIV_MASK (0xFFU) -#define I2S_TCR2_DIV_SHIFT (0U) -/*! DIV - Bit Clock Divide - */ -#define I2S_TCR2_DIV(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_DIV_SHIFT)) & I2S_TCR2_DIV_MASK) - -#define I2S_TCR2_BCD_MASK (0x1000000U) -#define I2S_TCR2_BCD_SHIFT (24U) -/*! BCD - Bit Clock Direction - * 0b0..Bit clock is generated externally in Slave mode. - * 0b1..Bit clock is generated internally in Master mode. - */ -#define I2S_TCR2_BCD(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_BCD_SHIFT)) & I2S_TCR2_BCD_MASK) - -#define I2S_TCR2_BCP_MASK (0x2000000U) -#define I2S_TCR2_BCP_SHIFT (25U) -/*! BCP - Bit Clock Polarity - * 0b0..Bit clock is active high with drive outputs on rising edge and sample inputs on falling edge. - * 0b1..Bit clock is active low with drive outputs on falling edge and sample inputs on rising edge. - */ -#define I2S_TCR2_BCP(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_BCP_SHIFT)) & I2S_TCR2_BCP_MASK) - -#define I2S_TCR2_MSEL_MASK (0xC000000U) -#define I2S_TCR2_MSEL_SHIFT (26U) -/*! MSEL - MCLK Select - * 0b00..Bus Clock selected. - * 0b01..Master Clock (MCLK) 1 option selected. - * 0b10..Master Clock (MCLK) 2 option selected. - * 0b11..Master Clock (MCLK) 3 option selected. - */ -#define I2S_TCR2_MSEL(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_MSEL_SHIFT)) & I2S_TCR2_MSEL_MASK) - -#define I2S_TCR2_BCI_MASK (0x10000000U) -#define I2S_TCR2_BCI_SHIFT (28U) -/*! BCI - Bit Clock Input - * 0b0..No effect. - * 0b1..Internal logic is clocked as if bit clock was externally generated. - */ -#define I2S_TCR2_BCI(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_BCI_SHIFT)) & I2S_TCR2_BCI_MASK) - -#define I2S_TCR2_BCS_MASK (0x20000000U) -#define I2S_TCR2_BCS_SHIFT (29U) -/*! BCS - Bit Clock Swap - * 0b0..Use the normal bit clock source. - * 0b1..Swap the bit clock source. - */ -#define I2S_TCR2_BCS(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_BCS_SHIFT)) & I2S_TCR2_BCS_MASK) - -#define I2S_TCR2_SYNC_MASK (0xC0000000U) -#define I2S_TCR2_SYNC_SHIFT (30U) -/*! SYNC - Synchronous Mode - * 0b00..Asynchronous mode. - * 0b01..Synchronous with receiver. - * 0b10..Reserved. - * 0b11..Reserved. - */ -#define I2S_TCR2_SYNC(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR2_SYNC_SHIFT)) & I2S_TCR2_SYNC_MASK) -/*! @} */ - -/*! @name TCR3 - SAI Transmit Configuration 3 Register */ -/*! @{ */ - -#define I2S_TCR3_WDFL_MASK (0x1FU) -#define I2S_TCR3_WDFL_SHIFT (0U) -/*! WDFL - Word Flag Configuration - */ -#define I2S_TCR3_WDFL(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR3_WDFL_SHIFT)) & I2S_TCR3_WDFL_MASK) - -#define I2S_TCR3_TCE_MASK (0xF0000U) /* Merged from fields with different position or width, of widths (1, 4), largest definition used */ -#define I2S_TCR3_TCE_SHIFT (16U) -/*! TCE - Transmit Channel Enable - */ -#define I2S_TCR3_TCE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR3_TCE_SHIFT)) & I2S_TCR3_TCE_MASK) /* Merged from fields with different position or width, of widths (1, 4), largest definition used */ - -#define I2S_TCR3_CFR_MASK (0xF000000U) -#define I2S_TCR3_CFR_SHIFT (24U) -/*! CFR - Channel FIFO Reset - */ -#define I2S_TCR3_CFR(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR3_CFR_SHIFT)) & I2S_TCR3_CFR_MASK) -/*! @} */ - -/*! @name TCR4 - SAI Transmit Configuration 4 Register */ -/*! @{ */ - -#define I2S_TCR4_FSD_MASK (0x1U) -#define I2S_TCR4_FSD_SHIFT (0U) -/*! FSD - Frame Sync Direction - * 0b0..Frame sync is generated externally in Slave mode. - * 0b1..Frame sync is generated internally in Master mode. - */ -#define I2S_TCR4_FSD(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FSD_SHIFT)) & I2S_TCR4_FSD_MASK) - -#define I2S_TCR4_FSP_MASK (0x2U) -#define I2S_TCR4_FSP_SHIFT (1U) -/*! FSP - Frame Sync Polarity - * 0b0..Frame sync is active high. - * 0b1..Frame sync is active low. - */ -#define I2S_TCR4_FSP(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FSP_SHIFT)) & I2S_TCR4_FSP_MASK) - -#define I2S_TCR4_ONDEM_MASK (0x4U) -#define I2S_TCR4_ONDEM_SHIFT (2U) -/*! ONDEM - On Demand Mode - * 0b0..Internal frame sync is generated continuously. - * 0b1..Internal frame sync is generated when the FIFO warning flag is clear. - */ -#define I2S_TCR4_ONDEM(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_ONDEM_SHIFT)) & I2S_TCR4_ONDEM_MASK) - -#define I2S_TCR4_FSE_MASK (0x8U) -#define I2S_TCR4_FSE_SHIFT (3U) -/*! FSE - Frame Sync Early - * 0b0..Frame sync asserts with the first bit of the frame. - * 0b1..Frame sync asserts one bit before the first bit of the frame. - */ -#define I2S_TCR4_FSE(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FSE_SHIFT)) & I2S_TCR4_FSE_MASK) - -#define I2S_TCR4_MF_MASK (0x10U) -#define I2S_TCR4_MF_SHIFT (4U) -/*! MF - MSB First - * 0b0..LSB is transmitted first. - * 0b1..MSB is transmitted first. - */ -#define I2S_TCR4_MF(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_MF_SHIFT)) & I2S_TCR4_MF_MASK) - -#define I2S_TCR4_CHMOD_MASK (0x20U) -#define I2S_TCR4_CHMOD_SHIFT (5U) -/*! CHMOD - Channel Mode - * 0b0..TDM mode, transmit data pins are tri-stated when slots are masked or channels are disabled. - * 0b1..Output mode, transmit data pins are never tri-stated and will output zero when slots are masked or channels are disabled. - */ -#define I2S_TCR4_CHMOD(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_CHMOD_SHIFT)) & I2S_TCR4_CHMOD_MASK) - -#define I2S_TCR4_SYWD_MASK (0x1F00U) -#define I2S_TCR4_SYWD_SHIFT (8U) -/*! SYWD - Sync Width - */ -#define I2S_TCR4_SYWD(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_SYWD_SHIFT)) & I2S_TCR4_SYWD_MASK) - -#define I2S_TCR4_FRSZ_MASK (0x1F0000U) -#define I2S_TCR4_FRSZ_SHIFT (16U) -/*! FRSZ - Frame size - */ -#define I2S_TCR4_FRSZ(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FRSZ_SHIFT)) & I2S_TCR4_FRSZ_MASK) - -#define I2S_TCR4_FPACK_MASK (0x3000000U) -#define I2S_TCR4_FPACK_SHIFT (24U) -/*! FPACK - FIFO Packing Mode - * 0b00..FIFO packing is disabled - * 0b01..Reserved - * 0b10..8-bit FIFO packing is enabled - * 0b11..16-bit FIFO packing is enabled - */ -#define I2S_TCR4_FPACK(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FPACK_SHIFT)) & I2S_TCR4_FPACK_MASK) - -#define I2S_TCR4_FCOMB_MASK (0xC000000U) -#define I2S_TCR4_FCOMB_SHIFT (26U) -/*! FCOMB - FIFO Combine Mode - * 0b00..FIFO combine mode disabled. - * 0b01..FIFO combine mode enabled on FIFO reads (from transmit shift registers). - * 0b10..FIFO combine mode enabled on FIFO writes (by software). - * 0b11..FIFO combine mode enabled on FIFO reads (from transmit shift registers) and writes (by software). - */ -#define I2S_TCR4_FCOMB(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FCOMB_SHIFT)) & I2S_TCR4_FCOMB_MASK) - -#define I2S_TCR4_FCONT_MASK (0x10000000U) -#define I2S_TCR4_FCONT_SHIFT (28U) -/*! FCONT - FIFO Continue on Error - * 0b0..On FIFO error, the SAI will continue from the start of the next frame after the FIFO error flag has been cleared. - * 0b1..On FIFO error, the SAI will continue from the same word that caused the FIFO error to set after the FIFO warning flag has been cleared. - */ -#define I2S_TCR4_FCONT(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR4_FCONT_SHIFT)) & I2S_TCR4_FCONT_MASK) -/*! @} */ - -/*! @name TCR5 - SAI Transmit Configuration 5 Register */ -/*! @{ */ - -#define I2S_TCR5_FBT_MASK (0x1F00U) -#define I2S_TCR5_FBT_SHIFT (8U) -/*! FBT - First Bit Shifted - */ -#define I2S_TCR5_FBT(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR5_FBT_SHIFT)) & I2S_TCR5_FBT_MASK) - -#define I2S_TCR5_W0W_MASK (0x1F0000U) -#define I2S_TCR5_W0W_SHIFT (16U) -/*! W0W - Word 0 Width - */ -#define I2S_TCR5_W0W(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR5_W0W_SHIFT)) & I2S_TCR5_W0W_MASK) - -#define I2S_TCR5_WNW_MASK (0x1F000000U) -#define I2S_TCR5_WNW_SHIFT (24U) -/*! WNW - Word N Width - */ -#define I2S_TCR5_WNW(x) (((uint32_t)(((uint32_t)(x)) << I2S_TCR5_WNW_SHIFT)) & I2S_TCR5_WNW_MASK) -/*! @} */ - -/*! @name TDR - SAI Transmit Data Register */ -/*! @{ */ - -#define I2S_TDR_TDR_MASK (0xFFFFFFFFU) -#define I2S_TDR_TDR_SHIFT (0U) -/*! TDR - Transmit Data Register - */ -#define I2S_TDR_TDR(x) (((uint32_t)(((uint32_t)(x)) << I2S_TDR_TDR_SHIFT)) & I2S_TDR_TDR_MASK) -/*! @} */ - -/* The count of I2S_TDR */ -#define I2S_TDR_COUNT (4U) - -/*! @name TFR - SAI Transmit FIFO Register */ -/*! @{ */ - -#define I2S_TFR_RFP_MASK (0x3FU) -#define I2S_TFR_RFP_SHIFT (0U) -/*! RFP - Read FIFO Pointer - */ -#define I2S_TFR_RFP(x) (((uint32_t)(((uint32_t)(x)) << I2S_TFR_RFP_SHIFT)) & I2S_TFR_RFP_MASK) - -#define I2S_TFR_WFP_MASK (0x3F0000U) -#define I2S_TFR_WFP_SHIFT (16U) -/*! WFP - Write FIFO Pointer - */ -#define I2S_TFR_WFP(x) (((uint32_t)(((uint32_t)(x)) << I2S_TFR_WFP_SHIFT)) & I2S_TFR_WFP_MASK) - -#define I2S_TFR_WCP_MASK (0x80000000U) -#define I2S_TFR_WCP_SHIFT (31U) -/*! WCP - Write Channel Pointer - * 0b0..No effect. - * 0b1..FIFO combine is enabled for FIFO writes and this FIFO will be written on the next FIFO write. - */ -#define I2S_TFR_WCP(x) (((uint32_t)(((uint32_t)(x)) << I2S_TFR_WCP_SHIFT)) & I2S_TFR_WCP_MASK) -/*! @} */ - -/* The count of I2S_TFR */ -#define I2S_TFR_COUNT (4U) - -/*! @name TMR - SAI Transmit Mask Register */ -/*! @{ */ - -#define I2S_TMR_TWM_MASK (0xFFFFFFFFU) -#define I2S_TMR_TWM_SHIFT (0U) -/*! TWM - Transmit Word Mask - * 0b00000000000000000000000000000000..Word N is enabled. - * 0b00000000000000000000000000000001..Word N is masked. The transmit data pins are tri-stated or drive zero when masked. - */ -#define I2S_TMR_TWM(x) (((uint32_t)(((uint32_t)(x)) << I2S_TMR_TWM_SHIFT)) & I2S_TMR_TWM_MASK) -/*! @} */ - -/*! @name RCSR - SAI Receive Control Register */ -/*! @{ */ - -#define I2S_RCSR_FRDE_MASK (0x1U) -#define I2S_RCSR_FRDE_SHIFT (0U) -/*! FRDE - FIFO Request DMA Enable - * 0b0..Disables the DMA request. - * 0b1..Enables the DMA request. - */ -#define I2S_RCSR_FRDE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FRDE_SHIFT)) & I2S_RCSR_FRDE_MASK) - -#define I2S_RCSR_FWDE_MASK (0x2U) -#define I2S_RCSR_FWDE_SHIFT (1U) -/*! FWDE - FIFO Warning DMA Enable - * 0b0..Disables the DMA request. - * 0b1..Enables the DMA request. - */ -#define I2S_RCSR_FWDE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FWDE_SHIFT)) & I2S_RCSR_FWDE_MASK) - -#define I2S_RCSR_FRIE_MASK (0x100U) -#define I2S_RCSR_FRIE_SHIFT (8U) -/*! FRIE - FIFO Request Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_RCSR_FRIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FRIE_SHIFT)) & I2S_RCSR_FRIE_MASK) - -#define I2S_RCSR_FWIE_MASK (0x200U) -#define I2S_RCSR_FWIE_SHIFT (9U) -/*! FWIE - FIFO Warning Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_RCSR_FWIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FWIE_SHIFT)) & I2S_RCSR_FWIE_MASK) - -#define I2S_RCSR_FEIE_MASK (0x400U) -#define I2S_RCSR_FEIE_SHIFT (10U) -/*! FEIE - FIFO Error Interrupt Enable - * 0b0..Disables the interrupt. - * 0b1..Enables the interrupt. - */ -#define I2S_RCSR_FEIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FEIE_SHIFT)) & I2S_RCSR_FEIE_MASK) - -#define I2S_RCSR_SEIE_MASK (0x800U) -#define I2S_RCSR_SEIE_SHIFT (11U) -/*! SEIE - Sync Error Interrupt Enable - * 0b0..Disables interrupt. - * 0b1..Enables interrupt. - */ -#define I2S_RCSR_SEIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_SEIE_SHIFT)) & I2S_RCSR_SEIE_MASK) - -#define I2S_RCSR_WSIE_MASK (0x1000U) -#define I2S_RCSR_WSIE_SHIFT (12U) -/*! WSIE - Word Start Interrupt Enable - * 0b0..Disables interrupt. - * 0b1..Enables interrupt. - */ -#define I2S_RCSR_WSIE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_WSIE_SHIFT)) & I2S_RCSR_WSIE_MASK) - -#define I2S_RCSR_FRF_MASK (0x10000U) -#define I2S_RCSR_FRF_SHIFT (16U) -/*! FRF - FIFO Request Flag - * 0b0..Receive FIFO watermark not reached. - * 0b1..Receive FIFO watermark has been reached. - */ -#define I2S_RCSR_FRF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FRF_SHIFT)) & I2S_RCSR_FRF_MASK) - -#define I2S_RCSR_FWF_MASK (0x20000U) -#define I2S_RCSR_FWF_SHIFT (17U) -/*! FWF - FIFO Warning Flag - * 0b0..No enabled receive FIFO is full. - * 0b1..Enabled receive FIFO is full. - */ -#define I2S_RCSR_FWF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FWF_SHIFT)) & I2S_RCSR_FWF_MASK) - -#define I2S_RCSR_FEF_MASK (0x40000U) -#define I2S_RCSR_FEF_SHIFT (18U) -/*! FEF - FIFO Error Flag - * 0b0..Receive overflow not detected. - * 0b1..Receive overflow detected. - */ -#define I2S_RCSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FEF_SHIFT)) & I2S_RCSR_FEF_MASK) - -#define I2S_RCSR_SEF_MASK (0x80000U) -#define I2S_RCSR_SEF_SHIFT (19U) -/*! SEF - Sync Error Flag - * 0b0..Sync error not detected. - * 0b1..Frame sync error detected. - */ -#define I2S_RCSR_SEF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_SEF_SHIFT)) & I2S_RCSR_SEF_MASK) - -#define I2S_RCSR_WSF_MASK (0x100000U) -#define I2S_RCSR_WSF_SHIFT (20U) -/*! WSF - Word Start Flag - * 0b0..Start of word not detected. - * 0b1..Start of word detected. - */ -#define I2S_RCSR_WSF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_WSF_SHIFT)) & I2S_RCSR_WSF_MASK) - -#define I2S_RCSR_SR_MASK (0x1000000U) -#define I2S_RCSR_SR_SHIFT (24U) -/*! SR - Software Reset - * 0b0..No effect. - * 0b1..Software reset. - */ -#define I2S_RCSR_SR(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_SR_SHIFT)) & I2S_RCSR_SR_MASK) - -#define I2S_RCSR_FR_MASK (0x2000000U) -#define I2S_RCSR_FR_SHIFT (25U) -/*! FR - FIFO Reset - * 0b0..No effect. - * 0b1..FIFO reset. - */ -#define I2S_RCSR_FR(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_FR_SHIFT)) & I2S_RCSR_FR_MASK) - -#define I2S_RCSR_BCE_MASK (0x10000000U) -#define I2S_RCSR_BCE_SHIFT (28U) -/*! BCE - Bit Clock Enable - * 0b0..Receive bit clock is disabled. - * 0b1..Receive bit clock is enabled. - */ -#define I2S_RCSR_BCE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_BCE_SHIFT)) & I2S_RCSR_BCE_MASK) - -#define I2S_RCSR_DBGE_MASK (0x20000000U) -#define I2S_RCSR_DBGE_SHIFT (29U) -/*! DBGE - Debug Enable - * 0b0..Receiver is disabled in Debug mode, after completing the current frame. - * 0b1..Receiver is enabled in Debug mode. - */ -#define I2S_RCSR_DBGE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_DBGE_SHIFT)) & I2S_RCSR_DBGE_MASK) - -#define I2S_RCSR_STOPE_MASK (0x40000000U) -#define I2S_RCSR_STOPE_SHIFT (30U) -/*! STOPE - Stop Enable - * 0b0..Receiver disabled in Stop mode. - * 0b1..Receiver enabled in Stop mode. - */ -#define I2S_RCSR_STOPE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_STOPE_SHIFT)) & I2S_RCSR_STOPE_MASK) - -#define I2S_RCSR_RE_MASK (0x80000000U) -#define I2S_RCSR_RE_SHIFT (31U) -/*! RE - Receiver Enable - * 0b0..Receiver is disabled. - * 0b1..Receiver is enabled, or receiver has been disabled and has not yet reached end of frame. - */ -#define I2S_RCSR_RE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCSR_RE_SHIFT)) & I2S_RCSR_RE_MASK) -/*! @} */ - -/*! @name RCR1 - SAI Receive Configuration 1 Register */ -/*! @{ */ - -#define I2S_RCR1_RFW_MASK (0x1FU) -#define I2S_RCR1_RFW_SHIFT (0U) -/*! RFW - Receive FIFO Watermark - */ -#define I2S_RCR1_RFW(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR1_RFW_SHIFT)) & I2S_RCR1_RFW_MASK) -/*! @} */ - -/*! @name RCR2 - SAI Receive Configuration 2 Register */ -/*! @{ */ - -#define I2S_RCR2_DIV_MASK (0xFFU) -#define I2S_RCR2_DIV_SHIFT (0U) -/*! DIV - Bit Clock Divide - */ -#define I2S_RCR2_DIV(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_DIV_SHIFT)) & I2S_RCR2_DIV_MASK) - -#define I2S_RCR2_BCD_MASK (0x1000000U) -#define I2S_RCR2_BCD_SHIFT (24U) -/*! BCD - Bit Clock Direction - * 0b0..Bit clock is generated externally in Slave mode. - * 0b1..Bit clock is generated internally in Master mode. - */ -#define I2S_RCR2_BCD(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_BCD_SHIFT)) & I2S_RCR2_BCD_MASK) - -#define I2S_RCR2_BCP_MASK (0x2000000U) -#define I2S_RCR2_BCP_SHIFT (25U) -/*! BCP - Bit Clock Polarity - * 0b0..Bit Clock is active high with drive outputs on rising edge and sample inputs on falling edge. - * 0b1..Bit Clock is active low with drive outputs on falling edge and sample inputs on rising edge. - */ -#define I2S_RCR2_BCP(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_BCP_SHIFT)) & I2S_RCR2_BCP_MASK) - -#define I2S_RCR2_MSEL_MASK (0xC000000U) -#define I2S_RCR2_MSEL_SHIFT (26U) -/*! MSEL - MCLK Select - * 0b00..Bus Clock selected. - * 0b01..Master Clock (MCLK) 1 option selected. - * 0b10..Master Clock (MCLK) 2 option selected. - * 0b11..Master Clock (MCLK) 3 option selected. - */ -#define I2S_RCR2_MSEL(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_MSEL_SHIFT)) & I2S_RCR2_MSEL_MASK) - -#define I2S_RCR2_BCI_MASK (0x10000000U) -#define I2S_RCR2_BCI_SHIFT (28U) -/*! BCI - Bit Clock Input - * 0b0..No effect. - * 0b1..Internal logic is clocked as if bit clock was externally generated. - */ -#define I2S_RCR2_BCI(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_BCI_SHIFT)) & I2S_RCR2_BCI_MASK) - -#define I2S_RCR2_BCS_MASK (0x20000000U) -#define I2S_RCR2_BCS_SHIFT (29U) -/*! BCS - Bit Clock Swap - * 0b0..Use the normal bit clock source. - * 0b1..Swap the bit clock source. - */ -#define I2S_RCR2_BCS(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_BCS_SHIFT)) & I2S_RCR2_BCS_MASK) - -#define I2S_RCR2_SYNC_MASK (0xC0000000U) -#define I2S_RCR2_SYNC_SHIFT (30U) -/*! SYNC - Synchronous Mode - * 0b00..Asynchronous mode. - * 0b01..Synchronous with transmitter. - * 0b10..Reserved. - * 0b11..Reserved. - */ -#define I2S_RCR2_SYNC(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR2_SYNC_SHIFT)) & I2S_RCR2_SYNC_MASK) -/*! @} */ - -/*! @name RCR3 - SAI Receive Configuration 3 Register */ -/*! @{ */ - -#define I2S_RCR3_WDFL_MASK (0x1FU) -#define I2S_RCR3_WDFL_SHIFT (0U) -/*! WDFL - Word Flag Configuration - */ -#define I2S_RCR3_WDFL(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR3_WDFL_SHIFT)) & I2S_RCR3_WDFL_MASK) - -#define I2S_RCR3_RCE_MASK (0xF0000U) /* Merged from fields with different position or width, of widths (1, 4), largest definition used */ -#define I2S_RCR3_RCE_SHIFT (16U) -/*! RCE - Receive Channel Enable - */ -#define I2S_RCR3_RCE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR3_RCE_SHIFT)) & I2S_RCR3_RCE_MASK) /* Merged from fields with different position or width, of widths (1, 4), largest definition used */ - -#define I2S_RCR3_CFR_MASK (0xF000000U) -#define I2S_RCR3_CFR_SHIFT (24U) -/*! CFR - Channel FIFO Reset - */ -#define I2S_RCR3_CFR(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR3_CFR_SHIFT)) & I2S_RCR3_CFR_MASK) -/*! @} */ - -/*! @name RCR4 - SAI Receive Configuration 4 Register */ -/*! @{ */ - -#define I2S_RCR4_FSD_MASK (0x1U) -#define I2S_RCR4_FSD_SHIFT (0U) -/*! FSD - Frame Sync Direction - * 0b0..Frame Sync is generated externally in Slave mode. - * 0b1..Frame Sync is generated internally in Master mode. - */ -#define I2S_RCR4_FSD(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FSD_SHIFT)) & I2S_RCR4_FSD_MASK) - -#define I2S_RCR4_FSP_MASK (0x2U) -#define I2S_RCR4_FSP_SHIFT (1U) -/*! FSP - Frame Sync Polarity - * 0b0..Frame sync is active high. - * 0b1..Frame sync is active low. - */ -#define I2S_RCR4_FSP(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FSP_SHIFT)) & I2S_RCR4_FSP_MASK) - -#define I2S_RCR4_ONDEM_MASK (0x4U) -#define I2S_RCR4_ONDEM_SHIFT (2U) -/*! ONDEM - On Demand Mode - * 0b0..Internal frame sync is generated continuously. - * 0b1..Internal frame sync is generated when the FIFO warning flag is clear. - */ -#define I2S_RCR4_ONDEM(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_ONDEM_SHIFT)) & I2S_RCR4_ONDEM_MASK) - -#define I2S_RCR4_FSE_MASK (0x8U) -#define I2S_RCR4_FSE_SHIFT (3U) -/*! FSE - Frame Sync Early - * 0b0..Frame sync asserts with the first bit of the frame. - * 0b1..Frame sync asserts one bit before the first bit of the frame. - */ -#define I2S_RCR4_FSE(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FSE_SHIFT)) & I2S_RCR4_FSE_MASK) - -#define I2S_RCR4_MF_MASK (0x10U) -#define I2S_RCR4_MF_SHIFT (4U) -/*! MF - MSB First - * 0b0..LSB is received first. - * 0b1..MSB is received first. - */ -#define I2S_RCR4_MF(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_MF_SHIFT)) & I2S_RCR4_MF_MASK) - -#define I2S_RCR4_SYWD_MASK (0x1F00U) -#define I2S_RCR4_SYWD_SHIFT (8U) -/*! SYWD - Sync Width - */ -#define I2S_RCR4_SYWD(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_SYWD_SHIFT)) & I2S_RCR4_SYWD_MASK) - -#define I2S_RCR4_FRSZ_MASK (0x1F0000U) -#define I2S_RCR4_FRSZ_SHIFT (16U) -/*! FRSZ - Frame Size - */ -#define I2S_RCR4_FRSZ(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FRSZ_SHIFT)) & I2S_RCR4_FRSZ_MASK) - -#define I2S_RCR4_FPACK_MASK (0x3000000U) -#define I2S_RCR4_FPACK_SHIFT (24U) -/*! FPACK - FIFO Packing Mode - * 0b00..FIFO packing is disabled - * 0b01..Reserved. - * 0b10..8-bit FIFO packing is enabled - * 0b11..16-bit FIFO packing is enabled - */ -#define I2S_RCR4_FPACK(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FPACK_SHIFT)) & I2S_RCR4_FPACK_MASK) - -#define I2S_RCR4_FCOMB_MASK (0xC000000U) -#define I2S_RCR4_FCOMB_SHIFT (26U) -/*! FCOMB - FIFO Combine Mode - * 0b00..FIFO combine mode disabled. - * 0b01..FIFO combine mode enabled on FIFO writes (from receive shift registers). - * 0b10..FIFO combine mode enabled on FIFO reads (by software). - * 0b11..FIFO combine mode enabled on FIFO writes (from receive shift registers) and reads (by software). - */ -#define I2S_RCR4_FCOMB(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FCOMB_SHIFT)) & I2S_RCR4_FCOMB_MASK) - -#define I2S_RCR4_FCONT_MASK (0x10000000U) -#define I2S_RCR4_FCONT_SHIFT (28U) -/*! FCONT - FIFO Continue on Error - * 0b0..On FIFO error, the SAI will continue from the start of the next frame after the FIFO error flag has been cleared. - * 0b1..On FIFO error, the SAI will continue from the same word that caused the FIFO error to set after the FIFO warning flag has been cleared. - */ -#define I2S_RCR4_FCONT(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR4_FCONT_SHIFT)) & I2S_RCR4_FCONT_MASK) -/*! @} */ - -/*! @name RCR5 - SAI Receive Configuration 5 Register */ -/*! @{ */ - -#define I2S_RCR5_FBT_MASK (0x1F00U) -#define I2S_RCR5_FBT_SHIFT (8U) -/*! FBT - First Bit Shifted - */ -#define I2S_RCR5_FBT(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR5_FBT_SHIFT)) & I2S_RCR5_FBT_MASK) - -#define I2S_RCR5_W0W_MASK (0x1F0000U) -#define I2S_RCR5_W0W_SHIFT (16U) -/*! W0W - Word 0 Width - */ -#define I2S_RCR5_W0W(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR5_W0W_SHIFT)) & I2S_RCR5_W0W_MASK) - -#define I2S_RCR5_WNW_MASK (0x1F000000U) -#define I2S_RCR5_WNW_SHIFT (24U) -/*! WNW - Word N Width - */ -#define I2S_RCR5_WNW(x) (((uint32_t)(((uint32_t)(x)) << I2S_RCR5_WNW_SHIFT)) & I2S_RCR5_WNW_MASK) -/*! @} */ - -/*! @name RDR - SAI Receive Data Register */ -/*! @{ */ - -#define I2S_RDR_RDR_MASK (0xFFFFFFFFU) -#define I2S_RDR_RDR_SHIFT (0U) -/*! RDR - Receive Data Register - */ -#define I2S_RDR_RDR(x) (((uint32_t)(((uint32_t)(x)) << I2S_RDR_RDR_SHIFT)) & I2S_RDR_RDR_MASK) -/*! @} */ - -/* The count of I2S_RDR */ -#define I2S_RDR_COUNT (4U) - -/*! @name RFR - SAI Receive FIFO Register */ -/*! @{ */ - -#define I2S_RFR_RFP_MASK (0x3FU) -#define I2S_RFR_RFP_SHIFT (0U) -/*! RFP - Read FIFO Pointer - */ -#define I2S_RFR_RFP(x) (((uint32_t)(((uint32_t)(x)) << I2S_RFR_RFP_SHIFT)) & I2S_RFR_RFP_MASK) - -#define I2S_RFR_RCP_MASK (0x8000U) -#define I2S_RFR_RCP_SHIFT (15U) -/*! RCP - Receive Channel Pointer - * 0b0..No effect. - * 0b1..FIFO combine is enabled for FIFO reads and this FIFO will be read on the next FIFO read. - */ -#define I2S_RFR_RCP(x) (((uint32_t)(((uint32_t)(x)) << I2S_RFR_RCP_SHIFT)) & I2S_RFR_RCP_MASK) - -#define I2S_RFR_WFP_MASK (0x3F0000U) -#define I2S_RFR_WFP_SHIFT (16U) -/*! WFP - Write FIFO Pointer - */ -#define I2S_RFR_WFP(x) (((uint32_t)(((uint32_t)(x)) << I2S_RFR_WFP_SHIFT)) & I2S_RFR_WFP_MASK) -/*! @} */ - -/* The count of I2S_RFR */ -#define I2S_RFR_COUNT (4U) - -/*! @name RMR - SAI Receive Mask Register */ -/*! @{ */ - -#define I2S_RMR_RWM_MASK (0xFFFFFFFFU) -#define I2S_RMR_RWM_SHIFT (0U) -/*! RWM - Receive Word Mask - * 0b00000000000000000000000000000000..Word N is enabled. - * 0b00000000000000000000000000000001..Word N is masked. - */ -#define I2S_RMR_RWM(x) (((uint32_t)(((uint32_t)(x)) << I2S_RMR_RWM_SHIFT)) & I2S_RMR_RWM_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group I2S_Register_Masks */ - - -/* I2S - Peripheral instance base addresses */ -/** Peripheral SAI1 base address */ -#define SAI1_BASE (0x40384000u) -/** Peripheral SAI1 base pointer */ -#define SAI1 ((I2S_Type *)SAI1_BASE) -/** Peripheral SAI2 base address */ -#define SAI2_BASE (0x40388000u) -/** Peripheral SAI2 base pointer */ -#define SAI2 ((I2S_Type *)SAI2_BASE) -/** Peripheral SAI3 base address */ -#define SAI3_BASE (0x4038C000u) -/** Peripheral SAI3 base pointer */ -#define SAI3 ((I2S_Type *)SAI3_BASE) -/** Array initializer of I2S peripheral base addresses */ -#define I2S_BASE_ADDRS { 0u, SAI1_BASE, SAI2_BASE, SAI3_BASE } -/** Array initializer of I2S peripheral base pointers */ -#define I2S_BASE_PTRS { (I2S_Type *)0u, SAI1, SAI2, SAI3 } -/** Interrupt vectors for the I2S peripheral type */ -#define I2S_RX_IRQS { NotAvail_IRQn, SAI1_IRQn, SAI2_IRQn, SAI3_RX_IRQn } -#define I2S_TX_IRQS { NotAvail_IRQn, SAI1_IRQn, SAI2_IRQn, SAI3_TX_IRQn } - -/*! - * @} - */ /* end of group I2S_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- IOMUXC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_Peripheral_Access_Layer IOMUXC Peripheral Access Layer - * @{ - */ - -/** IOMUXC - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[20]; - __IO uint32_t SW_MUX_CTL_PAD[124]; /**< SW_MUX_CTL_PAD_GPIO_EMC_00 SW MUX Control Register..SW_MUX_CTL_PAD_GPIO_SD_B1_11 SW MUX Control Register, array offset: 0x14, array step: 0x4 */ - __IO uint32_t SW_PAD_CTL_PAD[124]; /**< SW_PAD_CTL_PAD_GPIO_EMC_00 SW PAD Control Register..SW_PAD_CTL_PAD_GPIO_SD_B1_11 SW PAD Control Register, array offset: 0x204, array step: 0x4 */ - __IO uint32_t SELECT_INPUT[154]; /**< ANATOP_USB_OTG1_ID_SELECT_INPUT DAISY Register..XBAR1_IN23_SELECT_INPUT DAISY Register, array offset: 0x3F4, array step: 0x4 */ -} IOMUXC_Type; - -/* ---------------------------------------------------------------------------- - -- IOMUXC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_Register_Masks IOMUXC Register Masks - * @{ - */ - -/*! @name SW_MUX_CTL_PAD - SW_MUX_CTL_PAD_GPIO_EMC_00 SW MUX Control Register..SW_MUX_CTL_PAD_GPIO_SD_B1_11 SW MUX Control Register */ -/*! @{ */ - -#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK (0x7U) -#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT (0U) -/*! MUX_MODE - MUX Mode Select Field. - * 0b000..Select mux mode: ALT0 mux port: SEMC_DATA00 of instance: semc - * 0b001..Select mux mode: ALT1 mux port: FLEXPWM4_PWMA00 of instance: flexpwm4 - * 0b010..Select mux mode: ALT2 mux port: LPSPI2_SCK of instance: lpspi2 - * 0b011..Select mux mode: ALT3 mux port: XBAR1_XBAR_IN02 of instance: xbar1 - * 0b100..Select mux mode: ALT4 mux port: FLEXIO1_FLEXIO00 of instance: flexio1 - * 0b101..Select mux mode: ALT5 mux port: GPIO4_IO00 of instance: gpio4 - */ -#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK) - -#define IOMUXC_SW_MUX_CTL_PAD_SION_MASK (0x10U) -#define IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT (4U) -/*! SION - Software Input On Field. - * 0b1..Force input path of pad GPIO_EMC_00 - * 0b0..Input Path is determined by functionality - */ -#define IOMUXC_SW_MUX_CTL_PAD_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_SION_MASK) -/*! @} */ - -/* The count of IOMUXC_SW_MUX_CTL_PAD */ -#define IOMUXC_SW_MUX_CTL_PAD_COUNT (124U) - -/*! @name SW_PAD_CTL_PAD - SW_PAD_CTL_PAD_GPIO_EMC_00 SW PAD Control Register..SW_PAD_CTL_PAD_GPIO_SD_B1_11 SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SW_PAD_CTL_PAD_SRE_MASK (0x1U) -#define IOMUXC_SW_PAD_CTL_PAD_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SW_PAD_CTL_PAD_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_SRE_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_SRE_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK (0x38U) -#define IOMUXC_SW_PAD_CTL_PAD_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SW_PAD_CTL_PAD_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_DSE_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_DSE_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_SPEED_MASK (0xC0U) -#define IOMUXC_SW_PAD_CTL_PAD_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b00..low(50MHz) - * 0b01..medium(100MHz) - * 0b10..medium(100MHz) - * 0b11..max(200MHz) - */ -#define IOMUXC_SW_PAD_CTL_PAD_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_SPEED_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_SPEED_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_ODE_MASK (0x800U) -#define IOMUXC_SW_PAD_CTL_PAD_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SW_PAD_CTL_PAD_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_ODE_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_ODE_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_PKE_MASK (0x1000U) -#define IOMUXC_SW_PAD_CTL_PAD_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SW_PAD_CTL_PAD_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_PKE_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_PKE_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_PUE_MASK (0x2000U) -#define IOMUXC_SW_PAD_CTL_PAD_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SW_PAD_CTL_PAD_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_PUE_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_PUE_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK (0xC000U) -#define IOMUXC_SW_PAD_CTL_PAD_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SW_PAD_CTL_PAD_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_PUS_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_PUS_MASK) - -#define IOMUXC_SW_PAD_CTL_PAD_HYS_MASK (0x10000U) -#define IOMUXC_SW_PAD_CTL_PAD_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SW_PAD_CTL_PAD_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_PAD_CTL_PAD_HYS_SHIFT)) & IOMUXC_SW_PAD_CTL_PAD_HYS_MASK) -/*! @} */ - -/* The count of IOMUXC_SW_PAD_CTL_PAD */ -#define IOMUXC_SW_PAD_CTL_PAD_COUNT (124U) - -/*! @name SELECT_INPUT - ANATOP_USB_OTG1_ID_SELECT_INPUT DAISY Register..XBAR1_IN23_SELECT_INPUT DAISY Register */ -/*! @{ */ - -#define IOMUXC_SELECT_INPUT_DAISY_MASK (0x7U) /* Merged from fields with different position or width, of widths (1, 2, 3), largest definition used */ -#define IOMUXC_SELECT_INPUT_DAISY_SHIFT (0U) -/*! DAISY - Selecting Pads Involved in Daisy Chain. - * 0b0..Selecting Pad: GPIO_AD_B0_01 for Mode: ALT3 - * 0b1..Selecting Pad: GPIO_AD_B1_02 for Mode: ALT0 - */ -#define IOMUXC_SELECT_INPUT_DAISY(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SELECT_INPUT_DAISY_SHIFT)) & IOMUXC_SELECT_INPUT_DAISY_MASK) /* Merged from fields with different position or width, of widths (1, 2, 3), largest definition used */ -/*! @} */ - -/* The count of IOMUXC_SELECT_INPUT */ -#define IOMUXC_SELECT_INPUT_COUNT (154U) - - -/*! - * @} - */ /* end of group IOMUXC_Register_Masks */ - - -/* IOMUXC - Peripheral instance base addresses */ -/** Peripheral IOMUXC base address */ -#define IOMUXC_BASE (0x401F8000u) -/** Peripheral IOMUXC base pointer */ -#define IOMUXC ((IOMUXC_Type *)IOMUXC_BASE) -/** Array initializer of IOMUXC peripheral base addresses */ -#define IOMUXC_BASE_ADDRS { IOMUXC_BASE } -/** Array initializer of IOMUXC peripheral base pointers */ -#define IOMUXC_BASE_PTRS { IOMUXC } - -/*! - * @} - */ /* end of group IOMUXC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- IOMUXC_GPR Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_GPR_Peripheral_Access_Layer IOMUXC_GPR Peripheral Access Layer - * @{ - */ - -/** IOMUXC_GPR - Register Layout Typedef */ -typedef struct { - uint32_t GPR0; /**< GPR0 General Purpose Register, offset: 0x0 */ - __IO uint32_t GPR1; /**< GPR1 General Purpose Register, offset: 0x4 */ - __IO uint32_t GPR2; /**< GPR2 General Purpose Register, offset: 0x8 */ - __IO uint32_t GPR3; /**< GPR3 General Purpose Register, offset: 0xC */ - __IO uint32_t GPR4; /**< GPR4 General Purpose Register, offset: 0x10 */ - __IO uint32_t GPR5; /**< GPR5 General Purpose Register, offset: 0x14 */ - __IO uint32_t GPR6; /**< GPR6 General Purpose Register, offset: 0x18 */ - __IO uint32_t GPR7; /**< GPR7 General Purpose Register, offset: 0x1C */ - __IO uint32_t GPR8; /**< GPR8 General Purpose Register, offset: 0x20 */ - uint32_t GPR9; /**< GPR9 General Purpose Register, offset: 0x24 */ - __IO uint32_t GPR10; /**< GPR10 General Purpose Register, offset: 0x28 */ - __IO uint32_t GPR11; /**< GPR11 General Purpose Register, offset: 0x2C */ - __IO uint32_t GPR12; /**< GPR12 General Purpose Register, offset: 0x30 */ - __IO uint32_t GPR13; /**< GPR13 General Purpose Register, offset: 0x34 */ - __IO uint32_t GPR14; /**< GPR14 General Purpose Register, offset: 0x38 */ - uint32_t GPR15; /**< GPR15 General Purpose Register, offset: 0x3C */ - __IO uint32_t GPR16; /**< GPR16 General Purpose Register, offset: 0x40 */ - __IO uint32_t GPR17; /**< GPR17 General Purpose Register, offset: 0x44 */ - __IO uint32_t GPR18; /**< GPR18 General Purpose Register, offset: 0x48 */ - __IO uint32_t GPR19; /**< GPR19 General Purpose Register, offset: 0x4C */ - __IO uint32_t GPR20; /**< GPR20 General Purpose Register, offset: 0x50 */ - __IO uint32_t GPR21; /**< GPR21 General Purpose Register, offset: 0x54 */ - __IO uint32_t GPR22; /**< GPR22 General Purpose Register, offset: 0x58 */ - __IO uint32_t GPR23; /**< GPR23 General Purpose Register, offset: 0x5C */ - __IO uint32_t GPR24; /**< GPR24 General Purpose Register, offset: 0x60 */ - __IO uint32_t GPR25; /**< GPR25 General Purpose Register, offset: 0x64 */ -} IOMUXC_GPR_Type; - -/* ---------------------------------------------------------------------------- - -- IOMUXC_GPR Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_GPR_Register_Masks IOMUXC_GPR Register Masks - * @{ - */ - -/*! @name GPR1 - GPR1 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_MASK (0x7U) -#define IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_SHIFT (0U) -/*! SAI1_MCLK1_SEL - * 0b000..ccm.ssi1_clk_root - * 0b001..ccm.ssi2_clk_root - * 0b010..ccm.ssi3_clk_root - * 0b011..iomux.sai1_ipg_clk_sai_mclk - * 0b100..iomux.sai2_ipg_clk_sai_mclk - * 0b101..iomux.sai3_ipg_clk_sai_mclk - * 0b110..Reserved - * 0b111..Reserved - */ -#define IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_SHIFT)) & IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_MASK) - -#define IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_MASK (0x38U) -#define IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_SHIFT (3U) -/*! SAI1_MCLK2_SEL - * 0b000..ccm.ssi1_clk_root - * 0b001..ccm.ssi2_clk_root - * 0b010..ccm.ssi3_clk_root - * 0b011..iomux.sai1_ipg_clk_sai_mclk - * 0b100..iomux.sai2_ipg_clk_sai_mclk - * 0b101..iomux.sai3_ipg_clk_sai_mclk - * 0b110..Reserved - * 0b111..Reserved - */ -#define IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_SHIFT)) & IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_MASK) - -#define IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_MASK (0xC0U) -#define IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_SHIFT (6U) -/*! SAI1_MCLK3_SEL - * 0b00..ccm.spdif0_clk_root - * 0b01..iomux.spdif_tx_clk2 - * 0b10..spdif.spdif_srclk - * 0b11..spdif.spdif_outclock - */ -#define IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_SHIFT)) & IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_MASK) - -#define IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_MASK (0x300U) -#define IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_SHIFT (8U) -/*! SAI2_MCLK3_SEL - * 0b00..ccm.spdif0_clk_root - * 0b01..iomux.spdif_tx_clk2 - * 0b10..spdif.spdif_srclk - * 0b11..spdif.spdif_outclock - */ -#define IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_SHIFT)) & IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_MASK) - -#define IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_MASK (0xC00U) -#define IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_SHIFT (10U) -/*! SAI3_MCLK3_SEL - * 0b00..ccm.spdif0_clk_root - * 0b01..iomux.spdif_tx_clk2 - * 0b10..spdif.spdif_srclk - * 0b11..spdif.spdif_outclock - */ -#define IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_SHIFT)) & IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_MASK) - -#define IOMUXC_GPR_GPR1_GINT_MASK (0x1000U) -#define IOMUXC_GPR_GPR1_GINT_SHIFT (12U) -/*! GINT - * 0b0..Global interrupt request is not asserted. - * 0b1..Global interrupt request is asserted. - */ -#define IOMUXC_GPR_GPR1_GINT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_GINT_SHIFT)) & IOMUXC_GPR_GPR1_GINT_MASK) - -#define IOMUXC_GPR_GPR1_ENET1_CLK_SEL_MASK (0x2000U) -#define IOMUXC_GPR_GPR1_ENET1_CLK_SEL_SHIFT (13U) -/*! ENET1_CLK_SEL - * 0b0..ENET1 TX reference clock driven by ref_enetpll0. This clock is also output to pins via the IOMUX. ENET_REF_CLK1 function. - * 0b1..Gets ENET1 TX reference clock from the ENET1_TX_CLK pin. In this use case, an external OSC provides the - * clock for both the external PHY and the internal controller. - */ -#define IOMUXC_GPR_GPR1_ENET1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_ENET1_CLK_SEL_SHIFT)) & IOMUXC_GPR_GPR1_ENET1_CLK_SEL_MASK) - -#define IOMUXC_GPR_GPR1_USB_EXP_MODE_MASK (0x8000U) -#define IOMUXC_GPR_GPR1_USB_EXP_MODE_SHIFT (15U) -/*! USB_EXP_MODE - * 0b0..Exposure mode is disabled. - * 0b1..Exposure mode is enabled. - */ -#define IOMUXC_GPR_GPR1_USB_EXP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_USB_EXP_MODE_SHIFT)) & IOMUXC_GPR_GPR1_USB_EXP_MODE_MASK) - -#define IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK (0x20000U) -#define IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_SHIFT (17U) -/*! ENET1_TX_CLK_DIR - * 0b0..ENET1_TX_CLK output driver is disabled and ENET_REF_CLK1 is a clock input. - * 0b1..ENET1_TX_CLK output driver is enabled and ENET_REF_CLK1 is an output driven by ref_enetpll0. - */ -#define IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_SHIFT)) & IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK) - -#define IOMUXC_GPR_GPR1_SAI1_MCLK_DIR_MASK (0x80000U) -#define IOMUXC_GPR_GPR1_SAI1_MCLK_DIR_SHIFT (19U) -/*! SAI1_MCLK_DIR - * 0b0..sai1.MCLK is input signal - * 0b1..sai1.MCLK is output signal - */ -#define IOMUXC_GPR_GPR1_SAI1_MCLK_DIR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI1_MCLK_DIR_SHIFT)) & IOMUXC_GPR_GPR1_SAI1_MCLK_DIR_MASK) - -#define IOMUXC_GPR_GPR1_SAI2_MCLK_DIR_MASK (0x100000U) -#define IOMUXC_GPR_GPR1_SAI2_MCLK_DIR_SHIFT (20U) -/*! SAI2_MCLK_DIR - * 0b0..sai2.MCLK is input signal - * 0b1..sai2.MCLK is output signal - */ -#define IOMUXC_GPR_GPR1_SAI2_MCLK_DIR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI2_MCLK_DIR_SHIFT)) & IOMUXC_GPR_GPR1_SAI2_MCLK_DIR_MASK) - -#define IOMUXC_GPR_GPR1_SAI3_MCLK_DIR_MASK (0x200000U) -#define IOMUXC_GPR_GPR1_SAI3_MCLK_DIR_SHIFT (21U) -/*! SAI3_MCLK_DIR - * 0b0..sai3.MCLK is input signal - * 0b1..sai3.MCLK is output signal - */ -#define IOMUXC_GPR_GPR1_SAI3_MCLK_DIR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_SAI3_MCLK_DIR_SHIFT)) & IOMUXC_GPR_GPR1_SAI3_MCLK_DIR_MASK) - -#define IOMUXC_GPR_GPR1_EXC_MON_MASK (0x400000U) -#define IOMUXC_GPR_GPR1_EXC_MON_SHIFT (22U) -/*! EXC_MON - * 0b0..OKAY response - * 0b1..SLVError response - */ -#define IOMUXC_GPR_GPR1_EXC_MON(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_EXC_MON_SHIFT)) & IOMUXC_GPR_GPR1_EXC_MON_MASK) - -#define IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN_MASK (0x800000U) -#define IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN_SHIFT (23U) -/*! ENET_IPG_CLK_S_EN - * 0b0..ipg_clk_s is gated when there is no IPS access - * 0b1..ipg_clk_s is always on - */ -#define IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN_SHIFT)) & IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN_MASK) - -#define IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN_MASK (0x80000000U) -#define IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN_SHIFT (31U) -/*! CM7_FORCE_HCLK_EN - * 0b0..AHB clock is not running (gated) - * 0b1..AHB clock is running (enabled) - */ -#define IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN_SHIFT)) & IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN_MASK) -/*! @} */ - -/*! @name GPR2 - GPR2 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR2_L2_MEM_EN_POWERSAVING_MASK (0x1000U) -#define IOMUXC_GPR_GPR2_L2_MEM_EN_POWERSAVING_SHIFT (12U) -/*! L2_MEM_EN_POWERSAVING - * 0b0..none memory power saving features enabled, SHUTDOWN/DEEPSLEEP/LIGHTSLEEP will have no effect - * 0b1..memory power saving features enabled, set SHUTDOWN/DEEPSLEEP/LIGHTSLEEP(priority high to low) to enable power saving levels - */ -#define IOMUXC_GPR_GPR2_L2_MEM_EN_POWERSAVING(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_L2_MEM_EN_POWERSAVING_SHIFT)) & IOMUXC_GPR_GPR2_L2_MEM_EN_POWERSAVING_MASK) - -#define IOMUXC_GPR_GPR2_L2_MEM_DEEPSLEEP_MASK (0x4000U) -#define IOMUXC_GPR_GPR2_L2_MEM_DEEPSLEEP_SHIFT (14U) -/*! L2_MEM_DEEPSLEEP - * 0b0..no force sleep control supported, memory deep sleep mode only entered when whole system in stop mode - * 0b1..force memory into deep sleep mode - */ -#define IOMUXC_GPR_GPR2_L2_MEM_DEEPSLEEP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_L2_MEM_DEEPSLEEP_SHIFT)) & IOMUXC_GPR_GPR2_L2_MEM_DEEPSLEEP_MASK) - -#define IOMUXC_GPR_GPR2_MQS_CLK_DIV_MASK (0xFF0000U) -#define IOMUXC_GPR_GPR2_MQS_CLK_DIV_SHIFT (16U) -/*! MQS_CLK_DIV - Divider ratio control for mclk from hmclk. mclk frequency = 1/(n+1) * hmclk frequency. - * 0b00000000..mclk frequency = 1/1 * hmclk frequency - * 0b00000001..mclk frequency = 1/2 * hmclk frequency - * 0b00000010..mclk frequency = 1/3 * hmclk frequency - * 0b00000011..mclk frequency = 1/4 * hmclk frequency - * 0b00000100..mclk frequency = 1/5 * hmclk frequency - * 0b00000101..mclk frequency = 1/6 * hmclk frequency - * 0b00000110..mclk frequency = 1/7 * hmclk frequency - * 0b00000111..mclk frequency = 1/8 * hmclk frequency - * 0b00001000..mclk frequency = 1/9 * hmclk frequency - * 0b00001001..mclk frequency = 1/10 * hmclk frequency - * 0b00001010..mclk frequency = 1/11 * hmclk frequency - * 0b00001011..mclk frequency = 1/12 * hmclk frequency - * 0b00001100..mclk frequency = 1/13 * hmclk frequency - * 0b00001101..mclk frequency = 1/14 * hmclk frequency - * 0b00001110..mclk frequency = 1/15 * hmclk frequency - * 0b00001111..mclk frequency = 1/16 * hmclk frequency - * 0b00010000..mclk frequency = 1/17 * hmclk frequency - * 0b00010001..mclk frequency = 1/18 * hmclk frequency - * 0b00010010..mclk frequency = 1/19 * hmclk frequency - * 0b00010011..mclk frequency = 1/20 * hmclk frequency - * 0b00010100..mclk frequency = 1/21 * hmclk frequency - * 0b00010101..mclk frequency = 1/22 * hmclk frequency - * 0b00010110..mclk frequency = 1/23 * hmclk frequency - * 0b00010111..mclk frequency = 1/24 * hmclk frequency - * 0b00011000..mclk frequency = 1/25 * hmclk frequency - * 0b00011001..mclk frequency = 1/26 * hmclk frequency - * 0b00011010..mclk frequency = 1/27 * hmclk frequency - * 0b00011011..mclk frequency = 1/28 * hmclk frequency - * 0b00011100..mclk frequency = 1/29 * hmclk frequency - * 0b00011101..mclk frequency = 1/30 * hmclk frequency - * 0b00011110..mclk frequency = 1/31 * hmclk frequency - * 0b00011111..mclk frequency = 1/32 * hmclk frequency - * 0b00100000..mclk frequency = 1/33 * hmclk frequency - * 0b00100001..mclk frequency = 1/34 * hmclk frequency - * 0b00100010..mclk frequency = 1/35 * hmclk frequency - * 0b00100011..mclk frequency = 1/36 * hmclk frequency - * 0b00100100..mclk frequency = 1/37 * hmclk frequency - * 0b00100101..mclk frequency = 1/38 * hmclk frequency - * 0b00100110..mclk frequency = 1/39 * hmclk frequency - * 0b00100111..mclk frequency = 1/40 * hmclk frequency - * 0b00101000..mclk frequency = 1/41 * hmclk frequency - * 0b00101001..mclk frequency = 1/42 * hmclk frequency - * 0b00101010..mclk frequency = 1/43 * hmclk frequency - * 0b00101011..mclk frequency = 1/44 * hmclk frequency - * 0b00101100..mclk frequency = 1/45 * hmclk frequency - * 0b00101101..mclk frequency = 1/46 * hmclk frequency - * 0b00101110..mclk frequency = 1/47 * hmclk frequency - * 0b00101111..mclk frequency = 1/48 * hmclk frequency - * 0b00110000..mclk frequency = 1/49 * hmclk frequency - * 0b00110001..mclk frequency = 1/50 * hmclk frequency - * 0b00110010..mclk frequency = 1/51 * hmclk frequency - * 0b00110011..mclk frequency = 1/52 * hmclk frequency - * 0b00110100..mclk frequency = 1/53 * hmclk frequency - * 0b00110101..mclk frequency = 1/54 * hmclk frequency - * 0b00110110..mclk frequency = 1/55 * hmclk frequency - * 0b00110111..mclk frequency = 1/56 * hmclk frequency - * 0b00111000..mclk frequency = 1/57 * hmclk frequency - * 0b00111001..mclk frequency = 1/58 * hmclk frequency - * 0b00111010..mclk frequency = 1/59 * hmclk frequency - * 0b00111011..mclk frequency = 1/60 * hmclk frequency - * 0b00111100..mclk frequency = 1/61 * hmclk frequency - * 0b00111101..mclk frequency = 1/62 * hmclk frequency - * 0b00111110..mclk frequency = 1/63 * hmclk frequency - * 0b00111111..mclk frequency = 1/64 * hmclk frequency - * 0b01000000..mclk frequency = 1/65 * hmclk frequency - * 0b01000001..mclk frequency = 1/66 * hmclk frequency - * 0b01000010..mclk frequency = 1/67 * hmclk frequency - * 0b01000011..mclk frequency = 1/68 * hmclk frequency - * 0b01000100..mclk frequency = 1/69 * hmclk frequency - * 0b01000101..mclk frequency = 1/70 * hmclk frequency - * 0b01000110..mclk frequency = 1/71 * hmclk frequency - * 0b01000111..mclk frequency = 1/72 * hmclk frequency - * 0b01001000..mclk frequency = 1/73 * hmclk frequency - * 0b01001001..mclk frequency = 1/74 * hmclk frequency - * 0b01001010..mclk frequency = 1/75 * hmclk frequency - * 0b01001011..mclk frequency = 1/76 * hmclk frequency - * 0b01001100..mclk frequency = 1/77 * hmclk frequency - * 0b01001101..mclk frequency = 1/78 * hmclk frequency - * 0b01001110..mclk frequency = 1/79 * hmclk frequency - * 0b01001111..mclk frequency = 1/80 * hmclk frequency - * 0b01010000..mclk frequency = 1/81 * hmclk frequency - * 0b01010001..mclk frequency = 1/82 * hmclk frequency - * 0b01010010..mclk frequency = 1/83 * hmclk frequency - * 0b01010011..mclk frequency = 1/84 * hmclk frequency - * 0b01010100..mclk frequency = 1/85 * hmclk frequency - * 0b01010101..mclk frequency = 1/86 * hmclk frequency - * 0b01010110..mclk frequency = 1/87 * hmclk frequency - * 0b01010111..mclk frequency = 1/88 * hmclk frequency - * 0b01011000..mclk frequency = 1/89 * hmclk frequency - * 0b01011001..mclk frequency = 1/90 * hmclk frequency - * 0b01011010..mclk frequency = 1/91 * hmclk frequency - * 0b01011011..mclk frequency = 1/92 * hmclk frequency - * 0b01011100..mclk frequency = 1/93 * hmclk frequency - * 0b01011101..mclk frequency = 1/94 * hmclk frequency - * 0b01011110..mclk frequency = 1/95 * hmclk frequency - * 0b01011111..mclk frequency = 1/96 * hmclk frequency - * 0b01100000..mclk frequency = 1/97 * hmclk frequency - * 0b01100001..mclk frequency = 1/98 * hmclk frequency - * 0b01100010..mclk frequency = 1/99 * hmclk frequency - * 0b01100011..mclk frequency = 1/100 * hmclk frequency - * 0b01100100..mclk frequency = 1/101 * hmclk frequency - * 0b01100101..mclk frequency = 1/102 * hmclk frequency - * 0b01100110..mclk frequency = 1/103 * hmclk frequency - * 0b01100111..mclk frequency = 1/104 * hmclk frequency - * 0b01101000..mclk frequency = 1/105 * hmclk frequency - * 0b01101001..mclk frequency = 1/106 * hmclk frequency - * 0b01101010..mclk frequency = 1/107 * hmclk frequency - * 0b01101011..mclk frequency = 1/108 * hmclk frequency - * 0b01101100..mclk frequency = 1/109 * hmclk frequency - * 0b01101101..mclk frequency = 1/110 * hmclk frequency - * 0b01101110..mclk frequency = 1/111 * hmclk frequency - * 0b01101111..mclk frequency = 1/112 * hmclk frequency - * 0b01110000..mclk frequency = 1/113 * hmclk frequency - * 0b01110001..mclk frequency = 1/114 * hmclk frequency - * 0b01110010..mclk frequency = 1/115 * hmclk frequency - * 0b01110011..mclk frequency = 1/116 * hmclk frequency - * 0b01110100..mclk frequency = 1/117 * hmclk frequency - * 0b01110101..mclk frequency = 1/118 * hmclk frequency - * 0b01110110..mclk frequency = 1/119 * hmclk frequency - * 0b01110111..mclk frequency = 1/120 * hmclk frequency - * 0b01111000..mclk frequency = 1/121 * hmclk frequency - * 0b01111001..mclk frequency = 1/122 * hmclk frequency - * 0b01111010..mclk frequency = 1/123 * hmclk frequency - * 0b01111011..mclk frequency = 1/124 * hmclk frequency - * 0b01111100..mclk frequency = 1/125 * hmclk frequency - * 0b01111101..mclk frequency = 1/126 * hmclk frequency - * 0b01111110..mclk frequency = 1/127 * hmclk frequency - * 0b01111111..mclk frequency = 1/128 * hmclk frequency - * 0b10000000..mclk frequency = 1/129 * hmclk frequency - * 0b10000001..mclk frequency = 1/130 * hmclk frequency - * 0b10000010..mclk frequency = 1/131 * hmclk frequency - * 0b10000011..mclk frequency = 1/132 * hmclk frequency - * 0b10000100..mclk frequency = 1/133 * hmclk frequency - * 0b10000101..mclk frequency = 1/134 * hmclk frequency - * 0b10000110..mclk frequency = 1/135 * hmclk frequency - * 0b10000111..mclk frequency = 1/136 * hmclk frequency - * 0b10001000..mclk frequency = 1/137 * hmclk frequency - * 0b10001001..mclk frequency = 1/138 * hmclk frequency - * 0b10001010..mclk frequency = 1/139 * hmclk frequency - * 0b10001011..mclk frequency = 1/140 * hmclk frequency - * 0b10001100..mclk frequency = 1/141 * hmclk frequency - * 0b10001101..mclk frequency = 1/142 * hmclk frequency - * 0b10001110..mclk frequency = 1/143 * hmclk frequency - * 0b10001111..mclk frequency = 1/144 * hmclk frequency - * 0b10010000..mclk frequency = 1/145 * hmclk frequency - * 0b10010001..mclk frequency = 1/146 * hmclk frequency - * 0b10010010..mclk frequency = 1/147 * hmclk frequency - * 0b10010011..mclk frequency = 1/148 * hmclk frequency - * 0b10010100..mclk frequency = 1/149 * hmclk frequency - * 0b10010101..mclk frequency = 1/150 * hmclk frequency - * 0b10010110..mclk frequency = 1/151 * hmclk frequency - * 0b10010111..mclk frequency = 1/152 * hmclk frequency - * 0b10011000..mclk frequency = 1/153 * hmclk frequency - * 0b10011001..mclk frequency = 1/154 * hmclk frequency - * 0b10011010..mclk frequency = 1/155 * hmclk frequency - * 0b10011011..mclk frequency = 1/156 * hmclk frequency - * 0b10011100..mclk frequency = 1/157 * hmclk frequency - * 0b10011101..mclk frequency = 1/158 * hmclk frequency - * 0b10011110..mclk frequency = 1/159 * hmclk frequency - * 0b10011111..mclk frequency = 1/160 * hmclk frequency - * 0b10100000..mclk frequency = 1/161 * hmclk frequency - * 0b10100001..mclk frequency = 1/162 * hmclk frequency - * 0b10100010..mclk frequency = 1/163 * hmclk frequency - * 0b10100011..mclk frequency = 1/164 * hmclk frequency - * 0b10100100..mclk frequency = 1/165 * hmclk frequency - * 0b10100101..mclk frequency = 1/166 * hmclk frequency - * 0b10100110..mclk frequency = 1/167 * hmclk frequency - * 0b10100111..mclk frequency = 1/168 * hmclk frequency - * 0b10101000..mclk frequency = 1/169 * hmclk frequency - * 0b10101001..mclk frequency = 1/170 * hmclk frequency - * 0b10101010..mclk frequency = 1/171 * hmclk frequency - * 0b10101011..mclk frequency = 1/172 * hmclk frequency - * 0b10101100..mclk frequency = 1/173 * hmclk frequency - * 0b10101101..mclk frequency = 1/174 * hmclk frequency - * 0b10101110..mclk frequency = 1/175 * hmclk frequency - * 0b10101111..mclk frequency = 1/176 * hmclk frequency - * 0b10110000..mclk frequency = 1/177 * hmclk frequency - * 0b10110001..mclk frequency = 1/178 * hmclk frequency - * 0b10110010..mclk frequency = 1/179 * hmclk frequency - * 0b10110011..mclk frequency = 1/180 * hmclk frequency - * 0b10110100..mclk frequency = 1/181 * hmclk frequency - * 0b10110101..mclk frequency = 1/182 * hmclk frequency - * 0b10110110..mclk frequency = 1/183 * hmclk frequency - * 0b10110111..mclk frequency = 1/184 * hmclk frequency - * 0b10111000..mclk frequency = 1/185 * hmclk frequency - * 0b10111001..mclk frequency = 1/186 * hmclk frequency - * 0b10111010..mclk frequency = 1/187 * hmclk frequency - * 0b10111011..mclk frequency = 1/188 * hmclk frequency - * 0b10111100..mclk frequency = 1/189 * hmclk frequency - * 0b10111101..mclk frequency = 1/190 * hmclk frequency - * 0b10111110..mclk frequency = 1/191 * hmclk frequency - * 0b10111111..mclk frequency = 1/192 * hmclk frequency - * 0b11000000..mclk frequency = 1/193 * hmclk frequency - * 0b11000001..mclk frequency = 1/194 * hmclk frequency - * 0b11000010..mclk frequency = 1/195 * hmclk frequency - * 0b11000011..mclk frequency = 1/196 * hmclk frequency - * 0b11000100..mclk frequency = 1/197 * hmclk frequency - * 0b11000101..mclk frequency = 1/198 * hmclk frequency - * 0b11000110..mclk frequency = 1/199 * hmclk frequency - * 0b11000111..mclk frequency = 1/200 * hmclk frequency - * 0b11001000..mclk frequency = 1/201 * hmclk frequency - * 0b11001001..mclk frequency = 1/202 * hmclk frequency - * 0b11001010..mclk frequency = 1/203 * hmclk frequency - * 0b11001011..mclk frequency = 1/204 * hmclk frequency - * 0b11001100..mclk frequency = 1/205 * hmclk frequency - * 0b11001101..mclk frequency = 1/206 * hmclk frequency - * 0b11001110..mclk frequency = 1/207 * hmclk frequency - * 0b11001111..mclk frequency = 1/208 * hmclk frequency - * 0b11010000..mclk frequency = 1/209 * hmclk frequency - * 0b11010001..mclk frequency = 1/210 * hmclk frequency - * 0b11010010..mclk frequency = 1/211 * hmclk frequency - * 0b11010011..mclk frequency = 1/212 * hmclk frequency - * 0b11010100..mclk frequency = 1/213 * hmclk frequency - * 0b11010101..mclk frequency = 1/214 * hmclk frequency - * 0b11010110..mclk frequency = 1/215 * hmclk frequency - * 0b11010111..mclk frequency = 1/216 * hmclk frequency - * 0b11011000..mclk frequency = 1/217 * hmclk frequency - * 0b11011001..mclk frequency = 1/218 * hmclk frequency - * 0b11011010..mclk frequency = 1/219 * hmclk frequency - * 0b11011011..mclk frequency = 1/220 * hmclk frequency - * 0b11011100..mclk frequency = 1/221 * hmclk frequency - * 0b11011101..mclk frequency = 1/222 * hmclk frequency - * 0b11011110..mclk frequency = 1/223 * hmclk frequency - * 0b11011111..mclk frequency = 1/224 * hmclk frequency - * 0b11100000..mclk frequency = 1/225 * hmclk frequency - * 0b11100001..mclk frequency = 1/226 * hmclk frequency - * 0b11100010..mclk frequency = 1/227 * hmclk frequency - * 0b11100011..mclk frequency = 1/228 * hmclk frequency - * 0b11100100..mclk frequency = 1/229 * hmclk frequency - * 0b11100101..mclk frequency = 1/230 * hmclk frequency - * 0b11100110..mclk frequency = 1/231 * hmclk frequency - * 0b11100111..mclk frequency = 1/232 * hmclk frequency - * 0b11101000..mclk frequency = 1/233 * hmclk frequency - * 0b11101001..mclk frequency = 1/234 * hmclk frequency - * 0b11101010..mclk frequency = 1/235 * hmclk frequency - * 0b11101011..mclk frequency = 1/236 * hmclk frequency - * 0b11101100..mclk frequency = 1/237 * hmclk frequency - * 0b11101101..mclk frequency = 1/238 * hmclk frequency - * 0b11101110..mclk frequency = 1/239 * hmclk frequency - * 0b11101111..mclk frequency = 1/240 * hmclk frequency - * 0b11110000..mclk frequency = 1/241 * hmclk frequency - * 0b11110001..mclk frequency = 1/242 * hmclk frequency - * 0b11110010..mclk frequency = 1/243 * hmclk frequency - * 0b11110011..mclk frequency = 1/244 * hmclk frequency - * 0b11110100..mclk frequency = 1/245 * hmclk frequency - * 0b11110101..mclk frequency = 1/246 * hmclk frequency - * 0b11110110..mclk frequency = 1/247 * hmclk frequency - * 0b11110111..mclk frequency = 1/248 * hmclk frequency - * 0b11111000..mclk frequency = 1/249 * hmclk frequency - * 0b11111001..mclk frequency = 1/250 * hmclk frequency - * 0b11111010..mclk frequency = 1/251 * hmclk frequency - * 0b11111011..mclk frequency = 1/252 * hmclk frequency - * 0b11111100..mclk frequency = 1/253 * hmclk frequency - * 0b11111101..mclk frequency = 1/254 * hmclk frequency - * 0b11111110..mclk frequency = 1/255 * hmclk frequency - * 0b11111111..mclk frequency = 1/256 * hmclk frequency - */ -#define IOMUXC_GPR_GPR2_MQS_CLK_DIV(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_MQS_CLK_DIV_SHIFT)) & IOMUXC_GPR_GPR2_MQS_CLK_DIV_MASK) - -#define IOMUXC_GPR_GPR2_MQS_SW_RST_MASK (0x1000000U) -#define IOMUXC_GPR_GPR2_MQS_SW_RST_SHIFT (24U) -/*! MQS_SW_RST - * 0b0..Exit software reset for MQS - * 0b1..Enable software reset for MQS - */ -#define IOMUXC_GPR_GPR2_MQS_SW_RST(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_MQS_SW_RST_SHIFT)) & IOMUXC_GPR_GPR2_MQS_SW_RST_MASK) - -#define IOMUXC_GPR_GPR2_MQS_EN_MASK (0x2000000U) -#define IOMUXC_GPR_GPR2_MQS_EN_SHIFT (25U) -/*! MQS_EN - * 0b0..Disable MQS - * 0b1..Enable MQS - */ -#define IOMUXC_GPR_GPR2_MQS_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_MQS_EN_SHIFT)) & IOMUXC_GPR_GPR2_MQS_EN_MASK) - -#define IOMUXC_GPR_GPR2_MQS_OVERSAMPLE_MASK (0x4000000U) -#define IOMUXC_GPR_GPR2_MQS_OVERSAMPLE_SHIFT (26U) -/*! MQS_OVERSAMPLE - * 0b0..32 - * 0b1..64 - */ -#define IOMUXC_GPR_GPR2_MQS_OVERSAMPLE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_MQS_OVERSAMPLE_SHIFT)) & IOMUXC_GPR_GPR2_MQS_OVERSAMPLE_MASK) - -#define IOMUXC_GPR_GPR2_QTIMER1_TMR_CNTS_FREEZE_MASK (0x10000000U) -#define IOMUXC_GPR_GPR2_QTIMER1_TMR_CNTS_FREEZE_SHIFT (28U) -/*! QTIMER1_TMR_CNTS_FREEZE - * 0b0..timer counter work normally - * 0b1..reset counter and ouput flags - */ -#define IOMUXC_GPR_GPR2_QTIMER1_TMR_CNTS_FREEZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_QTIMER1_TMR_CNTS_FREEZE_SHIFT)) & IOMUXC_GPR_GPR2_QTIMER1_TMR_CNTS_FREEZE_MASK) - -#define IOMUXC_GPR_GPR2_QTIMER2_TMR_CNTS_FREEZE_MASK (0x20000000U) -#define IOMUXC_GPR_GPR2_QTIMER2_TMR_CNTS_FREEZE_SHIFT (29U) -/*! QTIMER2_TMR_CNTS_FREEZE - * 0b0..timer counter work normally - * 0b1..reset counter and ouput flags - */ -#define IOMUXC_GPR_GPR2_QTIMER2_TMR_CNTS_FREEZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_QTIMER2_TMR_CNTS_FREEZE_SHIFT)) & IOMUXC_GPR_GPR2_QTIMER2_TMR_CNTS_FREEZE_MASK) - -#define IOMUXC_GPR_GPR2_QTIMER3_TMR_CNTS_FREEZE_MASK (0x40000000U) -#define IOMUXC_GPR_GPR2_QTIMER3_TMR_CNTS_FREEZE_SHIFT (30U) -/*! QTIMER3_TMR_CNTS_FREEZE - * 0b0..timer counter work normally - * 0b1..reset counter and ouput flags - */ -#define IOMUXC_GPR_GPR2_QTIMER3_TMR_CNTS_FREEZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_QTIMER3_TMR_CNTS_FREEZE_SHIFT)) & IOMUXC_GPR_GPR2_QTIMER3_TMR_CNTS_FREEZE_MASK) - -#define IOMUXC_GPR_GPR2_QTIMER4_TMR_CNTS_FREEZE_MASK (0x80000000U) -#define IOMUXC_GPR_GPR2_QTIMER4_TMR_CNTS_FREEZE_SHIFT (31U) -/*! QTIMER4_TMR_CNTS_FREEZE - * 0b0..timer counter work normally - * 0b1..reset counter and ouput flags - */ -#define IOMUXC_GPR_GPR2_QTIMER4_TMR_CNTS_FREEZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR2_QTIMER4_TMR_CNTS_FREEZE_SHIFT)) & IOMUXC_GPR_GPR2_QTIMER4_TMR_CNTS_FREEZE_MASK) -/*! @} */ - -/*! @name GPR3 - GPR3 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR3_OCRAM_CTL_MASK (0xFU) -#define IOMUXC_GPR_GPR3_OCRAM_CTL_SHIFT (0U) -#define IOMUXC_GPR_GPR3_OCRAM_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR3_OCRAM_CTL_SHIFT)) & IOMUXC_GPR_GPR3_OCRAM_CTL_MASK) - -#define IOMUXC_GPR_GPR3_DCP_KEY_SEL_MASK (0x10U) -#define IOMUXC_GPR_GPR3_DCP_KEY_SEL_SHIFT (4U) -/*! DCP_KEY_SEL - * 0b0..Select [127:0] from snvs/ocotp key as dcp key - * 0b1..Select [255:128] from snvs/ocotp key as dcp key - */ -#define IOMUXC_GPR_GPR3_DCP_KEY_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR3_DCP_KEY_SEL_SHIFT)) & IOMUXC_GPR_GPR3_DCP_KEY_SEL_MASK) - -#define IOMUXC_GPR_GPR3_OCRAM_STATUS_MASK (0xF0000U) -#define IOMUXC_GPR_GPR3_OCRAM_STATUS_SHIFT (16U) -/*! OCRAM_STATUS - * 0b0000..read data pipeline configuration valid - * 0b0001..read data pipeline control bit changed - */ -#define IOMUXC_GPR_GPR3_OCRAM_STATUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR3_OCRAM_STATUS_SHIFT)) & IOMUXC_GPR_GPR3_OCRAM_STATUS_MASK) -/*! @} */ - -/*! @name GPR4 - GPR4 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR4_EDMA_STOP_REQ_MASK (0x1U) -#define IOMUXC_GPR_GPR4_EDMA_STOP_REQ_SHIFT (0U) -/*! EDMA_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_EDMA_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_EDMA_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_EDMA_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_CAN1_STOP_REQ_MASK (0x2U) -#define IOMUXC_GPR_GPR4_CAN1_STOP_REQ_SHIFT (1U) -/*! CAN1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_CAN1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_CAN1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_CAN1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_CAN2_STOP_REQ_MASK (0x4U) -#define IOMUXC_GPR_GPR4_CAN2_STOP_REQ_SHIFT (2U) -/*! CAN2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_CAN2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_CAN2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_CAN2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_TRNG_STOP_REQ_MASK (0x8U) -#define IOMUXC_GPR_GPR4_TRNG_STOP_REQ_SHIFT (3U) -/*! TRNG_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_TRNG_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_TRNG_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_TRNG_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_ENET_STOP_REQ_MASK (0x10U) -#define IOMUXC_GPR_GPR4_ENET_STOP_REQ_SHIFT (4U) -/*! ENET_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_ENET_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_ENET_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_ENET_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_SAI1_STOP_REQ_MASK (0x20U) -#define IOMUXC_GPR_GPR4_SAI1_STOP_REQ_SHIFT (5U) -/*! SAI1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_SAI1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_SAI1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_SAI2_STOP_REQ_MASK (0x40U) -#define IOMUXC_GPR_GPR4_SAI2_STOP_REQ_SHIFT (6U) -/*! SAI2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_SAI2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_SAI2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_SAI3_STOP_REQ_MASK (0x80U) -#define IOMUXC_GPR_GPR4_SAI3_STOP_REQ_SHIFT (7U) -/*! SAI3_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_SAI3_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI3_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_SAI3_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_SEMC_STOP_REQ_MASK (0x200U) -#define IOMUXC_GPR_GPR4_SEMC_STOP_REQ_SHIFT (9U) -/*! SEMC_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_SEMC_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SEMC_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_SEMC_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_PIT_STOP_REQ_MASK (0x400U) -#define IOMUXC_GPR_GPR4_PIT_STOP_REQ_SHIFT (10U) -/*! PIT_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_PIT_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_PIT_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_PIT_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_REQ_MASK (0x800U) -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_REQ_SHIFT (11U) -/*! FLEXSPI_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXSPI_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_FLEXSPI_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_REQ_MASK (0x1000U) -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_REQ_SHIFT (12U) -/*! FLEXIO1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXIO1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_FLEXIO1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_REQ_MASK (0x2000U) -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_REQ_SHIFT (13U) -/*! FLEXIO2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXIO2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR4_FLEXIO2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR4_EDMA_STOP_ACK_MASK (0x10000U) -#define IOMUXC_GPR_GPR4_EDMA_STOP_ACK_SHIFT (16U) -/*! EDMA_STOP_ACK - * 0b0..EDMA stop acknowledge is not asserted - * 0b1..EDMA stop acknowledge is asserted (EDMA is in STOP mode). - */ -#define IOMUXC_GPR_GPR4_EDMA_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_EDMA_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_EDMA_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_CAN1_STOP_ACK_MASK (0x20000U) -#define IOMUXC_GPR_GPR4_CAN1_STOP_ACK_SHIFT (17U) -/*! CAN1_STOP_ACK - * 0b0..CAN1 stop acknowledge is not asserted - * 0b1..CAN1 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_CAN1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_CAN1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_CAN1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_CAN2_STOP_ACK_MASK (0x40000U) -#define IOMUXC_GPR_GPR4_CAN2_STOP_ACK_SHIFT (18U) -/*! CAN2_STOP_ACK - * 0b0..CAN2 stop acknowledge is not asserted - * 0b1..CAN2 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_CAN2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_CAN2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_CAN2_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_TRNG_STOP_ACK_MASK (0x80000U) -#define IOMUXC_GPR_GPR4_TRNG_STOP_ACK_SHIFT (19U) -/*! TRNG_STOP_ACK - * 0b0..TRNG stop acknowledge is not asserted - * 0b1..TRNG stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_TRNG_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_TRNG_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_TRNG_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_ENET_STOP_ACK_MASK (0x100000U) -#define IOMUXC_GPR_GPR4_ENET_STOP_ACK_SHIFT (20U) -/*! ENET_STOP_ACK - * 0b0..ENET stop acknowledge is not asserted - * 0b1..ENET stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_ENET_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_ENET_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_ENET_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_SAI1_STOP_ACK_MASK (0x200000U) -#define IOMUXC_GPR_GPR4_SAI1_STOP_ACK_SHIFT (21U) -/*! SAI1_STOP_ACK - * 0b0..SAI1 stop acknowledge is not asserted - * 0b1..SAI1 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_SAI1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_SAI1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_SAI2_STOP_ACK_MASK (0x400000U) -#define IOMUXC_GPR_GPR4_SAI2_STOP_ACK_SHIFT (22U) -/*! SAI2_STOP_ACK - * 0b0..SAI2 stop acknowledge is not asserted - * 0b1..SAI2 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_SAI2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_SAI2_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_SAI3_STOP_ACK_MASK (0x800000U) -#define IOMUXC_GPR_GPR4_SAI3_STOP_ACK_SHIFT (23U) -/*! SAI3_STOP_ACK - * 0b0..SAI3 stop acknowledge is not asserted - * 0b1..SAI3 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_SAI3_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SAI3_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_SAI3_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_SEMC_STOP_ACK_MASK (0x2000000U) -#define IOMUXC_GPR_GPR4_SEMC_STOP_ACK_SHIFT (25U) -/*! SEMC_STOP_ACK - * 0b0..SEMC stop acknowledge is not asserted - * 0b1..SEMC stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_SEMC_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_SEMC_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_SEMC_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_PIT_STOP_ACK_MASK (0x4000000U) -#define IOMUXC_GPR_GPR4_PIT_STOP_ACK_SHIFT (26U) -/*! PIT_STOP_ACK - * 0b0..PIT stop acknowledge is not asserted - * 0b1..PIT stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_PIT_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_PIT_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_PIT_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_ACK_MASK (0x8000000U) -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_ACK_SHIFT (27U) -/*! FLEXSPI_STOP_ACK - * 0b0..FLEXSPI stop acknowledge is not asserted - * 0b1..FLEXSPI stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_FLEXSPI_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXSPI_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_FLEXSPI_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_ACK_MASK (0x10000000U) -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_ACK_SHIFT (28U) -/*! FLEXIO1_STOP_ACK - * 0b0..FLEXIO1 stop acknowledge is not asserted - * 0b1..FLEXIO1 stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR4_FLEXIO1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXIO1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_FLEXIO1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_ACK_MASK (0x20000000U) -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_ACK_SHIFT (29U) -/*! FLEXIO2_STOP_ACK - * 0b0..FLEXIO2 stop acknowledge is not asserted - * 0b1..FLEXIO2 stop acknowledge is asserted (FLEXIO2 is in STOP mode) - */ -#define IOMUXC_GPR_GPR4_FLEXIO2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR4_FLEXIO2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR4_FLEXIO2_STOP_ACK_MASK) -/*! @} */ - -/*! @name GPR5 - GPR5 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR5_WDOG1_MASK_MASK (0x40U) -#define IOMUXC_GPR_GPR5_WDOG1_MASK_SHIFT (6U) -/*! WDOG1_MASK - * 0b0..WDOG1 Timeout behaves normally - * 0b1..WDOG1 Timeout is masked - */ -#define IOMUXC_GPR_GPR5_WDOG1_MASK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_WDOG1_MASK_SHIFT)) & IOMUXC_GPR_GPR5_WDOG1_MASK_MASK) - -#define IOMUXC_GPR_GPR5_WDOG2_MASK_MASK (0x80U) -#define IOMUXC_GPR_GPR5_WDOG2_MASK_SHIFT (7U) -/*! WDOG2_MASK - * 0b0..WDOG2 Timeout behaves normally - * 0b1..WDOG2 Timeout is masked - */ -#define IOMUXC_GPR_GPR5_WDOG2_MASK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_WDOG2_MASK_SHIFT)) & IOMUXC_GPR_GPR5_WDOG2_MASK_MASK) - -#define IOMUXC_GPR_GPR5_GPT2_CAPIN1_SEL_MASK (0x800000U) -#define IOMUXC_GPR_GPR5_GPT2_CAPIN1_SEL_SHIFT (23U) -/*! GPT2_CAPIN1_SEL - * 0b0..source from pad - * 0b1..source from enet1.ipp_do_mac0_timer[3] - */ -#define IOMUXC_GPR_GPR5_GPT2_CAPIN1_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_GPT2_CAPIN1_SEL_SHIFT)) & IOMUXC_GPR_GPR5_GPT2_CAPIN1_SEL_MASK) - -#define IOMUXC_GPR_GPR5_ENET_EVENT3IN_SEL_MASK (0x2000000U) -#define IOMUXC_GPR_GPR5_ENET_EVENT3IN_SEL_SHIFT (25U) -/*! ENET_EVENT3IN_SEL - * 0b0..event3 source input from pad - * 0b1..event3 source input from gpt2.ipp_do_cmpout1 - */ -#define IOMUXC_GPR_GPR5_ENET_EVENT3IN_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_ENET_EVENT3IN_SEL_SHIFT)) & IOMUXC_GPR_GPR5_ENET_EVENT3IN_SEL_MASK) - -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK (0x10000000U) -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_SHIFT (28U) -/*! VREF_1M_CLK_GPT1 - * 0b0..GPT1 ipg_clk_highfreq driven by IPG_PERCLK - * 0b1..GPT1 ipg_clk_highfreq driven by anatop 1 MHz clock - */ -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_SHIFT)) & IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK) - -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK (0x20000000U) -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_SHIFT (29U) -/*! VREF_1M_CLK_GPT2 - * 0b0..GPT2 ipg_clk_highfreq driven by IPG_PERCLK - * 0b1..GPT2 ipg_clk_highfreq driven by anatop 1 MHz clock - */ -#define IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_SHIFT)) & IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK) -/*! @} */ - -/*! @name GPR6 - GPR6 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR6_QTIMER1_TRM0_INPUT_SEL_MASK (0x1U) -#define IOMUXC_GPR_GPR6_QTIMER1_TRM0_INPUT_SEL_SHIFT (0U) -/*! QTIMER1_TRM0_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER1_TRM0_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER1_TRM0_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER1_TRM0_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER1_TRM1_INPUT_SEL_MASK (0x2U) -#define IOMUXC_GPR_GPR6_QTIMER1_TRM1_INPUT_SEL_SHIFT (1U) -/*! QTIMER1_TRM1_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER1_TRM1_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER1_TRM1_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER1_TRM1_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER1_TRM2_INPUT_SEL_MASK (0x4U) -#define IOMUXC_GPR_GPR6_QTIMER1_TRM2_INPUT_SEL_SHIFT (2U) -/*! QTIMER1_TRM2_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER1_TRM2_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER1_TRM2_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER1_TRM2_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER1_TRM3_INPUT_SEL_MASK (0x8U) -#define IOMUXC_GPR_GPR6_QTIMER1_TRM3_INPUT_SEL_SHIFT (3U) -/*! QTIMER1_TRM3_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER1_TRM3_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER1_TRM3_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER1_TRM3_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER2_TRM0_INPUT_SEL_MASK (0x10U) -#define IOMUXC_GPR_GPR6_QTIMER2_TRM0_INPUT_SEL_SHIFT (4U) -/*! QTIMER2_TRM0_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER2_TRM0_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER2_TRM0_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER2_TRM0_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER2_TRM1_INPUT_SEL_MASK (0x20U) -#define IOMUXC_GPR_GPR6_QTIMER2_TRM1_INPUT_SEL_SHIFT (5U) -/*! QTIMER2_TRM1_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER2_TRM1_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER2_TRM1_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER2_TRM1_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER2_TRM2_INPUT_SEL_MASK (0x40U) -#define IOMUXC_GPR_GPR6_QTIMER2_TRM2_INPUT_SEL_SHIFT (6U) -/*! QTIMER2_TRM2_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER2_TRM2_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER2_TRM2_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER2_TRM2_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER2_TRM3_INPUT_SEL_MASK (0x80U) -#define IOMUXC_GPR_GPR6_QTIMER2_TRM3_INPUT_SEL_SHIFT (7U) -/*! QTIMER2_TRM3_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER2_TRM3_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER2_TRM3_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER2_TRM3_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER3_TRM0_INPUT_SEL_MASK (0x100U) -#define IOMUXC_GPR_GPR6_QTIMER3_TRM0_INPUT_SEL_SHIFT (8U) -/*! QTIMER3_TRM0_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER3_TRM0_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER3_TRM0_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER3_TRM0_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER3_TRM1_INPUT_SEL_MASK (0x200U) -#define IOMUXC_GPR_GPR6_QTIMER3_TRM1_INPUT_SEL_SHIFT (9U) -/*! QTIMER3_TRM1_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER3_TRM1_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER3_TRM1_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER3_TRM1_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER3_TRM2_INPUT_SEL_MASK (0x400U) -#define IOMUXC_GPR_GPR6_QTIMER3_TRM2_INPUT_SEL_SHIFT (10U) -/*! QTIMER3_TRM2_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER3_TRM2_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER3_TRM2_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER3_TRM2_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER3_TRM3_INPUT_SEL_MASK (0x800U) -#define IOMUXC_GPR_GPR6_QTIMER3_TRM3_INPUT_SEL_SHIFT (11U) -/*! QTIMER3_TRM3_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER3_TRM3_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER3_TRM3_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER3_TRM3_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER4_TRM0_INPUT_SEL_MASK (0x1000U) -#define IOMUXC_GPR_GPR6_QTIMER4_TRM0_INPUT_SEL_SHIFT (12U) -/*! QTIMER4_TRM0_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER4_TRM0_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER4_TRM0_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER4_TRM0_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER4_TRM1_INPUT_SEL_MASK (0x2000U) -#define IOMUXC_GPR_GPR6_QTIMER4_TRM1_INPUT_SEL_SHIFT (13U) -/*! QTIMER4_TRM1_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER4_TRM1_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER4_TRM1_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER4_TRM1_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER4_TRM2_INPUT_SEL_MASK (0x4000U) -#define IOMUXC_GPR_GPR6_QTIMER4_TRM2_INPUT_SEL_SHIFT (14U) -/*! QTIMER4_TRM2_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER4_TRM2_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER4_TRM2_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER4_TRM2_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_QTIMER4_TRM3_INPUT_SEL_MASK (0x8000U) -#define IOMUXC_GPR_GPR6_QTIMER4_TRM3_INPUT_SEL_SHIFT (15U) -/*! QTIMER4_TRM3_INPUT_SEL - * 0b0..input from IOMUX - * 0b1..input from XBAR - */ -#define IOMUXC_GPR_GPR6_QTIMER4_TRM3_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_QTIMER4_TRM3_INPUT_SEL_SHIFT)) & IOMUXC_GPR_GPR6_QTIMER4_TRM3_INPUT_SEL_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_4_MASK (0x10000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_4_SHIFT (16U) -/*! IOMUXC_XBAR_DIR_SEL_4 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_4(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_4_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_4_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_5_MASK (0x20000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_5_SHIFT (17U) -/*! IOMUXC_XBAR_DIR_SEL_5 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_5(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_5_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_5_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_6_MASK (0x40000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_6_SHIFT (18U) -/*! IOMUXC_XBAR_DIR_SEL_6 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_6(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_6_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_6_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_7_MASK (0x80000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_7_SHIFT (19U) -/*! IOMUXC_XBAR_DIR_SEL_7 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_7(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_7_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_7_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8_MASK (0x100000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8_SHIFT (20U) -/*! IOMUXC_XBAR_DIR_SEL_8 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_9_MASK (0x200000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_9_SHIFT (21U) -/*! IOMUXC_XBAR_DIR_SEL_9 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_9(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_9_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_9_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_10_MASK (0x400000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_10_SHIFT (22U) -/*! IOMUXC_XBAR_DIR_SEL_10 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_10(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_10_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_10_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_11_MASK (0x800000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_11_SHIFT (23U) -/*! IOMUXC_XBAR_DIR_SEL_11 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_11(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_11_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_11_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_12_MASK (0x1000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_12_SHIFT (24U) -/*! IOMUXC_XBAR_DIR_SEL_12 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_12(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_12_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_12_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_13_MASK (0x2000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_13_SHIFT (25U) -/*! IOMUXC_XBAR_DIR_SEL_13 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_13(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_13_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_13_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_14_MASK (0x4000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_14_SHIFT (26U) -/*! IOMUXC_XBAR_DIR_SEL_14 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_14(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_14_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_14_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_15_MASK (0x8000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_15_SHIFT (27U) -/*! IOMUXC_XBAR_DIR_SEL_15 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_15(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_15_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_15_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_16_MASK (0x10000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_16_SHIFT (28U) -/*! IOMUXC_XBAR_DIR_SEL_16 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_16(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_16_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_16_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_17_MASK (0x20000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_17_SHIFT (29U) -/*! IOMUXC_XBAR_DIR_SEL_17 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_17(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_17_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_17_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_18_MASK (0x40000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_18_SHIFT (30U) -/*! IOMUXC_XBAR_DIR_SEL_18 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_18(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_18_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_18_MASK) - -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_19_MASK (0x80000000U) -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_19_SHIFT (31U) -/*! IOMUXC_XBAR_DIR_SEL_19 - * 0b0..XBAR_INOUT as input - * 0b1..XBAR_INOUT as output - */ -#define IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_19(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_19_SHIFT)) & IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_19_MASK) -/*! @} */ - -/*! @name GPR7 - GPR7 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_REQ_MASK (0x1U) -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_REQ_SHIFT (0U) -/*! LPI2C1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_REQ_MASK (0x2U) -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_REQ_SHIFT (1U) -/*! LPI2C2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_REQ_MASK (0x4U) -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_REQ_SHIFT (2U) -/*! LPI2C3_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C3_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C3_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_REQ_MASK (0x8U) -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_REQ_SHIFT (3U) -/*! LPI2C4_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C4_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C4_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_REQ_MASK (0x10U) -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_REQ_SHIFT (4U) -/*! LPSPI1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_REQ_MASK (0x20U) -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_REQ_SHIFT (5U) -/*! LPSPI2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_REQ_MASK (0x40U) -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_REQ_SHIFT (6U) -/*! LPSPI3_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI3_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI3_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_REQ_MASK (0x80U) -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_REQ_SHIFT (7U) -/*! LPSPI4_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI4_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI4_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART1_STOP_REQ_MASK (0x100U) -#define IOMUXC_GPR_GPR7_LPUART1_STOP_REQ_SHIFT (8U) -/*! LPUART1_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART1_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART1_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART1_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART2_STOP_REQ_MASK (0x200U) -#define IOMUXC_GPR_GPR7_LPUART2_STOP_REQ_SHIFT (9U) -/*! LPUART2_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART2_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART2_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART2_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART3_STOP_REQ_MASK (0x400U) -#define IOMUXC_GPR_GPR7_LPUART3_STOP_REQ_SHIFT (10U) -/*! LPUART3_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART3_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART3_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART3_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART4_STOP_REQ_MASK (0x800U) -#define IOMUXC_GPR_GPR7_LPUART4_STOP_REQ_SHIFT (11U) -/*! LPUART4_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART4_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART4_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART4_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART5_STOP_REQ_MASK (0x1000U) -#define IOMUXC_GPR_GPR7_LPUART5_STOP_REQ_SHIFT (12U) -/*! LPUART5_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART5_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART5_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART5_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART6_STOP_REQ_MASK (0x2000U) -#define IOMUXC_GPR_GPR7_LPUART6_STOP_REQ_SHIFT (13U) -/*! LPUART6_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART6_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART6_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART6_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART7_STOP_REQ_MASK (0x4000U) -#define IOMUXC_GPR_GPR7_LPUART7_STOP_REQ_SHIFT (14U) -/*! LPUART7_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART7_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART7_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART7_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPUART8_STOP_REQ_MASK (0x8000U) -#define IOMUXC_GPR_GPR7_LPUART8_STOP_REQ_SHIFT (15U) -/*! LPUART8_STOP_REQ - * 0b0..stop request off - * 0b1..stop request on - */ -#define IOMUXC_GPR_GPR7_LPUART8_STOP_REQ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART8_STOP_REQ_SHIFT)) & IOMUXC_GPR_GPR7_LPUART8_STOP_REQ_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_ACK_MASK (0x10000U) -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_ACK_SHIFT (16U) -/*! LPI2C1_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted (the module is in Stop mode) - */ -#define IOMUXC_GPR_GPR7_LPI2C1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_ACK_MASK (0x20000U) -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_ACK_SHIFT (17U) -/*! LPI2C2_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPI2C2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C2_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_ACK_MASK (0x40000U) -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_ACK_SHIFT (18U) -/*! LPI2C3_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPI2C3_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C3_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C3_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_ACK_MASK (0x80000U) -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_ACK_SHIFT (19U) -/*! LPI2C4_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPI2C4_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPI2C4_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPI2C4_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_ACK_MASK (0x100000U) -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_ACK_SHIFT (20U) -/*! LPSPI1_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPSPI1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_ACK_MASK (0x200000U) -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_ACK_SHIFT (21U) -/*! LPSPI2_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPSPI2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI2_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_ACK_MASK (0x400000U) -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_ACK_SHIFT (22U) -/*! LPSPI3_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPSPI3_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI3_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI3_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_ACK_MASK (0x800000U) -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_ACK_SHIFT (23U) -/*! LPSPI4_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPSPI4_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPSPI4_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPSPI4_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART1_STOP_ACK_MASK (0x1000000U) -#define IOMUXC_GPR_GPR7_LPUART1_STOP_ACK_SHIFT (24U) -/*! LPUART1_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART1_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART1_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART1_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART2_STOP_ACK_MASK (0x2000000U) -#define IOMUXC_GPR_GPR7_LPUART2_STOP_ACK_SHIFT (25U) -/*! LPUART2_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART2_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART2_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART2_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART3_STOP_ACK_MASK (0x4000000U) -#define IOMUXC_GPR_GPR7_LPUART3_STOP_ACK_SHIFT (26U) -/*! LPUART3_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART3_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART3_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART3_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART4_STOP_ACK_MASK (0x8000000U) -#define IOMUXC_GPR_GPR7_LPUART4_STOP_ACK_SHIFT (27U) -/*! LPUART4_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART4_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART4_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART4_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART5_STOP_ACK_MASK (0x10000000U) -#define IOMUXC_GPR_GPR7_LPUART5_STOP_ACK_SHIFT (28U) -/*! LPUART5_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART5_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART5_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART5_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART6_STOP_ACK_MASK (0x20000000U) -#define IOMUXC_GPR_GPR7_LPUART6_STOP_ACK_SHIFT (29U) -/*! LPUART6_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART6_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART6_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART6_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART7_STOP_ACK_MASK (0x40000000U) -#define IOMUXC_GPR_GPR7_LPUART7_STOP_ACK_SHIFT (30U) -/*! LPUART7_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted - */ -#define IOMUXC_GPR_GPR7_LPUART7_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART7_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART7_STOP_ACK_MASK) - -#define IOMUXC_GPR_GPR7_LPUART8_STOP_ACK_MASK (0x80000000U) -#define IOMUXC_GPR_GPR7_LPUART8_STOP_ACK_SHIFT (31U) -/*! LPUART8_STOP_ACK - * 0b0..stop acknowledge is not asserted - * 0b1..stop acknowledge is asserted (the module is in Stop mode) - */ -#define IOMUXC_GPR_GPR7_LPUART8_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR7_LPUART8_STOP_ACK_SHIFT)) & IOMUXC_GPR_GPR7_LPUART8_STOP_ACK_MASK) -/*! @} */ - -/*! @name GPR8 - GPR8 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_STOP_MODE_MASK (0x1U) -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_STOP_MODE_SHIFT (0U) -/*! LPI2C1_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C1_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C1_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_DOZE_MASK (0x2U) -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_DOZE_SHIFT (1U) -/*! LPI2C1_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPI2C1_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C1_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C1_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_STOP_MODE_MASK (0x4U) -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_STOP_MODE_SHIFT (2U) -/*! LPI2C2_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C2_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C2_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_DOZE_MASK (0x8U) -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_DOZE_SHIFT (3U) -/*! LPI2C2_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPI2C2_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C2_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C2_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_STOP_MODE_MASK (0x10U) -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_STOP_MODE_SHIFT (4U) -/*! LPI2C3_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C3_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C3_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_DOZE_MASK (0x20U) -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_DOZE_SHIFT (5U) -/*! LPI2C3_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPI2C3_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C3_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C3_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_STOP_MODE_MASK (0x40U) -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_STOP_MODE_SHIFT (6U) -/*! LPI2C4_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C4_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C4_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_DOZE_MASK (0x80U) -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_DOZE_SHIFT (7U) -/*! LPI2C4_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPI2C4_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPI2C4_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPI2C4_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_STOP_MODE_MASK (0x100U) -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_STOP_MODE_SHIFT (8U) -/*! LPSPI1_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI1_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI1_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_DOZE_MASK (0x200U) -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_DOZE_SHIFT (9U) -/*! LPSPI1_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPSPI1_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI1_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI1_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_STOP_MODE_MASK (0x400U) -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_STOP_MODE_SHIFT (10U) -/*! LPSPI2_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI2_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI2_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_DOZE_MASK (0x800U) -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_DOZE_SHIFT (11U) -/*! LPSPI2_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPSPI2_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI2_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI2_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_STOP_MODE_MASK (0x1000U) -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_STOP_MODE_SHIFT (12U) -/*! LPSPI3_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI3_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI3_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_DOZE_MASK (0x2000U) -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_DOZE_SHIFT (13U) -/*! LPSPI3_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPSPI3_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI3_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI3_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_STOP_MODE_MASK (0x4000U) -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_STOP_MODE_SHIFT (14U) -/*! LPSPI4_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI4_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI4_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_DOZE_MASK (0x8000U) -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_DOZE_SHIFT (15U) -/*! LPSPI4_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPSPI4_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPSPI4_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPSPI4_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART1_IPG_STOP_MODE_MASK (0x10000U) -#define IOMUXC_GPR_GPR8_LPUART1_IPG_STOP_MODE_SHIFT (16U) -/*! LPUART1_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART1_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART1_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART1_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART1_IPG_DOZE_MASK (0x20000U) -#define IOMUXC_GPR_GPR8_LPUART1_IPG_DOZE_SHIFT (17U) -/*! LPUART1_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART1_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART1_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART1_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART2_IPG_STOP_MODE_MASK (0x40000U) -#define IOMUXC_GPR_GPR8_LPUART2_IPG_STOP_MODE_SHIFT (18U) -/*! LPUART2_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART2_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART2_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART2_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART2_IPG_DOZE_MASK (0x80000U) -#define IOMUXC_GPR_GPR8_LPUART2_IPG_DOZE_SHIFT (19U) -/*! LPUART2_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART2_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART2_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART2_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART3_IPG_STOP_MODE_MASK (0x100000U) -#define IOMUXC_GPR_GPR8_LPUART3_IPG_STOP_MODE_SHIFT (20U) -/*! LPUART3_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART3_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART3_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART3_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART3_IPG_DOZE_MASK (0x200000U) -#define IOMUXC_GPR_GPR8_LPUART3_IPG_DOZE_SHIFT (21U) -/*! LPUART3_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART3_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART3_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART3_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART4_IPG_STOP_MODE_MASK (0x400000U) -#define IOMUXC_GPR_GPR8_LPUART4_IPG_STOP_MODE_SHIFT (22U) -/*! LPUART4_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART4_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART4_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART4_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART4_IPG_DOZE_MASK (0x800000U) -#define IOMUXC_GPR_GPR8_LPUART4_IPG_DOZE_SHIFT (23U) -/*! LPUART4_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART4_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART4_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART4_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART5_IPG_STOP_MODE_MASK (0x1000000U) -#define IOMUXC_GPR_GPR8_LPUART5_IPG_STOP_MODE_SHIFT (24U) -/*! LPUART5_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART5_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART5_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART5_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART5_IPG_DOZE_MASK (0x2000000U) -#define IOMUXC_GPR_GPR8_LPUART5_IPG_DOZE_SHIFT (25U) -/*! LPUART5_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART5_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART5_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART5_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART6_IPG_STOP_MODE_MASK (0x4000000U) -#define IOMUXC_GPR_GPR8_LPUART6_IPG_STOP_MODE_SHIFT (26U) -/*! LPUART6_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART6_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART6_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART6_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART6_IPG_DOZE_MASK (0x8000000U) -#define IOMUXC_GPR_GPR8_LPUART6_IPG_DOZE_SHIFT (27U) -/*! LPUART6_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART6_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART6_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART6_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART7_IPG_STOP_MODE_MASK (0x10000000U) -#define IOMUXC_GPR_GPR8_LPUART7_IPG_STOP_MODE_SHIFT (28U) -/*! LPUART7_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART7_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART7_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART7_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART7_IPG_DOZE_MASK (0x20000000U) -#define IOMUXC_GPR_GPR8_LPUART7_IPG_DOZE_SHIFT (29U) -/*! LPUART7_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART7_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART7_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART7_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART8_IPG_STOP_MODE_MASK (0x40000000U) -#define IOMUXC_GPR_GPR8_LPUART8_IPG_STOP_MODE_SHIFT (30U) -/*! LPUART8_IPG_STOP_MODE - * 0b0..the module is functional in Stop mode - * 0b1..the module is NOT functional in Stop mode, when this bit is equal to 1 and ipg_stop is asserted - */ -#define IOMUXC_GPR_GPR8_LPUART8_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART8_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART8_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR8_LPUART8_IPG_DOZE_MASK (0x80000000U) -#define IOMUXC_GPR_GPR8_LPUART8_IPG_DOZE_SHIFT (31U) -/*! LPUART8_IPG_DOZE - * 0b0..not in doze mode - * 0b1..in doze mode - */ -#define IOMUXC_GPR_GPR8_LPUART8_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR8_LPUART8_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR8_LPUART8_IPG_DOZE_MASK) -/*! @} */ - -/*! @name GPR10 - GPR10 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR10_NIDEN_MASK (0x1U) -#define IOMUXC_GPR_GPR10_NIDEN_SHIFT (0U) -/*! NIDEN - * 0b0..Debug turned off. - * 0b1..Debug enabled (default). - */ -#define IOMUXC_GPR_GPR10_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_NIDEN_SHIFT)) & IOMUXC_GPR_GPR10_NIDEN_MASK) - -#define IOMUXC_GPR_GPR10_DBG_EN_MASK (0x2U) -#define IOMUXC_GPR_GPR10_DBG_EN_SHIFT (1U) -/*! DBG_EN - * 0b0..Debug turned off. - * 0b1..Debug enabled (default). - */ -#define IOMUXC_GPR_GPR10_DBG_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_DBG_EN_SHIFT)) & IOMUXC_GPR_GPR10_DBG_EN_MASK) - -#define IOMUXC_GPR_GPR10_SEC_ERR_RESP_MASK (0x4U) -#define IOMUXC_GPR_GPR10_SEC_ERR_RESP_SHIFT (2U) -/*! SEC_ERR_RESP - * 0b0..OKEY response - * 0b1..SLVError (default) - */ -#define IOMUXC_GPR_GPR10_SEC_ERR_RESP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_SEC_ERR_RESP_SHIFT)) & IOMUXC_GPR_GPR10_SEC_ERR_RESP_MASK) - -#define IOMUXC_GPR_GPR10_DCPKEY_OCOTP_OR_KEYMUX_MASK (0x10U) -#define IOMUXC_GPR_GPR10_DCPKEY_OCOTP_OR_KEYMUX_SHIFT (4U) -/*! DCPKEY_OCOTP_OR_KEYMUX - * 0b0..Select key from Key MUX (SNVS/OTPMK). - * 0b1..Select key from OCOTP (SW_GP2). - */ -#define IOMUXC_GPR_GPR10_DCPKEY_OCOTP_OR_KEYMUX(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_DCPKEY_OCOTP_OR_KEYMUX_SHIFT)) & IOMUXC_GPR_GPR10_DCPKEY_OCOTP_OR_KEYMUX_MASK) - -#define IOMUXC_GPR_GPR10_OCRAM_TZ_EN_MASK (0x100U) -#define IOMUXC_GPR_GPR10_OCRAM_TZ_EN_SHIFT (8U) -/*! OCRAM_TZ_EN - * 0b0..The TrustZone feature is disabled. Entire OCRAM space is available for all access types (secure/non-secure/user/supervisor). - * 0b1..The TrustZone feature is enabled. Access to address in the range specified by [ENDADDR:STARTADDR] follows - * the execution mode access policy described in CSU chapter. - */ -#define IOMUXC_GPR_GPR10_OCRAM_TZ_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_OCRAM_TZ_EN_SHIFT)) & IOMUXC_GPR_GPR10_OCRAM_TZ_EN_MASK) - -#define IOMUXC_GPR_GPR10_OCRAM_TZ_ADDR_MASK (0xFE00U) -#define IOMUXC_GPR_GPR10_OCRAM_TZ_ADDR_SHIFT (9U) -#define IOMUXC_GPR_GPR10_OCRAM_TZ_ADDR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_OCRAM_TZ_ADDR_SHIFT)) & IOMUXC_GPR_GPR10_OCRAM_TZ_ADDR_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_NIDEN_MASK (0x10000U) -#define IOMUXC_GPR_GPR10_LOCK_NIDEN_SHIFT (16U) -/*! LOCK_NIDEN - * 0b0..Field is not locked - * 0b1..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_NIDEN_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_NIDEN_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_DBG_EN_MASK (0x20000U) -#define IOMUXC_GPR_GPR10_LOCK_DBG_EN_SHIFT (17U) -/*! LOCK_DBG_EN - * 0b0..Field is not locked - * 0b1..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_DBG_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_DBG_EN_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_DBG_EN_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_SEC_ERR_RESP_MASK (0x40000U) -#define IOMUXC_GPR_GPR10_LOCK_SEC_ERR_RESP_SHIFT (18U) -/*! LOCK_SEC_ERR_RESP - * 0b0..Field is not locked - * 0b1..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_SEC_ERR_RESP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_SEC_ERR_RESP_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_SEC_ERR_RESP_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_DCPKEY_OCOTP_OR_KEYMUX_MASK (0x100000U) -#define IOMUXC_GPR_GPR10_LOCK_DCPKEY_OCOTP_OR_KEYMUX_SHIFT (20U) -/*! LOCK_DCPKEY_OCOTP_OR_KEYMUX - * 0b0..Field is not locked - * 0b1..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_DCPKEY_OCOTP_OR_KEYMUX(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_DCPKEY_OCOTP_OR_KEYMUX_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_DCPKEY_OCOTP_OR_KEYMUX_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_EN_MASK (0x1000000U) -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_EN_SHIFT (24U) -/*! LOCK_OCRAM_TZ_EN - * 0b0..Field is not locked - * 0b1..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_EN_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_EN_MASK) - -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_ADDR_MASK (0xFE000000U) -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_ADDR_SHIFT (25U) -/*! LOCK_OCRAM_TZ_ADDR - * 0b0000000..Field is not locked - * 0b0000001..Field is locked (read access only) - */ -#define IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_ADDR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_ADDR_SHIFT)) & IOMUXC_GPR_GPR10_LOCK_OCRAM_TZ_ADDR_MASK) -/*! @} */ - -/*! @name GPR11 - GPR11 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR11_M7_APC_AC_R0_CTRL_MASK (0x3U) -#define IOMUXC_GPR_GPR11_M7_APC_AC_R0_CTRL_SHIFT (0U) -/*! M7_APC_AC_R0_CTRL - * 0b00..No access protection - * 0b01..M7 debug protection enabled - * 0b10..FlexSPI access protection - * 0b11..Both M7 debug and FlexSPI access are protected - */ -#define IOMUXC_GPR_GPR11_M7_APC_AC_R0_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_M7_APC_AC_R0_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_M7_APC_AC_R0_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_M7_APC_AC_R1_CTRL_MASK (0xCU) -#define IOMUXC_GPR_GPR11_M7_APC_AC_R1_CTRL_SHIFT (2U) -/*! M7_APC_AC_R1_CTRL - * 0b00..No access protection - * 0b01..M7 debug protection enabled - * 0b10..FlexSPI access protection - * 0b11..Both M7 debug and FlexSPI access are protected - */ -#define IOMUXC_GPR_GPR11_M7_APC_AC_R1_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_M7_APC_AC_R1_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_M7_APC_AC_R1_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_M7_APC_AC_R2_CTRL_MASK (0x30U) -#define IOMUXC_GPR_GPR11_M7_APC_AC_R2_CTRL_SHIFT (4U) -/*! M7_APC_AC_R2_CTRL - * 0b00..No access protection - * 0b01..M7 debug protection enabled - * 0b10..FlexSPI access protection - * 0b11..Both M7 debug and FlexSPI access are protected - */ -#define IOMUXC_GPR_GPR11_M7_APC_AC_R2_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_M7_APC_AC_R2_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_M7_APC_AC_R2_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_M7_APC_AC_R3_CTRL_MASK (0xC0U) -#define IOMUXC_GPR_GPR11_M7_APC_AC_R3_CTRL_SHIFT (6U) -/*! M7_APC_AC_R3_CTRL - * 0b00..No access protection - * 0b01..M7 debug protection enabled - * 0b10..FlexSPI access protection - * 0b11..Both M7 debug and FlexSPI access are protected - */ -#define IOMUXC_GPR_GPR11_M7_APC_AC_R3_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_M7_APC_AC_R3_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_M7_APC_AC_R3_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_BEE_DE_RX_EN_MASK (0xF00U) -#define IOMUXC_GPR_GPR11_BEE_DE_RX_EN_SHIFT (8U) -#define IOMUXC_GPR_GPR11_BEE_DE_RX_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_BEE_DE_RX_EN_SHIFT)) & IOMUXC_GPR_GPR11_BEE_DE_RX_EN_MASK) - -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R0_CTRL_MASK (0x30000U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R0_CTRL_SHIFT (16U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R0_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R0_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R0_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R1_CTRL_MASK (0xC0000U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R1_CTRL_SHIFT (18U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R1_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R1_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R1_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R2_CTRL_MASK (0x300000U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R2_CTRL_SHIFT (20U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R2_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R2_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R2_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R3_CTRL_MASK (0xC00000U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R3_CTRL_SHIFT (22U) -#define IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R3_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R3_CTRL_SHIFT)) & IOMUXC_GPR_GPR11_LOCK_M7_APC_AC_R3_CTRL_MASK) - -#define IOMUXC_GPR_GPR11_LOCK_BEE_DE_RX_EN_MASK (0xF000000U) -#define IOMUXC_GPR_GPR11_LOCK_BEE_DE_RX_EN_SHIFT (24U) -#define IOMUXC_GPR_GPR11_LOCK_BEE_DE_RX_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR11_LOCK_BEE_DE_RX_EN_SHIFT)) & IOMUXC_GPR_GPR11_LOCK_BEE_DE_RX_EN_MASK) -/*! @} */ - -/*! @name GPR12 - GPR12 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_STOP_MODE_MASK (0x1U) -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_STOP_MODE_SHIFT (0U) -/*! FLEXIO1_IPG_STOP_MODE - * 0b0..FlexIO1 is functional in Stop mode. - * 0b1..When this bit is equal to 1'b1 and ipg_stop is asserted, FlexIO1 is not functional in Stop mode. - */ -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR12_FLEXIO1_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR12_FLEXIO1_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_DOZE_MASK (0x2U) -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_DOZE_SHIFT (1U) -/*! FLEXIO1_IPG_DOZE - * 0b0..FLEXIO1 is not in doze mode - * 0b1..FLEXIO1 is in doze mode - */ -#define IOMUXC_GPR_GPR12_FLEXIO1_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR12_FLEXIO1_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR12_FLEXIO1_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_STOP_MODE_MASK (0x4U) -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_STOP_MODE_SHIFT (2U) -/*! FLEXIO2_IPG_STOP_MODE - * 0b0..FlexIO2 is functional in Stop mode. - * 0b1..When this bit is equal to 1'b1 and ipg_stop is asserted, FlexIO2 is not functional in Stop mode. - */ -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR12_FLEXIO2_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR12_FLEXIO2_IPG_STOP_MODE_MASK) - -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_DOZE_MASK (0x8U) -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_DOZE_SHIFT (3U) -/*! FLEXIO2_IPG_DOZE - * 0b0..FLEXIO2 is not in doze mode - * 0b1..FLEXIO2 is in doze mode - */ -#define IOMUXC_GPR_GPR12_FLEXIO2_IPG_DOZE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR12_FLEXIO2_IPG_DOZE_SHIFT)) & IOMUXC_GPR_GPR12_FLEXIO2_IPG_DOZE_MASK) - -#define IOMUXC_GPR_GPR12_ACMP_IPG_STOP_MODE_MASK (0x10U) -#define IOMUXC_GPR_GPR12_ACMP_IPG_STOP_MODE_SHIFT (4U) -/*! ACMP_IPG_STOP_MODE - * 0b0..ACMP is functional in Stop mode. - * 0b1..When this bit is equal to 1'b1 and ipg_stop is asserted, ACMP is not functional in Stop mode. - */ -#define IOMUXC_GPR_GPR12_ACMP_IPG_STOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR12_ACMP_IPG_STOP_MODE_SHIFT)) & IOMUXC_GPR_GPR12_ACMP_IPG_STOP_MODE_MASK) -/*! @} */ - -/*! @name GPR13 - GPR13 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR13_ARCACHE_USDHC_MASK (0x1U) -#define IOMUXC_GPR_GPR13_ARCACHE_USDHC_SHIFT (0U) -/*! ARCACHE_USDHC - * 0b0..Cacheable attribute is off for read transactions. - * 0b1..Cacheable attribute is on for read transactions. - */ -#define IOMUXC_GPR_GPR13_ARCACHE_USDHC(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR13_ARCACHE_USDHC_SHIFT)) & IOMUXC_GPR_GPR13_ARCACHE_USDHC_MASK) - -#define IOMUXC_GPR_GPR13_AWCACHE_USDHC_MASK (0x2U) -#define IOMUXC_GPR_GPR13_AWCACHE_USDHC_SHIFT (1U) -/*! AWCACHE_USDHC - * 0b0..Cacheable attribute is off for write transactions. - * 0b1..Cacheable attribute is on for write transactions. - */ -#define IOMUXC_GPR_GPR13_AWCACHE_USDHC(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR13_AWCACHE_USDHC_SHIFT)) & IOMUXC_GPR_GPR13_AWCACHE_USDHC_MASK) - -#define IOMUXC_GPR_GPR13_CACHE_ENET_MASK (0x80U) -#define IOMUXC_GPR_GPR13_CACHE_ENET_SHIFT (7U) -/*! CACHE_ENET - * 0b0..Cacheable attribute is off for read/write transactions. - * 0b1..Cacheable attribute is on for read/write transactions. - */ -#define IOMUXC_GPR_GPR13_CACHE_ENET(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR13_CACHE_ENET_SHIFT)) & IOMUXC_GPR_GPR13_CACHE_ENET_MASK) - -#define IOMUXC_GPR_GPR13_CACHE_USB_MASK (0x2000U) -#define IOMUXC_GPR_GPR13_CACHE_USB_SHIFT (13U) -/*! CACHE_USB - * 0b0..Cacheable attribute is off for read/write transactions. - * 0b1..Cacheable attribute is on for read/write transactions. - */ -#define IOMUXC_GPR_GPR13_CACHE_USB(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR13_CACHE_USB_SHIFT)) & IOMUXC_GPR_GPR13_CACHE_USB_MASK) -/*! @} */ - -/*! @name GPR14 - GPR14 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_DN_MASK (0x1U) -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_DN_SHIFT (0U) -/*! ACMP1_CMP_IGEN_TRIM_DN - * 0b0..no reduce - * 0b1..reduces - */ -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_DN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_DN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_DN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_DN_MASK (0x2U) -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_DN_SHIFT (1U) -/*! ACMP2_CMP_IGEN_TRIM_DN - * 0b0..no reduce - * 0b1..reduces - */ -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_DN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_DN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_DN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_DN_MASK (0x4U) -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_DN_SHIFT (2U) -/*! ACMP3_CMP_IGEN_TRIM_DN - * 0b0..no reduce - * 0b1..reduces - */ -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_DN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_DN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_DN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_DN_MASK (0x8U) -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_DN_SHIFT (3U) -/*! ACMP4_CMP_IGEN_TRIM_DN - * 0b0..no reduce - * 0b1..reduces - */ -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_DN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_DN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_DN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_UP_MASK (0x10U) -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_UP_SHIFT (4U) -/*! ACMP1_CMP_IGEN_TRIM_UP - * 0b0..no increase - * 0b1..increases - */ -#define IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_UP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_UP_SHIFT)) & IOMUXC_GPR_GPR14_ACMP1_CMP_IGEN_TRIM_UP_MASK) - -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_UP_MASK (0x20U) -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_UP_SHIFT (5U) -/*! ACMP2_CMP_IGEN_TRIM_UP - * 0b0..no increase - * 0b1..increases - */ -#define IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_UP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_UP_SHIFT)) & IOMUXC_GPR_GPR14_ACMP2_CMP_IGEN_TRIM_UP_MASK) - -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_UP_MASK (0x40U) -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_UP_SHIFT (6U) -/*! ACMP3_CMP_IGEN_TRIM_UP - * 0b0..no increase - * 0b1..increases - */ -#define IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_UP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_UP_SHIFT)) & IOMUXC_GPR_GPR14_ACMP3_CMP_IGEN_TRIM_UP_MASK) - -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_UP_MASK (0x80U) -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_UP_SHIFT (7U) -/*! ACMP4_CMP_IGEN_TRIM_UP - * 0b0..no increase - * 0b1..increases - */ -#define IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_UP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_UP_SHIFT)) & IOMUXC_GPR_GPR14_ACMP4_CMP_IGEN_TRIM_UP_MASK) - -#define IOMUXC_GPR_GPR14_ACMP1_SAMPLE_SYNC_EN_MASK (0x100U) -#define IOMUXC_GPR_GPR14_ACMP1_SAMPLE_SYNC_EN_SHIFT (8U) -/*! ACMP1_SAMPLE_SYNC_EN - * 0b0..select XBAR output - * 0b1..select synced sample_lv - */ -#define IOMUXC_GPR_GPR14_ACMP1_SAMPLE_SYNC_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP1_SAMPLE_SYNC_EN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP1_SAMPLE_SYNC_EN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP2_SAMPLE_SYNC_EN_MASK (0x200U) -#define IOMUXC_GPR_GPR14_ACMP2_SAMPLE_SYNC_EN_SHIFT (9U) -/*! ACMP2_SAMPLE_SYNC_EN - * 0b0..select XBAR output - * 0b1..select synced sample_lv - */ -#define IOMUXC_GPR_GPR14_ACMP2_SAMPLE_SYNC_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP2_SAMPLE_SYNC_EN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP2_SAMPLE_SYNC_EN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP3_SAMPLE_SYNC_EN_MASK (0x400U) -#define IOMUXC_GPR_GPR14_ACMP3_SAMPLE_SYNC_EN_SHIFT (10U) -/*! ACMP3_SAMPLE_SYNC_EN - * 0b0..select XBAR output - * 0b1..select synced sample_lv - */ -#define IOMUXC_GPR_GPR14_ACMP3_SAMPLE_SYNC_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP3_SAMPLE_SYNC_EN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP3_SAMPLE_SYNC_EN_MASK) - -#define IOMUXC_GPR_GPR14_ACMP4_SAMPLE_SYNC_EN_MASK (0x800U) -#define IOMUXC_GPR_GPR14_ACMP4_SAMPLE_SYNC_EN_SHIFT (11U) -/*! ACMP4_SAMPLE_SYNC_EN - * 0b0..select XBAR output - * 0b1..select synced sample_lv - */ -#define IOMUXC_GPR_GPR14_ACMP4_SAMPLE_SYNC_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_ACMP4_SAMPLE_SYNC_EN_SHIFT)) & IOMUXC_GPR_GPR14_ACMP4_SAMPLE_SYNC_EN_MASK) - -#define IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK (0xF0000U) -#define IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_SHIFT (16U) -/*! CM7_CFGITCMSZ - * 0b0000..0 KB (No ITCM) - * 0b0011..4 KB - * 0b0100..8 KB - * 0b0101..16 KB - * 0b0110..32 KB - * 0b0111..64 KB - * 0b1000..128 KB - * 0b1001..256 KB - * 0b1010..512 KB - */ -#define IOMUXC_GPR_GPR14_CM7_CFGITCMSZ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_SHIFT)) & IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK) - -#define IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK (0xF00000U) -#define IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_SHIFT (20U) -/*! CM7_CFGDTCMSZ - * 0b0000..0 KB (No DTCM) - * 0b0011..4 KB - * 0b0100..8 KB - * 0b0101..16 KB - * 0b0110..32 KB - * 0b0111..64 KB - * 0b1000..128 KB - * 0b1001..256 KB - * 0b1010..512 KB - */ -#define IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_SHIFT)) & IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK) -/*! @} */ - -/*! @name GPR16 - GPR16 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK (0x1U) -#define IOMUXC_GPR_GPR16_INIT_ITCM_EN_SHIFT (0U) -/*! INIT_ITCM_EN - * 0b0..ITCM is disabled - * 0b1..ITCM is enabled - */ -#define IOMUXC_GPR_GPR16_INIT_ITCM_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR16_INIT_ITCM_EN_SHIFT)) & IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK) - -#define IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK (0x2U) -#define IOMUXC_GPR_GPR16_INIT_DTCM_EN_SHIFT (1U) -/*! INIT_DTCM_EN - * 0b0..DTCM is disabled - * 0b1..DTCM is enabled - */ -#define IOMUXC_GPR_GPR16_INIT_DTCM_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR16_INIT_DTCM_EN_SHIFT)) & IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK) - -#define IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK (0x4U) -#define IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_SHIFT (2U) -/*! FLEXRAM_BANK_CFG_SEL - * 0b0..use fuse value to config - * 0b1..use FLEXRAM_BANK_CFG to config - */ -#define IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_SHIFT)) & IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK) -/*! @} */ - -/*! @name GPR17 - GPR17 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG_MASK (0xFFFFFFFFU) -#define IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG_SHIFT (0U) -/*! FLEXRAM_BANK_CFG - FlexRAM bank config value - */ -#define IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG_SHIFT)) & IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG_MASK) -/*! @} */ - -/*! @name GPR18 - GPR18 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR18_LOCK_M7_APC_AC_R0_BOT_MASK (0x1U) -#define IOMUXC_GPR_GPR18_LOCK_M7_APC_AC_R0_BOT_SHIFT (0U) -/*! LOCK_M7_APC_AC_R0_BOT - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR18_LOCK_M7_APC_AC_R0_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR18_LOCK_M7_APC_AC_R0_BOT_SHIFT)) & IOMUXC_GPR_GPR18_LOCK_M7_APC_AC_R0_BOT_MASK) - -#define IOMUXC_GPR_GPR18_M7_APC_AC_R0_BOT_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR18_M7_APC_AC_R0_BOT_SHIFT (3U) -#define IOMUXC_GPR_GPR18_M7_APC_AC_R0_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR18_M7_APC_AC_R0_BOT_SHIFT)) & IOMUXC_GPR_GPR18_M7_APC_AC_R0_BOT_MASK) -/*! @} */ - -/*! @name GPR19 - GPR19 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR19_LOCK_M7_APC_AC_R0_TOP_MASK (0x1U) -#define IOMUXC_GPR_GPR19_LOCK_M7_APC_AC_R0_TOP_SHIFT (0U) -/*! LOCK_M7_APC_AC_R0_TOP - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR19_LOCK_M7_APC_AC_R0_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR19_LOCK_M7_APC_AC_R0_TOP_SHIFT)) & IOMUXC_GPR_GPR19_LOCK_M7_APC_AC_R0_TOP_MASK) - -#define IOMUXC_GPR_GPR19_M7_APC_AC_R0_TOP_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR19_M7_APC_AC_R0_TOP_SHIFT (3U) -#define IOMUXC_GPR_GPR19_M7_APC_AC_R0_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR19_M7_APC_AC_R0_TOP_SHIFT)) & IOMUXC_GPR_GPR19_M7_APC_AC_R0_TOP_MASK) -/*! @} */ - -/*! @name GPR20 - GPR20 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR20_LOCK_M7_APC_AC_R1_BOT_MASK (0x1U) -#define IOMUXC_GPR_GPR20_LOCK_M7_APC_AC_R1_BOT_SHIFT (0U) -/*! LOCK_M7_APC_AC_R1_BOT - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR20_LOCK_M7_APC_AC_R1_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR20_LOCK_M7_APC_AC_R1_BOT_SHIFT)) & IOMUXC_GPR_GPR20_LOCK_M7_APC_AC_R1_BOT_MASK) - -#define IOMUXC_GPR_GPR20_M7_APC_AC_R1_BOT_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR20_M7_APC_AC_R1_BOT_SHIFT (3U) -#define IOMUXC_GPR_GPR20_M7_APC_AC_R1_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR20_M7_APC_AC_R1_BOT_SHIFT)) & IOMUXC_GPR_GPR20_M7_APC_AC_R1_BOT_MASK) -/*! @} */ - -/*! @name GPR21 - GPR21 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR21_LOCK_M7_APC_AC_R1_TOP_MASK (0x1U) -#define IOMUXC_GPR_GPR21_LOCK_M7_APC_AC_R1_TOP_SHIFT (0U) -/*! LOCK_M7_APC_AC_R1_TOP - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR21_LOCK_M7_APC_AC_R1_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR21_LOCK_M7_APC_AC_R1_TOP_SHIFT)) & IOMUXC_GPR_GPR21_LOCK_M7_APC_AC_R1_TOP_MASK) - -#define IOMUXC_GPR_GPR21_M7_APC_AC_R1_TOP_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR21_M7_APC_AC_R1_TOP_SHIFT (3U) -#define IOMUXC_GPR_GPR21_M7_APC_AC_R1_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR21_M7_APC_AC_R1_TOP_SHIFT)) & IOMUXC_GPR_GPR21_M7_APC_AC_R1_TOP_MASK) -/*! @} */ - -/*! @name GPR22 - GPR22 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR22_LOCK_M7_APC_AC_R2_BOT_MASK (0x1U) -#define IOMUXC_GPR_GPR22_LOCK_M7_APC_AC_R2_BOT_SHIFT (0U) -/*! LOCK_M7_APC_AC_R2_BOT - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR22_LOCK_M7_APC_AC_R2_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR22_LOCK_M7_APC_AC_R2_BOT_SHIFT)) & IOMUXC_GPR_GPR22_LOCK_M7_APC_AC_R2_BOT_MASK) - -#define IOMUXC_GPR_GPR22_M7_APC_AC_R2_BOT_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR22_M7_APC_AC_R2_BOT_SHIFT (3U) -#define IOMUXC_GPR_GPR22_M7_APC_AC_R2_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR22_M7_APC_AC_R2_BOT_SHIFT)) & IOMUXC_GPR_GPR22_M7_APC_AC_R2_BOT_MASK) -/*! @} */ - -/*! @name GPR23 - GPR23 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR23_LOCK_M7_APC_AC_R2_TOP_MASK (0x1U) -#define IOMUXC_GPR_GPR23_LOCK_M7_APC_AC_R2_TOP_SHIFT (0U) -/*! LOCK_M7_APC_AC_R2_TOP - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR23_LOCK_M7_APC_AC_R2_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR23_LOCK_M7_APC_AC_R2_TOP_SHIFT)) & IOMUXC_GPR_GPR23_LOCK_M7_APC_AC_R2_TOP_MASK) - -#define IOMUXC_GPR_GPR23_M7_APC_AC_R2_TOP_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR23_M7_APC_AC_R2_TOP_SHIFT (3U) -#define IOMUXC_GPR_GPR23_M7_APC_AC_R2_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR23_M7_APC_AC_R2_TOP_SHIFT)) & IOMUXC_GPR_GPR23_M7_APC_AC_R2_TOP_MASK) -/*! @} */ - -/*! @name GPR24 - GPR24 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR24_LOCK_M7_APC_AC_R3_BOT_MASK (0x1U) -#define IOMUXC_GPR_GPR24_LOCK_M7_APC_AC_R3_BOT_SHIFT (0U) -/*! LOCK_M7_APC_AC_R3_BOT - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR24_LOCK_M7_APC_AC_R3_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR24_LOCK_M7_APC_AC_R3_BOT_SHIFT)) & IOMUXC_GPR_GPR24_LOCK_M7_APC_AC_R3_BOT_MASK) - -#define IOMUXC_GPR_GPR24_M7_APC_AC_R3_BOT_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR24_M7_APC_AC_R3_BOT_SHIFT (3U) -#define IOMUXC_GPR_GPR24_M7_APC_AC_R3_BOT(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR24_M7_APC_AC_R3_BOT_SHIFT)) & IOMUXC_GPR_GPR24_M7_APC_AC_R3_BOT_MASK) -/*! @} */ - -/*! @name GPR25 - GPR25 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_GPR_GPR25_LOCK_M7_APC_AC_R3_TOP_MASK (0x1U) -#define IOMUXC_GPR_GPR25_LOCK_M7_APC_AC_R3_TOP_SHIFT (0U) -/*! LOCK_M7_APC_AC_R3_TOP - * 0b0..Register field [31:1] is not locked - * 0b1..Register field [31:1] is locked (read access only) - */ -#define IOMUXC_GPR_GPR25_LOCK_M7_APC_AC_R3_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR25_LOCK_M7_APC_AC_R3_TOP_SHIFT)) & IOMUXC_GPR_GPR25_LOCK_M7_APC_AC_R3_TOP_MASK) - -#define IOMUXC_GPR_GPR25_M7_APC_AC_R3_TOP_MASK (0xFFFFFFF8U) -#define IOMUXC_GPR_GPR25_M7_APC_AC_R3_TOP_SHIFT (3U) -#define IOMUXC_GPR_GPR25_M7_APC_AC_R3_TOP(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_GPR_GPR25_M7_APC_AC_R3_TOP_SHIFT)) & IOMUXC_GPR_GPR25_M7_APC_AC_R3_TOP_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group IOMUXC_GPR_Register_Masks */ - - -/* IOMUXC_GPR - Peripheral instance base addresses */ -/** Peripheral IOMUXC_GPR base address */ -#define IOMUXC_GPR_BASE (0x400AC000u) -/** Peripheral IOMUXC_GPR base pointer */ -#define IOMUXC_GPR ((IOMUXC_GPR_Type *)IOMUXC_GPR_BASE) -/** Array initializer of IOMUXC_GPR peripheral base addresses */ -#define IOMUXC_GPR_BASE_ADDRS { IOMUXC_GPR_BASE } -/** Array initializer of IOMUXC_GPR peripheral base pointers */ -#define IOMUXC_GPR_BASE_PTRS { IOMUXC_GPR } - -/*! - * @} - */ /* end of group IOMUXC_GPR_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- IOMUXC_SNVS Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_SNVS_Peripheral_Access_Layer IOMUXC_SNVS Peripheral Access Layer - * @{ - */ - -/** IOMUXC_SNVS - Register Layout Typedef */ -typedef struct { - __IO uint32_t SW_MUX_CTL_PAD_WAKEUP; /**< SW_MUX_CTL_PAD_WAKEUP SW MUX Control Register, offset: 0x0 */ - __IO uint32_t SW_MUX_CTL_PAD_PMIC_ON_REQ; /**< SW_MUX_CTL_PAD_PMIC_ON_REQ SW MUX Control Register, offset: 0x4 */ - __IO uint32_t SW_MUX_CTL_PAD_PMIC_STBY_REQ; /**< SW_MUX_CTL_PAD_PMIC_STBY_REQ SW MUX Control Register, offset: 0x8 */ - __IO uint32_t SW_PAD_CTL_PAD_TEST_MODE; /**< SW_PAD_CTL_PAD_TEST_MODE SW PAD Control Register, offset: 0xC */ - __IO uint32_t SW_PAD_CTL_PAD_POR_B; /**< SW_PAD_CTL_PAD_POR_B SW PAD Control Register, offset: 0x10 */ - __IO uint32_t SW_PAD_CTL_PAD_ONOFF; /**< SW_PAD_CTL_PAD_ONOFF SW PAD Control Register, offset: 0x14 */ - __IO uint32_t SW_PAD_CTL_PAD_WAKEUP; /**< SW_PAD_CTL_PAD_WAKEUP SW PAD Control Register, offset: 0x18 */ - __IO uint32_t SW_PAD_CTL_PAD_PMIC_ON_REQ; /**< SW_PAD_CTL_PAD_PMIC_ON_REQ SW PAD Control Register, offset: 0x1C */ - __IO uint32_t SW_PAD_CTL_PAD_PMIC_STBY_REQ; /**< SW_PAD_CTL_PAD_PMIC_STBY_REQ SW PAD Control Register, offset: 0x20 */ -} IOMUXC_SNVS_Type; - -/* ---------------------------------------------------------------------------- - -- IOMUXC_SNVS Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_SNVS_Register_Masks IOMUXC_SNVS Register Masks - * @{ - */ - -/*! @name SW_MUX_CTL_PAD_WAKEUP - SW_MUX_CTL_PAD_WAKEUP SW MUX Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_MUX_MODE_MASK (0x7U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_MUX_MODE_SHIFT (0U) -/*! MUX_MODE - MUX Mode Select Field. - * 0b101..Select mux mode: ALT5 mux port: GPIO5_IO00 of instance: gpio5 - * 0b111..Select mux mode: ALT7 mux port: NMI_GLUE_NMI of instance: nmi_glue - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_MUX_MODE_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_MUX_MODE_MASK) - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_SION_MASK (0x10U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_SION_SHIFT (4U) -/*! SION - Software Input On Field. - * 0b1..Force input path of pad WAKEUP - * 0b0..Input Path is determined by functionality - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_SION_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_WAKEUP_SION_MASK) -/*! @} */ - -/*! @name SW_MUX_CTL_PAD_PMIC_ON_REQ - SW_MUX_CTL_PAD_PMIC_ON_REQ SW MUX Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_MUX_MODE_MASK (0x7U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_MUX_MODE_SHIFT (0U) -/*! MUX_MODE - MUX Mode Select Field. - * 0b000..Select mux mode: ALT0 mux port: SNVS_LP_PMIC_ON_REQ of instance: snvs_lp - * 0b101..Select mux mode: ALT5 mux port: GPIO5_IO01 of instance: gpio5 - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_MUX_MODE_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_MUX_MODE_MASK) - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_SION_MASK (0x10U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_SION_SHIFT (4U) -/*! SION - Software Input On Field. - * 0b1..Force input path of pad PMIC_ON_REQ - * 0b0..Input Path is determined by functionality - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_SION_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_ON_REQ_SION_MASK) -/*! @} */ - -/*! @name SW_MUX_CTL_PAD_PMIC_STBY_REQ - SW_MUX_CTL_PAD_PMIC_STBY_REQ SW MUX Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_MUX_MODE_MASK (0x7U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_MUX_MODE_SHIFT (0U) -/*! MUX_MODE - MUX Mode Select Field. - * 0b000..Select mux mode: ALT0 mux port: CCM_PMIC_VSTBY_REQ of instance: ccm - * 0b101..Select mux mode: ALT5 mux port: GPIO5_IO02 of instance: gpio5 - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_MUX_MODE_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_MUX_MODE_MASK) - -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_SION_MASK (0x10U) -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_SION_SHIFT (4U) -/*! SION - Software Input On Field. - * 0b1..Force input path of pad PMIC_STBY_REQ - * 0b0..Input Path is determined by functionality - */ -#define IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_SION_SHIFT)) & IOMUXC_SNVS_SW_MUX_CTL_PAD_PMIC_STBY_REQ_SION_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_TEST_MODE - SW_PAD_CTL_PAD_TEST_MODE SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_TEST_MODE_HYS_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_POR_B - SW_PAD_CTL_PAD_POR_B SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_POR_B_HYS_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_ONOFF - SW_PAD_CTL_PAD_ONOFF SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_ONOFF_HYS_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_WAKEUP - SW_PAD_CTL_PAD_WAKEUP SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_WAKEUP_HYS_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_PMIC_ON_REQ - SW_PAD_CTL_PAD_PMIC_ON_REQ SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_ON_REQ_HYS_MASK) -/*! @} */ - -/*! @name SW_PAD_CTL_PAD_PMIC_STBY_REQ - SW_PAD_CTL_PAD_PMIC_STBY_REQ SW PAD Control Register */ -/*! @{ */ - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SRE_MASK (0x1U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SRE_SHIFT (0U) -/*! SRE - Slew Rate Field - * 0b0..Slow Slew Rate - * 0b1..Fast Slew Rate - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SRE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SRE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SRE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_DSE_MASK (0x38U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_DSE_SHIFT (3U) -/*! DSE - Drive Strength Field - * 0b000..output driver disabled; - * 0b001..R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR) - * 0b010..R0/2 - * 0b011..R0/3 - * 0b100..R0/4 - * 0b101..R0/5 - * 0b110..R0/6 - * 0b111..R0/7 - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_DSE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_DSE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SPEED_MASK (0xC0U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SPEED_SHIFT (6U) -/*! SPEED - Speed Field - * 0b10..medium(100MHz) - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SPEED(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SPEED_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_SPEED_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_ODE_MASK (0x800U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_ODE_SHIFT (11U) -/*! ODE - Open Drain Enable Field - * 0b0..Open Drain Disabled - * 0b1..Open Drain Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_ODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_ODE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_ODE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PKE_MASK (0x1000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PKE_SHIFT (12U) -/*! PKE - Pull / Keep Enable Field - * 0b0..Pull/Keeper Disabled - * 0b1..Pull/Keeper Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PKE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PKE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUE_MASK (0x2000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUE_SHIFT (13U) -/*! PUE - Pull / Keep Select Field - * 0b0..Keeper - * 0b1..Pull - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUE_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUE_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUS_MASK (0xC000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUS_SHIFT (14U) -/*! PUS - Pull Up / Down Config. Field - * 0b00..100K Ohm Pull Down - * 0b01..47K Ohm Pull Up - * 0b10..100K Ohm Pull Up - * 0b11..22K Ohm Pull Up - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_PUS_MASK) - -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_HYS_MASK (0x10000U) -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_HYS_SHIFT (16U) -/*! HYS - Hyst. Enable Field - * 0b0..Hysteresis Disabled - * 0b1..Hysteresis Enabled - */ -#define IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_HYS_SHIFT)) & IOMUXC_SNVS_SW_PAD_CTL_PAD_PMIC_STBY_REQ_HYS_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group IOMUXC_SNVS_Register_Masks */ - - -/* IOMUXC_SNVS - Peripheral instance base addresses */ -/** Peripheral IOMUXC_SNVS base address */ -#define IOMUXC_SNVS_BASE (0x400A8000u) -/** Peripheral IOMUXC_SNVS base pointer */ -#define IOMUXC_SNVS ((IOMUXC_SNVS_Type *)IOMUXC_SNVS_BASE) -/** Array initializer of IOMUXC_SNVS peripheral base addresses */ -#define IOMUXC_SNVS_BASE_ADDRS { IOMUXC_SNVS_BASE } -/** Array initializer of IOMUXC_SNVS peripheral base pointers */ -#define IOMUXC_SNVS_BASE_PTRS { IOMUXC_SNVS } - -/*! - * @} - */ /* end of group IOMUXC_SNVS_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- IOMUXC_SNVS_GPR Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_SNVS_GPR_Peripheral_Access_Layer IOMUXC_SNVS_GPR Peripheral Access Layer - * @{ - */ - -/** IOMUXC_SNVS_GPR - Register Layout Typedef */ -typedef struct { - uint32_t GPR0; /**< GPR0 General Purpose Register, offset: 0x0 */ - uint32_t GPR1; /**< GPR1 General Purpose Register, offset: 0x4 */ - uint32_t GPR2; /**< GPR2 General Purpose Register, offset: 0x8 */ - __IO uint32_t GPR3; /**< GPR3 General Purpose Register, offset: 0xC */ -} IOMUXC_SNVS_GPR_Type; - -/* ---------------------------------------------------------------------------- - -- IOMUXC_SNVS_GPR Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup IOMUXC_SNVS_GPR_Register_Masks IOMUXC_SNVS_GPR Register Masks - * @{ - */ - -/*! @name GPR3 - GPR3 General Purpose Register */ -/*! @{ */ - -#define IOMUXC_SNVS_GPR_GPR3_LPSR_MODE_ENABLE_MASK (0x1U) -#define IOMUXC_SNVS_GPR_GPR3_LPSR_MODE_ENABLE_SHIFT (0U) -#define IOMUXC_SNVS_GPR_GPR3_LPSR_MODE_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_LPSR_MODE_ENABLE_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_LPSR_MODE_ENABLE_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STATUS_CAPT_CLR_MASK (0x2U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STATUS_CAPT_CLR_SHIFT (1U) -/*! DCDC_STATUS_CAPT_CLR - DCDC captured status clear - */ -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STATUS_CAPT_CLR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_DCDC_STATUS_CAPT_CLR_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_DCDC_STATUS_CAPT_CLR_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_POR_PULL_TYPE_MASK (0xCU) -#define IOMUXC_SNVS_GPR_GPR3_POR_PULL_TYPE_SHIFT (2U) -#define IOMUXC_SNVS_GPR_GPR3_POR_PULL_TYPE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_POR_PULL_TYPE_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_POR_PULL_TYPE_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_DCDC_IN_LOW_VOL_MASK (0x10000U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_IN_LOW_VOL_SHIFT (16U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_IN_LOW_VOL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_DCDC_IN_LOW_VOL_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_DCDC_IN_LOW_VOL_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_CUR_MASK (0x20000U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_CUR_SHIFT (17U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_CUR(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_CUR_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_CUR_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_VOL_MASK (0x40000U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_VOL_SHIFT (18U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_VOL(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_VOL_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_DCDC_OVER_VOL_MASK) - -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STS_DC_OK_MASK (0x80000U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STS_DC_OK_SHIFT (19U) -#define IOMUXC_SNVS_GPR_GPR3_DCDC_STS_DC_OK(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SNVS_GPR_GPR3_DCDC_STS_DC_OK_SHIFT)) & IOMUXC_SNVS_GPR_GPR3_DCDC_STS_DC_OK_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group IOMUXC_SNVS_GPR_Register_Masks */ - - -/* IOMUXC_SNVS_GPR - Peripheral instance base addresses */ -/** Peripheral IOMUXC_SNVS_GPR base address */ -#define IOMUXC_SNVS_GPR_BASE (0x400A4000u) -/** Peripheral IOMUXC_SNVS_GPR base pointer */ -#define IOMUXC_SNVS_GPR ((IOMUXC_SNVS_GPR_Type *)IOMUXC_SNVS_GPR_BASE) -/** Array initializer of IOMUXC_SNVS_GPR peripheral base addresses */ -#define IOMUXC_SNVS_GPR_BASE_ADDRS { IOMUXC_SNVS_GPR_BASE } -/** Array initializer of IOMUXC_SNVS_GPR peripheral base pointers */ -#define IOMUXC_SNVS_GPR_BASE_PTRS { IOMUXC_SNVS_GPR } - -/*! - * @} - */ /* end of group IOMUXC_SNVS_GPR_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- KPP Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup KPP_Peripheral_Access_Layer KPP Peripheral Access Layer - * @{ - */ - -/** KPP - Register Layout Typedef */ -typedef struct { - __IO uint16_t KPCR; /**< Keypad Control Register, offset: 0x0 */ - __IO uint16_t KPSR; /**< Keypad Status Register, offset: 0x2 */ - __IO uint16_t KDDR; /**< Keypad Data Direction Register, offset: 0x4 */ - __IO uint16_t KPDR; /**< Keypad Data Register, offset: 0x6 */ -} KPP_Type; - -/* ---------------------------------------------------------------------------- - -- KPP Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup KPP_Register_Masks KPP Register Masks - * @{ - */ - -/*! @name KPCR - Keypad Control Register */ -/*! @{ */ - -#define KPP_KPCR_KRE_MASK (0xFFU) -#define KPP_KPCR_KRE_SHIFT (0U) -/*! KRE - * 0b00000000..Row is not included in the keypad key press detect. - * 0b00000001..Row is included in the keypad key press detect. - */ -#define KPP_KPCR_KRE(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPCR_KRE_SHIFT)) & KPP_KPCR_KRE_MASK) - -#define KPP_KPCR_KCO_MASK (0xFF00U) -#define KPP_KPCR_KCO_SHIFT (8U) -/*! KCO - * 0b00000000..Column strobe output is totem pole drive. - * 0b00000001..Column strobe output is open drain. - */ -#define KPP_KPCR_KCO(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPCR_KCO_SHIFT)) & KPP_KPCR_KCO_MASK) -/*! @} */ - -/*! @name KPSR - Keypad Status Register */ -/*! @{ */ - -#define KPP_KPSR_KPKD_MASK (0x1U) -#define KPP_KPSR_KPKD_SHIFT (0U) -/*! KPKD - * 0b0..No key presses detected - * 0b1..A key has been depressed - */ -#define KPP_KPSR_KPKD(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KPKD_SHIFT)) & KPP_KPSR_KPKD_MASK) - -#define KPP_KPSR_KPKR_MASK (0x2U) -#define KPP_KPSR_KPKR_SHIFT (1U) -/*! KPKR - * 0b0..No key release detected - * 0b1..All keys have been released - */ -#define KPP_KPSR_KPKR(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KPKR_SHIFT)) & KPP_KPSR_KPKR_MASK) - -#define KPP_KPSR_KDSC_MASK (0x4U) -#define KPP_KPSR_KDSC_SHIFT (2U) -/*! KDSC - * 0b0..No effect - * 0b1..Set bits that clear the keypad depress synchronizer chain - */ -#define KPP_KPSR_KDSC(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KDSC_SHIFT)) & KPP_KPSR_KDSC_MASK) - -#define KPP_KPSR_KRSS_MASK (0x8U) -#define KPP_KPSR_KRSS_SHIFT (3U) -/*! KRSS - * 0b0..No effect - * 0b1..Set bits which sets keypad release synchronizer chain - */ -#define KPP_KPSR_KRSS(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KRSS_SHIFT)) & KPP_KPSR_KRSS_MASK) - -#define KPP_KPSR_KDIE_MASK (0x100U) -#define KPP_KPSR_KDIE_SHIFT (8U) -/*! KDIE - * 0b0..No interrupt request is generated when KPKD is set. - * 0b1..An interrupt request is generated when KPKD is set. - */ -#define KPP_KPSR_KDIE(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KDIE_SHIFT)) & KPP_KPSR_KDIE_MASK) - -#define KPP_KPSR_KRIE_MASK (0x200U) -#define KPP_KPSR_KRIE_SHIFT (9U) -/*! KRIE - * 0b0..No interrupt request is generated when KPKR is set. - * 0b1..An interrupt request is generated when KPKR is set. - */ -#define KPP_KPSR_KRIE(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPSR_KRIE_SHIFT)) & KPP_KPSR_KRIE_MASK) -/*! @} */ - -/*! @name KDDR - Keypad Data Direction Register */ -/*! @{ */ - -#define KPP_KDDR_KRDD_MASK (0xFFU) -#define KPP_KDDR_KRDD_SHIFT (0U) -/*! KRDD - * 0b00000000..ROWn pin configured as an input. - * 0b00000001..ROWn pin configured as an output. - */ -#define KPP_KDDR_KRDD(x) (((uint16_t)(((uint16_t)(x)) << KPP_KDDR_KRDD_SHIFT)) & KPP_KDDR_KRDD_MASK) - -#define KPP_KDDR_KCDD_MASK (0xFF00U) -#define KPP_KDDR_KCDD_SHIFT (8U) -/*! KCDD - * 0b00000000..COLn pin is configured as an input. - * 0b00000001..COLn pin is configured as an output. - */ -#define KPP_KDDR_KCDD(x) (((uint16_t)(((uint16_t)(x)) << KPP_KDDR_KCDD_SHIFT)) & KPP_KDDR_KCDD_MASK) -/*! @} */ - -/*! @name KPDR - Keypad Data Register */ -/*! @{ */ - -#define KPP_KPDR_KRD_MASK (0xFFU) -#define KPP_KPDR_KRD_SHIFT (0U) -#define KPP_KPDR_KRD(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPDR_KRD_SHIFT)) & KPP_KPDR_KRD_MASK) - -#define KPP_KPDR_KCD_MASK (0xFF00U) -#define KPP_KPDR_KCD_SHIFT (8U) -#define KPP_KPDR_KCD(x) (((uint16_t)(((uint16_t)(x)) << KPP_KPDR_KCD_SHIFT)) & KPP_KPDR_KCD_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group KPP_Register_Masks */ - - -/* KPP - Peripheral instance base addresses */ -/** Peripheral KPP base address */ -#define KPP_BASE (0x401FC000u) -/** Peripheral KPP base pointer */ -#define KPP ((KPP_Type *)KPP_BASE) -/** Array initializer of KPP peripheral base addresses */ -#define KPP_BASE_ADDRS { KPP_BASE } -/** Array initializer of KPP peripheral base pointers */ -#define KPP_BASE_PTRS { KPP } -/** Interrupt vectors for the KPP peripheral type */ -#define KPP_IRQS { KPP_IRQn } - -/*! - * @} - */ /* end of group KPP_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- LCDIF Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LCDIF_Peripheral_Access_Layer LCDIF Peripheral Access Layer - * @{ - */ - -/** LCDIF - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< LCDIF General Control Register, offset: 0x0 */ - __IO uint32_t CTRL_SET; /**< LCDIF General Control Register, offset: 0x4 */ - __IO uint32_t CTRL_CLR; /**< LCDIF General Control Register, offset: 0x8 */ - __IO uint32_t CTRL_TOG; /**< LCDIF General Control Register, offset: 0xC */ - __IO uint32_t CTRL1; /**< LCDIF General Control1 Register, offset: 0x10 */ - __IO uint32_t CTRL1_SET; /**< LCDIF General Control1 Register, offset: 0x14 */ - __IO uint32_t CTRL1_CLR; /**< LCDIF General Control1 Register, offset: 0x18 */ - __IO uint32_t CTRL1_TOG; /**< LCDIF General Control1 Register, offset: 0x1C */ - __IO uint32_t CTRL2; /**< LCDIF General Control2 Register, offset: 0x20 */ - __IO uint32_t CTRL2_SET; /**< LCDIF General Control2 Register, offset: 0x24 */ - __IO uint32_t CTRL2_CLR; /**< LCDIF General Control2 Register, offset: 0x28 */ - __IO uint32_t CTRL2_TOG; /**< LCDIF General Control2 Register, offset: 0x2C */ - __IO uint32_t TRANSFER_COUNT; /**< LCDIF Horizontal and Vertical Valid Data Count Register, offset: 0x30 */ - uint8_t RESERVED_0[12]; - __IO uint32_t CUR_BUF; /**< LCD Interface Current Buffer Address Register, offset: 0x40 */ - uint8_t RESERVED_1[12]; - __IO uint32_t NEXT_BUF; /**< LCD Interface Next Buffer Address Register, offset: 0x50 */ - uint8_t RESERVED_2[28]; - __IO uint32_t VDCTRL0; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register0, offset: 0x70 */ - __IO uint32_t VDCTRL0_SET; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register0, offset: 0x74 */ - __IO uint32_t VDCTRL0_CLR; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register0, offset: 0x78 */ - __IO uint32_t VDCTRL0_TOG; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register0, offset: 0x7C */ - __IO uint32_t VDCTRL1; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register1, offset: 0x80 */ - uint8_t RESERVED_3[12]; - __IO uint32_t VDCTRL2; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register2, offset: 0x90 */ - uint8_t RESERVED_4[12]; - __IO uint32_t VDCTRL3; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register3, offset: 0xA0 */ - uint8_t RESERVED_5[12]; - __IO uint32_t VDCTRL4; /**< LCDIF VSYNC Mode and Dotclk Mode Control Register4, offset: 0xB0 */ - uint8_t RESERVED_6[220]; - __IO uint32_t BM_ERROR_STAT; /**< Bus Master Error Status Register, offset: 0x190 */ - uint8_t RESERVED_7[12]; - __IO uint32_t CRC_STAT; /**< CRC Status Register, offset: 0x1A0 */ - uint8_t RESERVED_8[12]; - __I uint32_t STAT; /**< LCD Interface Status Register, offset: 0x1B0 */ - uint8_t RESERVED_9[76]; - __IO uint32_t THRES; /**< LCDIF Threshold Register, offset: 0x200 */ - uint8_t RESERVED_10[380]; - __IO uint32_t PIGEONCTRL0; /**< LCDIF Pigeon Mode Control0 Register, offset: 0x380 */ - __IO uint32_t PIGEONCTRL0_SET; /**< LCDIF Pigeon Mode Control0 Register, offset: 0x384 */ - __IO uint32_t PIGEONCTRL0_CLR; /**< LCDIF Pigeon Mode Control0 Register, offset: 0x388 */ - __IO uint32_t PIGEONCTRL0_TOG; /**< LCDIF Pigeon Mode Control0 Register, offset: 0x38C */ - __IO uint32_t PIGEONCTRL1; /**< LCDIF Pigeon Mode Control1 Register, offset: 0x390 */ - __IO uint32_t PIGEONCTRL1_SET; /**< LCDIF Pigeon Mode Control1 Register, offset: 0x394 */ - __IO uint32_t PIGEONCTRL1_CLR; /**< LCDIF Pigeon Mode Control1 Register, offset: 0x398 */ - __IO uint32_t PIGEONCTRL1_TOG; /**< LCDIF Pigeon Mode Control1 Register, offset: 0x39C */ - __IO uint32_t PIGEONCTRL2; /**< LCDIF Pigeon Mode Control2 Register, offset: 0x3A0 */ - __IO uint32_t PIGEONCTRL2_SET; /**< LCDIF Pigeon Mode Control2 Register, offset: 0x3A4 */ - __IO uint32_t PIGEONCTRL2_CLR; /**< LCDIF Pigeon Mode Control2 Register, offset: 0x3A8 */ - __IO uint32_t PIGEONCTRL2_TOG; /**< LCDIF Pigeon Mode Control2 Register, offset: 0x3AC */ - uint8_t RESERVED_11[1104]; - struct { /* offset: 0x800, array step: 0x40 */ - __IO uint32_t PIGEON_0; /**< Panel Interface Signal Generator Register, array offset: 0x800, array step: 0x40 */ - uint8_t RESERVED_0[12]; - __IO uint32_t PIGEON_1; /**< Panel Interface Signal Generator Register, array offset: 0x810, array step: 0x40 */ - uint8_t RESERVED_1[12]; - __IO uint32_t PIGEON_2; /**< Panel Interface Signal Generator Register, array offset: 0x820, array step: 0x40 */ - uint8_t RESERVED_2[28]; - } PIGEON[12]; - __IO uint32_t LUT_CTRL; /**< Lookup Table Data Register., offset: 0xB00 */ - uint8_t RESERVED_12[12]; - __IO uint32_t LUT0_ADDR; /**< Lookup Table Control Register., offset: 0xB10 */ - uint8_t RESERVED_13[12]; - __IO uint32_t LUT0_DATA; /**< Lookup Table Data Register., offset: 0xB20 */ - uint8_t RESERVED_14[12]; - __IO uint32_t LUT1_ADDR; /**< Lookup Table Control Register., offset: 0xB30 */ - uint8_t RESERVED_15[12]; - __IO uint32_t LUT1_DATA; /**< Lookup Table Data Register., offset: 0xB40 */ -} LCDIF_Type; - -/* ---------------------------------------------------------------------------- - -- LCDIF Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LCDIF_Register_Masks LCDIF Register Masks - * @{ - */ - -/*! @name CTRL - LCDIF General Control Register */ -/*! @{ */ - -#define LCDIF_CTRL_RUN_MASK (0x1U) -#define LCDIF_CTRL_RUN_SHIFT (0U) -#define LCDIF_CTRL_RUN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_RUN_SHIFT)) & LCDIF_CTRL_RUN_MASK) - -#define LCDIF_CTRL_DATA_FORMAT_24_BIT_MASK (0x2U) -#define LCDIF_CTRL_DATA_FORMAT_24_BIT_SHIFT (1U) -/*! DATA_FORMAT_24_BIT - * 0b0..Data input to the block is in 24 bpp format, such that all RGB 888 data is contained in 24 bits. - * 0b1..Data input to the block is actually RGB 18 bpp, but there is 1 color per byte, hence the upper 2 bits in - * each byte do not contain any useful data, and should be dropped. - */ -#define LCDIF_CTRL_DATA_FORMAT_24_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_DATA_FORMAT_24_BIT_SHIFT)) & LCDIF_CTRL_DATA_FORMAT_24_BIT_MASK) - -#define LCDIF_CTRL_DATA_FORMAT_18_BIT_MASK (0x4U) -#define LCDIF_CTRL_DATA_FORMAT_18_BIT_SHIFT (2U) -/*! DATA_FORMAT_18_BIT - * 0b0..Data input to the block is in 18 bpp format, such that lower 18 bits contain RGB 666 and upper 14 bits do not contain any useful data. - * 0b1..Data input to the block is in 18 bpp format, such that upper 18 bits contain RGB 666 and lower 14 bits do not contain any useful data. - */ -#define LCDIF_CTRL_DATA_FORMAT_18_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_DATA_FORMAT_18_BIT_SHIFT)) & LCDIF_CTRL_DATA_FORMAT_18_BIT_MASK) - -#define LCDIF_CTRL_DATA_FORMAT_16_BIT_MASK (0x8U) -#define LCDIF_CTRL_DATA_FORMAT_16_BIT_SHIFT (3U) -#define LCDIF_CTRL_DATA_FORMAT_16_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_DATA_FORMAT_16_BIT_SHIFT)) & LCDIF_CTRL_DATA_FORMAT_16_BIT_MASK) - -#define LCDIF_CTRL_RSRVD0_MASK (0x10U) -#define LCDIF_CTRL_RSRVD0_SHIFT (4U) -#define LCDIF_CTRL_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_RSRVD0_SHIFT)) & LCDIF_CTRL_RSRVD0_MASK) - -#define LCDIF_CTRL_MASTER_MASK (0x20U) -#define LCDIF_CTRL_MASTER_SHIFT (5U) -#define LCDIF_CTRL_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_MASTER_SHIFT)) & LCDIF_CTRL_MASTER_MASK) - -#define LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK (0x40U) -#define LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_SHIFT (6U) -#define LCDIF_CTRL_ENABLE_PXP_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_SHIFT)) & LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK) - -#define LCDIF_CTRL_WORD_LENGTH_MASK (0x300U) -#define LCDIF_CTRL_WORD_LENGTH_SHIFT (8U) -/*! WORD_LENGTH - * 0b00..Input data is 16 bits per pixel. - * 0b01..Input data is 8 bits wide. - * 0b10..Input data is 18 bits per pixel. - * 0b11..Input data is 24 bits per pixel. - */ -#define LCDIF_CTRL_WORD_LENGTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_WORD_LENGTH_SHIFT)) & LCDIF_CTRL_WORD_LENGTH_MASK) - -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0xC00U) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_SHIFT (10U) -/*! LCD_DATABUS_WIDTH - * 0b00..16-bit data bus mode. - * 0b01..8-bit data bus mode. - * 0b10..18-bit data bus mode. - * 0b11..24-bit data bus mode. - */ -#define LCDIF_CTRL_LCD_DATABUS_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_LCD_DATABUS_WIDTH_SHIFT)) & LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK) - -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3000U) -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_SHIFT (12U) -/*! CSC_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_CSC_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CSC_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0xC000U) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_SHIFT (14U) -/*! INPUT_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_INPUT_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_DOTCLK_MODE_MASK (0x20000U) -#define LCDIF_CTRL_DOTCLK_MODE_SHIFT (17U) -#define LCDIF_CTRL_DOTCLK_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_DOTCLK_MODE_SHIFT)) & LCDIF_CTRL_DOTCLK_MODE_MASK) - -#define LCDIF_CTRL_BYPASS_COUNT_MASK (0x80000U) -#define LCDIF_CTRL_BYPASS_COUNT_SHIFT (19U) -#define LCDIF_CTRL_BYPASS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_BYPASS_COUNT_SHIFT)) & LCDIF_CTRL_BYPASS_COUNT_MASK) - -#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x3E00000U) -#define LCDIF_CTRL_SHIFT_NUM_BITS_SHIFT (21U) -#define LCDIF_CTRL_SHIFT_NUM_BITS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SHIFT_NUM_BITS_SHIFT)) & LCDIF_CTRL_SHIFT_NUM_BITS_MASK) - -#define LCDIF_CTRL_DATA_SHIFT_DIR_MASK (0x4000000U) -#define LCDIF_CTRL_DATA_SHIFT_DIR_SHIFT (26U) -/*! DATA_SHIFT_DIR - * 0b0..Data to be transmitted is shifted LEFT by SHIFT_NUM_BITS bits. - * 0b1..Data to be transmitted is shifted RIGHT by SHIFT_NUM_BITS bits. - */ -#define LCDIF_CTRL_DATA_SHIFT_DIR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_DATA_SHIFT_DIR_SHIFT)) & LCDIF_CTRL_DATA_SHIFT_DIR_MASK) - -#define LCDIF_CTRL_CLKGATE_MASK (0x40000000U) -#define LCDIF_CTRL_CLKGATE_SHIFT (30U) -#define LCDIF_CTRL_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLKGATE_SHIFT)) & LCDIF_CTRL_CLKGATE_MASK) - -#define LCDIF_CTRL_SFTRST_MASK (0x80000000U) -#define LCDIF_CTRL_SFTRST_SHIFT (31U) -#define LCDIF_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SFTRST_SHIFT)) & LCDIF_CTRL_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_SET - LCDIF General Control Register */ -/*! @{ */ - -#define LCDIF_CTRL_SET_RUN_MASK (0x1U) -#define LCDIF_CTRL_SET_RUN_SHIFT (0U) -#define LCDIF_CTRL_SET_RUN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_RUN_SHIFT)) & LCDIF_CTRL_SET_RUN_MASK) - -#define LCDIF_CTRL_SET_DATA_FORMAT_24_BIT_MASK (0x2U) -#define LCDIF_CTRL_SET_DATA_FORMAT_24_BIT_SHIFT (1U) -/*! DATA_FORMAT_24_BIT - * 0b0..Data input to the block is in 24 bpp format, such that all RGB 888 data is contained in 24 bits. - * 0b1..Data input to the block is actually RGB 18 bpp, but there is 1 color per byte, hence the upper 2 bits in - * each byte do not contain any useful data, and should be dropped. - */ -#define LCDIF_CTRL_SET_DATA_FORMAT_24_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_DATA_FORMAT_24_BIT_SHIFT)) & LCDIF_CTRL_SET_DATA_FORMAT_24_BIT_MASK) - -#define LCDIF_CTRL_SET_DATA_FORMAT_18_BIT_MASK (0x4U) -#define LCDIF_CTRL_SET_DATA_FORMAT_18_BIT_SHIFT (2U) -/*! DATA_FORMAT_18_BIT - * 0b0..Data input to the block is in 18 bpp format, such that lower 18 bits contain RGB 666 and upper 14 bits do not contain any useful data. - * 0b1..Data input to the block is in 18 bpp format, such that upper 18 bits contain RGB 666 and lower 14 bits do not contain any useful data. - */ -#define LCDIF_CTRL_SET_DATA_FORMAT_18_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_DATA_FORMAT_18_BIT_SHIFT)) & LCDIF_CTRL_SET_DATA_FORMAT_18_BIT_MASK) - -#define LCDIF_CTRL_SET_DATA_FORMAT_16_BIT_MASK (0x8U) -#define LCDIF_CTRL_SET_DATA_FORMAT_16_BIT_SHIFT (3U) -#define LCDIF_CTRL_SET_DATA_FORMAT_16_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_DATA_FORMAT_16_BIT_SHIFT)) & LCDIF_CTRL_SET_DATA_FORMAT_16_BIT_MASK) - -#define LCDIF_CTRL_SET_RSRVD0_MASK (0x10U) -#define LCDIF_CTRL_SET_RSRVD0_SHIFT (4U) -#define LCDIF_CTRL_SET_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_RSRVD0_SHIFT)) & LCDIF_CTRL_SET_RSRVD0_MASK) - -#define LCDIF_CTRL_SET_MASTER_MASK (0x20U) -#define LCDIF_CTRL_SET_MASTER_SHIFT (5U) -#define LCDIF_CTRL_SET_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_MASTER_SHIFT)) & LCDIF_CTRL_SET_MASTER_MASK) - -#define LCDIF_CTRL_SET_ENABLE_PXP_HANDSHAKE_MASK (0x40U) -#define LCDIF_CTRL_SET_ENABLE_PXP_HANDSHAKE_SHIFT (6U) -#define LCDIF_CTRL_SET_ENABLE_PXP_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_ENABLE_PXP_HANDSHAKE_SHIFT)) & LCDIF_CTRL_SET_ENABLE_PXP_HANDSHAKE_MASK) - -#define LCDIF_CTRL_SET_WORD_LENGTH_MASK (0x300U) -#define LCDIF_CTRL_SET_WORD_LENGTH_SHIFT (8U) -/*! WORD_LENGTH - * 0b00..Input data is 16 bits per pixel. - * 0b01..Input data is 8 bits wide. - * 0b10..Input data is 18 bits per pixel. - * 0b11..Input data is 24 bits per pixel. - */ -#define LCDIF_CTRL_SET_WORD_LENGTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_WORD_LENGTH_SHIFT)) & LCDIF_CTRL_SET_WORD_LENGTH_MASK) - -#define LCDIF_CTRL_SET_LCD_DATABUS_WIDTH_MASK (0xC00U) -#define LCDIF_CTRL_SET_LCD_DATABUS_WIDTH_SHIFT (10U) -/*! LCD_DATABUS_WIDTH - * 0b00..16-bit data bus mode. - * 0b01..8-bit data bus mode. - * 0b10..18-bit data bus mode. - * 0b11..24-bit data bus mode. - */ -#define LCDIF_CTRL_SET_LCD_DATABUS_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_LCD_DATABUS_WIDTH_SHIFT)) & LCDIF_CTRL_SET_LCD_DATABUS_WIDTH_MASK) - -#define LCDIF_CTRL_SET_CSC_DATA_SWIZZLE_MASK (0x3000U) -#define LCDIF_CTRL_SET_CSC_DATA_SWIZZLE_SHIFT (12U) -/*! CSC_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_SET_CSC_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_CSC_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_SET_CSC_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_SET_INPUT_DATA_SWIZZLE_MASK (0xC000U) -#define LCDIF_CTRL_SET_INPUT_DATA_SWIZZLE_SHIFT (14U) -/*! INPUT_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_SET_INPUT_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_INPUT_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_SET_INPUT_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_SET_DOTCLK_MODE_MASK (0x20000U) -#define LCDIF_CTRL_SET_DOTCLK_MODE_SHIFT (17U) -#define LCDIF_CTRL_SET_DOTCLK_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_DOTCLK_MODE_SHIFT)) & LCDIF_CTRL_SET_DOTCLK_MODE_MASK) - -#define LCDIF_CTRL_SET_BYPASS_COUNT_MASK (0x80000U) -#define LCDIF_CTRL_SET_BYPASS_COUNT_SHIFT (19U) -#define LCDIF_CTRL_SET_BYPASS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_BYPASS_COUNT_SHIFT)) & LCDIF_CTRL_SET_BYPASS_COUNT_MASK) - -#define LCDIF_CTRL_SET_SHIFT_NUM_BITS_MASK (0x3E00000U) -#define LCDIF_CTRL_SET_SHIFT_NUM_BITS_SHIFT (21U) -#define LCDIF_CTRL_SET_SHIFT_NUM_BITS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_SHIFT_NUM_BITS_SHIFT)) & LCDIF_CTRL_SET_SHIFT_NUM_BITS_MASK) - -#define LCDIF_CTRL_SET_DATA_SHIFT_DIR_MASK (0x4000000U) -#define LCDIF_CTRL_SET_DATA_SHIFT_DIR_SHIFT (26U) -/*! DATA_SHIFT_DIR - * 0b0..Data to be transmitted is shifted LEFT by SHIFT_NUM_BITS bits. - * 0b1..Data to be transmitted is shifted RIGHT by SHIFT_NUM_BITS bits. - */ -#define LCDIF_CTRL_SET_DATA_SHIFT_DIR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_DATA_SHIFT_DIR_SHIFT)) & LCDIF_CTRL_SET_DATA_SHIFT_DIR_MASK) - -#define LCDIF_CTRL_SET_CLKGATE_MASK (0x40000000U) -#define LCDIF_CTRL_SET_CLKGATE_SHIFT (30U) -#define LCDIF_CTRL_SET_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_CLKGATE_SHIFT)) & LCDIF_CTRL_SET_CLKGATE_MASK) - -#define LCDIF_CTRL_SET_SFTRST_MASK (0x80000000U) -#define LCDIF_CTRL_SET_SFTRST_SHIFT (31U) -#define LCDIF_CTRL_SET_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_SET_SFTRST_SHIFT)) & LCDIF_CTRL_SET_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_CLR - LCDIF General Control Register */ -/*! @{ */ - -#define LCDIF_CTRL_CLR_RUN_MASK (0x1U) -#define LCDIF_CTRL_CLR_RUN_SHIFT (0U) -#define LCDIF_CTRL_CLR_RUN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_RUN_SHIFT)) & LCDIF_CTRL_CLR_RUN_MASK) - -#define LCDIF_CTRL_CLR_DATA_FORMAT_24_BIT_MASK (0x2U) -#define LCDIF_CTRL_CLR_DATA_FORMAT_24_BIT_SHIFT (1U) -/*! DATA_FORMAT_24_BIT - * 0b0..Data input to the block is in 24 bpp format, such that all RGB 888 data is contained in 24 bits. - * 0b1..Data input to the block is actually RGB 18 bpp, but there is 1 color per byte, hence the upper 2 bits in - * each byte do not contain any useful data, and should be dropped. - */ -#define LCDIF_CTRL_CLR_DATA_FORMAT_24_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_DATA_FORMAT_24_BIT_SHIFT)) & LCDIF_CTRL_CLR_DATA_FORMAT_24_BIT_MASK) - -#define LCDIF_CTRL_CLR_DATA_FORMAT_18_BIT_MASK (0x4U) -#define LCDIF_CTRL_CLR_DATA_FORMAT_18_BIT_SHIFT (2U) -/*! DATA_FORMAT_18_BIT - * 0b0..Data input to the block is in 18 bpp format, such that lower 18 bits contain RGB 666 and upper 14 bits do not contain any useful data. - * 0b1..Data input to the block is in 18 bpp format, such that upper 18 bits contain RGB 666 and lower 14 bits do not contain any useful data. - */ -#define LCDIF_CTRL_CLR_DATA_FORMAT_18_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_DATA_FORMAT_18_BIT_SHIFT)) & LCDIF_CTRL_CLR_DATA_FORMAT_18_BIT_MASK) - -#define LCDIF_CTRL_CLR_DATA_FORMAT_16_BIT_MASK (0x8U) -#define LCDIF_CTRL_CLR_DATA_FORMAT_16_BIT_SHIFT (3U) -#define LCDIF_CTRL_CLR_DATA_FORMAT_16_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_DATA_FORMAT_16_BIT_SHIFT)) & LCDIF_CTRL_CLR_DATA_FORMAT_16_BIT_MASK) - -#define LCDIF_CTRL_CLR_RSRVD0_MASK (0x10U) -#define LCDIF_CTRL_CLR_RSRVD0_SHIFT (4U) -#define LCDIF_CTRL_CLR_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_RSRVD0_SHIFT)) & LCDIF_CTRL_CLR_RSRVD0_MASK) - -#define LCDIF_CTRL_CLR_MASTER_MASK (0x20U) -#define LCDIF_CTRL_CLR_MASTER_SHIFT (5U) -#define LCDIF_CTRL_CLR_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_MASTER_SHIFT)) & LCDIF_CTRL_CLR_MASTER_MASK) - -#define LCDIF_CTRL_CLR_ENABLE_PXP_HANDSHAKE_MASK (0x40U) -#define LCDIF_CTRL_CLR_ENABLE_PXP_HANDSHAKE_SHIFT (6U) -#define LCDIF_CTRL_CLR_ENABLE_PXP_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_ENABLE_PXP_HANDSHAKE_SHIFT)) & LCDIF_CTRL_CLR_ENABLE_PXP_HANDSHAKE_MASK) - -#define LCDIF_CTRL_CLR_WORD_LENGTH_MASK (0x300U) -#define LCDIF_CTRL_CLR_WORD_LENGTH_SHIFT (8U) -/*! WORD_LENGTH - * 0b00..Input data is 16 bits per pixel. - * 0b01..Input data is 8 bits wide. - * 0b10..Input data is 18 bits per pixel. - * 0b11..Input data is 24 bits per pixel. - */ -#define LCDIF_CTRL_CLR_WORD_LENGTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_WORD_LENGTH_SHIFT)) & LCDIF_CTRL_CLR_WORD_LENGTH_MASK) - -#define LCDIF_CTRL_CLR_LCD_DATABUS_WIDTH_MASK (0xC00U) -#define LCDIF_CTRL_CLR_LCD_DATABUS_WIDTH_SHIFT (10U) -/*! LCD_DATABUS_WIDTH - * 0b00..16-bit data bus mode. - * 0b01..8-bit data bus mode. - * 0b10..18-bit data bus mode. - * 0b11..24-bit data bus mode. - */ -#define LCDIF_CTRL_CLR_LCD_DATABUS_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_LCD_DATABUS_WIDTH_SHIFT)) & LCDIF_CTRL_CLR_LCD_DATABUS_WIDTH_MASK) - -#define LCDIF_CTRL_CLR_CSC_DATA_SWIZZLE_MASK (0x3000U) -#define LCDIF_CTRL_CLR_CSC_DATA_SWIZZLE_SHIFT (12U) -/*! CSC_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_CLR_CSC_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_CSC_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_CLR_CSC_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_CLR_INPUT_DATA_SWIZZLE_MASK (0xC000U) -#define LCDIF_CTRL_CLR_INPUT_DATA_SWIZZLE_SHIFT (14U) -/*! INPUT_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_CLR_INPUT_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_INPUT_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_CLR_INPUT_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_CLR_DOTCLK_MODE_MASK (0x20000U) -#define LCDIF_CTRL_CLR_DOTCLK_MODE_SHIFT (17U) -#define LCDIF_CTRL_CLR_DOTCLK_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_DOTCLK_MODE_SHIFT)) & LCDIF_CTRL_CLR_DOTCLK_MODE_MASK) - -#define LCDIF_CTRL_CLR_BYPASS_COUNT_MASK (0x80000U) -#define LCDIF_CTRL_CLR_BYPASS_COUNT_SHIFT (19U) -#define LCDIF_CTRL_CLR_BYPASS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_BYPASS_COUNT_SHIFT)) & LCDIF_CTRL_CLR_BYPASS_COUNT_MASK) - -#define LCDIF_CTRL_CLR_SHIFT_NUM_BITS_MASK (0x3E00000U) -#define LCDIF_CTRL_CLR_SHIFT_NUM_BITS_SHIFT (21U) -#define LCDIF_CTRL_CLR_SHIFT_NUM_BITS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_SHIFT_NUM_BITS_SHIFT)) & LCDIF_CTRL_CLR_SHIFT_NUM_BITS_MASK) - -#define LCDIF_CTRL_CLR_DATA_SHIFT_DIR_MASK (0x4000000U) -#define LCDIF_CTRL_CLR_DATA_SHIFT_DIR_SHIFT (26U) -/*! DATA_SHIFT_DIR - * 0b0..Data to be transmitted is shifted LEFT by SHIFT_NUM_BITS bits. - * 0b1..Data to be transmitted is shifted RIGHT by SHIFT_NUM_BITS bits. - */ -#define LCDIF_CTRL_CLR_DATA_SHIFT_DIR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_DATA_SHIFT_DIR_SHIFT)) & LCDIF_CTRL_CLR_DATA_SHIFT_DIR_MASK) - -#define LCDIF_CTRL_CLR_CLKGATE_MASK (0x40000000U) -#define LCDIF_CTRL_CLR_CLKGATE_SHIFT (30U) -#define LCDIF_CTRL_CLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_CLKGATE_SHIFT)) & LCDIF_CTRL_CLR_CLKGATE_MASK) - -#define LCDIF_CTRL_CLR_SFTRST_MASK (0x80000000U) -#define LCDIF_CTRL_CLR_SFTRST_SHIFT (31U) -#define LCDIF_CTRL_CLR_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_CLR_SFTRST_SHIFT)) & LCDIF_CTRL_CLR_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_TOG - LCDIF General Control Register */ -/*! @{ */ - -#define LCDIF_CTRL_TOG_RUN_MASK (0x1U) -#define LCDIF_CTRL_TOG_RUN_SHIFT (0U) -#define LCDIF_CTRL_TOG_RUN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_RUN_SHIFT)) & LCDIF_CTRL_TOG_RUN_MASK) - -#define LCDIF_CTRL_TOG_DATA_FORMAT_24_BIT_MASK (0x2U) -#define LCDIF_CTRL_TOG_DATA_FORMAT_24_BIT_SHIFT (1U) -/*! DATA_FORMAT_24_BIT - * 0b0..Data input to the block is in 24 bpp format, such that all RGB 888 data is contained in 24 bits. - * 0b1..Data input to the block is actually RGB 18 bpp, but there is 1 color per byte, hence the upper 2 bits in - * each byte do not contain any useful data, and should be dropped. - */ -#define LCDIF_CTRL_TOG_DATA_FORMAT_24_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_DATA_FORMAT_24_BIT_SHIFT)) & LCDIF_CTRL_TOG_DATA_FORMAT_24_BIT_MASK) - -#define LCDIF_CTRL_TOG_DATA_FORMAT_18_BIT_MASK (0x4U) -#define LCDIF_CTRL_TOG_DATA_FORMAT_18_BIT_SHIFT (2U) -/*! DATA_FORMAT_18_BIT - * 0b0..Data input to the block is in 18 bpp format, such that lower 18 bits contain RGB 666 and upper 14 bits do not contain any useful data. - * 0b1..Data input to the block is in 18 bpp format, such that upper 18 bits contain RGB 666 and lower 14 bits do not contain any useful data. - */ -#define LCDIF_CTRL_TOG_DATA_FORMAT_18_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_DATA_FORMAT_18_BIT_SHIFT)) & LCDIF_CTRL_TOG_DATA_FORMAT_18_BIT_MASK) - -#define LCDIF_CTRL_TOG_DATA_FORMAT_16_BIT_MASK (0x8U) -#define LCDIF_CTRL_TOG_DATA_FORMAT_16_BIT_SHIFT (3U) -#define LCDIF_CTRL_TOG_DATA_FORMAT_16_BIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_DATA_FORMAT_16_BIT_SHIFT)) & LCDIF_CTRL_TOG_DATA_FORMAT_16_BIT_MASK) - -#define LCDIF_CTRL_TOG_RSRVD0_MASK (0x10U) -#define LCDIF_CTRL_TOG_RSRVD0_SHIFT (4U) -#define LCDIF_CTRL_TOG_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_RSRVD0_SHIFT)) & LCDIF_CTRL_TOG_RSRVD0_MASK) - -#define LCDIF_CTRL_TOG_MASTER_MASK (0x20U) -#define LCDIF_CTRL_TOG_MASTER_SHIFT (5U) -#define LCDIF_CTRL_TOG_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_MASTER_SHIFT)) & LCDIF_CTRL_TOG_MASTER_MASK) - -#define LCDIF_CTRL_TOG_ENABLE_PXP_HANDSHAKE_MASK (0x40U) -#define LCDIF_CTRL_TOG_ENABLE_PXP_HANDSHAKE_SHIFT (6U) -#define LCDIF_CTRL_TOG_ENABLE_PXP_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_ENABLE_PXP_HANDSHAKE_SHIFT)) & LCDIF_CTRL_TOG_ENABLE_PXP_HANDSHAKE_MASK) - -#define LCDIF_CTRL_TOG_WORD_LENGTH_MASK (0x300U) -#define LCDIF_CTRL_TOG_WORD_LENGTH_SHIFT (8U) -/*! WORD_LENGTH - * 0b00..Input data is 16 bits per pixel. - * 0b01..Input data is 8 bits wide. - * 0b10..Input data is 18 bits per pixel. - * 0b11..Input data is 24 bits per pixel. - */ -#define LCDIF_CTRL_TOG_WORD_LENGTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_WORD_LENGTH_SHIFT)) & LCDIF_CTRL_TOG_WORD_LENGTH_MASK) - -#define LCDIF_CTRL_TOG_LCD_DATABUS_WIDTH_MASK (0xC00U) -#define LCDIF_CTRL_TOG_LCD_DATABUS_WIDTH_SHIFT (10U) -/*! LCD_DATABUS_WIDTH - * 0b00..16-bit data bus mode. - * 0b01..8-bit data bus mode. - * 0b10..18-bit data bus mode. - * 0b11..24-bit data bus mode. - */ -#define LCDIF_CTRL_TOG_LCD_DATABUS_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_LCD_DATABUS_WIDTH_SHIFT)) & LCDIF_CTRL_TOG_LCD_DATABUS_WIDTH_MASK) - -#define LCDIF_CTRL_TOG_CSC_DATA_SWIZZLE_MASK (0x3000U) -#define LCDIF_CTRL_TOG_CSC_DATA_SWIZZLE_SHIFT (12U) -/*! CSC_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_TOG_CSC_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_CSC_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_TOG_CSC_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_TOG_INPUT_DATA_SWIZZLE_MASK (0xC000U) -#define LCDIF_CTRL_TOG_INPUT_DATA_SWIZZLE_SHIFT (14U) -/*! INPUT_DATA_SWIZZLE - * 0b00..No byte swapping.(Little endian) - * 0b00..Little Endian byte ordering (same as NO_SWAP). - * 0b01..Big Endian swap (swap bytes 0,3 and 1,2). - * 0b01..Swizzle all bytes, swap bytes 0,3 and 1,2 (aka Big Endian). - * 0b10..Swap half-words. - * 0b11..Swap bytes within each half-word. - */ -#define LCDIF_CTRL_TOG_INPUT_DATA_SWIZZLE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_INPUT_DATA_SWIZZLE_SHIFT)) & LCDIF_CTRL_TOG_INPUT_DATA_SWIZZLE_MASK) - -#define LCDIF_CTRL_TOG_DOTCLK_MODE_MASK (0x20000U) -#define LCDIF_CTRL_TOG_DOTCLK_MODE_SHIFT (17U) -#define LCDIF_CTRL_TOG_DOTCLK_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_DOTCLK_MODE_SHIFT)) & LCDIF_CTRL_TOG_DOTCLK_MODE_MASK) - -#define LCDIF_CTRL_TOG_BYPASS_COUNT_MASK (0x80000U) -#define LCDIF_CTRL_TOG_BYPASS_COUNT_SHIFT (19U) -#define LCDIF_CTRL_TOG_BYPASS_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_BYPASS_COUNT_SHIFT)) & LCDIF_CTRL_TOG_BYPASS_COUNT_MASK) - -#define LCDIF_CTRL_TOG_SHIFT_NUM_BITS_MASK (0x3E00000U) -#define LCDIF_CTRL_TOG_SHIFT_NUM_BITS_SHIFT (21U) -#define LCDIF_CTRL_TOG_SHIFT_NUM_BITS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_SHIFT_NUM_BITS_SHIFT)) & LCDIF_CTRL_TOG_SHIFT_NUM_BITS_MASK) - -#define LCDIF_CTRL_TOG_DATA_SHIFT_DIR_MASK (0x4000000U) -#define LCDIF_CTRL_TOG_DATA_SHIFT_DIR_SHIFT (26U) -/*! DATA_SHIFT_DIR - * 0b0..Data to be transmitted is shifted LEFT by SHIFT_NUM_BITS bits. - * 0b1..Data to be transmitted is shifted RIGHT by SHIFT_NUM_BITS bits. - */ -#define LCDIF_CTRL_TOG_DATA_SHIFT_DIR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_DATA_SHIFT_DIR_SHIFT)) & LCDIF_CTRL_TOG_DATA_SHIFT_DIR_MASK) - -#define LCDIF_CTRL_TOG_CLKGATE_MASK (0x40000000U) -#define LCDIF_CTRL_TOG_CLKGATE_SHIFT (30U) -#define LCDIF_CTRL_TOG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_CLKGATE_SHIFT)) & LCDIF_CTRL_TOG_CLKGATE_MASK) - -#define LCDIF_CTRL_TOG_SFTRST_MASK (0x80000000U) -#define LCDIF_CTRL_TOG_SFTRST_SHIFT (31U) -#define LCDIF_CTRL_TOG_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL_TOG_SFTRST_SHIFT)) & LCDIF_CTRL_TOG_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL1 - LCDIF General Control1 Register */ -/*! @{ */ - -#define LCDIF_CTRL1_RSRVD0_MASK (0xF8U) -#define LCDIF_CTRL1_RSRVD0_SHIFT (3U) -#define LCDIF_CTRL1_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_RSRVD0_SHIFT)) & LCDIF_CTRL1_RSRVD0_MASK) - -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK (0x100U) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_SHIFT (8U) -/*! VSYNC_EDGE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_VSYNC_EDGE_IRQ_SHIFT)) & LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK) - -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK (0x200U) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_SHIFT (9U) -/*! CUR_FRAME_DONE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_SHIFT)) & LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK) - -#define LCDIF_CTRL1_UNDERFLOW_IRQ_MASK (0x400U) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_SHIFT (10U) -/*! UNDERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_UNDERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_UNDERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_UNDERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_OVERFLOW_IRQ_MASK (0x800U) -#define LCDIF_CTRL1_OVERFLOW_IRQ_SHIFT (11U) -/*! OVERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_OVERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_OVERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_OVERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK (0x1000U) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_SHIFT (12U) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK (0x2000U) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_SHIFT (13U) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK (0x4000U) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN_SHIFT (14U) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_UNDERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK (0x8000U) -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN_SHIFT (15U) -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_OVERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xF0000U) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_SHIFT (16U) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_BYTE_PACKING_FORMAT_SHIFT)) & LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK) - -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS_MASK (0x100000U) -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS_SHIFT (20U) -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS_SHIFT)) & LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS_MASK) - -#define LCDIF_CTRL1_FIFO_CLEAR_MASK (0x200000U) -#define LCDIF_CTRL1_FIFO_CLEAR_SHIFT (21U) -#define LCDIF_CTRL1_FIFO_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_FIFO_CLEAR_SHIFT)) & LCDIF_CTRL1_FIFO_CLEAR_MASK) - -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD_MASK (0x400000U) -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD_SHIFT (22U) -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD_SHIFT)) & LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD_MASK) - -#define LCDIF_CTRL1_INTERLACE_FIELDS_MASK (0x800000U) -#define LCDIF_CTRL1_INTERLACE_FIELDS_SHIFT (23U) -#define LCDIF_CTRL1_INTERLACE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_INTERLACE_FIELDS_SHIFT)) & LCDIF_CTRL1_INTERLACE_FIELDS_MASK) - -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW_MASK (0x1000000U) -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW_SHIFT (24U) -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_RECOVER_ON_UNDERFLOW_SHIFT)) & LCDIF_CTRL1_RECOVER_ON_UNDERFLOW_MASK) - -#define LCDIF_CTRL1_BM_ERROR_IRQ_MASK (0x2000000U) -#define LCDIF_CTRL1_BM_ERROR_IRQ_SHIFT (25U) -/*! BM_ERROR_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_BM_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_BM_ERROR_IRQ_SHIFT)) & LCDIF_CTRL1_BM_ERROR_IRQ_MASK) - -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK (0x4000000U) -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN_SHIFT (26U) -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_BM_ERROR_IRQ_EN_SHIFT)) & LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CS_OUT_SELECT_MASK (0x40000000U) -#define LCDIF_CTRL1_CS_OUT_SELECT_SHIFT (30U) -#define LCDIF_CTRL1_CS_OUT_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CS_OUT_SELECT_SHIFT)) & LCDIF_CTRL1_CS_OUT_SELECT_MASK) - -#define LCDIF_CTRL1_IMAGE_DATA_SELECT_MASK (0x80000000U) -#define LCDIF_CTRL1_IMAGE_DATA_SELECT_SHIFT (31U) -#define LCDIF_CTRL1_IMAGE_DATA_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_IMAGE_DATA_SELECT_SHIFT)) & LCDIF_CTRL1_IMAGE_DATA_SELECT_MASK) -/*! @} */ - -/*! @name CTRL1_SET - LCDIF General Control1 Register */ -/*! @{ */ - -#define LCDIF_CTRL1_SET_RSRVD0_MASK (0xF8U) -#define LCDIF_CTRL1_SET_RSRVD0_SHIFT (3U) -#define LCDIF_CTRL1_SET_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_RSRVD0_SHIFT)) & LCDIF_CTRL1_SET_RSRVD0_MASK) - -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_MASK (0x100U) -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_SHIFT (8U) -/*! VSYNC_EDGE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_SHIFT)) & LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_MASK) - -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_MASK (0x200U) -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_SHIFT (9U) -/*! CUR_FRAME_DONE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_SHIFT)) & LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_MASK) - -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ_MASK (0x400U) -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ_SHIFT (10U) -/*! UNDERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_UNDERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_SET_UNDERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ_MASK (0x800U) -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ_SHIFT (11U) -/*! OVERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_OVERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_SET_OVERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_EN_MASK (0x1000U) -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_EN_SHIFT (12U) -#define LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_SET_VSYNC_EDGE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_EN_MASK (0x2000U) -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_EN_SHIFT (13U) -#define LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_SET_CUR_FRAME_DONE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ_EN_MASK (0x4000U) -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ_EN_SHIFT (14U) -#define LCDIF_CTRL1_SET_UNDERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_UNDERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_SET_UNDERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ_EN_MASK (0x8000U) -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ_EN_SHIFT (15U) -#define LCDIF_CTRL1_SET_OVERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_OVERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_SET_OVERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_SET_BYTE_PACKING_FORMAT_MASK (0xF0000U) -#define LCDIF_CTRL1_SET_BYTE_PACKING_FORMAT_SHIFT (16U) -#define LCDIF_CTRL1_SET_BYTE_PACKING_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_BYTE_PACKING_FORMAT_SHIFT)) & LCDIF_CTRL1_SET_BYTE_PACKING_FORMAT_MASK) - -#define LCDIF_CTRL1_SET_IRQ_ON_ALTERNATE_FIELDS_MASK (0x100000U) -#define LCDIF_CTRL1_SET_IRQ_ON_ALTERNATE_FIELDS_SHIFT (20U) -#define LCDIF_CTRL1_SET_IRQ_ON_ALTERNATE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_IRQ_ON_ALTERNATE_FIELDS_SHIFT)) & LCDIF_CTRL1_SET_IRQ_ON_ALTERNATE_FIELDS_MASK) - -#define LCDIF_CTRL1_SET_FIFO_CLEAR_MASK (0x200000U) -#define LCDIF_CTRL1_SET_FIFO_CLEAR_SHIFT (21U) -#define LCDIF_CTRL1_SET_FIFO_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_FIFO_CLEAR_SHIFT)) & LCDIF_CTRL1_SET_FIFO_CLEAR_MASK) - -#define LCDIF_CTRL1_SET_START_INTERLACE_FROM_SECOND_FIELD_MASK (0x400000U) -#define LCDIF_CTRL1_SET_START_INTERLACE_FROM_SECOND_FIELD_SHIFT (22U) -#define LCDIF_CTRL1_SET_START_INTERLACE_FROM_SECOND_FIELD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_START_INTERLACE_FROM_SECOND_FIELD_SHIFT)) & LCDIF_CTRL1_SET_START_INTERLACE_FROM_SECOND_FIELD_MASK) - -#define LCDIF_CTRL1_SET_INTERLACE_FIELDS_MASK (0x800000U) -#define LCDIF_CTRL1_SET_INTERLACE_FIELDS_SHIFT (23U) -#define LCDIF_CTRL1_SET_INTERLACE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_INTERLACE_FIELDS_SHIFT)) & LCDIF_CTRL1_SET_INTERLACE_FIELDS_MASK) - -#define LCDIF_CTRL1_SET_RECOVER_ON_UNDERFLOW_MASK (0x1000000U) -#define LCDIF_CTRL1_SET_RECOVER_ON_UNDERFLOW_SHIFT (24U) -#define LCDIF_CTRL1_SET_RECOVER_ON_UNDERFLOW(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_RECOVER_ON_UNDERFLOW_SHIFT)) & LCDIF_CTRL1_SET_RECOVER_ON_UNDERFLOW_MASK) - -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ_MASK (0x2000000U) -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ_SHIFT (25U) -/*! BM_ERROR_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_BM_ERROR_IRQ_SHIFT)) & LCDIF_CTRL1_SET_BM_ERROR_IRQ_MASK) - -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ_EN_MASK (0x4000000U) -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ_EN_SHIFT (26U) -#define LCDIF_CTRL1_SET_BM_ERROR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_BM_ERROR_IRQ_EN_SHIFT)) & LCDIF_CTRL1_SET_BM_ERROR_IRQ_EN_MASK) - -#define LCDIF_CTRL1_SET_CS_OUT_SELECT_MASK (0x40000000U) -#define LCDIF_CTRL1_SET_CS_OUT_SELECT_SHIFT (30U) -#define LCDIF_CTRL1_SET_CS_OUT_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_CS_OUT_SELECT_SHIFT)) & LCDIF_CTRL1_SET_CS_OUT_SELECT_MASK) - -#define LCDIF_CTRL1_SET_IMAGE_DATA_SELECT_MASK (0x80000000U) -#define LCDIF_CTRL1_SET_IMAGE_DATA_SELECT_SHIFT (31U) -#define LCDIF_CTRL1_SET_IMAGE_DATA_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_SET_IMAGE_DATA_SELECT_SHIFT)) & LCDIF_CTRL1_SET_IMAGE_DATA_SELECT_MASK) -/*! @} */ - -/*! @name CTRL1_CLR - LCDIF General Control1 Register */ -/*! @{ */ - -#define LCDIF_CTRL1_CLR_RSRVD0_MASK (0xF8U) -#define LCDIF_CTRL1_CLR_RSRVD0_SHIFT (3U) -#define LCDIF_CTRL1_CLR_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_RSRVD0_SHIFT)) & LCDIF_CTRL1_CLR_RSRVD0_MASK) - -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_MASK (0x100U) -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_SHIFT (8U) -/*! VSYNC_EDGE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_SHIFT)) & LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_MASK) - -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_MASK (0x200U) -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_SHIFT (9U) -/*! CUR_FRAME_DONE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_SHIFT)) & LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_MASK) - -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_MASK (0x400U) -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_SHIFT (10U) -/*! UNDERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ_MASK (0x800U) -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ_SHIFT (11U) -/*! OVERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_OVERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_CLR_OVERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_EN_MASK (0x1000U) -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_EN_SHIFT (12U) -#define LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CLR_VSYNC_EDGE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_EN_MASK (0x2000U) -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_EN_SHIFT (13U) -#define LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CLR_CUR_FRAME_DONE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_EN_MASK (0x4000U) -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_EN_SHIFT (14U) -#define LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CLR_UNDERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ_EN_MASK (0x8000U) -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ_EN_SHIFT (15U) -#define LCDIF_CTRL1_CLR_OVERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_OVERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CLR_OVERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CLR_BYTE_PACKING_FORMAT_MASK (0xF0000U) -#define LCDIF_CTRL1_CLR_BYTE_PACKING_FORMAT_SHIFT (16U) -#define LCDIF_CTRL1_CLR_BYTE_PACKING_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_BYTE_PACKING_FORMAT_SHIFT)) & LCDIF_CTRL1_CLR_BYTE_PACKING_FORMAT_MASK) - -#define LCDIF_CTRL1_CLR_IRQ_ON_ALTERNATE_FIELDS_MASK (0x100000U) -#define LCDIF_CTRL1_CLR_IRQ_ON_ALTERNATE_FIELDS_SHIFT (20U) -#define LCDIF_CTRL1_CLR_IRQ_ON_ALTERNATE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_IRQ_ON_ALTERNATE_FIELDS_SHIFT)) & LCDIF_CTRL1_CLR_IRQ_ON_ALTERNATE_FIELDS_MASK) - -#define LCDIF_CTRL1_CLR_FIFO_CLEAR_MASK (0x200000U) -#define LCDIF_CTRL1_CLR_FIFO_CLEAR_SHIFT (21U) -#define LCDIF_CTRL1_CLR_FIFO_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_FIFO_CLEAR_SHIFT)) & LCDIF_CTRL1_CLR_FIFO_CLEAR_MASK) - -#define LCDIF_CTRL1_CLR_START_INTERLACE_FROM_SECOND_FIELD_MASK (0x400000U) -#define LCDIF_CTRL1_CLR_START_INTERLACE_FROM_SECOND_FIELD_SHIFT (22U) -#define LCDIF_CTRL1_CLR_START_INTERLACE_FROM_SECOND_FIELD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_START_INTERLACE_FROM_SECOND_FIELD_SHIFT)) & LCDIF_CTRL1_CLR_START_INTERLACE_FROM_SECOND_FIELD_MASK) - -#define LCDIF_CTRL1_CLR_INTERLACE_FIELDS_MASK (0x800000U) -#define LCDIF_CTRL1_CLR_INTERLACE_FIELDS_SHIFT (23U) -#define LCDIF_CTRL1_CLR_INTERLACE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_INTERLACE_FIELDS_SHIFT)) & LCDIF_CTRL1_CLR_INTERLACE_FIELDS_MASK) - -#define LCDIF_CTRL1_CLR_RECOVER_ON_UNDERFLOW_MASK (0x1000000U) -#define LCDIF_CTRL1_CLR_RECOVER_ON_UNDERFLOW_SHIFT (24U) -#define LCDIF_CTRL1_CLR_RECOVER_ON_UNDERFLOW(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_RECOVER_ON_UNDERFLOW_SHIFT)) & LCDIF_CTRL1_CLR_RECOVER_ON_UNDERFLOW_MASK) - -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ_MASK (0x2000000U) -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ_SHIFT (25U) -/*! BM_ERROR_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_BM_ERROR_IRQ_SHIFT)) & LCDIF_CTRL1_CLR_BM_ERROR_IRQ_MASK) - -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ_EN_MASK (0x4000000U) -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ_EN_SHIFT (26U) -#define LCDIF_CTRL1_CLR_BM_ERROR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_BM_ERROR_IRQ_EN_SHIFT)) & LCDIF_CTRL1_CLR_BM_ERROR_IRQ_EN_MASK) - -#define LCDIF_CTRL1_CLR_CS_OUT_SELECT_MASK (0x40000000U) -#define LCDIF_CTRL1_CLR_CS_OUT_SELECT_SHIFT (30U) -#define LCDIF_CTRL1_CLR_CS_OUT_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_CS_OUT_SELECT_SHIFT)) & LCDIF_CTRL1_CLR_CS_OUT_SELECT_MASK) - -#define LCDIF_CTRL1_CLR_IMAGE_DATA_SELECT_MASK (0x80000000U) -#define LCDIF_CTRL1_CLR_IMAGE_DATA_SELECT_SHIFT (31U) -#define LCDIF_CTRL1_CLR_IMAGE_DATA_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_CLR_IMAGE_DATA_SELECT_SHIFT)) & LCDIF_CTRL1_CLR_IMAGE_DATA_SELECT_MASK) -/*! @} */ - -/*! @name CTRL1_TOG - LCDIF General Control1 Register */ -/*! @{ */ - -#define LCDIF_CTRL1_TOG_RSRVD0_MASK (0xF8U) -#define LCDIF_CTRL1_TOG_RSRVD0_SHIFT (3U) -#define LCDIF_CTRL1_TOG_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_RSRVD0_SHIFT)) & LCDIF_CTRL1_TOG_RSRVD0_MASK) - -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_MASK (0x100U) -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_SHIFT (8U) -/*! VSYNC_EDGE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_SHIFT)) & LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_MASK) - -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_MASK (0x200U) -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_SHIFT (9U) -/*! CUR_FRAME_DONE_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_SHIFT)) & LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_MASK) - -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_MASK (0x400U) -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_SHIFT (10U) -/*! UNDERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ_MASK (0x800U) -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ_SHIFT (11U) -/*! OVERFLOW_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_OVERFLOW_IRQ_SHIFT)) & LCDIF_CTRL1_TOG_OVERFLOW_IRQ_MASK) - -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_EN_MASK (0x1000U) -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_EN_SHIFT (12U) -#define LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_TOG_VSYNC_EDGE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_EN_MASK (0x2000U) -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_EN_SHIFT (13U) -#define LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_EN_SHIFT)) & LCDIF_CTRL1_TOG_CUR_FRAME_DONE_IRQ_EN_MASK) - -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_EN_MASK (0x4000U) -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_EN_SHIFT (14U) -#define LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_TOG_UNDERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ_EN_MASK (0x8000U) -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ_EN_SHIFT (15U) -#define LCDIF_CTRL1_TOG_OVERFLOW_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_OVERFLOW_IRQ_EN_SHIFT)) & LCDIF_CTRL1_TOG_OVERFLOW_IRQ_EN_MASK) - -#define LCDIF_CTRL1_TOG_BYTE_PACKING_FORMAT_MASK (0xF0000U) -#define LCDIF_CTRL1_TOG_BYTE_PACKING_FORMAT_SHIFT (16U) -#define LCDIF_CTRL1_TOG_BYTE_PACKING_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_BYTE_PACKING_FORMAT_SHIFT)) & LCDIF_CTRL1_TOG_BYTE_PACKING_FORMAT_MASK) - -#define LCDIF_CTRL1_TOG_IRQ_ON_ALTERNATE_FIELDS_MASK (0x100000U) -#define LCDIF_CTRL1_TOG_IRQ_ON_ALTERNATE_FIELDS_SHIFT (20U) -#define LCDIF_CTRL1_TOG_IRQ_ON_ALTERNATE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_IRQ_ON_ALTERNATE_FIELDS_SHIFT)) & LCDIF_CTRL1_TOG_IRQ_ON_ALTERNATE_FIELDS_MASK) - -#define LCDIF_CTRL1_TOG_FIFO_CLEAR_MASK (0x200000U) -#define LCDIF_CTRL1_TOG_FIFO_CLEAR_SHIFT (21U) -#define LCDIF_CTRL1_TOG_FIFO_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_FIFO_CLEAR_SHIFT)) & LCDIF_CTRL1_TOG_FIFO_CLEAR_MASK) - -#define LCDIF_CTRL1_TOG_START_INTERLACE_FROM_SECOND_FIELD_MASK (0x400000U) -#define LCDIF_CTRL1_TOG_START_INTERLACE_FROM_SECOND_FIELD_SHIFT (22U) -#define LCDIF_CTRL1_TOG_START_INTERLACE_FROM_SECOND_FIELD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_START_INTERLACE_FROM_SECOND_FIELD_SHIFT)) & LCDIF_CTRL1_TOG_START_INTERLACE_FROM_SECOND_FIELD_MASK) - -#define LCDIF_CTRL1_TOG_INTERLACE_FIELDS_MASK (0x800000U) -#define LCDIF_CTRL1_TOG_INTERLACE_FIELDS_SHIFT (23U) -#define LCDIF_CTRL1_TOG_INTERLACE_FIELDS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_INTERLACE_FIELDS_SHIFT)) & LCDIF_CTRL1_TOG_INTERLACE_FIELDS_MASK) - -#define LCDIF_CTRL1_TOG_RECOVER_ON_UNDERFLOW_MASK (0x1000000U) -#define LCDIF_CTRL1_TOG_RECOVER_ON_UNDERFLOW_SHIFT (24U) -#define LCDIF_CTRL1_TOG_RECOVER_ON_UNDERFLOW(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_RECOVER_ON_UNDERFLOW_SHIFT)) & LCDIF_CTRL1_TOG_RECOVER_ON_UNDERFLOW_MASK) - -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ_MASK (0x2000000U) -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ_SHIFT (25U) -/*! BM_ERROR_IRQ - * 0b0..No Interrupt Request Pending. - * 0b1..Interrupt Request Pending. - */ -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_BM_ERROR_IRQ_SHIFT)) & LCDIF_CTRL1_TOG_BM_ERROR_IRQ_MASK) - -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ_EN_MASK (0x4000000U) -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ_EN_SHIFT (26U) -#define LCDIF_CTRL1_TOG_BM_ERROR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_BM_ERROR_IRQ_EN_SHIFT)) & LCDIF_CTRL1_TOG_BM_ERROR_IRQ_EN_MASK) - -#define LCDIF_CTRL1_TOG_CS_OUT_SELECT_MASK (0x40000000U) -#define LCDIF_CTRL1_TOG_CS_OUT_SELECT_SHIFT (30U) -#define LCDIF_CTRL1_TOG_CS_OUT_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_CS_OUT_SELECT_SHIFT)) & LCDIF_CTRL1_TOG_CS_OUT_SELECT_MASK) - -#define LCDIF_CTRL1_TOG_IMAGE_DATA_SELECT_MASK (0x80000000U) -#define LCDIF_CTRL1_TOG_IMAGE_DATA_SELECT_SHIFT (31U) -#define LCDIF_CTRL1_TOG_IMAGE_DATA_SELECT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL1_TOG_IMAGE_DATA_SELECT_SHIFT)) & LCDIF_CTRL1_TOG_IMAGE_DATA_SELECT_MASK) -/*! @} */ - -/*! @name CTRL2 - LCDIF General Control2 Register */ -/*! @{ */ - -#define LCDIF_CTRL2_RSRVD0_MASK (0xFFFU) -#define LCDIF_CTRL2_RSRVD0_SHIFT (0U) -#define LCDIF_CTRL2_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_RSRVD0_SHIFT)) & LCDIF_CTRL2_RSRVD0_MASK) - -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7000U) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_SHIFT (12U) -/*! EVEN_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_EVEN_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_EVEN_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_RSRVD3_MASK (0x8000U) -#define LCDIF_CTRL2_RSRVD3_SHIFT (15U) -#define LCDIF_CTRL2_RSRVD3(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_RSRVD3_SHIFT)) & LCDIF_CTRL2_RSRVD3_MASK) - -#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x70000U) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_SHIFT (16U) -/*! ODD_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_ODD_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_ODD_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_ODD_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_RSRVD4_MASK (0x80000U) -#define LCDIF_CTRL2_RSRVD4_SHIFT (19U) -#define LCDIF_CTRL2_RSRVD4(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_RSRVD4_SHIFT)) & LCDIF_CTRL2_RSRVD4_MASK) - -#define LCDIF_CTRL2_BURST_LEN_8_MASK (0x100000U) -#define LCDIF_CTRL2_BURST_LEN_8_SHIFT (20U) -#define LCDIF_CTRL2_BURST_LEN_8(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_BURST_LEN_8_SHIFT)) & LCDIF_CTRL2_BURST_LEN_8_MASK) - -#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0xE00000U) -#define LCDIF_CTRL2_OUTSTANDING_REQS_SHIFT (21U) -/*! OUTSTANDING_REQS - * 0b000..REQ_1 - * 0b001..REQ_2 - * 0b010..REQ_4 - * 0b011..REQ_8 - * 0b100..REQ_16 - */ -#define LCDIF_CTRL2_OUTSTANDING_REQS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_OUTSTANDING_REQS_SHIFT)) & LCDIF_CTRL2_OUTSTANDING_REQS_MASK) - -#define LCDIF_CTRL2_RSRVD5_MASK (0xFF000000U) -#define LCDIF_CTRL2_RSRVD5_SHIFT (24U) -#define LCDIF_CTRL2_RSRVD5(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_RSRVD5_SHIFT)) & LCDIF_CTRL2_RSRVD5_MASK) -/*! @} */ - -/*! @name CTRL2_SET - LCDIF General Control2 Register */ -/*! @{ */ - -#define LCDIF_CTRL2_SET_RSRVD0_MASK (0xFFFU) -#define LCDIF_CTRL2_SET_RSRVD0_SHIFT (0U) -#define LCDIF_CTRL2_SET_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_RSRVD0_SHIFT)) & LCDIF_CTRL2_SET_RSRVD0_MASK) - -#define LCDIF_CTRL2_SET_EVEN_LINE_PATTERN_MASK (0x7000U) -#define LCDIF_CTRL2_SET_EVEN_LINE_PATTERN_SHIFT (12U) -/*! EVEN_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_SET_EVEN_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_EVEN_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_SET_EVEN_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_SET_RSRVD3_MASK (0x8000U) -#define LCDIF_CTRL2_SET_RSRVD3_SHIFT (15U) -#define LCDIF_CTRL2_SET_RSRVD3(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_RSRVD3_SHIFT)) & LCDIF_CTRL2_SET_RSRVD3_MASK) - -#define LCDIF_CTRL2_SET_ODD_LINE_PATTERN_MASK (0x70000U) -#define LCDIF_CTRL2_SET_ODD_LINE_PATTERN_SHIFT (16U) -/*! ODD_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_SET_ODD_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_ODD_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_SET_ODD_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_SET_RSRVD4_MASK (0x80000U) -#define LCDIF_CTRL2_SET_RSRVD4_SHIFT (19U) -#define LCDIF_CTRL2_SET_RSRVD4(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_RSRVD4_SHIFT)) & LCDIF_CTRL2_SET_RSRVD4_MASK) - -#define LCDIF_CTRL2_SET_BURST_LEN_8_MASK (0x100000U) -#define LCDIF_CTRL2_SET_BURST_LEN_8_SHIFT (20U) -#define LCDIF_CTRL2_SET_BURST_LEN_8(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_BURST_LEN_8_SHIFT)) & LCDIF_CTRL2_SET_BURST_LEN_8_MASK) - -#define LCDIF_CTRL2_SET_OUTSTANDING_REQS_MASK (0xE00000U) -#define LCDIF_CTRL2_SET_OUTSTANDING_REQS_SHIFT (21U) -/*! OUTSTANDING_REQS - * 0b000..REQ_1 - * 0b001..REQ_2 - * 0b010..REQ_4 - * 0b011..REQ_8 - * 0b100..REQ_16 - */ -#define LCDIF_CTRL2_SET_OUTSTANDING_REQS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_OUTSTANDING_REQS_SHIFT)) & LCDIF_CTRL2_SET_OUTSTANDING_REQS_MASK) - -#define LCDIF_CTRL2_SET_RSRVD5_MASK (0xFF000000U) -#define LCDIF_CTRL2_SET_RSRVD5_SHIFT (24U) -#define LCDIF_CTRL2_SET_RSRVD5(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_SET_RSRVD5_SHIFT)) & LCDIF_CTRL2_SET_RSRVD5_MASK) -/*! @} */ - -/*! @name CTRL2_CLR - LCDIF General Control2 Register */ -/*! @{ */ - -#define LCDIF_CTRL2_CLR_RSRVD0_MASK (0xFFFU) -#define LCDIF_CTRL2_CLR_RSRVD0_SHIFT (0U) -#define LCDIF_CTRL2_CLR_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_RSRVD0_SHIFT)) & LCDIF_CTRL2_CLR_RSRVD0_MASK) - -#define LCDIF_CTRL2_CLR_EVEN_LINE_PATTERN_MASK (0x7000U) -#define LCDIF_CTRL2_CLR_EVEN_LINE_PATTERN_SHIFT (12U) -/*! EVEN_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_CLR_EVEN_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_EVEN_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_CLR_EVEN_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_CLR_RSRVD3_MASK (0x8000U) -#define LCDIF_CTRL2_CLR_RSRVD3_SHIFT (15U) -#define LCDIF_CTRL2_CLR_RSRVD3(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_RSRVD3_SHIFT)) & LCDIF_CTRL2_CLR_RSRVD3_MASK) - -#define LCDIF_CTRL2_CLR_ODD_LINE_PATTERN_MASK (0x70000U) -#define LCDIF_CTRL2_CLR_ODD_LINE_PATTERN_SHIFT (16U) -/*! ODD_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_CLR_ODD_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_ODD_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_CLR_ODD_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_CLR_RSRVD4_MASK (0x80000U) -#define LCDIF_CTRL2_CLR_RSRVD4_SHIFT (19U) -#define LCDIF_CTRL2_CLR_RSRVD4(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_RSRVD4_SHIFT)) & LCDIF_CTRL2_CLR_RSRVD4_MASK) - -#define LCDIF_CTRL2_CLR_BURST_LEN_8_MASK (0x100000U) -#define LCDIF_CTRL2_CLR_BURST_LEN_8_SHIFT (20U) -#define LCDIF_CTRL2_CLR_BURST_LEN_8(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_BURST_LEN_8_SHIFT)) & LCDIF_CTRL2_CLR_BURST_LEN_8_MASK) - -#define LCDIF_CTRL2_CLR_OUTSTANDING_REQS_MASK (0xE00000U) -#define LCDIF_CTRL2_CLR_OUTSTANDING_REQS_SHIFT (21U) -/*! OUTSTANDING_REQS - * 0b000..REQ_1 - * 0b001..REQ_2 - * 0b010..REQ_4 - * 0b011..REQ_8 - * 0b100..REQ_16 - */ -#define LCDIF_CTRL2_CLR_OUTSTANDING_REQS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_OUTSTANDING_REQS_SHIFT)) & LCDIF_CTRL2_CLR_OUTSTANDING_REQS_MASK) - -#define LCDIF_CTRL2_CLR_RSRVD5_MASK (0xFF000000U) -#define LCDIF_CTRL2_CLR_RSRVD5_SHIFT (24U) -#define LCDIF_CTRL2_CLR_RSRVD5(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_CLR_RSRVD5_SHIFT)) & LCDIF_CTRL2_CLR_RSRVD5_MASK) -/*! @} */ - -/*! @name CTRL2_TOG - LCDIF General Control2 Register */ -/*! @{ */ - -#define LCDIF_CTRL2_TOG_RSRVD0_MASK (0xFFFU) -#define LCDIF_CTRL2_TOG_RSRVD0_SHIFT (0U) -#define LCDIF_CTRL2_TOG_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_RSRVD0_SHIFT)) & LCDIF_CTRL2_TOG_RSRVD0_MASK) - -#define LCDIF_CTRL2_TOG_EVEN_LINE_PATTERN_MASK (0x7000U) -#define LCDIF_CTRL2_TOG_EVEN_LINE_PATTERN_SHIFT (12U) -/*! EVEN_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_TOG_EVEN_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_EVEN_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_TOG_EVEN_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_TOG_RSRVD3_MASK (0x8000U) -#define LCDIF_CTRL2_TOG_RSRVD3_SHIFT (15U) -#define LCDIF_CTRL2_TOG_RSRVD3(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_RSRVD3_SHIFT)) & LCDIF_CTRL2_TOG_RSRVD3_MASK) - -#define LCDIF_CTRL2_TOG_ODD_LINE_PATTERN_MASK (0x70000U) -#define LCDIF_CTRL2_TOG_ODD_LINE_PATTERN_SHIFT (16U) -/*! ODD_LINE_PATTERN - * 0b000..RGB - * 0b001..RBG - * 0b010..GBR - * 0b011..GRB - * 0b100..BRG - * 0b101..BGR - */ -#define LCDIF_CTRL2_TOG_ODD_LINE_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_ODD_LINE_PATTERN_SHIFT)) & LCDIF_CTRL2_TOG_ODD_LINE_PATTERN_MASK) - -#define LCDIF_CTRL2_TOG_RSRVD4_MASK (0x80000U) -#define LCDIF_CTRL2_TOG_RSRVD4_SHIFT (19U) -#define LCDIF_CTRL2_TOG_RSRVD4(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_RSRVD4_SHIFT)) & LCDIF_CTRL2_TOG_RSRVD4_MASK) - -#define LCDIF_CTRL2_TOG_BURST_LEN_8_MASK (0x100000U) -#define LCDIF_CTRL2_TOG_BURST_LEN_8_SHIFT (20U) -#define LCDIF_CTRL2_TOG_BURST_LEN_8(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_BURST_LEN_8_SHIFT)) & LCDIF_CTRL2_TOG_BURST_LEN_8_MASK) - -#define LCDIF_CTRL2_TOG_OUTSTANDING_REQS_MASK (0xE00000U) -#define LCDIF_CTRL2_TOG_OUTSTANDING_REQS_SHIFT (21U) -/*! OUTSTANDING_REQS - * 0b000..REQ_1 - * 0b001..REQ_2 - * 0b010..REQ_4 - * 0b011..REQ_8 - * 0b100..REQ_16 - */ -#define LCDIF_CTRL2_TOG_OUTSTANDING_REQS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_OUTSTANDING_REQS_SHIFT)) & LCDIF_CTRL2_TOG_OUTSTANDING_REQS_MASK) - -#define LCDIF_CTRL2_TOG_RSRVD5_MASK (0xFF000000U) -#define LCDIF_CTRL2_TOG_RSRVD5_SHIFT (24U) -#define LCDIF_CTRL2_TOG_RSRVD5(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CTRL2_TOG_RSRVD5_SHIFT)) & LCDIF_CTRL2_TOG_RSRVD5_MASK) -/*! @} */ - -/*! @name TRANSFER_COUNT - LCDIF Horizontal and Vertical Valid Data Count Register */ -/*! @{ */ - -#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xFFFFU) -#define LCDIF_TRANSFER_COUNT_H_COUNT_SHIFT (0U) -#define LCDIF_TRANSFER_COUNT_H_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_TRANSFER_COUNT_H_COUNT_SHIFT)) & LCDIF_TRANSFER_COUNT_H_COUNT_MASK) - -#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xFFFF0000U) -#define LCDIF_TRANSFER_COUNT_V_COUNT_SHIFT (16U) -#define LCDIF_TRANSFER_COUNT_V_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_TRANSFER_COUNT_V_COUNT_SHIFT)) & LCDIF_TRANSFER_COUNT_V_COUNT_MASK) -/*! @} */ - -/*! @name CUR_BUF - LCD Interface Current Buffer Address Register */ -/*! @{ */ - -#define LCDIF_CUR_BUF_ADDR_MASK (0xFFFFFFFFU) -#define LCDIF_CUR_BUF_ADDR_SHIFT (0U) -#define LCDIF_CUR_BUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CUR_BUF_ADDR_SHIFT)) & LCDIF_CUR_BUF_ADDR_MASK) -/*! @} */ - -/*! @name NEXT_BUF - LCD Interface Next Buffer Address Register */ -/*! @{ */ - -#define LCDIF_NEXT_BUF_ADDR_MASK (0xFFFFFFFFU) -#define LCDIF_NEXT_BUF_ADDR_SHIFT (0U) -#define LCDIF_NEXT_BUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_NEXT_BUF_ADDR_SHIFT)) & LCDIF_NEXT_BUF_ADDR_MASK) -/*! @} */ - -/*! @name VDCTRL0 - LCDIF VSYNC Mode and Dotclk Mode Control Register0 */ -/*! @{ */ - -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK (0x3FFFFU) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_SHIFT (0U) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_SHIFT)) & LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK) - -#define LCDIF_VDCTRL0_HALF_LINE_MODE_MASK (0x40000U) -#define LCDIF_VDCTRL0_HALF_LINE_MODE_SHIFT (18U) -#define LCDIF_VDCTRL0_HALF_LINE_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_HALF_LINE_MODE_SHIFT)) & LCDIF_VDCTRL0_HALF_LINE_MODE_MASK) - -#define LCDIF_VDCTRL0_HALF_LINE_MASK (0x80000U) -#define LCDIF_VDCTRL0_HALF_LINE_SHIFT (19U) -#define LCDIF_VDCTRL0_HALF_LINE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_HALF_LINE_SHIFT)) & LCDIF_VDCTRL0_HALF_LINE_MASK) - -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_MASK (0x100000U) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_SHIFT (20U) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_SHIFT)) & LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_MASK) - -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_MASK (0x200000U) -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_SHIFT (21U) -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_SHIFT)) & LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_MASK) - -#define LCDIF_VDCTRL0_RSRVD1_MASK (0xC00000U) -#define LCDIF_VDCTRL0_RSRVD1_SHIFT (22U) -#define LCDIF_VDCTRL0_RSRVD1(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_RSRVD1_SHIFT)) & LCDIF_VDCTRL0_RSRVD1_MASK) - -#define LCDIF_VDCTRL0_ENABLE_POL_MASK (0x1000000U) -#define LCDIF_VDCTRL0_ENABLE_POL_SHIFT (24U) -#define LCDIF_VDCTRL0_ENABLE_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_ENABLE_POL_SHIFT)) & LCDIF_VDCTRL0_ENABLE_POL_MASK) - -#define LCDIF_VDCTRL0_DOTCLK_POL_MASK (0x2000000U) -#define LCDIF_VDCTRL0_DOTCLK_POL_SHIFT (25U) -#define LCDIF_VDCTRL0_DOTCLK_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_DOTCLK_POL_SHIFT)) & LCDIF_VDCTRL0_DOTCLK_POL_MASK) - -#define LCDIF_VDCTRL0_HSYNC_POL_MASK (0x4000000U) -#define LCDIF_VDCTRL0_HSYNC_POL_SHIFT (26U) -#define LCDIF_VDCTRL0_HSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_HSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_HSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_VSYNC_POL_MASK (0x8000000U) -#define LCDIF_VDCTRL0_VSYNC_POL_SHIFT (27U) -#define LCDIF_VDCTRL0_VSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_VSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_VSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_ENABLE_PRESENT_MASK (0x10000000U) -#define LCDIF_VDCTRL0_ENABLE_PRESENT_SHIFT (28U) -#define LCDIF_VDCTRL0_ENABLE_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_ENABLE_PRESENT_SHIFT)) & LCDIF_VDCTRL0_ENABLE_PRESENT_MASK) - -#define LCDIF_VDCTRL0_RSRVD2_MASK (0xE0000000U) -#define LCDIF_VDCTRL0_RSRVD2_SHIFT (29U) -#define LCDIF_VDCTRL0_RSRVD2(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_RSRVD2_SHIFT)) & LCDIF_VDCTRL0_RSRVD2_MASK) -/*! @} */ - -/*! @name VDCTRL0_SET - LCDIF VSYNC Mode and Dotclk Mode Control Register0 */ -/*! @{ */ - -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_MASK (0x3FFFFU) -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_SHIFT (0U) -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_SHIFT)) & LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_MASK) - -#define LCDIF_VDCTRL0_SET_HALF_LINE_MODE_MASK (0x40000U) -#define LCDIF_VDCTRL0_SET_HALF_LINE_MODE_SHIFT (18U) -#define LCDIF_VDCTRL0_SET_HALF_LINE_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_HALF_LINE_MODE_SHIFT)) & LCDIF_VDCTRL0_SET_HALF_LINE_MODE_MASK) - -#define LCDIF_VDCTRL0_SET_HALF_LINE_MASK (0x80000U) -#define LCDIF_VDCTRL0_SET_HALF_LINE_SHIFT (19U) -#define LCDIF_VDCTRL0_SET_HALF_LINE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_HALF_LINE_SHIFT)) & LCDIF_VDCTRL0_SET_HALF_LINE_MASK) - -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_UNIT_MASK (0x100000U) -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_UNIT_SHIFT (20U) -#define LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_UNIT_SHIFT)) & LCDIF_VDCTRL0_SET_VSYNC_PULSE_WIDTH_UNIT_MASK) - -#define LCDIF_VDCTRL0_SET_VSYNC_PERIOD_UNIT_MASK (0x200000U) -#define LCDIF_VDCTRL0_SET_VSYNC_PERIOD_UNIT_SHIFT (21U) -#define LCDIF_VDCTRL0_SET_VSYNC_PERIOD_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_VSYNC_PERIOD_UNIT_SHIFT)) & LCDIF_VDCTRL0_SET_VSYNC_PERIOD_UNIT_MASK) - -#define LCDIF_VDCTRL0_SET_RSRVD1_MASK (0xC00000U) -#define LCDIF_VDCTRL0_SET_RSRVD1_SHIFT (22U) -#define LCDIF_VDCTRL0_SET_RSRVD1(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_RSRVD1_SHIFT)) & LCDIF_VDCTRL0_SET_RSRVD1_MASK) - -#define LCDIF_VDCTRL0_SET_ENABLE_POL_MASK (0x1000000U) -#define LCDIF_VDCTRL0_SET_ENABLE_POL_SHIFT (24U) -#define LCDIF_VDCTRL0_SET_ENABLE_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_ENABLE_POL_SHIFT)) & LCDIF_VDCTRL0_SET_ENABLE_POL_MASK) - -#define LCDIF_VDCTRL0_SET_DOTCLK_POL_MASK (0x2000000U) -#define LCDIF_VDCTRL0_SET_DOTCLK_POL_SHIFT (25U) -#define LCDIF_VDCTRL0_SET_DOTCLK_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_DOTCLK_POL_SHIFT)) & LCDIF_VDCTRL0_SET_DOTCLK_POL_MASK) - -#define LCDIF_VDCTRL0_SET_HSYNC_POL_MASK (0x4000000U) -#define LCDIF_VDCTRL0_SET_HSYNC_POL_SHIFT (26U) -#define LCDIF_VDCTRL0_SET_HSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_HSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_SET_HSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_SET_VSYNC_POL_MASK (0x8000000U) -#define LCDIF_VDCTRL0_SET_VSYNC_POL_SHIFT (27U) -#define LCDIF_VDCTRL0_SET_VSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_VSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_SET_VSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_SET_ENABLE_PRESENT_MASK (0x10000000U) -#define LCDIF_VDCTRL0_SET_ENABLE_PRESENT_SHIFT (28U) -#define LCDIF_VDCTRL0_SET_ENABLE_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_ENABLE_PRESENT_SHIFT)) & LCDIF_VDCTRL0_SET_ENABLE_PRESENT_MASK) - -#define LCDIF_VDCTRL0_SET_RSRVD2_MASK (0xE0000000U) -#define LCDIF_VDCTRL0_SET_RSRVD2_SHIFT (29U) -#define LCDIF_VDCTRL0_SET_RSRVD2(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_SET_RSRVD2_SHIFT)) & LCDIF_VDCTRL0_SET_RSRVD2_MASK) -/*! @} */ - -/*! @name VDCTRL0_CLR - LCDIF VSYNC Mode and Dotclk Mode Control Register0 */ -/*! @{ */ - -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_MASK (0x3FFFFU) -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_SHIFT (0U) -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_SHIFT)) & LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_MASK) - -#define LCDIF_VDCTRL0_CLR_HALF_LINE_MODE_MASK (0x40000U) -#define LCDIF_VDCTRL0_CLR_HALF_LINE_MODE_SHIFT (18U) -#define LCDIF_VDCTRL0_CLR_HALF_LINE_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_HALF_LINE_MODE_SHIFT)) & LCDIF_VDCTRL0_CLR_HALF_LINE_MODE_MASK) - -#define LCDIF_VDCTRL0_CLR_HALF_LINE_MASK (0x80000U) -#define LCDIF_VDCTRL0_CLR_HALF_LINE_SHIFT (19U) -#define LCDIF_VDCTRL0_CLR_HALF_LINE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_HALF_LINE_SHIFT)) & LCDIF_VDCTRL0_CLR_HALF_LINE_MASK) - -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_UNIT_MASK (0x100000U) -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_UNIT_SHIFT (20U) -#define LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_UNIT_SHIFT)) & LCDIF_VDCTRL0_CLR_VSYNC_PULSE_WIDTH_UNIT_MASK) - -#define LCDIF_VDCTRL0_CLR_VSYNC_PERIOD_UNIT_MASK (0x200000U) -#define LCDIF_VDCTRL0_CLR_VSYNC_PERIOD_UNIT_SHIFT (21U) -#define LCDIF_VDCTRL0_CLR_VSYNC_PERIOD_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_VSYNC_PERIOD_UNIT_SHIFT)) & LCDIF_VDCTRL0_CLR_VSYNC_PERIOD_UNIT_MASK) - -#define LCDIF_VDCTRL0_CLR_RSRVD1_MASK (0xC00000U) -#define LCDIF_VDCTRL0_CLR_RSRVD1_SHIFT (22U) -#define LCDIF_VDCTRL0_CLR_RSRVD1(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_RSRVD1_SHIFT)) & LCDIF_VDCTRL0_CLR_RSRVD1_MASK) - -#define LCDIF_VDCTRL0_CLR_ENABLE_POL_MASK (0x1000000U) -#define LCDIF_VDCTRL0_CLR_ENABLE_POL_SHIFT (24U) -#define LCDIF_VDCTRL0_CLR_ENABLE_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_ENABLE_POL_SHIFT)) & LCDIF_VDCTRL0_CLR_ENABLE_POL_MASK) - -#define LCDIF_VDCTRL0_CLR_DOTCLK_POL_MASK (0x2000000U) -#define LCDIF_VDCTRL0_CLR_DOTCLK_POL_SHIFT (25U) -#define LCDIF_VDCTRL0_CLR_DOTCLK_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_DOTCLK_POL_SHIFT)) & LCDIF_VDCTRL0_CLR_DOTCLK_POL_MASK) - -#define LCDIF_VDCTRL0_CLR_HSYNC_POL_MASK (0x4000000U) -#define LCDIF_VDCTRL0_CLR_HSYNC_POL_SHIFT (26U) -#define LCDIF_VDCTRL0_CLR_HSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_HSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_CLR_HSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_CLR_VSYNC_POL_MASK (0x8000000U) -#define LCDIF_VDCTRL0_CLR_VSYNC_POL_SHIFT (27U) -#define LCDIF_VDCTRL0_CLR_VSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_VSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_CLR_VSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_CLR_ENABLE_PRESENT_MASK (0x10000000U) -#define LCDIF_VDCTRL0_CLR_ENABLE_PRESENT_SHIFT (28U) -#define LCDIF_VDCTRL0_CLR_ENABLE_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_ENABLE_PRESENT_SHIFT)) & LCDIF_VDCTRL0_CLR_ENABLE_PRESENT_MASK) - -#define LCDIF_VDCTRL0_CLR_RSRVD2_MASK (0xE0000000U) -#define LCDIF_VDCTRL0_CLR_RSRVD2_SHIFT (29U) -#define LCDIF_VDCTRL0_CLR_RSRVD2(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_CLR_RSRVD2_SHIFT)) & LCDIF_VDCTRL0_CLR_RSRVD2_MASK) -/*! @} */ - -/*! @name VDCTRL0_TOG - LCDIF VSYNC Mode and Dotclk Mode Control Register0 */ -/*! @{ */ - -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_MASK (0x3FFFFU) -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_SHIFT (0U) -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_SHIFT)) & LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_MASK) - -#define LCDIF_VDCTRL0_TOG_HALF_LINE_MODE_MASK (0x40000U) -#define LCDIF_VDCTRL0_TOG_HALF_LINE_MODE_SHIFT (18U) -#define LCDIF_VDCTRL0_TOG_HALF_LINE_MODE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_HALF_LINE_MODE_SHIFT)) & LCDIF_VDCTRL0_TOG_HALF_LINE_MODE_MASK) - -#define LCDIF_VDCTRL0_TOG_HALF_LINE_MASK (0x80000U) -#define LCDIF_VDCTRL0_TOG_HALF_LINE_SHIFT (19U) -#define LCDIF_VDCTRL0_TOG_HALF_LINE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_HALF_LINE_SHIFT)) & LCDIF_VDCTRL0_TOG_HALF_LINE_MASK) - -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_UNIT_MASK (0x100000U) -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_UNIT_SHIFT (20U) -#define LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_UNIT_SHIFT)) & LCDIF_VDCTRL0_TOG_VSYNC_PULSE_WIDTH_UNIT_MASK) - -#define LCDIF_VDCTRL0_TOG_VSYNC_PERIOD_UNIT_MASK (0x200000U) -#define LCDIF_VDCTRL0_TOG_VSYNC_PERIOD_UNIT_SHIFT (21U) -#define LCDIF_VDCTRL0_TOG_VSYNC_PERIOD_UNIT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_VSYNC_PERIOD_UNIT_SHIFT)) & LCDIF_VDCTRL0_TOG_VSYNC_PERIOD_UNIT_MASK) - -#define LCDIF_VDCTRL0_TOG_RSRVD1_MASK (0xC00000U) -#define LCDIF_VDCTRL0_TOG_RSRVD1_SHIFT (22U) -#define LCDIF_VDCTRL0_TOG_RSRVD1(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_RSRVD1_SHIFT)) & LCDIF_VDCTRL0_TOG_RSRVD1_MASK) - -#define LCDIF_VDCTRL0_TOG_ENABLE_POL_MASK (0x1000000U) -#define LCDIF_VDCTRL0_TOG_ENABLE_POL_SHIFT (24U) -#define LCDIF_VDCTRL0_TOG_ENABLE_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_ENABLE_POL_SHIFT)) & LCDIF_VDCTRL0_TOG_ENABLE_POL_MASK) - -#define LCDIF_VDCTRL0_TOG_DOTCLK_POL_MASK (0x2000000U) -#define LCDIF_VDCTRL0_TOG_DOTCLK_POL_SHIFT (25U) -#define LCDIF_VDCTRL0_TOG_DOTCLK_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_DOTCLK_POL_SHIFT)) & LCDIF_VDCTRL0_TOG_DOTCLK_POL_MASK) - -#define LCDIF_VDCTRL0_TOG_HSYNC_POL_MASK (0x4000000U) -#define LCDIF_VDCTRL0_TOG_HSYNC_POL_SHIFT (26U) -#define LCDIF_VDCTRL0_TOG_HSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_HSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_TOG_HSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_TOG_VSYNC_POL_MASK (0x8000000U) -#define LCDIF_VDCTRL0_TOG_VSYNC_POL_SHIFT (27U) -#define LCDIF_VDCTRL0_TOG_VSYNC_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_VSYNC_POL_SHIFT)) & LCDIF_VDCTRL0_TOG_VSYNC_POL_MASK) - -#define LCDIF_VDCTRL0_TOG_ENABLE_PRESENT_MASK (0x10000000U) -#define LCDIF_VDCTRL0_TOG_ENABLE_PRESENT_SHIFT (28U) -#define LCDIF_VDCTRL0_TOG_ENABLE_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_ENABLE_PRESENT_SHIFT)) & LCDIF_VDCTRL0_TOG_ENABLE_PRESENT_MASK) - -#define LCDIF_VDCTRL0_TOG_RSRVD2_MASK (0xE0000000U) -#define LCDIF_VDCTRL0_TOG_RSRVD2_SHIFT (29U) -#define LCDIF_VDCTRL0_TOG_RSRVD2(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL0_TOG_RSRVD2_SHIFT)) & LCDIF_VDCTRL0_TOG_RSRVD2_MASK) -/*! @} */ - -/*! @name VDCTRL1 - LCDIF VSYNC Mode and Dotclk Mode Control Register1 */ -/*! @{ */ - -#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK (0xFFFFFFFFU) -#define LCDIF_VDCTRL1_VSYNC_PERIOD_SHIFT (0U) -#define LCDIF_VDCTRL1_VSYNC_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL1_VSYNC_PERIOD_SHIFT)) & LCDIF_VDCTRL1_VSYNC_PERIOD_MASK) -/*! @} */ - -/*! @name VDCTRL2 - LCDIF VSYNC Mode and Dotclk Mode Control Register2 */ -/*! @{ */ - -#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK (0x3FFFFU) -#define LCDIF_VDCTRL2_HSYNC_PERIOD_SHIFT (0U) -#define LCDIF_VDCTRL2_HSYNC_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL2_HSYNC_PERIOD_SHIFT)) & LCDIF_VDCTRL2_HSYNC_PERIOD_MASK) - -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xFFFC0000U) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_SHIFT (18U) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_SHIFT)) & LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK) -/*! @} */ - -/*! @name VDCTRL3 - LCDIF VSYNC Mode and Dotclk Mode Control Register3 */ -/*! @{ */ - -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xFFFFU) -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_SHIFT (0U) -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_SHIFT)) & LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK) - -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xFFF0000U) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_SHIFT (16U) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_SHIFT)) & LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK) - -#define LCDIF_VDCTRL3_VSYNC_ONLY_MASK (0x10000000U) -#define LCDIF_VDCTRL3_VSYNC_ONLY_SHIFT (28U) -#define LCDIF_VDCTRL3_VSYNC_ONLY(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL3_VSYNC_ONLY_SHIFT)) & LCDIF_VDCTRL3_VSYNC_ONLY_MASK) - -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS_MASK (0x20000000U) -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS_SHIFT (29U) -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL3_MUX_SYNC_SIGNALS_SHIFT)) & LCDIF_VDCTRL3_MUX_SYNC_SIGNALS_MASK) - -#define LCDIF_VDCTRL3_RSRVD0_MASK (0xC0000000U) -#define LCDIF_VDCTRL3_RSRVD0_SHIFT (30U) -#define LCDIF_VDCTRL3_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL3_RSRVD0_SHIFT)) & LCDIF_VDCTRL3_RSRVD0_MASK) -/*! @} */ - -/*! @name VDCTRL4 - LCDIF VSYNC Mode and Dotclk Mode Control Register4 */ -/*! @{ */ - -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK (0x3FFFFU) -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_SHIFT (0U) -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_SHIFT)) & LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK) - -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON_MASK (0x40000U) -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON_SHIFT (18U) -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL4_SYNC_SIGNALS_ON_SHIFT)) & LCDIF_VDCTRL4_SYNC_SIGNALS_ON_MASK) - -#define LCDIF_VDCTRL4_RSRVD0_MASK (0x1FF80000U) -#define LCDIF_VDCTRL4_RSRVD0_SHIFT (19U) -#define LCDIF_VDCTRL4_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL4_RSRVD0_SHIFT)) & LCDIF_VDCTRL4_RSRVD0_MASK) - -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0xE0000000U) -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_SHIFT (29U) -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_VDCTRL4_DOTCLK_DLY_SEL_SHIFT)) & LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK) -/*! @} */ - -/*! @name BM_ERROR_STAT - Bus Master Error Status Register */ -/*! @{ */ - -#define LCDIF_BM_ERROR_STAT_ADDR_MASK (0xFFFFFFFFU) -#define LCDIF_BM_ERROR_STAT_ADDR_SHIFT (0U) -#define LCDIF_BM_ERROR_STAT_ADDR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_BM_ERROR_STAT_ADDR_SHIFT)) & LCDIF_BM_ERROR_STAT_ADDR_MASK) -/*! @} */ - -/*! @name CRC_STAT - CRC Status Register */ -/*! @{ */ - -#define LCDIF_CRC_STAT_CRC_VALUE_MASK (0xFFFFFFFFU) -#define LCDIF_CRC_STAT_CRC_VALUE_SHIFT (0U) -#define LCDIF_CRC_STAT_CRC_VALUE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_CRC_STAT_CRC_VALUE_SHIFT)) & LCDIF_CRC_STAT_CRC_VALUE_MASK) -/*! @} */ - -/*! @name STAT - LCD Interface Status Register */ -/*! @{ */ - -#define LCDIF_STAT_LFIFO_COUNT_MASK (0x1FFU) -#define LCDIF_STAT_LFIFO_COUNT_SHIFT (0U) -#define LCDIF_STAT_LFIFO_COUNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_LFIFO_COUNT_SHIFT)) & LCDIF_STAT_LFIFO_COUNT_MASK) - -#define LCDIF_STAT_RSRVD0_MASK (0x1FFFE00U) -#define LCDIF_STAT_RSRVD0_SHIFT (9U) -#define LCDIF_STAT_RSRVD0(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_RSRVD0_SHIFT)) & LCDIF_STAT_RSRVD0_MASK) - -#define LCDIF_STAT_TXFIFO_EMPTY_MASK (0x4000000U) -#define LCDIF_STAT_TXFIFO_EMPTY_SHIFT (26U) -#define LCDIF_STAT_TXFIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_TXFIFO_EMPTY_SHIFT)) & LCDIF_STAT_TXFIFO_EMPTY_MASK) - -#define LCDIF_STAT_TXFIFO_FULL_MASK (0x8000000U) -#define LCDIF_STAT_TXFIFO_FULL_SHIFT (27U) -#define LCDIF_STAT_TXFIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_TXFIFO_FULL_SHIFT)) & LCDIF_STAT_TXFIFO_FULL_MASK) - -#define LCDIF_STAT_LFIFO_EMPTY_MASK (0x10000000U) -#define LCDIF_STAT_LFIFO_EMPTY_SHIFT (28U) -#define LCDIF_STAT_LFIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_LFIFO_EMPTY_SHIFT)) & LCDIF_STAT_LFIFO_EMPTY_MASK) - -#define LCDIF_STAT_LFIFO_FULL_MASK (0x20000000U) -#define LCDIF_STAT_LFIFO_FULL_SHIFT (29U) -#define LCDIF_STAT_LFIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_LFIFO_FULL_SHIFT)) & LCDIF_STAT_LFIFO_FULL_MASK) - -#define LCDIF_STAT_DMA_REQ_MASK (0x40000000U) -#define LCDIF_STAT_DMA_REQ_SHIFT (30U) -#define LCDIF_STAT_DMA_REQ(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_DMA_REQ_SHIFT)) & LCDIF_STAT_DMA_REQ_MASK) - -#define LCDIF_STAT_PRESENT_MASK (0x80000000U) -#define LCDIF_STAT_PRESENT_SHIFT (31U) -#define LCDIF_STAT_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_STAT_PRESENT_SHIFT)) & LCDIF_STAT_PRESENT_MASK) -/*! @} */ - -/*! @name THRES - LCDIF Threshold Register */ -/*! @{ */ - -#define LCDIF_THRES_PANIC_MASK (0x1FFU) -#define LCDIF_THRES_PANIC_SHIFT (0U) -#define LCDIF_THRES_PANIC(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_THRES_PANIC_SHIFT)) & LCDIF_THRES_PANIC_MASK) - -#define LCDIF_THRES_RSRVD1_MASK (0xFE00U) -#define LCDIF_THRES_RSRVD1_SHIFT (9U) -#define LCDIF_THRES_RSRVD1(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_THRES_RSRVD1_SHIFT)) & LCDIF_THRES_RSRVD1_MASK) - -#define LCDIF_THRES_FASTCLOCK_MASK (0x1FF0000U) -#define LCDIF_THRES_FASTCLOCK_SHIFT (16U) -#define LCDIF_THRES_FASTCLOCK(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_THRES_FASTCLOCK_SHIFT)) & LCDIF_THRES_FASTCLOCK_MASK) - -#define LCDIF_THRES_RSRVD2_MASK (0xFE000000U) -#define LCDIF_THRES_RSRVD2_SHIFT (25U) -#define LCDIF_THRES_RSRVD2(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_THRES_RSRVD2_SHIFT)) & LCDIF_THRES_RSRVD2_MASK) -/*! @} */ - -/*! @name PIGEONCTRL0 - LCDIF Pigeon Mode Control0 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL0_FD_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL0_FD_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL0_FD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_FD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_FD_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL0_LD_PERIOD_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL0_LD_PERIOD_SHIFT (16U) -#define LCDIF_PIGEONCTRL0_LD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_LD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_LD_PERIOD_MASK) -/*! @} */ - -/*! @name PIGEONCTRL0_SET - LCDIF Pigeon Mode Control0 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL0_SET_FD_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL0_SET_FD_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL0_SET_FD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_SET_FD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_SET_FD_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL0_SET_LD_PERIOD_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL0_SET_LD_PERIOD_SHIFT (16U) -#define LCDIF_PIGEONCTRL0_SET_LD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_SET_LD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_SET_LD_PERIOD_MASK) -/*! @} */ - -/*! @name PIGEONCTRL0_CLR - LCDIF Pigeon Mode Control0 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL0_CLR_FD_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL0_CLR_FD_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL0_CLR_FD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_CLR_FD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_CLR_FD_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL0_CLR_LD_PERIOD_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL0_CLR_LD_PERIOD_SHIFT (16U) -#define LCDIF_PIGEONCTRL0_CLR_LD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_CLR_LD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_CLR_LD_PERIOD_MASK) -/*! @} */ - -/*! @name PIGEONCTRL0_TOG - LCDIF Pigeon Mode Control0 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL0_TOG_FD_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL0_TOG_FD_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL0_TOG_FD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_TOG_FD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_TOG_FD_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL0_TOG_LD_PERIOD_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL0_TOG_LD_PERIOD_SHIFT (16U) -#define LCDIF_PIGEONCTRL0_TOG_LD_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL0_TOG_LD_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL0_TOG_LD_PERIOD_MASK) -/*! @} */ - -/*! @name PIGEONCTRL1 - LCDIF Pigeon Mode Control1 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL1_FRAME_CNT_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL1_FRAME_CNT_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL1_FRAME_CNT_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_FRAME_CNT_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL1_FRAME_CNT_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL1_FRAME_CNT_CYCLES_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL1_FRAME_CNT_CYCLES_SHIFT (16U) -#define LCDIF_PIGEONCTRL1_FRAME_CNT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_FRAME_CNT_CYCLES_SHIFT)) & LCDIF_PIGEONCTRL1_FRAME_CNT_CYCLES_MASK) -/*! @} */ - -/*! @name PIGEONCTRL1_SET - LCDIF Pigeon Mode Control1 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_SET_FRAME_CNT_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL1_SET_FRAME_CNT_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_CYCLES_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_CYCLES_SHIFT (16U) -#define LCDIF_PIGEONCTRL1_SET_FRAME_CNT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_SET_FRAME_CNT_CYCLES_SHIFT)) & LCDIF_PIGEONCTRL1_SET_FRAME_CNT_CYCLES_MASK) -/*! @} */ - -/*! @name PIGEONCTRL1_CLR - LCDIF Pigeon Mode Control1 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_CYCLES_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_CYCLES_SHIFT (16U) -#define LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_CYCLES_SHIFT)) & LCDIF_PIGEONCTRL1_CLR_FRAME_CNT_CYCLES_MASK) -/*! @} */ - -/*! @name PIGEONCTRL1_TOG - LCDIF Pigeon Mode Control1 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_PERIOD_MASK (0xFFFU) -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_PERIOD_SHIFT (0U) -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_PERIOD_SHIFT)) & LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_PERIOD_MASK) - -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_CYCLES_MASK (0xFFF0000U) -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_CYCLES_SHIFT (16U) -#define LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_CYCLES_SHIFT)) & LCDIF_PIGEONCTRL1_TOG_FRAME_CNT_CYCLES_MASK) -/*! @} */ - -/*! @name PIGEONCTRL2 - LCDIF Pigeon Mode Control2 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL2_PIGEON_DATA_EN_MASK (0x1U) -#define LCDIF_PIGEONCTRL2_PIGEON_DATA_EN_SHIFT (0U) -#define LCDIF_PIGEONCTRL2_PIGEON_DATA_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_PIGEON_DATA_EN_SHIFT)) & LCDIF_PIGEONCTRL2_PIGEON_DATA_EN_MASK) - -#define LCDIF_PIGEONCTRL2_PIGEON_CLK_GATE_MASK (0x2U) -#define LCDIF_PIGEONCTRL2_PIGEON_CLK_GATE_SHIFT (1U) -#define LCDIF_PIGEONCTRL2_PIGEON_CLK_GATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_PIGEON_CLK_GATE_SHIFT)) & LCDIF_PIGEONCTRL2_PIGEON_CLK_GATE_MASK) -/*! @} */ - -/*! @name PIGEONCTRL2_SET - LCDIF Pigeon Mode Control2 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL2_SET_PIGEON_DATA_EN_MASK (0x1U) -#define LCDIF_PIGEONCTRL2_SET_PIGEON_DATA_EN_SHIFT (0U) -#define LCDIF_PIGEONCTRL2_SET_PIGEON_DATA_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_SET_PIGEON_DATA_EN_SHIFT)) & LCDIF_PIGEONCTRL2_SET_PIGEON_DATA_EN_MASK) - -#define LCDIF_PIGEONCTRL2_SET_PIGEON_CLK_GATE_MASK (0x2U) -#define LCDIF_PIGEONCTRL2_SET_PIGEON_CLK_GATE_SHIFT (1U) -#define LCDIF_PIGEONCTRL2_SET_PIGEON_CLK_GATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_SET_PIGEON_CLK_GATE_SHIFT)) & LCDIF_PIGEONCTRL2_SET_PIGEON_CLK_GATE_MASK) -/*! @} */ - -/*! @name PIGEONCTRL2_CLR - LCDIF Pigeon Mode Control2 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_DATA_EN_MASK (0x1U) -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_DATA_EN_SHIFT (0U) -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_DATA_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_CLR_PIGEON_DATA_EN_SHIFT)) & LCDIF_PIGEONCTRL2_CLR_PIGEON_DATA_EN_MASK) - -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_CLK_GATE_MASK (0x2U) -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_CLK_GATE_SHIFT (1U) -#define LCDIF_PIGEONCTRL2_CLR_PIGEON_CLK_GATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_CLR_PIGEON_CLK_GATE_SHIFT)) & LCDIF_PIGEONCTRL2_CLR_PIGEON_CLK_GATE_MASK) -/*! @} */ - -/*! @name PIGEONCTRL2_TOG - LCDIF Pigeon Mode Control2 Register */ -/*! @{ */ - -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_DATA_EN_MASK (0x1U) -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_DATA_EN_SHIFT (0U) -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_DATA_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_TOG_PIGEON_DATA_EN_SHIFT)) & LCDIF_PIGEONCTRL2_TOG_PIGEON_DATA_EN_MASK) - -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_CLK_GATE_MASK (0x2U) -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_CLK_GATE_SHIFT (1U) -#define LCDIF_PIGEONCTRL2_TOG_PIGEON_CLK_GATE(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEONCTRL2_TOG_PIGEON_CLK_GATE_SHIFT)) & LCDIF_PIGEONCTRL2_TOG_PIGEON_CLK_GATE_MASK) -/*! @} */ - -/*! @name PIGEON_0 - Panel Interface Signal Generator Register */ -/*! @{ */ - -#define LCDIF_PIGEON_0_EN_MASK (0x1U) -#define LCDIF_PIGEON_0_EN_SHIFT (0U) -#define LCDIF_PIGEON_0_EN(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_EN_SHIFT)) & LCDIF_PIGEON_0_EN_MASK) - -#define LCDIF_PIGEON_0_POL_MASK (0x2U) -#define LCDIF_PIGEON_0_POL_SHIFT (1U) -/*! POL - * 0b0..Normal Signal (Active high) - * 0b1..Inverted signal (Active low) - */ -#define LCDIF_PIGEON_0_POL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_POL_SHIFT)) & LCDIF_PIGEON_0_POL_MASK) - -#define LCDIF_PIGEON_0_INC_SEL_MASK (0xCU) -#define LCDIF_PIGEON_0_INC_SEL_SHIFT (2U) -/*! INC_SEL - * 0b00..pclk - * 0b01..Line start pulse - * 0b10..Frame start pulse - * 0b11..Use another signal as tick event - */ -#define LCDIF_PIGEON_0_INC_SEL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_INC_SEL_SHIFT)) & LCDIF_PIGEON_0_INC_SEL_MASK) - -#define LCDIF_PIGEON_0_OFFSET_MASK (0xF0U) -#define LCDIF_PIGEON_0_OFFSET_SHIFT (4U) -#define LCDIF_PIGEON_0_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_OFFSET_SHIFT)) & LCDIF_PIGEON_0_OFFSET_MASK) - -#define LCDIF_PIGEON_0_MASK_CNT_SEL_MASK (0xF00U) -#define LCDIF_PIGEON_0_MASK_CNT_SEL_SHIFT (8U) -/*! MASK_CNT_SEL - * 0b0000..pclk counter within one hscan state - * 0b0001..pclk cycle within one hscan state - * 0b0010..line counter within one vscan state - * 0b0011..line cycle within one vscan state - * 0b0100..frame counter - * 0b0101..frame cycle - * 0b0110..horizontal counter (pclk counter within one line ) - * 0b0111..vertical counter (line counter within one frame) - */ -#define LCDIF_PIGEON_0_MASK_CNT_SEL(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_MASK_CNT_SEL_SHIFT)) & LCDIF_PIGEON_0_MASK_CNT_SEL_MASK) - -#define LCDIF_PIGEON_0_MASK_CNT_MASK (0xFFF000U) -#define LCDIF_PIGEON_0_MASK_CNT_SHIFT (12U) -#define LCDIF_PIGEON_0_MASK_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_MASK_CNT_SHIFT)) & LCDIF_PIGEON_0_MASK_CNT_MASK) - -#define LCDIF_PIGEON_0_STATE_MASK_MASK (0xFF000000U) -#define LCDIF_PIGEON_0_STATE_MASK_SHIFT (24U) -/*! STATE_MASK - * 0b00000001..FRAME SYNC - * 0b00000010..FRAME BEGIN - * 0b00000100..FRAME DATA - * 0b00001000..FRAME END - * 0b00010000..LINE SYNC - * 0b00100000..LINE BEGIN - * 0b01000000..LINE DATA - * 0b10000000..LINE END - */ -#define LCDIF_PIGEON_0_STATE_MASK(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_0_STATE_MASK_SHIFT)) & LCDIF_PIGEON_0_STATE_MASK_MASK) -/*! @} */ - -/* The count of LCDIF_PIGEON_0 */ -#define LCDIF_PIGEON_0_COUNT (12U) - -/*! @name PIGEON_1 - Panel Interface Signal Generator Register */ -/*! @{ */ - -#define LCDIF_PIGEON_1_SET_CNT_MASK (0xFFFFU) -#define LCDIF_PIGEON_1_SET_CNT_SHIFT (0U) -/*! SET_CNT - * 0b0000000000000000..Start as active - */ -#define LCDIF_PIGEON_1_SET_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_1_SET_CNT_SHIFT)) & LCDIF_PIGEON_1_SET_CNT_MASK) - -#define LCDIF_PIGEON_1_CLR_CNT_MASK (0xFFFF0000U) -#define LCDIF_PIGEON_1_CLR_CNT_SHIFT (16U) -/*! CLR_CNT - * 0b0000000000000000..Keep active until mask off - */ -#define LCDIF_PIGEON_1_CLR_CNT(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_1_CLR_CNT_SHIFT)) & LCDIF_PIGEON_1_CLR_CNT_MASK) -/*! @} */ - -/* The count of LCDIF_PIGEON_1 */ -#define LCDIF_PIGEON_1_COUNT (12U) - -/*! @name PIGEON_2 - Panel Interface Signal Generator Register */ -/*! @{ */ - -#define LCDIF_PIGEON_2_SIG_LOGIC_MASK (0xFU) -#define LCDIF_PIGEON_2_SIG_LOGIC_SHIFT (0U) -/*! SIG_LOGIC - * 0b0000..No logic operation - * 0b0001..sigout = sig_another AND this_sig - * 0b0010..sigout = sig_another OR this_sig - * 0b0011..mask = sig_another AND other_masks - */ -#define LCDIF_PIGEON_2_SIG_LOGIC(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_2_SIG_LOGIC_SHIFT)) & LCDIF_PIGEON_2_SIG_LOGIC_MASK) - -#define LCDIF_PIGEON_2_SIG_ANOTHER_MASK (0x1F0U) -#define LCDIF_PIGEON_2_SIG_ANOTHER_SHIFT (4U) -/*! SIG_ANOTHER - * 0b00000..Keep active until mask off - */ -#define LCDIF_PIGEON_2_SIG_ANOTHER(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_2_SIG_ANOTHER_SHIFT)) & LCDIF_PIGEON_2_SIG_ANOTHER_MASK) - -#define LCDIF_PIGEON_2_RSVD_MASK (0xFFFFFE00U) -#define LCDIF_PIGEON_2_RSVD_SHIFT (9U) -#define LCDIF_PIGEON_2_RSVD(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_PIGEON_2_RSVD_SHIFT)) & LCDIF_PIGEON_2_RSVD_MASK) -/*! @} */ - -/* The count of LCDIF_PIGEON_2 */ -#define LCDIF_PIGEON_2_COUNT (12U) - -/*! @name LUT_CTRL - Lookup Table Data Register. */ -/*! @{ */ - -#define LCDIF_LUT_CTRL_LUT_BYPASS_MASK (0x1U) -#define LCDIF_LUT_CTRL_LUT_BYPASS_SHIFT (0U) -#define LCDIF_LUT_CTRL_LUT_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_LUT_CTRL_LUT_BYPASS_SHIFT)) & LCDIF_LUT_CTRL_LUT_BYPASS_MASK) -/*! @} */ - -/*! @name LUT0_ADDR - Lookup Table Control Register. */ -/*! @{ */ - -#define LCDIF_LUT0_ADDR_ADDR_MASK (0xFFU) -#define LCDIF_LUT0_ADDR_ADDR_SHIFT (0U) -#define LCDIF_LUT0_ADDR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_LUT0_ADDR_ADDR_SHIFT)) & LCDIF_LUT0_ADDR_ADDR_MASK) -/*! @} */ - -/*! @name LUT0_DATA - Lookup Table Data Register. */ -/*! @{ */ - -#define LCDIF_LUT0_DATA_DATA_MASK (0xFFFFFFFFU) -#define LCDIF_LUT0_DATA_DATA_SHIFT (0U) -#define LCDIF_LUT0_DATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_LUT0_DATA_DATA_SHIFT)) & LCDIF_LUT0_DATA_DATA_MASK) -/*! @} */ - -/*! @name LUT1_ADDR - Lookup Table Control Register. */ -/*! @{ */ - -#define LCDIF_LUT1_ADDR_ADDR_MASK (0xFFU) -#define LCDIF_LUT1_ADDR_ADDR_SHIFT (0U) -#define LCDIF_LUT1_ADDR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_LUT1_ADDR_ADDR_SHIFT)) & LCDIF_LUT1_ADDR_ADDR_MASK) -/*! @} */ - -/*! @name LUT1_DATA - Lookup Table Data Register. */ -/*! @{ */ - -#define LCDIF_LUT1_DATA_DATA_MASK (0xFFFFFFFFU) -#define LCDIF_LUT1_DATA_DATA_SHIFT (0U) -#define LCDIF_LUT1_DATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << LCDIF_LUT1_DATA_DATA_SHIFT)) & LCDIF_LUT1_DATA_DATA_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group LCDIF_Register_Masks */ - - -/* LCDIF - Peripheral instance base addresses */ -/** Peripheral LCDIF base address */ -#define LCDIF_BASE (0x402B8000u) -/** Peripheral LCDIF base pointer */ -#define LCDIF ((LCDIF_Type *)LCDIF_BASE) -/** Array initializer of LCDIF peripheral base addresses */ -#define LCDIF_BASE_ADDRS { LCDIF_BASE } -/** Array initializer of LCDIF peripheral base pointers */ -#define LCDIF_BASE_PTRS { LCDIF } -/** Interrupt vectors for the LCDIF peripheral type */ -#define LCDIF_IRQ0_IRQS { LCDIF_IRQn } - -/*! - * @} - */ /* end of group LCDIF_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- LPI2C Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPI2C_Peripheral_Access_Layer LPI2C Peripheral Access Layer - * @{ - */ - -/** LPI2C - Register Layout Typedef */ -typedef struct { - __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ - __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ - uint8_t RESERVED_0[8]; - __IO uint32_t MCR; /**< Master Control Register, offset: 0x10 */ - __IO uint32_t MSR; /**< Master Status Register, offset: 0x14 */ - __IO uint32_t MIER; /**< Master Interrupt Enable Register, offset: 0x18 */ - __IO uint32_t MDER; /**< Master DMA Enable Register, offset: 0x1C */ - __IO uint32_t MCFGR0; /**< Master Configuration Register 0, offset: 0x20 */ - __IO uint32_t MCFGR1; /**< Master Configuration Register 1, offset: 0x24 */ - __IO uint32_t MCFGR2; /**< Master Configuration Register 2, offset: 0x28 */ - __IO uint32_t MCFGR3; /**< Master Configuration Register 3, offset: 0x2C */ - uint8_t RESERVED_1[16]; - __IO uint32_t MDMR; /**< Master Data Match Register, offset: 0x40 */ - uint8_t RESERVED_2[4]; - __IO uint32_t MCCR0; /**< Master Clock Configuration Register 0, offset: 0x48 */ - uint8_t RESERVED_3[4]; - __IO uint32_t MCCR1; /**< Master Clock Configuration Register 1, offset: 0x50 */ - uint8_t RESERVED_4[4]; - __IO uint32_t MFCR; /**< Master FIFO Control Register, offset: 0x58 */ - __I uint32_t MFSR; /**< Master FIFO Status Register, offset: 0x5C */ - __O uint32_t MTDR; /**< Master Transmit Data Register, offset: 0x60 */ - uint8_t RESERVED_5[12]; - __I uint32_t MRDR; /**< Master Receive Data Register, offset: 0x70 */ - uint8_t RESERVED_6[156]; - __IO uint32_t SCR; /**< Slave Control Register, offset: 0x110 */ - __IO uint32_t SSR; /**< Slave Status Register, offset: 0x114 */ - __IO uint32_t SIER; /**< Slave Interrupt Enable Register, offset: 0x118 */ - __IO uint32_t SDER; /**< Slave DMA Enable Register, offset: 0x11C */ - uint8_t RESERVED_7[4]; - __IO uint32_t SCFGR1; /**< Slave Configuration Register 1, offset: 0x124 */ - __IO uint32_t SCFGR2; /**< Slave Configuration Register 2, offset: 0x128 */ - uint8_t RESERVED_8[20]; - __IO uint32_t SAMR; /**< Slave Address Match Register, offset: 0x140 */ - uint8_t RESERVED_9[12]; - __I uint32_t SASR; /**< Slave Address Status Register, offset: 0x150 */ - __IO uint32_t STAR; /**< Slave Transmit ACK Register, offset: 0x154 */ - uint8_t RESERVED_10[8]; - __O uint32_t STDR; /**< Slave Transmit Data Register, offset: 0x160 */ - uint8_t RESERVED_11[12]; - __I uint32_t SRDR; /**< Slave Receive Data Register, offset: 0x170 */ -} LPI2C_Type; - -/* ---------------------------------------------------------------------------- - -- LPI2C Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPI2C_Register_Masks LPI2C Register Masks - * @{ - */ - -/*! @name VERID - Version ID Register */ -/*! @{ */ - -#define LPI2C_VERID_FEATURE_MASK (0xFFFFU) -#define LPI2C_VERID_FEATURE_SHIFT (0U) -/*! FEATURE - Feature Specification Number - * 0b0000000000000010..Master only, with standard feature set - * 0b0000000000000011..Master and slave, with standard feature set - */ -#define LPI2C_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_FEATURE_SHIFT)) & LPI2C_VERID_FEATURE_MASK) - -#define LPI2C_VERID_MINOR_MASK (0xFF0000U) -#define LPI2C_VERID_MINOR_SHIFT (16U) -/*! MINOR - Minor Version Number - */ -#define LPI2C_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MINOR_SHIFT)) & LPI2C_VERID_MINOR_MASK) - -#define LPI2C_VERID_MAJOR_MASK (0xFF000000U) -#define LPI2C_VERID_MAJOR_SHIFT (24U) -/*! MAJOR - Major Version Number - */ -#define LPI2C_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MAJOR_SHIFT)) & LPI2C_VERID_MAJOR_MASK) -/*! @} */ - -/*! @name PARAM - Parameter Register */ -/*! @{ */ - -#define LPI2C_PARAM_MTXFIFO_MASK (0xFU) -#define LPI2C_PARAM_MTXFIFO_SHIFT (0U) -/*! MTXFIFO - Master Transmit FIFO Size - */ -#define LPI2C_PARAM_MTXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MTXFIFO_SHIFT)) & LPI2C_PARAM_MTXFIFO_MASK) - -#define LPI2C_PARAM_MRXFIFO_MASK (0xF00U) -#define LPI2C_PARAM_MRXFIFO_SHIFT (8U) -/*! MRXFIFO - Master Receive FIFO Size - */ -#define LPI2C_PARAM_MRXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MRXFIFO_SHIFT)) & LPI2C_PARAM_MRXFIFO_MASK) -/*! @} */ - -/*! @name MCR - Master Control Register */ -/*! @{ */ - -#define LPI2C_MCR_MEN_MASK (0x1U) -#define LPI2C_MCR_MEN_SHIFT (0U) -/*! MEN - Master Enable - * 0b0..Master logic is disabled - * 0b1..Master logic is enabled - */ -#define LPI2C_MCR_MEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_MEN_SHIFT)) & LPI2C_MCR_MEN_MASK) - -#define LPI2C_MCR_RST_MASK (0x2U) -#define LPI2C_MCR_RST_SHIFT (1U) -/*! RST - Software Reset - * 0b0..Master logic is not reset - * 0b1..Master logic is reset - */ -#define LPI2C_MCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RST_SHIFT)) & LPI2C_MCR_RST_MASK) - -#define LPI2C_MCR_DOZEN_MASK (0x4U) -#define LPI2C_MCR_DOZEN_SHIFT (2U) -/*! DOZEN - Doze mode enable - * 0b0..Master is enabled in Doze mode - * 0b1..Master is disabled in Doze mode - */ -#define LPI2C_MCR_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DOZEN_SHIFT)) & LPI2C_MCR_DOZEN_MASK) - -#define LPI2C_MCR_DBGEN_MASK (0x8U) -#define LPI2C_MCR_DBGEN_SHIFT (3U) -/*! DBGEN - Debug Enable - * 0b0..Master is disabled in debug mode - * 0b1..Master is enabled in debug mode - */ -#define LPI2C_MCR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DBGEN_SHIFT)) & LPI2C_MCR_DBGEN_MASK) - -#define LPI2C_MCR_RTF_MASK (0x100U) -#define LPI2C_MCR_RTF_SHIFT (8U) -/*! RTF - Reset Transmit FIFO - * 0b0..No effect - * 0b1..Transmit FIFO is reset - */ -#define LPI2C_MCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RTF_SHIFT)) & LPI2C_MCR_RTF_MASK) - -#define LPI2C_MCR_RRF_MASK (0x200U) -#define LPI2C_MCR_RRF_SHIFT (9U) -/*! RRF - Reset Receive FIFO - * 0b0..No effect - * 0b1..Receive FIFO is reset - */ -#define LPI2C_MCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RRF_SHIFT)) & LPI2C_MCR_RRF_MASK) -/*! @} */ - -/*! @name MSR - Master Status Register */ -/*! @{ */ - -#define LPI2C_MSR_TDF_MASK (0x1U) -#define LPI2C_MSR_TDF_SHIFT (0U) -/*! TDF - Transmit Data Flag - * 0b0..Transmit data is not requested - * 0b1..Transmit data is requested - */ -#define LPI2C_MSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_TDF_SHIFT)) & LPI2C_MSR_TDF_MASK) - -#define LPI2C_MSR_RDF_MASK (0x2U) -#define LPI2C_MSR_RDF_SHIFT (1U) -/*! RDF - Receive Data Flag - * 0b0..Receive Data is not ready - * 0b1..Receive data is ready - */ -#define LPI2C_MSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_RDF_SHIFT)) & LPI2C_MSR_RDF_MASK) - -#define LPI2C_MSR_EPF_MASK (0x100U) -#define LPI2C_MSR_EPF_SHIFT (8U) -/*! EPF - End Packet Flag - * 0b0..Master has not generated a STOP or Repeated START condition - * 0b1..Master has generated a STOP or Repeated START condition - */ -#define LPI2C_MSR_EPF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_EPF_SHIFT)) & LPI2C_MSR_EPF_MASK) - -#define LPI2C_MSR_SDF_MASK (0x200U) -#define LPI2C_MSR_SDF_SHIFT (9U) -/*! SDF - STOP Detect Flag - * 0b0..Master has not generated a STOP condition - * 0b1..Master has generated a STOP condition - */ -#define LPI2C_MSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_SDF_SHIFT)) & LPI2C_MSR_SDF_MASK) - -#define LPI2C_MSR_NDF_MASK (0x400U) -#define LPI2C_MSR_NDF_SHIFT (10U) -/*! NDF - NACK Detect Flag - * 0b0..Unexpected NACK was not detected - * 0b1..Unexpected NACK was detected - */ -#define LPI2C_MSR_NDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_NDF_SHIFT)) & LPI2C_MSR_NDF_MASK) - -#define LPI2C_MSR_ALF_MASK (0x800U) -#define LPI2C_MSR_ALF_SHIFT (11U) -/*! ALF - Arbitration Lost Flag - * 0b0..Master has not lost arbitration - * 0b1..Master has lost arbitration - */ -#define LPI2C_MSR_ALF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_ALF_SHIFT)) & LPI2C_MSR_ALF_MASK) - -#define LPI2C_MSR_FEF_MASK (0x1000U) -#define LPI2C_MSR_FEF_SHIFT (12U) -/*! FEF - FIFO Error Flag - * 0b0..No error - * 0b1..Master sending or receiving data without a START condition - */ -#define LPI2C_MSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_FEF_SHIFT)) & LPI2C_MSR_FEF_MASK) - -#define LPI2C_MSR_PLTF_MASK (0x2000U) -#define LPI2C_MSR_PLTF_SHIFT (13U) -/*! PLTF - Pin Low Timeout Flag - * 0b0..Pin low timeout has not occurred or is disabled - * 0b1..Pin low timeout has occurred - */ -#define LPI2C_MSR_PLTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_PLTF_SHIFT)) & LPI2C_MSR_PLTF_MASK) - -#define LPI2C_MSR_DMF_MASK (0x4000U) -#define LPI2C_MSR_DMF_SHIFT (14U) -/*! DMF - Data Match Flag - * 0b0..Have not received matching data - * 0b1..Have received matching data - */ -#define LPI2C_MSR_DMF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_DMF_SHIFT)) & LPI2C_MSR_DMF_MASK) - -#define LPI2C_MSR_MBF_MASK (0x1000000U) -#define LPI2C_MSR_MBF_SHIFT (24U) -/*! MBF - Master Busy Flag - * 0b0..I2C Master is idle - * 0b1..I2C Master is busy - */ -#define LPI2C_MSR_MBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_MBF_SHIFT)) & LPI2C_MSR_MBF_MASK) - -#define LPI2C_MSR_BBF_MASK (0x2000000U) -#define LPI2C_MSR_BBF_SHIFT (25U) -/*! BBF - Bus Busy Flag - * 0b0..I2C Bus is idle - * 0b1..I2C Bus is busy - */ -#define LPI2C_MSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_BBF_SHIFT)) & LPI2C_MSR_BBF_MASK) -/*! @} */ - -/*! @name MIER - Master Interrupt Enable Register */ -/*! @{ */ - -#define LPI2C_MIER_TDIE_MASK (0x1U) -#define LPI2C_MIER_TDIE_SHIFT (0U) -/*! TDIE - Transmit Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_TDIE_SHIFT)) & LPI2C_MIER_TDIE_MASK) - -#define LPI2C_MIER_RDIE_MASK (0x2U) -#define LPI2C_MIER_RDIE_SHIFT (1U) -/*! RDIE - Receive Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_RDIE_SHIFT)) & LPI2C_MIER_RDIE_MASK) - -#define LPI2C_MIER_EPIE_MASK (0x100U) -#define LPI2C_MIER_EPIE_SHIFT (8U) -/*! EPIE - End Packet Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_EPIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_EPIE_SHIFT)) & LPI2C_MIER_EPIE_MASK) - -#define LPI2C_MIER_SDIE_MASK (0x200U) -#define LPI2C_MIER_SDIE_SHIFT (9U) -/*! SDIE - STOP Detect Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_SDIE_SHIFT)) & LPI2C_MIER_SDIE_MASK) - -#define LPI2C_MIER_NDIE_MASK (0x400U) -#define LPI2C_MIER_NDIE_SHIFT (10U) -/*! NDIE - NACK Detect Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_NDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_NDIE_SHIFT)) & LPI2C_MIER_NDIE_MASK) - -#define LPI2C_MIER_ALIE_MASK (0x800U) -#define LPI2C_MIER_ALIE_SHIFT (11U) -/*! ALIE - Arbitration Lost Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_ALIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_ALIE_SHIFT)) & LPI2C_MIER_ALIE_MASK) - -#define LPI2C_MIER_FEIE_MASK (0x1000U) -#define LPI2C_MIER_FEIE_SHIFT (12U) -/*! FEIE - FIFO Error Interrupt Enable - * 0b0..Enabled - * 0b1..Disabled - */ -#define LPI2C_MIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_FEIE_SHIFT)) & LPI2C_MIER_FEIE_MASK) - -#define LPI2C_MIER_PLTIE_MASK (0x2000U) -#define LPI2C_MIER_PLTIE_SHIFT (13U) -/*! PLTIE - Pin Low Timeout Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_PLTIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_PLTIE_SHIFT)) & LPI2C_MIER_PLTIE_MASK) - -#define LPI2C_MIER_DMIE_MASK (0x4000U) -#define LPI2C_MIER_DMIE_SHIFT (14U) -/*! DMIE - Data Match Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_MIER_DMIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_DMIE_SHIFT)) & LPI2C_MIER_DMIE_MASK) -/*! @} */ - -/*! @name MDER - Master DMA Enable Register */ -/*! @{ */ - -#define LPI2C_MDER_TDDE_MASK (0x1U) -#define LPI2C_MDER_TDDE_SHIFT (0U) -/*! TDDE - Transmit Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPI2C_MDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_TDDE_SHIFT)) & LPI2C_MDER_TDDE_MASK) - -#define LPI2C_MDER_RDDE_MASK (0x2U) -#define LPI2C_MDER_RDDE_SHIFT (1U) -/*! RDDE - Receive Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPI2C_MDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_RDDE_SHIFT)) & LPI2C_MDER_RDDE_MASK) -/*! @} */ - -/*! @name MCFGR0 - Master Configuration Register 0 */ -/*! @{ */ - -#define LPI2C_MCFGR0_HREN_MASK (0x1U) -#define LPI2C_MCFGR0_HREN_SHIFT (0U) -/*! HREN - Host Request Enable - * 0b0..Host request input is disabled - * 0b1..Host request input is enabled - */ -#define LPI2C_MCFGR0_HREN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HREN_SHIFT)) & LPI2C_MCFGR0_HREN_MASK) - -#define LPI2C_MCFGR0_HRPOL_MASK (0x2U) -#define LPI2C_MCFGR0_HRPOL_SHIFT (1U) -/*! HRPOL - Host Request Polarity - * 0b0..Active low - * 0b1..Active high - */ -#define LPI2C_MCFGR0_HRPOL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRPOL_SHIFT)) & LPI2C_MCFGR0_HRPOL_MASK) - -#define LPI2C_MCFGR0_HRSEL_MASK (0x4U) -#define LPI2C_MCFGR0_HRSEL_SHIFT (2U) -/*! HRSEL - Host Request Select - * 0b0..Host request input is pin HREQ - * 0b1..Host request input is input trigger - */ -#define LPI2C_MCFGR0_HRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRSEL_SHIFT)) & LPI2C_MCFGR0_HRSEL_MASK) - -#define LPI2C_MCFGR0_CIRFIFO_MASK (0x100U) -#define LPI2C_MCFGR0_CIRFIFO_SHIFT (8U) -/*! CIRFIFO - Circular FIFO Enable - * 0b0..Circular FIFO is disabled - * 0b1..Circular FIFO is enabled - */ -#define LPI2C_MCFGR0_CIRFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_CIRFIFO_SHIFT)) & LPI2C_MCFGR0_CIRFIFO_MASK) - -#define LPI2C_MCFGR0_RDMO_MASK (0x200U) -#define LPI2C_MCFGR0_RDMO_SHIFT (9U) -/*! RDMO - Receive Data Match Only - * 0b0..Received data is stored in the receive FIFO - * 0b1..Received data is discarded unless the the Data Match Flag (MSR[DMF]) is set - */ -#define LPI2C_MCFGR0_RDMO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_RDMO_SHIFT)) & LPI2C_MCFGR0_RDMO_MASK) -/*! @} */ - -/*! @name MCFGR1 - Master Configuration Register 1 */ -/*! @{ */ - -#define LPI2C_MCFGR1_PRESCALE_MASK (0x7U) -#define LPI2C_MCFGR1_PRESCALE_SHIFT (0U) -/*! PRESCALE - Prescaler - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 4 - * 0b011..Divide by 8 - * 0b100..Divide by 16 - * 0b101..Divide by 32 - * 0b110..Divide by 64 - * 0b111..Divide by 128 - */ -#define LPI2C_MCFGR1_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PRESCALE_SHIFT)) & LPI2C_MCFGR1_PRESCALE_MASK) - -#define LPI2C_MCFGR1_AUTOSTOP_MASK (0x100U) -#define LPI2C_MCFGR1_AUTOSTOP_SHIFT (8U) -/*! AUTOSTOP - Automatic STOP Generation - * 0b0..No effect - * 0b1..STOP condition is automatically generated whenever the transmit FIFO is empty and the LPI2C master is busy - */ -#define LPI2C_MCFGR1_AUTOSTOP(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_AUTOSTOP_SHIFT)) & LPI2C_MCFGR1_AUTOSTOP_MASK) - -#define LPI2C_MCFGR1_IGNACK_MASK (0x200U) -#define LPI2C_MCFGR1_IGNACK_SHIFT (9U) -/*! IGNACK - IGNACK - * 0b0..LPI2C Master will receive ACK and NACK normally - * 0b1..LPI2C Master will treat a received NACK as if it (NACK) was an ACK - */ -#define LPI2C_MCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_IGNACK_SHIFT)) & LPI2C_MCFGR1_IGNACK_MASK) - -#define LPI2C_MCFGR1_TIMECFG_MASK (0x400U) -#define LPI2C_MCFGR1_TIMECFG_SHIFT (10U) -/*! TIMECFG - Timeout Configuration - * 0b0..Pin Low Timeout Flag will set if SCL is low for longer than the configured timeout - * 0b1..Pin Low Timeout Flag will set if either SCL or SDA is low for longer than the configured timeout - */ -#define LPI2C_MCFGR1_TIMECFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_TIMECFG_SHIFT)) & LPI2C_MCFGR1_TIMECFG_MASK) - -#define LPI2C_MCFGR1_MATCFG_MASK (0x70000U) -#define LPI2C_MCFGR1_MATCFG_SHIFT (16U) -/*! MATCFG - Match Configuration - * 0b000..Match is disabled - * 0b001..Reserved - * 0b010..Match is enabled (1st data word equals MATCH0 OR MATCH1) - * 0b011..Match is enabled (any data word equals MATCH0 OR MATCH1) - * 0b100..Match is enabled (1st data word equals MATCH0 AND 2nd data word equals MATCH1) - * 0b101..Match is enabled (any data word equals MATCH0 AND next data word equals MATCH1) - * 0b110..Match is enabled (1st data word AND MATCH1 equals MATCH0 AND MATCH1) - * 0b111..Match is enabled (any data word AND MATCH1 equals MATCH0 AND MATCH1) - */ -#define LPI2C_MCFGR1_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_MATCFG_SHIFT)) & LPI2C_MCFGR1_MATCFG_MASK) - -#define LPI2C_MCFGR1_PINCFG_MASK (0x7000000U) -#define LPI2C_MCFGR1_PINCFG_SHIFT (24U) -/*! PINCFG - Pin Configuration - * 0b000..2-pin open drain mode - * 0b001..2-pin output only mode (ultra-fast mode) - * 0b010..2-pin push-pull mode - * 0b011..4-pin push-pull mode - * 0b100..2-pin open drain mode with separate LPI2C slave - * 0b101..2-pin output only mode (ultra-fast mode) with separate LPI2C slave - * 0b110..2-pin push-pull mode with separate LPI2C slave - * 0b111..4-pin push-pull mode (inverted outputs) - */ -#define LPI2C_MCFGR1_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PINCFG_SHIFT)) & LPI2C_MCFGR1_PINCFG_MASK) -/*! @} */ - -/*! @name MCFGR2 - Master Configuration Register 2 */ -/*! @{ */ - -#define LPI2C_MCFGR2_BUSIDLE_MASK (0xFFFU) -#define LPI2C_MCFGR2_BUSIDLE_SHIFT (0U) -/*! BUSIDLE - Bus Idle Timeout - */ -#define LPI2C_MCFGR2_BUSIDLE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_BUSIDLE_SHIFT)) & LPI2C_MCFGR2_BUSIDLE_MASK) - -#define LPI2C_MCFGR2_FILTSCL_MASK (0xF0000U) -#define LPI2C_MCFGR2_FILTSCL_SHIFT (16U) -/*! FILTSCL - Glitch Filter SCL - */ -#define LPI2C_MCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSCL_SHIFT)) & LPI2C_MCFGR2_FILTSCL_MASK) - -#define LPI2C_MCFGR2_FILTSDA_MASK (0xF000000U) -#define LPI2C_MCFGR2_FILTSDA_SHIFT (24U) -/*! FILTSDA - Glitch Filter SDA - */ -#define LPI2C_MCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSDA_SHIFT)) & LPI2C_MCFGR2_FILTSDA_MASK) -/*! @} */ - -/*! @name MCFGR3 - Master Configuration Register 3 */ -/*! @{ */ - -#define LPI2C_MCFGR3_PINLOW_MASK (0xFFF00U) -#define LPI2C_MCFGR3_PINLOW_SHIFT (8U) -/*! PINLOW - Pin Low Timeout - */ -#define LPI2C_MCFGR3_PINLOW(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR3_PINLOW_SHIFT)) & LPI2C_MCFGR3_PINLOW_MASK) -/*! @} */ - -/*! @name MDMR - Master Data Match Register */ -/*! @{ */ - -#define LPI2C_MDMR_MATCH0_MASK (0xFFU) -#define LPI2C_MDMR_MATCH0_SHIFT (0U) -/*! MATCH0 - Match 0 Value - */ -#define LPI2C_MDMR_MATCH0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH0_SHIFT)) & LPI2C_MDMR_MATCH0_MASK) - -#define LPI2C_MDMR_MATCH1_MASK (0xFF0000U) -#define LPI2C_MDMR_MATCH1_SHIFT (16U) -/*! MATCH1 - Match 1 Value - */ -#define LPI2C_MDMR_MATCH1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH1_SHIFT)) & LPI2C_MDMR_MATCH1_MASK) -/*! @} */ - -/*! @name MCCR0 - Master Clock Configuration Register 0 */ -/*! @{ */ - -#define LPI2C_MCCR0_CLKLO_MASK (0x3FU) -#define LPI2C_MCCR0_CLKLO_SHIFT (0U) -/*! CLKLO - Clock Low Period - */ -#define LPI2C_MCCR0_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKLO_SHIFT)) & LPI2C_MCCR0_CLKLO_MASK) - -#define LPI2C_MCCR0_CLKHI_MASK (0x3F00U) -#define LPI2C_MCCR0_CLKHI_SHIFT (8U) -/*! CLKHI - Clock High Period - */ -#define LPI2C_MCCR0_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKHI_SHIFT)) & LPI2C_MCCR0_CLKHI_MASK) - -#define LPI2C_MCCR0_SETHOLD_MASK (0x3F0000U) -#define LPI2C_MCCR0_SETHOLD_SHIFT (16U) -/*! SETHOLD - Setup Hold Delay - */ -#define LPI2C_MCCR0_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_SETHOLD_SHIFT)) & LPI2C_MCCR0_SETHOLD_MASK) - -#define LPI2C_MCCR0_DATAVD_MASK (0x3F000000U) -#define LPI2C_MCCR0_DATAVD_SHIFT (24U) -/*! DATAVD - Data Valid Delay - */ -#define LPI2C_MCCR0_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_DATAVD_SHIFT)) & LPI2C_MCCR0_DATAVD_MASK) -/*! @} */ - -/*! @name MCCR1 - Master Clock Configuration Register 1 */ -/*! @{ */ - -#define LPI2C_MCCR1_CLKLO_MASK (0x3FU) -#define LPI2C_MCCR1_CLKLO_SHIFT (0U) -/*! CLKLO - Clock Low Period - */ -#define LPI2C_MCCR1_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKLO_SHIFT)) & LPI2C_MCCR1_CLKLO_MASK) - -#define LPI2C_MCCR1_CLKHI_MASK (0x3F00U) -#define LPI2C_MCCR1_CLKHI_SHIFT (8U) -/*! CLKHI - Clock High Period - */ -#define LPI2C_MCCR1_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKHI_SHIFT)) & LPI2C_MCCR1_CLKHI_MASK) - -#define LPI2C_MCCR1_SETHOLD_MASK (0x3F0000U) -#define LPI2C_MCCR1_SETHOLD_SHIFT (16U) -/*! SETHOLD - Setup Hold Delay - */ -#define LPI2C_MCCR1_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_SETHOLD_SHIFT)) & LPI2C_MCCR1_SETHOLD_MASK) - -#define LPI2C_MCCR1_DATAVD_MASK (0x3F000000U) -#define LPI2C_MCCR1_DATAVD_SHIFT (24U) -/*! DATAVD - Data Valid Delay - */ -#define LPI2C_MCCR1_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_DATAVD_SHIFT)) & LPI2C_MCCR1_DATAVD_MASK) -/*! @} */ - -/*! @name MFCR - Master FIFO Control Register */ -/*! @{ */ - -#define LPI2C_MFCR_TXWATER_MASK (0x3U) -#define LPI2C_MFCR_TXWATER_SHIFT (0U) -/*! TXWATER - Transmit FIFO Watermark - */ -#define LPI2C_MFCR_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_TXWATER_SHIFT)) & LPI2C_MFCR_TXWATER_MASK) - -#define LPI2C_MFCR_RXWATER_MASK (0x30000U) -#define LPI2C_MFCR_RXWATER_SHIFT (16U) -/*! RXWATER - Receive FIFO Watermark - */ -#define LPI2C_MFCR_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_RXWATER_SHIFT)) & LPI2C_MFCR_RXWATER_MASK) -/*! @} */ - -/*! @name MFSR - Master FIFO Status Register */ -/*! @{ */ - -#define LPI2C_MFSR_TXCOUNT_MASK (0x7U) -#define LPI2C_MFSR_TXCOUNT_SHIFT (0U) -/*! TXCOUNT - Transmit FIFO Count - */ -#define LPI2C_MFSR_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_TXCOUNT_SHIFT)) & LPI2C_MFSR_TXCOUNT_MASK) - -#define LPI2C_MFSR_RXCOUNT_MASK (0x70000U) -#define LPI2C_MFSR_RXCOUNT_SHIFT (16U) -/*! RXCOUNT - Receive FIFO Count - */ -#define LPI2C_MFSR_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_RXCOUNT_SHIFT)) & LPI2C_MFSR_RXCOUNT_MASK) -/*! @} */ - -/*! @name MTDR - Master Transmit Data Register */ -/*! @{ */ - -#define LPI2C_MTDR_DATA_MASK (0xFFU) -#define LPI2C_MTDR_DATA_SHIFT (0U) -/*! DATA - Transmit Data - */ -#define LPI2C_MTDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_DATA_SHIFT)) & LPI2C_MTDR_DATA_MASK) - -#define LPI2C_MTDR_CMD_MASK (0x700U) -#define LPI2C_MTDR_CMD_SHIFT (8U) -/*! CMD - Command Data - * 0b000..Transmit DATA[7:0] - * 0b001..Receive (DATA[7:0] + 1) bytes - * 0b010..Generate STOP condition - * 0b011..Receive and discard (DATA[7:0] + 1) bytes - * 0b100..Generate (repeated) START and transmit address in DATA[7:0] - * 0b101..Generate (repeated) START and transmit address in DATA[7:0]. This transfer expects a NACK to be returned. - * 0b110..Generate (repeated) START and transmit address in DATA[7:0] using high speed mode - * 0b111..Generate (repeated) START and transmit address in DATA[7:0] using high speed mode. This transfer expects a NACK to be returned. - */ -#define LPI2C_MTDR_CMD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_CMD_SHIFT)) & LPI2C_MTDR_CMD_MASK) -/*! @} */ - -/*! @name MRDR - Master Receive Data Register */ -/*! @{ */ - -#define LPI2C_MRDR_DATA_MASK (0xFFU) -#define LPI2C_MRDR_DATA_SHIFT (0U) -/*! DATA - Receive Data - */ -#define LPI2C_MRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_DATA_SHIFT)) & LPI2C_MRDR_DATA_MASK) - -#define LPI2C_MRDR_RXEMPTY_MASK (0x4000U) -#define LPI2C_MRDR_RXEMPTY_SHIFT (14U) -/*! RXEMPTY - RX Empty - * 0b0..Receive FIFO is not empty - * 0b1..Receive FIFO is empty - */ -#define LPI2C_MRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_RXEMPTY_SHIFT)) & LPI2C_MRDR_RXEMPTY_MASK) -/*! @} */ - -/*! @name SCR - Slave Control Register */ -/*! @{ */ - -#define LPI2C_SCR_SEN_MASK (0x1U) -#define LPI2C_SCR_SEN_SHIFT (0U) -/*! SEN - Slave Enable - * 0b0..I2C Slave mode is disabled - * 0b1..I2C Slave mode is enabled - */ -#define LPI2C_SCR_SEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_SEN_SHIFT)) & LPI2C_SCR_SEN_MASK) - -#define LPI2C_SCR_RST_MASK (0x2U) -#define LPI2C_SCR_RST_SHIFT (1U) -/*! RST - Software Reset - * 0b0..Slave mode logic is not reset - * 0b1..Slave mode logic is reset - */ -#define LPI2C_SCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RST_SHIFT)) & LPI2C_SCR_RST_MASK) - -#define LPI2C_SCR_FILTEN_MASK (0x10U) -#define LPI2C_SCR_FILTEN_SHIFT (4U) -/*! FILTEN - Filter Enable - * 0b0..Disable digital filter and output delay counter for slave mode - * 0b1..Enable digital filter and output delay counter for slave mode - */ -#define LPI2C_SCR_FILTEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTEN_SHIFT)) & LPI2C_SCR_FILTEN_MASK) - -#define LPI2C_SCR_FILTDZ_MASK (0x20U) -#define LPI2C_SCR_FILTDZ_SHIFT (5U) -/*! FILTDZ - Filter Doze Enable - * 0b0..Filter remains enabled in Doze mode - * 0b1..Filter is disabled in Doze mode - */ -#define LPI2C_SCR_FILTDZ(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTDZ_SHIFT)) & LPI2C_SCR_FILTDZ_MASK) - -#define LPI2C_SCR_RTF_MASK (0x100U) -#define LPI2C_SCR_RTF_SHIFT (8U) -/*! RTF - Reset Transmit FIFO - * 0b0..No effect - * 0b1..Transmit Data Register is now empty - */ -#define LPI2C_SCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RTF_SHIFT)) & LPI2C_SCR_RTF_MASK) - -#define LPI2C_SCR_RRF_MASK (0x200U) -#define LPI2C_SCR_RRF_SHIFT (9U) -/*! RRF - Reset Receive FIFO - * 0b0..No effect - * 0b1..Receive Data Register is now empty - */ -#define LPI2C_SCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RRF_SHIFT)) & LPI2C_SCR_RRF_MASK) -/*! @} */ - -/*! @name SSR - Slave Status Register */ -/*! @{ */ - -#define LPI2C_SSR_TDF_MASK (0x1U) -#define LPI2C_SSR_TDF_SHIFT (0U) -/*! TDF - Transmit Data Flag - * 0b0..Transmit data not requested - * 0b1..Transmit data is requested - */ -#define LPI2C_SSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TDF_SHIFT)) & LPI2C_SSR_TDF_MASK) - -#define LPI2C_SSR_RDF_MASK (0x2U) -#define LPI2C_SSR_RDF_SHIFT (1U) -/*! RDF - Receive Data Flag - * 0b0..Receive data is not ready - * 0b1..Receive data is ready - */ -#define LPI2C_SSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RDF_SHIFT)) & LPI2C_SSR_RDF_MASK) - -#define LPI2C_SSR_AVF_MASK (0x4U) -#define LPI2C_SSR_AVF_SHIFT (2U) -/*! AVF - Address Valid Flag - * 0b0..Address Status Register is not valid - * 0b1..Address Status Register is valid - */ -#define LPI2C_SSR_AVF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AVF_SHIFT)) & LPI2C_SSR_AVF_MASK) - -#define LPI2C_SSR_TAF_MASK (0x8U) -#define LPI2C_SSR_TAF_SHIFT (3U) -/*! TAF - Transmit ACK Flag - * 0b0..Transmit ACK/NACK is not required - * 0b1..Transmit ACK/NACK is required - */ -#define LPI2C_SSR_TAF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TAF_SHIFT)) & LPI2C_SSR_TAF_MASK) - -#define LPI2C_SSR_RSF_MASK (0x100U) -#define LPI2C_SSR_RSF_SHIFT (8U) -/*! RSF - Repeated Start Flag - * 0b0..Slave has not detected a Repeated START condition - * 0b1..Slave has detected a Repeated START condition - */ -#define LPI2C_SSR_RSF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RSF_SHIFT)) & LPI2C_SSR_RSF_MASK) - -#define LPI2C_SSR_SDF_MASK (0x200U) -#define LPI2C_SSR_SDF_SHIFT (9U) -/*! SDF - STOP Detect Flag - * 0b0..Slave has not detected a STOP condition - * 0b1..Slave has detected a STOP condition - */ -#define LPI2C_SSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SDF_SHIFT)) & LPI2C_SSR_SDF_MASK) - -#define LPI2C_SSR_BEF_MASK (0x400U) -#define LPI2C_SSR_BEF_SHIFT (10U) -/*! BEF - Bit Error Flag - * 0b0..Slave has not detected a bit error - * 0b1..Slave has detected a bit error - */ -#define LPI2C_SSR_BEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BEF_SHIFT)) & LPI2C_SSR_BEF_MASK) - -#define LPI2C_SSR_FEF_MASK (0x800U) -#define LPI2C_SSR_FEF_SHIFT (11U) -/*! FEF - FIFO Error Flag - * 0b0..FIFO underflow or overflow was not detected - * 0b1..FIFO underflow or overflow was detected - */ -#define LPI2C_SSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_FEF_SHIFT)) & LPI2C_SSR_FEF_MASK) - -#define LPI2C_SSR_AM0F_MASK (0x1000U) -#define LPI2C_SSR_AM0F_SHIFT (12U) -/*! AM0F - Address Match 0 Flag - * 0b0..Have not received an ADDR0 matching address - * 0b1..Have received an ADDR0 matching address - */ -#define LPI2C_SSR_AM0F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM0F_SHIFT)) & LPI2C_SSR_AM0F_MASK) - -#define LPI2C_SSR_AM1F_MASK (0x2000U) -#define LPI2C_SSR_AM1F_SHIFT (13U) -/*! AM1F - Address Match 1 Flag - * 0b0..Have not received an ADDR1 or ADDR0/ADDR1 range matching address - * 0b1..Have received an ADDR1 or ADDR0/ADDR1 range matching address - */ -#define LPI2C_SSR_AM1F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM1F_SHIFT)) & LPI2C_SSR_AM1F_MASK) - -#define LPI2C_SSR_GCF_MASK (0x4000U) -#define LPI2C_SSR_GCF_SHIFT (14U) -/*! GCF - General Call Flag - * 0b0..Slave has not detected the General Call Address or the General Call Address is disabled - * 0b1..Slave has detected the General Call Address - */ -#define LPI2C_SSR_GCF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_GCF_SHIFT)) & LPI2C_SSR_GCF_MASK) - -#define LPI2C_SSR_SARF_MASK (0x8000U) -#define LPI2C_SSR_SARF_SHIFT (15U) -/*! SARF - SMBus Alert Response Flag - * 0b0..SMBus Alert Response is disabled or not detected - * 0b1..SMBus Alert Response is enabled and detected - */ -#define LPI2C_SSR_SARF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SARF_SHIFT)) & LPI2C_SSR_SARF_MASK) - -#define LPI2C_SSR_SBF_MASK (0x1000000U) -#define LPI2C_SSR_SBF_SHIFT (24U) -/*! SBF - Slave Busy Flag - * 0b0..I2C Slave is idle - * 0b1..I2C Slave is busy - */ -#define LPI2C_SSR_SBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SBF_SHIFT)) & LPI2C_SSR_SBF_MASK) - -#define LPI2C_SSR_BBF_MASK (0x2000000U) -#define LPI2C_SSR_BBF_SHIFT (25U) -/*! BBF - Bus Busy Flag - * 0b0..I2C Bus is idle - * 0b1..I2C Bus is busy - */ -#define LPI2C_SSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BBF_SHIFT)) & LPI2C_SSR_BBF_MASK) -/*! @} */ - -/*! @name SIER - Slave Interrupt Enable Register */ -/*! @{ */ - -#define LPI2C_SIER_TDIE_MASK (0x1U) -#define LPI2C_SIER_TDIE_SHIFT (0U) -/*! TDIE - Transmit Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TDIE_SHIFT)) & LPI2C_SIER_TDIE_MASK) - -#define LPI2C_SIER_RDIE_MASK (0x2U) -#define LPI2C_SIER_RDIE_SHIFT (1U) -/*! RDIE - Receive Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RDIE_SHIFT)) & LPI2C_SIER_RDIE_MASK) - -#define LPI2C_SIER_AVIE_MASK (0x4U) -#define LPI2C_SIER_AVIE_SHIFT (2U) -/*! AVIE - Address Valid Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_AVIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AVIE_SHIFT)) & LPI2C_SIER_AVIE_MASK) - -#define LPI2C_SIER_TAIE_MASK (0x8U) -#define LPI2C_SIER_TAIE_SHIFT (3U) -/*! TAIE - Transmit ACK Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_TAIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TAIE_SHIFT)) & LPI2C_SIER_TAIE_MASK) - -#define LPI2C_SIER_RSIE_MASK (0x100U) -#define LPI2C_SIER_RSIE_SHIFT (8U) -/*! RSIE - Repeated Start Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_RSIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RSIE_SHIFT)) & LPI2C_SIER_RSIE_MASK) - -#define LPI2C_SIER_SDIE_MASK (0x200U) -#define LPI2C_SIER_SDIE_SHIFT (9U) -/*! SDIE - STOP Detect Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SDIE_SHIFT)) & LPI2C_SIER_SDIE_MASK) - -#define LPI2C_SIER_BEIE_MASK (0x400U) -#define LPI2C_SIER_BEIE_SHIFT (10U) -/*! BEIE - Bit Error Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_BEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_BEIE_SHIFT)) & LPI2C_SIER_BEIE_MASK) - -#define LPI2C_SIER_FEIE_MASK (0x800U) -#define LPI2C_SIER_FEIE_SHIFT (11U) -/*! FEIE - FIFO Error Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_FEIE_SHIFT)) & LPI2C_SIER_FEIE_MASK) - -#define LPI2C_SIER_AM0IE_MASK (0x1000U) -#define LPI2C_SIER_AM0IE_SHIFT (12U) -/*! AM0IE - Address Match 0 Interrupt Enable - * 0b0..Enabled - * 0b1..Disabled - */ -#define LPI2C_SIER_AM0IE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM0IE_SHIFT)) & LPI2C_SIER_AM0IE_MASK) - -#define LPI2C_SIER_AM1F_MASK (0x2000U) -#define LPI2C_SIER_AM1F_SHIFT (13U) -/*! AM1F - Address Match 1 Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_AM1F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM1F_SHIFT)) & LPI2C_SIER_AM1F_MASK) - -#define LPI2C_SIER_GCIE_MASK (0x4000U) -#define LPI2C_SIER_GCIE_SHIFT (14U) -/*! GCIE - General Call Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_GCIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_GCIE_SHIFT)) & LPI2C_SIER_GCIE_MASK) - -#define LPI2C_SIER_SARIE_MASK (0x8000U) -#define LPI2C_SIER_SARIE_SHIFT (15U) -/*! SARIE - SMBus Alert Response Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPI2C_SIER_SARIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SARIE_SHIFT)) & LPI2C_SIER_SARIE_MASK) -/*! @} */ - -/*! @name SDER - Slave DMA Enable Register */ -/*! @{ */ - -#define LPI2C_SDER_TDDE_MASK (0x1U) -#define LPI2C_SDER_TDDE_SHIFT (0U) -/*! TDDE - Transmit Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPI2C_SDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_TDDE_SHIFT)) & LPI2C_SDER_TDDE_MASK) - -#define LPI2C_SDER_RDDE_MASK (0x2U) -#define LPI2C_SDER_RDDE_SHIFT (1U) -/*! RDDE - Receive Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPI2C_SDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_RDDE_SHIFT)) & LPI2C_SDER_RDDE_MASK) - -#define LPI2C_SDER_AVDE_MASK (0x4U) -#define LPI2C_SDER_AVDE_SHIFT (2U) -/*! AVDE - Address Valid DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPI2C_SDER_AVDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_AVDE_SHIFT)) & LPI2C_SDER_AVDE_MASK) -/*! @} */ - -/*! @name SCFGR1 - Slave Configuration Register 1 */ -/*! @{ */ - -#define LPI2C_SCFGR1_ADRSTALL_MASK (0x1U) -#define LPI2C_SCFGR1_ADRSTALL_SHIFT (0U) -/*! ADRSTALL - Address SCL Stall - * 0b0..Clock stretching is disabled - * 0b1..Clock stretching is enabled - */ -#define LPI2C_SCFGR1_ADRSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADRSTALL_SHIFT)) & LPI2C_SCFGR1_ADRSTALL_MASK) - -#define LPI2C_SCFGR1_RXSTALL_MASK (0x2U) -#define LPI2C_SCFGR1_RXSTALL_SHIFT (1U) -/*! RXSTALL - RX SCL Stall - * 0b0..Clock stretching is disabled - * 0b1..Clock stretching is enabled - */ -#define LPI2C_SCFGR1_RXSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXSTALL_SHIFT)) & LPI2C_SCFGR1_RXSTALL_MASK) - -#define LPI2C_SCFGR1_TXDSTALL_MASK (0x4U) -#define LPI2C_SCFGR1_TXDSTALL_SHIFT (2U) -/*! TXDSTALL - TX Data SCL Stall - * 0b0..Clock stretching is disabled - * 0b1..Clock stretching is enabled - */ -#define LPI2C_SCFGR1_TXDSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXDSTALL_SHIFT)) & LPI2C_SCFGR1_TXDSTALL_MASK) - -#define LPI2C_SCFGR1_ACKSTALL_MASK (0x8U) -#define LPI2C_SCFGR1_ACKSTALL_SHIFT (3U) -/*! ACKSTALL - ACK SCL Stall - * 0b0..Clock stretching is disabled - * 0b1..Clock stretching is enabled - */ -#define LPI2C_SCFGR1_ACKSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ACKSTALL_SHIFT)) & LPI2C_SCFGR1_ACKSTALL_MASK) - -#define LPI2C_SCFGR1_GCEN_MASK (0x100U) -#define LPI2C_SCFGR1_GCEN_SHIFT (8U) -/*! GCEN - General Call Enable - * 0b0..General Call address is disabled - * 0b1..General Call address is enabled - */ -#define LPI2C_SCFGR1_GCEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_GCEN_SHIFT)) & LPI2C_SCFGR1_GCEN_MASK) - -#define LPI2C_SCFGR1_SAEN_MASK (0x200U) -#define LPI2C_SCFGR1_SAEN_SHIFT (9U) -/*! SAEN - SMBus Alert Enable - * 0b0..Disables match on SMBus Alert - * 0b1..Enables match on SMBus Alert - */ -#define LPI2C_SCFGR1_SAEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_SAEN_SHIFT)) & LPI2C_SCFGR1_SAEN_MASK) - -#define LPI2C_SCFGR1_TXCFG_MASK (0x400U) -#define LPI2C_SCFGR1_TXCFG_SHIFT (10U) -/*! TXCFG - Transmit Flag Configuration - * 0b0..Transmit Data Flag will only assert during a slave-transmit transfer when the Transmit Data register is empty - * 0b1..Transmit Data Flag will assert whenever the Transmit Data register is empty - */ -#define LPI2C_SCFGR1_TXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXCFG_SHIFT)) & LPI2C_SCFGR1_TXCFG_MASK) - -#define LPI2C_SCFGR1_RXCFG_MASK (0x800U) -#define LPI2C_SCFGR1_RXCFG_SHIFT (11U) -/*! RXCFG - Receive Data Configuration - * 0b0..Reading the Receive Data register will return received data and clear the Receive Data flag (MSR[RDF]). - * 0b1..Reading the Receive Data register when the Address Valid flag (SSR[AVF])is set, will return the Address - * Status register and clear the Address Valid flag. Reading the Receive Data register when the Address Valid - * flag is clear, will return received data and clear the Receive Data flag (MSR[RDF]). - */ -#define LPI2C_SCFGR1_RXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXCFG_SHIFT)) & LPI2C_SCFGR1_RXCFG_MASK) - -#define LPI2C_SCFGR1_IGNACK_MASK (0x1000U) -#define LPI2C_SCFGR1_IGNACK_SHIFT (12U) -/*! IGNACK - Ignore NACK - * 0b0..Slave will end transfer when NACK is detected - * 0b1..Slave will not end transfer when NACK detected - */ -#define LPI2C_SCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_IGNACK_SHIFT)) & LPI2C_SCFGR1_IGNACK_MASK) - -#define LPI2C_SCFGR1_HSMEN_MASK (0x2000U) -#define LPI2C_SCFGR1_HSMEN_SHIFT (13U) -/*! HSMEN - High Speed Mode Enable - * 0b0..Disables detection of HS-mode master code - * 0b1..Enables detection of HS-mode master code - */ -#define LPI2C_SCFGR1_HSMEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_HSMEN_SHIFT)) & LPI2C_SCFGR1_HSMEN_MASK) - -#define LPI2C_SCFGR1_ADDRCFG_MASK (0x70000U) -#define LPI2C_SCFGR1_ADDRCFG_SHIFT (16U) -/*! ADDRCFG - Address Configuration - * 0b000..Address match 0 (7-bit) - * 0b001..Address match 0 (10-bit) - * 0b010..Address match 0 (7-bit) or Address match 1 (7-bit) - * 0b011..Address match 0 (10-bit) or Address match 1 (10-bit) - * 0b100..Address match 0 (7-bit) or Address match 1 (10-bit) - * 0b101..Address match 0 (10-bit) or Address match 1 (7-bit) - * 0b110..From Address match 0 (7-bit) to Address match 1 (7-bit) - * 0b111..From Address match 0 (10-bit) to Address match 1 (10-bit) - */ -#define LPI2C_SCFGR1_ADDRCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADDRCFG_SHIFT)) & LPI2C_SCFGR1_ADDRCFG_MASK) -/*! @} */ - -/*! @name SCFGR2 - Slave Configuration Register 2 */ -/*! @{ */ - -#define LPI2C_SCFGR2_CLKHOLD_MASK (0xFU) -#define LPI2C_SCFGR2_CLKHOLD_SHIFT (0U) -/*! CLKHOLD - Clock Hold Time - */ -#define LPI2C_SCFGR2_CLKHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_CLKHOLD_SHIFT)) & LPI2C_SCFGR2_CLKHOLD_MASK) - -#define LPI2C_SCFGR2_DATAVD_MASK (0x3F00U) -#define LPI2C_SCFGR2_DATAVD_SHIFT (8U) -/*! DATAVD - Data Valid Delay - */ -#define LPI2C_SCFGR2_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_DATAVD_SHIFT)) & LPI2C_SCFGR2_DATAVD_MASK) - -#define LPI2C_SCFGR2_FILTSCL_MASK (0xF0000U) -#define LPI2C_SCFGR2_FILTSCL_SHIFT (16U) -/*! FILTSCL - Glitch Filter SCL - */ -#define LPI2C_SCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSCL_SHIFT)) & LPI2C_SCFGR2_FILTSCL_MASK) - -#define LPI2C_SCFGR2_FILTSDA_MASK (0xF000000U) -#define LPI2C_SCFGR2_FILTSDA_SHIFT (24U) -/*! FILTSDA - Glitch Filter SDA - */ -#define LPI2C_SCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSDA_SHIFT)) & LPI2C_SCFGR2_FILTSDA_MASK) -/*! @} */ - -/*! @name SAMR - Slave Address Match Register */ -/*! @{ */ - -#define LPI2C_SAMR_ADDR0_MASK (0x7FEU) -#define LPI2C_SAMR_ADDR0_SHIFT (1U) -/*! ADDR0 - Address 0 Value - */ -#define LPI2C_SAMR_ADDR0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR0_SHIFT)) & LPI2C_SAMR_ADDR0_MASK) - -#define LPI2C_SAMR_ADDR1_MASK (0x7FE0000U) -#define LPI2C_SAMR_ADDR1_SHIFT (17U) -/*! ADDR1 - Address 1 Value - */ -#define LPI2C_SAMR_ADDR1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR1_SHIFT)) & LPI2C_SAMR_ADDR1_MASK) -/*! @} */ - -/*! @name SASR - Slave Address Status Register */ -/*! @{ */ - -#define LPI2C_SASR_RADDR_MASK (0x7FFU) -#define LPI2C_SASR_RADDR_SHIFT (0U) -/*! RADDR - Received Address - */ -#define LPI2C_SASR_RADDR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_RADDR_SHIFT)) & LPI2C_SASR_RADDR_MASK) - -#define LPI2C_SASR_ANV_MASK (0x4000U) -#define LPI2C_SASR_ANV_SHIFT (14U) -/*! ANV - Address Not Valid - * 0b0..Received Address (RADDR) is valid - * 0b1..Received Address (RADDR) is not valid - */ -#define LPI2C_SASR_ANV(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_ANV_SHIFT)) & LPI2C_SASR_ANV_MASK) -/*! @} */ - -/*! @name STAR - Slave Transmit ACK Register */ -/*! @{ */ - -#define LPI2C_STAR_TXNACK_MASK (0x1U) -#define LPI2C_STAR_TXNACK_SHIFT (0U) -/*! TXNACK - Transmit NACK - * 0b0..Write a Transmit ACK for each received word - * 0b1..Write a Transmit NACK for each received word - */ -#define LPI2C_STAR_TXNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STAR_TXNACK_SHIFT)) & LPI2C_STAR_TXNACK_MASK) -/*! @} */ - -/*! @name STDR - Slave Transmit Data Register */ -/*! @{ */ - -#define LPI2C_STDR_DATA_MASK (0xFFU) -#define LPI2C_STDR_DATA_SHIFT (0U) -/*! DATA - Transmit Data - */ -#define LPI2C_STDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STDR_DATA_SHIFT)) & LPI2C_STDR_DATA_MASK) -/*! @} */ - -/*! @name SRDR - Slave Receive Data Register */ -/*! @{ */ - -#define LPI2C_SRDR_DATA_MASK (0xFFU) -#define LPI2C_SRDR_DATA_SHIFT (0U) -/*! DATA - Receive Data - */ -#define LPI2C_SRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_DATA_SHIFT)) & LPI2C_SRDR_DATA_MASK) - -#define LPI2C_SRDR_RXEMPTY_MASK (0x4000U) -#define LPI2C_SRDR_RXEMPTY_SHIFT (14U) -/*! RXEMPTY - RX Empty - * 0b0..The Receive Data Register is not empty - * 0b1..The Receive Data Register is empty - */ -#define LPI2C_SRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_RXEMPTY_SHIFT)) & LPI2C_SRDR_RXEMPTY_MASK) - -#define LPI2C_SRDR_SOF_MASK (0x8000U) -#define LPI2C_SRDR_SOF_SHIFT (15U) -/*! SOF - Start Of Frame - * 0b0..Indicates this is not the first data word since a (repeated) START or STOP condition - * 0b1..Indicates this is the first data word since a (repeated) START or STOP condition - */ -#define LPI2C_SRDR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_SOF_SHIFT)) & LPI2C_SRDR_SOF_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group LPI2C_Register_Masks */ - - -/* LPI2C - Peripheral instance base addresses */ -/** Peripheral LPI2C1 base address */ -#define LPI2C1_BASE (0x403F0000u) -/** Peripheral LPI2C1 base pointer */ -#define LPI2C1 ((LPI2C_Type *)LPI2C1_BASE) -/** Peripheral LPI2C2 base address */ -#define LPI2C2_BASE (0x403F4000u) -/** Peripheral LPI2C2 base pointer */ -#define LPI2C2 ((LPI2C_Type *)LPI2C2_BASE) -/** Peripheral LPI2C3 base address */ -#define LPI2C3_BASE (0x403F8000u) -/** Peripheral LPI2C3 base pointer */ -#define LPI2C3 ((LPI2C_Type *)LPI2C3_BASE) -/** Peripheral LPI2C4 base address */ -#define LPI2C4_BASE (0x403FC000u) -/** Peripheral LPI2C4 base pointer */ -#define LPI2C4 ((LPI2C_Type *)LPI2C4_BASE) -/** Array initializer of LPI2C peripheral base addresses */ -#define LPI2C_BASE_ADDRS { 0u, LPI2C1_BASE, LPI2C2_BASE, LPI2C3_BASE, LPI2C4_BASE } -/** Array initializer of LPI2C peripheral base pointers */ -#define LPI2C_BASE_PTRS { (LPI2C_Type *)0u, LPI2C1, LPI2C2, LPI2C3, LPI2C4 } -/** Interrupt vectors for the LPI2C peripheral type */ -#define LPI2C_IRQS { NotAvail_IRQn, LPI2C1_IRQn, LPI2C2_IRQn, LPI2C3_IRQn, LPI2C4_IRQn } - -/*! - * @} - */ /* end of group LPI2C_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- LPSPI Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPSPI_Peripheral_Access_Layer LPSPI Peripheral Access Layer - * @{ - */ - -/** LPSPI - Register Layout Typedef */ -typedef struct { - __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ - __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ - uint8_t RESERVED_0[8]; - __IO uint32_t CR; /**< Control Register, offset: 0x10 */ - __IO uint32_t SR; /**< Status Register, offset: 0x14 */ - __IO uint32_t IER; /**< Interrupt Enable Register, offset: 0x18 */ - __IO uint32_t DER; /**< DMA Enable Register, offset: 0x1C */ - __IO uint32_t CFGR0; /**< Configuration Register 0, offset: 0x20 */ - __IO uint32_t CFGR1; /**< Configuration Register 1, offset: 0x24 */ - uint8_t RESERVED_1[8]; - __IO uint32_t DMR0; /**< Data Match Register 0, offset: 0x30 */ - __IO uint32_t DMR1; /**< Data Match Register 1, offset: 0x34 */ - uint8_t RESERVED_2[8]; - __IO uint32_t CCR; /**< Clock Configuration Register, offset: 0x40 */ - uint8_t RESERVED_3[20]; - __IO uint32_t FCR; /**< FIFO Control Register, offset: 0x58 */ - __I uint32_t FSR; /**< FIFO Status Register, offset: 0x5C */ - __IO uint32_t TCR; /**< Transmit Command Register, offset: 0x60 */ - __O uint32_t TDR; /**< Transmit Data Register, offset: 0x64 */ - uint8_t RESERVED_4[8]; - __I uint32_t RSR; /**< Receive Status Register, offset: 0x70 */ - __I uint32_t RDR; /**< Receive Data Register, offset: 0x74 */ -} LPSPI_Type; - -/* ---------------------------------------------------------------------------- - -- LPSPI Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPSPI_Register_Masks LPSPI Register Masks - * @{ - */ - -/*! @name VERID - Version ID Register */ -/*! @{ */ - -#define LPSPI_VERID_FEATURE_MASK (0xFFFFU) -#define LPSPI_VERID_FEATURE_SHIFT (0U) -/*! FEATURE - Module Identification Number - * 0b0000000000000100..Standard feature set supporting a 32-bit shift register. - */ -#define LPSPI_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_FEATURE_SHIFT)) & LPSPI_VERID_FEATURE_MASK) - -#define LPSPI_VERID_MINOR_MASK (0xFF0000U) -#define LPSPI_VERID_MINOR_SHIFT (16U) -/*! MINOR - Minor Version Number - */ -#define LPSPI_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_MINOR_SHIFT)) & LPSPI_VERID_MINOR_MASK) - -#define LPSPI_VERID_MAJOR_MASK (0xFF000000U) -#define LPSPI_VERID_MAJOR_SHIFT (24U) -/*! MAJOR - Major Version Number - */ -#define LPSPI_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_MAJOR_SHIFT)) & LPSPI_VERID_MAJOR_MASK) -/*! @} */ - -/*! @name PARAM - Parameter Register */ -/*! @{ */ - -#define LPSPI_PARAM_TXFIFO_MASK (0xFFU) -#define LPSPI_PARAM_TXFIFO_SHIFT (0U) -/*! TXFIFO - Transmit FIFO Size - */ -#define LPSPI_PARAM_TXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_TXFIFO_SHIFT)) & LPSPI_PARAM_TXFIFO_MASK) - -#define LPSPI_PARAM_RXFIFO_MASK (0xFF00U) -#define LPSPI_PARAM_RXFIFO_SHIFT (8U) -/*! RXFIFO - Receive FIFO Size - */ -#define LPSPI_PARAM_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_RXFIFO_SHIFT)) & LPSPI_PARAM_RXFIFO_MASK) - -#define LPSPI_PARAM_PCSNUM_MASK (0xFF0000U) -#define LPSPI_PARAM_PCSNUM_SHIFT (16U) -/*! PCSNUM - PCS Number - */ -#define LPSPI_PARAM_PCSNUM(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_PCSNUM_SHIFT)) & LPSPI_PARAM_PCSNUM_MASK) -/*! @} */ - -/*! @name CR - Control Register */ -/*! @{ */ - -#define LPSPI_CR_MEN_MASK (0x1U) -#define LPSPI_CR_MEN_SHIFT (0U) -/*! MEN - Module Enable - * 0b0..Module is disabled - * 0b1..Module is enabled - */ -#define LPSPI_CR_MEN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_MEN_SHIFT)) & LPSPI_CR_MEN_MASK) - -#define LPSPI_CR_RST_MASK (0x2U) -#define LPSPI_CR_RST_SHIFT (1U) -/*! RST - Software Reset - * 0b0..Module is not reset - * 0b1..Module is reset - */ -#define LPSPI_CR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RST_SHIFT)) & LPSPI_CR_RST_MASK) - -#define LPSPI_CR_DOZEN_MASK (0x4U) -#define LPSPI_CR_DOZEN_SHIFT (2U) -/*! DOZEN - Doze mode enable - * 0b0..Module is enabled in Doze mode - * 0b1..Module is disabled in Doze mode - */ -#define LPSPI_CR_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_DOZEN_SHIFT)) & LPSPI_CR_DOZEN_MASK) - -#define LPSPI_CR_DBGEN_MASK (0x8U) -#define LPSPI_CR_DBGEN_SHIFT (3U) -/*! DBGEN - Debug Enable - * 0b0..Module is disabled in debug mode - * 0b1..Module is enabled in debug mode - */ -#define LPSPI_CR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_DBGEN_SHIFT)) & LPSPI_CR_DBGEN_MASK) - -#define LPSPI_CR_RTF_MASK (0x100U) -#define LPSPI_CR_RTF_SHIFT (8U) -/*! RTF - Reset Transmit FIFO - * 0b0..No effect - * 0b1..Transmit FIFO is reset - */ -#define LPSPI_CR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RTF_SHIFT)) & LPSPI_CR_RTF_MASK) - -#define LPSPI_CR_RRF_MASK (0x200U) -#define LPSPI_CR_RRF_SHIFT (9U) -/*! RRF - Reset Receive FIFO - * 0b0..No effect - * 0b1..Receive FIFO is reset - */ -#define LPSPI_CR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RRF_SHIFT)) & LPSPI_CR_RRF_MASK) -/*! @} */ - -/*! @name SR - Status Register */ -/*! @{ */ - -#define LPSPI_SR_TDF_MASK (0x1U) -#define LPSPI_SR_TDF_SHIFT (0U) -/*! TDF - Transmit Data Flag - * 0b0..Transmit data not requested - * 0b1..Transmit data is requested - */ -#define LPSPI_SR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TDF_SHIFT)) & LPSPI_SR_TDF_MASK) - -#define LPSPI_SR_RDF_MASK (0x2U) -#define LPSPI_SR_RDF_SHIFT (1U) -/*! RDF - Receive Data Flag - * 0b0..Receive Data is not ready - * 0b1..Receive data is ready - */ -#define LPSPI_SR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_RDF_SHIFT)) & LPSPI_SR_RDF_MASK) - -#define LPSPI_SR_WCF_MASK (0x100U) -#define LPSPI_SR_WCF_SHIFT (8U) -/*! WCF - Word Complete Flag - * 0b0..Transfer of a received word has not yet completed - * 0b1..Transfer of a received word has completed - */ -#define LPSPI_SR_WCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_WCF_SHIFT)) & LPSPI_SR_WCF_MASK) - -#define LPSPI_SR_FCF_MASK (0x200U) -#define LPSPI_SR_FCF_SHIFT (9U) -/*! FCF - Frame Complete Flag - * 0b0..Frame transfer has not completed - * 0b1..Frame transfer has completed - */ -#define LPSPI_SR_FCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_FCF_SHIFT)) & LPSPI_SR_FCF_MASK) - -#define LPSPI_SR_TCF_MASK (0x400U) -#define LPSPI_SR_TCF_SHIFT (10U) -/*! TCF - Transfer Complete Flag - * 0b0..All transfers have not completed - * 0b1..All transfers have completed - */ -#define LPSPI_SR_TCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TCF_SHIFT)) & LPSPI_SR_TCF_MASK) - -#define LPSPI_SR_TEF_MASK (0x800U) -#define LPSPI_SR_TEF_SHIFT (11U) -/*! TEF - Transmit Error Flag - * 0b0..Transmit FIFO underrun has not occurred - * 0b1..Transmit FIFO underrun has occurred - */ -#define LPSPI_SR_TEF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TEF_SHIFT)) & LPSPI_SR_TEF_MASK) - -#define LPSPI_SR_REF_MASK (0x1000U) -#define LPSPI_SR_REF_SHIFT (12U) -/*! REF - Receive Error Flag - * 0b0..Receive FIFO has not overflowed - * 0b1..Receive FIFO has overflowed - */ -#define LPSPI_SR_REF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_REF_SHIFT)) & LPSPI_SR_REF_MASK) - -#define LPSPI_SR_DMF_MASK (0x2000U) -#define LPSPI_SR_DMF_SHIFT (13U) -/*! DMF - Data Match Flag - * 0b0..Have not received matching data - * 0b1..Have received matching data - */ -#define LPSPI_SR_DMF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_DMF_SHIFT)) & LPSPI_SR_DMF_MASK) - -#define LPSPI_SR_MBF_MASK (0x1000000U) -#define LPSPI_SR_MBF_SHIFT (24U) -/*! MBF - Module Busy Flag - * 0b0..LPSPI is idle - * 0b1..LPSPI is busy - */ -#define LPSPI_SR_MBF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_MBF_SHIFT)) & LPSPI_SR_MBF_MASK) -/*! @} */ - -/*! @name IER - Interrupt Enable Register */ -/*! @{ */ - -#define LPSPI_IER_TDIE_MASK (0x1U) -#define LPSPI_IER_TDIE_SHIFT (0U) -/*! TDIE - Transmit Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TDIE_SHIFT)) & LPSPI_IER_TDIE_MASK) - -#define LPSPI_IER_RDIE_MASK (0x2U) -#define LPSPI_IER_RDIE_SHIFT (1U) -/*! RDIE - Receive Data Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_RDIE_SHIFT)) & LPSPI_IER_RDIE_MASK) - -#define LPSPI_IER_WCIE_MASK (0x100U) -#define LPSPI_IER_WCIE_SHIFT (8U) -/*! WCIE - Word Complete Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_WCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_WCIE_SHIFT)) & LPSPI_IER_WCIE_MASK) - -#define LPSPI_IER_FCIE_MASK (0x200U) -#define LPSPI_IER_FCIE_SHIFT (9U) -/*! FCIE - Frame Complete Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_FCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_FCIE_SHIFT)) & LPSPI_IER_FCIE_MASK) - -#define LPSPI_IER_TCIE_MASK (0x400U) -#define LPSPI_IER_TCIE_SHIFT (10U) -/*! TCIE - Transfer Complete Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_TCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TCIE_SHIFT)) & LPSPI_IER_TCIE_MASK) - -#define LPSPI_IER_TEIE_MASK (0x800U) -#define LPSPI_IER_TEIE_SHIFT (11U) -/*! TEIE - Transmit Error Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_TEIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TEIE_SHIFT)) & LPSPI_IER_TEIE_MASK) - -#define LPSPI_IER_REIE_MASK (0x1000U) -#define LPSPI_IER_REIE_SHIFT (12U) -/*! REIE - Receive Error Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_REIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_REIE_SHIFT)) & LPSPI_IER_REIE_MASK) - -#define LPSPI_IER_DMIE_MASK (0x2000U) -#define LPSPI_IER_DMIE_SHIFT (13U) -/*! DMIE - Data Match Interrupt Enable - * 0b0..Disabled - * 0b1..Enabled - */ -#define LPSPI_IER_DMIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_DMIE_SHIFT)) & LPSPI_IER_DMIE_MASK) -/*! @} */ - -/*! @name DER - DMA Enable Register */ -/*! @{ */ - -#define LPSPI_DER_TDDE_MASK (0x1U) -#define LPSPI_DER_TDDE_SHIFT (0U) -/*! TDDE - Transmit Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPSPI_DER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DER_TDDE_SHIFT)) & LPSPI_DER_TDDE_MASK) - -#define LPSPI_DER_RDDE_MASK (0x2U) -#define LPSPI_DER_RDDE_SHIFT (1U) -/*! RDDE - Receive Data DMA Enable - * 0b0..DMA request is disabled - * 0b1..DMA request is enabled - */ -#define LPSPI_DER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DER_RDDE_SHIFT)) & LPSPI_DER_RDDE_MASK) -/*! @} */ - -/*! @name CFGR0 - Configuration Register 0 */ -/*! @{ */ - -#define LPSPI_CFGR0_HREN_MASK (0x1U) -#define LPSPI_CFGR0_HREN_SHIFT (0U) -/*! HREN - Host Request Enable - * 0b0..Host request is disabled - * 0b1..Host request is enabled - */ -#define LPSPI_CFGR0_HREN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HREN_SHIFT)) & LPSPI_CFGR0_HREN_MASK) - -#define LPSPI_CFGR0_HRPOL_MASK (0x2U) -#define LPSPI_CFGR0_HRPOL_SHIFT (1U) -/*! HRPOL - Host Request Polarity - * 0b0..Active low - * 0b1..Active high - */ -#define LPSPI_CFGR0_HRPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HRPOL_SHIFT)) & LPSPI_CFGR0_HRPOL_MASK) - -#define LPSPI_CFGR0_HRSEL_MASK (0x4U) -#define LPSPI_CFGR0_HRSEL_SHIFT (2U) -/*! HRSEL - Host Request Select - * 0b0..Host request input is the LPSPI_HREQ pin - * 0b1..Host request input is the input trigger - */ -#define LPSPI_CFGR0_HRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HRSEL_SHIFT)) & LPSPI_CFGR0_HRSEL_MASK) - -#define LPSPI_CFGR0_CIRFIFO_MASK (0x100U) -#define LPSPI_CFGR0_CIRFIFO_SHIFT (8U) -/*! CIRFIFO - Circular FIFO Enable - * 0b0..Circular FIFO is disabled - * 0b1..Circular FIFO is enabled - */ -#define LPSPI_CFGR0_CIRFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_CIRFIFO_SHIFT)) & LPSPI_CFGR0_CIRFIFO_MASK) - -#define LPSPI_CFGR0_RDMO_MASK (0x200U) -#define LPSPI_CFGR0_RDMO_SHIFT (9U) -/*! RDMO - Receive Data Match Only - * 0b0..Received data is stored in the receive FIFO as in normal operations - * 0b1..Received data is discarded unless the Data Match Flag (DMF) is set - */ -#define LPSPI_CFGR0_RDMO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_RDMO_SHIFT)) & LPSPI_CFGR0_RDMO_MASK) -/*! @} */ - -/*! @name CFGR1 - Configuration Register 1 */ -/*! @{ */ - -#define LPSPI_CFGR1_MASTER_MASK (0x1U) -#define LPSPI_CFGR1_MASTER_SHIFT (0U) -/*! MASTER - Master Mode - * 0b0..Slave mode - * 0b1..Master mode - */ -#define LPSPI_CFGR1_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_MASTER_SHIFT)) & LPSPI_CFGR1_MASTER_MASK) - -#define LPSPI_CFGR1_SAMPLE_MASK (0x2U) -#define LPSPI_CFGR1_SAMPLE_SHIFT (1U) -/*! SAMPLE - Sample Point - * 0b0..Input data is sampled on SCK edge - * 0b1..Input data is sampled on delayed SCK edge - */ -#define LPSPI_CFGR1_SAMPLE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_SAMPLE_SHIFT)) & LPSPI_CFGR1_SAMPLE_MASK) - -#define LPSPI_CFGR1_AUTOPCS_MASK (0x4U) -#define LPSPI_CFGR1_AUTOPCS_SHIFT (2U) -/*! AUTOPCS - Automatic PCS - * 0b0..Automatic PCS generation is disabled - * 0b1..Automatic PCS generation is enabled - */ -#define LPSPI_CFGR1_AUTOPCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_AUTOPCS_SHIFT)) & LPSPI_CFGR1_AUTOPCS_MASK) - -#define LPSPI_CFGR1_NOSTALL_MASK (0x8U) -#define LPSPI_CFGR1_NOSTALL_SHIFT (3U) -/*! NOSTALL - No Stall - * 0b0..Transfers will stall when the transmit FIFO is empty or the receive FIFO is full - * 0b1..Transfers will not stall, allowing transmit FIFO underruns or receive FIFO overruns to occur - */ -#define LPSPI_CFGR1_NOSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_NOSTALL_SHIFT)) & LPSPI_CFGR1_NOSTALL_MASK) - -#define LPSPI_CFGR1_PCSPOL_MASK (0xF00U) -#define LPSPI_CFGR1_PCSPOL_SHIFT (8U) -/*! PCSPOL - Peripheral Chip Select Polarity - * 0b0000..The Peripheral Chip Select pin PCSx is active low - * 0b0001..The Peripheral Chip Select pin PCSx is active high - */ -#define LPSPI_CFGR1_PCSPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PCSPOL_SHIFT)) & LPSPI_CFGR1_PCSPOL_MASK) - -#define LPSPI_CFGR1_MATCFG_MASK (0x70000U) -#define LPSPI_CFGR1_MATCFG_SHIFT (16U) -/*! MATCFG - Match Configuration - * 0b000..Match is disabled - * 0b001..Reserved - * 0b010..010b - Match is enabled, if 1st data word equals MATCH0 OR MATCH1, i.e., (1st data word = MATCH0 + MATCH1) - * 0b011..011b - Match is enabled, if any data word equals MATCH0 OR MATCH1, i.e., (any data word = MATCH0 + MATCH1) - * 0b100..100b - Match is enabled, if 1st data word equals MATCH0 AND 2nd data word equals MATCH1, i.e., [(1st - * data word = MATCH0) * (2nd data word = MATCH1)] - * 0b101..101b - Match is enabled, if any data word equals MATCH0 AND the next data word equals MATCH1, i.e., - * [(any data word = MATCH0) * (next data word = MATCH1)] - * 0b110..110b - Match is enabled, if (1st data word AND MATCH1) equals (MATCH0 AND MATCH1), i.e., [(1st data word * MATCH1) = (MATCH0 * MATCH1)] - * 0b111..111b - Match is enabled, if (any data word AND MATCH1) equals (MATCH0 AND MATCH1), i.e., [(any data word * MATCH1) = (MATCH0 * MATCH1)] - */ -#define LPSPI_CFGR1_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_MATCFG_SHIFT)) & LPSPI_CFGR1_MATCFG_MASK) - -#define LPSPI_CFGR1_PINCFG_MASK (0x3000000U) -#define LPSPI_CFGR1_PINCFG_SHIFT (24U) -/*! PINCFG - Pin Configuration - * 0b00..SIN is used for input data and SOUT is used for output data - * 0b01..SIN is used for both input and output data - * 0b10..SOUT is used for both input and output data - * 0b11..SOUT is used for input data and SIN is used for output data - */ -#define LPSPI_CFGR1_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PINCFG_SHIFT)) & LPSPI_CFGR1_PINCFG_MASK) - -#define LPSPI_CFGR1_OUTCFG_MASK (0x4000000U) -#define LPSPI_CFGR1_OUTCFG_SHIFT (26U) -/*! OUTCFG - Output Config - * 0b0..Output data retains last value when chip select is negated - * 0b1..Output data is tristated when chip select is negated - */ -#define LPSPI_CFGR1_OUTCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_OUTCFG_SHIFT)) & LPSPI_CFGR1_OUTCFG_MASK) - -#define LPSPI_CFGR1_PCSCFG_MASK (0x8000000U) -#define LPSPI_CFGR1_PCSCFG_SHIFT (27U) -/*! PCSCFG - Peripheral Chip Select Configuration - * 0b0..PCS[3:2] are enabled - * 0b1..PCS[3:2] are disabled - */ -#define LPSPI_CFGR1_PCSCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PCSCFG_SHIFT)) & LPSPI_CFGR1_PCSCFG_MASK) -/*! @} */ - -/*! @name DMR0 - Data Match Register 0 */ -/*! @{ */ - -#define LPSPI_DMR0_MATCH0_MASK (0xFFFFFFFFU) -#define LPSPI_DMR0_MATCH0_SHIFT (0U) -/*! MATCH0 - Match 0 Value - */ -#define LPSPI_DMR0_MATCH0(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DMR0_MATCH0_SHIFT)) & LPSPI_DMR0_MATCH0_MASK) -/*! @} */ - -/*! @name DMR1 - Data Match Register 1 */ -/*! @{ */ - -#define LPSPI_DMR1_MATCH1_MASK (0xFFFFFFFFU) -#define LPSPI_DMR1_MATCH1_SHIFT (0U) -/*! MATCH1 - Match 1 Value - */ -#define LPSPI_DMR1_MATCH1(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DMR1_MATCH1_SHIFT)) & LPSPI_DMR1_MATCH1_MASK) -/*! @} */ - -/*! @name CCR - Clock Configuration Register */ -/*! @{ */ - -#define LPSPI_CCR_SCKDIV_MASK (0xFFU) -#define LPSPI_CCR_SCKDIV_SHIFT (0U) -/*! SCKDIV - SCK Divider - */ -#define LPSPI_CCR_SCKDIV(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_SCKDIV_SHIFT)) & LPSPI_CCR_SCKDIV_MASK) - -#define LPSPI_CCR_DBT_MASK (0xFF00U) -#define LPSPI_CCR_DBT_SHIFT (8U) -/*! DBT - Delay Between Transfers - */ -#define LPSPI_CCR_DBT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_DBT_SHIFT)) & LPSPI_CCR_DBT_MASK) - -#define LPSPI_CCR_PCSSCK_MASK (0xFF0000U) -#define LPSPI_CCR_PCSSCK_SHIFT (16U) -/*! PCSSCK - PCS-to-SCK Delay - */ -#define LPSPI_CCR_PCSSCK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_PCSSCK_SHIFT)) & LPSPI_CCR_PCSSCK_MASK) - -#define LPSPI_CCR_SCKPCS_MASK (0xFF000000U) -#define LPSPI_CCR_SCKPCS_SHIFT (24U) -/*! SCKPCS - SCK-to-PCS Delay - */ -#define LPSPI_CCR_SCKPCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_SCKPCS_SHIFT)) & LPSPI_CCR_SCKPCS_MASK) -/*! @} */ - -/*! @name FCR - FIFO Control Register */ -/*! @{ */ - -#define LPSPI_FCR_TXWATER_MASK (0xFU) -#define LPSPI_FCR_TXWATER_SHIFT (0U) -/*! TXWATER - Transmit FIFO Watermark - */ -#define LPSPI_FCR_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FCR_TXWATER_SHIFT)) & LPSPI_FCR_TXWATER_MASK) - -#define LPSPI_FCR_RXWATER_MASK (0xF0000U) -#define LPSPI_FCR_RXWATER_SHIFT (16U) -/*! RXWATER - Receive FIFO Watermark - */ -#define LPSPI_FCR_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FCR_RXWATER_SHIFT)) & LPSPI_FCR_RXWATER_MASK) -/*! @} */ - -/*! @name FSR - FIFO Status Register */ -/*! @{ */ - -#define LPSPI_FSR_TXCOUNT_MASK (0x1FU) -#define LPSPI_FSR_TXCOUNT_SHIFT (0U) -/*! TXCOUNT - Transmit FIFO Count - */ -#define LPSPI_FSR_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FSR_TXCOUNT_SHIFT)) & LPSPI_FSR_TXCOUNT_MASK) - -#define LPSPI_FSR_RXCOUNT_MASK (0x1F0000U) -#define LPSPI_FSR_RXCOUNT_SHIFT (16U) -/*! RXCOUNT - Receive FIFO Count - */ -#define LPSPI_FSR_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FSR_RXCOUNT_SHIFT)) & LPSPI_FSR_RXCOUNT_MASK) -/*! @} */ - -/*! @name TCR - Transmit Command Register */ -/*! @{ */ - -#define LPSPI_TCR_FRAMESZ_MASK (0xFFFU) -#define LPSPI_TCR_FRAMESZ_SHIFT (0U) -/*! FRAMESZ - Frame Size - */ -#define LPSPI_TCR_FRAMESZ(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_FRAMESZ_SHIFT)) & LPSPI_TCR_FRAMESZ_MASK) - -#define LPSPI_TCR_WIDTH_MASK (0x30000U) -#define LPSPI_TCR_WIDTH_SHIFT (16U) -/*! WIDTH - Transfer Width - * 0b00..1 bit transfer - * 0b01..2 bit transfer - * 0b10..4 bit transfer - * 0b11..Reserved - */ -#define LPSPI_TCR_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_WIDTH_SHIFT)) & LPSPI_TCR_WIDTH_MASK) - -#define LPSPI_TCR_TXMSK_MASK (0x40000U) -#define LPSPI_TCR_TXMSK_SHIFT (18U) -/*! TXMSK - Transmit Data Mask - * 0b0..Normal transfer - * 0b1..Mask transmit data - */ -#define LPSPI_TCR_TXMSK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_TXMSK_SHIFT)) & LPSPI_TCR_TXMSK_MASK) - -#define LPSPI_TCR_RXMSK_MASK (0x80000U) -#define LPSPI_TCR_RXMSK_SHIFT (19U) -/*! RXMSK - Receive Data Mask - * 0b0..Normal transfer - * 0b1..Receive data is masked - */ -#define LPSPI_TCR_RXMSK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_RXMSK_SHIFT)) & LPSPI_TCR_RXMSK_MASK) - -#define LPSPI_TCR_CONTC_MASK (0x100000U) -#define LPSPI_TCR_CONTC_SHIFT (20U) -/*! CONTC - Continuing Command - * 0b0..Command word for start of new transfer - * 0b1..Command word for continuing transfer - */ -#define LPSPI_TCR_CONTC(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CONTC_SHIFT)) & LPSPI_TCR_CONTC_MASK) - -#define LPSPI_TCR_CONT_MASK (0x200000U) -#define LPSPI_TCR_CONT_SHIFT (21U) -/*! CONT - Continuous Transfer - * 0b0..Continuous transfer is disabled - * 0b1..Continuous transfer is enabled - */ -#define LPSPI_TCR_CONT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CONT_SHIFT)) & LPSPI_TCR_CONT_MASK) - -#define LPSPI_TCR_BYSW_MASK (0x400000U) -#define LPSPI_TCR_BYSW_SHIFT (22U) -/*! BYSW - Byte Swap - * 0b0..Byte swap is disabled - * 0b1..Byte swap is enabled - */ -#define LPSPI_TCR_BYSW(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_BYSW_SHIFT)) & LPSPI_TCR_BYSW_MASK) - -#define LPSPI_TCR_LSBF_MASK (0x800000U) -#define LPSPI_TCR_LSBF_SHIFT (23U) -/*! LSBF - LSB First - * 0b0..Data is transferred MSB first - * 0b1..Data is transferred LSB first - */ -#define LPSPI_TCR_LSBF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_LSBF_SHIFT)) & LPSPI_TCR_LSBF_MASK) - -#define LPSPI_TCR_PCS_MASK (0x3000000U) -#define LPSPI_TCR_PCS_SHIFT (24U) -/*! PCS - Peripheral Chip Select - * 0b00..Transfer using LPSPI_PCS[0] - * 0b01..Transfer using LPSPI_PCS[1] - * 0b10..Transfer using LPSPI_PCS[2] - * 0b11..Transfer using LPSPI_PCS[3] - */ -#define LPSPI_TCR_PCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_PCS_SHIFT)) & LPSPI_TCR_PCS_MASK) - -#define LPSPI_TCR_PRESCALE_MASK (0x38000000U) -#define LPSPI_TCR_PRESCALE_SHIFT (27U) -/*! PRESCALE - Prescaler Value - * 0b000..Divide by 1 - * 0b001..Divide by 2 - * 0b010..Divide by 4 - * 0b011..Divide by 8 - * 0b100..Divide by 16 - * 0b101..Divide by 32 - * 0b110..Divide by 64 - * 0b111..Divide by 128 - */ -#define LPSPI_TCR_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_PRESCALE_SHIFT)) & LPSPI_TCR_PRESCALE_MASK) - -#define LPSPI_TCR_CPHA_MASK (0x40000000U) -#define LPSPI_TCR_CPHA_SHIFT (30U) -/*! CPHA - Clock Phase - * 0b0..Data is captured on the leading edge of SCK and changed on the following edge of SCK - * 0b1..Data is changed on the leading edge of SCK and captured on the following edge of SCK - */ -#define LPSPI_TCR_CPHA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CPHA_SHIFT)) & LPSPI_TCR_CPHA_MASK) - -#define LPSPI_TCR_CPOL_MASK (0x80000000U) -#define LPSPI_TCR_CPOL_SHIFT (31U) -/*! CPOL - Clock Polarity - * 0b0..The inactive state value of SCK is low - * 0b1..The inactive state value of SCK is high - */ -#define LPSPI_TCR_CPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CPOL_SHIFT)) & LPSPI_TCR_CPOL_MASK) -/*! @} */ - -/*! @name TDR - Transmit Data Register */ -/*! @{ */ - -#define LPSPI_TDR_DATA_MASK (0xFFFFFFFFU) -#define LPSPI_TDR_DATA_SHIFT (0U) -/*! DATA - Transmit Data - */ -#define LPSPI_TDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TDR_DATA_SHIFT)) & LPSPI_TDR_DATA_MASK) -/*! @} */ - -/*! @name RSR - Receive Status Register */ -/*! @{ */ - -#define LPSPI_RSR_SOF_MASK (0x1U) -#define LPSPI_RSR_SOF_SHIFT (0U) -/*! SOF - Start Of Frame - * 0b0..Subsequent data word received after LPSPI_PCS assertion - * 0b1..First data word received after LPSPI_PCS assertion - */ -#define LPSPI_RSR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RSR_SOF_SHIFT)) & LPSPI_RSR_SOF_MASK) - -#define LPSPI_RSR_RXEMPTY_MASK (0x2U) -#define LPSPI_RSR_RXEMPTY_SHIFT (1U) -/*! RXEMPTY - RX FIFO Empty - * 0b0..RX FIFO is not empty - * 0b1..RX FIFO is empty - */ -#define LPSPI_RSR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RSR_RXEMPTY_SHIFT)) & LPSPI_RSR_RXEMPTY_MASK) -/*! @} */ - -/*! @name RDR - Receive Data Register */ -/*! @{ */ - -#define LPSPI_RDR_DATA_MASK (0xFFFFFFFFU) -#define LPSPI_RDR_DATA_SHIFT (0U) -/*! DATA - Receive Data - */ -#define LPSPI_RDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RDR_DATA_SHIFT)) & LPSPI_RDR_DATA_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group LPSPI_Register_Masks */ - - -/* LPSPI - Peripheral instance base addresses */ -/** Peripheral LPSPI1 base address */ -#define LPSPI1_BASE (0x40394000u) -/** Peripheral LPSPI1 base pointer */ -#define LPSPI1 ((LPSPI_Type *)LPSPI1_BASE) -/** Peripheral LPSPI2 base address */ -#define LPSPI2_BASE (0x40398000u) -/** Peripheral LPSPI2 base pointer */ -#define LPSPI2 ((LPSPI_Type *)LPSPI2_BASE) -/** Peripheral LPSPI3 base address */ -#define LPSPI3_BASE (0x4039C000u) -/** Peripheral LPSPI3 base pointer */ -#define LPSPI3 ((LPSPI_Type *)LPSPI3_BASE) -/** Peripheral LPSPI4 base address */ -#define LPSPI4_BASE (0x403A0000u) -/** Peripheral LPSPI4 base pointer */ -#define LPSPI4 ((LPSPI_Type *)LPSPI4_BASE) -/** Array initializer of LPSPI peripheral base addresses */ -#define LPSPI_BASE_ADDRS { 0u, LPSPI1_BASE, LPSPI2_BASE, LPSPI3_BASE, LPSPI4_BASE } -/** Array initializer of LPSPI peripheral base pointers */ -#define LPSPI_BASE_PTRS { (LPSPI_Type *)0u, LPSPI1, LPSPI2, LPSPI3, LPSPI4 } -/** Interrupt vectors for the LPSPI peripheral type */ -#define LPSPI_IRQS { NotAvail_IRQn, LPSPI1_IRQn, LPSPI2_IRQn, LPSPI3_IRQn, LPSPI4_IRQn } - -/*! - * @} - */ /* end of group LPSPI_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- LPUART Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPUART_Peripheral_Access_Layer LPUART Peripheral Access Layer - * @{ - */ - -/** LPUART - Register Layout Typedef */ -typedef struct { - __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ - __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ - __IO uint32_t GLOBAL; /**< LPUART Global Register, offset: 0x8 */ - __IO uint32_t PINCFG; /**< LPUART Pin Configuration Register, offset: 0xC */ - __IO uint32_t BAUD; /**< LPUART Baud Rate Register, offset: 0x10 */ - __IO uint32_t STAT; /**< LPUART Status Register, offset: 0x14 */ - __IO uint32_t CTRL; /**< LPUART Control Register, offset: 0x18 */ - __IO uint32_t DATA; /**< LPUART Data Register, offset: 0x1C */ - __IO uint32_t MATCH; /**< LPUART Match Address Register, offset: 0x20 */ - __IO uint32_t MODIR; /**< LPUART Modem IrDA Register, offset: 0x24 */ - __IO uint32_t FIFO; /**< LPUART FIFO Register, offset: 0x28 */ - __IO uint32_t WATER; /**< LPUART Watermark Register, offset: 0x2C */ -} LPUART_Type; - -/* ---------------------------------------------------------------------------- - -- LPUART Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup LPUART_Register_Masks LPUART Register Masks - * @{ - */ - -/*! @name VERID - Version ID Register */ -/*! @{ */ - -#define LPUART_VERID_FEATURE_MASK (0xFFFFU) -#define LPUART_VERID_FEATURE_SHIFT (0U) -/*! FEATURE - Feature Identification Number - * 0b0000000000000001..Standard feature set. - * 0b0000000000000011..Standard feature set with MODEM/IrDA support. - */ -#define LPUART_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_FEATURE_SHIFT)) & LPUART_VERID_FEATURE_MASK) - -#define LPUART_VERID_MINOR_MASK (0xFF0000U) -#define LPUART_VERID_MINOR_SHIFT (16U) -/*! MINOR - Minor Version Number - */ -#define LPUART_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MINOR_SHIFT)) & LPUART_VERID_MINOR_MASK) - -#define LPUART_VERID_MAJOR_MASK (0xFF000000U) -#define LPUART_VERID_MAJOR_SHIFT (24U) -/*! MAJOR - Major Version Number - */ -#define LPUART_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MAJOR_SHIFT)) & LPUART_VERID_MAJOR_MASK) -/*! @} */ - -/*! @name PARAM - Parameter Register */ -/*! @{ */ - -#define LPUART_PARAM_TXFIFO_MASK (0xFFU) -#define LPUART_PARAM_TXFIFO_SHIFT (0U) -/*! TXFIFO - Transmit FIFO Size - */ -#define LPUART_PARAM_TXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_TXFIFO_SHIFT)) & LPUART_PARAM_TXFIFO_MASK) - -#define LPUART_PARAM_RXFIFO_MASK (0xFF00U) -#define LPUART_PARAM_RXFIFO_SHIFT (8U) -/*! RXFIFO - Receive FIFO Size - */ -#define LPUART_PARAM_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_RXFIFO_SHIFT)) & LPUART_PARAM_RXFIFO_MASK) -/*! @} */ - -/*! @name GLOBAL - LPUART Global Register */ -/*! @{ */ - -#define LPUART_GLOBAL_RST_MASK (0x2U) -#define LPUART_GLOBAL_RST_SHIFT (1U) -/*! RST - Software Reset - * 0b0..Module is not reset. - * 0b1..Module is reset. - */ -#define LPUART_GLOBAL_RST(x) (((uint32_t)(((uint32_t)(x)) << LPUART_GLOBAL_RST_SHIFT)) & LPUART_GLOBAL_RST_MASK) -/*! @} */ - -/*! @name PINCFG - LPUART Pin Configuration Register */ -/*! @{ */ - -#define LPUART_PINCFG_TRGSEL_MASK (0x3U) -#define LPUART_PINCFG_TRGSEL_SHIFT (0U) -/*! TRGSEL - Trigger Select - * 0b00..Input trigger is disabled. - * 0b01..Input trigger is used instead of RXD pin input. - * 0b10..Input trigger is used instead of CTS_B pin input. - * 0b11..Input trigger is used to modulate the TXD pin output. The TXD pin output (after TXINV configuration) is ANDed with the input trigger. - */ -#define LPUART_PINCFG_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PINCFG_TRGSEL_SHIFT)) & LPUART_PINCFG_TRGSEL_MASK) -/*! @} */ - -/*! @name BAUD - LPUART Baud Rate Register */ -/*! @{ */ - -#define LPUART_BAUD_SBR_MASK (0x1FFFU) -#define LPUART_BAUD_SBR_SHIFT (0U) -/*! SBR - Baud Rate Modulo Divisor. - */ -#define LPUART_BAUD_SBR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBR_SHIFT)) & LPUART_BAUD_SBR_MASK) - -#define LPUART_BAUD_SBNS_MASK (0x2000U) -#define LPUART_BAUD_SBNS_SHIFT (13U) -/*! SBNS - Stop Bit Number Select - * 0b0..One stop bit. - * 0b1..Two stop bits. - */ -#define LPUART_BAUD_SBNS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBNS_SHIFT)) & LPUART_BAUD_SBNS_MASK) - -#define LPUART_BAUD_RXEDGIE_MASK (0x4000U) -#define LPUART_BAUD_RXEDGIE_SHIFT (14U) -/*! RXEDGIE - RX Input Active Edge Interrupt Enable - * 0b0..Hardware interrupts from STAT[RXEDGIF] are disabled. - * 0b1..Hardware interrupt is requested when STAT[RXEDGIF] flag is 1. - */ -#define LPUART_BAUD_RXEDGIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RXEDGIE_SHIFT)) & LPUART_BAUD_RXEDGIE_MASK) - -#define LPUART_BAUD_LBKDIE_MASK (0x8000U) -#define LPUART_BAUD_LBKDIE_SHIFT (15U) -/*! LBKDIE - LIN Break Detect Interrupt Enable - * 0b0..Hardware interrupts from STAT[LBKDIF] flag are disabled (use polling). - * 0b1..Hardware interrupt requested when STAT[LBKDIF] flag is 1. - */ -#define LPUART_BAUD_LBKDIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_LBKDIE_SHIFT)) & LPUART_BAUD_LBKDIE_MASK) - -#define LPUART_BAUD_RESYNCDIS_MASK (0x10000U) -#define LPUART_BAUD_RESYNCDIS_SHIFT (16U) -/*! RESYNCDIS - Resynchronization Disable - * 0b0..Resynchronization during received data word is supported - * 0b1..Resynchronization during received data word is disabled - */ -#define LPUART_BAUD_RESYNCDIS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RESYNCDIS_SHIFT)) & LPUART_BAUD_RESYNCDIS_MASK) - -#define LPUART_BAUD_BOTHEDGE_MASK (0x20000U) -#define LPUART_BAUD_BOTHEDGE_SHIFT (17U) -/*! BOTHEDGE - Both Edge Sampling - * 0b0..Receiver samples input data using the rising edge of the baud rate clock. - * 0b1..Receiver samples input data using the rising and falling edge of the baud rate clock. - */ -#define LPUART_BAUD_BOTHEDGE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_BOTHEDGE_SHIFT)) & LPUART_BAUD_BOTHEDGE_MASK) - -#define LPUART_BAUD_MATCFG_MASK (0xC0000U) -#define LPUART_BAUD_MATCFG_SHIFT (18U) -/*! MATCFG - Match Configuration - * 0b00..Address Match Wakeup - * 0b01..Idle Match Wakeup - * 0b10..Match On and Match Off - * 0b11..Enables RWU on Data Match and Match On/Off for transmitter CTS input - */ -#define LPUART_BAUD_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MATCFG_SHIFT)) & LPUART_BAUD_MATCFG_MASK) - -#define LPUART_BAUD_RIDMAE_MASK (0x100000U) -#define LPUART_BAUD_RIDMAE_SHIFT (20U) -/*! RIDMAE - Receiver Idle DMA Enable - * 0b0..DMA request disabled. - * 0b1..DMA request enabled. - */ -#define LPUART_BAUD_RIDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RIDMAE_SHIFT)) & LPUART_BAUD_RIDMAE_MASK) - -#define LPUART_BAUD_RDMAE_MASK (0x200000U) -#define LPUART_BAUD_RDMAE_SHIFT (21U) -/*! RDMAE - Receiver Full DMA Enable - * 0b0..DMA request disabled. - * 0b1..DMA request enabled. - */ -#define LPUART_BAUD_RDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RDMAE_SHIFT)) & LPUART_BAUD_RDMAE_MASK) - -#define LPUART_BAUD_TDMAE_MASK (0x800000U) -#define LPUART_BAUD_TDMAE_SHIFT (23U) -/*! TDMAE - Transmitter DMA Enable - * 0b0..DMA request disabled. - * 0b1..DMA request enabled. - */ -#define LPUART_BAUD_TDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_TDMAE_SHIFT)) & LPUART_BAUD_TDMAE_MASK) - -#define LPUART_BAUD_OSR_MASK (0x1F000000U) -#define LPUART_BAUD_OSR_SHIFT (24U) -/*! OSR - Oversampling Ratio - * 0b00000..Writing 0 to this field will result in an oversampling ratio of 16 - * 0b00001..Reserved - * 0b00010..Reserved - * 0b00011..Oversampling ratio of 4, requires BOTHEDGE to be set. - * 0b00100..Oversampling ratio of 5, requires BOTHEDGE to be set. - * 0b00101..Oversampling ratio of 6, requires BOTHEDGE to be set. - * 0b00110..Oversampling ratio of 7, requires BOTHEDGE to be set. - * 0b00111..Oversampling ratio of 8. - * 0b01000..Oversampling ratio of 9. - * 0b01001..Oversampling ratio of 10. - * 0b01010..Oversampling ratio of 11. - * 0b01011..Oversampling ratio of 12. - * 0b01100..Oversampling ratio of 13. - * 0b01101..Oversampling ratio of 14. - * 0b01110..Oversampling ratio of 15. - * 0b01111..Oversampling ratio of 16. - * 0b10000..Oversampling ratio of 17. - * 0b10001..Oversampling ratio of 18. - * 0b10010..Oversampling ratio of 19. - * 0b10011..Oversampling ratio of 20. - * 0b10100..Oversampling ratio of 21. - * 0b10101..Oversampling ratio of 22. - * 0b10110..Oversampling ratio of 23. - * 0b10111..Oversampling ratio of 24. - * 0b11000..Oversampling ratio of 25. - * 0b11001..Oversampling ratio of 26. - * 0b11010..Oversampling ratio of 27. - * 0b11011..Oversampling ratio of 28. - * 0b11100..Oversampling ratio of 29. - * 0b11101..Oversampling ratio of 30. - * 0b11110..Oversampling ratio of 31. - * 0b11111..Oversampling ratio of 32. - */ -#define LPUART_BAUD_OSR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_OSR_SHIFT)) & LPUART_BAUD_OSR_MASK) - -#define LPUART_BAUD_M10_MASK (0x20000000U) -#define LPUART_BAUD_M10_SHIFT (29U) -/*! M10 - 10-bit Mode select - * 0b0..Receiver and transmitter use 7-bit to 9-bit data characters. - * 0b1..Receiver and transmitter use 10-bit data characters. - */ -#define LPUART_BAUD_M10(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_M10_SHIFT)) & LPUART_BAUD_M10_MASK) - -#define LPUART_BAUD_MAEN2_MASK (0x40000000U) -#define LPUART_BAUD_MAEN2_SHIFT (30U) -/*! MAEN2 - Match Address Mode Enable 2 - * 0b0..Normal operation. - * 0b1..Enables automatic address matching or data matching mode for MATCH[MA2]. - */ -#define LPUART_BAUD_MAEN2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN2_SHIFT)) & LPUART_BAUD_MAEN2_MASK) - -#define LPUART_BAUD_MAEN1_MASK (0x80000000U) -#define LPUART_BAUD_MAEN1_SHIFT (31U) -/*! MAEN1 - Match Address Mode Enable 1 - * 0b0..Normal operation. - * 0b1..Enables automatic address matching or data matching mode for MATCH[MA1]. - */ -#define LPUART_BAUD_MAEN1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN1_SHIFT)) & LPUART_BAUD_MAEN1_MASK) -/*! @} */ - -/*! @name STAT - LPUART Status Register */ -/*! @{ */ - -#define LPUART_STAT_MA2F_MASK (0x4000U) -#define LPUART_STAT_MA2F_SHIFT (14U) -/*! MA2F - Match 2 Flag - * 0b0..Received data is not equal to MA2 - * 0b1..Received data is equal to MA2 - */ -#define LPUART_STAT_MA2F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA2F_SHIFT)) & LPUART_STAT_MA2F_MASK) - -#define LPUART_STAT_MA1F_MASK (0x8000U) -#define LPUART_STAT_MA1F_SHIFT (15U) -/*! MA1F - Match 1 Flag - * 0b0..Received data is not equal to MA1 - * 0b1..Received data is equal to MA1 - */ -#define LPUART_STAT_MA1F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA1F_SHIFT)) & LPUART_STAT_MA1F_MASK) - -#define LPUART_STAT_PF_MASK (0x10000U) -#define LPUART_STAT_PF_SHIFT (16U) -/*! PF - Parity Error Flag - * 0b0..No parity error. - * 0b1..Parity error. - */ -#define LPUART_STAT_PF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_PF_SHIFT)) & LPUART_STAT_PF_MASK) - -#define LPUART_STAT_FE_MASK (0x20000U) -#define LPUART_STAT_FE_SHIFT (17U) -/*! FE - Framing Error Flag - * 0b0..No framing error detected. This does not guarantee the framing is correct. - * 0b1..Framing error. - */ -#define LPUART_STAT_FE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_FE_SHIFT)) & LPUART_STAT_FE_MASK) - -#define LPUART_STAT_NF_MASK (0x40000U) -#define LPUART_STAT_NF_SHIFT (18U) -/*! NF - Noise Flag - * 0b0..No noise detected. - * 0b1..Noise detected in the received character in the DATA register. - */ -#define LPUART_STAT_NF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_NF_SHIFT)) & LPUART_STAT_NF_MASK) - -#define LPUART_STAT_OR_MASK (0x80000U) -#define LPUART_STAT_OR_SHIFT (19U) -/*! OR - Receiver Overrun Flag - * 0b0..No overrun. - * 0b1..Receive overrun (new LPUART data lost). - */ -#define LPUART_STAT_OR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_OR_SHIFT)) & LPUART_STAT_OR_MASK) - -#define LPUART_STAT_IDLE_MASK (0x100000U) -#define LPUART_STAT_IDLE_SHIFT (20U) -/*! IDLE - Idle Line Flag - * 0b0..No idle line detected. - * 0b1..Idle line was detected. - */ -#define LPUART_STAT_IDLE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_IDLE_SHIFT)) & LPUART_STAT_IDLE_MASK) - -#define LPUART_STAT_RDRF_MASK (0x200000U) -#define LPUART_STAT_RDRF_SHIFT (21U) -/*! RDRF - Receive Data Register Full Flag - * 0b0..Receive data buffer empty. - * 0b1..Receive data buffer full. - */ -#define LPUART_STAT_RDRF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RDRF_SHIFT)) & LPUART_STAT_RDRF_MASK) - -#define LPUART_STAT_TC_MASK (0x400000U) -#define LPUART_STAT_TC_SHIFT (22U) -/*! TC - Transmission Complete Flag - * 0b0..Transmitter active (sending data, a preamble, or a break). - * 0b1..Transmitter idle (transmission activity complete). - */ -#define LPUART_STAT_TC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TC_SHIFT)) & LPUART_STAT_TC_MASK) - -#define LPUART_STAT_TDRE_MASK (0x800000U) -#define LPUART_STAT_TDRE_SHIFT (23U) -/*! TDRE - Transmit Data Register Empty Flag - * 0b0..Transmit data buffer full. - * 0b1..Transmit data buffer empty. - */ -#define LPUART_STAT_TDRE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TDRE_SHIFT)) & LPUART_STAT_TDRE_MASK) - -#define LPUART_STAT_RAF_MASK (0x1000000U) -#define LPUART_STAT_RAF_SHIFT (24U) -/*! RAF - Receiver Active Flag - * 0b0..LPUART receiver idle waiting for a start bit. - * 0b1..LPUART receiver active (RXD input not idle). - */ -#define LPUART_STAT_RAF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RAF_SHIFT)) & LPUART_STAT_RAF_MASK) - -#define LPUART_STAT_LBKDE_MASK (0x2000000U) -#define LPUART_STAT_LBKDE_SHIFT (25U) -/*! LBKDE - LIN Break Detection Enable - * 0b0..LIN break detect is disabled, normal break character can be detected. - * 0b1..LIN break detect is enabled. LIN break character is detected at length of 11 bit times (if M = 0) or 12 (if M = 1) or 13 (M10 = 1). - */ -#define LPUART_STAT_LBKDE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDE_SHIFT)) & LPUART_STAT_LBKDE_MASK) - -#define LPUART_STAT_BRK13_MASK (0x4000000U) -#define LPUART_STAT_BRK13_SHIFT (26U) -/*! BRK13 - Break Character Generation Length - * 0b0..Break character is transmitted with length of 9 to 13 bit times. - * 0b1..Break character is transmitted with length of 12 to 15 bit times. - */ -#define LPUART_STAT_BRK13(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_BRK13_SHIFT)) & LPUART_STAT_BRK13_MASK) - -#define LPUART_STAT_RWUID_MASK (0x8000000U) -#define LPUART_STAT_RWUID_SHIFT (27U) -/*! RWUID - Receive Wake Up Idle Detect - * 0b0..During receive standby state (RWU = 1), the IDLE bit does not get set upon detection of an idle - * character. During address match wakeup, the IDLE bit does not set when an address does not match. - * 0b1..During receive standby state (RWU = 1), the IDLE bit gets set upon detection of an idle character. During - * address match wakeup, the IDLE bit does set when an address does not match. - */ -#define LPUART_STAT_RWUID(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RWUID_SHIFT)) & LPUART_STAT_RWUID_MASK) - -#define LPUART_STAT_RXINV_MASK (0x10000000U) -#define LPUART_STAT_RXINV_SHIFT (28U) -/*! RXINV - Receive Data Inversion - * 0b0..Receive data not inverted. - * 0b1..Receive data inverted. - */ -#define LPUART_STAT_RXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXINV_SHIFT)) & LPUART_STAT_RXINV_MASK) - -#define LPUART_STAT_MSBF_MASK (0x20000000U) -#define LPUART_STAT_MSBF_SHIFT (29U) -/*! MSBF - MSB First - * 0b0..LSB (bit0) is the first bit that is transmitted following the start bit. Further, the first bit received - * after the start bit is identified as bit0. - * 0b1..MSB (bit9, bit8, bit7 or bit6) is the first bit that is transmitted following the start bit depending on - * the setting of CTRL[M], CTRL[PE] and BAUD[M10]. Further, the first bit received after the start bit is - * identified as bit9, bit8, bit7 or bit6 depending on the setting of CTRL[M] and CTRL[PE]. - */ -#define LPUART_STAT_MSBF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MSBF_SHIFT)) & LPUART_STAT_MSBF_MASK) - -#define LPUART_STAT_RXEDGIF_MASK (0x40000000U) -#define LPUART_STAT_RXEDGIF_SHIFT (30U) -/*! RXEDGIF - RXD Pin Active Edge Interrupt Flag - * 0b0..No active edge on the receive pin has occurred. - * 0b1..An active edge on the receive pin has occurred. - */ -#define LPUART_STAT_RXEDGIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXEDGIF_SHIFT)) & LPUART_STAT_RXEDGIF_MASK) - -#define LPUART_STAT_LBKDIF_MASK (0x80000000U) -#define LPUART_STAT_LBKDIF_SHIFT (31U) -/*! LBKDIF - LIN Break Detect Interrupt Flag - * 0b0..No LIN break character has been detected. - * 0b1..LIN break character has been detected. - */ -#define LPUART_STAT_LBKDIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDIF_SHIFT)) & LPUART_STAT_LBKDIF_MASK) -/*! @} */ - -/*! @name CTRL - LPUART Control Register */ -/*! @{ */ - -#define LPUART_CTRL_PT_MASK (0x1U) -#define LPUART_CTRL_PT_SHIFT (0U) -/*! PT - Parity Type - * 0b0..Even parity. - * 0b1..Odd parity. - */ -#define LPUART_CTRL_PT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PT_SHIFT)) & LPUART_CTRL_PT_MASK) - -#define LPUART_CTRL_PE_MASK (0x2U) -#define LPUART_CTRL_PE_SHIFT (1U) -/*! PE - Parity Enable - * 0b0..No hardware parity generation or checking. - * 0b1..Parity enabled. - */ -#define LPUART_CTRL_PE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PE_SHIFT)) & LPUART_CTRL_PE_MASK) - -#define LPUART_CTRL_ILT_MASK (0x4U) -#define LPUART_CTRL_ILT_SHIFT (2U) -/*! ILT - Idle Line Type Select - * 0b0..Idle character bit count starts after start bit. - * 0b1..Idle character bit count starts after stop bit. - */ -#define LPUART_CTRL_ILT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILT_SHIFT)) & LPUART_CTRL_ILT_MASK) - -#define LPUART_CTRL_WAKE_MASK (0x8U) -#define LPUART_CTRL_WAKE_SHIFT (3U) -/*! WAKE - Receiver Wakeup Method Select - * 0b0..Configures RWU for idle-line wakeup. - * 0b1..Configures RWU with address-mark wakeup. - */ -#define LPUART_CTRL_WAKE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_WAKE_SHIFT)) & LPUART_CTRL_WAKE_MASK) - -#define LPUART_CTRL_M_MASK (0x10U) -#define LPUART_CTRL_M_SHIFT (4U) -/*! M - 9-Bit or 8-Bit Mode Select - * 0b0..Receiver and transmitter use 8-bit data characters. - * 0b1..Receiver and transmitter use 9-bit data characters. - */ -#define LPUART_CTRL_M(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_M_SHIFT)) & LPUART_CTRL_M_MASK) - -#define LPUART_CTRL_RSRC_MASK (0x20U) -#define LPUART_CTRL_RSRC_SHIFT (5U) -/*! RSRC - Receiver Source Select - * 0b0..Provided LOOPS is set, RSRC is cleared, selects internal loop back mode and the LPUART does not use the RXD pin. - * 0b1..Single-wire LPUART mode where the TXD pin is connected to the transmitter output and receiver input. - */ -#define LPUART_CTRL_RSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RSRC_SHIFT)) & LPUART_CTRL_RSRC_MASK) - -#define LPUART_CTRL_DOZEEN_MASK (0x40U) -#define LPUART_CTRL_DOZEEN_SHIFT (6U) -/*! DOZEEN - Doze Enable - * 0b0..LPUART is enabled in Doze mode. - * 0b1..LPUART is disabled in Doze mode. - */ -#define LPUART_CTRL_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_DOZEEN_SHIFT)) & LPUART_CTRL_DOZEEN_MASK) - -#define LPUART_CTRL_LOOPS_MASK (0x80U) -#define LPUART_CTRL_LOOPS_SHIFT (7U) -/*! LOOPS - Loop Mode Select - * 0b0..Normal operation - RXD and TXD use separate pins. - * 0b1..Loop mode or single-wire mode where transmitter outputs are internally connected to receiver input (see RSRC bit). - */ -#define LPUART_CTRL_LOOPS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_LOOPS_SHIFT)) & LPUART_CTRL_LOOPS_MASK) - -#define LPUART_CTRL_IDLECFG_MASK (0x700U) -#define LPUART_CTRL_IDLECFG_SHIFT (8U) -/*! IDLECFG - Idle Configuration - * 0b000..1 idle character - * 0b001..2 idle characters - * 0b010..4 idle characters - * 0b011..8 idle characters - * 0b100..16 idle characters - * 0b101..32 idle characters - * 0b110..64 idle characters - * 0b111..128 idle characters - */ -#define LPUART_CTRL_IDLECFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_IDLECFG_SHIFT)) & LPUART_CTRL_IDLECFG_MASK) - -#define LPUART_CTRL_M7_MASK (0x800U) -#define LPUART_CTRL_M7_SHIFT (11U) -/*! M7 - 7-Bit Mode Select - * 0b0..Receiver and transmitter use 8-bit to 10-bit data characters. - * 0b1..Receiver and transmitter use 7-bit data characters. - */ -#define LPUART_CTRL_M7(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_M7_SHIFT)) & LPUART_CTRL_M7_MASK) - -#define LPUART_CTRL_MA2IE_MASK (0x4000U) -#define LPUART_CTRL_MA2IE_SHIFT (14U) -/*! MA2IE - Match 2 Interrupt Enable - * 0b0..MA2F interrupt disabled - * 0b1..MA2F interrupt enabled - */ -#define LPUART_CTRL_MA2IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA2IE_SHIFT)) & LPUART_CTRL_MA2IE_MASK) - -#define LPUART_CTRL_MA1IE_MASK (0x8000U) -#define LPUART_CTRL_MA1IE_SHIFT (15U) -/*! MA1IE - Match 1 Interrupt Enable - * 0b0..MA1F interrupt disabled - * 0b1..MA1F interrupt enabled - */ -#define LPUART_CTRL_MA1IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA1IE_SHIFT)) & LPUART_CTRL_MA1IE_MASK) - -#define LPUART_CTRL_SBK_MASK (0x10000U) -#define LPUART_CTRL_SBK_SHIFT (16U) -/*! SBK - Send Break - * 0b0..Normal transmitter operation. - * 0b1..Queue break character(s) to be sent. - */ -#define LPUART_CTRL_SBK(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_SBK_SHIFT)) & LPUART_CTRL_SBK_MASK) - -#define LPUART_CTRL_RWU_MASK (0x20000U) -#define LPUART_CTRL_RWU_SHIFT (17U) -/*! RWU - Receiver Wakeup Control - * 0b0..Normal receiver operation. - * 0b1..LPUART receiver in standby waiting for wakeup condition. - */ -#define LPUART_CTRL_RWU(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RWU_SHIFT)) & LPUART_CTRL_RWU_MASK) - -#define LPUART_CTRL_RE_MASK (0x40000U) -#define LPUART_CTRL_RE_SHIFT (18U) -/*! RE - Receiver Enable - * 0b0..Receiver disabled. - * 0b1..Receiver enabled. - */ -#define LPUART_CTRL_RE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RE_SHIFT)) & LPUART_CTRL_RE_MASK) - -#define LPUART_CTRL_TE_MASK (0x80000U) -#define LPUART_CTRL_TE_SHIFT (19U) -/*! TE - Transmitter Enable - * 0b0..Transmitter disabled. - * 0b1..Transmitter enabled. - */ -#define LPUART_CTRL_TE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TE_SHIFT)) & LPUART_CTRL_TE_MASK) - -#define LPUART_CTRL_ILIE_MASK (0x100000U) -#define LPUART_CTRL_ILIE_SHIFT (20U) -/*! ILIE - Idle Line Interrupt Enable - * 0b0..Hardware interrupts from IDLE disabled; use polling. - * 0b1..Hardware interrupt requested when IDLE flag is 1. - */ -#define LPUART_CTRL_ILIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILIE_SHIFT)) & LPUART_CTRL_ILIE_MASK) - -#define LPUART_CTRL_RIE_MASK (0x200000U) -#define LPUART_CTRL_RIE_SHIFT (21U) -/*! RIE - Receiver Interrupt Enable - * 0b0..Hardware interrupts from RDRF disabled; use polling. - * 0b1..Hardware interrupt requested when RDRF flag is 1. - */ -#define LPUART_CTRL_RIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RIE_SHIFT)) & LPUART_CTRL_RIE_MASK) - -#define LPUART_CTRL_TCIE_MASK (0x400000U) -#define LPUART_CTRL_TCIE_SHIFT (22U) -/*! TCIE - Transmission Complete Interrupt Enable for - * 0b0..Hardware interrupts from TC disabled; use polling. - * 0b1..Hardware interrupt requested when TC flag is 1. - */ -#define LPUART_CTRL_TCIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TCIE_SHIFT)) & LPUART_CTRL_TCIE_MASK) - -#define LPUART_CTRL_TIE_MASK (0x800000U) -#define LPUART_CTRL_TIE_SHIFT (23U) -/*! TIE - Transmit Interrupt Enable - * 0b0..Hardware interrupts from TDRE disabled; use polling. - * 0b1..Hardware interrupt requested when TDRE flag is 1. - */ -#define LPUART_CTRL_TIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TIE_SHIFT)) & LPUART_CTRL_TIE_MASK) - -#define LPUART_CTRL_PEIE_MASK (0x1000000U) -#define LPUART_CTRL_PEIE_SHIFT (24U) -/*! PEIE - Parity Error Interrupt Enable - * 0b0..PF interrupts disabled; use polling). - * 0b1..Hardware interrupt requested when PF is set. - */ -#define LPUART_CTRL_PEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PEIE_SHIFT)) & LPUART_CTRL_PEIE_MASK) - -#define LPUART_CTRL_FEIE_MASK (0x2000000U) -#define LPUART_CTRL_FEIE_SHIFT (25U) -/*! FEIE - Framing Error Interrupt Enable - * 0b0..FE interrupts disabled; use polling. - * 0b1..Hardware interrupt requested when FE is set. - */ -#define LPUART_CTRL_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_FEIE_SHIFT)) & LPUART_CTRL_FEIE_MASK) - -#define LPUART_CTRL_NEIE_MASK (0x4000000U) -#define LPUART_CTRL_NEIE_SHIFT (26U) -/*! NEIE - Noise Error Interrupt Enable - * 0b0..NF interrupts disabled; use polling. - * 0b1..Hardware interrupt requested when NF is set. - */ -#define LPUART_CTRL_NEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_NEIE_SHIFT)) & LPUART_CTRL_NEIE_MASK) - -#define LPUART_CTRL_ORIE_MASK (0x8000000U) -#define LPUART_CTRL_ORIE_SHIFT (27U) -/*! ORIE - Overrun Interrupt Enable - * 0b0..OR interrupts disabled; use polling. - * 0b1..Hardware interrupt requested when OR is set. - */ -#define LPUART_CTRL_ORIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ORIE_SHIFT)) & LPUART_CTRL_ORIE_MASK) - -#define LPUART_CTRL_TXINV_MASK (0x10000000U) -#define LPUART_CTRL_TXINV_SHIFT (28U) -/*! TXINV - Transmit Data Inversion - * 0b0..Transmit data not inverted. - * 0b1..Transmit data inverted. - */ -#define LPUART_CTRL_TXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXINV_SHIFT)) & LPUART_CTRL_TXINV_MASK) - -#define LPUART_CTRL_TXDIR_MASK (0x20000000U) -#define LPUART_CTRL_TXDIR_SHIFT (29U) -/*! TXDIR - TXD Pin 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 LPUART_CTRL_TXDIR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXDIR_SHIFT)) & LPUART_CTRL_TXDIR_MASK) - -#define LPUART_CTRL_R9T8_MASK (0x40000000U) -#define LPUART_CTRL_R9T8_SHIFT (30U) -/*! R9T8 - Receive Bit 9 / Transmit Bit 8 - */ -#define LPUART_CTRL_R9T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R9T8_SHIFT)) & LPUART_CTRL_R9T8_MASK) - -#define LPUART_CTRL_R8T9_MASK (0x80000000U) -#define LPUART_CTRL_R8T9_SHIFT (31U) -/*! R8T9 - Receive Bit 8 / Transmit Bit 9 - */ -#define LPUART_CTRL_R8T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R8T9_SHIFT)) & LPUART_CTRL_R8T9_MASK) -/*! @} */ - -/*! @name DATA - LPUART Data Register */ -/*! @{ */ - -#define LPUART_DATA_R0T0_MASK (0x1U) -#define LPUART_DATA_R0T0_SHIFT (0U) -/*! R0T0 - R0T0 - */ -#define LPUART_DATA_R0T0(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R0T0_SHIFT)) & LPUART_DATA_R0T0_MASK) - -#define LPUART_DATA_R1T1_MASK (0x2U) -#define LPUART_DATA_R1T1_SHIFT (1U) -/*! R1T1 - R1T1 - */ -#define LPUART_DATA_R1T1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R1T1_SHIFT)) & LPUART_DATA_R1T1_MASK) - -#define LPUART_DATA_R2T2_MASK (0x4U) -#define LPUART_DATA_R2T2_SHIFT (2U) -/*! R2T2 - R2T2 - */ -#define LPUART_DATA_R2T2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R2T2_SHIFT)) & LPUART_DATA_R2T2_MASK) - -#define LPUART_DATA_R3T3_MASK (0x8U) -#define LPUART_DATA_R3T3_SHIFT (3U) -/*! R3T3 - R3T3 - */ -#define LPUART_DATA_R3T3(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R3T3_SHIFT)) & LPUART_DATA_R3T3_MASK) - -#define LPUART_DATA_R4T4_MASK (0x10U) -#define LPUART_DATA_R4T4_SHIFT (4U) -/*! R4T4 - R4T4 - */ -#define LPUART_DATA_R4T4(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R4T4_SHIFT)) & LPUART_DATA_R4T4_MASK) - -#define LPUART_DATA_R5T5_MASK (0x20U) -#define LPUART_DATA_R5T5_SHIFT (5U) -/*! R5T5 - R5T5 - */ -#define LPUART_DATA_R5T5(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R5T5_SHIFT)) & LPUART_DATA_R5T5_MASK) - -#define LPUART_DATA_R6T6_MASK (0x40U) -#define LPUART_DATA_R6T6_SHIFT (6U) -/*! R6T6 - R6T6 - */ -#define LPUART_DATA_R6T6(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R6T6_SHIFT)) & LPUART_DATA_R6T6_MASK) - -#define LPUART_DATA_R7T7_MASK (0x80U) -#define LPUART_DATA_R7T7_SHIFT (7U) -/*! R7T7 - R7T7 - */ -#define LPUART_DATA_R7T7(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R7T7_SHIFT)) & LPUART_DATA_R7T7_MASK) - -#define LPUART_DATA_R8T8_MASK (0x100U) -#define LPUART_DATA_R8T8_SHIFT (8U) -/*! R8T8 - R8T8 - */ -#define LPUART_DATA_R8T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R8T8_SHIFT)) & LPUART_DATA_R8T8_MASK) - -#define LPUART_DATA_R9T9_MASK (0x200U) -#define LPUART_DATA_R9T9_SHIFT (9U) -/*! R9T9 - R9T9 - */ -#define LPUART_DATA_R9T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R9T9_SHIFT)) & LPUART_DATA_R9T9_MASK) - -#define LPUART_DATA_IDLINE_MASK (0x800U) -#define LPUART_DATA_IDLINE_SHIFT (11U) -/*! IDLINE - Idle Line - * 0b0..Receiver was not idle before receiving this character. - * 0b1..Receiver was idle before receiving this character. - */ -#define LPUART_DATA_IDLINE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_IDLINE_SHIFT)) & LPUART_DATA_IDLINE_MASK) - -#define LPUART_DATA_RXEMPT_MASK (0x1000U) -#define LPUART_DATA_RXEMPT_SHIFT (12U) -/*! RXEMPT - Receive Buffer Empty - * 0b0..Receive buffer contains valid data. - * 0b1..Receive buffer is empty, data returned on read is not valid. - */ -#define LPUART_DATA_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_RXEMPT_SHIFT)) & LPUART_DATA_RXEMPT_MASK) - -#define LPUART_DATA_FRETSC_MASK (0x2000U) -#define LPUART_DATA_FRETSC_SHIFT (13U) -/*! FRETSC - Frame Error / Transmit Special Character - * 0b0..The dataword was received without a frame error on read, or transmit a normal character on write. - * 0b1..The dataword was received with a frame error, or transmit an idle or break character on transmit. - */ -#define LPUART_DATA_FRETSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_FRETSC_SHIFT)) & LPUART_DATA_FRETSC_MASK) - -#define LPUART_DATA_PARITYE_MASK (0x4000U) -#define LPUART_DATA_PARITYE_SHIFT (14U) -/*! PARITYE - PARITYE - * 0b0..The dataword was received without a parity error. - * 0b1..The dataword was received with a parity error. - */ -#define LPUART_DATA_PARITYE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_PARITYE_SHIFT)) & LPUART_DATA_PARITYE_MASK) - -#define LPUART_DATA_NOISY_MASK (0x8000U) -#define LPUART_DATA_NOISY_SHIFT (15U) -/*! NOISY - NOISY - * 0b0..The dataword was received without noise. - * 0b1..The data was received with noise. - */ -#define LPUART_DATA_NOISY(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_NOISY_SHIFT)) & LPUART_DATA_NOISY_MASK) -/*! @} */ - -/*! @name MATCH - LPUART Match Address Register */ -/*! @{ */ - -#define LPUART_MATCH_MA1_MASK (0x3FFU) -#define LPUART_MATCH_MA1_SHIFT (0U) -/*! MA1 - Match Address 1 - */ -#define LPUART_MATCH_MA1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA1_SHIFT)) & LPUART_MATCH_MA1_MASK) - -#define LPUART_MATCH_MA2_MASK (0x3FF0000U) -#define LPUART_MATCH_MA2_SHIFT (16U) -/*! MA2 - Match Address 2 - */ -#define LPUART_MATCH_MA2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA2_SHIFT)) & LPUART_MATCH_MA2_MASK) -/*! @} */ - -/*! @name MODIR - LPUART Modem IrDA Register */ -/*! @{ */ - -#define LPUART_MODIR_TXCTSE_MASK (0x1U) -#define LPUART_MODIR_TXCTSE_SHIFT (0U) -/*! TXCTSE - Transmitter clear-to-send enable - * 0b0..CTS has no effect on the transmitter. - * 0b1..Enables clear-to-send operation. The transmitter checks the state of CTS each time it is ready to send a - * character. If CTS is asserted, the character is sent. If CTS is deasserted, the signal TXD remains in the - * mark state and transmission is delayed until CTS is asserted. Changes in CTS as a character is being sent - * do not affect its transmission. - */ -#define LPUART_MODIR_TXCTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSE_SHIFT)) & LPUART_MODIR_TXCTSE_MASK) - -#define LPUART_MODIR_TXRTSE_MASK (0x2U) -#define LPUART_MODIR_TXRTSE_SHIFT (1U) -/*! TXRTSE - Transmitter request-to-send enable - * 0b0..The transmitter has no effect on RTS. - * 0b1..When a character is placed into an empty transmitter data buffer , RTS asserts one bit time before the - * start bit is transmitted. RTS deasserts one bit time after all characters in the transmitter data buffer and - * shift register are completely sent, including the last stop bit. - */ -#define LPUART_MODIR_TXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSE_SHIFT)) & LPUART_MODIR_TXRTSE_MASK) - -#define LPUART_MODIR_TXRTSPOL_MASK (0x4U) -#define LPUART_MODIR_TXRTSPOL_SHIFT (2U) -/*! TXRTSPOL - Transmitter request-to-send polarity - * 0b0..Transmitter RTS is active low. - * 0b1..Transmitter RTS is active high. - */ -#define LPUART_MODIR_TXRTSPOL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSPOL_SHIFT)) & LPUART_MODIR_TXRTSPOL_MASK) - -#define LPUART_MODIR_RXRTSE_MASK (0x8U) -#define LPUART_MODIR_RXRTSE_SHIFT (3U) -/*! RXRTSE - Receiver request-to-send enable - * 0b0..The receiver has no effect on RTS. - * 0b1..RTS is deasserted if the receiver data register is full or a start bit has been detected that would cause - * the receiver data register to become full. RTS is asserted if the receiver data register is not full and - * has not detected a start bit that would cause the receiver data register to become full. - */ -#define LPUART_MODIR_RXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RXRTSE_SHIFT)) & LPUART_MODIR_RXRTSE_MASK) - -#define LPUART_MODIR_TXCTSC_MASK (0x10U) -#define LPUART_MODIR_TXCTSC_SHIFT (4U) -/*! TXCTSC - Transmit CTS Configuration - * 0b0..CTS input is sampled at the start of each character. - * 0b1..CTS input is sampled when the transmitter is idle. - */ -#define LPUART_MODIR_TXCTSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSC_SHIFT)) & LPUART_MODIR_TXCTSC_MASK) - -#define LPUART_MODIR_TXCTSSRC_MASK (0x20U) -#define LPUART_MODIR_TXCTSSRC_SHIFT (5U) -/*! TXCTSSRC - Transmit CTS Source - * 0b0..CTS input is the CTS_B pin. - * 0b1..CTS input is the inverted Receiver Match result. - */ -#define LPUART_MODIR_TXCTSSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSSRC_SHIFT)) & LPUART_MODIR_TXCTSSRC_MASK) - -#define LPUART_MODIR_RTSWATER_MASK (0x300U) -#define LPUART_MODIR_RTSWATER_SHIFT (8U) -/*! RTSWATER - Receive RTS Configuration - */ -#define LPUART_MODIR_RTSWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RTSWATER_SHIFT)) & LPUART_MODIR_RTSWATER_MASK) - -#define LPUART_MODIR_TNP_MASK (0x30000U) -#define LPUART_MODIR_TNP_SHIFT (16U) -/*! TNP - Transmitter narrow pulse - * 0b00..1/OSR. - * 0b01..2/OSR. - * 0b10..3/OSR. - * 0b11..4/OSR. - */ -#define LPUART_MODIR_TNP(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TNP_SHIFT)) & LPUART_MODIR_TNP_MASK) - -#define LPUART_MODIR_IREN_MASK (0x40000U) -#define LPUART_MODIR_IREN_SHIFT (18U) -/*! IREN - Infrared enable - * 0b0..IR disabled. - * 0b1..IR enabled. - */ -#define LPUART_MODIR_IREN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_IREN_SHIFT)) & LPUART_MODIR_IREN_MASK) -/*! @} */ - -/*! @name FIFO - LPUART FIFO Register */ -/*! @{ */ - -#define LPUART_FIFO_RXFIFOSIZE_MASK (0x7U) -#define LPUART_FIFO_RXFIFOSIZE_SHIFT (0U) -/*! RXFIFOSIZE - Receive FIFO Buffer Depth - * 0b000..Receive FIFO/Buffer depth = 1 dataword. - * 0b001..Receive FIFO/Buffer depth = 4 datawords. - * 0b010..Receive FIFO/Buffer depth = 8 datawords. - * 0b011..Receive FIFO/Buffer depth = 16 datawords. - * 0b100..Receive FIFO/Buffer depth = 32 datawords. - * 0b101..Receive FIFO/Buffer depth = 64 datawords. - * 0b110..Receive FIFO/Buffer depth = 128 datawords. - * 0b111..Receive FIFO/Buffer depth = 256 datawords. - */ -#define LPUART_FIFO_RXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFIFOSIZE_SHIFT)) & LPUART_FIFO_RXFIFOSIZE_MASK) - -#define LPUART_FIFO_RXFE_MASK (0x8U) -#define LPUART_FIFO_RXFE_SHIFT (3U) -/*! RXFE - Receive FIFO Enable - * 0b0..Receive FIFO is not enabled. Buffer is depth 1. - * 0b1..Receive FIFO is enabled. Buffer is depth indicted by RXFIFOSIZE. - */ -#define LPUART_FIFO_RXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFE_SHIFT)) & LPUART_FIFO_RXFE_MASK) - -#define LPUART_FIFO_TXFIFOSIZE_MASK (0x70U) -#define LPUART_FIFO_TXFIFOSIZE_SHIFT (4U) -/*! TXFIFOSIZE - Transmit FIFO Buffer Depth - * 0b000..Transmit FIFO/Buffer depth = 1 dataword. - * 0b001..Transmit FIFO/Buffer depth = 4 datawords. - * 0b010..Transmit FIFO/Buffer depth = 8 datawords. - * 0b011..Transmit FIFO/Buffer depth = 16 datawords. - * 0b100..Transmit FIFO/Buffer depth = 32 datawords. - * 0b101..Transmit FIFO/Buffer depth = 64 datawords. - * 0b110..Transmit FIFO/Buffer depth = 128 datawords. - * 0b111..Transmit FIFO/Buffer depth = 256 datawords - */ -#define LPUART_FIFO_TXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFIFOSIZE_SHIFT)) & LPUART_FIFO_TXFIFOSIZE_MASK) - -#define LPUART_FIFO_TXFE_MASK (0x80U) -#define LPUART_FIFO_TXFE_SHIFT (7U) -/*! TXFE - Transmit FIFO Enable - * 0b0..Transmit FIFO is not enabled. Buffer is depth 1. - * 0b1..Transmit FIFO is enabled. Buffer is depth indicated by TXFIFOSIZE. - */ -#define LPUART_FIFO_TXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFE_SHIFT)) & LPUART_FIFO_TXFE_MASK) - -#define LPUART_FIFO_RXUFE_MASK (0x100U) -#define LPUART_FIFO_RXUFE_SHIFT (8U) -/*! RXUFE - Receive FIFO Underflow Interrupt Enable - * 0b0..RXUF flag does not generate an interrupt to the host. - * 0b1..RXUF flag generates an interrupt to the host. - */ -#define LPUART_FIFO_RXUFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUFE_SHIFT)) & LPUART_FIFO_RXUFE_MASK) - -#define LPUART_FIFO_TXOFE_MASK (0x200U) -#define LPUART_FIFO_TXOFE_SHIFT (9U) -/*! TXOFE - Transmit FIFO Overflow Interrupt Enable - * 0b0..TXOF flag does not generate an interrupt to the host. - * 0b1..TXOF flag generates an interrupt to the host. - */ -#define LPUART_FIFO_TXOFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOFE_SHIFT)) & LPUART_FIFO_TXOFE_MASK) - -#define LPUART_FIFO_RXIDEN_MASK (0x1C00U) -#define LPUART_FIFO_RXIDEN_SHIFT (10U) -/*! RXIDEN - Receiver Idle Empty Enable - * 0b000..Disable RDRF assertion due to partially filled FIFO when receiver is idle. - * 0b001..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 1 character. - * 0b010..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 2 characters. - * 0b011..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 4 characters. - * 0b100..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 8 characters. - * 0b101..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 16 characters. - * 0b110..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 32 characters. - * 0b111..Enable RDRF assertion due to partially filled FIFO when receiver is idle for 64 characters. - */ -#define LPUART_FIFO_RXIDEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXIDEN_SHIFT)) & LPUART_FIFO_RXIDEN_MASK) - -#define LPUART_FIFO_RXFLUSH_MASK (0x4000U) -#define LPUART_FIFO_RXFLUSH_SHIFT (14U) -/*! RXFLUSH - Receive FIFO/Buffer Flush - * 0b0..No flush operation occurs. - * 0b1..All data in the receive FIFO/buffer is cleared out. - */ -#define LPUART_FIFO_RXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFLUSH_SHIFT)) & LPUART_FIFO_RXFLUSH_MASK) - -#define LPUART_FIFO_TXFLUSH_MASK (0x8000U) -#define LPUART_FIFO_TXFLUSH_SHIFT (15U) -/*! TXFLUSH - Transmit FIFO/Buffer Flush - * 0b0..No flush operation occurs. - * 0b1..All data in the transmit FIFO/Buffer is cleared out. - */ -#define LPUART_FIFO_TXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFLUSH_SHIFT)) & LPUART_FIFO_TXFLUSH_MASK) - -#define LPUART_FIFO_RXUF_MASK (0x10000U) -#define LPUART_FIFO_RXUF_SHIFT (16U) -/*! RXUF - Receiver Buffer Underflow Flag - * 0b0..No receive buffer underflow has occurred since the last time the flag was cleared. - * 0b1..At least one receive buffer underflow has occurred since the last time the flag was cleared. - */ -#define LPUART_FIFO_RXUF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUF_SHIFT)) & LPUART_FIFO_RXUF_MASK) - -#define LPUART_FIFO_TXOF_MASK (0x20000U) -#define LPUART_FIFO_TXOF_SHIFT (17U) -/*! TXOF - Transmitter Buffer Overflow Flag - * 0b0..No transmit buffer overflow has occurred since the last time the flag was cleared. - * 0b1..At least one transmit buffer overflow has occurred since the last time the flag was cleared. - */ -#define LPUART_FIFO_TXOF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOF_SHIFT)) & LPUART_FIFO_TXOF_MASK) - -#define LPUART_FIFO_RXEMPT_MASK (0x400000U) -#define LPUART_FIFO_RXEMPT_SHIFT (22U) -/*! RXEMPT - Receive Buffer/FIFO Empty - * 0b0..Receive buffer is not empty. - * 0b1..Receive buffer is empty. - */ -#define LPUART_FIFO_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXEMPT_SHIFT)) & LPUART_FIFO_RXEMPT_MASK) - -#define LPUART_FIFO_TXEMPT_MASK (0x800000U) -#define LPUART_FIFO_TXEMPT_SHIFT (23U) -/*! TXEMPT - Transmit Buffer/FIFO Empty - * 0b0..Transmit buffer is not empty. - * 0b1..Transmit buffer is empty. - */ -#define LPUART_FIFO_TXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXEMPT_SHIFT)) & LPUART_FIFO_TXEMPT_MASK) -/*! @} */ - -/*! @name WATER - LPUART Watermark Register */ -/*! @{ */ - -#define LPUART_WATER_TXWATER_MASK (0x3U) -#define LPUART_WATER_TXWATER_SHIFT (0U) -/*! TXWATER - Transmit Watermark - */ -#define LPUART_WATER_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXWATER_SHIFT)) & LPUART_WATER_TXWATER_MASK) - -#define LPUART_WATER_TXCOUNT_MASK (0x700U) -#define LPUART_WATER_TXCOUNT_SHIFT (8U) -/*! TXCOUNT - Transmit Counter - */ -#define LPUART_WATER_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXCOUNT_SHIFT)) & LPUART_WATER_TXCOUNT_MASK) - -#define LPUART_WATER_RXWATER_MASK (0x30000U) -#define LPUART_WATER_RXWATER_SHIFT (16U) -/*! RXWATER - Receive Watermark - */ -#define LPUART_WATER_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXWATER_SHIFT)) & LPUART_WATER_RXWATER_MASK) - -#define LPUART_WATER_RXCOUNT_MASK (0x7000000U) -#define LPUART_WATER_RXCOUNT_SHIFT (24U) -/*! RXCOUNT - Receive Counter - */ -#define LPUART_WATER_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXCOUNT_SHIFT)) & LPUART_WATER_RXCOUNT_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group LPUART_Register_Masks */ - - -/* LPUART - Peripheral instance base addresses */ -/** Peripheral LPUART1 base address */ -#define LPUART1_BASE (0x40184000u) -/** Peripheral LPUART1 base pointer */ -#define LPUART1 ((LPUART_Type *)LPUART1_BASE) -/** Peripheral LPUART2 base address */ -#define LPUART2_BASE (0x40188000u) -/** Peripheral LPUART2 base pointer */ -#define LPUART2 ((LPUART_Type *)LPUART2_BASE) -/** Peripheral LPUART3 base address */ -#define LPUART3_BASE (0x4018C000u) -/** Peripheral LPUART3 base pointer */ -#define LPUART3 ((LPUART_Type *)LPUART3_BASE) -/** Peripheral LPUART4 base address */ -#define LPUART4_BASE (0x40190000u) -/** Peripheral LPUART4 base pointer */ -#define LPUART4 ((LPUART_Type *)LPUART4_BASE) -/** Peripheral LPUART5 base address */ -#define LPUART5_BASE (0x40194000u) -/** Peripheral LPUART5 base pointer */ -#define LPUART5 ((LPUART_Type *)LPUART5_BASE) -/** Peripheral LPUART6 base address */ -#define LPUART6_BASE (0x40198000u) -/** Peripheral LPUART6 base pointer */ -#define LPUART6 ((LPUART_Type *)LPUART6_BASE) -/** Peripheral LPUART7 base address */ -#define LPUART7_BASE (0x4019C000u) -/** Peripheral LPUART7 base pointer */ -#define LPUART7 ((LPUART_Type *)LPUART7_BASE) -/** Peripheral LPUART8 base address */ -#define LPUART8_BASE (0x401A0000u) -/** Peripheral LPUART8 base pointer */ -#define LPUART8 ((LPUART_Type *)LPUART8_BASE) -/** Array initializer of LPUART peripheral base addresses */ -#define LPUART_BASE_ADDRS { 0u, LPUART1_BASE, LPUART2_BASE, LPUART3_BASE, LPUART4_BASE, LPUART5_BASE, LPUART6_BASE, LPUART7_BASE, LPUART8_BASE } -/** Array initializer of LPUART peripheral base pointers */ -#define LPUART_BASE_PTRS { (LPUART_Type *)0u, LPUART1, LPUART2, LPUART3, LPUART4, LPUART5, LPUART6, LPUART7, LPUART8 } -/** Interrupt vectors for the LPUART peripheral type */ -#define LPUART_RX_TX_IRQS { NotAvail_IRQn, LPUART1_IRQn, LPUART2_IRQn, LPUART3_IRQn, LPUART4_IRQn, LPUART5_IRQn, LPUART6_IRQn, LPUART7_IRQn, LPUART8_IRQn } - -/*! - * @} - */ /* end of group LPUART_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- OCOTP Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup OCOTP_Peripheral_Access_Layer OCOTP Peripheral Access Layer - * @{ - */ - -/** OCOTP - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< OTP Controller Control Register, offset: 0x0 */ - __IO uint32_t CTRL_SET; /**< OTP Controller Control Register, offset: 0x4 */ - __IO uint32_t CTRL_CLR; /**< OTP Controller Control Register, offset: 0x8 */ - __IO uint32_t CTRL_TOG; /**< OTP Controller Control Register, offset: 0xC */ - __IO uint32_t TIMING; /**< OTP Controller Timing Register, offset: 0x10 */ - uint8_t RESERVED_0[12]; - __IO uint32_t DATA; /**< OTP Controller Write Data Register, offset: 0x20 */ - uint8_t RESERVED_1[12]; - __IO uint32_t READ_CTRL; /**< OTP Controller Write Data Register, offset: 0x30 */ - uint8_t RESERVED_2[12]; - __IO uint32_t READ_FUSE_DATA; /**< OTP Controller Read Data Register, offset: 0x40 */ - uint8_t RESERVED_3[12]; - __IO uint32_t SW_STICKY; /**< Sticky bit Register, offset: 0x50 */ - uint8_t RESERVED_4[12]; - __IO uint32_t SCS; /**< Software Controllable Signals Register, offset: 0x60 */ - __IO uint32_t SCS_SET; /**< Software Controllable Signals Register, offset: 0x64 */ - __IO uint32_t SCS_CLR; /**< Software Controllable Signals Register, offset: 0x68 */ - __IO uint32_t SCS_TOG; /**< Software Controllable Signals Register, offset: 0x6C */ - uint8_t RESERVED_5[32]; - __I uint32_t VERSION; /**< OTP Controller Version Register, offset: 0x90 */ - uint8_t RESERVED_6[108]; - __IO uint32_t TIMING2; /**< OTP Controller Timing Register 2, offset: 0x100 */ - uint8_t RESERVED_7[764]; - __IO uint32_t LOCK; /**< Value of OTP Bank0 Word0 (Lock controls), offset: 0x400 */ - uint8_t RESERVED_8[12]; - __IO uint32_t CFG0; /**< Value of OTP Bank0 Word1 (Configuration and Manufacturing Info.), offset: 0x410 */ - uint8_t RESERVED_9[12]; - __IO uint32_t CFG1; /**< Value of OTP Bank0 Word2 (Configuration and Manufacturing Info.), offset: 0x420 */ - uint8_t RESERVED_10[12]; - __IO uint32_t CFG2; /**< Value of OTP Bank0 Word3 (Configuration and Manufacturing Info.), offset: 0x430 */ - uint8_t RESERVED_11[12]; - __IO uint32_t CFG3; /**< Value of OTP Bank0 Word4 (Configuration and Manufacturing Info.), offset: 0x440 */ - uint8_t RESERVED_12[12]; - __IO uint32_t CFG4; /**< Value of OTP Bank0 Word5 (Configuration and Manufacturing Info.), offset: 0x450 */ - uint8_t RESERVED_13[12]; - __IO uint32_t CFG5; /**< Value of OTP Bank0 Word6 (Configuration and Manufacturing Info.), offset: 0x460 */ - uint8_t RESERVED_14[12]; - __IO uint32_t CFG6; /**< Value of OTP Bank0 Word7 (Configuration and Manufacturing Info.), offset: 0x470 */ - uint8_t RESERVED_15[12]; - __IO uint32_t MEM0; /**< Value of OTP Bank1 Word0 (Memory Related Info.), offset: 0x480 */ - uint8_t RESERVED_16[12]; - __IO uint32_t MEM1; /**< Value of OTP Bank1 Word1 (Memory Related Info.), offset: 0x490 */ - uint8_t RESERVED_17[12]; - __IO uint32_t MEM2; /**< Value of OTP Bank1 Word2 (Memory Related Info.), offset: 0x4A0 */ - uint8_t RESERVED_18[12]; - __IO uint32_t MEM3; /**< Value of OTP Bank1 Word3 (Memory Related Info.), offset: 0x4B0 */ - uint8_t RESERVED_19[12]; - __IO uint32_t MEM4; /**< Value of OTP Bank1 Word4 (Memory Related Info.), offset: 0x4C0 */ - uint8_t RESERVED_20[12]; - __IO uint32_t ANA0; /**< Value of OTP Bank1 Word5 (Analog Info.), offset: 0x4D0 */ - uint8_t RESERVED_21[12]; - __IO uint32_t ANA1; /**< Value of OTP Bank1 Word6 (Analog Info.), offset: 0x4E0 */ - uint8_t RESERVED_22[12]; - __IO uint32_t ANA2; /**< Value of OTP Bank1 Word7 (Analog Info.), offset: 0x4F0 */ - uint8_t RESERVED_23[140]; - __IO uint32_t SRK0; /**< Shadow Register for OTP Bank3 Word0 (SRK Hash), offset: 0x580 */ - uint8_t RESERVED_24[12]; - __IO uint32_t SRK1; /**< Shadow Register for OTP Bank3 Word1 (SRK Hash), offset: 0x590 */ - uint8_t RESERVED_25[12]; - __IO uint32_t SRK2; /**< Shadow Register for OTP Bank3 Word2 (SRK Hash), offset: 0x5A0 */ - uint8_t RESERVED_26[12]; - __IO uint32_t SRK3; /**< Shadow Register for OTP Bank3 Word3 (SRK Hash), offset: 0x5B0 */ - uint8_t RESERVED_27[12]; - __IO uint32_t SRK4; /**< Shadow Register for OTP Bank3 Word4 (SRK Hash), offset: 0x5C0 */ - uint8_t RESERVED_28[12]; - __IO uint32_t SRK5; /**< Shadow Register for OTP Bank3 Word5 (SRK Hash), offset: 0x5D0 */ - uint8_t RESERVED_29[12]; - __IO uint32_t SRK6; /**< Shadow Register for OTP Bank3 Word6 (SRK Hash), offset: 0x5E0 */ - uint8_t RESERVED_30[12]; - __IO uint32_t SRK7; /**< Shadow Register for OTP Bank3 Word7 (SRK Hash), offset: 0x5F0 */ - uint8_t RESERVED_31[12]; - __IO uint32_t SJC_RESP0; /**< Value of OTP Bank4 Word0 (Secure JTAG Response Field), offset: 0x600 */ - uint8_t RESERVED_32[12]; - __IO uint32_t SJC_RESP1; /**< Value of OTP Bank4 Word1 (Secure JTAG Response Field), offset: 0x610 */ - uint8_t RESERVED_33[12]; - __IO uint32_t MAC0; /**< Value of OTP Bank4 Word2 (MAC Address), offset: 0x620 */ - uint8_t RESERVED_34[12]; - __IO uint32_t MAC1; /**< Value of OTP Bank4 Word3 (MAC Address), offset: 0x630 */ - uint8_t RESERVED_35[12]; - __IO uint32_t GP3; /**< Value of OTP Bank4 Word4 (MAC Address), offset: 0x640 */ - uint8_t RESERVED_36[28]; - __IO uint32_t GP1; /**< Value of OTP Bank4 Word6 (General Purpose Customer Defined Info), offset: 0x660 */ - uint8_t RESERVED_37[12]; - __IO uint32_t GP2; /**< Value of OTP Bank4 Word7 (General Purpose Customer Defined Info), offset: 0x670 */ - uint8_t RESERVED_38[12]; - __IO uint32_t SW_GP1; /**< Value of OTP Bank5 Word0 (SW GP1), offset: 0x680 */ - uint8_t RESERVED_39[12]; - __IO uint32_t SW_GP20; /**< Value of OTP Bank5 Word1 (SW GP2), offset: 0x690 */ - uint8_t RESERVED_40[12]; - __IO uint32_t SW_GP21; /**< Value of OTP Bank5 Word2 (SW GP2), offset: 0x6A0 */ - uint8_t RESERVED_41[12]; - __IO uint32_t SW_GP22; /**< Value of OTP Bank5 Word3 (SW GP2), offset: 0x6B0 */ - uint8_t RESERVED_42[12]; - __IO uint32_t SW_GP23; /**< Value of OTP Bank5 Word4 (SW GP2), offset: 0x6C0 */ - uint8_t RESERVED_43[12]; - __IO uint32_t MISC_CONF0; /**< Value of OTP Bank5 Word5 (Misc Conf), offset: 0x6D0 */ - uint8_t RESERVED_44[12]; - __IO uint32_t MISC_CONF1; /**< Value of OTP Bank5 Word6 (Misc Conf), offset: 0x6E0 */ - uint8_t RESERVED_45[12]; - __IO uint32_t SRK_REVOKE; /**< Value of OTP Bank5 Word7 (SRK Revoke), offset: 0x6F0 */ -} OCOTP_Type; - -/* ---------------------------------------------------------------------------- - -- OCOTP Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup OCOTP_Register_Masks OCOTP Register Masks - * @{ - */ - -/*! @name CTRL - OTP Controller Control Register */ -/*! @{ */ - -#define OCOTP_CTRL_ADDR_MASK (0x3FU) -#define OCOTP_CTRL_ADDR_SHIFT (0U) -#define OCOTP_CTRL_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_ADDR_SHIFT)) & OCOTP_CTRL_ADDR_MASK) - -#define OCOTP_CTRL_BUSY_MASK (0x100U) -#define OCOTP_CTRL_BUSY_SHIFT (8U) -#define OCOTP_CTRL_BUSY(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_BUSY_SHIFT)) & OCOTP_CTRL_BUSY_MASK) - -#define OCOTP_CTRL_ERROR_MASK (0x200U) -#define OCOTP_CTRL_ERROR_SHIFT (9U) -#define OCOTP_CTRL_ERROR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_ERROR_SHIFT)) & OCOTP_CTRL_ERROR_MASK) - -#define OCOTP_CTRL_RELOAD_SHADOWS_MASK (0x400U) -#define OCOTP_CTRL_RELOAD_SHADOWS_SHIFT (10U) -#define OCOTP_CTRL_RELOAD_SHADOWS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_RELOAD_SHADOWS_SHIFT)) & OCOTP_CTRL_RELOAD_SHADOWS_MASK) - -#define OCOTP_CTRL_WR_UNLOCK_MASK (0xFFFF0000U) -#define OCOTP_CTRL_WR_UNLOCK_SHIFT (16U) -#define OCOTP_CTRL_WR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_WR_UNLOCK_SHIFT)) & OCOTP_CTRL_WR_UNLOCK_MASK) -/*! @} */ - -/*! @name CTRL_SET - OTP Controller Control Register */ -/*! @{ */ - -#define OCOTP_CTRL_SET_ADDR_MASK (0x3FU) -#define OCOTP_CTRL_SET_ADDR_SHIFT (0U) -#define OCOTP_CTRL_SET_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_SET_ADDR_SHIFT)) & OCOTP_CTRL_SET_ADDR_MASK) - -#define OCOTP_CTRL_SET_BUSY_MASK (0x100U) -#define OCOTP_CTRL_SET_BUSY_SHIFT (8U) -#define OCOTP_CTRL_SET_BUSY(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_SET_BUSY_SHIFT)) & OCOTP_CTRL_SET_BUSY_MASK) - -#define OCOTP_CTRL_SET_ERROR_MASK (0x200U) -#define OCOTP_CTRL_SET_ERROR_SHIFT (9U) -#define OCOTP_CTRL_SET_ERROR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_SET_ERROR_SHIFT)) & OCOTP_CTRL_SET_ERROR_MASK) - -#define OCOTP_CTRL_SET_RELOAD_SHADOWS_MASK (0x400U) -#define OCOTP_CTRL_SET_RELOAD_SHADOWS_SHIFT (10U) -#define OCOTP_CTRL_SET_RELOAD_SHADOWS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_SET_RELOAD_SHADOWS_SHIFT)) & OCOTP_CTRL_SET_RELOAD_SHADOWS_MASK) - -#define OCOTP_CTRL_SET_WR_UNLOCK_MASK (0xFFFF0000U) -#define OCOTP_CTRL_SET_WR_UNLOCK_SHIFT (16U) -#define OCOTP_CTRL_SET_WR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_SET_WR_UNLOCK_SHIFT)) & OCOTP_CTRL_SET_WR_UNLOCK_MASK) -/*! @} */ - -/*! @name CTRL_CLR - OTP Controller Control Register */ -/*! @{ */ - -#define OCOTP_CTRL_CLR_ADDR_MASK (0x3FU) -#define OCOTP_CTRL_CLR_ADDR_SHIFT (0U) -#define OCOTP_CTRL_CLR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_CLR_ADDR_SHIFT)) & OCOTP_CTRL_CLR_ADDR_MASK) - -#define OCOTP_CTRL_CLR_BUSY_MASK (0x100U) -#define OCOTP_CTRL_CLR_BUSY_SHIFT (8U) -#define OCOTP_CTRL_CLR_BUSY(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_CLR_BUSY_SHIFT)) & OCOTP_CTRL_CLR_BUSY_MASK) - -#define OCOTP_CTRL_CLR_ERROR_MASK (0x200U) -#define OCOTP_CTRL_CLR_ERROR_SHIFT (9U) -#define OCOTP_CTRL_CLR_ERROR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_CLR_ERROR_SHIFT)) & OCOTP_CTRL_CLR_ERROR_MASK) - -#define OCOTP_CTRL_CLR_RELOAD_SHADOWS_MASK (0x400U) -#define OCOTP_CTRL_CLR_RELOAD_SHADOWS_SHIFT (10U) -#define OCOTP_CTRL_CLR_RELOAD_SHADOWS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_CLR_RELOAD_SHADOWS_SHIFT)) & OCOTP_CTRL_CLR_RELOAD_SHADOWS_MASK) - -#define OCOTP_CTRL_CLR_WR_UNLOCK_MASK (0xFFFF0000U) -#define OCOTP_CTRL_CLR_WR_UNLOCK_SHIFT (16U) -#define OCOTP_CTRL_CLR_WR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_CLR_WR_UNLOCK_SHIFT)) & OCOTP_CTRL_CLR_WR_UNLOCK_MASK) -/*! @} */ - -/*! @name CTRL_TOG - OTP Controller Control Register */ -/*! @{ */ - -#define OCOTP_CTRL_TOG_ADDR_MASK (0x3FU) -#define OCOTP_CTRL_TOG_ADDR_SHIFT (0U) -#define OCOTP_CTRL_TOG_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_TOG_ADDR_SHIFT)) & OCOTP_CTRL_TOG_ADDR_MASK) - -#define OCOTP_CTRL_TOG_BUSY_MASK (0x100U) -#define OCOTP_CTRL_TOG_BUSY_SHIFT (8U) -#define OCOTP_CTRL_TOG_BUSY(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_TOG_BUSY_SHIFT)) & OCOTP_CTRL_TOG_BUSY_MASK) - -#define OCOTP_CTRL_TOG_ERROR_MASK (0x200U) -#define OCOTP_CTRL_TOG_ERROR_SHIFT (9U) -#define OCOTP_CTRL_TOG_ERROR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_TOG_ERROR_SHIFT)) & OCOTP_CTRL_TOG_ERROR_MASK) - -#define OCOTP_CTRL_TOG_RELOAD_SHADOWS_MASK (0x400U) -#define OCOTP_CTRL_TOG_RELOAD_SHADOWS_SHIFT (10U) -#define OCOTP_CTRL_TOG_RELOAD_SHADOWS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_TOG_RELOAD_SHADOWS_SHIFT)) & OCOTP_CTRL_TOG_RELOAD_SHADOWS_MASK) - -#define OCOTP_CTRL_TOG_WR_UNLOCK_MASK (0xFFFF0000U) -#define OCOTP_CTRL_TOG_WR_UNLOCK_SHIFT (16U) -#define OCOTP_CTRL_TOG_WR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CTRL_TOG_WR_UNLOCK_SHIFT)) & OCOTP_CTRL_TOG_WR_UNLOCK_MASK) -/*! @} */ - -/*! @name TIMING - OTP Controller Timing Register */ -/*! @{ */ - -#define OCOTP_TIMING_STROBE_PROG_MASK (0xFFFU) -#define OCOTP_TIMING_STROBE_PROG_SHIFT (0U) -#define OCOTP_TIMING_STROBE_PROG(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING_STROBE_PROG_SHIFT)) & OCOTP_TIMING_STROBE_PROG_MASK) - -#define OCOTP_TIMING_RELAX_MASK (0xF000U) -#define OCOTP_TIMING_RELAX_SHIFT (12U) -#define OCOTP_TIMING_RELAX(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING_RELAX_SHIFT)) & OCOTP_TIMING_RELAX_MASK) - -#define OCOTP_TIMING_STROBE_READ_MASK (0x3F0000U) -#define OCOTP_TIMING_STROBE_READ_SHIFT (16U) -#define OCOTP_TIMING_STROBE_READ(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING_STROBE_READ_SHIFT)) & OCOTP_TIMING_STROBE_READ_MASK) - -#define OCOTP_TIMING_WAIT_MASK (0xFC00000U) -#define OCOTP_TIMING_WAIT_SHIFT (22U) -#define OCOTP_TIMING_WAIT(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING_WAIT_SHIFT)) & OCOTP_TIMING_WAIT_MASK) -/*! @} */ - -/*! @name DATA - OTP Controller Write Data Register */ -/*! @{ */ - -#define OCOTP_DATA_DATA_MASK (0xFFFFFFFFU) -#define OCOTP_DATA_DATA_SHIFT (0U) -#define OCOTP_DATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_DATA_DATA_SHIFT)) & OCOTP_DATA_DATA_MASK) -/*! @} */ - -/*! @name READ_CTRL - OTP Controller Write Data Register */ -/*! @{ */ - -#define OCOTP_READ_CTRL_READ_FUSE_MASK (0x1U) -#define OCOTP_READ_CTRL_READ_FUSE_SHIFT (0U) -#define OCOTP_READ_CTRL_READ_FUSE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_READ_CTRL_READ_FUSE_SHIFT)) & OCOTP_READ_CTRL_READ_FUSE_MASK) -/*! @} */ - -/*! @name READ_FUSE_DATA - OTP Controller Read Data Register */ -/*! @{ */ - -#define OCOTP_READ_FUSE_DATA_DATA_MASK (0xFFFFFFFFU) -#define OCOTP_READ_FUSE_DATA_DATA_SHIFT (0U) -#define OCOTP_READ_FUSE_DATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_READ_FUSE_DATA_DATA_SHIFT)) & OCOTP_READ_FUSE_DATA_DATA_MASK) -/*! @} */ - -/*! @name SW_STICKY - Sticky bit Register */ -/*! @{ */ - -#define OCOTP_SW_STICKY_BLOCK_DTCP_KEY_MASK (0x1U) -#define OCOTP_SW_STICKY_BLOCK_DTCP_KEY_SHIFT (0U) -#define OCOTP_SW_STICKY_BLOCK_DTCP_KEY(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_STICKY_BLOCK_DTCP_KEY_SHIFT)) & OCOTP_SW_STICKY_BLOCK_DTCP_KEY_MASK) - -#define OCOTP_SW_STICKY_SRK_REVOKE_LOCK_MASK (0x2U) -#define OCOTP_SW_STICKY_SRK_REVOKE_LOCK_SHIFT (1U) -#define OCOTP_SW_STICKY_SRK_REVOKE_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_STICKY_SRK_REVOKE_LOCK_SHIFT)) & OCOTP_SW_STICKY_SRK_REVOKE_LOCK_MASK) - -#define OCOTP_SW_STICKY_FIELD_RETURN_LOCK_MASK (0x4U) -#define OCOTP_SW_STICKY_FIELD_RETURN_LOCK_SHIFT (2U) -#define OCOTP_SW_STICKY_FIELD_RETURN_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_STICKY_FIELD_RETURN_LOCK_SHIFT)) & OCOTP_SW_STICKY_FIELD_RETURN_LOCK_MASK) - -#define OCOTP_SW_STICKY_BLOCK_ROM_PART_MASK (0x8U) -#define OCOTP_SW_STICKY_BLOCK_ROM_PART_SHIFT (3U) -#define OCOTP_SW_STICKY_BLOCK_ROM_PART(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_STICKY_BLOCK_ROM_PART_SHIFT)) & OCOTP_SW_STICKY_BLOCK_ROM_PART_MASK) - -#define OCOTP_SW_STICKY_JTAG_BLOCK_RELEASE_MASK (0x10U) -#define OCOTP_SW_STICKY_JTAG_BLOCK_RELEASE_SHIFT (4U) -#define OCOTP_SW_STICKY_JTAG_BLOCK_RELEASE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_STICKY_JTAG_BLOCK_RELEASE_SHIFT)) & OCOTP_SW_STICKY_JTAG_BLOCK_RELEASE_MASK) -/*! @} */ - -/*! @name SCS - Software Controllable Signals Register */ -/*! @{ */ - -#define OCOTP_SCS_HAB_JDE_MASK (0x1U) -#define OCOTP_SCS_HAB_JDE_SHIFT (0U) -#define OCOTP_SCS_HAB_JDE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_HAB_JDE_SHIFT)) & OCOTP_SCS_HAB_JDE_MASK) - -#define OCOTP_SCS_SPARE_MASK (0x7FFFFFFEU) -#define OCOTP_SCS_SPARE_SHIFT (1U) -#define OCOTP_SCS_SPARE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_SPARE_SHIFT)) & OCOTP_SCS_SPARE_MASK) - -#define OCOTP_SCS_LOCK_MASK (0x80000000U) -#define OCOTP_SCS_LOCK_SHIFT (31U) -#define OCOTP_SCS_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_LOCK_SHIFT)) & OCOTP_SCS_LOCK_MASK) -/*! @} */ - -/*! @name SCS_SET - Software Controllable Signals Register */ -/*! @{ */ - -#define OCOTP_SCS_SET_HAB_JDE_MASK (0x1U) -#define OCOTP_SCS_SET_HAB_JDE_SHIFT (0U) -#define OCOTP_SCS_SET_HAB_JDE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_SET_HAB_JDE_SHIFT)) & OCOTP_SCS_SET_HAB_JDE_MASK) - -#define OCOTP_SCS_SET_SPARE_MASK (0x7FFFFFFEU) -#define OCOTP_SCS_SET_SPARE_SHIFT (1U) -#define OCOTP_SCS_SET_SPARE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_SET_SPARE_SHIFT)) & OCOTP_SCS_SET_SPARE_MASK) - -#define OCOTP_SCS_SET_LOCK_MASK (0x80000000U) -#define OCOTP_SCS_SET_LOCK_SHIFT (31U) -#define OCOTP_SCS_SET_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_SET_LOCK_SHIFT)) & OCOTP_SCS_SET_LOCK_MASK) -/*! @} */ - -/*! @name SCS_CLR - Software Controllable Signals Register */ -/*! @{ */ - -#define OCOTP_SCS_CLR_HAB_JDE_MASK (0x1U) -#define OCOTP_SCS_CLR_HAB_JDE_SHIFT (0U) -#define OCOTP_SCS_CLR_HAB_JDE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_CLR_HAB_JDE_SHIFT)) & OCOTP_SCS_CLR_HAB_JDE_MASK) - -#define OCOTP_SCS_CLR_SPARE_MASK (0x7FFFFFFEU) -#define OCOTP_SCS_CLR_SPARE_SHIFT (1U) -#define OCOTP_SCS_CLR_SPARE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_CLR_SPARE_SHIFT)) & OCOTP_SCS_CLR_SPARE_MASK) - -#define OCOTP_SCS_CLR_LOCK_MASK (0x80000000U) -#define OCOTP_SCS_CLR_LOCK_SHIFT (31U) -#define OCOTP_SCS_CLR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_CLR_LOCK_SHIFT)) & OCOTP_SCS_CLR_LOCK_MASK) -/*! @} */ - -/*! @name SCS_TOG - Software Controllable Signals Register */ -/*! @{ */ - -#define OCOTP_SCS_TOG_HAB_JDE_MASK (0x1U) -#define OCOTP_SCS_TOG_HAB_JDE_SHIFT (0U) -#define OCOTP_SCS_TOG_HAB_JDE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_TOG_HAB_JDE_SHIFT)) & OCOTP_SCS_TOG_HAB_JDE_MASK) - -#define OCOTP_SCS_TOG_SPARE_MASK (0x7FFFFFFEU) -#define OCOTP_SCS_TOG_SPARE_SHIFT (1U) -#define OCOTP_SCS_TOG_SPARE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_TOG_SPARE_SHIFT)) & OCOTP_SCS_TOG_SPARE_MASK) - -#define OCOTP_SCS_TOG_LOCK_MASK (0x80000000U) -#define OCOTP_SCS_TOG_LOCK_SHIFT (31U) -#define OCOTP_SCS_TOG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SCS_TOG_LOCK_SHIFT)) & OCOTP_SCS_TOG_LOCK_MASK) -/*! @} */ - -/*! @name VERSION - OTP Controller Version Register */ -/*! @{ */ - -#define OCOTP_VERSION_STEP_MASK (0xFFFFU) -#define OCOTP_VERSION_STEP_SHIFT (0U) -#define OCOTP_VERSION_STEP(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_VERSION_STEP_SHIFT)) & OCOTP_VERSION_STEP_MASK) - -#define OCOTP_VERSION_MINOR_MASK (0xFF0000U) -#define OCOTP_VERSION_MINOR_SHIFT (16U) -#define OCOTP_VERSION_MINOR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_VERSION_MINOR_SHIFT)) & OCOTP_VERSION_MINOR_MASK) - -#define OCOTP_VERSION_MAJOR_MASK (0xFF000000U) -#define OCOTP_VERSION_MAJOR_SHIFT (24U) -#define OCOTP_VERSION_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_VERSION_MAJOR_SHIFT)) & OCOTP_VERSION_MAJOR_MASK) -/*! @} */ - -/*! @name TIMING2 - OTP Controller Timing Register 2 */ -/*! @{ */ - -#define OCOTP_TIMING2_RELAX_PROG_MASK (0xFFFU) -#define OCOTP_TIMING2_RELAX_PROG_SHIFT (0U) -#define OCOTP_TIMING2_RELAX_PROG(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING2_RELAX_PROG_SHIFT)) & OCOTP_TIMING2_RELAX_PROG_MASK) - -#define OCOTP_TIMING2_RELAX_READ_MASK (0x3F0000U) -#define OCOTP_TIMING2_RELAX_READ_SHIFT (16U) -#define OCOTP_TIMING2_RELAX_READ(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING2_RELAX_READ_SHIFT)) & OCOTP_TIMING2_RELAX_READ_MASK) - -#define OCOTP_TIMING2_RELAX1_MASK (0x1FC00000U) -#define OCOTP_TIMING2_RELAX1_SHIFT (22U) -#define OCOTP_TIMING2_RELAX1(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_TIMING2_RELAX1_SHIFT)) & OCOTP_TIMING2_RELAX1_MASK) -/*! @} */ - -/*! @name LOCK - Value of OTP Bank0 Word0 (Lock controls) */ -/*! @{ */ - -#define OCOTP_LOCK_TESTER_MASK (0x3U) -#define OCOTP_LOCK_TESTER_SHIFT (0U) -#define OCOTP_LOCK_TESTER(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_TESTER_SHIFT)) & OCOTP_LOCK_TESTER_MASK) - -#define OCOTP_LOCK_BOOT_CFG_MASK (0xCU) -#define OCOTP_LOCK_BOOT_CFG_SHIFT (2U) -#define OCOTP_LOCK_BOOT_CFG(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_BOOT_CFG_SHIFT)) & OCOTP_LOCK_BOOT_CFG_MASK) - -#define OCOTP_LOCK_MEM_TRIM_MASK (0x30U) -#define OCOTP_LOCK_MEM_TRIM_SHIFT (4U) -#define OCOTP_LOCK_MEM_TRIM(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_MEM_TRIM_SHIFT)) & OCOTP_LOCK_MEM_TRIM_MASK) - -#define OCOTP_LOCK_SJC_RESP_MASK (0x40U) -#define OCOTP_LOCK_SJC_RESP_SHIFT (6U) -#define OCOTP_LOCK_SJC_RESP(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_SJC_RESP_SHIFT)) & OCOTP_LOCK_SJC_RESP_MASK) - -#define OCOTP_LOCK_MAC_ADDR_MASK (0x300U) -#define OCOTP_LOCK_MAC_ADDR_SHIFT (8U) -#define OCOTP_LOCK_MAC_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_MAC_ADDR_SHIFT)) & OCOTP_LOCK_MAC_ADDR_MASK) - -#define OCOTP_LOCK_GP1_MASK (0xC00U) -#define OCOTP_LOCK_GP1_SHIFT (10U) -#define OCOTP_LOCK_GP1(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_GP1_SHIFT)) & OCOTP_LOCK_GP1_MASK) - -#define OCOTP_LOCK_GP2_MASK (0x3000U) -#define OCOTP_LOCK_GP2_SHIFT (12U) -#define OCOTP_LOCK_GP2(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_GP2_SHIFT)) & OCOTP_LOCK_GP2_MASK) - -#define OCOTP_LOCK_OTPMK_MSB_MASK (0x8000U) -#define OCOTP_LOCK_OTPMK_MSB_SHIFT (15U) -#define OCOTP_LOCK_OTPMK_MSB(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_OTPMK_MSB_SHIFT)) & OCOTP_LOCK_OTPMK_MSB_MASK) - -#define OCOTP_LOCK_SW_GP1_MASK (0x10000U) -#define OCOTP_LOCK_SW_GP1_SHIFT (16U) -#define OCOTP_LOCK_SW_GP1(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_SW_GP1_SHIFT)) & OCOTP_LOCK_SW_GP1_MASK) - -#define OCOTP_LOCK_OTPMK_LSB_MASK (0x20000U) -#define OCOTP_LOCK_OTPMK_LSB_SHIFT (17U) -#define OCOTP_LOCK_OTPMK_LSB(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_OTPMK_LSB_SHIFT)) & OCOTP_LOCK_OTPMK_LSB_MASK) - -#define OCOTP_LOCK_ANALOG_MASK (0xC0000U) -#define OCOTP_LOCK_ANALOG_SHIFT (18U) -#define OCOTP_LOCK_ANALOG(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_ANALOG_SHIFT)) & OCOTP_LOCK_ANALOG_MASK) - -#define OCOTP_LOCK_OTPMK_CRC_MASK (0x100000U) -#define OCOTP_LOCK_OTPMK_CRC_SHIFT (20U) -#define OCOTP_LOCK_OTPMK_CRC(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_OTPMK_CRC_SHIFT)) & OCOTP_LOCK_OTPMK_CRC_MASK) - -#define OCOTP_LOCK_SW_GP2_LOCK_MASK (0x200000U) -#define OCOTP_LOCK_SW_GP2_LOCK_SHIFT (21U) -#define OCOTP_LOCK_SW_GP2_LOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_SW_GP2_LOCK_SHIFT)) & OCOTP_LOCK_SW_GP2_LOCK_MASK) - -#define OCOTP_LOCK_MISC_CONF_MASK (0x400000U) -#define OCOTP_LOCK_MISC_CONF_SHIFT (22U) -#define OCOTP_LOCK_MISC_CONF(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_MISC_CONF_SHIFT)) & OCOTP_LOCK_MISC_CONF_MASK) - -#define OCOTP_LOCK_SW_GP2_RLOCK_MASK (0x800000U) -#define OCOTP_LOCK_SW_GP2_RLOCK_SHIFT (23U) -#define OCOTP_LOCK_SW_GP2_RLOCK(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_SW_GP2_RLOCK_SHIFT)) & OCOTP_LOCK_SW_GP2_RLOCK_MASK) - -#define OCOTP_LOCK_GP3_MASK (0xC000000U) -#define OCOTP_LOCK_GP3_SHIFT (26U) -#define OCOTP_LOCK_GP3(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_GP3_SHIFT)) & OCOTP_LOCK_GP3_MASK) - -#define OCOTP_LOCK_FIELD_RETURN_MASK (0xF0000000U) -#define OCOTP_LOCK_FIELD_RETURN_SHIFT (28U) -#define OCOTP_LOCK_FIELD_RETURN(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_LOCK_FIELD_RETURN_SHIFT)) & OCOTP_LOCK_FIELD_RETURN_MASK) -/*! @} */ - -/*! @name CFG0 - Value of OTP Bank0 Word1 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG0_BITS_SHIFT (0U) -#define OCOTP_CFG0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG0_BITS_SHIFT)) & OCOTP_CFG0_BITS_MASK) -/*! @} */ - -/*! @name CFG1 - Value of OTP Bank0 Word2 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG1_BITS_SHIFT (0U) -#define OCOTP_CFG1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG1_BITS_SHIFT)) & OCOTP_CFG1_BITS_MASK) -/*! @} */ - -/*! @name CFG2 - Value of OTP Bank0 Word3 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG2_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG2_BITS_SHIFT (0U) -#define OCOTP_CFG2_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG2_BITS_SHIFT)) & OCOTP_CFG2_BITS_MASK) -/*! @} */ - -/*! @name CFG3 - Value of OTP Bank0 Word4 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG3_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG3_BITS_SHIFT (0U) -#define OCOTP_CFG3_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG3_BITS_SHIFT)) & OCOTP_CFG3_BITS_MASK) -/*! @} */ - -/*! @name CFG4 - Value of OTP Bank0 Word5 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG4_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG4_BITS_SHIFT (0U) -#define OCOTP_CFG4_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG4_BITS_SHIFT)) & OCOTP_CFG4_BITS_MASK) -/*! @} */ - -/*! @name CFG5 - Value of OTP Bank0 Word6 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG5_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG5_BITS_SHIFT (0U) -#define OCOTP_CFG5_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG5_BITS_SHIFT)) & OCOTP_CFG5_BITS_MASK) -/*! @} */ - -/*! @name CFG6 - Value of OTP Bank0 Word7 (Configuration and Manufacturing Info.) */ -/*! @{ */ - -#define OCOTP_CFG6_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_CFG6_BITS_SHIFT (0U) -#define OCOTP_CFG6_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_CFG6_BITS_SHIFT)) & OCOTP_CFG6_BITS_MASK) -/*! @} */ - -/*! @name MEM0 - Value of OTP Bank1 Word0 (Memory Related Info.) */ -/*! @{ */ - -#define OCOTP_MEM0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MEM0_BITS_SHIFT (0U) -#define OCOTP_MEM0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MEM0_BITS_SHIFT)) & OCOTP_MEM0_BITS_MASK) -/*! @} */ - -/*! @name MEM1 - Value of OTP Bank1 Word1 (Memory Related Info.) */ -/*! @{ */ - -#define OCOTP_MEM1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MEM1_BITS_SHIFT (0U) -#define OCOTP_MEM1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MEM1_BITS_SHIFT)) & OCOTP_MEM1_BITS_MASK) -/*! @} */ - -/*! @name MEM2 - Value of OTP Bank1 Word2 (Memory Related Info.) */ -/*! @{ */ - -#define OCOTP_MEM2_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MEM2_BITS_SHIFT (0U) -#define OCOTP_MEM2_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MEM2_BITS_SHIFT)) & OCOTP_MEM2_BITS_MASK) -/*! @} */ - -/*! @name MEM3 - Value of OTP Bank1 Word3 (Memory Related Info.) */ -/*! @{ */ - -#define OCOTP_MEM3_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MEM3_BITS_SHIFT (0U) -#define OCOTP_MEM3_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MEM3_BITS_SHIFT)) & OCOTP_MEM3_BITS_MASK) -/*! @} */ - -/*! @name MEM4 - Value of OTP Bank1 Word4 (Memory Related Info.) */ -/*! @{ */ - -#define OCOTP_MEM4_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MEM4_BITS_SHIFT (0U) -#define OCOTP_MEM4_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MEM4_BITS_SHIFT)) & OCOTP_MEM4_BITS_MASK) -/*! @} */ - -/*! @name ANA0 - Value of OTP Bank1 Word5 (Analog Info.) */ -/*! @{ */ - -#define OCOTP_ANA0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_ANA0_BITS_SHIFT (0U) -#define OCOTP_ANA0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_ANA0_BITS_SHIFT)) & OCOTP_ANA0_BITS_MASK) -/*! @} */ - -/*! @name ANA1 - Value of OTP Bank1 Word6 (Analog Info.) */ -/*! @{ */ - -#define OCOTP_ANA1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_ANA1_BITS_SHIFT (0U) -#define OCOTP_ANA1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_ANA1_BITS_SHIFT)) & OCOTP_ANA1_BITS_MASK) -/*! @} */ - -/*! @name ANA2 - Value of OTP Bank1 Word7 (Analog Info.) */ -/*! @{ */ - -#define OCOTP_ANA2_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_ANA2_BITS_SHIFT (0U) -#define OCOTP_ANA2_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_ANA2_BITS_SHIFT)) & OCOTP_ANA2_BITS_MASK) -/*! @} */ - -/*! @name SRK0 - Shadow Register for OTP Bank3 Word0 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK0_BITS_SHIFT (0U) -#define OCOTP_SRK0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK0_BITS_SHIFT)) & OCOTP_SRK0_BITS_MASK) -/*! @} */ - -/*! @name SRK1 - Shadow Register for OTP Bank3 Word1 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK1_BITS_SHIFT (0U) -#define OCOTP_SRK1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK1_BITS_SHIFT)) & OCOTP_SRK1_BITS_MASK) -/*! @} */ - -/*! @name SRK2 - Shadow Register for OTP Bank3 Word2 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK2_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK2_BITS_SHIFT (0U) -#define OCOTP_SRK2_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK2_BITS_SHIFT)) & OCOTP_SRK2_BITS_MASK) -/*! @} */ - -/*! @name SRK3 - Shadow Register for OTP Bank3 Word3 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK3_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK3_BITS_SHIFT (0U) -#define OCOTP_SRK3_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK3_BITS_SHIFT)) & OCOTP_SRK3_BITS_MASK) -/*! @} */ - -/*! @name SRK4 - Shadow Register for OTP Bank3 Word4 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK4_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK4_BITS_SHIFT (0U) -#define OCOTP_SRK4_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK4_BITS_SHIFT)) & OCOTP_SRK4_BITS_MASK) -/*! @} */ - -/*! @name SRK5 - Shadow Register for OTP Bank3 Word5 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK5_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK5_BITS_SHIFT (0U) -#define OCOTP_SRK5_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK5_BITS_SHIFT)) & OCOTP_SRK5_BITS_MASK) -/*! @} */ - -/*! @name SRK6 - Shadow Register for OTP Bank3 Word6 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK6_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK6_BITS_SHIFT (0U) -#define OCOTP_SRK6_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK6_BITS_SHIFT)) & OCOTP_SRK6_BITS_MASK) -/*! @} */ - -/*! @name SRK7 - Shadow Register for OTP Bank3 Word7 (SRK Hash) */ -/*! @{ */ - -#define OCOTP_SRK7_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK7_BITS_SHIFT (0U) -#define OCOTP_SRK7_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK7_BITS_SHIFT)) & OCOTP_SRK7_BITS_MASK) -/*! @} */ - -/*! @name SJC_RESP0 - Value of OTP Bank4 Word0 (Secure JTAG Response Field) */ -/*! @{ */ - -#define OCOTP_SJC_RESP0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SJC_RESP0_BITS_SHIFT (0U) -#define OCOTP_SJC_RESP0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SJC_RESP0_BITS_SHIFT)) & OCOTP_SJC_RESP0_BITS_MASK) -/*! @} */ - -/*! @name SJC_RESP1 - Value of OTP Bank4 Word1 (Secure JTAG Response Field) */ -/*! @{ */ - -#define OCOTP_SJC_RESP1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SJC_RESP1_BITS_SHIFT (0U) -#define OCOTP_SJC_RESP1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SJC_RESP1_BITS_SHIFT)) & OCOTP_SJC_RESP1_BITS_MASK) -/*! @} */ - -/*! @name MAC0 - Value of OTP Bank4 Word2 (MAC Address) */ -/*! @{ */ - -#define OCOTP_MAC0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MAC0_BITS_SHIFT (0U) -#define OCOTP_MAC0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MAC0_BITS_SHIFT)) & OCOTP_MAC0_BITS_MASK) -/*! @} */ - -/*! @name MAC1 - Value of OTP Bank4 Word3 (MAC Address) */ -/*! @{ */ - -#define OCOTP_MAC1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MAC1_BITS_SHIFT (0U) -#define OCOTP_MAC1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MAC1_BITS_SHIFT)) & OCOTP_MAC1_BITS_MASK) -/*! @} */ - -/*! @name GP3 - Value of OTP Bank4 Word4 (MAC Address) */ -/*! @{ */ - -#define OCOTP_GP3_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_GP3_BITS_SHIFT (0U) -#define OCOTP_GP3_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_GP3_BITS_SHIFT)) & OCOTP_GP3_BITS_MASK) -/*! @} */ - -/*! @name GP1 - Value of OTP Bank4 Word6 (General Purpose Customer Defined Info) */ -/*! @{ */ - -#define OCOTP_GP1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_GP1_BITS_SHIFT (0U) -#define OCOTP_GP1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_GP1_BITS_SHIFT)) & OCOTP_GP1_BITS_MASK) -/*! @} */ - -/*! @name GP2 - Value of OTP Bank4 Word7 (General Purpose Customer Defined Info) */ -/*! @{ */ - -#define OCOTP_GP2_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_GP2_BITS_SHIFT (0U) -#define OCOTP_GP2_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_GP2_BITS_SHIFT)) & OCOTP_GP2_BITS_MASK) -/*! @} */ - -/*! @name SW_GP1 - Value of OTP Bank5 Word0 (SW GP1) */ -/*! @{ */ - -#define OCOTP_SW_GP1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SW_GP1_BITS_SHIFT (0U) -#define OCOTP_SW_GP1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_GP1_BITS_SHIFT)) & OCOTP_SW_GP1_BITS_MASK) -/*! @} */ - -/*! @name SW_GP20 - Value of OTP Bank5 Word1 (SW GP2) */ -/*! @{ */ - -#define OCOTP_SW_GP20_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SW_GP20_BITS_SHIFT (0U) -#define OCOTP_SW_GP20_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_GP20_BITS_SHIFT)) & OCOTP_SW_GP20_BITS_MASK) -/*! @} */ - -/*! @name SW_GP21 - Value of OTP Bank5 Word2 (SW GP2) */ -/*! @{ */ - -#define OCOTP_SW_GP21_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SW_GP21_BITS_SHIFT (0U) -#define OCOTP_SW_GP21_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_GP21_BITS_SHIFT)) & OCOTP_SW_GP21_BITS_MASK) -/*! @} */ - -/*! @name SW_GP22 - Value of OTP Bank5 Word3 (SW GP2) */ -/*! @{ */ - -#define OCOTP_SW_GP22_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SW_GP22_BITS_SHIFT (0U) -#define OCOTP_SW_GP22_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_GP22_BITS_SHIFT)) & OCOTP_SW_GP22_BITS_MASK) -/*! @} */ - -/*! @name SW_GP23 - Value of OTP Bank5 Word4 (SW GP2) */ -/*! @{ */ - -#define OCOTP_SW_GP23_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SW_GP23_BITS_SHIFT (0U) -#define OCOTP_SW_GP23_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SW_GP23_BITS_SHIFT)) & OCOTP_SW_GP23_BITS_MASK) -/*! @} */ - -/*! @name MISC_CONF0 - Value of OTP Bank5 Word5 (Misc Conf) */ -/*! @{ */ - -#define OCOTP_MISC_CONF0_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MISC_CONF0_BITS_SHIFT (0U) -#define OCOTP_MISC_CONF0_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MISC_CONF0_BITS_SHIFT)) & OCOTP_MISC_CONF0_BITS_MASK) -/*! @} */ - -/*! @name MISC_CONF1 - Value of OTP Bank5 Word6 (Misc Conf) */ -/*! @{ */ - -#define OCOTP_MISC_CONF1_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_MISC_CONF1_BITS_SHIFT (0U) -#define OCOTP_MISC_CONF1_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_MISC_CONF1_BITS_SHIFT)) & OCOTP_MISC_CONF1_BITS_MASK) -/*! @} */ - -/*! @name SRK_REVOKE - Value of OTP Bank5 Word7 (SRK Revoke) */ -/*! @{ */ - -#define OCOTP_SRK_REVOKE_BITS_MASK (0xFFFFFFFFU) -#define OCOTP_SRK_REVOKE_BITS_SHIFT (0U) -#define OCOTP_SRK_REVOKE_BITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_SRK_REVOKE_BITS_SHIFT)) & OCOTP_SRK_REVOKE_BITS_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group OCOTP_Register_Masks */ - - -/* OCOTP - Peripheral instance base addresses */ -/** Peripheral OCOTP base address */ -#define OCOTP_BASE (0x401F4000u) -/** Peripheral OCOTP base pointer */ -#define OCOTP ((OCOTP_Type *)OCOTP_BASE) -/** Array initializer of OCOTP peripheral base addresses */ -#define OCOTP_BASE_ADDRS { OCOTP_BASE } -/** Array initializer of OCOTP peripheral base pointers */ -#define OCOTP_BASE_PTRS { OCOTP } - -/*! - * @} - */ /* end of group OCOTP_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- PGC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PGC_Peripheral_Access_Layer PGC Peripheral Access Layer - * @{ - */ - -/** PGC - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[544]; - __IO uint32_t MEGA_CTRL; /**< PGC Mega Control Register, offset: 0x220 */ - __IO uint32_t MEGA_PUPSCR; /**< PGC Mega Power Up Sequence Control Register, offset: 0x224 */ - __IO uint32_t MEGA_PDNSCR; /**< PGC Mega Pull Down Sequence Control Register, offset: 0x228 */ - __IO uint32_t MEGA_SR; /**< PGC Mega Power Gating Controller Status Register, offset: 0x22C */ - uint8_t RESERVED_1[112]; - __IO uint32_t CPU_CTRL; /**< PGC CPU Control Register, offset: 0x2A0 */ - __IO uint32_t CPU_PUPSCR; /**< PGC CPU Power Up Sequence Control Register, offset: 0x2A4 */ - __IO uint32_t CPU_PDNSCR; /**< PGC CPU Pull Down Sequence Control Register, offset: 0x2A8 */ - __IO uint32_t CPU_SR; /**< PGC CPU Power Gating Controller Status Register, offset: 0x2AC */ -} PGC_Type; - -/* ---------------------------------------------------------------------------- - -- PGC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PGC_Register_Masks PGC Register Masks - * @{ - */ - -/*! @name MEGA_CTRL - PGC Mega Control Register */ -/*! @{ */ - -#define PGC_MEGA_CTRL_PCR_MASK (0x1U) -#define PGC_MEGA_CTRL_PCR_SHIFT (0U) -/*! PCR - * 0b0..Do not switch off power even if pdn_req is asserted. - * 0b1..Switch off power when pdn_req is asserted. - */ -#define PGC_MEGA_CTRL_PCR(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_CTRL_PCR_SHIFT)) & PGC_MEGA_CTRL_PCR_MASK) -/*! @} */ - -/*! @name MEGA_PUPSCR - PGC Mega Power Up Sequence Control Register */ -/*! @{ */ - -#define PGC_MEGA_PUPSCR_SW_MASK (0x3FU) -#define PGC_MEGA_PUPSCR_SW_SHIFT (0U) -#define PGC_MEGA_PUPSCR_SW(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_PUPSCR_SW_SHIFT)) & PGC_MEGA_PUPSCR_SW_MASK) - -#define PGC_MEGA_PUPSCR_SW2ISO_MASK (0x3F00U) -#define PGC_MEGA_PUPSCR_SW2ISO_SHIFT (8U) -#define PGC_MEGA_PUPSCR_SW2ISO(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_PUPSCR_SW2ISO_SHIFT)) & PGC_MEGA_PUPSCR_SW2ISO_MASK) -/*! @} */ - -/*! @name MEGA_PDNSCR - PGC Mega Pull Down Sequence Control Register */ -/*! @{ */ - -#define PGC_MEGA_PDNSCR_ISO_MASK (0x3FU) -#define PGC_MEGA_PDNSCR_ISO_SHIFT (0U) -#define PGC_MEGA_PDNSCR_ISO(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_PDNSCR_ISO_SHIFT)) & PGC_MEGA_PDNSCR_ISO_MASK) - -#define PGC_MEGA_PDNSCR_ISO2SW_MASK (0x3F00U) -#define PGC_MEGA_PDNSCR_ISO2SW_SHIFT (8U) -#define PGC_MEGA_PDNSCR_ISO2SW(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_PDNSCR_ISO2SW_SHIFT)) & PGC_MEGA_PDNSCR_ISO2SW_MASK) -/*! @} */ - -/*! @name MEGA_SR - PGC Mega Power Gating Controller Status Register */ -/*! @{ */ - -#define PGC_MEGA_SR_PSR_MASK (0x1U) -#define PGC_MEGA_SR_PSR_SHIFT (0U) -/*! PSR - * 0b0..The target subsystem was not powered down for the previous power-down request. - * 0b1..The target subsystem was powered down for the previous power-down request. - */ -#define PGC_MEGA_SR_PSR(x) (((uint32_t)(((uint32_t)(x)) << PGC_MEGA_SR_PSR_SHIFT)) & PGC_MEGA_SR_PSR_MASK) -/*! @} */ - -/*! @name CPU_CTRL - PGC CPU Control Register */ -/*! @{ */ - -#define PGC_CPU_CTRL_PCR_MASK (0x1U) -#define PGC_CPU_CTRL_PCR_SHIFT (0U) -/*! PCR - * 0b0..Do not switch off power even if pdn_req is asserted. - * 0b1..Switch off power when pdn_req is asserted. - */ -#define PGC_CPU_CTRL_PCR(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_CTRL_PCR_SHIFT)) & PGC_CPU_CTRL_PCR_MASK) -/*! @} */ - -/*! @name CPU_PUPSCR - PGC CPU Power Up Sequence Control Register */ -/*! @{ */ - -#define PGC_CPU_PUPSCR_SW_MASK (0x3FU) -#define PGC_CPU_PUPSCR_SW_SHIFT (0U) -#define PGC_CPU_PUPSCR_SW(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_PUPSCR_SW_SHIFT)) & PGC_CPU_PUPSCR_SW_MASK) - -#define PGC_CPU_PUPSCR_SW2ISO_MASK (0x3F00U) -#define PGC_CPU_PUPSCR_SW2ISO_SHIFT (8U) -#define PGC_CPU_PUPSCR_SW2ISO(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_PUPSCR_SW2ISO_SHIFT)) & PGC_CPU_PUPSCR_SW2ISO_MASK) -/*! @} */ - -/*! @name CPU_PDNSCR - PGC CPU Pull Down Sequence Control Register */ -/*! @{ */ - -#define PGC_CPU_PDNSCR_ISO_MASK (0x3FU) -#define PGC_CPU_PDNSCR_ISO_SHIFT (0U) -#define PGC_CPU_PDNSCR_ISO(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_PDNSCR_ISO_SHIFT)) & PGC_CPU_PDNSCR_ISO_MASK) - -#define PGC_CPU_PDNSCR_ISO2SW_MASK (0x3F00U) -#define PGC_CPU_PDNSCR_ISO2SW_SHIFT (8U) -#define PGC_CPU_PDNSCR_ISO2SW(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_PDNSCR_ISO2SW_SHIFT)) & PGC_CPU_PDNSCR_ISO2SW_MASK) -/*! @} */ - -/*! @name CPU_SR - PGC CPU Power Gating Controller Status Register */ -/*! @{ */ - -#define PGC_CPU_SR_PSR_MASK (0x1U) -#define PGC_CPU_SR_PSR_SHIFT (0U) -/*! PSR - * 0b0..The target subsystem was not powered down for the previous power-down request. - * 0b1..The target subsystem was powered down for the previous power-down request. - */ -#define PGC_CPU_SR_PSR(x) (((uint32_t)(((uint32_t)(x)) << PGC_CPU_SR_PSR_SHIFT)) & PGC_CPU_SR_PSR_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group PGC_Register_Masks */ - - -/* PGC - Peripheral instance base addresses */ -/** Peripheral PGC base address */ -#define PGC_BASE (0x400F4000u) -/** Peripheral PGC base pointer */ -#define PGC ((PGC_Type *)PGC_BASE) -/** Array initializer of PGC peripheral base addresses */ -#define PGC_BASE_ADDRS { PGC_BASE } -/** Array initializer of PGC peripheral base pointers */ -#define PGC_BASE_PTRS { PGC } - -/*! - * @} - */ /* end of group PGC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- PIT Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PIT_Peripheral_Access_Layer PIT Peripheral Access Layer - * @{ - */ - -/** PIT - Register Layout Typedef */ -typedef struct { - __IO uint32_t MCR; /**< PIT Module Control Register, offset: 0x0 */ - uint8_t RESERVED_0[220]; - __I uint32_t LTMR64H; /**< PIT Upper Lifetime Timer Register, offset: 0xE0 */ - __I uint32_t LTMR64L; /**< PIT Lower Lifetime Timer Register, offset: 0xE4 */ - uint8_t RESERVED_1[24]; - struct { /* offset: 0x100, array step: 0x10 */ - __IO uint32_t LDVAL; /**< Timer Load Value Register, array offset: 0x100, array step: 0x10 */ - __I uint32_t CVAL; /**< Current Timer Value Register, array offset: 0x104, array step: 0x10 */ - __IO uint32_t TCTRL; /**< Timer Control Register, array offset: 0x108, array step: 0x10 */ - __IO uint32_t TFLG; /**< Timer Flag Register, array offset: 0x10C, array step: 0x10 */ - } CHANNEL[4]; -} PIT_Type; - -/* ---------------------------------------------------------------------------- - -- PIT Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PIT_Register_Masks PIT Register Masks - * @{ - */ - -/*! @name MCR - PIT Module Control Register */ -/*! @{ */ - -#define PIT_MCR_FRZ_MASK (0x1U) -#define PIT_MCR_FRZ_SHIFT (0U) -/*! FRZ - Freeze - * 0b0..Timers continue to run in Debug mode. - * 0b1..Timers are stopped in Debug mode. - */ -#define PIT_MCR_FRZ(x) (((uint32_t)(((uint32_t)(x)) << PIT_MCR_FRZ_SHIFT)) & PIT_MCR_FRZ_MASK) - -#define PIT_MCR_MDIS_MASK (0x2U) -#define PIT_MCR_MDIS_SHIFT (1U) -/*! MDIS - Module Disable - (PIT section) - * 0b0..Clock for standard PIT timers is enabled. - * 0b1..Clock for standard PIT timers is disabled. - */ -#define PIT_MCR_MDIS(x) (((uint32_t)(((uint32_t)(x)) << PIT_MCR_MDIS_SHIFT)) & PIT_MCR_MDIS_MASK) -/*! @} */ - -/*! @name LTMR64H - PIT Upper Lifetime Timer Register */ -/*! @{ */ - -#define PIT_LTMR64H_LTH_MASK (0xFFFFFFFFU) -#define PIT_LTMR64H_LTH_SHIFT (0U) -/*! LTH - Life Timer value - */ -#define PIT_LTMR64H_LTH(x) (((uint32_t)(((uint32_t)(x)) << PIT_LTMR64H_LTH_SHIFT)) & PIT_LTMR64H_LTH_MASK) -/*! @} */ - -/*! @name LTMR64L - PIT Lower Lifetime Timer Register */ -/*! @{ */ - -#define PIT_LTMR64L_LTL_MASK (0xFFFFFFFFU) -#define PIT_LTMR64L_LTL_SHIFT (0U) -/*! LTL - Life Timer value - */ -#define PIT_LTMR64L_LTL(x) (((uint32_t)(((uint32_t)(x)) << PIT_LTMR64L_LTL_SHIFT)) & PIT_LTMR64L_LTL_MASK) -/*! @} */ - -/*! @name LDVAL - Timer Load Value Register */ -/*! @{ */ - -#define PIT_LDVAL_TSV_MASK (0xFFFFFFFFU) -#define PIT_LDVAL_TSV_SHIFT (0U) -/*! TSV - Timer Start Value - */ -#define PIT_LDVAL_TSV(x) (((uint32_t)(((uint32_t)(x)) << PIT_LDVAL_TSV_SHIFT)) & PIT_LDVAL_TSV_MASK) -/*! @} */ - -/* The count of PIT_LDVAL */ -#define PIT_LDVAL_COUNT (4U) - -/*! @name CVAL - Current Timer Value Register */ -/*! @{ */ - -#define PIT_CVAL_TVL_MASK (0xFFFFFFFFU) -#define PIT_CVAL_TVL_SHIFT (0U) -/*! TVL - Current Timer Value - */ -#define PIT_CVAL_TVL(x) (((uint32_t)(((uint32_t)(x)) << PIT_CVAL_TVL_SHIFT)) & PIT_CVAL_TVL_MASK) -/*! @} */ - -/* The count of PIT_CVAL */ -#define PIT_CVAL_COUNT (4U) - -/*! @name TCTRL - Timer Control Register */ -/*! @{ */ - -#define PIT_TCTRL_TEN_MASK (0x1U) -#define PIT_TCTRL_TEN_SHIFT (0U) -/*! TEN - Timer Enable - * 0b0..Timer n is disabled. - * 0b1..Timer n is enabled. - */ -#define PIT_TCTRL_TEN(x) (((uint32_t)(((uint32_t)(x)) << PIT_TCTRL_TEN_SHIFT)) & PIT_TCTRL_TEN_MASK) - -#define PIT_TCTRL_TIE_MASK (0x2U) -#define PIT_TCTRL_TIE_SHIFT (1U) -/*! TIE - Timer Interrupt Enable - * 0b0..Interrupt requests from Timer n are disabled. - * 0b1..Interrupt will be requested whenever TIF is set. - */ -#define PIT_TCTRL_TIE(x) (((uint32_t)(((uint32_t)(x)) << PIT_TCTRL_TIE_SHIFT)) & PIT_TCTRL_TIE_MASK) - -#define PIT_TCTRL_CHN_MASK (0x4U) -#define PIT_TCTRL_CHN_SHIFT (2U) -/*! CHN - Chain Mode - * 0b0..Timer is not chained. - * 0b1..Timer is chained to previous timer. For example, for Channel 2, if this field is set, Timer 2 is chained to Timer 1. - */ -#define PIT_TCTRL_CHN(x) (((uint32_t)(((uint32_t)(x)) << PIT_TCTRL_CHN_SHIFT)) & PIT_TCTRL_CHN_MASK) -/*! @} */ - -/* The count of PIT_TCTRL */ -#define PIT_TCTRL_COUNT (4U) - -/*! @name TFLG - Timer Flag Register */ -/*! @{ */ - -#define PIT_TFLG_TIF_MASK (0x1U) -#define PIT_TFLG_TIF_SHIFT (0U) -/*! TIF - Timer Interrupt Flag - * 0b0..Timeout has not yet occurred. - * 0b1..Timeout has occurred. - */ -#define PIT_TFLG_TIF(x) (((uint32_t)(((uint32_t)(x)) << PIT_TFLG_TIF_SHIFT)) & PIT_TFLG_TIF_MASK) -/*! @} */ - -/* The count of PIT_TFLG */ -#define PIT_TFLG_COUNT (4U) - - -/*! - * @} - */ /* end of group PIT_Register_Masks */ - - -/* PIT - Peripheral instance base addresses */ -/** Peripheral PIT base address */ -#define PIT_BASE (0x40084000u) -/** Peripheral PIT base pointer */ -#define PIT ((PIT_Type *)PIT_BASE) -/** Array initializer of PIT peripheral base addresses */ -#define PIT_BASE_ADDRS { PIT_BASE } -/** Array initializer of PIT peripheral base pointers */ -#define PIT_BASE_PTRS { PIT } -/** Interrupt vectors for the PIT peripheral type */ -#define PIT_IRQS { { PIT_IRQn, PIT_IRQn, PIT_IRQn, PIT_IRQn } } - -/*! - * @} - */ /* end of group PIT_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- PMU Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PMU_Peripheral_Access_Layer PMU Peripheral Access Layer - * @{ - */ - -/** PMU - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[272]; - __IO uint32_t REG_1P1; /**< Regulator 1P1 Register, offset: 0x110 */ - __IO uint32_t REG_1P1_SET; /**< Regulator 1P1 Register, offset: 0x114 */ - __IO uint32_t REG_1P1_CLR; /**< Regulator 1P1 Register, offset: 0x118 */ - __IO uint32_t REG_1P1_TOG; /**< Regulator 1P1 Register, offset: 0x11C */ - __IO uint32_t REG_3P0; /**< Regulator 3P0 Register, offset: 0x120 */ - __IO uint32_t REG_3P0_SET; /**< Regulator 3P0 Register, offset: 0x124 */ - __IO uint32_t REG_3P0_CLR; /**< Regulator 3P0 Register, offset: 0x128 */ - __IO uint32_t REG_3P0_TOG; /**< Regulator 3P0 Register, offset: 0x12C */ - __IO uint32_t REG_2P5; /**< Regulator 2P5 Register, offset: 0x130 */ - __IO uint32_t REG_2P5_SET; /**< Regulator 2P5 Register, offset: 0x134 */ - __IO uint32_t REG_2P5_CLR; /**< Regulator 2P5 Register, offset: 0x138 */ - __IO uint32_t REG_2P5_TOG; /**< Regulator 2P5 Register, offset: 0x13C */ - __IO uint32_t REG_CORE; /**< Digital Regulator Core Register, offset: 0x140 */ - __IO uint32_t REG_CORE_SET; /**< Digital Regulator Core Register, offset: 0x144 */ - __IO uint32_t REG_CORE_CLR; /**< Digital Regulator Core Register, offset: 0x148 */ - __IO uint32_t REG_CORE_TOG; /**< Digital Regulator Core Register, offset: 0x14C */ - __IO uint32_t MISC0; /**< Miscellaneous Register 0, offset: 0x150 */ - __IO uint32_t MISC0_SET; /**< Miscellaneous Register 0, offset: 0x154 */ - __IO uint32_t MISC0_CLR; /**< Miscellaneous Register 0, offset: 0x158 */ - __IO uint32_t MISC0_TOG; /**< Miscellaneous Register 0, offset: 0x15C */ - __IO uint32_t MISC1; /**< Miscellaneous Register 1, offset: 0x160 */ - __IO uint32_t MISC1_SET; /**< Miscellaneous Register 1, offset: 0x164 */ - __IO uint32_t MISC1_CLR; /**< Miscellaneous Register 1, offset: 0x168 */ - __IO uint32_t MISC1_TOG; /**< Miscellaneous Register 1, offset: 0x16C */ - __IO uint32_t MISC2; /**< Miscellaneous Control Register, offset: 0x170 */ - __IO uint32_t MISC2_SET; /**< Miscellaneous Control Register, offset: 0x174 */ - __IO uint32_t MISC2_CLR; /**< Miscellaneous Control Register, offset: 0x178 */ - __IO uint32_t MISC2_TOG; /**< Miscellaneous Control Register, offset: 0x17C */ -} PMU_Type; - -/* ---------------------------------------------------------------------------- - -- PMU Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PMU_Register_Masks PMU Register Masks - * @{ - */ - -/*! @name REG_1P1 - Regulator 1P1 Register */ -/*! @{ */ - -#define PMU_REG_1P1_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_1P1_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_1P1_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_ENABLE_LINREG_SHIFT)) & PMU_REG_1P1_ENABLE_LINREG_MASK) - -#define PMU_REG_1P1_ENABLE_BO_MASK (0x2U) -#define PMU_REG_1P1_ENABLE_BO_SHIFT (1U) -#define PMU_REG_1P1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_ENABLE_BO_SHIFT)) & PMU_REG_1P1_ENABLE_BO_MASK) - -#define PMU_REG_1P1_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_1P1_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_1P1_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_ENABLE_ILIMIT_SHIFT)) & PMU_REG_1P1_ENABLE_ILIMIT_MASK) - -#define PMU_REG_1P1_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_1P1_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_1P1_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_1P1_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_1P1_BO_OFFSET_MASK (0x70U) -#define PMU_REG_1P1_BO_OFFSET_SHIFT (4U) -#define PMU_REG_1P1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_BO_OFFSET_SHIFT)) & PMU_REG_1P1_BO_OFFSET_MASK) - -#define PMU_REG_1P1_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_1P1_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00100..0.8V - * 0b10000..1.1V - * 0b000x1..1.375V - */ -#define PMU_REG_1P1_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_OUTPUT_TRG_SHIFT)) & PMU_REG_1P1_OUTPUT_TRG_MASK) - -#define PMU_REG_1P1_BO_VDD1P1_MASK (0x10000U) -#define PMU_REG_1P1_BO_VDD1P1_SHIFT (16U) -#define PMU_REG_1P1_BO_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_BO_VDD1P1_SHIFT)) & PMU_REG_1P1_BO_VDD1P1_MASK) - -#define PMU_REG_1P1_OK_VDD1P1_MASK (0x20000U) -#define PMU_REG_1P1_OK_VDD1P1_SHIFT (17U) -#define PMU_REG_1P1_OK_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_OK_VDD1P1_SHIFT)) & PMU_REG_1P1_OK_VDD1P1_MASK) - -#define PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_1P1_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_1P1_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK) - -#define PMU_REG_1P1_SELREF_WEAK_LINREG_MASK (0x80000U) -#define PMU_REG_1P1_SELREF_WEAK_LINREG_SHIFT (19U) -/*! SELREF_WEAK_LINREG - * 0b0..Weak-linreg output tracks low-power-bandgap voltage - * 0b1..Weak-linreg output tracks VDD_SOC_IN voltage - */ -#define PMU_REG_1P1_SELREF_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SELREF_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_SELREF_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_1P1_SET - Regulator 1P1 Register */ -/*! @{ */ - -#define PMU_REG_1P1_SET_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_1P1_SET_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_1P1_SET_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_ENABLE_LINREG_SHIFT)) & PMU_REG_1P1_SET_ENABLE_LINREG_MASK) - -#define PMU_REG_1P1_SET_ENABLE_BO_MASK (0x2U) -#define PMU_REG_1P1_SET_ENABLE_BO_SHIFT (1U) -#define PMU_REG_1P1_SET_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_ENABLE_BO_SHIFT)) & PMU_REG_1P1_SET_ENABLE_BO_MASK) - -#define PMU_REG_1P1_SET_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_1P1_SET_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_1P1_SET_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_ENABLE_ILIMIT_SHIFT)) & PMU_REG_1P1_SET_ENABLE_ILIMIT_MASK) - -#define PMU_REG_1P1_SET_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_1P1_SET_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_1P1_SET_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_1P1_SET_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_1P1_SET_BO_OFFSET_MASK (0x70U) -#define PMU_REG_1P1_SET_BO_OFFSET_SHIFT (4U) -#define PMU_REG_1P1_SET_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_BO_OFFSET_SHIFT)) & PMU_REG_1P1_SET_BO_OFFSET_MASK) - -#define PMU_REG_1P1_SET_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_1P1_SET_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00100..0.8V - * 0b10000..1.1V - * 0b000x1..1.375V - */ -#define PMU_REG_1P1_SET_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_OUTPUT_TRG_SHIFT)) & PMU_REG_1P1_SET_OUTPUT_TRG_MASK) - -#define PMU_REG_1P1_SET_BO_VDD1P1_MASK (0x10000U) -#define PMU_REG_1P1_SET_BO_VDD1P1_SHIFT (16U) -#define PMU_REG_1P1_SET_BO_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_BO_VDD1P1_SHIFT)) & PMU_REG_1P1_SET_BO_VDD1P1_MASK) - -#define PMU_REG_1P1_SET_OK_VDD1P1_MASK (0x20000U) -#define PMU_REG_1P1_SET_OK_VDD1P1_SHIFT (17U) -#define PMU_REG_1P1_SET_OK_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_OK_VDD1P1_SHIFT)) & PMU_REG_1P1_SET_OK_VDD1P1_MASK) - -#define PMU_REG_1P1_SET_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_1P1_SET_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_1P1_SET_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_SET_ENABLE_WEAK_LINREG_MASK) - -#define PMU_REG_1P1_SET_SELREF_WEAK_LINREG_MASK (0x80000U) -#define PMU_REG_1P1_SET_SELREF_WEAK_LINREG_SHIFT (19U) -/*! SELREF_WEAK_LINREG - * 0b0..Weak-linreg output tracks low-power-bandgap voltage - * 0b1..Weak-linreg output tracks VDD_SOC_IN voltage - */ -#define PMU_REG_1P1_SET_SELREF_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_SET_SELREF_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_SET_SELREF_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_1P1_CLR - Regulator 1P1 Register */ -/*! @{ */ - -#define PMU_REG_1P1_CLR_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_1P1_CLR_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_1P1_CLR_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_ENABLE_LINREG_SHIFT)) & PMU_REG_1P1_CLR_ENABLE_LINREG_MASK) - -#define PMU_REG_1P1_CLR_ENABLE_BO_MASK (0x2U) -#define PMU_REG_1P1_CLR_ENABLE_BO_SHIFT (1U) -#define PMU_REG_1P1_CLR_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_ENABLE_BO_SHIFT)) & PMU_REG_1P1_CLR_ENABLE_BO_MASK) - -#define PMU_REG_1P1_CLR_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_1P1_CLR_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_1P1_CLR_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_ENABLE_ILIMIT_SHIFT)) & PMU_REG_1P1_CLR_ENABLE_ILIMIT_MASK) - -#define PMU_REG_1P1_CLR_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_1P1_CLR_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_1P1_CLR_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_1P1_CLR_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_1P1_CLR_BO_OFFSET_MASK (0x70U) -#define PMU_REG_1P1_CLR_BO_OFFSET_SHIFT (4U) -#define PMU_REG_1P1_CLR_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_BO_OFFSET_SHIFT)) & PMU_REG_1P1_CLR_BO_OFFSET_MASK) - -#define PMU_REG_1P1_CLR_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_1P1_CLR_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00100..0.8V - * 0b10000..1.1V - * 0b000x1..1.375V - */ -#define PMU_REG_1P1_CLR_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_OUTPUT_TRG_SHIFT)) & PMU_REG_1P1_CLR_OUTPUT_TRG_MASK) - -#define PMU_REG_1P1_CLR_BO_VDD1P1_MASK (0x10000U) -#define PMU_REG_1P1_CLR_BO_VDD1P1_SHIFT (16U) -#define PMU_REG_1P1_CLR_BO_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_BO_VDD1P1_SHIFT)) & PMU_REG_1P1_CLR_BO_VDD1P1_MASK) - -#define PMU_REG_1P1_CLR_OK_VDD1P1_MASK (0x20000U) -#define PMU_REG_1P1_CLR_OK_VDD1P1_SHIFT (17U) -#define PMU_REG_1P1_CLR_OK_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_OK_VDD1P1_SHIFT)) & PMU_REG_1P1_CLR_OK_VDD1P1_MASK) - -#define PMU_REG_1P1_CLR_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_1P1_CLR_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_1P1_CLR_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_CLR_ENABLE_WEAK_LINREG_MASK) - -#define PMU_REG_1P1_CLR_SELREF_WEAK_LINREG_MASK (0x80000U) -#define PMU_REG_1P1_CLR_SELREF_WEAK_LINREG_SHIFT (19U) -/*! SELREF_WEAK_LINREG - * 0b0..Weak-linreg output tracks low-power-bandgap voltage - * 0b1..Weak-linreg output tracks VDD_SOC_IN voltage - */ -#define PMU_REG_1P1_CLR_SELREF_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_CLR_SELREF_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_CLR_SELREF_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_1P1_TOG - Regulator 1P1 Register */ -/*! @{ */ - -#define PMU_REG_1P1_TOG_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_1P1_TOG_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_1P1_TOG_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_ENABLE_LINREG_SHIFT)) & PMU_REG_1P1_TOG_ENABLE_LINREG_MASK) - -#define PMU_REG_1P1_TOG_ENABLE_BO_MASK (0x2U) -#define PMU_REG_1P1_TOG_ENABLE_BO_SHIFT (1U) -#define PMU_REG_1P1_TOG_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_ENABLE_BO_SHIFT)) & PMU_REG_1P1_TOG_ENABLE_BO_MASK) - -#define PMU_REG_1P1_TOG_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_1P1_TOG_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_1P1_TOG_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_ENABLE_ILIMIT_SHIFT)) & PMU_REG_1P1_TOG_ENABLE_ILIMIT_MASK) - -#define PMU_REG_1P1_TOG_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_1P1_TOG_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_1P1_TOG_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_1P1_TOG_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_1P1_TOG_BO_OFFSET_MASK (0x70U) -#define PMU_REG_1P1_TOG_BO_OFFSET_SHIFT (4U) -#define PMU_REG_1P1_TOG_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_BO_OFFSET_SHIFT)) & PMU_REG_1P1_TOG_BO_OFFSET_MASK) - -#define PMU_REG_1P1_TOG_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_1P1_TOG_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00100..0.8V - * 0b10000..1.1V - * 0b000x1..1.375V - */ -#define PMU_REG_1P1_TOG_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_OUTPUT_TRG_SHIFT)) & PMU_REG_1P1_TOG_OUTPUT_TRG_MASK) - -#define PMU_REG_1P1_TOG_BO_VDD1P1_MASK (0x10000U) -#define PMU_REG_1P1_TOG_BO_VDD1P1_SHIFT (16U) -#define PMU_REG_1P1_TOG_BO_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_BO_VDD1P1_SHIFT)) & PMU_REG_1P1_TOG_BO_VDD1P1_MASK) - -#define PMU_REG_1P1_TOG_OK_VDD1P1_MASK (0x20000U) -#define PMU_REG_1P1_TOG_OK_VDD1P1_SHIFT (17U) -#define PMU_REG_1P1_TOG_OK_VDD1P1(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_OK_VDD1P1_SHIFT)) & PMU_REG_1P1_TOG_OK_VDD1P1_MASK) - -#define PMU_REG_1P1_TOG_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_1P1_TOG_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_1P1_TOG_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_TOG_ENABLE_WEAK_LINREG_MASK) - -#define PMU_REG_1P1_TOG_SELREF_WEAK_LINREG_MASK (0x80000U) -#define PMU_REG_1P1_TOG_SELREF_WEAK_LINREG_SHIFT (19U) -/*! SELREF_WEAK_LINREG - * 0b0..Weak-linreg output tracks low-power-bandgap voltage - * 0b1..Weak-linreg output tracks VDD_SOC_IN voltage - */ -#define PMU_REG_1P1_TOG_SELREF_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_1P1_TOG_SELREF_WEAK_LINREG_SHIFT)) & PMU_REG_1P1_TOG_SELREF_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_3P0 - Regulator 3P0 Register */ -/*! @{ */ - -#define PMU_REG_3P0_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_3P0_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_3P0_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_ENABLE_LINREG_SHIFT)) & PMU_REG_3P0_ENABLE_LINREG_MASK) - -#define PMU_REG_3P0_ENABLE_BO_MASK (0x2U) -#define PMU_REG_3P0_ENABLE_BO_SHIFT (1U) -#define PMU_REG_3P0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_ENABLE_BO_SHIFT)) & PMU_REG_3P0_ENABLE_BO_MASK) - -#define PMU_REG_3P0_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_3P0_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_3P0_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_ENABLE_ILIMIT_SHIFT)) & PMU_REG_3P0_ENABLE_ILIMIT_MASK) - -#define PMU_REG_3P0_BO_OFFSET_MASK (0x70U) -#define PMU_REG_3P0_BO_OFFSET_SHIFT (4U) -#define PMU_REG_3P0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_BO_OFFSET_SHIFT)) & PMU_REG_3P0_BO_OFFSET_MASK) - -#define PMU_REG_3P0_VBUS_SEL_MASK (0x80U) -#define PMU_REG_3P0_VBUS_SEL_SHIFT (7U) -/*! VBUS_SEL - * 0b1..Utilize VBUS OTG1 power - * 0b0..Utilize VBUS OTG2 power - */ -#define PMU_REG_3P0_VBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_VBUS_SEL_SHIFT)) & PMU_REG_3P0_VBUS_SEL_MASK) - -#define PMU_REG_3P0_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_3P0_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.625V - * 0b01111..3.000V - * 0b11111..3.400V - */ -#define PMU_REG_3P0_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_OUTPUT_TRG_SHIFT)) & PMU_REG_3P0_OUTPUT_TRG_MASK) - -#define PMU_REG_3P0_BO_VDD3P0_MASK (0x10000U) -#define PMU_REG_3P0_BO_VDD3P0_SHIFT (16U) -#define PMU_REG_3P0_BO_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_BO_VDD3P0_SHIFT)) & PMU_REG_3P0_BO_VDD3P0_MASK) - -#define PMU_REG_3P0_OK_VDD3P0_MASK (0x20000U) -#define PMU_REG_3P0_OK_VDD3P0_SHIFT (17U) -#define PMU_REG_3P0_OK_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_OK_VDD3P0_SHIFT)) & PMU_REG_3P0_OK_VDD3P0_MASK) -/*! @} */ - -/*! @name REG_3P0_SET - Regulator 3P0 Register */ -/*! @{ */ - -#define PMU_REG_3P0_SET_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_3P0_SET_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_3P0_SET_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_ENABLE_LINREG_SHIFT)) & PMU_REG_3P0_SET_ENABLE_LINREG_MASK) - -#define PMU_REG_3P0_SET_ENABLE_BO_MASK (0x2U) -#define PMU_REG_3P0_SET_ENABLE_BO_SHIFT (1U) -#define PMU_REG_3P0_SET_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_ENABLE_BO_SHIFT)) & PMU_REG_3P0_SET_ENABLE_BO_MASK) - -#define PMU_REG_3P0_SET_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_3P0_SET_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_3P0_SET_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_ENABLE_ILIMIT_SHIFT)) & PMU_REG_3P0_SET_ENABLE_ILIMIT_MASK) - -#define PMU_REG_3P0_SET_BO_OFFSET_MASK (0x70U) -#define PMU_REG_3P0_SET_BO_OFFSET_SHIFT (4U) -#define PMU_REG_3P0_SET_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_BO_OFFSET_SHIFT)) & PMU_REG_3P0_SET_BO_OFFSET_MASK) - -#define PMU_REG_3P0_SET_VBUS_SEL_MASK (0x80U) -#define PMU_REG_3P0_SET_VBUS_SEL_SHIFT (7U) -/*! VBUS_SEL - * 0b1..Utilize VBUS OTG1 power - * 0b0..Utilize VBUS OTG2 power - */ -#define PMU_REG_3P0_SET_VBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_VBUS_SEL_SHIFT)) & PMU_REG_3P0_SET_VBUS_SEL_MASK) - -#define PMU_REG_3P0_SET_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_3P0_SET_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.625V - * 0b01111..3.000V - * 0b11111..3.400V - */ -#define PMU_REG_3P0_SET_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_OUTPUT_TRG_SHIFT)) & PMU_REG_3P0_SET_OUTPUT_TRG_MASK) - -#define PMU_REG_3P0_SET_BO_VDD3P0_MASK (0x10000U) -#define PMU_REG_3P0_SET_BO_VDD3P0_SHIFT (16U) -#define PMU_REG_3P0_SET_BO_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_BO_VDD3P0_SHIFT)) & PMU_REG_3P0_SET_BO_VDD3P0_MASK) - -#define PMU_REG_3P0_SET_OK_VDD3P0_MASK (0x20000U) -#define PMU_REG_3P0_SET_OK_VDD3P0_SHIFT (17U) -#define PMU_REG_3P0_SET_OK_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_SET_OK_VDD3P0_SHIFT)) & PMU_REG_3P0_SET_OK_VDD3P0_MASK) -/*! @} */ - -/*! @name REG_3P0_CLR - Regulator 3P0 Register */ -/*! @{ */ - -#define PMU_REG_3P0_CLR_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_3P0_CLR_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_3P0_CLR_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_ENABLE_LINREG_SHIFT)) & PMU_REG_3P0_CLR_ENABLE_LINREG_MASK) - -#define PMU_REG_3P0_CLR_ENABLE_BO_MASK (0x2U) -#define PMU_REG_3P0_CLR_ENABLE_BO_SHIFT (1U) -#define PMU_REG_3P0_CLR_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_ENABLE_BO_SHIFT)) & PMU_REG_3P0_CLR_ENABLE_BO_MASK) - -#define PMU_REG_3P0_CLR_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_3P0_CLR_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_3P0_CLR_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_ENABLE_ILIMIT_SHIFT)) & PMU_REG_3P0_CLR_ENABLE_ILIMIT_MASK) - -#define PMU_REG_3P0_CLR_BO_OFFSET_MASK (0x70U) -#define PMU_REG_3P0_CLR_BO_OFFSET_SHIFT (4U) -#define PMU_REG_3P0_CLR_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_BO_OFFSET_SHIFT)) & PMU_REG_3P0_CLR_BO_OFFSET_MASK) - -#define PMU_REG_3P0_CLR_VBUS_SEL_MASK (0x80U) -#define PMU_REG_3P0_CLR_VBUS_SEL_SHIFT (7U) -/*! VBUS_SEL - * 0b1..Utilize VBUS OTG1 power - * 0b0..Utilize VBUS OTG2 power - */ -#define PMU_REG_3P0_CLR_VBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_VBUS_SEL_SHIFT)) & PMU_REG_3P0_CLR_VBUS_SEL_MASK) - -#define PMU_REG_3P0_CLR_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_3P0_CLR_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.625V - * 0b01111..3.000V - * 0b11111..3.400V - */ -#define PMU_REG_3P0_CLR_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_OUTPUT_TRG_SHIFT)) & PMU_REG_3P0_CLR_OUTPUT_TRG_MASK) - -#define PMU_REG_3P0_CLR_BO_VDD3P0_MASK (0x10000U) -#define PMU_REG_3P0_CLR_BO_VDD3P0_SHIFT (16U) -#define PMU_REG_3P0_CLR_BO_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_BO_VDD3P0_SHIFT)) & PMU_REG_3P0_CLR_BO_VDD3P0_MASK) - -#define PMU_REG_3P0_CLR_OK_VDD3P0_MASK (0x20000U) -#define PMU_REG_3P0_CLR_OK_VDD3P0_SHIFT (17U) -#define PMU_REG_3P0_CLR_OK_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_CLR_OK_VDD3P0_SHIFT)) & PMU_REG_3P0_CLR_OK_VDD3P0_MASK) -/*! @} */ - -/*! @name REG_3P0_TOG - Regulator 3P0 Register */ -/*! @{ */ - -#define PMU_REG_3P0_TOG_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_3P0_TOG_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_3P0_TOG_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_ENABLE_LINREG_SHIFT)) & PMU_REG_3P0_TOG_ENABLE_LINREG_MASK) - -#define PMU_REG_3P0_TOG_ENABLE_BO_MASK (0x2U) -#define PMU_REG_3P0_TOG_ENABLE_BO_SHIFT (1U) -#define PMU_REG_3P0_TOG_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_ENABLE_BO_SHIFT)) & PMU_REG_3P0_TOG_ENABLE_BO_MASK) - -#define PMU_REG_3P0_TOG_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_3P0_TOG_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_3P0_TOG_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_ENABLE_ILIMIT_SHIFT)) & PMU_REG_3P0_TOG_ENABLE_ILIMIT_MASK) - -#define PMU_REG_3P0_TOG_BO_OFFSET_MASK (0x70U) -#define PMU_REG_3P0_TOG_BO_OFFSET_SHIFT (4U) -#define PMU_REG_3P0_TOG_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_BO_OFFSET_SHIFT)) & PMU_REG_3P0_TOG_BO_OFFSET_MASK) - -#define PMU_REG_3P0_TOG_VBUS_SEL_MASK (0x80U) -#define PMU_REG_3P0_TOG_VBUS_SEL_SHIFT (7U) -/*! VBUS_SEL - * 0b1..Utilize VBUS OTG1 power - * 0b0..Utilize VBUS OTG2 power - */ -#define PMU_REG_3P0_TOG_VBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_VBUS_SEL_SHIFT)) & PMU_REG_3P0_TOG_VBUS_SEL_MASK) - -#define PMU_REG_3P0_TOG_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_3P0_TOG_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.625V - * 0b01111..3.000V - * 0b11111..3.400V - */ -#define PMU_REG_3P0_TOG_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_OUTPUT_TRG_SHIFT)) & PMU_REG_3P0_TOG_OUTPUT_TRG_MASK) - -#define PMU_REG_3P0_TOG_BO_VDD3P0_MASK (0x10000U) -#define PMU_REG_3P0_TOG_BO_VDD3P0_SHIFT (16U) -#define PMU_REG_3P0_TOG_BO_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_BO_VDD3P0_SHIFT)) & PMU_REG_3P0_TOG_BO_VDD3P0_MASK) - -#define PMU_REG_3P0_TOG_OK_VDD3P0_MASK (0x20000U) -#define PMU_REG_3P0_TOG_OK_VDD3P0_SHIFT (17U) -#define PMU_REG_3P0_TOG_OK_VDD3P0(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_3P0_TOG_OK_VDD3P0_SHIFT)) & PMU_REG_3P0_TOG_OK_VDD3P0_MASK) -/*! @} */ - -/*! @name REG_2P5 - Regulator 2P5 Register */ -/*! @{ */ - -#define PMU_REG_2P5_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_2P5_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_2P5_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_ENABLE_LINREG_SHIFT)) & PMU_REG_2P5_ENABLE_LINREG_MASK) - -#define PMU_REG_2P5_ENABLE_BO_MASK (0x2U) -#define PMU_REG_2P5_ENABLE_BO_SHIFT (1U) -#define PMU_REG_2P5_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_ENABLE_BO_SHIFT)) & PMU_REG_2P5_ENABLE_BO_MASK) - -#define PMU_REG_2P5_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_2P5_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_2P5_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_ENABLE_ILIMIT_SHIFT)) & PMU_REG_2P5_ENABLE_ILIMIT_MASK) - -#define PMU_REG_2P5_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_2P5_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_2P5_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_2P5_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_2P5_BO_OFFSET_MASK (0x70U) -#define PMU_REG_2P5_BO_OFFSET_SHIFT (4U) -#define PMU_REG_2P5_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_BO_OFFSET_SHIFT)) & PMU_REG_2P5_BO_OFFSET_MASK) - -#define PMU_REG_2P5_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_2P5_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.10V - * 0b10000..2.50V - * 0b11111..2.875V - */ -#define PMU_REG_2P5_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_OUTPUT_TRG_SHIFT)) & PMU_REG_2P5_OUTPUT_TRG_MASK) - -#define PMU_REG_2P5_BO_VDD2P5_MASK (0x10000U) -#define PMU_REG_2P5_BO_VDD2P5_SHIFT (16U) -#define PMU_REG_2P5_BO_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_BO_VDD2P5_SHIFT)) & PMU_REG_2P5_BO_VDD2P5_MASK) - -#define PMU_REG_2P5_OK_VDD2P5_MASK (0x20000U) -#define PMU_REG_2P5_OK_VDD2P5_SHIFT (17U) -#define PMU_REG_2P5_OK_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_OK_VDD2P5_SHIFT)) & PMU_REG_2P5_OK_VDD2P5_MASK) - -#define PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_2P5_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_2P5_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_2P5_SET - Regulator 2P5 Register */ -/*! @{ */ - -#define PMU_REG_2P5_SET_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_2P5_SET_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_2P5_SET_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_ENABLE_LINREG_SHIFT)) & PMU_REG_2P5_SET_ENABLE_LINREG_MASK) - -#define PMU_REG_2P5_SET_ENABLE_BO_MASK (0x2U) -#define PMU_REG_2P5_SET_ENABLE_BO_SHIFT (1U) -#define PMU_REG_2P5_SET_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_ENABLE_BO_SHIFT)) & PMU_REG_2P5_SET_ENABLE_BO_MASK) - -#define PMU_REG_2P5_SET_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_2P5_SET_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_2P5_SET_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_ENABLE_ILIMIT_SHIFT)) & PMU_REG_2P5_SET_ENABLE_ILIMIT_MASK) - -#define PMU_REG_2P5_SET_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_2P5_SET_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_2P5_SET_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_2P5_SET_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_2P5_SET_BO_OFFSET_MASK (0x70U) -#define PMU_REG_2P5_SET_BO_OFFSET_SHIFT (4U) -#define PMU_REG_2P5_SET_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_BO_OFFSET_SHIFT)) & PMU_REG_2P5_SET_BO_OFFSET_MASK) - -#define PMU_REG_2P5_SET_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_2P5_SET_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.10V - * 0b10000..2.50V - * 0b11111..2.875V - */ -#define PMU_REG_2P5_SET_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_OUTPUT_TRG_SHIFT)) & PMU_REG_2P5_SET_OUTPUT_TRG_MASK) - -#define PMU_REG_2P5_SET_BO_VDD2P5_MASK (0x10000U) -#define PMU_REG_2P5_SET_BO_VDD2P5_SHIFT (16U) -#define PMU_REG_2P5_SET_BO_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_BO_VDD2P5_SHIFT)) & PMU_REG_2P5_SET_BO_VDD2P5_MASK) - -#define PMU_REG_2P5_SET_OK_VDD2P5_MASK (0x20000U) -#define PMU_REG_2P5_SET_OK_VDD2P5_SHIFT (17U) -#define PMU_REG_2P5_SET_OK_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_OK_VDD2P5_SHIFT)) & PMU_REG_2P5_SET_OK_VDD2P5_MASK) - -#define PMU_REG_2P5_SET_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_2P5_SET_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_2P5_SET_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_SET_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_2P5_SET_ENABLE_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_2P5_CLR - Regulator 2P5 Register */ -/*! @{ */ - -#define PMU_REG_2P5_CLR_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_2P5_CLR_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_2P5_CLR_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_ENABLE_LINREG_SHIFT)) & PMU_REG_2P5_CLR_ENABLE_LINREG_MASK) - -#define PMU_REG_2P5_CLR_ENABLE_BO_MASK (0x2U) -#define PMU_REG_2P5_CLR_ENABLE_BO_SHIFT (1U) -#define PMU_REG_2P5_CLR_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_ENABLE_BO_SHIFT)) & PMU_REG_2P5_CLR_ENABLE_BO_MASK) - -#define PMU_REG_2P5_CLR_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_2P5_CLR_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_2P5_CLR_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_ENABLE_ILIMIT_SHIFT)) & PMU_REG_2P5_CLR_ENABLE_ILIMIT_MASK) - -#define PMU_REG_2P5_CLR_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_2P5_CLR_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_2P5_CLR_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_2P5_CLR_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_2P5_CLR_BO_OFFSET_MASK (0x70U) -#define PMU_REG_2P5_CLR_BO_OFFSET_SHIFT (4U) -#define PMU_REG_2P5_CLR_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_BO_OFFSET_SHIFT)) & PMU_REG_2P5_CLR_BO_OFFSET_MASK) - -#define PMU_REG_2P5_CLR_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_2P5_CLR_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.10V - * 0b10000..2.50V - * 0b11111..2.875V - */ -#define PMU_REG_2P5_CLR_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_OUTPUT_TRG_SHIFT)) & PMU_REG_2P5_CLR_OUTPUT_TRG_MASK) - -#define PMU_REG_2P5_CLR_BO_VDD2P5_MASK (0x10000U) -#define PMU_REG_2P5_CLR_BO_VDD2P5_SHIFT (16U) -#define PMU_REG_2P5_CLR_BO_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_BO_VDD2P5_SHIFT)) & PMU_REG_2P5_CLR_BO_VDD2P5_MASK) - -#define PMU_REG_2P5_CLR_OK_VDD2P5_MASK (0x20000U) -#define PMU_REG_2P5_CLR_OK_VDD2P5_SHIFT (17U) -#define PMU_REG_2P5_CLR_OK_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_OK_VDD2P5_SHIFT)) & PMU_REG_2P5_CLR_OK_VDD2P5_MASK) - -#define PMU_REG_2P5_CLR_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_2P5_CLR_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_2P5_CLR_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_CLR_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_2P5_CLR_ENABLE_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_2P5_TOG - Regulator 2P5 Register */ -/*! @{ */ - -#define PMU_REG_2P5_TOG_ENABLE_LINREG_MASK (0x1U) -#define PMU_REG_2P5_TOG_ENABLE_LINREG_SHIFT (0U) -#define PMU_REG_2P5_TOG_ENABLE_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_ENABLE_LINREG_SHIFT)) & PMU_REG_2P5_TOG_ENABLE_LINREG_MASK) - -#define PMU_REG_2P5_TOG_ENABLE_BO_MASK (0x2U) -#define PMU_REG_2P5_TOG_ENABLE_BO_SHIFT (1U) -#define PMU_REG_2P5_TOG_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_ENABLE_BO_SHIFT)) & PMU_REG_2P5_TOG_ENABLE_BO_MASK) - -#define PMU_REG_2P5_TOG_ENABLE_ILIMIT_MASK (0x4U) -#define PMU_REG_2P5_TOG_ENABLE_ILIMIT_SHIFT (2U) -#define PMU_REG_2P5_TOG_ENABLE_ILIMIT(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_ENABLE_ILIMIT_SHIFT)) & PMU_REG_2P5_TOG_ENABLE_ILIMIT_MASK) - -#define PMU_REG_2P5_TOG_ENABLE_PULLDOWN_MASK (0x8U) -#define PMU_REG_2P5_TOG_ENABLE_PULLDOWN_SHIFT (3U) -#define PMU_REG_2P5_TOG_ENABLE_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_ENABLE_PULLDOWN_SHIFT)) & PMU_REG_2P5_TOG_ENABLE_PULLDOWN_MASK) - -#define PMU_REG_2P5_TOG_BO_OFFSET_MASK (0x70U) -#define PMU_REG_2P5_TOG_BO_OFFSET_SHIFT (4U) -#define PMU_REG_2P5_TOG_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_BO_OFFSET_SHIFT)) & PMU_REG_2P5_TOG_BO_OFFSET_MASK) - -#define PMU_REG_2P5_TOG_OUTPUT_TRG_MASK (0x1F00U) -#define PMU_REG_2P5_TOG_OUTPUT_TRG_SHIFT (8U) -/*! OUTPUT_TRG - * 0b00000..2.10V - * 0b10000..2.50V - * 0b11111..2.875V - */ -#define PMU_REG_2P5_TOG_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_OUTPUT_TRG_SHIFT)) & PMU_REG_2P5_TOG_OUTPUT_TRG_MASK) - -#define PMU_REG_2P5_TOG_BO_VDD2P5_MASK (0x10000U) -#define PMU_REG_2P5_TOG_BO_VDD2P5_SHIFT (16U) -#define PMU_REG_2P5_TOG_BO_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_BO_VDD2P5_SHIFT)) & PMU_REG_2P5_TOG_BO_VDD2P5_MASK) - -#define PMU_REG_2P5_TOG_OK_VDD2P5_MASK (0x20000U) -#define PMU_REG_2P5_TOG_OK_VDD2P5_SHIFT (17U) -#define PMU_REG_2P5_TOG_OK_VDD2P5(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_OK_VDD2P5_SHIFT)) & PMU_REG_2P5_TOG_OK_VDD2P5_MASK) - -#define PMU_REG_2P5_TOG_ENABLE_WEAK_LINREG_MASK (0x40000U) -#define PMU_REG_2P5_TOG_ENABLE_WEAK_LINREG_SHIFT (18U) -#define PMU_REG_2P5_TOG_ENABLE_WEAK_LINREG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_2P5_TOG_ENABLE_WEAK_LINREG_SHIFT)) & PMU_REG_2P5_TOG_ENABLE_WEAK_LINREG_MASK) -/*! @} */ - -/*! @name REG_CORE - Digital Regulator Core Register */ -/*! @{ */ - -#define PMU_REG_CORE_REG0_TARG_MASK (0x1FU) -#define PMU_REG_CORE_REG0_TARG_SHIFT (0U) -/*! REG0_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_REG0_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG0_TARG_SHIFT)) & PMU_REG_CORE_REG0_TARG_MASK) - -#define PMU_REG_CORE_REG0_ADJ_MASK (0x1E0U) -#define PMU_REG_CORE_REG0_ADJ_SHIFT (5U) -/*! REG0_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg0. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_REG0_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG0_ADJ_SHIFT)) & PMU_REG_CORE_REG0_ADJ_MASK) - -#define PMU_REG_CORE_REG1_TARG_MASK (0x3E00U) -#define PMU_REG_CORE_REG1_TARG_SHIFT (9U) -/*! REG1_TARG - This bit field defines the target voltage for the vpu/gpu power domain. Single bit - * increments reflect 25mV core voltage steps. Not all steps will make sense to use either because - * of input supply limitations or load operation. - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_REG1_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG1_TARG_SHIFT)) & PMU_REG_CORE_REG1_TARG_MASK) - -#define PMU_REG_CORE_REG1_ADJ_MASK (0x3C000U) -#define PMU_REG_CORE_REG1_ADJ_SHIFT (14U) -/*! REG1_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg1. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_REG1_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG1_ADJ_SHIFT)) & PMU_REG_CORE_REG1_ADJ_MASK) - -#define PMU_REG_CORE_REG2_TARG_MASK (0x7C0000U) -#define PMU_REG_CORE_REG2_TARG_SHIFT (18U) -/*! REG2_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_REG2_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG2_TARG_SHIFT)) & PMU_REG_CORE_REG2_TARG_MASK) - -#define PMU_REG_CORE_REG2_ADJ_MASK (0x7800000U) -#define PMU_REG_CORE_REG2_ADJ_SHIFT (23U) -/*! REG2_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg2. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_REG2_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_REG2_ADJ_SHIFT)) & PMU_REG_CORE_REG2_ADJ_MASK) - -#define PMU_REG_CORE_RAMP_RATE_MASK (0x18000000U) -#define PMU_REG_CORE_RAMP_RATE_SHIFT (27U) -/*! RAMP_RATE - * 0b00..Fast - * 0b01..Medium Fast - * 0b10..Medium Slow - * 0b11..Slow - */ -#define PMU_REG_CORE_RAMP_RATE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_RAMP_RATE_SHIFT)) & PMU_REG_CORE_RAMP_RATE_MASK) - -#define PMU_REG_CORE_FET_ODRIVE_MASK (0x20000000U) -#define PMU_REG_CORE_FET_ODRIVE_SHIFT (29U) -#define PMU_REG_CORE_FET_ODRIVE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_FET_ODRIVE_SHIFT)) & PMU_REG_CORE_FET_ODRIVE_MASK) -/*! @} */ - -/*! @name REG_CORE_SET - Digital Regulator Core Register */ -/*! @{ */ - -#define PMU_REG_CORE_SET_REG0_TARG_MASK (0x1FU) -#define PMU_REG_CORE_SET_REG0_TARG_SHIFT (0U) -/*! REG0_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_SET_REG0_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG0_TARG_SHIFT)) & PMU_REG_CORE_SET_REG0_TARG_MASK) - -#define PMU_REG_CORE_SET_REG0_ADJ_MASK (0x1E0U) -#define PMU_REG_CORE_SET_REG0_ADJ_SHIFT (5U) -/*! REG0_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg0. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_SET_REG0_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG0_ADJ_SHIFT)) & PMU_REG_CORE_SET_REG0_ADJ_MASK) - -#define PMU_REG_CORE_SET_REG1_TARG_MASK (0x3E00U) -#define PMU_REG_CORE_SET_REG1_TARG_SHIFT (9U) -/*! REG1_TARG - This bit field defines the target voltage for the vpu/gpu power domain. Single bit - * increments reflect 25mV core voltage steps. Not all steps will make sense to use either because - * of input supply limitations or load operation. - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_SET_REG1_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG1_TARG_SHIFT)) & PMU_REG_CORE_SET_REG1_TARG_MASK) - -#define PMU_REG_CORE_SET_REG1_ADJ_MASK (0x3C000U) -#define PMU_REG_CORE_SET_REG1_ADJ_SHIFT (14U) -/*! REG1_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg1. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_SET_REG1_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG1_ADJ_SHIFT)) & PMU_REG_CORE_SET_REG1_ADJ_MASK) - -#define PMU_REG_CORE_SET_REG2_TARG_MASK (0x7C0000U) -#define PMU_REG_CORE_SET_REG2_TARG_SHIFT (18U) -/*! REG2_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_SET_REG2_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG2_TARG_SHIFT)) & PMU_REG_CORE_SET_REG2_TARG_MASK) - -#define PMU_REG_CORE_SET_REG2_ADJ_MASK (0x7800000U) -#define PMU_REG_CORE_SET_REG2_ADJ_SHIFT (23U) -/*! REG2_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg2. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_SET_REG2_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_REG2_ADJ_SHIFT)) & PMU_REG_CORE_SET_REG2_ADJ_MASK) - -#define PMU_REG_CORE_SET_RAMP_RATE_MASK (0x18000000U) -#define PMU_REG_CORE_SET_RAMP_RATE_SHIFT (27U) -/*! RAMP_RATE - * 0b00..Fast - * 0b01..Medium Fast - * 0b10..Medium Slow - * 0b11..Slow - */ -#define PMU_REG_CORE_SET_RAMP_RATE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_RAMP_RATE_SHIFT)) & PMU_REG_CORE_SET_RAMP_RATE_MASK) - -#define PMU_REG_CORE_SET_FET_ODRIVE_MASK (0x20000000U) -#define PMU_REG_CORE_SET_FET_ODRIVE_SHIFT (29U) -#define PMU_REG_CORE_SET_FET_ODRIVE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_SET_FET_ODRIVE_SHIFT)) & PMU_REG_CORE_SET_FET_ODRIVE_MASK) -/*! @} */ - -/*! @name REG_CORE_CLR - Digital Regulator Core Register */ -/*! @{ */ - -#define PMU_REG_CORE_CLR_REG0_TARG_MASK (0x1FU) -#define PMU_REG_CORE_CLR_REG0_TARG_SHIFT (0U) -/*! REG0_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_CLR_REG0_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG0_TARG_SHIFT)) & PMU_REG_CORE_CLR_REG0_TARG_MASK) - -#define PMU_REG_CORE_CLR_REG0_ADJ_MASK (0x1E0U) -#define PMU_REG_CORE_CLR_REG0_ADJ_SHIFT (5U) -/*! REG0_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg0. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_CLR_REG0_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG0_ADJ_SHIFT)) & PMU_REG_CORE_CLR_REG0_ADJ_MASK) - -#define PMU_REG_CORE_CLR_REG1_TARG_MASK (0x3E00U) -#define PMU_REG_CORE_CLR_REG1_TARG_SHIFT (9U) -/*! REG1_TARG - This bit field defines the target voltage for the vpu/gpu power domain. Single bit - * increments reflect 25mV core voltage steps. Not all steps will make sense to use either because - * of input supply limitations or load operation. - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_CLR_REG1_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG1_TARG_SHIFT)) & PMU_REG_CORE_CLR_REG1_TARG_MASK) - -#define PMU_REG_CORE_CLR_REG1_ADJ_MASK (0x3C000U) -#define PMU_REG_CORE_CLR_REG1_ADJ_SHIFT (14U) -/*! REG1_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg1. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_CLR_REG1_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG1_ADJ_SHIFT)) & PMU_REG_CORE_CLR_REG1_ADJ_MASK) - -#define PMU_REG_CORE_CLR_REG2_TARG_MASK (0x7C0000U) -#define PMU_REG_CORE_CLR_REG2_TARG_SHIFT (18U) -/*! REG2_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_CLR_REG2_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG2_TARG_SHIFT)) & PMU_REG_CORE_CLR_REG2_TARG_MASK) - -#define PMU_REG_CORE_CLR_REG2_ADJ_MASK (0x7800000U) -#define PMU_REG_CORE_CLR_REG2_ADJ_SHIFT (23U) -/*! REG2_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg2. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_CLR_REG2_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_REG2_ADJ_SHIFT)) & PMU_REG_CORE_CLR_REG2_ADJ_MASK) - -#define PMU_REG_CORE_CLR_RAMP_RATE_MASK (0x18000000U) -#define PMU_REG_CORE_CLR_RAMP_RATE_SHIFT (27U) -/*! RAMP_RATE - * 0b00..Fast - * 0b01..Medium Fast - * 0b10..Medium Slow - * 0b11..Slow - */ -#define PMU_REG_CORE_CLR_RAMP_RATE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_RAMP_RATE_SHIFT)) & PMU_REG_CORE_CLR_RAMP_RATE_MASK) - -#define PMU_REG_CORE_CLR_FET_ODRIVE_MASK (0x20000000U) -#define PMU_REG_CORE_CLR_FET_ODRIVE_SHIFT (29U) -#define PMU_REG_CORE_CLR_FET_ODRIVE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_CLR_FET_ODRIVE_SHIFT)) & PMU_REG_CORE_CLR_FET_ODRIVE_MASK) -/*! @} */ - -/*! @name REG_CORE_TOG - Digital Regulator Core Register */ -/*! @{ */ - -#define PMU_REG_CORE_TOG_REG0_TARG_MASK (0x1FU) -#define PMU_REG_CORE_TOG_REG0_TARG_SHIFT (0U) -/*! REG0_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_TOG_REG0_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG0_TARG_SHIFT)) & PMU_REG_CORE_TOG_REG0_TARG_MASK) - -#define PMU_REG_CORE_TOG_REG0_ADJ_MASK (0x1E0U) -#define PMU_REG_CORE_TOG_REG0_ADJ_SHIFT (5U) -/*! REG0_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg0. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_TOG_REG0_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG0_ADJ_SHIFT)) & PMU_REG_CORE_TOG_REG0_ADJ_MASK) - -#define PMU_REG_CORE_TOG_REG1_TARG_MASK (0x3E00U) -#define PMU_REG_CORE_TOG_REG1_TARG_SHIFT (9U) -/*! REG1_TARG - This bit field defines the target voltage for the vpu/gpu power domain. Single bit - * increments reflect 25mV core voltage steps. Not all steps will make sense to use either because - * of input supply limitations or load operation. - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_TOG_REG1_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG1_TARG_SHIFT)) & PMU_REG_CORE_TOG_REG1_TARG_MASK) - -#define PMU_REG_CORE_TOG_REG1_ADJ_MASK (0x3C000U) -#define PMU_REG_CORE_TOG_REG1_ADJ_SHIFT (14U) -/*! REG1_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg1. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_TOG_REG1_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG1_ADJ_SHIFT)) & PMU_REG_CORE_TOG_REG1_ADJ_MASK) - -#define PMU_REG_CORE_TOG_REG2_TARG_MASK (0x7C0000U) -#define PMU_REG_CORE_TOG_REG2_TARG_SHIFT (18U) -/*! REG2_TARG - * 0b00000..Power gated off - * 0b00001..Target core voltage = 0.725V - * 0b00010..Target core voltage = 0.750V - * 0b00011..Target core voltage = 0.775V - * 0b10000..Target core voltage = 1.100V - * 0b11110..Target core voltage = 1.450V - * 0b11111..Power FET switched full on. No regulation. - */ -#define PMU_REG_CORE_TOG_REG2_TARG(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG2_TARG_SHIFT)) & PMU_REG_CORE_TOG_REG2_TARG_MASK) - -#define PMU_REG_CORE_TOG_REG2_ADJ_MASK (0x7800000U) -#define PMU_REG_CORE_TOG_REG2_ADJ_SHIFT (23U) -/*! REG2_ADJ - This bit field defines the adjustment bits to calibrate the target value of Reg2. The - * adjustment is applied on top on any adjustment applied to the global reference in the misc0 - * register. - * 0b0000..No adjustment - * 0b0001..+ 0.25% - * 0b0010..+ 0.50% - * 0b0011..+ 0.75% - * 0b0100..+ 1.00% - * 0b0101..+ 1.25% - * 0b0110..+ 1.50% - * 0b0111..+ 1.75% - * 0b1000..- 0.25% - * 0b1001..- 0.50% - * 0b1010..- 0.75% - * 0b1011..- 1.00% - * 0b1100..- 1.25% - * 0b1101..- 1.50% - * 0b1110..- 1.75% - * 0b1111..- 2.00% - */ -#define PMU_REG_CORE_TOG_REG2_ADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_REG2_ADJ_SHIFT)) & PMU_REG_CORE_TOG_REG2_ADJ_MASK) - -#define PMU_REG_CORE_TOG_RAMP_RATE_MASK (0x18000000U) -#define PMU_REG_CORE_TOG_RAMP_RATE_SHIFT (27U) -/*! RAMP_RATE - * 0b00..Fast - * 0b01..Medium Fast - * 0b10..Medium Slow - * 0b11..Slow - */ -#define PMU_REG_CORE_TOG_RAMP_RATE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_RAMP_RATE_SHIFT)) & PMU_REG_CORE_TOG_RAMP_RATE_MASK) - -#define PMU_REG_CORE_TOG_FET_ODRIVE_MASK (0x20000000U) -#define PMU_REG_CORE_TOG_FET_ODRIVE_SHIFT (29U) -#define PMU_REG_CORE_TOG_FET_ODRIVE(x) (((uint32_t)(((uint32_t)(x)) << PMU_REG_CORE_TOG_FET_ODRIVE_SHIFT)) & PMU_REG_CORE_TOG_FET_ODRIVE_MASK) -/*! @} */ - -/*! @name MISC0 - Miscellaneous Register 0 */ -/*! @{ */ - -#define PMU_MISC0_REFTOP_PWD_MASK (0x1U) -#define PMU_MISC0_REFTOP_PWD_SHIFT (0U) -#define PMU_MISC0_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_REFTOP_PWD_SHIFT)) & PMU_MISC0_REFTOP_PWD_MASK) - -#define PMU_MISC0_REFTOP_SELFBIASOFF_MASK (0x8U) -#define PMU_MISC0_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define PMU_MISC0_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_REFTOP_SELFBIASOFF_SHIFT)) & PMU_MISC0_REFTOP_SELFBIASOFF_MASK) - -#define PMU_MISC0_REFTOP_VBGADJ_MASK (0x70U) -#define PMU_MISC0_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define PMU_MISC0_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_REFTOP_VBGADJ_SHIFT)) & PMU_MISC0_REFTOP_VBGADJ_MASK) - -#define PMU_MISC0_REFTOP_VBGUP_MASK (0x80U) -#define PMU_MISC0_REFTOP_VBGUP_SHIFT (7U) -#define PMU_MISC0_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_REFTOP_VBGUP_SHIFT)) & PMU_MISC0_REFTOP_VBGUP_MASK) - -#define PMU_MISC0_STOP_MODE_CONFIG_MASK (0xC00U) -#define PMU_MISC0_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..SUSPEND (DSM) - * 0b01..Analog regulators are ON. - * 0b10..STOP (lower power) - * 0b11..STOP (very lower power) - */ -#define PMU_MISC0_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_STOP_MODE_CONFIG_SHIFT)) & PMU_MISC0_STOP_MODE_CONFIG_MASK) - -#define PMU_MISC0_DISCON_HIGH_SNVS_MASK (0x1000U) -#define PMU_MISC0_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define PMU_MISC0_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_DISCON_HIGH_SNVS_SHIFT)) & PMU_MISC0_DISCON_HIGH_SNVS_MASK) - -#define PMU_MISC0_OSC_I_MASK (0x6000U) -#define PMU_MISC0_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define PMU_MISC0_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_OSC_I_SHIFT)) & PMU_MISC0_OSC_I_MASK) - -#define PMU_MISC0_OSC_XTALOK_MASK (0x8000U) -#define PMU_MISC0_OSC_XTALOK_SHIFT (15U) -#define PMU_MISC0_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_OSC_XTALOK_SHIFT)) & PMU_MISC0_OSC_XTALOK_MASK) - -#define PMU_MISC0_OSC_XTALOK_EN_MASK (0x10000U) -#define PMU_MISC0_OSC_XTALOK_EN_SHIFT (16U) -#define PMU_MISC0_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_OSC_XTALOK_EN_SHIFT)) & PMU_MISC0_OSC_XTALOK_EN_MASK) - -#define PMU_MISC0_CLKGATE_CTRL_MASK (0x2000000U) -#define PMU_MISC0_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define PMU_MISC0_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLKGATE_CTRL_SHIFT)) & PMU_MISC0_CLKGATE_CTRL_MASK) - -#define PMU_MISC0_CLKGATE_DELAY_MASK (0x1C000000U) -#define PMU_MISC0_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define PMU_MISC0_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLKGATE_DELAY_SHIFT)) & PMU_MISC0_CLKGATE_DELAY_MASK) - -#define PMU_MISC0_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define PMU_MISC0_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define PMU_MISC0_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_RTC_XTAL_SOURCE_SHIFT)) & PMU_MISC0_RTC_XTAL_SOURCE_MASK) - -#define PMU_MISC0_XTAL_24M_PWD_MASK (0x40000000U) -#define PMU_MISC0_XTAL_24M_PWD_SHIFT (30U) -#define PMU_MISC0_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_XTAL_24M_PWD_SHIFT)) & PMU_MISC0_XTAL_24M_PWD_MASK) - -#define PMU_MISC0_VID_PLL_PREDIV_MASK (0x80000000U) -#define PMU_MISC0_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define PMU_MISC0_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_VID_PLL_PREDIV_SHIFT)) & PMU_MISC0_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_SET - Miscellaneous Register 0 */ -/*! @{ */ - -#define PMU_MISC0_SET_REFTOP_PWD_MASK (0x1U) -#define PMU_MISC0_SET_REFTOP_PWD_SHIFT (0U) -#define PMU_MISC0_SET_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_REFTOP_PWD_SHIFT)) & PMU_MISC0_SET_REFTOP_PWD_MASK) - -#define PMU_MISC0_SET_REFTOP_SELFBIASOFF_MASK (0x8U) -#define PMU_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define PMU_MISC0_SET_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT)) & PMU_MISC0_SET_REFTOP_SELFBIASOFF_MASK) - -#define PMU_MISC0_SET_REFTOP_VBGADJ_MASK (0x70U) -#define PMU_MISC0_SET_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define PMU_MISC0_SET_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_REFTOP_VBGADJ_SHIFT)) & PMU_MISC0_SET_REFTOP_VBGADJ_MASK) - -#define PMU_MISC0_SET_REFTOP_VBGUP_MASK (0x80U) -#define PMU_MISC0_SET_REFTOP_VBGUP_SHIFT (7U) -#define PMU_MISC0_SET_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_REFTOP_VBGUP_SHIFT)) & PMU_MISC0_SET_REFTOP_VBGUP_MASK) - -#define PMU_MISC0_SET_STOP_MODE_CONFIG_MASK (0xC00U) -#define PMU_MISC0_SET_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..SUSPEND (DSM) - * 0b01..Analog regulators are ON. - * 0b10..STOP (lower power) - * 0b11..STOP (very lower power) - */ -#define PMU_MISC0_SET_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_STOP_MODE_CONFIG_SHIFT)) & PMU_MISC0_SET_STOP_MODE_CONFIG_MASK) - -#define PMU_MISC0_SET_DISCON_HIGH_SNVS_MASK (0x1000U) -#define PMU_MISC0_SET_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define PMU_MISC0_SET_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_DISCON_HIGH_SNVS_SHIFT)) & PMU_MISC0_SET_DISCON_HIGH_SNVS_MASK) - -#define PMU_MISC0_SET_OSC_I_MASK (0x6000U) -#define PMU_MISC0_SET_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define PMU_MISC0_SET_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_OSC_I_SHIFT)) & PMU_MISC0_SET_OSC_I_MASK) - -#define PMU_MISC0_SET_OSC_XTALOK_MASK (0x8000U) -#define PMU_MISC0_SET_OSC_XTALOK_SHIFT (15U) -#define PMU_MISC0_SET_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_OSC_XTALOK_SHIFT)) & PMU_MISC0_SET_OSC_XTALOK_MASK) - -#define PMU_MISC0_SET_OSC_XTALOK_EN_MASK (0x10000U) -#define PMU_MISC0_SET_OSC_XTALOK_EN_SHIFT (16U) -#define PMU_MISC0_SET_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_OSC_XTALOK_EN_SHIFT)) & PMU_MISC0_SET_OSC_XTALOK_EN_MASK) - -#define PMU_MISC0_SET_CLKGATE_CTRL_MASK (0x2000000U) -#define PMU_MISC0_SET_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define PMU_MISC0_SET_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_CLKGATE_CTRL_SHIFT)) & PMU_MISC0_SET_CLKGATE_CTRL_MASK) - -#define PMU_MISC0_SET_CLKGATE_DELAY_MASK (0x1C000000U) -#define PMU_MISC0_SET_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define PMU_MISC0_SET_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_CLKGATE_DELAY_SHIFT)) & PMU_MISC0_SET_CLKGATE_DELAY_MASK) - -#define PMU_MISC0_SET_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define PMU_MISC0_SET_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define PMU_MISC0_SET_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_RTC_XTAL_SOURCE_SHIFT)) & PMU_MISC0_SET_RTC_XTAL_SOURCE_MASK) - -#define PMU_MISC0_SET_XTAL_24M_PWD_MASK (0x40000000U) -#define PMU_MISC0_SET_XTAL_24M_PWD_SHIFT (30U) -#define PMU_MISC0_SET_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_XTAL_24M_PWD_SHIFT)) & PMU_MISC0_SET_XTAL_24M_PWD_MASK) - -#define PMU_MISC0_SET_VID_PLL_PREDIV_MASK (0x80000000U) -#define PMU_MISC0_SET_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define PMU_MISC0_SET_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_SET_VID_PLL_PREDIV_SHIFT)) & PMU_MISC0_SET_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_CLR - Miscellaneous Register 0 */ -/*! @{ */ - -#define PMU_MISC0_CLR_REFTOP_PWD_MASK (0x1U) -#define PMU_MISC0_CLR_REFTOP_PWD_SHIFT (0U) -#define PMU_MISC0_CLR_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_REFTOP_PWD_SHIFT)) & PMU_MISC0_CLR_REFTOP_PWD_MASK) - -#define PMU_MISC0_CLR_REFTOP_SELFBIASOFF_MASK (0x8U) -#define PMU_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define PMU_MISC0_CLR_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT)) & PMU_MISC0_CLR_REFTOP_SELFBIASOFF_MASK) - -#define PMU_MISC0_CLR_REFTOP_VBGADJ_MASK (0x70U) -#define PMU_MISC0_CLR_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define PMU_MISC0_CLR_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_REFTOP_VBGADJ_SHIFT)) & PMU_MISC0_CLR_REFTOP_VBGADJ_MASK) - -#define PMU_MISC0_CLR_REFTOP_VBGUP_MASK (0x80U) -#define PMU_MISC0_CLR_REFTOP_VBGUP_SHIFT (7U) -#define PMU_MISC0_CLR_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_REFTOP_VBGUP_SHIFT)) & PMU_MISC0_CLR_REFTOP_VBGUP_MASK) - -#define PMU_MISC0_CLR_STOP_MODE_CONFIG_MASK (0xC00U) -#define PMU_MISC0_CLR_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..SUSPEND (DSM) - * 0b01..Analog regulators are ON. - * 0b10..STOP (lower power) - * 0b11..STOP (very lower power) - */ -#define PMU_MISC0_CLR_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_STOP_MODE_CONFIG_SHIFT)) & PMU_MISC0_CLR_STOP_MODE_CONFIG_MASK) - -#define PMU_MISC0_CLR_DISCON_HIGH_SNVS_MASK (0x1000U) -#define PMU_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define PMU_MISC0_CLR_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT)) & PMU_MISC0_CLR_DISCON_HIGH_SNVS_MASK) - -#define PMU_MISC0_CLR_OSC_I_MASK (0x6000U) -#define PMU_MISC0_CLR_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define PMU_MISC0_CLR_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_OSC_I_SHIFT)) & PMU_MISC0_CLR_OSC_I_MASK) - -#define PMU_MISC0_CLR_OSC_XTALOK_MASK (0x8000U) -#define PMU_MISC0_CLR_OSC_XTALOK_SHIFT (15U) -#define PMU_MISC0_CLR_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_OSC_XTALOK_SHIFT)) & PMU_MISC0_CLR_OSC_XTALOK_MASK) - -#define PMU_MISC0_CLR_OSC_XTALOK_EN_MASK (0x10000U) -#define PMU_MISC0_CLR_OSC_XTALOK_EN_SHIFT (16U) -#define PMU_MISC0_CLR_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_OSC_XTALOK_EN_SHIFT)) & PMU_MISC0_CLR_OSC_XTALOK_EN_MASK) - -#define PMU_MISC0_CLR_CLKGATE_CTRL_MASK (0x2000000U) -#define PMU_MISC0_CLR_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define PMU_MISC0_CLR_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_CLKGATE_CTRL_SHIFT)) & PMU_MISC0_CLR_CLKGATE_CTRL_MASK) - -#define PMU_MISC0_CLR_CLKGATE_DELAY_MASK (0x1C000000U) -#define PMU_MISC0_CLR_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define PMU_MISC0_CLR_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_CLKGATE_DELAY_SHIFT)) & PMU_MISC0_CLR_CLKGATE_DELAY_MASK) - -#define PMU_MISC0_CLR_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define PMU_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define PMU_MISC0_CLR_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT)) & PMU_MISC0_CLR_RTC_XTAL_SOURCE_MASK) - -#define PMU_MISC0_CLR_XTAL_24M_PWD_MASK (0x40000000U) -#define PMU_MISC0_CLR_XTAL_24M_PWD_SHIFT (30U) -#define PMU_MISC0_CLR_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_XTAL_24M_PWD_SHIFT)) & PMU_MISC0_CLR_XTAL_24M_PWD_MASK) - -#define PMU_MISC0_CLR_VID_PLL_PREDIV_MASK (0x80000000U) -#define PMU_MISC0_CLR_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define PMU_MISC0_CLR_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_CLR_VID_PLL_PREDIV_SHIFT)) & PMU_MISC0_CLR_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_TOG - Miscellaneous Register 0 */ -/*! @{ */ - -#define PMU_MISC0_TOG_REFTOP_PWD_MASK (0x1U) -#define PMU_MISC0_TOG_REFTOP_PWD_SHIFT (0U) -#define PMU_MISC0_TOG_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_REFTOP_PWD_SHIFT)) & PMU_MISC0_TOG_REFTOP_PWD_MASK) - -#define PMU_MISC0_TOG_REFTOP_SELFBIASOFF_MASK (0x8U) -#define PMU_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define PMU_MISC0_TOG_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT)) & PMU_MISC0_TOG_REFTOP_SELFBIASOFF_MASK) - -#define PMU_MISC0_TOG_REFTOP_VBGADJ_MASK (0x70U) -#define PMU_MISC0_TOG_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define PMU_MISC0_TOG_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_REFTOP_VBGADJ_SHIFT)) & PMU_MISC0_TOG_REFTOP_VBGADJ_MASK) - -#define PMU_MISC0_TOG_REFTOP_VBGUP_MASK (0x80U) -#define PMU_MISC0_TOG_REFTOP_VBGUP_SHIFT (7U) -#define PMU_MISC0_TOG_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_REFTOP_VBGUP_SHIFT)) & PMU_MISC0_TOG_REFTOP_VBGUP_MASK) - -#define PMU_MISC0_TOG_STOP_MODE_CONFIG_MASK (0xC00U) -#define PMU_MISC0_TOG_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..SUSPEND (DSM) - * 0b01..Analog regulators are ON. - * 0b10..STOP (lower power) - * 0b11..STOP (very lower power) - */ -#define PMU_MISC0_TOG_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_STOP_MODE_CONFIG_SHIFT)) & PMU_MISC0_TOG_STOP_MODE_CONFIG_MASK) - -#define PMU_MISC0_TOG_DISCON_HIGH_SNVS_MASK (0x1000U) -#define PMU_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define PMU_MISC0_TOG_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT)) & PMU_MISC0_TOG_DISCON_HIGH_SNVS_MASK) - -#define PMU_MISC0_TOG_OSC_I_MASK (0x6000U) -#define PMU_MISC0_TOG_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define PMU_MISC0_TOG_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_OSC_I_SHIFT)) & PMU_MISC0_TOG_OSC_I_MASK) - -#define PMU_MISC0_TOG_OSC_XTALOK_MASK (0x8000U) -#define PMU_MISC0_TOG_OSC_XTALOK_SHIFT (15U) -#define PMU_MISC0_TOG_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_OSC_XTALOK_SHIFT)) & PMU_MISC0_TOG_OSC_XTALOK_MASK) - -#define PMU_MISC0_TOG_OSC_XTALOK_EN_MASK (0x10000U) -#define PMU_MISC0_TOG_OSC_XTALOK_EN_SHIFT (16U) -#define PMU_MISC0_TOG_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_OSC_XTALOK_EN_SHIFT)) & PMU_MISC0_TOG_OSC_XTALOK_EN_MASK) - -#define PMU_MISC0_TOG_CLKGATE_CTRL_MASK (0x2000000U) -#define PMU_MISC0_TOG_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define PMU_MISC0_TOG_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_CLKGATE_CTRL_SHIFT)) & PMU_MISC0_TOG_CLKGATE_CTRL_MASK) - -#define PMU_MISC0_TOG_CLKGATE_DELAY_MASK (0x1C000000U) -#define PMU_MISC0_TOG_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define PMU_MISC0_TOG_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_CLKGATE_DELAY_SHIFT)) & PMU_MISC0_TOG_CLKGATE_DELAY_MASK) - -#define PMU_MISC0_TOG_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define PMU_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define PMU_MISC0_TOG_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT)) & PMU_MISC0_TOG_RTC_XTAL_SOURCE_MASK) - -#define PMU_MISC0_TOG_XTAL_24M_PWD_MASK (0x40000000U) -#define PMU_MISC0_TOG_XTAL_24M_PWD_SHIFT (30U) -#define PMU_MISC0_TOG_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_XTAL_24M_PWD_SHIFT)) & PMU_MISC0_TOG_XTAL_24M_PWD_MASK) - -#define PMU_MISC0_TOG_VID_PLL_PREDIV_MASK (0x80000000U) -#define PMU_MISC0_TOG_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define PMU_MISC0_TOG_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC0_TOG_VID_PLL_PREDIV_SHIFT)) & PMU_MISC0_TOG_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC1 - Miscellaneous Register 1 */ -/*! @{ */ - -#define PMU_MISC1_LVDS1_CLK_SEL_MASK (0x1FU) -#define PMU_MISC1_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define PMU_MISC1_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDS1_CLK_SEL_SHIFT)) & PMU_MISC1_LVDS1_CLK_SEL_MASK) - -#define PMU_MISC1_LVDS2_CLK_SEL_MASK (0x3E0U) -#define PMU_MISC1_LVDS2_CLK_SEL_SHIFT (5U) -/*! LVDS2_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01000..MLB PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01010..PCIe ref clock (125M) - * 0b01011..SATA ref clock (100M) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - * 0b10011..LVDS1 (loopback) - * 0b10100..LVDS2 (not useful) - */ -#define PMU_MISC1_LVDS2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDS2_CLK_SEL_SHIFT)) & PMU_MISC1_LVDS2_CLK_SEL_MASK) - -#define PMU_MISC1_LVDSCLK1_OBEN_MASK (0x400U) -#define PMU_MISC1_LVDSCLK1_OBEN_SHIFT (10U) -#define PMU_MISC1_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDSCLK1_OBEN_SHIFT)) & PMU_MISC1_LVDSCLK1_OBEN_MASK) - -#define PMU_MISC1_LVDSCLK2_OBEN_MASK (0x800U) -#define PMU_MISC1_LVDSCLK2_OBEN_SHIFT (11U) -#define PMU_MISC1_LVDSCLK2_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDSCLK2_OBEN_SHIFT)) & PMU_MISC1_LVDSCLK2_OBEN_MASK) - -#define PMU_MISC1_LVDSCLK1_IBEN_MASK (0x1000U) -#define PMU_MISC1_LVDSCLK1_IBEN_SHIFT (12U) -#define PMU_MISC1_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDSCLK1_IBEN_SHIFT)) & PMU_MISC1_LVDSCLK1_IBEN_MASK) - -#define PMU_MISC1_LVDSCLK2_IBEN_MASK (0x2000U) -#define PMU_MISC1_LVDSCLK2_IBEN_SHIFT (13U) -#define PMU_MISC1_LVDSCLK2_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_LVDSCLK2_IBEN_SHIFT)) & PMU_MISC1_LVDSCLK2_IBEN_MASK) - -#define PMU_MISC1_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define PMU_MISC1_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define PMU_MISC1_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_PFD_480_AUTOGATE_EN_SHIFT)) & PMU_MISC1_PFD_480_AUTOGATE_EN_MASK) - -#define PMU_MISC1_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define PMU_MISC1_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define PMU_MISC1_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_PFD_528_AUTOGATE_EN_SHIFT)) & PMU_MISC1_PFD_528_AUTOGATE_EN_MASK) - -#define PMU_MISC1_IRQ_TEMPPANIC_MASK (0x8000000U) -#define PMU_MISC1_IRQ_TEMPPANIC_SHIFT (27U) -#define PMU_MISC1_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_IRQ_TEMPPANIC_SHIFT)) & PMU_MISC1_IRQ_TEMPPANIC_MASK) - -#define PMU_MISC1_IRQ_TEMPLOW_MASK (0x10000000U) -#define PMU_MISC1_IRQ_TEMPLOW_SHIFT (28U) -#define PMU_MISC1_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_IRQ_TEMPLOW_SHIFT)) & PMU_MISC1_IRQ_TEMPLOW_MASK) - -#define PMU_MISC1_IRQ_TEMPHIGH_MASK (0x20000000U) -#define PMU_MISC1_IRQ_TEMPHIGH_SHIFT (29U) -#define PMU_MISC1_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_IRQ_TEMPHIGH_SHIFT)) & PMU_MISC1_IRQ_TEMPHIGH_MASK) - -#define PMU_MISC1_IRQ_ANA_BO_MASK (0x40000000U) -#define PMU_MISC1_IRQ_ANA_BO_SHIFT (30U) -#define PMU_MISC1_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_IRQ_ANA_BO_SHIFT)) & PMU_MISC1_IRQ_ANA_BO_MASK) - -#define PMU_MISC1_IRQ_DIG_BO_MASK (0x80000000U) -#define PMU_MISC1_IRQ_DIG_BO_SHIFT (31U) -#define PMU_MISC1_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_IRQ_DIG_BO_SHIFT)) & PMU_MISC1_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_SET - Miscellaneous Register 1 */ -/*! @{ */ - -#define PMU_MISC1_SET_LVDS1_CLK_SEL_MASK (0x1FU) -#define PMU_MISC1_SET_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define PMU_MISC1_SET_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDS1_CLK_SEL_SHIFT)) & PMU_MISC1_SET_LVDS1_CLK_SEL_MASK) - -#define PMU_MISC1_SET_LVDS2_CLK_SEL_MASK (0x3E0U) -#define PMU_MISC1_SET_LVDS2_CLK_SEL_SHIFT (5U) -/*! LVDS2_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01000..MLB PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01010..PCIe ref clock (125M) - * 0b01011..SATA ref clock (100M) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - * 0b10011..LVDS1 (loopback) - * 0b10100..LVDS2 (not useful) - */ -#define PMU_MISC1_SET_LVDS2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDS2_CLK_SEL_SHIFT)) & PMU_MISC1_SET_LVDS2_CLK_SEL_MASK) - -#define PMU_MISC1_SET_LVDSCLK1_OBEN_MASK (0x400U) -#define PMU_MISC1_SET_LVDSCLK1_OBEN_SHIFT (10U) -#define PMU_MISC1_SET_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDSCLK1_OBEN_SHIFT)) & PMU_MISC1_SET_LVDSCLK1_OBEN_MASK) - -#define PMU_MISC1_SET_LVDSCLK2_OBEN_MASK (0x800U) -#define PMU_MISC1_SET_LVDSCLK2_OBEN_SHIFT (11U) -#define PMU_MISC1_SET_LVDSCLK2_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDSCLK2_OBEN_SHIFT)) & PMU_MISC1_SET_LVDSCLK2_OBEN_MASK) - -#define PMU_MISC1_SET_LVDSCLK1_IBEN_MASK (0x1000U) -#define PMU_MISC1_SET_LVDSCLK1_IBEN_SHIFT (12U) -#define PMU_MISC1_SET_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDSCLK1_IBEN_SHIFT)) & PMU_MISC1_SET_LVDSCLK1_IBEN_MASK) - -#define PMU_MISC1_SET_LVDSCLK2_IBEN_MASK (0x2000U) -#define PMU_MISC1_SET_LVDSCLK2_IBEN_SHIFT (13U) -#define PMU_MISC1_SET_LVDSCLK2_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_LVDSCLK2_IBEN_SHIFT)) & PMU_MISC1_SET_LVDSCLK2_IBEN_MASK) - -#define PMU_MISC1_SET_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define PMU_MISC1_SET_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define PMU_MISC1_SET_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_PFD_480_AUTOGATE_EN_SHIFT)) & PMU_MISC1_SET_PFD_480_AUTOGATE_EN_MASK) - -#define PMU_MISC1_SET_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define PMU_MISC1_SET_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define PMU_MISC1_SET_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_PFD_528_AUTOGATE_EN_SHIFT)) & PMU_MISC1_SET_PFD_528_AUTOGATE_EN_MASK) - -#define PMU_MISC1_SET_IRQ_TEMPPANIC_MASK (0x8000000U) -#define PMU_MISC1_SET_IRQ_TEMPPANIC_SHIFT (27U) -#define PMU_MISC1_SET_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_IRQ_TEMPPANIC_SHIFT)) & PMU_MISC1_SET_IRQ_TEMPPANIC_MASK) - -#define PMU_MISC1_SET_IRQ_TEMPLOW_MASK (0x10000000U) -#define PMU_MISC1_SET_IRQ_TEMPLOW_SHIFT (28U) -#define PMU_MISC1_SET_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_IRQ_TEMPLOW_SHIFT)) & PMU_MISC1_SET_IRQ_TEMPLOW_MASK) - -#define PMU_MISC1_SET_IRQ_TEMPHIGH_MASK (0x20000000U) -#define PMU_MISC1_SET_IRQ_TEMPHIGH_SHIFT (29U) -#define PMU_MISC1_SET_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_IRQ_TEMPHIGH_SHIFT)) & PMU_MISC1_SET_IRQ_TEMPHIGH_MASK) - -#define PMU_MISC1_SET_IRQ_ANA_BO_MASK (0x40000000U) -#define PMU_MISC1_SET_IRQ_ANA_BO_SHIFT (30U) -#define PMU_MISC1_SET_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_IRQ_ANA_BO_SHIFT)) & PMU_MISC1_SET_IRQ_ANA_BO_MASK) - -#define PMU_MISC1_SET_IRQ_DIG_BO_MASK (0x80000000U) -#define PMU_MISC1_SET_IRQ_DIG_BO_SHIFT (31U) -#define PMU_MISC1_SET_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_SET_IRQ_DIG_BO_SHIFT)) & PMU_MISC1_SET_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_CLR - Miscellaneous Register 1 */ -/*! @{ */ - -#define PMU_MISC1_CLR_LVDS1_CLK_SEL_MASK (0x1FU) -#define PMU_MISC1_CLR_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define PMU_MISC1_CLR_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDS1_CLK_SEL_SHIFT)) & PMU_MISC1_CLR_LVDS1_CLK_SEL_MASK) - -#define PMU_MISC1_CLR_LVDS2_CLK_SEL_MASK (0x3E0U) -#define PMU_MISC1_CLR_LVDS2_CLK_SEL_SHIFT (5U) -/*! LVDS2_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01000..MLB PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01010..PCIe ref clock (125M) - * 0b01011..SATA ref clock (100M) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - * 0b10011..LVDS1 (loopback) - * 0b10100..LVDS2 (not useful) - */ -#define PMU_MISC1_CLR_LVDS2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDS2_CLK_SEL_SHIFT)) & PMU_MISC1_CLR_LVDS2_CLK_SEL_MASK) - -#define PMU_MISC1_CLR_LVDSCLK1_OBEN_MASK (0x400U) -#define PMU_MISC1_CLR_LVDSCLK1_OBEN_SHIFT (10U) -#define PMU_MISC1_CLR_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDSCLK1_OBEN_SHIFT)) & PMU_MISC1_CLR_LVDSCLK1_OBEN_MASK) - -#define PMU_MISC1_CLR_LVDSCLK2_OBEN_MASK (0x800U) -#define PMU_MISC1_CLR_LVDSCLK2_OBEN_SHIFT (11U) -#define PMU_MISC1_CLR_LVDSCLK2_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDSCLK2_OBEN_SHIFT)) & PMU_MISC1_CLR_LVDSCLK2_OBEN_MASK) - -#define PMU_MISC1_CLR_LVDSCLK1_IBEN_MASK (0x1000U) -#define PMU_MISC1_CLR_LVDSCLK1_IBEN_SHIFT (12U) -#define PMU_MISC1_CLR_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDSCLK1_IBEN_SHIFT)) & PMU_MISC1_CLR_LVDSCLK1_IBEN_MASK) - -#define PMU_MISC1_CLR_LVDSCLK2_IBEN_MASK (0x2000U) -#define PMU_MISC1_CLR_LVDSCLK2_IBEN_SHIFT (13U) -#define PMU_MISC1_CLR_LVDSCLK2_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_LVDSCLK2_IBEN_SHIFT)) & PMU_MISC1_CLR_LVDSCLK2_IBEN_MASK) - -#define PMU_MISC1_CLR_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define PMU_MISC1_CLR_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define PMU_MISC1_CLR_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_PFD_480_AUTOGATE_EN_SHIFT)) & PMU_MISC1_CLR_PFD_480_AUTOGATE_EN_MASK) - -#define PMU_MISC1_CLR_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define PMU_MISC1_CLR_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define PMU_MISC1_CLR_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_PFD_528_AUTOGATE_EN_SHIFT)) & PMU_MISC1_CLR_PFD_528_AUTOGATE_EN_MASK) - -#define PMU_MISC1_CLR_IRQ_TEMPPANIC_MASK (0x8000000U) -#define PMU_MISC1_CLR_IRQ_TEMPPANIC_SHIFT (27U) -#define PMU_MISC1_CLR_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_IRQ_TEMPPANIC_SHIFT)) & PMU_MISC1_CLR_IRQ_TEMPPANIC_MASK) - -#define PMU_MISC1_CLR_IRQ_TEMPLOW_MASK (0x10000000U) -#define PMU_MISC1_CLR_IRQ_TEMPLOW_SHIFT (28U) -#define PMU_MISC1_CLR_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_IRQ_TEMPLOW_SHIFT)) & PMU_MISC1_CLR_IRQ_TEMPLOW_MASK) - -#define PMU_MISC1_CLR_IRQ_TEMPHIGH_MASK (0x20000000U) -#define PMU_MISC1_CLR_IRQ_TEMPHIGH_SHIFT (29U) -#define PMU_MISC1_CLR_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_IRQ_TEMPHIGH_SHIFT)) & PMU_MISC1_CLR_IRQ_TEMPHIGH_MASK) - -#define PMU_MISC1_CLR_IRQ_ANA_BO_MASK (0x40000000U) -#define PMU_MISC1_CLR_IRQ_ANA_BO_SHIFT (30U) -#define PMU_MISC1_CLR_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_IRQ_ANA_BO_SHIFT)) & PMU_MISC1_CLR_IRQ_ANA_BO_MASK) - -#define PMU_MISC1_CLR_IRQ_DIG_BO_MASK (0x80000000U) -#define PMU_MISC1_CLR_IRQ_DIG_BO_SHIFT (31U) -#define PMU_MISC1_CLR_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_CLR_IRQ_DIG_BO_SHIFT)) & PMU_MISC1_CLR_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC1_TOG - Miscellaneous Register 1 */ -/*! @{ */ - -#define PMU_MISC1_TOG_LVDS1_CLK_SEL_MASK (0x1FU) -#define PMU_MISC1_TOG_LVDS1_CLK_SEL_SHIFT (0U) -/*! LVDS1_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - */ -#define PMU_MISC1_TOG_LVDS1_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDS1_CLK_SEL_SHIFT)) & PMU_MISC1_TOG_LVDS1_CLK_SEL_MASK) - -#define PMU_MISC1_TOG_LVDS2_CLK_SEL_MASK (0x3E0U) -#define PMU_MISC1_TOG_LVDS2_CLK_SEL_SHIFT (5U) -/*! LVDS2_CLK_SEL - * 0b00000..Arm PLL - * 0b00001..System PLL - * 0b00010..ref_pfd4_clk == pll2_pfd0_clk - * 0b00011..ref_pfd5_clk == pll2_pfd1_clk - * 0b00100..ref_pfd6_clk == pll2_pfd2_clk - * 0b00101..ref_pfd7_clk == pll2_pfd3_clk - * 0b00110..Audio PLL - * 0b00111..Video PLL - * 0b01000..MLB PLL - * 0b01001..ethernet ref clock (ENET_PLL) - * 0b01010..PCIe ref clock (125M) - * 0b01011..SATA ref clock (100M) - * 0b01100..USB1 PLL clock - * 0b01101..USB2 PLL clock - * 0b01110..ref_pfd0_clk == pll3_pfd0_clk - * 0b01111..ref_pfd1_clk == pll3_pfd1_clk - * 0b10000..ref_pfd2_clk == pll3_pfd2_clk - * 0b10001..ref_pfd3_clk == pll3_pfd3_clk - * 0b10010..xtal (24M) - * 0b10011..LVDS1 (loopback) - * 0b10100..LVDS2 (not useful) - */ -#define PMU_MISC1_TOG_LVDS2_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDS2_CLK_SEL_SHIFT)) & PMU_MISC1_TOG_LVDS2_CLK_SEL_MASK) - -#define PMU_MISC1_TOG_LVDSCLK1_OBEN_MASK (0x400U) -#define PMU_MISC1_TOG_LVDSCLK1_OBEN_SHIFT (10U) -#define PMU_MISC1_TOG_LVDSCLK1_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDSCLK1_OBEN_SHIFT)) & PMU_MISC1_TOG_LVDSCLK1_OBEN_MASK) - -#define PMU_MISC1_TOG_LVDSCLK2_OBEN_MASK (0x800U) -#define PMU_MISC1_TOG_LVDSCLK2_OBEN_SHIFT (11U) -#define PMU_MISC1_TOG_LVDSCLK2_OBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDSCLK2_OBEN_SHIFT)) & PMU_MISC1_TOG_LVDSCLK2_OBEN_MASK) - -#define PMU_MISC1_TOG_LVDSCLK1_IBEN_MASK (0x1000U) -#define PMU_MISC1_TOG_LVDSCLK1_IBEN_SHIFT (12U) -#define PMU_MISC1_TOG_LVDSCLK1_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDSCLK1_IBEN_SHIFT)) & PMU_MISC1_TOG_LVDSCLK1_IBEN_MASK) - -#define PMU_MISC1_TOG_LVDSCLK2_IBEN_MASK (0x2000U) -#define PMU_MISC1_TOG_LVDSCLK2_IBEN_SHIFT (13U) -#define PMU_MISC1_TOG_LVDSCLK2_IBEN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_LVDSCLK2_IBEN_SHIFT)) & PMU_MISC1_TOG_LVDSCLK2_IBEN_MASK) - -#define PMU_MISC1_TOG_PFD_480_AUTOGATE_EN_MASK (0x10000U) -#define PMU_MISC1_TOG_PFD_480_AUTOGATE_EN_SHIFT (16U) -#define PMU_MISC1_TOG_PFD_480_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_PFD_480_AUTOGATE_EN_SHIFT)) & PMU_MISC1_TOG_PFD_480_AUTOGATE_EN_MASK) - -#define PMU_MISC1_TOG_PFD_528_AUTOGATE_EN_MASK (0x20000U) -#define PMU_MISC1_TOG_PFD_528_AUTOGATE_EN_SHIFT (17U) -#define PMU_MISC1_TOG_PFD_528_AUTOGATE_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_PFD_528_AUTOGATE_EN_SHIFT)) & PMU_MISC1_TOG_PFD_528_AUTOGATE_EN_MASK) - -#define PMU_MISC1_TOG_IRQ_TEMPPANIC_MASK (0x8000000U) -#define PMU_MISC1_TOG_IRQ_TEMPPANIC_SHIFT (27U) -#define PMU_MISC1_TOG_IRQ_TEMPPANIC(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_IRQ_TEMPPANIC_SHIFT)) & PMU_MISC1_TOG_IRQ_TEMPPANIC_MASK) - -#define PMU_MISC1_TOG_IRQ_TEMPLOW_MASK (0x10000000U) -#define PMU_MISC1_TOG_IRQ_TEMPLOW_SHIFT (28U) -#define PMU_MISC1_TOG_IRQ_TEMPLOW(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_IRQ_TEMPLOW_SHIFT)) & PMU_MISC1_TOG_IRQ_TEMPLOW_MASK) - -#define PMU_MISC1_TOG_IRQ_TEMPHIGH_MASK (0x20000000U) -#define PMU_MISC1_TOG_IRQ_TEMPHIGH_SHIFT (29U) -#define PMU_MISC1_TOG_IRQ_TEMPHIGH(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_IRQ_TEMPHIGH_SHIFT)) & PMU_MISC1_TOG_IRQ_TEMPHIGH_MASK) - -#define PMU_MISC1_TOG_IRQ_ANA_BO_MASK (0x40000000U) -#define PMU_MISC1_TOG_IRQ_ANA_BO_SHIFT (30U) -#define PMU_MISC1_TOG_IRQ_ANA_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_IRQ_ANA_BO_SHIFT)) & PMU_MISC1_TOG_IRQ_ANA_BO_MASK) - -#define PMU_MISC1_TOG_IRQ_DIG_BO_MASK (0x80000000U) -#define PMU_MISC1_TOG_IRQ_DIG_BO_SHIFT (31U) -#define PMU_MISC1_TOG_IRQ_DIG_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC1_TOG_IRQ_DIG_BO_SHIFT)) & PMU_MISC1_TOG_IRQ_DIG_BO_MASK) -/*! @} */ - -/*! @name MISC2 - Miscellaneous Control Register */ -/*! @{ */ - -#define PMU_MISC2_REG0_BO_OFFSET_MASK (0x7U) -#define PMU_MISC2_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG0_BO_OFFSET_SHIFT)) & PMU_MISC2_REG0_BO_OFFSET_MASK) - -#define PMU_MISC2_REG0_BO_STATUS_MASK (0x8U) -#define PMU_MISC2_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG0_BO_STATUS_SHIFT)) & PMU_MISC2_REG0_BO_STATUS_MASK) - -#define PMU_MISC2_REG0_ENABLE_BO_MASK (0x20U) -#define PMU_MISC2_REG0_ENABLE_BO_SHIFT (5U) -#define PMU_MISC2_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG0_ENABLE_BO_SHIFT)) & PMU_MISC2_REG0_ENABLE_BO_MASK) - -#define PMU_MISC2_PLL3_disable_MASK (0x80U) -#define PMU_MISC2_PLL3_disable_SHIFT (7U) -#define PMU_MISC2_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_PLL3_disable_SHIFT)) & PMU_MISC2_PLL3_disable_MASK) - -#define PMU_MISC2_REG1_BO_OFFSET_MASK (0x700U) -#define PMU_MISC2_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG1_BO_OFFSET_SHIFT)) & PMU_MISC2_REG1_BO_OFFSET_MASK) - -#define PMU_MISC2_REG1_BO_STATUS_MASK (0x800U) -#define PMU_MISC2_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG1_BO_STATUS_SHIFT)) & PMU_MISC2_REG1_BO_STATUS_MASK) - -#define PMU_MISC2_REG1_ENABLE_BO_MASK (0x2000U) -#define PMU_MISC2_REG1_ENABLE_BO_SHIFT (13U) -#define PMU_MISC2_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG1_ENABLE_BO_SHIFT)) & PMU_MISC2_REG1_ENABLE_BO_MASK) - -#define PMU_MISC2_AUDIO_DIV_LSB_MASK (0x8000U) -#define PMU_MISC2_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_AUDIO_DIV_LSB_SHIFT)) & PMU_MISC2_AUDIO_DIV_LSB_MASK) - -#define PMU_MISC2_REG2_BO_OFFSET_MASK (0x70000U) -#define PMU_MISC2_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG2_BO_OFFSET_SHIFT)) & PMU_MISC2_REG2_BO_OFFSET_MASK) - -#define PMU_MISC2_REG2_BO_STATUS_MASK (0x80000U) -#define PMU_MISC2_REG2_BO_STATUS_SHIFT (19U) -#define PMU_MISC2_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG2_BO_STATUS_SHIFT)) & PMU_MISC2_REG2_BO_STATUS_MASK) - -#define PMU_MISC2_REG2_ENABLE_BO_MASK (0x200000U) -#define PMU_MISC2_REG2_ENABLE_BO_SHIFT (21U) -#define PMU_MISC2_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG2_ENABLE_BO_SHIFT)) & PMU_MISC2_REG2_ENABLE_BO_MASK) - -#define PMU_MISC2_REG2_OK_MASK (0x400000U) -#define PMU_MISC2_REG2_OK_SHIFT (22U) -#define PMU_MISC2_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG2_OK_SHIFT)) & PMU_MISC2_REG2_OK_MASK) - -#define PMU_MISC2_AUDIO_DIV_MSB_MASK (0x800000U) -#define PMU_MISC2_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_AUDIO_DIV_MSB_SHIFT)) & PMU_MISC2_AUDIO_DIV_MSB_MASK) - -#define PMU_MISC2_REG0_STEP_TIME_MASK (0x3000000U) -#define PMU_MISC2_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG0_STEP_TIME_SHIFT)) & PMU_MISC2_REG0_STEP_TIME_MASK) - -#define PMU_MISC2_REG1_STEP_TIME_MASK (0xC000000U) -#define PMU_MISC2_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG1_STEP_TIME_SHIFT)) & PMU_MISC2_REG1_STEP_TIME_MASK) - -#define PMU_MISC2_REG2_STEP_TIME_MASK (0x30000000U) -#define PMU_MISC2_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_REG2_STEP_TIME_SHIFT)) & PMU_MISC2_REG2_STEP_TIME_MASK) - -#define PMU_MISC2_VIDEO_DIV_MASK (0xC0000000U) -#define PMU_MISC2_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define PMU_MISC2_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_VIDEO_DIV_SHIFT)) & PMU_MISC2_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_SET - Miscellaneous Control Register */ -/*! @{ */ - -#define PMU_MISC2_SET_REG0_BO_OFFSET_MASK (0x7U) -#define PMU_MISC2_SET_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_SET_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG0_BO_OFFSET_SHIFT)) & PMU_MISC2_SET_REG0_BO_OFFSET_MASK) - -#define PMU_MISC2_SET_REG0_BO_STATUS_MASK (0x8U) -#define PMU_MISC2_SET_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_SET_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG0_BO_STATUS_SHIFT)) & PMU_MISC2_SET_REG0_BO_STATUS_MASK) - -#define PMU_MISC2_SET_REG0_ENABLE_BO_MASK (0x20U) -#define PMU_MISC2_SET_REG0_ENABLE_BO_SHIFT (5U) -#define PMU_MISC2_SET_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG0_ENABLE_BO_SHIFT)) & PMU_MISC2_SET_REG0_ENABLE_BO_MASK) - -#define PMU_MISC2_SET_PLL3_disable_MASK (0x80U) -#define PMU_MISC2_SET_PLL3_disable_SHIFT (7U) -#define PMU_MISC2_SET_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_PLL3_disable_SHIFT)) & PMU_MISC2_SET_PLL3_disable_MASK) - -#define PMU_MISC2_SET_REG1_BO_OFFSET_MASK (0x700U) -#define PMU_MISC2_SET_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_SET_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG1_BO_OFFSET_SHIFT)) & PMU_MISC2_SET_REG1_BO_OFFSET_MASK) - -#define PMU_MISC2_SET_REG1_BO_STATUS_MASK (0x800U) -#define PMU_MISC2_SET_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_SET_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG1_BO_STATUS_SHIFT)) & PMU_MISC2_SET_REG1_BO_STATUS_MASK) - -#define PMU_MISC2_SET_REG1_ENABLE_BO_MASK (0x2000U) -#define PMU_MISC2_SET_REG1_ENABLE_BO_SHIFT (13U) -#define PMU_MISC2_SET_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG1_ENABLE_BO_SHIFT)) & PMU_MISC2_SET_REG1_ENABLE_BO_MASK) - -#define PMU_MISC2_SET_AUDIO_DIV_LSB_MASK (0x8000U) -#define PMU_MISC2_SET_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_SET_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_AUDIO_DIV_LSB_SHIFT)) & PMU_MISC2_SET_AUDIO_DIV_LSB_MASK) - -#define PMU_MISC2_SET_REG2_BO_OFFSET_MASK (0x70000U) -#define PMU_MISC2_SET_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_SET_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG2_BO_OFFSET_SHIFT)) & PMU_MISC2_SET_REG2_BO_OFFSET_MASK) - -#define PMU_MISC2_SET_REG2_BO_STATUS_MASK (0x80000U) -#define PMU_MISC2_SET_REG2_BO_STATUS_SHIFT (19U) -#define PMU_MISC2_SET_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG2_BO_STATUS_SHIFT)) & PMU_MISC2_SET_REG2_BO_STATUS_MASK) - -#define PMU_MISC2_SET_REG2_ENABLE_BO_MASK (0x200000U) -#define PMU_MISC2_SET_REG2_ENABLE_BO_SHIFT (21U) -#define PMU_MISC2_SET_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG2_ENABLE_BO_SHIFT)) & PMU_MISC2_SET_REG2_ENABLE_BO_MASK) - -#define PMU_MISC2_SET_REG2_OK_MASK (0x400000U) -#define PMU_MISC2_SET_REG2_OK_SHIFT (22U) -#define PMU_MISC2_SET_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG2_OK_SHIFT)) & PMU_MISC2_SET_REG2_OK_MASK) - -#define PMU_MISC2_SET_AUDIO_DIV_MSB_MASK (0x800000U) -#define PMU_MISC2_SET_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_SET_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_AUDIO_DIV_MSB_SHIFT)) & PMU_MISC2_SET_AUDIO_DIV_MSB_MASK) - -#define PMU_MISC2_SET_REG0_STEP_TIME_MASK (0x3000000U) -#define PMU_MISC2_SET_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_SET_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG0_STEP_TIME_SHIFT)) & PMU_MISC2_SET_REG0_STEP_TIME_MASK) - -#define PMU_MISC2_SET_REG1_STEP_TIME_MASK (0xC000000U) -#define PMU_MISC2_SET_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_SET_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG1_STEP_TIME_SHIFT)) & PMU_MISC2_SET_REG1_STEP_TIME_MASK) - -#define PMU_MISC2_SET_REG2_STEP_TIME_MASK (0x30000000U) -#define PMU_MISC2_SET_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_SET_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_REG2_STEP_TIME_SHIFT)) & PMU_MISC2_SET_REG2_STEP_TIME_MASK) - -#define PMU_MISC2_SET_VIDEO_DIV_MASK (0xC0000000U) -#define PMU_MISC2_SET_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define PMU_MISC2_SET_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_SET_VIDEO_DIV_SHIFT)) & PMU_MISC2_SET_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_CLR - Miscellaneous Control Register */ -/*! @{ */ - -#define PMU_MISC2_CLR_REG0_BO_OFFSET_MASK (0x7U) -#define PMU_MISC2_CLR_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_CLR_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG0_BO_OFFSET_SHIFT)) & PMU_MISC2_CLR_REG0_BO_OFFSET_MASK) - -#define PMU_MISC2_CLR_REG0_BO_STATUS_MASK (0x8U) -#define PMU_MISC2_CLR_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_CLR_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG0_BO_STATUS_SHIFT)) & PMU_MISC2_CLR_REG0_BO_STATUS_MASK) - -#define PMU_MISC2_CLR_REG0_ENABLE_BO_MASK (0x20U) -#define PMU_MISC2_CLR_REG0_ENABLE_BO_SHIFT (5U) -#define PMU_MISC2_CLR_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG0_ENABLE_BO_SHIFT)) & PMU_MISC2_CLR_REG0_ENABLE_BO_MASK) - -#define PMU_MISC2_CLR_PLL3_disable_MASK (0x80U) -#define PMU_MISC2_CLR_PLL3_disable_SHIFT (7U) -#define PMU_MISC2_CLR_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_PLL3_disable_SHIFT)) & PMU_MISC2_CLR_PLL3_disable_MASK) - -#define PMU_MISC2_CLR_REG1_BO_OFFSET_MASK (0x700U) -#define PMU_MISC2_CLR_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_CLR_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG1_BO_OFFSET_SHIFT)) & PMU_MISC2_CLR_REG1_BO_OFFSET_MASK) - -#define PMU_MISC2_CLR_REG1_BO_STATUS_MASK (0x800U) -#define PMU_MISC2_CLR_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_CLR_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG1_BO_STATUS_SHIFT)) & PMU_MISC2_CLR_REG1_BO_STATUS_MASK) - -#define PMU_MISC2_CLR_REG1_ENABLE_BO_MASK (0x2000U) -#define PMU_MISC2_CLR_REG1_ENABLE_BO_SHIFT (13U) -#define PMU_MISC2_CLR_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG1_ENABLE_BO_SHIFT)) & PMU_MISC2_CLR_REG1_ENABLE_BO_MASK) - -#define PMU_MISC2_CLR_AUDIO_DIV_LSB_MASK (0x8000U) -#define PMU_MISC2_CLR_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_CLR_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_AUDIO_DIV_LSB_SHIFT)) & PMU_MISC2_CLR_AUDIO_DIV_LSB_MASK) - -#define PMU_MISC2_CLR_REG2_BO_OFFSET_MASK (0x70000U) -#define PMU_MISC2_CLR_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_CLR_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG2_BO_OFFSET_SHIFT)) & PMU_MISC2_CLR_REG2_BO_OFFSET_MASK) - -#define PMU_MISC2_CLR_REG2_BO_STATUS_MASK (0x80000U) -#define PMU_MISC2_CLR_REG2_BO_STATUS_SHIFT (19U) -#define PMU_MISC2_CLR_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG2_BO_STATUS_SHIFT)) & PMU_MISC2_CLR_REG2_BO_STATUS_MASK) - -#define PMU_MISC2_CLR_REG2_ENABLE_BO_MASK (0x200000U) -#define PMU_MISC2_CLR_REG2_ENABLE_BO_SHIFT (21U) -#define PMU_MISC2_CLR_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG2_ENABLE_BO_SHIFT)) & PMU_MISC2_CLR_REG2_ENABLE_BO_MASK) - -#define PMU_MISC2_CLR_REG2_OK_MASK (0x400000U) -#define PMU_MISC2_CLR_REG2_OK_SHIFT (22U) -#define PMU_MISC2_CLR_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG2_OK_SHIFT)) & PMU_MISC2_CLR_REG2_OK_MASK) - -#define PMU_MISC2_CLR_AUDIO_DIV_MSB_MASK (0x800000U) -#define PMU_MISC2_CLR_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_CLR_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_AUDIO_DIV_MSB_SHIFT)) & PMU_MISC2_CLR_AUDIO_DIV_MSB_MASK) - -#define PMU_MISC2_CLR_REG0_STEP_TIME_MASK (0x3000000U) -#define PMU_MISC2_CLR_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_CLR_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG0_STEP_TIME_SHIFT)) & PMU_MISC2_CLR_REG0_STEP_TIME_MASK) - -#define PMU_MISC2_CLR_REG1_STEP_TIME_MASK (0xC000000U) -#define PMU_MISC2_CLR_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_CLR_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG1_STEP_TIME_SHIFT)) & PMU_MISC2_CLR_REG1_STEP_TIME_MASK) - -#define PMU_MISC2_CLR_REG2_STEP_TIME_MASK (0x30000000U) -#define PMU_MISC2_CLR_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_CLR_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_REG2_STEP_TIME_SHIFT)) & PMU_MISC2_CLR_REG2_STEP_TIME_MASK) - -#define PMU_MISC2_CLR_VIDEO_DIV_MASK (0xC0000000U) -#define PMU_MISC2_CLR_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define PMU_MISC2_CLR_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_CLR_VIDEO_DIV_SHIFT)) & PMU_MISC2_CLR_VIDEO_DIV_MASK) -/*! @} */ - -/*! @name MISC2_TOG - Miscellaneous Control Register */ -/*! @{ */ - -#define PMU_MISC2_TOG_REG0_BO_OFFSET_MASK (0x7U) -#define PMU_MISC2_TOG_REG0_BO_OFFSET_SHIFT (0U) -/*! REG0_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_TOG_REG0_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG0_BO_OFFSET_SHIFT)) & PMU_MISC2_TOG_REG0_BO_OFFSET_MASK) - -#define PMU_MISC2_TOG_REG0_BO_STATUS_MASK (0x8U) -#define PMU_MISC2_TOG_REG0_BO_STATUS_SHIFT (3U) -/*! REG0_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_TOG_REG0_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG0_BO_STATUS_SHIFT)) & PMU_MISC2_TOG_REG0_BO_STATUS_MASK) - -#define PMU_MISC2_TOG_REG0_ENABLE_BO_MASK (0x20U) -#define PMU_MISC2_TOG_REG0_ENABLE_BO_SHIFT (5U) -#define PMU_MISC2_TOG_REG0_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG0_ENABLE_BO_SHIFT)) & PMU_MISC2_TOG_REG0_ENABLE_BO_MASK) - -#define PMU_MISC2_TOG_PLL3_disable_MASK (0x80U) -#define PMU_MISC2_TOG_PLL3_disable_SHIFT (7U) -#define PMU_MISC2_TOG_PLL3_disable(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_PLL3_disable_SHIFT)) & PMU_MISC2_TOG_PLL3_disable_MASK) - -#define PMU_MISC2_TOG_REG1_BO_OFFSET_MASK (0x700U) -#define PMU_MISC2_TOG_REG1_BO_OFFSET_SHIFT (8U) -/*! REG1_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_TOG_REG1_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG1_BO_OFFSET_SHIFT)) & PMU_MISC2_TOG_REG1_BO_OFFSET_MASK) - -#define PMU_MISC2_TOG_REG1_BO_STATUS_MASK (0x800U) -#define PMU_MISC2_TOG_REG1_BO_STATUS_SHIFT (11U) -/*! REG1_BO_STATUS - * 0b1..Brownout, supply is below target minus brownout offset. - */ -#define PMU_MISC2_TOG_REG1_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG1_BO_STATUS_SHIFT)) & PMU_MISC2_TOG_REG1_BO_STATUS_MASK) - -#define PMU_MISC2_TOG_REG1_ENABLE_BO_MASK (0x2000U) -#define PMU_MISC2_TOG_REG1_ENABLE_BO_SHIFT (13U) -#define PMU_MISC2_TOG_REG1_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG1_ENABLE_BO_SHIFT)) & PMU_MISC2_TOG_REG1_ENABLE_BO_MASK) - -#define PMU_MISC2_TOG_AUDIO_DIV_LSB_MASK (0x8000U) -#define PMU_MISC2_TOG_AUDIO_DIV_LSB_SHIFT (15U) -/*! AUDIO_DIV_LSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_TOG_AUDIO_DIV_LSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_AUDIO_DIV_LSB_SHIFT)) & PMU_MISC2_TOG_AUDIO_DIV_LSB_MASK) - -#define PMU_MISC2_TOG_REG2_BO_OFFSET_MASK (0x70000U) -#define PMU_MISC2_TOG_REG2_BO_OFFSET_SHIFT (16U) -/*! REG2_BO_OFFSET - * 0b100..Brownout offset = 0.100V - * 0b111..Brownout offset = 0.175V - */ -#define PMU_MISC2_TOG_REG2_BO_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG2_BO_OFFSET_SHIFT)) & PMU_MISC2_TOG_REG2_BO_OFFSET_MASK) - -#define PMU_MISC2_TOG_REG2_BO_STATUS_MASK (0x80000U) -#define PMU_MISC2_TOG_REG2_BO_STATUS_SHIFT (19U) -#define PMU_MISC2_TOG_REG2_BO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG2_BO_STATUS_SHIFT)) & PMU_MISC2_TOG_REG2_BO_STATUS_MASK) - -#define PMU_MISC2_TOG_REG2_ENABLE_BO_MASK (0x200000U) -#define PMU_MISC2_TOG_REG2_ENABLE_BO_SHIFT (21U) -#define PMU_MISC2_TOG_REG2_ENABLE_BO(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG2_ENABLE_BO_SHIFT)) & PMU_MISC2_TOG_REG2_ENABLE_BO_MASK) - -#define PMU_MISC2_TOG_REG2_OK_MASK (0x400000U) -#define PMU_MISC2_TOG_REG2_OK_SHIFT (22U) -#define PMU_MISC2_TOG_REG2_OK(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG2_OK_SHIFT)) & PMU_MISC2_TOG_REG2_OK_MASK) - -#define PMU_MISC2_TOG_AUDIO_DIV_MSB_MASK (0x800000U) -#define PMU_MISC2_TOG_AUDIO_DIV_MSB_SHIFT (23U) -/*! AUDIO_DIV_MSB - * 0b0..divide by 1 (Default) - * 0b1..divide by 2 - */ -#define PMU_MISC2_TOG_AUDIO_DIV_MSB(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_AUDIO_DIV_MSB_SHIFT)) & PMU_MISC2_TOG_AUDIO_DIV_MSB_MASK) - -#define PMU_MISC2_TOG_REG0_STEP_TIME_MASK (0x3000000U) -#define PMU_MISC2_TOG_REG0_STEP_TIME_SHIFT (24U) -/*! REG0_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_TOG_REG0_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG0_STEP_TIME_SHIFT)) & PMU_MISC2_TOG_REG0_STEP_TIME_MASK) - -#define PMU_MISC2_TOG_REG1_STEP_TIME_MASK (0xC000000U) -#define PMU_MISC2_TOG_REG1_STEP_TIME_SHIFT (26U) -/*! REG1_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_TOG_REG1_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG1_STEP_TIME_SHIFT)) & PMU_MISC2_TOG_REG1_STEP_TIME_MASK) - -#define PMU_MISC2_TOG_REG2_STEP_TIME_MASK (0x30000000U) -#define PMU_MISC2_TOG_REG2_STEP_TIME_SHIFT (28U) -/*! REG2_STEP_TIME - * 0b00..64 - * 0b01..128 - * 0b10..256 - * 0b11..512 - */ -#define PMU_MISC2_TOG_REG2_STEP_TIME(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_REG2_STEP_TIME_SHIFT)) & PMU_MISC2_TOG_REG2_STEP_TIME_MASK) - -#define PMU_MISC2_TOG_VIDEO_DIV_MASK (0xC0000000U) -#define PMU_MISC2_TOG_VIDEO_DIV_SHIFT (30U) -/*! VIDEO_DIV - * 0b00..divide by 1 (Default) - * 0b01..divide by 2 - * 0b10..divide by 1 - * 0b11..divide by 4 - */ -#define PMU_MISC2_TOG_VIDEO_DIV(x) (((uint32_t)(((uint32_t)(x)) << PMU_MISC2_TOG_VIDEO_DIV_SHIFT)) & PMU_MISC2_TOG_VIDEO_DIV_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group PMU_Register_Masks */ - - -/* PMU - Peripheral instance base addresses */ -/** Peripheral PMU base address */ -#define PMU_BASE (0x400D8000u) -/** Peripheral PMU base pointer */ -#define PMU ((PMU_Type *)PMU_BASE) -/** Array initializer of PMU peripheral base addresses */ -#define PMU_BASE_ADDRS { PMU_BASE } -/** Array initializer of PMU peripheral base pointers */ -#define PMU_BASE_PTRS { PMU } - -/*! - * @} - */ /* end of group PMU_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- PWM Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PWM_Peripheral_Access_Layer PWM Peripheral Access Layer - * @{ - */ - -/** PWM - Register Layout Typedef */ -typedef struct { - struct { /* offset: 0x0, array step: 0x60 */ - __I uint16_t CNT; /**< Counter Register, array offset: 0x0, array step: 0x60 */ - __IO uint16_t INIT; /**< Initial Count Register, array offset: 0x2, array step: 0x60 */ - __IO uint16_t CTRL2; /**< Control 2 Register, array offset: 0x4, array step: 0x60 */ - __IO uint16_t CTRL; /**< Control Register, array offset: 0x6, array step: 0x60 */ - uint8_t RESERVED_0[2]; - __IO uint16_t VAL0; /**< Value Register 0, array offset: 0xA, array step: 0x60 */ - __IO uint16_t FRACVAL1; /**< Fractional Value Register 1, array offset: 0xC, array step: 0x60 */ - __IO uint16_t VAL1; /**< Value Register 1, array offset: 0xE, array step: 0x60 */ - __IO uint16_t FRACVAL2; /**< Fractional Value Register 2, array offset: 0x10, array step: 0x60 */ - __IO uint16_t VAL2; /**< Value Register 2, array offset: 0x12, array step: 0x60 */ - __IO uint16_t FRACVAL3; /**< Fractional Value Register 3, array offset: 0x14, array step: 0x60 */ - __IO uint16_t VAL3; /**< Value Register 3, array offset: 0x16, array step: 0x60 */ - __IO uint16_t FRACVAL4; /**< Fractional Value Register 4, array offset: 0x18, array step: 0x60 */ - __IO uint16_t VAL4; /**< Value Register 4, array offset: 0x1A, array step: 0x60 */ - __IO uint16_t FRACVAL5; /**< Fractional Value Register 5, array offset: 0x1C, array step: 0x60 */ - __IO uint16_t VAL5; /**< Value Register 5, array offset: 0x1E, array step: 0x60 */ - __IO uint16_t FRCTRL; /**< Fractional Control Register, array offset: 0x20, array step: 0x60 */ - __IO uint16_t OCTRL; /**< Output Control Register, array offset: 0x22, array step: 0x60 */ - __IO uint16_t STS; /**< Status Register, array offset: 0x24, array step: 0x60 */ - __IO uint16_t INTEN; /**< Interrupt Enable Register, array offset: 0x26, array step: 0x60 */ - __IO uint16_t DMAEN; /**< DMA Enable Register, array offset: 0x28, array step: 0x60 */ - __IO uint16_t TCTRL; /**< Output Trigger Control Register, array offset: 0x2A, array step: 0x60 */ - __IO uint16_t DISMAP[2]; /**< Fault Disable Mapping Register 0..Fault Disable Mapping Register 1, array offset: 0x2C, array step: index*0x60, index2*0x2 */ - __IO uint16_t DTCNT0; /**< Deadtime Count Register 0, array offset: 0x30, array step: 0x60 */ - __IO uint16_t DTCNT1; /**< Deadtime Count Register 1, array offset: 0x32, array step: 0x60 */ - __IO uint16_t CAPTCTRLA; /**< Capture Control A Register, array offset: 0x34, array step: 0x60 */ - __IO uint16_t CAPTCOMPA; /**< Capture Compare A Register, array offset: 0x36, array step: 0x60 */ - __IO uint16_t CAPTCTRLB; /**< Capture Control B Register, array offset: 0x38, array step: 0x60 */ - __IO uint16_t CAPTCOMPB; /**< Capture Compare B Register, array offset: 0x3A, array step: 0x60 */ - __IO uint16_t CAPTCTRLX; /**< Capture Control X Register, array offset: 0x3C, array step: 0x60 */ - __IO uint16_t CAPTCOMPX; /**< Capture Compare X Register, array offset: 0x3E, array step: 0x60 */ - __I uint16_t CVAL0; /**< Capture Value 0 Register, array offset: 0x40, array step: 0x60 */ - __I uint16_t CVAL0CYC; /**< Capture Value 0 Cycle Register, array offset: 0x42, array step: 0x60 */ - __I uint16_t CVAL1; /**< Capture Value 1 Register, array offset: 0x44, array step: 0x60 */ - __I uint16_t CVAL1CYC; /**< Capture Value 1 Cycle Register, array offset: 0x46, array step: 0x60 */ - __I uint16_t CVAL2; /**< Capture Value 2 Register, array offset: 0x48, array step: 0x60 */ - __I uint16_t CVAL2CYC; /**< Capture Value 2 Cycle Register, array offset: 0x4A, array step: 0x60 */ - __I uint16_t CVAL3; /**< Capture Value 3 Register, array offset: 0x4C, array step: 0x60 */ - __I uint16_t CVAL3CYC; /**< Capture Value 3 Cycle Register, array offset: 0x4E, array step: 0x60 */ - __I uint16_t CVAL4; /**< Capture Value 4 Register, array offset: 0x50, array step: 0x60 */ - __I uint16_t CVAL4CYC; /**< Capture Value 4 Cycle Register, array offset: 0x52, array step: 0x60 */ - __I uint16_t CVAL5; /**< Capture Value 5 Register, array offset: 0x54, array step: 0x60 */ - __I uint16_t CVAL5CYC; /**< Capture Value 5 Cycle Register, array offset: 0x56, array step: 0x60 */ - uint8_t RESERVED_1[8]; - } SM[4]; - __IO uint16_t OUTEN; /**< Output Enable Register, offset: 0x180 */ - __IO uint16_t MASK; /**< Mask Register, offset: 0x182 */ - __IO uint16_t SWCOUT; /**< Software Controlled Output Register, offset: 0x184 */ - __IO uint16_t DTSRCSEL; /**< PWM Source Select Register, offset: 0x186 */ - __IO uint16_t MCTRL; /**< Master Control Register, offset: 0x188 */ - __IO uint16_t MCTRL2; /**< Master Control 2 Register, offset: 0x18A */ - __IO uint16_t FCTRL; /**< Fault Control Register, offset: 0x18C */ - __IO uint16_t FSTS; /**< Fault Status Register, offset: 0x18E */ - __IO uint16_t FFILT; /**< Fault Filter Register, offset: 0x190 */ - __IO uint16_t FTST; /**< Fault Test Register, offset: 0x192 */ - __IO uint16_t FCTRL2; /**< Fault Control 2 Register, offset: 0x194 */ -} PWM_Type; - -/* ---------------------------------------------------------------------------- - -- PWM Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PWM_Register_Masks PWM Register Masks - * @{ - */ - -/*! @name CNT - Counter Register */ -/*! @{ */ - -#define PWM_CNT_CNT_MASK (0xFFFFU) -#define PWM_CNT_CNT_SHIFT (0U) -/*! CNT - Counter Register Bits - */ -#define PWM_CNT_CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CNT_CNT_SHIFT)) & PWM_CNT_CNT_MASK) -/*! @} */ - -/* The count of PWM_CNT */ -#define PWM_CNT_COUNT (4U) - -/*! @name INIT - Initial Count Register */ -/*! @{ */ - -#define PWM_INIT_INIT_MASK (0xFFFFU) -#define PWM_INIT_INIT_SHIFT (0U) -/*! INIT - Initial Count Register Bits - */ -#define PWM_INIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_INIT_INIT_SHIFT)) & PWM_INIT_INIT_MASK) -/*! @} */ - -/* The count of PWM_INIT */ -#define PWM_INIT_COUNT (4U) - -/*! @name CTRL2 - Control 2 Register */ -/*! @{ */ - -#define PWM_CTRL2_CLK_SEL_MASK (0x3U) -#define PWM_CTRL2_CLK_SEL_SHIFT (0U) -/*! CLK_SEL - Clock Source Select - * 0b00..The IPBus clock is used as the clock for the local prescaler and counter. - * 0b01..EXT_CLK is used as the clock for the local prescaler and counter. - * 0b10..Submodule 0's clock (AUX_CLK) is used as the source clock for the local prescaler and counter. This - * setting should not be used in submodule 0 as it will force the clock to logic 0. - * 0b11..reserved - */ -#define PWM_CTRL2_CLK_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_CLK_SEL_SHIFT)) & PWM_CTRL2_CLK_SEL_MASK) - -#define PWM_CTRL2_RELOAD_SEL_MASK (0x4U) -#define PWM_CTRL2_RELOAD_SEL_SHIFT (2U) -/*! RELOAD_SEL - Reload Source Select - * 0b0..The local RELOAD signal is used to reload registers. - * 0b1..The master RELOAD signal (from submodule 0) is used to reload registers. This setting should not be used - * in submodule 0 as it will force the RELOAD signal to logic 0. - */ -#define PWM_CTRL2_RELOAD_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_RELOAD_SEL_SHIFT)) & PWM_CTRL2_RELOAD_SEL_MASK) - -#define PWM_CTRL2_FORCE_SEL_MASK (0x38U) -#define PWM_CTRL2_FORCE_SEL_SHIFT (3U) -/*! FORCE_SEL - This read/write bit determines the source of the FORCE OUTPUT signal for this submodule. - * 0b000..The local force signal, CTRL2[FORCE], from this submodule is used to force updates. - * 0b001..The master force signal from submodule 0 is used to force updates. This setting should not be used in - * submodule 0 as it will hold the FORCE OUTPUT signal to logic 0. - * 0b010..The local reload signal from this submodule is used to force updates without regard to the state of LDOK. - * 0b011..The master reload signal from submodule0 is used to force updates if LDOK is set. This setting should - * not be used in submodule0 as it will hold the FORCE OUTPUT signal to logic 0. - * 0b100..The local sync signal from this submodule is used to force updates. - * 0b101..The master sync signal from submodule0 is used to force updates. This setting should not be used in - * submodule0 as it will hold the FORCE OUTPUT signal to logic 0. - * 0b110..The external force signal, EXT_FORCE, from outside the PWM module causes updates. - * 0b111..The external sync signal, EXT_SYNC, from outside the PWM module causes updates. - */ -#define PWM_CTRL2_FORCE_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FORCE_SEL_SHIFT)) & PWM_CTRL2_FORCE_SEL_MASK) - -#define PWM_CTRL2_FORCE_MASK (0x40U) -#define PWM_CTRL2_FORCE_SHIFT (6U) -/*! FORCE - Force Initialization - */ -#define PWM_CTRL2_FORCE(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FORCE_SHIFT)) & PWM_CTRL2_FORCE_MASK) - -#define PWM_CTRL2_FRCEN_MASK (0x80U) -#define PWM_CTRL2_FRCEN_SHIFT (7U) -/*! FRCEN - FRCEN - * 0b0..Initialization from a FORCE_OUT is disabled. - * 0b1..Initialization from a FORCE_OUT is enabled. - */ -#define PWM_CTRL2_FRCEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FRCEN_SHIFT)) & PWM_CTRL2_FRCEN_MASK) - -#define PWM_CTRL2_INIT_SEL_MASK (0x300U) -#define PWM_CTRL2_INIT_SEL_SHIFT (8U) -/*! INIT_SEL - Initialization Control Select - * 0b00..Local sync (PWM_X) causes initialization. - * 0b01..Master reload from submodule 0 causes initialization. This setting should not be used in submodule 0 as - * it will force the INIT signal to logic 0. The submodule counter will only reinitialize when a master - * reload occurs. - * 0b10..Master sync from submodule 0 causes initialization. This setting should not be used in submodule 0 as it - * will force the INIT signal to logic 0. - * 0b11..EXT_SYNC causes initialization. - */ -#define PWM_CTRL2_INIT_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_INIT_SEL_SHIFT)) & PWM_CTRL2_INIT_SEL_MASK) - -#define PWM_CTRL2_PWMX_INIT_MASK (0x400U) -#define PWM_CTRL2_PWMX_INIT_SHIFT (10U) -/*! PWMX_INIT - PWM_X Initial Value - */ -#define PWM_CTRL2_PWMX_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWMX_INIT_SHIFT)) & PWM_CTRL2_PWMX_INIT_MASK) - -#define PWM_CTRL2_PWM45_INIT_MASK (0x800U) -#define PWM_CTRL2_PWM45_INIT_SHIFT (11U) -/*! PWM45_INIT - PWM45 Initial Value - */ -#define PWM_CTRL2_PWM45_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWM45_INIT_SHIFT)) & PWM_CTRL2_PWM45_INIT_MASK) - -#define PWM_CTRL2_PWM23_INIT_MASK (0x1000U) -#define PWM_CTRL2_PWM23_INIT_SHIFT (12U) -/*! PWM23_INIT - PWM23 Initial Value - */ -#define PWM_CTRL2_PWM23_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWM23_INIT_SHIFT)) & PWM_CTRL2_PWM23_INIT_MASK) - -#define PWM_CTRL2_INDEP_MASK (0x2000U) -#define PWM_CTRL2_INDEP_SHIFT (13U) -/*! INDEP - Independent or Complementary Pair Operation - * 0b0..PWM_A and PWM_B form a complementary PWM pair. - * 0b1..PWM_A and PWM_B outputs are independent PWMs. - */ -#define PWM_CTRL2_INDEP(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_INDEP_SHIFT)) & PWM_CTRL2_INDEP_MASK) - -#define PWM_CTRL2_WAITEN_MASK (0x4000U) -#define PWM_CTRL2_WAITEN_SHIFT (14U) -/*! WAITEN - WAIT Enable - */ -#define PWM_CTRL2_WAITEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_WAITEN_SHIFT)) & PWM_CTRL2_WAITEN_MASK) - -#define PWM_CTRL2_DBGEN_MASK (0x8000U) -#define PWM_CTRL2_DBGEN_SHIFT (15U) -/*! DBGEN - Debug Enable - */ -#define PWM_CTRL2_DBGEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_DBGEN_SHIFT)) & PWM_CTRL2_DBGEN_MASK) -/*! @} */ - -/* The count of PWM_CTRL2 */ -#define PWM_CTRL2_COUNT (4U) - -/*! @name CTRL - Control Register */ -/*! @{ */ - -#define PWM_CTRL_DBLEN_MASK (0x1U) -#define PWM_CTRL_DBLEN_SHIFT (0U) -/*! DBLEN - Double Switching Enable - * 0b0..Double switching disabled. - * 0b1..Double switching enabled. - */ -#define PWM_CTRL_DBLEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DBLEN_SHIFT)) & PWM_CTRL_DBLEN_MASK) - -#define PWM_CTRL_DBLX_MASK (0x2U) -#define PWM_CTRL_DBLX_SHIFT (1U) -/*! DBLX - PWMX Double Switching Enable - * 0b0..PWMX double pulse disabled. - * 0b1..PWMX double pulse enabled. - */ -#define PWM_CTRL_DBLX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DBLX_SHIFT)) & PWM_CTRL_DBLX_MASK) - -#define PWM_CTRL_LDMOD_MASK (0x4U) -#define PWM_CTRL_LDMOD_SHIFT (2U) -/*! LDMOD - Load Mode Select - * 0b0..Buffered registers of this submodule are loaded and take effect at the next PWM reload if MCTRL[LDOK] is set. - * 0b1..Buffered registers of this submodule are loaded and take effect immediately upon MCTRL[LDOK] being set. - * In this case it is not necessary to set CTRL[FULL] or CTRL[HALF]. - */ -#define PWM_CTRL_LDMOD(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_LDMOD_SHIFT)) & PWM_CTRL_LDMOD_MASK) - -#define PWM_CTRL_SPLIT_MASK (0x8U) -#define PWM_CTRL_SPLIT_SHIFT (3U) -/*! SPLIT - Split the DBLPWM signal to PWMA and PWMB - * 0b0..DBLPWM is not split. PWMA and PWMB each have double pulses. - * 0b1..DBLPWM is split to PWMA and PWMB. - */ -#define PWM_CTRL_SPLIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_SPLIT_SHIFT)) & PWM_CTRL_SPLIT_MASK) - -#define PWM_CTRL_PRSC_MASK (0x70U) -#define PWM_CTRL_PRSC_SHIFT (4U) -/*! PRSC - Prescaler - * 0b000..PWM clock frequency = fclk - * 0b001..PWM clock frequency = fclk/2 - * 0b010..PWM clock frequency = fclk/4 - * 0b011..PWM clock frequency = fclk/8 - * 0b100..PWM clock frequency = fclk/16 - * 0b101..PWM clock frequency = fclk/32 - * 0b110..PWM clock frequency = fclk/64 - * 0b111..PWM clock frequency = fclk/128 - */ -#define PWM_CTRL_PRSC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_PRSC_SHIFT)) & PWM_CTRL_PRSC_MASK) - -#define PWM_CTRL_COMPMODE_MASK (0x80U) -#define PWM_CTRL_COMPMODE_SHIFT (7U) -/*! COMPMODE - Compare Mode - * 0b0..The VAL* registers and the PWM counter are compared using an "equal to" method. This means that PWM edges - * are only produced when the counter is equal to one of the VAL* register values. This implies that a PWMA - * output that is high at the end of a period will maintain this state until a match with VAL3 clears the - * output in the following period. - * 0b1..The VAL* registers and the PWM counter are compared using an "equal to or greater than" method. This - * means that PWM edges are produced when the counter is equal to or greater than one of the VAL* register - * values. This implies that a PWMA output that is high at the end of a period could go low at the start of the - * next period if the starting counter value is greater than (but not necessarily equal to) the new VAL3 value. - */ -#define PWM_CTRL_COMPMODE(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_COMPMODE_SHIFT)) & PWM_CTRL_COMPMODE_MASK) - -#define PWM_CTRL_DT_MASK (0x300U) -#define PWM_CTRL_DT_SHIFT (8U) -/*! DT - Deadtime - */ -#define PWM_CTRL_DT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DT_SHIFT)) & PWM_CTRL_DT_MASK) - -#define PWM_CTRL_FULL_MASK (0x400U) -#define PWM_CTRL_FULL_SHIFT (10U) -/*! FULL - Full Cycle Reload - * 0b0..Full-cycle reloads disabled. - * 0b1..Full-cycle reloads enabled. - */ -#define PWM_CTRL_FULL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_FULL_SHIFT)) & PWM_CTRL_FULL_MASK) - -#define PWM_CTRL_HALF_MASK (0x800U) -#define PWM_CTRL_HALF_SHIFT (11U) -/*! HALF - Half Cycle Reload - * 0b0..Half-cycle reloads disabled. - * 0b1..Half-cycle reloads enabled. - */ -#define PWM_CTRL_HALF(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_HALF_SHIFT)) & PWM_CTRL_HALF_MASK) - -#define PWM_CTRL_LDFQ_MASK (0xF000U) -#define PWM_CTRL_LDFQ_SHIFT (12U) -/*! LDFQ - Load Frequency - * 0b0000..Every PWM opportunity - * 0b0001..Every 2 PWM opportunities - * 0b0010..Every 3 PWM opportunities - * 0b0011..Every 4 PWM opportunities - * 0b0100..Every 5 PWM opportunities - * 0b0101..Every 6 PWM opportunities - * 0b0110..Every 7 PWM opportunities - * 0b0111..Every 8 PWM opportunities - * 0b1000..Every 9 PWM opportunities - * 0b1001..Every 10 PWM opportunities - * 0b1010..Every 11 PWM opportunities - * 0b1011..Every 12 PWM opportunities - * 0b1100..Every 13 PWM opportunities - * 0b1101..Every 14 PWM opportunities - * 0b1110..Every 15 PWM opportunities - * 0b1111..Every 16 PWM opportunities - */ -#define PWM_CTRL_LDFQ(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_LDFQ_SHIFT)) & PWM_CTRL_LDFQ_MASK) -/*! @} */ - -/* The count of PWM_CTRL */ -#define PWM_CTRL_COUNT (4U) - -/*! @name VAL0 - Value Register 0 */ -/*! @{ */ - -#define PWM_VAL0_VAL0_MASK (0xFFFFU) -#define PWM_VAL0_VAL0_SHIFT (0U) -/*! VAL0 - Value Register 0 - */ -#define PWM_VAL0_VAL0(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL0_VAL0_SHIFT)) & PWM_VAL0_VAL0_MASK) -/*! @} */ - -/* The count of PWM_VAL0 */ -#define PWM_VAL0_COUNT (4U) - -/*! @name FRACVAL1 - Fractional Value Register 1 */ -/*! @{ */ - -#define PWM_FRACVAL1_FRACVAL1_MASK (0xF800U) -#define PWM_FRACVAL1_FRACVAL1_SHIFT (11U) -/*! FRACVAL1 - Fractional Value 1 Register - */ -#define PWM_FRACVAL1_FRACVAL1(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRACVAL1_FRACVAL1_SHIFT)) & PWM_FRACVAL1_FRACVAL1_MASK) -/*! @} */ - -/* The count of PWM_FRACVAL1 */ -#define PWM_FRACVAL1_COUNT (4U) - -/*! @name VAL1 - Value Register 1 */ -/*! @{ */ - -#define PWM_VAL1_VAL1_MASK (0xFFFFU) -#define PWM_VAL1_VAL1_SHIFT (0U) -/*! VAL1 - Value Register 1 - */ -#define PWM_VAL1_VAL1(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL1_VAL1_SHIFT)) & PWM_VAL1_VAL1_MASK) -/*! @} */ - -/* The count of PWM_VAL1 */ -#define PWM_VAL1_COUNT (4U) - -/*! @name FRACVAL2 - Fractional Value Register 2 */ -/*! @{ */ - -#define PWM_FRACVAL2_FRACVAL2_MASK (0xF800U) -#define PWM_FRACVAL2_FRACVAL2_SHIFT (11U) -/*! FRACVAL2 - Fractional Value 2 - */ -#define PWM_FRACVAL2_FRACVAL2(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRACVAL2_FRACVAL2_SHIFT)) & PWM_FRACVAL2_FRACVAL2_MASK) -/*! @} */ - -/* The count of PWM_FRACVAL2 */ -#define PWM_FRACVAL2_COUNT (4U) - -/*! @name VAL2 - Value Register 2 */ -/*! @{ */ - -#define PWM_VAL2_VAL2_MASK (0xFFFFU) -#define PWM_VAL2_VAL2_SHIFT (0U) -/*! VAL2 - Value Register 2 - */ -#define PWM_VAL2_VAL2(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL2_VAL2_SHIFT)) & PWM_VAL2_VAL2_MASK) -/*! @} */ - -/* The count of PWM_VAL2 */ -#define PWM_VAL2_COUNT (4U) - -/*! @name FRACVAL3 - Fractional Value Register 3 */ -/*! @{ */ - -#define PWM_FRACVAL3_FRACVAL3_MASK (0xF800U) -#define PWM_FRACVAL3_FRACVAL3_SHIFT (11U) -/*! FRACVAL3 - Fractional Value 3 - */ -#define PWM_FRACVAL3_FRACVAL3(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRACVAL3_FRACVAL3_SHIFT)) & PWM_FRACVAL3_FRACVAL3_MASK) -/*! @} */ - -/* The count of PWM_FRACVAL3 */ -#define PWM_FRACVAL3_COUNT (4U) - -/*! @name VAL3 - Value Register 3 */ -/*! @{ */ - -#define PWM_VAL3_VAL3_MASK (0xFFFFU) -#define PWM_VAL3_VAL3_SHIFT (0U) -/*! VAL3 - Value Register 3 - */ -#define PWM_VAL3_VAL3(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL3_VAL3_SHIFT)) & PWM_VAL3_VAL3_MASK) -/*! @} */ - -/* The count of PWM_VAL3 */ -#define PWM_VAL3_COUNT (4U) - -/*! @name FRACVAL4 - Fractional Value Register 4 */ -/*! @{ */ - -#define PWM_FRACVAL4_FRACVAL4_MASK (0xF800U) -#define PWM_FRACVAL4_FRACVAL4_SHIFT (11U) -/*! FRACVAL4 - Fractional Value 4 - */ -#define PWM_FRACVAL4_FRACVAL4(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRACVAL4_FRACVAL4_SHIFT)) & PWM_FRACVAL4_FRACVAL4_MASK) -/*! @} */ - -/* The count of PWM_FRACVAL4 */ -#define PWM_FRACVAL4_COUNT (4U) - -/*! @name VAL4 - Value Register 4 */ -/*! @{ */ - -#define PWM_VAL4_VAL4_MASK (0xFFFFU) -#define PWM_VAL4_VAL4_SHIFT (0U) -/*! VAL4 - Value Register 4 - */ -#define PWM_VAL4_VAL4(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL4_VAL4_SHIFT)) & PWM_VAL4_VAL4_MASK) -/*! @} */ - -/* The count of PWM_VAL4 */ -#define PWM_VAL4_COUNT (4U) - -/*! @name FRACVAL5 - Fractional Value Register 5 */ -/*! @{ */ - -#define PWM_FRACVAL5_FRACVAL5_MASK (0xF800U) -#define PWM_FRACVAL5_FRACVAL5_SHIFT (11U) -/*! FRACVAL5 - Fractional Value 5 - */ -#define PWM_FRACVAL5_FRACVAL5(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRACVAL5_FRACVAL5_SHIFT)) & PWM_FRACVAL5_FRACVAL5_MASK) -/*! @} */ - -/* The count of PWM_FRACVAL5 */ -#define PWM_FRACVAL5_COUNT (4U) - -/*! @name VAL5 - Value Register 5 */ -/*! @{ */ - -#define PWM_VAL5_VAL5_MASK (0xFFFFU) -#define PWM_VAL5_VAL5_SHIFT (0U) -/*! VAL5 - Value Register 5 - */ -#define PWM_VAL5_VAL5(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL5_VAL5_SHIFT)) & PWM_VAL5_VAL5_MASK) -/*! @} */ - -/* The count of PWM_VAL5 */ -#define PWM_VAL5_COUNT (4U) - -/*! @name FRCTRL - Fractional Control Register */ -/*! @{ */ - -#define PWM_FRCTRL_FRAC1_EN_MASK (0x2U) -#define PWM_FRCTRL_FRAC1_EN_SHIFT (1U) -/*! FRAC1_EN - Fractional Cycle PWM Period Enable - * 0b0..Disable fractional cycle length for the PWM period. - * 0b1..Enable fractional cycle length for the PWM period. - */ -#define PWM_FRCTRL_FRAC1_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRCTRL_FRAC1_EN_SHIFT)) & PWM_FRCTRL_FRAC1_EN_MASK) - -#define PWM_FRCTRL_FRAC23_EN_MASK (0x4U) -#define PWM_FRCTRL_FRAC23_EN_SHIFT (2U) -/*! FRAC23_EN - Fractional Cycle Placement Enable for PWM_A - * 0b0..Disable fractional cycle placement for PWM_A. - * 0b1..Enable fractional cycle placement for PWM_A. - */ -#define PWM_FRCTRL_FRAC23_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRCTRL_FRAC23_EN_SHIFT)) & PWM_FRCTRL_FRAC23_EN_MASK) - -#define PWM_FRCTRL_FRAC45_EN_MASK (0x10U) -#define PWM_FRCTRL_FRAC45_EN_SHIFT (4U) -/*! FRAC45_EN - Fractional Cycle Placement Enable for PWM_B - * 0b0..Disable fractional cycle placement for PWM_B. - * 0b1..Enable fractional cycle placement for PWM_B. - */ -#define PWM_FRCTRL_FRAC45_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRCTRL_FRAC45_EN_SHIFT)) & PWM_FRCTRL_FRAC45_EN_MASK) - -#define PWM_FRCTRL_FRAC_PU_MASK (0x100U) -#define PWM_FRCTRL_FRAC_PU_SHIFT (8U) -/*! FRAC_PU - Fractional Delay Circuit Power Up - * 0b0..Turn off fractional delay logic. - * 0b1..Power up fractional delay logic. - */ -#define PWM_FRCTRL_FRAC_PU(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRCTRL_FRAC_PU_SHIFT)) & PWM_FRCTRL_FRAC_PU_MASK) - -#define PWM_FRCTRL_TEST_MASK (0x8000U) -#define PWM_FRCTRL_TEST_SHIFT (15U) -/*! TEST - Test Status Bit - */ -#define PWM_FRCTRL_TEST(x) (((uint16_t)(((uint16_t)(x)) << PWM_FRCTRL_TEST_SHIFT)) & PWM_FRCTRL_TEST_MASK) -/*! @} */ - -/* The count of PWM_FRCTRL */ -#define PWM_FRCTRL_COUNT (4U) - -/*! @name OCTRL - Output Control Register */ -/*! @{ */ - -#define PWM_OCTRL_PWMXFS_MASK (0x3U) -#define PWM_OCTRL_PWMXFS_SHIFT (0U) -/*! PWMXFS - PWM_X Fault State - * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. - * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. - * 0b10..Output is tristated. - * 0b11..Output is tristated. - */ -#define PWM_OCTRL_PWMXFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMXFS_SHIFT)) & PWM_OCTRL_PWMXFS_MASK) - -#define PWM_OCTRL_PWMBFS_MASK (0xCU) -#define PWM_OCTRL_PWMBFS_SHIFT (2U) -/*! PWMBFS - PWM_B Fault State - * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. - * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. - * 0b10..Output is tristated. - * 0b11..Output is tristated. - */ -#define PWM_OCTRL_PWMBFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMBFS_SHIFT)) & PWM_OCTRL_PWMBFS_MASK) - -#define PWM_OCTRL_PWMAFS_MASK (0x30U) -#define PWM_OCTRL_PWMAFS_SHIFT (4U) -/*! PWMAFS - PWM_A Fault State - * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. - * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. - * 0b10..Output is tristated. - * 0b11..Output is tristated. - */ -#define PWM_OCTRL_PWMAFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMAFS_SHIFT)) & PWM_OCTRL_PWMAFS_MASK) - -#define PWM_OCTRL_POLX_MASK (0x100U) -#define PWM_OCTRL_POLX_SHIFT (8U) -/*! POLX - PWM_X Output Polarity - * 0b0..PWM_X output not inverted. A high level on the PWM_X pin represents the "on" or "active" state. - * 0b1..PWM_X output inverted. A low level on the PWM_X pin represents the "on" or "active" state. - */ -#define PWM_OCTRL_POLX(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLX_SHIFT)) & PWM_OCTRL_POLX_MASK) - -#define PWM_OCTRL_POLB_MASK (0x200U) -#define PWM_OCTRL_POLB_SHIFT (9U) -/*! POLB - PWM_B Output Polarity - * 0b0..PWM_B output not inverted. A high level on the PWM_B pin represents the "on" or "active" state. - * 0b1..PWM_B output inverted. A low level on the PWM_B pin represents the "on" or "active" state. - */ -#define PWM_OCTRL_POLB(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLB_SHIFT)) & PWM_OCTRL_POLB_MASK) - -#define PWM_OCTRL_POLA_MASK (0x400U) -#define PWM_OCTRL_POLA_SHIFT (10U) -/*! POLA - PWM_A Output Polarity - * 0b0..PWM_A output not inverted. A high level on the PWM_A pin represents the "on" or "active" state. - * 0b1..PWM_A output inverted. A low level on the PWM_A pin represents the "on" or "active" state. - */ -#define PWM_OCTRL_POLA(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLA_SHIFT)) & PWM_OCTRL_POLA_MASK) - -#define PWM_OCTRL_PWMX_IN_MASK (0x2000U) -#define PWM_OCTRL_PWMX_IN_SHIFT (13U) -/*! PWMX_IN - PWM_X Input - */ -#define PWM_OCTRL_PWMX_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMX_IN_SHIFT)) & PWM_OCTRL_PWMX_IN_MASK) - -#define PWM_OCTRL_PWMB_IN_MASK (0x4000U) -#define PWM_OCTRL_PWMB_IN_SHIFT (14U) -/*! PWMB_IN - PWM_B Input - */ -#define PWM_OCTRL_PWMB_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMB_IN_SHIFT)) & PWM_OCTRL_PWMB_IN_MASK) - -#define PWM_OCTRL_PWMA_IN_MASK (0x8000U) -#define PWM_OCTRL_PWMA_IN_SHIFT (15U) -/*! PWMA_IN - PWM_A Input - */ -#define PWM_OCTRL_PWMA_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMA_IN_SHIFT)) & PWM_OCTRL_PWMA_IN_MASK) -/*! @} */ - -/* The count of PWM_OCTRL */ -#define PWM_OCTRL_COUNT (4U) - -/*! @name STS - Status Register */ -/*! @{ */ - -#define PWM_STS_CMPF_MASK (0x3FU) -#define PWM_STS_CMPF_SHIFT (0U) -/*! CMPF - Compare Flags - * 0b000000..No compare event has occurred for a particular VALx value. - * 0b000001..A compare event has occurred for a particular VALx value. - */ -#define PWM_STS_CMPF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CMPF_SHIFT)) & PWM_STS_CMPF_MASK) - -#define PWM_STS_CFX0_MASK (0x40U) -#define PWM_STS_CFX0_SHIFT (6U) -/*! CFX0 - Capture Flag X0 - */ -#define PWM_STS_CFX0(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFX0_SHIFT)) & PWM_STS_CFX0_MASK) - -#define PWM_STS_CFX1_MASK (0x80U) -#define PWM_STS_CFX1_SHIFT (7U) -/*! CFX1 - Capture Flag X1 - */ -#define PWM_STS_CFX1(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFX1_SHIFT)) & PWM_STS_CFX1_MASK) - -#define PWM_STS_CFB0_MASK (0x100U) -#define PWM_STS_CFB0_SHIFT (8U) -/*! CFB0 - Capture Flag B0 - */ -#define PWM_STS_CFB0(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFB0_SHIFT)) & PWM_STS_CFB0_MASK) - -#define PWM_STS_CFB1_MASK (0x200U) -#define PWM_STS_CFB1_SHIFT (9U) -/*! CFB1 - Capture Flag B1 - */ -#define PWM_STS_CFB1(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFB1_SHIFT)) & PWM_STS_CFB1_MASK) - -#define PWM_STS_CFA0_MASK (0x400U) -#define PWM_STS_CFA0_SHIFT (10U) -/*! CFA0 - Capture Flag A0 - */ -#define PWM_STS_CFA0(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFA0_SHIFT)) & PWM_STS_CFA0_MASK) - -#define PWM_STS_CFA1_MASK (0x800U) -#define PWM_STS_CFA1_SHIFT (11U) -/*! CFA1 - Capture Flag A1 - */ -#define PWM_STS_CFA1(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFA1_SHIFT)) & PWM_STS_CFA1_MASK) - -#define PWM_STS_RF_MASK (0x1000U) -#define PWM_STS_RF_SHIFT (12U) -/*! RF - Reload Flag - * 0b0..No new reload cycle since last STS[RF] clearing - * 0b1..New reload cycle since last STS[RF] clearing - */ -#define PWM_STS_RF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_RF_SHIFT)) & PWM_STS_RF_MASK) - -#define PWM_STS_REF_MASK (0x2000U) -#define PWM_STS_REF_SHIFT (13U) -/*! REF - Reload Error Flag - * 0b0..No reload error occurred. - * 0b1..Reload signal occurred with non-coherent data and MCTRL[LDOK] = 0. - */ -#define PWM_STS_REF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_REF_SHIFT)) & PWM_STS_REF_MASK) - -#define PWM_STS_RUF_MASK (0x4000U) -#define PWM_STS_RUF_SHIFT (14U) -/*! RUF - Registers Updated Flag - * 0b0..No register update has occurred since last reload. - * 0b1..At least one of the double buffered registers has been updated since the last reload. - */ -#define PWM_STS_RUF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_RUF_SHIFT)) & PWM_STS_RUF_MASK) -/*! @} */ - -/* The count of PWM_STS */ -#define PWM_STS_COUNT (4U) - -/*! @name INTEN - Interrupt Enable Register */ -/*! @{ */ - -#define PWM_INTEN_CMPIE_MASK (0x3FU) -#define PWM_INTEN_CMPIE_SHIFT (0U) -/*! CMPIE - Compare Interrupt Enables - * 0b000000..The corresponding STS[CMPF] bit will not cause an interrupt request. - * 0b000001..The corresponding STS[CMPF] bit will cause an interrupt request. - */ -#define PWM_INTEN_CMPIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CMPIE_SHIFT)) & PWM_INTEN_CMPIE_MASK) - -#define PWM_INTEN_CX0IE_MASK (0x40U) -#define PWM_INTEN_CX0IE_SHIFT (6U) -/*! CX0IE - Capture X 0 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFX0]. - * 0b1..Interrupt request enabled for STS[CFX0]. - */ -#define PWM_INTEN_CX0IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CX0IE_SHIFT)) & PWM_INTEN_CX0IE_MASK) - -#define PWM_INTEN_CX1IE_MASK (0x80U) -#define PWM_INTEN_CX1IE_SHIFT (7U) -/*! CX1IE - Capture X 1 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFX1]. - * 0b1..Interrupt request enabled for STS[CFX1]. - */ -#define PWM_INTEN_CX1IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CX1IE_SHIFT)) & PWM_INTEN_CX1IE_MASK) - -#define PWM_INTEN_CB0IE_MASK (0x100U) -#define PWM_INTEN_CB0IE_SHIFT (8U) -/*! CB0IE - Capture B 0 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFB0]. - * 0b1..Interrupt request enabled for STS[CFB0]. - */ -#define PWM_INTEN_CB0IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CB0IE_SHIFT)) & PWM_INTEN_CB0IE_MASK) - -#define PWM_INTEN_CB1IE_MASK (0x200U) -#define PWM_INTEN_CB1IE_SHIFT (9U) -/*! CB1IE - Capture B 1 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFB1]. - * 0b1..Interrupt request enabled for STS[CFB1]. - */ -#define PWM_INTEN_CB1IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CB1IE_SHIFT)) & PWM_INTEN_CB1IE_MASK) - -#define PWM_INTEN_CA0IE_MASK (0x400U) -#define PWM_INTEN_CA0IE_SHIFT (10U) -/*! CA0IE - Capture A 0 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFA0]. - * 0b1..Interrupt request enabled for STS[CFA0]. - */ -#define PWM_INTEN_CA0IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CA0IE_SHIFT)) & PWM_INTEN_CA0IE_MASK) - -#define PWM_INTEN_CA1IE_MASK (0x800U) -#define PWM_INTEN_CA1IE_SHIFT (11U) -/*! CA1IE - Capture A 1 Interrupt Enable - * 0b0..Interrupt request disabled for STS[CFA1]. - * 0b1..Interrupt request enabled for STS[CFA1]. - */ -#define PWM_INTEN_CA1IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CA1IE_SHIFT)) & PWM_INTEN_CA1IE_MASK) - -#define PWM_INTEN_RIE_MASK (0x1000U) -#define PWM_INTEN_RIE_SHIFT (12U) -/*! RIE - Reload Interrupt Enable - * 0b0..STS[RF] CPU interrupt requests disabled - * 0b1..STS[RF] CPU interrupt requests enabled - */ -#define PWM_INTEN_RIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_RIE_SHIFT)) & PWM_INTEN_RIE_MASK) - -#define PWM_INTEN_REIE_MASK (0x2000U) -#define PWM_INTEN_REIE_SHIFT (13U) -/*! REIE - Reload Error Interrupt Enable - * 0b0..STS[REF] CPU interrupt requests disabled - * 0b1..STS[REF] CPU interrupt requests enabled - */ -#define PWM_INTEN_REIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_REIE_SHIFT)) & PWM_INTEN_REIE_MASK) -/*! @} */ - -/* The count of PWM_INTEN */ -#define PWM_INTEN_COUNT (4U) - -/*! @name DMAEN - DMA Enable Register */ -/*! @{ */ - -#define PWM_DMAEN_CX0DE_MASK (0x1U) -#define PWM_DMAEN_CX0DE_SHIFT (0U) -/*! CX0DE - Capture X0 FIFO DMA Enable - */ -#define PWM_DMAEN_CX0DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CX0DE_SHIFT)) & PWM_DMAEN_CX0DE_MASK) - -#define PWM_DMAEN_CX1DE_MASK (0x2U) -#define PWM_DMAEN_CX1DE_SHIFT (1U) -/*! CX1DE - Capture X1 FIFO DMA Enable - */ -#define PWM_DMAEN_CX1DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CX1DE_SHIFT)) & PWM_DMAEN_CX1DE_MASK) - -#define PWM_DMAEN_CB0DE_MASK (0x4U) -#define PWM_DMAEN_CB0DE_SHIFT (2U) -/*! CB0DE - Capture B0 FIFO DMA Enable - */ -#define PWM_DMAEN_CB0DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CB0DE_SHIFT)) & PWM_DMAEN_CB0DE_MASK) - -#define PWM_DMAEN_CB1DE_MASK (0x8U) -#define PWM_DMAEN_CB1DE_SHIFT (3U) -/*! CB1DE - Capture B1 FIFO DMA Enable - */ -#define PWM_DMAEN_CB1DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CB1DE_SHIFT)) & PWM_DMAEN_CB1DE_MASK) - -#define PWM_DMAEN_CA0DE_MASK (0x10U) -#define PWM_DMAEN_CA0DE_SHIFT (4U) -/*! CA0DE - Capture A0 FIFO DMA Enable - */ -#define PWM_DMAEN_CA0DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CA0DE_SHIFT)) & PWM_DMAEN_CA0DE_MASK) - -#define PWM_DMAEN_CA1DE_MASK (0x20U) -#define PWM_DMAEN_CA1DE_SHIFT (5U) -/*! CA1DE - Capture A1 FIFO DMA Enable - */ -#define PWM_DMAEN_CA1DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CA1DE_SHIFT)) & PWM_DMAEN_CA1DE_MASK) - -#define PWM_DMAEN_CAPTDE_MASK (0xC0U) -#define PWM_DMAEN_CAPTDE_SHIFT (6U) -/*! CAPTDE - Capture DMA Enable Source Select - * 0b00..Read DMA requests disabled. - * 0b01..Exceeding a FIFO watermark sets the DMA read request. This requires at least one of DMAEN[CA1DE], - * DMAEN[CA0DE], DMAEN[CB1DE], DMAEN[CB0DE], DMAEN[CX1DE], or DMAEN[CX0DE] to also be set in order to determine to - * which watermark(s) the DMA request is sensitive. - * 0b10..A local sync (VAL1 matches counter) sets the read DMA request. - * 0b11..A local reload (STS[RF] being set) sets the read DMA request. - */ -#define PWM_DMAEN_CAPTDE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CAPTDE_SHIFT)) & PWM_DMAEN_CAPTDE_MASK) - -#define PWM_DMAEN_FAND_MASK (0x100U) -#define PWM_DMAEN_FAND_SHIFT (8U) -/*! FAND - FIFO Watermark AND Control - * 0b0..Selected FIFO watermarks are OR'ed together. - * 0b1..Selected FIFO watermarks are AND'ed together. - */ -#define PWM_DMAEN_FAND(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_FAND_SHIFT)) & PWM_DMAEN_FAND_MASK) - -#define PWM_DMAEN_VALDE_MASK (0x200U) -#define PWM_DMAEN_VALDE_SHIFT (9U) -/*! VALDE - Value Registers DMA Enable - * 0b0..DMA write requests disabled - * 0b1..DMA write requests for the VALx and FRACVALx registers enabled - */ -#define PWM_DMAEN_VALDE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_VALDE_SHIFT)) & PWM_DMAEN_VALDE_MASK) -/*! @} */ - -/* The count of PWM_DMAEN */ -#define PWM_DMAEN_COUNT (4U) - -/*! @name TCTRL - Output Trigger Control Register */ -/*! @{ */ - -#define PWM_TCTRL_OUT_TRIG_EN_MASK (0x3FU) -#define PWM_TCTRL_OUT_TRIG_EN_SHIFT (0U) -/*! OUT_TRIG_EN - Output Trigger Enables - * 0b000000..PWM_OUT_TRIGx will not set when the counter value matches the VALx value. - * 0b000001..PWM_OUT_TRIGx will set when the counter value matches the VALx value. - */ -#define PWM_TCTRL_OUT_TRIG_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_OUT_TRIG_EN_SHIFT)) & PWM_TCTRL_OUT_TRIG_EN_MASK) - -#define PWM_TCTRL_TRGFRQ_MASK (0x1000U) -#define PWM_TCTRL_TRGFRQ_SHIFT (12U) -/*! TRGFRQ - Trigger frequency - * 0b0..Trigger outputs are generated during every PWM period even if the PWM is not reloaded every period due to CTRL[LDFQ] being non-zero. - * 0b1..Trigger outputs are generated only during the final PWM period prior to a reload opportunity when the PWM - * is not reloaded every period due to CTRL[LDFQ] being non-zero. - */ -#define PWM_TCTRL_TRGFRQ(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_TRGFRQ_SHIFT)) & PWM_TCTRL_TRGFRQ_MASK) - -#define PWM_TCTRL_PWBOT1_MASK (0x4000U) -#define PWM_TCTRL_PWBOT1_SHIFT (14U) -/*! PWBOT1 - Output Trigger 1 Source Select - * 0b0..Route the PWM_OUT_TRIG1 signal to PWM_OUT_TRIG1 port. - * 0b1..Route the PWMB output to the PWM_OUT_TRIG1 port. - */ -#define PWM_TCTRL_PWBOT1(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_PWBOT1_SHIFT)) & PWM_TCTRL_PWBOT1_MASK) - -#define PWM_TCTRL_PWAOT0_MASK (0x8000U) -#define PWM_TCTRL_PWAOT0_SHIFT (15U) -/*! PWAOT0 - Output Trigger 0 Source Select - * 0b0..Route the PWM_OUT_TRIG0 signal to PWM_OUT_TRIG0 port. - * 0b1..Route the PWMA output to the PWM_OUT_TRIG0 port. - */ -#define PWM_TCTRL_PWAOT0(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_PWAOT0_SHIFT)) & PWM_TCTRL_PWAOT0_MASK) -/*! @} */ - -/* The count of PWM_TCTRL */ -#define PWM_TCTRL_COUNT (4U) - -/*! @name DISMAP - Fault Disable Mapping Register 0..Fault Disable Mapping Register 1 */ -/*! @{ */ - -#define PWM_DISMAP_DIS0A_MASK (0xFU) -#define PWM_DISMAP_DIS0A_SHIFT (0U) -/*! DIS0A - PWM_A Fault Disable Mask 0 - */ -#define PWM_DISMAP_DIS0A(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0A_SHIFT)) & PWM_DISMAP_DIS0A_MASK) - -#define PWM_DISMAP_DIS1A_MASK (0xFU) -#define PWM_DISMAP_DIS1A_SHIFT (0U) -/*! DIS1A - PWM_A Fault Disable Mask 1 - */ -#define PWM_DISMAP_DIS1A(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS1A_SHIFT)) & PWM_DISMAP_DIS1A_MASK) - -#define PWM_DISMAP_DIS0B_MASK (0xF0U) -#define PWM_DISMAP_DIS0B_SHIFT (4U) -/*! DIS0B - PWM_B Fault Disable Mask 0 - */ -#define PWM_DISMAP_DIS0B(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0B_SHIFT)) & PWM_DISMAP_DIS0B_MASK) - -#define PWM_DISMAP_DIS1B_MASK (0xF0U) -#define PWM_DISMAP_DIS1B_SHIFT (4U) -/*! DIS1B - PWM_B Fault Disable Mask 1 - */ -#define PWM_DISMAP_DIS1B(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS1B_SHIFT)) & PWM_DISMAP_DIS1B_MASK) - -#define PWM_DISMAP_DIS0X_MASK (0xF00U) -#define PWM_DISMAP_DIS0X_SHIFT (8U) -/*! DIS0X - PWM_X Fault Disable Mask 0 - */ -#define PWM_DISMAP_DIS0X(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0X_SHIFT)) & PWM_DISMAP_DIS0X_MASK) - -#define PWM_DISMAP_DIS1X_MASK (0xF00U) -#define PWM_DISMAP_DIS1X_SHIFT (8U) -/*! DIS1X - PWM_X Fault Disable Mask 1 - */ -#define PWM_DISMAP_DIS1X(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS1X_SHIFT)) & PWM_DISMAP_DIS1X_MASK) -/*! @} */ - -/* The count of PWM_DISMAP */ -#define PWM_DISMAP_COUNT (4U) - -/* The count of PWM_DISMAP */ -#define PWM_DISMAP_COUNT2 (2U) - -/*! @name DTCNT0 - Deadtime Count Register 0 */ -/*! @{ */ - -#define PWM_DTCNT0_DTCNT0_MASK (0xFFFFU) -#define PWM_DTCNT0_DTCNT0_SHIFT (0U) -/*! DTCNT0 - DTCNT0 - */ -#define PWM_DTCNT0_DTCNT0(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTCNT0_DTCNT0_SHIFT)) & PWM_DTCNT0_DTCNT0_MASK) -/*! @} */ - -/* The count of PWM_DTCNT0 */ -#define PWM_DTCNT0_COUNT (4U) - -/*! @name DTCNT1 - Deadtime Count Register 1 */ -/*! @{ */ - -#define PWM_DTCNT1_DTCNT1_MASK (0xFFFFU) -#define PWM_DTCNT1_DTCNT1_SHIFT (0U) -/*! DTCNT1 - DTCNT1 - */ -#define PWM_DTCNT1_DTCNT1(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTCNT1_DTCNT1_SHIFT)) & PWM_DTCNT1_DTCNT1_MASK) -/*! @} */ - -/* The count of PWM_DTCNT1 */ -#define PWM_DTCNT1_COUNT (4U) - -/*! @name CAPTCTRLA - Capture Control A Register */ -/*! @{ */ - -#define PWM_CAPTCTRLA_ARMA_MASK (0x1U) -#define PWM_CAPTCTRLA_ARMA_SHIFT (0U) -/*! ARMA - Arm A - * 0b0..Input capture operation is disabled. - * 0b1..Input capture operation as specified by CAPTCTRLA[EDGAx] is enabled. - */ -#define PWM_CAPTCTRLA_ARMA(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_ARMA_SHIFT)) & PWM_CAPTCTRLA_ARMA_MASK) - -#define PWM_CAPTCTRLA_ONESHOTA_MASK (0x2U) -#define PWM_CAPTCTRLA_ONESHOTA_SHIFT (1U) -/*! ONESHOTA - One Shot Mode A - * 0b0..Free running mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed - * first after CAPTCTRLA[ARMA] is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 - * is armed. After capture circuit 1 performs a capture, it is disarmed and capture circuit 0 is re-armed. - * The process continues indefinitely.If only one of the capture circuits is enabled, then captures continue - * indefinitely on the enabled capture circuit. - * 0b1..One shot mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed first - * after CAPTCTRLA[ARMA] is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 is - * armed. After capture circuit 1 performs a capture, it is disarmed and CAPTCTRLA[ARMA] is cleared. No - * further captures will be performed until CAPTCTRLA[ARMA] is set again.If only one of the capture circuits is - * enabled, then a single capture will occur on the enabled capture circuit and CAPTCTRLA[ARMA] is then cleared. - */ -#define PWM_CAPTCTRLA_ONESHOTA(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_ONESHOTA_SHIFT)) & PWM_CAPTCTRLA_ONESHOTA_MASK) - -#define PWM_CAPTCTRLA_EDGA0_MASK (0xCU) -#define PWM_CAPTCTRLA_EDGA0_SHIFT (2U) -/*! EDGA0 - Edge A 0 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLA_EDGA0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_EDGA0_SHIFT)) & PWM_CAPTCTRLA_EDGA0_MASK) - -#define PWM_CAPTCTRLA_EDGA1_MASK (0x30U) -#define PWM_CAPTCTRLA_EDGA1_SHIFT (4U) -/*! EDGA1 - Edge A 1 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLA_EDGA1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_EDGA1_SHIFT)) & PWM_CAPTCTRLA_EDGA1_MASK) - -#define PWM_CAPTCTRLA_INP_SELA_MASK (0x40U) -#define PWM_CAPTCTRLA_INP_SELA_SHIFT (6U) -/*! INP_SELA - Input Select A - * 0b0..Raw PWM_A input signal selected as source. - * 0b1..Output of edge counter/compare selected as source. Note that when this bitfield is set to 1, the internal - * edge counter is enabled and the rising and/or falling edges specified by the CAPTCTRLA[EDGA0] and - * CAPTCTRLA[EDGA1] fields are ignored. The software must still place a value other than 00 in either or both of the - * CAPTCTLRA[EDGA0] and/or CAPTCTRLA[EDGA1] fields in order to enable one or both of the capture registers. - */ -#define PWM_CAPTCTRLA_INP_SELA(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_INP_SELA_SHIFT)) & PWM_CAPTCTRLA_INP_SELA_MASK) - -#define PWM_CAPTCTRLA_EDGCNTA_EN_MASK (0x80U) -#define PWM_CAPTCTRLA_EDGCNTA_EN_SHIFT (7U) -/*! EDGCNTA_EN - Edge Counter A Enable - * 0b0..Edge counter disabled and held in reset - * 0b1..Edge counter enabled - */ -#define PWM_CAPTCTRLA_EDGCNTA_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_EDGCNTA_EN_SHIFT)) & PWM_CAPTCTRLA_EDGCNTA_EN_MASK) - -#define PWM_CAPTCTRLA_CFAWM_MASK (0x300U) -#define PWM_CAPTCTRLA_CFAWM_SHIFT (8U) -/*! CFAWM - Capture A FIFOs Water Mark - */ -#define PWM_CAPTCTRLA_CFAWM(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_CFAWM_SHIFT)) & PWM_CAPTCTRLA_CFAWM_MASK) - -#define PWM_CAPTCTRLA_CA0CNT_MASK (0x1C00U) -#define PWM_CAPTCTRLA_CA0CNT_SHIFT (10U) -/*! CA0CNT - Capture A0 FIFO Word Count - */ -#define PWM_CAPTCTRLA_CA0CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_CA0CNT_SHIFT)) & PWM_CAPTCTRLA_CA0CNT_MASK) - -#define PWM_CAPTCTRLA_CA1CNT_MASK (0xE000U) -#define PWM_CAPTCTRLA_CA1CNT_SHIFT (13U) -/*! CA1CNT - Capture A1 FIFO Word Count - */ -#define PWM_CAPTCTRLA_CA1CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLA_CA1CNT_SHIFT)) & PWM_CAPTCTRLA_CA1CNT_MASK) -/*! @} */ - -/* The count of PWM_CAPTCTRLA */ -#define PWM_CAPTCTRLA_COUNT (4U) - -/*! @name CAPTCOMPA - Capture Compare A Register */ -/*! @{ */ - -#define PWM_CAPTCOMPA_EDGCMPA_MASK (0xFFU) -#define PWM_CAPTCOMPA_EDGCMPA_SHIFT (0U) -/*! EDGCMPA - Edge Compare A - */ -#define PWM_CAPTCOMPA_EDGCMPA(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPA_EDGCMPA_SHIFT)) & PWM_CAPTCOMPA_EDGCMPA_MASK) - -#define PWM_CAPTCOMPA_EDGCNTA_MASK (0xFF00U) -#define PWM_CAPTCOMPA_EDGCNTA_SHIFT (8U) -/*! EDGCNTA - Edge Counter A - */ -#define PWM_CAPTCOMPA_EDGCNTA(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPA_EDGCNTA_SHIFT)) & PWM_CAPTCOMPA_EDGCNTA_MASK) -/*! @} */ - -/* The count of PWM_CAPTCOMPA */ -#define PWM_CAPTCOMPA_COUNT (4U) - -/*! @name CAPTCTRLB - Capture Control B Register */ -/*! @{ */ - -#define PWM_CAPTCTRLB_ARMB_MASK (0x1U) -#define PWM_CAPTCTRLB_ARMB_SHIFT (0U) -/*! ARMB - Arm B - * 0b0..Input capture operation is disabled. - * 0b1..Input capture operation as specified by CAPTCTRLB[EDGBx] is enabled. - */ -#define PWM_CAPTCTRLB_ARMB(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_ARMB_SHIFT)) & PWM_CAPTCTRLB_ARMB_MASK) - -#define PWM_CAPTCTRLB_ONESHOTB_MASK (0x2U) -#define PWM_CAPTCTRLB_ONESHOTB_SHIFT (1U) -/*! ONESHOTB - One Shot Mode B - * 0b0..Free running mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed - * first after CAPTCTRLB[ARMB] is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 - * is armed. After capture circuit 1 performs a capture, it is disarmed and capture circuit 0 is re-armed. - * The process continues indefinitely.If only one of the capture circuits is enabled, then captures continue - * indefinitely on the enabled capture circuit. - * 0b1..One shot mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed first - * after CAPTCTRLB[ARMB] is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 is - * armed. After capture circuit 1 performs a capture, it is disarmed and CAPTCTRLB[ARMB] is cleared. No - * further captures will be performed until CAPTCTRLB[ARMB] is set again.If only one of the capture circuits is - * enabled, then a single capture will occur on the enabled capture circuit and CAPTCTRLB[ARMB] is then cleared. - */ -#define PWM_CAPTCTRLB_ONESHOTB(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_ONESHOTB_SHIFT)) & PWM_CAPTCTRLB_ONESHOTB_MASK) - -#define PWM_CAPTCTRLB_EDGB0_MASK (0xCU) -#define PWM_CAPTCTRLB_EDGB0_SHIFT (2U) -/*! EDGB0 - Edge B 0 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLB_EDGB0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_EDGB0_SHIFT)) & PWM_CAPTCTRLB_EDGB0_MASK) - -#define PWM_CAPTCTRLB_EDGB1_MASK (0x30U) -#define PWM_CAPTCTRLB_EDGB1_SHIFT (4U) -/*! EDGB1 - Edge B 1 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLB_EDGB1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_EDGB1_SHIFT)) & PWM_CAPTCTRLB_EDGB1_MASK) - -#define PWM_CAPTCTRLB_INP_SELB_MASK (0x40U) -#define PWM_CAPTCTRLB_INP_SELB_SHIFT (6U) -/*! INP_SELB - Input Select B - * 0b0..Raw PWM_B input signal selected as source. - * 0b1..Output of edge counter/compare selected as source. Note that when this bitfield is set to 1, the internal - * edge counter is enabled and the rising and/or falling edges specified by the CAPTCTRLB[EDGB0] and - * CAPTCTRLB[EDGB1] fields are ignored. The software must still place a value other than 00 in either or both of the - * CAPTCTLRB[EDGB0] and/or CAPTCTRLB[EDGB1] fields in order to enable one or both of the capture registers. - */ -#define PWM_CAPTCTRLB_INP_SELB(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_INP_SELB_SHIFT)) & PWM_CAPTCTRLB_INP_SELB_MASK) - -#define PWM_CAPTCTRLB_EDGCNTB_EN_MASK (0x80U) -#define PWM_CAPTCTRLB_EDGCNTB_EN_SHIFT (7U) -/*! EDGCNTB_EN - Edge Counter B Enable - * 0b0..Edge counter disabled and held in reset - * 0b1..Edge counter enabled - */ -#define PWM_CAPTCTRLB_EDGCNTB_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_EDGCNTB_EN_SHIFT)) & PWM_CAPTCTRLB_EDGCNTB_EN_MASK) - -#define PWM_CAPTCTRLB_CFBWM_MASK (0x300U) -#define PWM_CAPTCTRLB_CFBWM_SHIFT (8U) -/*! CFBWM - Capture B FIFOs Water Mark - */ -#define PWM_CAPTCTRLB_CFBWM(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_CFBWM_SHIFT)) & PWM_CAPTCTRLB_CFBWM_MASK) - -#define PWM_CAPTCTRLB_CB0CNT_MASK (0x1C00U) -#define PWM_CAPTCTRLB_CB0CNT_SHIFT (10U) -/*! CB0CNT - Capture B0 FIFO Word Count - */ -#define PWM_CAPTCTRLB_CB0CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_CB0CNT_SHIFT)) & PWM_CAPTCTRLB_CB0CNT_MASK) - -#define PWM_CAPTCTRLB_CB1CNT_MASK (0xE000U) -#define PWM_CAPTCTRLB_CB1CNT_SHIFT (13U) -/*! CB1CNT - Capture B1 FIFO Word Count - */ -#define PWM_CAPTCTRLB_CB1CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLB_CB1CNT_SHIFT)) & PWM_CAPTCTRLB_CB1CNT_MASK) -/*! @} */ - -/* The count of PWM_CAPTCTRLB */ -#define PWM_CAPTCTRLB_COUNT (4U) - -/*! @name CAPTCOMPB - Capture Compare B Register */ -/*! @{ */ - -#define PWM_CAPTCOMPB_EDGCMPB_MASK (0xFFU) -#define PWM_CAPTCOMPB_EDGCMPB_SHIFT (0U) -/*! EDGCMPB - Edge Compare B - */ -#define PWM_CAPTCOMPB_EDGCMPB(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPB_EDGCMPB_SHIFT)) & PWM_CAPTCOMPB_EDGCMPB_MASK) - -#define PWM_CAPTCOMPB_EDGCNTB_MASK (0xFF00U) -#define PWM_CAPTCOMPB_EDGCNTB_SHIFT (8U) -/*! EDGCNTB - Edge Counter B - */ -#define PWM_CAPTCOMPB_EDGCNTB(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPB_EDGCNTB_SHIFT)) & PWM_CAPTCOMPB_EDGCNTB_MASK) -/*! @} */ - -/* The count of PWM_CAPTCOMPB */ -#define PWM_CAPTCOMPB_COUNT (4U) - -/*! @name CAPTCTRLX - Capture Control X Register */ -/*! @{ */ - -#define PWM_CAPTCTRLX_ARMX_MASK (0x1U) -#define PWM_CAPTCTRLX_ARMX_SHIFT (0U) -/*! ARMX - Arm X - * 0b0..Input capture operation is disabled. - * 0b1..Input capture operation as specified by CAPTCTRLX[EDGXx] is enabled. - */ -#define PWM_CAPTCTRLX_ARMX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_ARMX_SHIFT)) & PWM_CAPTCTRLX_ARMX_MASK) - -#define PWM_CAPTCTRLX_ONESHOTX_MASK (0x2U) -#define PWM_CAPTCTRLX_ONESHOTX_SHIFT (1U) -/*! ONESHOTX - One Shot Mode Aux - * 0b0..Free running mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed - * first after the ARMX bit is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 is - * armed. After capture circuit 1 performs a capture, it is disarmed and capture circuit 0 is re-armed. The - * process continues indefinitely.If only one of the capture circuits is enabled, then captures continue - * indefinitely on the enabled capture circuit. - * 0b1..One shot mode is selected. If both capture circuits are enabled, then capture circuit 0 is armed first - * after the ARMX bit is set. Once a capture occurs, capture circuit 0 is disarmed and capture circuit 1 is - * armed. After capture circuit 1 performs a capture, it is disarmed and the ARMX bit is cleared. No further - * captures will be performed until the ARMX bit is set again.If only one of the capture circuits is enabled, - * then a single capture will occur on the enabled capture circuit and the ARMX bit is then cleared. - */ -#define PWM_CAPTCTRLX_ONESHOTX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_ONESHOTX_SHIFT)) & PWM_CAPTCTRLX_ONESHOTX_MASK) - -#define PWM_CAPTCTRLX_EDGX0_MASK (0xCU) -#define PWM_CAPTCTRLX_EDGX0_SHIFT (2U) -/*! EDGX0 - Edge X 0 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLX_EDGX0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGX0_SHIFT)) & PWM_CAPTCTRLX_EDGX0_MASK) - -#define PWM_CAPTCTRLX_EDGX1_MASK (0x30U) -#define PWM_CAPTCTRLX_EDGX1_SHIFT (4U) -/*! EDGX1 - Edge X 1 - * 0b00..Disabled - * 0b01..Capture falling edges - * 0b10..Capture rising edges - * 0b11..Capture any edge - */ -#define PWM_CAPTCTRLX_EDGX1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGX1_SHIFT)) & PWM_CAPTCTRLX_EDGX1_MASK) - -#define PWM_CAPTCTRLX_INP_SELX_MASK (0x40U) -#define PWM_CAPTCTRLX_INP_SELX_SHIFT (6U) -/*! INP_SELX - Input Select X - * 0b0..Raw PWM_X input signal selected as source. - * 0b1..Output of edge counter/compare selected as source. Note that when this bitfield is set to 1, the internal - * edge counter is enabled and the rising and/or falling edges specified by the CAPTCTRLX[EDGX0] and - * CAPTCTRLX[EDGX1] fields are ignored. The software must still place a value other than 00 in either or both of the - * CAPTCTLRX[EDGX0] and/or CAPTCTRLX[EDGX1] fields in order to enable one or both of the capture registers. - */ -#define PWM_CAPTCTRLX_INP_SELX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_INP_SELX_SHIFT)) & PWM_CAPTCTRLX_INP_SELX_MASK) - -#define PWM_CAPTCTRLX_EDGCNTX_EN_MASK (0x80U) -#define PWM_CAPTCTRLX_EDGCNTX_EN_SHIFT (7U) -/*! EDGCNTX_EN - Edge Counter X Enable - * 0b0..Edge counter disabled and held in reset - * 0b1..Edge counter enabled - */ -#define PWM_CAPTCTRLX_EDGCNTX_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGCNTX_EN_SHIFT)) & PWM_CAPTCTRLX_EDGCNTX_EN_MASK) - -#define PWM_CAPTCTRLX_CFXWM_MASK (0x300U) -#define PWM_CAPTCTRLX_CFXWM_SHIFT (8U) -/*! CFXWM - Capture X FIFOs Water Mark - */ -#define PWM_CAPTCTRLX_CFXWM(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CFXWM_SHIFT)) & PWM_CAPTCTRLX_CFXWM_MASK) - -#define PWM_CAPTCTRLX_CX0CNT_MASK (0x1C00U) -#define PWM_CAPTCTRLX_CX0CNT_SHIFT (10U) -/*! CX0CNT - Capture X0 FIFO Word Count - */ -#define PWM_CAPTCTRLX_CX0CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CX0CNT_SHIFT)) & PWM_CAPTCTRLX_CX0CNT_MASK) - -#define PWM_CAPTCTRLX_CX1CNT_MASK (0xE000U) -#define PWM_CAPTCTRLX_CX1CNT_SHIFT (13U) -/*! CX1CNT - Capture X1 FIFO Word Count - */ -#define PWM_CAPTCTRLX_CX1CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CX1CNT_SHIFT)) & PWM_CAPTCTRLX_CX1CNT_MASK) -/*! @} */ - -/* The count of PWM_CAPTCTRLX */ -#define PWM_CAPTCTRLX_COUNT (4U) - -/*! @name CAPTCOMPX - Capture Compare X Register */ -/*! @{ */ - -#define PWM_CAPTCOMPX_EDGCMPX_MASK (0xFFU) -#define PWM_CAPTCOMPX_EDGCMPX_SHIFT (0U) -/*! EDGCMPX - Edge Compare X - */ -#define PWM_CAPTCOMPX_EDGCMPX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPX_EDGCMPX_SHIFT)) & PWM_CAPTCOMPX_EDGCMPX_MASK) - -#define PWM_CAPTCOMPX_EDGCNTX_MASK (0xFF00U) -#define PWM_CAPTCOMPX_EDGCNTX_SHIFT (8U) -/*! EDGCNTX - Edge Counter X - */ -#define PWM_CAPTCOMPX_EDGCNTX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPX_EDGCNTX_SHIFT)) & PWM_CAPTCOMPX_EDGCNTX_MASK) -/*! @} */ - -/* The count of PWM_CAPTCOMPX */ -#define PWM_CAPTCOMPX_COUNT (4U) - -/*! @name CVAL0 - Capture Value 0 Register */ -/*! @{ */ - -#define PWM_CVAL0_CAPTVAL0_MASK (0xFFFFU) -#define PWM_CVAL0_CAPTVAL0_SHIFT (0U) -/*! CAPTVAL0 - CAPTVAL0 - */ -#define PWM_CVAL0_CAPTVAL0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL0_CAPTVAL0_SHIFT)) & PWM_CVAL0_CAPTVAL0_MASK) -/*! @} */ - -/* The count of PWM_CVAL0 */ -#define PWM_CVAL0_COUNT (4U) - -/*! @name CVAL0CYC - Capture Value 0 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL0CYC_CVAL0CYC_MASK (0xFU) -#define PWM_CVAL0CYC_CVAL0CYC_SHIFT (0U) -/*! CVAL0CYC - CVAL0CYC - */ -#define PWM_CVAL0CYC_CVAL0CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL0CYC_CVAL0CYC_SHIFT)) & PWM_CVAL0CYC_CVAL0CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL0CYC */ -#define PWM_CVAL0CYC_COUNT (4U) - -/*! @name CVAL1 - Capture Value 1 Register */ -/*! @{ */ - -#define PWM_CVAL1_CAPTVAL1_MASK (0xFFFFU) -#define PWM_CVAL1_CAPTVAL1_SHIFT (0U) -/*! CAPTVAL1 - CAPTVAL1 - */ -#define PWM_CVAL1_CAPTVAL1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL1_CAPTVAL1_SHIFT)) & PWM_CVAL1_CAPTVAL1_MASK) -/*! @} */ - -/* The count of PWM_CVAL1 */ -#define PWM_CVAL1_COUNT (4U) - -/*! @name CVAL1CYC - Capture Value 1 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL1CYC_CVAL1CYC_MASK (0xFU) -#define PWM_CVAL1CYC_CVAL1CYC_SHIFT (0U) -/*! CVAL1CYC - CVAL1CYC - */ -#define PWM_CVAL1CYC_CVAL1CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL1CYC_CVAL1CYC_SHIFT)) & PWM_CVAL1CYC_CVAL1CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL1CYC */ -#define PWM_CVAL1CYC_COUNT (4U) - -/*! @name CVAL2 - Capture Value 2 Register */ -/*! @{ */ - -#define PWM_CVAL2_CAPTVAL2_MASK (0xFFFFU) -#define PWM_CVAL2_CAPTVAL2_SHIFT (0U) -/*! CAPTVAL2 - CAPTVAL2 - */ -#define PWM_CVAL2_CAPTVAL2(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL2_CAPTVAL2_SHIFT)) & PWM_CVAL2_CAPTVAL2_MASK) -/*! @} */ - -/* The count of PWM_CVAL2 */ -#define PWM_CVAL2_COUNT (4U) - -/*! @name CVAL2CYC - Capture Value 2 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL2CYC_CVAL2CYC_MASK (0xFU) -#define PWM_CVAL2CYC_CVAL2CYC_SHIFT (0U) -/*! CVAL2CYC - CVAL2CYC - */ -#define PWM_CVAL2CYC_CVAL2CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL2CYC_CVAL2CYC_SHIFT)) & PWM_CVAL2CYC_CVAL2CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL2CYC */ -#define PWM_CVAL2CYC_COUNT (4U) - -/*! @name CVAL3 - Capture Value 3 Register */ -/*! @{ */ - -#define PWM_CVAL3_CAPTVAL3_MASK (0xFFFFU) -#define PWM_CVAL3_CAPTVAL3_SHIFT (0U) -/*! CAPTVAL3 - CAPTVAL3 - */ -#define PWM_CVAL3_CAPTVAL3(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL3_CAPTVAL3_SHIFT)) & PWM_CVAL3_CAPTVAL3_MASK) -/*! @} */ - -/* The count of PWM_CVAL3 */ -#define PWM_CVAL3_COUNT (4U) - -/*! @name CVAL3CYC - Capture Value 3 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL3CYC_CVAL3CYC_MASK (0xFU) -#define PWM_CVAL3CYC_CVAL3CYC_SHIFT (0U) -/*! CVAL3CYC - CVAL3CYC - */ -#define PWM_CVAL3CYC_CVAL3CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL3CYC_CVAL3CYC_SHIFT)) & PWM_CVAL3CYC_CVAL3CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL3CYC */ -#define PWM_CVAL3CYC_COUNT (4U) - -/*! @name CVAL4 - Capture Value 4 Register */ -/*! @{ */ - -#define PWM_CVAL4_CAPTVAL4_MASK (0xFFFFU) -#define PWM_CVAL4_CAPTVAL4_SHIFT (0U) -/*! CAPTVAL4 - CAPTVAL4 - */ -#define PWM_CVAL4_CAPTVAL4(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL4_CAPTVAL4_SHIFT)) & PWM_CVAL4_CAPTVAL4_MASK) -/*! @} */ - -/* The count of PWM_CVAL4 */ -#define PWM_CVAL4_COUNT (4U) - -/*! @name CVAL4CYC - Capture Value 4 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL4CYC_CVAL4CYC_MASK (0xFU) -#define PWM_CVAL4CYC_CVAL4CYC_SHIFT (0U) -/*! CVAL4CYC - CVAL4CYC - */ -#define PWM_CVAL4CYC_CVAL4CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL4CYC_CVAL4CYC_SHIFT)) & PWM_CVAL4CYC_CVAL4CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL4CYC */ -#define PWM_CVAL4CYC_COUNT (4U) - -/*! @name CVAL5 - Capture Value 5 Register */ -/*! @{ */ - -#define PWM_CVAL5_CAPTVAL5_MASK (0xFFFFU) -#define PWM_CVAL5_CAPTVAL5_SHIFT (0U) -/*! CAPTVAL5 - CAPTVAL5 - */ -#define PWM_CVAL5_CAPTVAL5(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL5_CAPTVAL5_SHIFT)) & PWM_CVAL5_CAPTVAL5_MASK) -/*! @} */ - -/* The count of PWM_CVAL5 */ -#define PWM_CVAL5_COUNT (4U) - -/*! @name CVAL5CYC - Capture Value 5 Cycle Register */ -/*! @{ */ - -#define PWM_CVAL5CYC_CVAL5CYC_MASK (0xFU) -#define PWM_CVAL5CYC_CVAL5CYC_SHIFT (0U) -/*! CVAL5CYC - CVAL5CYC - */ -#define PWM_CVAL5CYC_CVAL5CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL5CYC_CVAL5CYC_SHIFT)) & PWM_CVAL5CYC_CVAL5CYC_MASK) -/*! @} */ - -/* The count of PWM_CVAL5CYC */ -#define PWM_CVAL5CYC_COUNT (4U) - -/*! @name OUTEN - Output Enable Register */ -/*! @{ */ - -#define PWM_OUTEN_PWMX_EN_MASK (0xFU) -#define PWM_OUTEN_PWMX_EN_SHIFT (0U) -/*! PWMX_EN - PWM_X Output Enables - * 0b0000..PWM_X output disabled. - * 0b0001..PWM_X output enabled. - */ -#define PWM_OUTEN_PWMX_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMX_EN_SHIFT)) & PWM_OUTEN_PWMX_EN_MASK) - -#define PWM_OUTEN_PWMB_EN_MASK (0xF0U) -#define PWM_OUTEN_PWMB_EN_SHIFT (4U) -/*! PWMB_EN - PWM_B Output Enables - * 0b0000..PWM_B output disabled. - * 0b0001..PWM_B output enabled. - */ -#define PWM_OUTEN_PWMB_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMB_EN_SHIFT)) & PWM_OUTEN_PWMB_EN_MASK) - -#define PWM_OUTEN_PWMA_EN_MASK (0xF00U) -#define PWM_OUTEN_PWMA_EN_SHIFT (8U) -/*! PWMA_EN - PWM_A Output Enables - * 0b0000..PWM_A output disabled. - * 0b0001..PWM_A output enabled. - */ -#define PWM_OUTEN_PWMA_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMA_EN_SHIFT)) & PWM_OUTEN_PWMA_EN_MASK) -/*! @} */ - -/*! @name MASK - Mask Register */ -/*! @{ */ - -#define PWM_MASK_MASKX_MASK (0xFU) -#define PWM_MASK_MASKX_SHIFT (0U) -/*! MASKX - PWM_X Masks - * 0b0000..PWM_X output normal. - * 0b0001..PWM_X output masked. - */ -#define PWM_MASK_MASKX(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKX_SHIFT)) & PWM_MASK_MASKX_MASK) - -#define PWM_MASK_MASKB_MASK (0xF0U) -#define PWM_MASK_MASKB_SHIFT (4U) -/*! MASKB - PWM_B Masks - * 0b0000..PWM_B output normal. - * 0b0001..PWM_B output masked. - */ -#define PWM_MASK_MASKB(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKB_SHIFT)) & PWM_MASK_MASKB_MASK) - -#define PWM_MASK_MASKA_MASK (0xF00U) -#define PWM_MASK_MASKA_SHIFT (8U) -/*! MASKA - PWM_A Masks - * 0b0000..PWM_A output normal. - * 0b0001..PWM_A output masked. - */ -#define PWM_MASK_MASKA(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKA_SHIFT)) & PWM_MASK_MASKA_MASK) - -#define PWM_MASK_UPDATE_MASK_MASK (0xF000U) -#define PWM_MASK_UPDATE_MASK_SHIFT (12U) -/*! UPDATE_MASK - Update Mask Bits Immediately - * 0b0000..Normal operation. MASK* bits within the corresponding submodule are not updated until a FORCE_OUT event occurs within the submodule. - * 0b0001..Immediate operation. MASK* bits within the corresponding submodule are updated on the following clock edge after setting this bit. - */ -#define PWM_MASK_UPDATE_MASK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_UPDATE_MASK_SHIFT)) & PWM_MASK_UPDATE_MASK_MASK) -/*! @} */ - -/*! @name SWCOUT - Software Controlled Output Register */ -/*! @{ */ - -#define PWM_SWCOUT_SM0OUT45_MASK (0x1U) -#define PWM_SWCOUT_SM0OUT45_SHIFT (0U) -/*! SM0OUT45 - Submodule 0 Software Controlled Output 45 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 0 instead of PWM45. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 0 instead of PWM45. - */ -#define PWM_SWCOUT_SM0OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM0OUT45_SHIFT)) & PWM_SWCOUT_SM0OUT45_MASK) - -#define PWM_SWCOUT_SM0OUT23_MASK (0x2U) -#define PWM_SWCOUT_SM0OUT23_SHIFT (1U) -/*! SM0OUT23 - Submodule 0 Software Controlled Output 23 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 0 instead of PWM23. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 0 instead of PWM23. - */ -#define PWM_SWCOUT_SM0OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM0OUT23_SHIFT)) & PWM_SWCOUT_SM0OUT23_MASK) - -#define PWM_SWCOUT_SM1OUT45_MASK (0x4U) -#define PWM_SWCOUT_SM1OUT45_SHIFT (2U) -/*! SM1OUT45 - Submodule 1 Software Controlled Output 45 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 1 instead of PWM45. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 1 instead of PWM45. - */ -#define PWM_SWCOUT_SM1OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM1OUT45_SHIFT)) & PWM_SWCOUT_SM1OUT45_MASK) - -#define PWM_SWCOUT_SM1OUT23_MASK (0x8U) -#define PWM_SWCOUT_SM1OUT23_SHIFT (3U) -/*! SM1OUT23 - Submodule 1 Software Controlled Output 23 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 1 instead of PWM23. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 1 instead of PWM23. - */ -#define PWM_SWCOUT_SM1OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM1OUT23_SHIFT)) & PWM_SWCOUT_SM1OUT23_MASK) - -#define PWM_SWCOUT_SM2OUT45_MASK (0x10U) -#define PWM_SWCOUT_SM2OUT45_SHIFT (4U) -/*! SM2OUT45 - Submodule 2 Software Controlled Output 45 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 2 instead of PWM45. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 2 instead of PWM45. - */ -#define PWM_SWCOUT_SM2OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM2OUT45_SHIFT)) & PWM_SWCOUT_SM2OUT45_MASK) - -#define PWM_SWCOUT_SM2OUT23_MASK (0x20U) -#define PWM_SWCOUT_SM2OUT23_SHIFT (5U) -/*! SM2OUT23 - Submodule 2 Software Controlled Output 23 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 2 instead of PWM23. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 2 instead of PWM23. - */ -#define PWM_SWCOUT_SM2OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM2OUT23_SHIFT)) & PWM_SWCOUT_SM2OUT23_MASK) - -#define PWM_SWCOUT_SM3OUT45_MASK (0x40U) -#define PWM_SWCOUT_SM3OUT45_SHIFT (6U) -/*! SM3OUT45 - Submodule 3 Software Controlled Output 45 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 3 instead of PWM45. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 3 instead of PWM45. - */ -#define PWM_SWCOUT_SM3OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM3OUT45_SHIFT)) & PWM_SWCOUT_SM3OUT45_MASK) - -#define PWM_SWCOUT_SM3OUT23_MASK (0x80U) -#define PWM_SWCOUT_SM3OUT23_SHIFT (7U) -/*! SM3OUT23 - Submodule 3 Software Controlled Output 23 - * 0b0..A logic 0 is supplied to the deadtime generator of submodule 3 instead of PWM23. - * 0b1..A logic 1 is supplied to the deadtime generator of submodule 3 instead of PWM23. - */ -#define PWM_SWCOUT_SM3OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM3OUT23_SHIFT)) & PWM_SWCOUT_SM3OUT23_MASK) -/*! @} */ - -/*! @name DTSRCSEL - PWM Source Select Register */ -/*! @{ */ - -#define PWM_DTSRCSEL_SM0SEL45_MASK (0x3U) -#define PWM_DTSRCSEL_SM0SEL45_SHIFT (0U) -/*! SM0SEL45 - Submodule 0 PWM45 Control Select - * 0b00..Generated SM0PWM45 signal is used by the deadtime logic. - * 0b01..Inverted generated SM0PWM45 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM0OUT45] is used by the deadtime logic. - * 0b11..PWM0_EXTB signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM0SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM0SEL45_SHIFT)) & PWM_DTSRCSEL_SM0SEL45_MASK) - -#define PWM_DTSRCSEL_SM0SEL23_MASK (0xCU) -#define PWM_DTSRCSEL_SM0SEL23_SHIFT (2U) -/*! SM0SEL23 - Submodule 0 PWM23 Control Select - * 0b00..Generated SM0PWM23 signal is used by the deadtime logic. - * 0b01..Inverted generated SM0PWM23 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM0OUT23] is used by the deadtime logic. - * 0b11..PWM0_EXTA signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM0SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM0SEL23_SHIFT)) & PWM_DTSRCSEL_SM0SEL23_MASK) - -#define PWM_DTSRCSEL_SM1SEL45_MASK (0x30U) -#define PWM_DTSRCSEL_SM1SEL45_SHIFT (4U) -/*! SM1SEL45 - Submodule 1 PWM45 Control Select - * 0b00..Generated SM1PWM45 signal is used by the deadtime logic. - * 0b01..Inverted generated SM1PWM45 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM1OUT45] is used by the deadtime logic. - * 0b11..PWM1_EXTB signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM1SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM1SEL45_SHIFT)) & PWM_DTSRCSEL_SM1SEL45_MASK) - -#define PWM_DTSRCSEL_SM1SEL23_MASK (0xC0U) -#define PWM_DTSRCSEL_SM1SEL23_SHIFT (6U) -/*! SM1SEL23 - Submodule 1 PWM23 Control Select - * 0b00..Generated SM1PWM23 signal is used by the deadtime logic. - * 0b01..Inverted generated SM1PWM23 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM1OUT23] is used by the deadtime logic. - * 0b11..PWM1_EXTA signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM1SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM1SEL23_SHIFT)) & PWM_DTSRCSEL_SM1SEL23_MASK) - -#define PWM_DTSRCSEL_SM2SEL45_MASK (0x300U) -#define PWM_DTSRCSEL_SM2SEL45_SHIFT (8U) -/*! SM2SEL45 - Submodule 2 PWM45 Control Select - * 0b00..Generated SM2PWM45 signal is used by the deadtime logic. - * 0b01..Inverted generated SM2PWM45 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM2OUT45] is used by the deadtime logic. - * 0b11..PWM2_EXTB signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM2SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM2SEL45_SHIFT)) & PWM_DTSRCSEL_SM2SEL45_MASK) - -#define PWM_DTSRCSEL_SM2SEL23_MASK (0xC00U) -#define PWM_DTSRCSEL_SM2SEL23_SHIFT (10U) -/*! SM2SEL23 - Submodule 2 PWM23 Control Select - * 0b00..Generated SM2PWM23 signal is used by the deadtime logic. - * 0b01..Inverted generated SM2PWM23 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM2OUT23] is used by the deadtime logic. - * 0b11..PWM2_EXTA signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM2SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM2SEL23_SHIFT)) & PWM_DTSRCSEL_SM2SEL23_MASK) - -#define PWM_DTSRCSEL_SM3SEL45_MASK (0x3000U) -#define PWM_DTSRCSEL_SM3SEL45_SHIFT (12U) -/*! SM3SEL45 - Submodule 3 PWM45 Control Select - * 0b00..Generated SM3PWM45 signal is used by the deadtime logic. - * 0b01..Inverted generated SM3PWM45 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM3OUT45] is used by the deadtime logic. - * 0b11..PWM3_EXTB signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM3SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM3SEL45_SHIFT)) & PWM_DTSRCSEL_SM3SEL45_MASK) - -#define PWM_DTSRCSEL_SM3SEL23_MASK (0xC000U) -#define PWM_DTSRCSEL_SM3SEL23_SHIFT (14U) -/*! SM3SEL23 - Submodule 3 PWM23 Control Select - * 0b00..Generated SM3PWM23 signal is used by the deadtime logic. - * 0b01..Inverted generated SM3PWM23 signal is used by the deadtime logic. - * 0b10..SWCOUT[SM3OUT23] is used by the deadtime logic. - * 0b11..PWM3_EXTA signal is used by the deadtime logic. - */ -#define PWM_DTSRCSEL_SM3SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM3SEL23_SHIFT)) & PWM_DTSRCSEL_SM3SEL23_MASK) -/*! @} */ - -/*! @name MCTRL - Master Control Register */ -/*! @{ */ - -#define PWM_MCTRL_LDOK_MASK (0xFU) -#define PWM_MCTRL_LDOK_SHIFT (0U) -/*! LDOK - Load Okay - * 0b0000..Do not load new values. - * 0b0001..Load prescaler, modulus, and PWM values of the corresponding submodule. - */ -#define PWM_MCTRL_LDOK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_LDOK_SHIFT)) & PWM_MCTRL_LDOK_MASK) - -#define PWM_MCTRL_CLDOK_MASK (0xF0U) -#define PWM_MCTRL_CLDOK_SHIFT (4U) -/*! CLDOK - Clear Load Okay - */ -#define PWM_MCTRL_CLDOK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_CLDOK_SHIFT)) & PWM_MCTRL_CLDOK_MASK) - -#define PWM_MCTRL_RUN_MASK (0xF00U) -#define PWM_MCTRL_RUN_SHIFT (8U) -/*! RUN - Run - * 0b0000..PWM generator is disabled in the corresponding submodule. - * 0b0001..PWM generator is enabled in the corresponding submodule. - */ -#define PWM_MCTRL_RUN(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_RUN_SHIFT)) & PWM_MCTRL_RUN_MASK) - -#define PWM_MCTRL_IPOL_MASK (0xF000U) -#define PWM_MCTRL_IPOL_SHIFT (12U) -/*! IPOL - Current Polarity - * 0b0000..PWM23 is used to generate complementary PWM pair in the corresponding submodule. - * 0b0001..PWM45 is used to generate complementary PWM pair in the corresponding submodule. - */ -#define PWM_MCTRL_IPOL(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_IPOL_SHIFT)) & PWM_MCTRL_IPOL_MASK) -/*! @} */ - -/*! @name MCTRL2 - Master Control 2 Register */ -/*! @{ */ - -#define PWM_MCTRL2_MONPLL_MASK (0x3U) -#define PWM_MCTRL2_MONPLL_SHIFT (0U) -/*! MONPLL - Monitor PLL State - * 0b00..Not locked. Do not monitor PLL operation. Resetting of the fractional delay block in case of PLL losing lock will be controlled by software. - * 0b01..Not locked. Monitor PLL operation to automatically disable the fractional delay block when the PLL encounters problems. - * 0b10..Locked. Do not monitor PLL operation. Resetting of the fractional delay block in case of PLL losing lock - * will be controlled by software. These bits are write protected until the next reset. - * 0b11..Locked. Monitor PLL operation to automatically disable the fractional delay block when the PLL - * encounters problems. These bits are write protected until the next reset. - */ -#define PWM_MCTRL2_MONPLL(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL2_MONPLL_SHIFT)) & PWM_MCTRL2_MONPLL_MASK) -/*! @} */ - -/*! @name FCTRL - Fault Control Register */ -/*! @{ */ - -#define PWM_FCTRL_FIE_MASK (0xFU) -#define PWM_FCTRL_FIE_SHIFT (0U) -/*! FIE - Fault Interrupt Enables - * 0b0000..FAULTx CPU interrupt requests disabled. - * 0b0001..FAULTx CPU interrupt requests enabled. - */ -#define PWM_FCTRL_FIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FIE_SHIFT)) & PWM_FCTRL_FIE_MASK) - -#define PWM_FCTRL_FSAFE_MASK (0xF0U) -#define PWM_FCTRL_FSAFE_SHIFT (4U) -/*! FSAFE - Fault Safety Mode - * 0b0000..Normal mode. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear at the - * start of a half cycle or full cycle depending on the state of FSTS[FFULL] without regard to the state of - * FSTS[FFPINx]. The PWM outputs disabled by this fault input will not be re-enabled until the actual - * FAULTx input signal de-asserts since the fault input will combinationally disable the PWM outputs (as - * programmed in DISMAPn). - * 0b0001..Safe mode. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear and - * FSTS[FFPINx] is clear at the start of a half cycle or full cycle depending on the state of FSTS[FFULL]. - */ -#define PWM_FCTRL_FSAFE(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FSAFE_SHIFT)) & PWM_FCTRL_FSAFE_MASK) - -#define PWM_FCTRL_FAUTO_MASK (0xF00U) -#define PWM_FCTRL_FAUTO_SHIFT (8U) -/*! FAUTO - Automatic Fault Clearing - * 0b0000..Manual fault clearing. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear - * at the start of a half cycle or full cycle depending the state of FSTS[FFULL]. This is further - * controlled by FCTRL[FSAFE]. - * 0b0001..Automatic fault clearing. PWM outputs disabled by this fault are enabled when FSTS[FFPINx] is clear at - * the start of a half cycle or full cycle depending on the state of FSTS[FFULL] without regard to the - * state of FSTS[FFLAGx]. - */ -#define PWM_FCTRL_FAUTO(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FAUTO_SHIFT)) & PWM_FCTRL_FAUTO_MASK) - -#define PWM_FCTRL_FLVL_MASK (0xF000U) -#define PWM_FCTRL_FLVL_SHIFT (12U) -/*! FLVL - Fault Level - * 0b0000..A logic 0 on the fault input indicates a fault condition. - * 0b0001..A logic 1 on the fault input indicates a fault condition. - */ -#define PWM_FCTRL_FLVL(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FLVL_SHIFT)) & PWM_FCTRL_FLVL_MASK) -/*! @} */ - -/*! @name FSTS - Fault Status Register */ -/*! @{ */ - -#define PWM_FSTS_FFLAG_MASK (0xFU) -#define PWM_FSTS_FFLAG_SHIFT (0U) -/*! FFLAG - Fault Flags - * 0b0000..No fault on the FAULTx pin. - * 0b0001..Fault on the FAULTx pin. - */ -#define PWM_FSTS_FFLAG(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFLAG_SHIFT)) & PWM_FSTS_FFLAG_MASK) - -#define PWM_FSTS_FFULL_MASK (0xF0U) -#define PWM_FSTS_FFULL_SHIFT (4U) -/*! FFULL - Full Cycle - * 0b0000..PWM outputs are not re-enabled at the start of a full cycle - * 0b0001..PWM outputs are re-enabled at the start of a full cycle - */ -#define PWM_FSTS_FFULL(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFULL_SHIFT)) & PWM_FSTS_FFULL_MASK) - -#define PWM_FSTS_FFPIN_MASK (0xF00U) -#define PWM_FSTS_FFPIN_SHIFT (8U) -/*! FFPIN - Filtered Fault Pins - */ -#define PWM_FSTS_FFPIN(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFPIN_SHIFT)) & PWM_FSTS_FFPIN_MASK) - -#define PWM_FSTS_FHALF_MASK (0xF000U) -#define PWM_FSTS_FHALF_SHIFT (12U) -/*! FHALF - Half Cycle Fault Recovery - * 0b0000..PWM outputs are not re-enabled at the start of a half cycle. - * 0b0001..PWM outputs are re-enabled at the start of a half cycle (as defined by VAL0). - */ -#define PWM_FSTS_FHALF(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FHALF_SHIFT)) & PWM_FSTS_FHALF_MASK) -/*! @} */ - -/*! @name FFILT - Fault Filter Register */ -/*! @{ */ - -#define PWM_FFILT_FILT_PER_MASK (0xFFU) -#define PWM_FFILT_FILT_PER_SHIFT (0U) -/*! FILT_PER - Fault Filter Period - */ -#define PWM_FFILT_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_FILT_PER_SHIFT)) & PWM_FFILT_FILT_PER_MASK) - -#define PWM_FFILT_FILT_CNT_MASK (0x700U) -#define PWM_FFILT_FILT_CNT_SHIFT (8U) -/*! FILT_CNT - Fault Filter Count - */ -#define PWM_FFILT_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_FILT_CNT_SHIFT)) & PWM_FFILT_FILT_CNT_MASK) - -#define PWM_FFILT_GSTR_MASK (0x8000U) -#define PWM_FFILT_GSTR_SHIFT (15U) -/*! GSTR - Fault Glitch Stretch Enable - * 0b0..Fault input glitch stretching is disabled. - * 0b1..Input fault signals will be stretched to at least 2 IPBus clock cycles. - */ -#define PWM_FFILT_GSTR(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_GSTR_SHIFT)) & PWM_FFILT_GSTR_MASK) -/*! @} */ - -/*! @name FTST - Fault Test Register */ -/*! @{ */ - -#define PWM_FTST_FTEST_MASK (0x1U) -#define PWM_FTST_FTEST_SHIFT (0U) -/*! FTEST - Fault Test - * 0b0..No fault - * 0b1..Cause a simulated fault - */ -#define PWM_FTST_FTEST(x) (((uint16_t)(((uint16_t)(x)) << PWM_FTST_FTEST_SHIFT)) & PWM_FTST_FTEST_MASK) -/*! @} */ - -/*! @name FCTRL2 - Fault Control 2 Register */ -/*! @{ */ - -#define PWM_FCTRL2_NOCOMB_MASK (0xFU) -#define PWM_FCTRL2_NOCOMB_SHIFT (0U) -/*! NOCOMB - No Combinational Path From Fault Input To PWM Output - * 0b0000..There is a combinational link from the fault inputs to the PWM outputs. The fault inputs are combined - * with the filtered and latched fault signals to disable the PWM outputs. - * 0b0001..The direct combinational path from the fault inputs to the PWM outputs is disabled and the filtered - * and latched fault signals are used to disable the PWM outputs. - */ -#define PWM_FCTRL2_NOCOMB(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL2_NOCOMB_SHIFT)) & PWM_FCTRL2_NOCOMB_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group PWM_Register_Masks */ - - -/* PWM - Peripheral instance base addresses */ -/** Peripheral PWM1 base address */ -#define PWM1_BASE (0x403DC000u) -/** Peripheral PWM1 base pointer */ -#define PWM1 ((PWM_Type *)PWM1_BASE) -/** Peripheral PWM2 base address */ -#define PWM2_BASE (0x403E0000u) -/** Peripheral PWM2 base pointer */ -#define PWM2 ((PWM_Type *)PWM2_BASE) -/** Peripheral PWM3 base address */ -#define PWM3_BASE (0x403E4000u) -/** Peripheral PWM3 base pointer */ -#define PWM3 ((PWM_Type *)PWM3_BASE) -/** Peripheral PWM4 base address */ -#define PWM4_BASE (0x403E8000u) -/** Peripheral PWM4 base pointer */ -#define PWM4 ((PWM_Type *)PWM4_BASE) -/** Array initializer of PWM peripheral base addresses */ -#define PWM_BASE_ADDRS { 0u, PWM1_BASE, PWM2_BASE, PWM3_BASE, PWM4_BASE } -/** Array initializer of PWM peripheral base pointers */ -#define PWM_BASE_PTRS { (PWM_Type *)0u, PWM1, PWM2, PWM3, PWM4 } -/** Interrupt vectors for the PWM peripheral type */ -#define PWM_CMP_IRQS { { NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn }, { PWM1_0_IRQn, PWM1_1_IRQn, PWM1_2_IRQn, PWM1_3_IRQn }, { PWM2_0_IRQn, PWM2_1_IRQn, PWM2_2_IRQn, PWM2_3_IRQn }, { PWM3_0_IRQn, PWM3_1_IRQn, PWM3_2_IRQn, PWM3_3_IRQn }, { PWM4_0_IRQn, PWM4_1_IRQn, PWM4_2_IRQn, PWM4_3_IRQn } } -#define PWM_RELOAD_IRQS { { NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn }, { PWM1_0_IRQn, PWM1_1_IRQn, PWM1_2_IRQn, PWM1_3_IRQn }, { PWM2_0_IRQn, PWM2_1_IRQn, PWM2_2_IRQn, PWM2_3_IRQn }, { PWM3_0_IRQn, PWM3_1_IRQn, PWM3_2_IRQn, PWM3_3_IRQn }, { PWM4_0_IRQn, PWM4_1_IRQn, PWM4_2_IRQn, PWM4_3_IRQn } } -#define PWM_CAPTURE_IRQS { { NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn, NotAvail_IRQn }, { PWM1_0_IRQn, PWM1_1_IRQn, PWM1_2_IRQn, PWM1_3_IRQn }, { PWM2_0_IRQn, PWM2_1_IRQn, PWM2_2_IRQn, PWM2_3_IRQn }, { PWM3_0_IRQn, PWM3_1_IRQn, PWM3_2_IRQn, PWM3_3_IRQn }, { PWM4_0_IRQn, PWM4_1_IRQn, PWM4_2_IRQn, PWM4_3_IRQn } } -#define PWM_FAULT_IRQS { NotAvail_IRQn, PWM1_FAULT_IRQn, PWM2_FAULT_IRQn, PWM3_FAULT_IRQn, PWM4_FAULT_IRQn } -#define PWM_RELOAD_ERROR_IRQS { NotAvail_IRQn, PWM1_FAULT_IRQn, PWM2_FAULT_IRQn, PWM3_FAULT_IRQn, PWM4_FAULT_IRQn } - -/*! - * @} - */ /* end of group PWM_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- PXP Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PXP_Peripheral_Access_Layer PXP Peripheral Access Layer - * @{ - */ - -/** PXP - Register Layout Typedef */ -typedef struct { - __IO uint32_t CTRL; /**< Control Register 0, offset: 0x0 */ - __IO uint32_t CTRL_SET; /**< Control Register 0, offset: 0x4 */ - __IO uint32_t CTRL_CLR; /**< Control Register 0, offset: 0x8 */ - __IO uint32_t CTRL_TOG; /**< Control Register 0, offset: 0xC */ - __IO uint32_t STAT; /**< Status Register, offset: 0x10 */ - __IO uint32_t STAT_SET; /**< Status Register, offset: 0x14 */ - __IO uint32_t STAT_CLR; /**< Status Register, offset: 0x18 */ - __IO uint32_t STAT_TOG; /**< Status Register, offset: 0x1C */ - __IO uint32_t OUT_CTRL; /**< Output Buffer Control Register, offset: 0x20 */ - __IO uint32_t OUT_CTRL_SET; /**< Output Buffer Control Register, offset: 0x24 */ - __IO uint32_t OUT_CTRL_CLR; /**< Output Buffer Control Register, offset: 0x28 */ - __IO uint32_t OUT_CTRL_TOG; /**< Output Buffer Control Register, offset: 0x2C */ - __IO uint32_t OUT_BUF; /**< Output Frame Buffer Pointer, offset: 0x30 */ - uint8_t RESERVED_0[12]; - __IO uint32_t OUT_BUF2; /**< Output Frame Buffer Pointer #2, offset: 0x40 */ - uint8_t RESERVED_1[12]; - __IO uint32_t OUT_PITCH; /**< Output Buffer Pitch, offset: 0x50 */ - uint8_t RESERVED_2[12]; - __IO uint32_t OUT_LRC; /**< Output Surface Lower Right Coordinate, offset: 0x60 */ - uint8_t RESERVED_3[12]; - __IO uint32_t OUT_PS_ULC; /**< Processed Surface Upper Left Coordinate, offset: 0x70 */ - uint8_t RESERVED_4[12]; - __IO uint32_t OUT_PS_LRC; /**< Processed Surface Lower Right Coordinate, offset: 0x80 */ - uint8_t RESERVED_5[12]; - __IO uint32_t OUT_AS_ULC; /**< Alpha Surface Upper Left Coordinate, offset: 0x90 */ - uint8_t RESERVED_6[12]; - __IO uint32_t OUT_AS_LRC; /**< Alpha Surface Lower Right Coordinate, offset: 0xA0 */ - uint8_t RESERVED_7[12]; - __IO uint32_t PS_CTRL; /**< Processed Surface (PS) Control Register, offset: 0xB0 */ - __IO uint32_t PS_CTRL_SET; /**< Processed Surface (PS) Control Register, offset: 0xB4 */ - __IO uint32_t PS_CTRL_CLR; /**< Processed Surface (PS) Control Register, offset: 0xB8 */ - __IO uint32_t PS_CTRL_TOG; /**< Processed Surface (PS) Control Register, offset: 0xBC */ - __IO uint32_t PS_BUF; /**< PS Input Buffer Address, offset: 0xC0 */ - uint8_t RESERVED_8[12]; - __IO uint32_t PS_UBUF; /**< PS U/Cb or 2 Plane UV Input Buffer Address, offset: 0xD0 */ - uint8_t RESERVED_9[12]; - __IO uint32_t PS_VBUF; /**< PS V/Cr Input Buffer Address, offset: 0xE0 */ - uint8_t RESERVED_10[12]; - __IO uint32_t PS_PITCH; /**< Processed Surface Pitch, offset: 0xF0 */ - uint8_t RESERVED_11[12]; - __IO uint32_t PS_BACKGROUND; /**< PS Background Color, offset: 0x100 */ - uint8_t RESERVED_12[12]; - __IO uint32_t PS_SCALE; /**< PS Scale Factor Register, offset: 0x110 */ - uint8_t RESERVED_13[12]; - __IO uint32_t PS_OFFSET; /**< PS Scale Offset Register, offset: 0x120 */ - uint8_t RESERVED_14[12]; - __IO uint32_t PS_CLRKEYLOW; /**< PS Color Key Low, offset: 0x130 */ - uint8_t RESERVED_15[12]; - __IO uint32_t PS_CLRKEYHIGH; /**< PS Color Key High, offset: 0x140 */ - uint8_t RESERVED_16[12]; - __IO uint32_t AS_CTRL; /**< Alpha Surface Control, offset: 0x150 */ - uint8_t RESERVED_17[12]; - __IO uint32_t AS_BUF; /**< Alpha Surface Buffer Pointer, offset: 0x160 */ - uint8_t RESERVED_18[12]; - __IO uint32_t AS_PITCH; /**< Alpha Surface Pitch, offset: 0x170 */ - uint8_t RESERVED_19[12]; - __IO uint32_t AS_CLRKEYLOW; /**< Overlay Color Key Low, offset: 0x180 */ - uint8_t RESERVED_20[12]; - __IO uint32_t AS_CLRKEYHIGH; /**< Overlay Color Key High, offset: 0x190 */ - uint8_t RESERVED_21[12]; - __IO uint32_t CSC1_COEF0; /**< Color Space Conversion Coefficient Register 0, offset: 0x1A0 */ - uint8_t RESERVED_22[12]; - __IO uint32_t CSC1_COEF1; /**< Color Space Conversion Coefficient Register 1, offset: 0x1B0 */ - uint8_t RESERVED_23[12]; - __IO uint32_t CSC1_COEF2; /**< Color Space Conversion Coefficient Register 2, offset: 0x1C0 */ - uint8_t RESERVED_24[348]; - __IO uint32_t POWER; /**< PXP Power Control Register, offset: 0x320 */ - uint8_t RESERVED_25[220]; - __IO uint32_t NEXT; /**< Next Frame Pointer, offset: 0x400 */ - uint8_t RESERVED_26[60]; - __IO uint32_t PORTER_DUFF_CTRL; /**< PXP Alpha Engine A Control Register., offset: 0x440 */ -} PXP_Type; - -/* ---------------------------------------------------------------------------- - -- PXP Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup PXP_Register_Masks PXP Register Masks - * @{ - */ - -/*! @name CTRL - Control Register 0 */ -/*! @{ */ - -#define PXP_CTRL_ENABLE_MASK (0x1U) -#define PXP_CTRL_ENABLE_SHIFT (0U) -#define PXP_CTRL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_ENABLE_SHIFT)) & PXP_CTRL_ENABLE_MASK) - -#define PXP_CTRL_IRQ_ENABLE_MASK (0x2U) -#define PXP_CTRL_IRQ_ENABLE_SHIFT (1U) -#define PXP_CTRL_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_IRQ_ENABLE_SHIFT)) & PXP_CTRL_IRQ_ENABLE_MASK) - -#define PXP_CTRL_NEXT_IRQ_ENABLE_MASK (0x4U) -#define PXP_CTRL_NEXT_IRQ_ENABLE_SHIFT (2U) -#define PXP_CTRL_NEXT_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_NEXT_IRQ_ENABLE_SHIFT)) & PXP_CTRL_NEXT_IRQ_ENABLE_MASK) - -#define PXP_CTRL_ENABLE_LCD_HANDSHAKE_MASK (0x10U) -#define PXP_CTRL_ENABLE_LCD_HANDSHAKE_SHIFT (4U) -#define PXP_CTRL_ENABLE_LCD_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_ENABLE_LCD_HANDSHAKE_SHIFT)) & PXP_CTRL_ENABLE_LCD_HANDSHAKE_MASK) - -#define PXP_CTRL_RSVD0_MASK (0xE0U) -#define PXP_CTRL_RSVD0_SHIFT (5U) -#define PXP_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_RSVD0_SHIFT)) & PXP_CTRL_RSVD0_MASK) - -#define PXP_CTRL_ROTATE_MASK (0x300U) -#define PXP_CTRL_ROTATE_SHIFT (8U) -/*! ROTATE - * 0b00..ROT_0 - * 0b01..ROT_90 - * 0b10..ROT_180 - * 0b11..ROT_270 - */ -#define PXP_CTRL_ROTATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_ROTATE_SHIFT)) & PXP_CTRL_ROTATE_MASK) - -#define PXP_CTRL_HFLIP_MASK (0x400U) -#define PXP_CTRL_HFLIP_SHIFT (10U) -#define PXP_CTRL_HFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_HFLIP_SHIFT)) & PXP_CTRL_HFLIP_MASK) - -#define PXP_CTRL_VFLIP_MASK (0x800U) -#define PXP_CTRL_VFLIP_SHIFT (11U) -#define PXP_CTRL_VFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_VFLIP_SHIFT)) & PXP_CTRL_VFLIP_MASK) - -#define PXP_CTRL_RSVD1_MASK (0x3FF000U) -#define PXP_CTRL_RSVD1_SHIFT (12U) -#define PXP_CTRL_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_RSVD1_SHIFT)) & PXP_CTRL_RSVD1_MASK) - -#define PXP_CTRL_ROT_POS_MASK (0x400000U) -#define PXP_CTRL_ROT_POS_SHIFT (22U) -#define PXP_CTRL_ROT_POS(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_ROT_POS_SHIFT)) & PXP_CTRL_ROT_POS_MASK) - -#define PXP_CTRL_BLOCK_SIZE_MASK (0x800000U) -#define PXP_CTRL_BLOCK_SIZE_SHIFT (23U) -/*! BLOCK_SIZE - * 0b0..Process 8x8 pixel blocks. - * 0b1..Process 16x16 pixel blocks. - */ -#define PXP_CTRL_BLOCK_SIZE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_BLOCK_SIZE_SHIFT)) & PXP_CTRL_BLOCK_SIZE_MASK) - -#define PXP_CTRL_RSVD3_MASK (0xF000000U) -#define PXP_CTRL_RSVD3_SHIFT (24U) -#define PXP_CTRL_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_RSVD3_SHIFT)) & PXP_CTRL_RSVD3_MASK) - -#define PXP_CTRL_EN_REPEAT_MASK (0x10000000U) -#define PXP_CTRL_EN_REPEAT_SHIFT (28U) -#define PXP_CTRL_EN_REPEAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_EN_REPEAT_SHIFT)) & PXP_CTRL_EN_REPEAT_MASK) - -#define PXP_CTRL_RSVD4_MASK (0x20000000U) -#define PXP_CTRL_RSVD4_SHIFT (29U) -#define PXP_CTRL_RSVD4(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_RSVD4_SHIFT)) & PXP_CTRL_RSVD4_MASK) - -#define PXP_CTRL_CLKGATE_MASK (0x40000000U) -#define PXP_CTRL_CLKGATE_SHIFT (30U) -#define PXP_CTRL_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLKGATE_SHIFT)) & PXP_CTRL_CLKGATE_MASK) - -#define PXP_CTRL_SFTRST_MASK (0x80000000U) -#define PXP_CTRL_SFTRST_SHIFT (31U) -#define PXP_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SFTRST_SHIFT)) & PXP_CTRL_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_SET - Control Register 0 */ -/*! @{ */ - -#define PXP_CTRL_SET_ENABLE_MASK (0x1U) -#define PXP_CTRL_SET_ENABLE_SHIFT (0U) -#define PXP_CTRL_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_ENABLE_SHIFT)) & PXP_CTRL_SET_ENABLE_MASK) - -#define PXP_CTRL_SET_IRQ_ENABLE_MASK (0x2U) -#define PXP_CTRL_SET_IRQ_ENABLE_SHIFT (1U) -#define PXP_CTRL_SET_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_IRQ_ENABLE_SHIFT)) & PXP_CTRL_SET_IRQ_ENABLE_MASK) - -#define PXP_CTRL_SET_NEXT_IRQ_ENABLE_MASK (0x4U) -#define PXP_CTRL_SET_NEXT_IRQ_ENABLE_SHIFT (2U) -#define PXP_CTRL_SET_NEXT_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_NEXT_IRQ_ENABLE_SHIFT)) & PXP_CTRL_SET_NEXT_IRQ_ENABLE_MASK) - -#define PXP_CTRL_SET_ENABLE_LCD_HANDSHAKE_MASK (0x10U) -#define PXP_CTRL_SET_ENABLE_LCD_HANDSHAKE_SHIFT (4U) -#define PXP_CTRL_SET_ENABLE_LCD_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_ENABLE_LCD_HANDSHAKE_SHIFT)) & PXP_CTRL_SET_ENABLE_LCD_HANDSHAKE_MASK) - -#define PXP_CTRL_SET_RSVD0_MASK (0xE0U) -#define PXP_CTRL_SET_RSVD0_SHIFT (5U) -#define PXP_CTRL_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_RSVD0_SHIFT)) & PXP_CTRL_SET_RSVD0_MASK) - -#define PXP_CTRL_SET_ROTATE_MASK (0x300U) -#define PXP_CTRL_SET_ROTATE_SHIFT (8U) -/*! ROTATE - * 0b00..ROT_0 - * 0b01..ROT_90 - * 0b10..ROT_180 - * 0b11..ROT_270 - */ -#define PXP_CTRL_SET_ROTATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_ROTATE_SHIFT)) & PXP_CTRL_SET_ROTATE_MASK) - -#define PXP_CTRL_SET_HFLIP_MASK (0x400U) -#define PXP_CTRL_SET_HFLIP_SHIFT (10U) -#define PXP_CTRL_SET_HFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_HFLIP_SHIFT)) & PXP_CTRL_SET_HFLIP_MASK) - -#define PXP_CTRL_SET_VFLIP_MASK (0x800U) -#define PXP_CTRL_SET_VFLIP_SHIFT (11U) -#define PXP_CTRL_SET_VFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_VFLIP_SHIFT)) & PXP_CTRL_SET_VFLIP_MASK) - -#define PXP_CTRL_SET_RSVD1_MASK (0x3FF000U) -#define PXP_CTRL_SET_RSVD1_SHIFT (12U) -#define PXP_CTRL_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_RSVD1_SHIFT)) & PXP_CTRL_SET_RSVD1_MASK) - -#define PXP_CTRL_SET_ROT_POS_MASK (0x400000U) -#define PXP_CTRL_SET_ROT_POS_SHIFT (22U) -#define PXP_CTRL_SET_ROT_POS(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_ROT_POS_SHIFT)) & PXP_CTRL_SET_ROT_POS_MASK) - -#define PXP_CTRL_SET_BLOCK_SIZE_MASK (0x800000U) -#define PXP_CTRL_SET_BLOCK_SIZE_SHIFT (23U) -/*! BLOCK_SIZE - * 0b0..Process 8x8 pixel blocks. - * 0b1..Process 16x16 pixel blocks. - */ -#define PXP_CTRL_SET_BLOCK_SIZE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_BLOCK_SIZE_SHIFT)) & PXP_CTRL_SET_BLOCK_SIZE_MASK) - -#define PXP_CTRL_SET_RSVD3_MASK (0xF000000U) -#define PXP_CTRL_SET_RSVD3_SHIFT (24U) -#define PXP_CTRL_SET_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_RSVD3_SHIFT)) & PXP_CTRL_SET_RSVD3_MASK) - -#define PXP_CTRL_SET_EN_REPEAT_MASK (0x10000000U) -#define PXP_CTRL_SET_EN_REPEAT_SHIFT (28U) -#define PXP_CTRL_SET_EN_REPEAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_EN_REPEAT_SHIFT)) & PXP_CTRL_SET_EN_REPEAT_MASK) - -#define PXP_CTRL_SET_RSVD4_MASK (0x20000000U) -#define PXP_CTRL_SET_RSVD4_SHIFT (29U) -#define PXP_CTRL_SET_RSVD4(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_RSVD4_SHIFT)) & PXP_CTRL_SET_RSVD4_MASK) - -#define PXP_CTRL_SET_CLKGATE_MASK (0x40000000U) -#define PXP_CTRL_SET_CLKGATE_SHIFT (30U) -#define PXP_CTRL_SET_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_CLKGATE_SHIFT)) & PXP_CTRL_SET_CLKGATE_MASK) - -#define PXP_CTRL_SET_SFTRST_MASK (0x80000000U) -#define PXP_CTRL_SET_SFTRST_SHIFT (31U) -#define PXP_CTRL_SET_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_SET_SFTRST_SHIFT)) & PXP_CTRL_SET_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_CLR - Control Register 0 */ -/*! @{ */ - -#define PXP_CTRL_CLR_ENABLE_MASK (0x1U) -#define PXP_CTRL_CLR_ENABLE_SHIFT (0U) -#define PXP_CTRL_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_ENABLE_SHIFT)) & PXP_CTRL_CLR_ENABLE_MASK) - -#define PXP_CTRL_CLR_IRQ_ENABLE_MASK (0x2U) -#define PXP_CTRL_CLR_IRQ_ENABLE_SHIFT (1U) -#define PXP_CTRL_CLR_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_IRQ_ENABLE_SHIFT)) & PXP_CTRL_CLR_IRQ_ENABLE_MASK) - -#define PXP_CTRL_CLR_NEXT_IRQ_ENABLE_MASK (0x4U) -#define PXP_CTRL_CLR_NEXT_IRQ_ENABLE_SHIFT (2U) -#define PXP_CTRL_CLR_NEXT_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_NEXT_IRQ_ENABLE_SHIFT)) & PXP_CTRL_CLR_NEXT_IRQ_ENABLE_MASK) - -#define PXP_CTRL_CLR_ENABLE_LCD_HANDSHAKE_MASK (0x10U) -#define PXP_CTRL_CLR_ENABLE_LCD_HANDSHAKE_SHIFT (4U) -#define PXP_CTRL_CLR_ENABLE_LCD_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_ENABLE_LCD_HANDSHAKE_SHIFT)) & PXP_CTRL_CLR_ENABLE_LCD_HANDSHAKE_MASK) - -#define PXP_CTRL_CLR_RSVD0_MASK (0xE0U) -#define PXP_CTRL_CLR_RSVD0_SHIFT (5U) -#define PXP_CTRL_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_RSVD0_SHIFT)) & PXP_CTRL_CLR_RSVD0_MASK) - -#define PXP_CTRL_CLR_ROTATE_MASK (0x300U) -#define PXP_CTRL_CLR_ROTATE_SHIFT (8U) -/*! ROTATE - * 0b00..ROT_0 - * 0b01..ROT_90 - * 0b10..ROT_180 - * 0b11..ROT_270 - */ -#define PXP_CTRL_CLR_ROTATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_ROTATE_SHIFT)) & PXP_CTRL_CLR_ROTATE_MASK) - -#define PXP_CTRL_CLR_HFLIP_MASK (0x400U) -#define PXP_CTRL_CLR_HFLIP_SHIFT (10U) -#define PXP_CTRL_CLR_HFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_HFLIP_SHIFT)) & PXP_CTRL_CLR_HFLIP_MASK) - -#define PXP_CTRL_CLR_VFLIP_MASK (0x800U) -#define PXP_CTRL_CLR_VFLIP_SHIFT (11U) -#define PXP_CTRL_CLR_VFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_VFLIP_SHIFT)) & PXP_CTRL_CLR_VFLIP_MASK) - -#define PXP_CTRL_CLR_RSVD1_MASK (0x3FF000U) -#define PXP_CTRL_CLR_RSVD1_SHIFT (12U) -#define PXP_CTRL_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_RSVD1_SHIFT)) & PXP_CTRL_CLR_RSVD1_MASK) - -#define PXP_CTRL_CLR_ROT_POS_MASK (0x400000U) -#define PXP_CTRL_CLR_ROT_POS_SHIFT (22U) -#define PXP_CTRL_CLR_ROT_POS(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_ROT_POS_SHIFT)) & PXP_CTRL_CLR_ROT_POS_MASK) - -#define PXP_CTRL_CLR_BLOCK_SIZE_MASK (0x800000U) -#define PXP_CTRL_CLR_BLOCK_SIZE_SHIFT (23U) -/*! BLOCK_SIZE - * 0b0..Process 8x8 pixel blocks. - * 0b1..Process 16x16 pixel blocks. - */ -#define PXP_CTRL_CLR_BLOCK_SIZE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_BLOCK_SIZE_SHIFT)) & PXP_CTRL_CLR_BLOCK_SIZE_MASK) - -#define PXP_CTRL_CLR_RSVD3_MASK (0xF000000U) -#define PXP_CTRL_CLR_RSVD3_SHIFT (24U) -#define PXP_CTRL_CLR_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_RSVD3_SHIFT)) & PXP_CTRL_CLR_RSVD3_MASK) - -#define PXP_CTRL_CLR_EN_REPEAT_MASK (0x10000000U) -#define PXP_CTRL_CLR_EN_REPEAT_SHIFT (28U) -#define PXP_CTRL_CLR_EN_REPEAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_EN_REPEAT_SHIFT)) & PXP_CTRL_CLR_EN_REPEAT_MASK) - -#define PXP_CTRL_CLR_RSVD4_MASK (0x20000000U) -#define PXP_CTRL_CLR_RSVD4_SHIFT (29U) -#define PXP_CTRL_CLR_RSVD4(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_RSVD4_SHIFT)) & PXP_CTRL_CLR_RSVD4_MASK) - -#define PXP_CTRL_CLR_CLKGATE_MASK (0x40000000U) -#define PXP_CTRL_CLR_CLKGATE_SHIFT (30U) -#define PXP_CTRL_CLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_CLKGATE_SHIFT)) & PXP_CTRL_CLR_CLKGATE_MASK) - -#define PXP_CTRL_CLR_SFTRST_MASK (0x80000000U) -#define PXP_CTRL_CLR_SFTRST_SHIFT (31U) -#define PXP_CTRL_CLR_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_CLR_SFTRST_SHIFT)) & PXP_CTRL_CLR_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_TOG - Control Register 0 */ -/*! @{ */ - -#define PXP_CTRL_TOG_ENABLE_MASK (0x1U) -#define PXP_CTRL_TOG_ENABLE_SHIFT (0U) -#define PXP_CTRL_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_ENABLE_SHIFT)) & PXP_CTRL_TOG_ENABLE_MASK) - -#define PXP_CTRL_TOG_IRQ_ENABLE_MASK (0x2U) -#define PXP_CTRL_TOG_IRQ_ENABLE_SHIFT (1U) -#define PXP_CTRL_TOG_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_IRQ_ENABLE_SHIFT)) & PXP_CTRL_TOG_IRQ_ENABLE_MASK) - -#define PXP_CTRL_TOG_NEXT_IRQ_ENABLE_MASK (0x4U) -#define PXP_CTRL_TOG_NEXT_IRQ_ENABLE_SHIFT (2U) -#define PXP_CTRL_TOG_NEXT_IRQ_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_NEXT_IRQ_ENABLE_SHIFT)) & PXP_CTRL_TOG_NEXT_IRQ_ENABLE_MASK) - -#define PXP_CTRL_TOG_ENABLE_LCD_HANDSHAKE_MASK (0x10U) -#define PXP_CTRL_TOG_ENABLE_LCD_HANDSHAKE_SHIFT (4U) -#define PXP_CTRL_TOG_ENABLE_LCD_HANDSHAKE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_ENABLE_LCD_HANDSHAKE_SHIFT)) & PXP_CTRL_TOG_ENABLE_LCD_HANDSHAKE_MASK) - -#define PXP_CTRL_TOG_RSVD0_MASK (0xE0U) -#define PXP_CTRL_TOG_RSVD0_SHIFT (5U) -#define PXP_CTRL_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_RSVD0_SHIFT)) & PXP_CTRL_TOG_RSVD0_MASK) - -#define PXP_CTRL_TOG_ROTATE_MASK (0x300U) -#define PXP_CTRL_TOG_ROTATE_SHIFT (8U) -/*! ROTATE - * 0b00..ROT_0 - * 0b01..ROT_90 - * 0b10..ROT_180 - * 0b11..ROT_270 - */ -#define PXP_CTRL_TOG_ROTATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_ROTATE_SHIFT)) & PXP_CTRL_TOG_ROTATE_MASK) - -#define PXP_CTRL_TOG_HFLIP_MASK (0x400U) -#define PXP_CTRL_TOG_HFLIP_SHIFT (10U) -#define PXP_CTRL_TOG_HFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_HFLIP_SHIFT)) & PXP_CTRL_TOG_HFLIP_MASK) - -#define PXP_CTRL_TOG_VFLIP_MASK (0x800U) -#define PXP_CTRL_TOG_VFLIP_SHIFT (11U) -#define PXP_CTRL_TOG_VFLIP(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_VFLIP_SHIFT)) & PXP_CTRL_TOG_VFLIP_MASK) - -#define PXP_CTRL_TOG_RSVD1_MASK (0x3FF000U) -#define PXP_CTRL_TOG_RSVD1_SHIFT (12U) -#define PXP_CTRL_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_RSVD1_SHIFT)) & PXP_CTRL_TOG_RSVD1_MASK) - -#define PXP_CTRL_TOG_ROT_POS_MASK (0x400000U) -#define PXP_CTRL_TOG_ROT_POS_SHIFT (22U) -#define PXP_CTRL_TOG_ROT_POS(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_ROT_POS_SHIFT)) & PXP_CTRL_TOG_ROT_POS_MASK) - -#define PXP_CTRL_TOG_BLOCK_SIZE_MASK (0x800000U) -#define PXP_CTRL_TOG_BLOCK_SIZE_SHIFT (23U) -/*! BLOCK_SIZE - * 0b0..Process 8x8 pixel blocks. - * 0b1..Process 16x16 pixel blocks. - */ -#define PXP_CTRL_TOG_BLOCK_SIZE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_BLOCK_SIZE_SHIFT)) & PXP_CTRL_TOG_BLOCK_SIZE_MASK) - -#define PXP_CTRL_TOG_RSVD3_MASK (0xF000000U) -#define PXP_CTRL_TOG_RSVD3_SHIFT (24U) -#define PXP_CTRL_TOG_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_RSVD3_SHIFT)) & PXP_CTRL_TOG_RSVD3_MASK) - -#define PXP_CTRL_TOG_EN_REPEAT_MASK (0x10000000U) -#define PXP_CTRL_TOG_EN_REPEAT_SHIFT (28U) -#define PXP_CTRL_TOG_EN_REPEAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_EN_REPEAT_SHIFT)) & PXP_CTRL_TOG_EN_REPEAT_MASK) - -#define PXP_CTRL_TOG_RSVD4_MASK (0x20000000U) -#define PXP_CTRL_TOG_RSVD4_SHIFT (29U) -#define PXP_CTRL_TOG_RSVD4(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_RSVD4_SHIFT)) & PXP_CTRL_TOG_RSVD4_MASK) - -#define PXP_CTRL_TOG_CLKGATE_MASK (0x40000000U) -#define PXP_CTRL_TOG_CLKGATE_SHIFT (30U) -#define PXP_CTRL_TOG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_CLKGATE_SHIFT)) & PXP_CTRL_TOG_CLKGATE_MASK) - -#define PXP_CTRL_TOG_SFTRST_MASK (0x80000000U) -#define PXP_CTRL_TOG_SFTRST_SHIFT (31U) -#define PXP_CTRL_TOG_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << PXP_CTRL_TOG_SFTRST_SHIFT)) & PXP_CTRL_TOG_SFTRST_MASK) -/*! @} */ - -/*! @name STAT - Status Register */ -/*! @{ */ - -#define PXP_STAT_IRQ_MASK (0x1U) -#define PXP_STAT_IRQ_SHIFT (0U) -#define PXP_STAT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_IRQ_SHIFT)) & PXP_STAT_IRQ_MASK) - -#define PXP_STAT_AXI_WRITE_ERROR_MASK (0x2U) -#define PXP_STAT_AXI_WRITE_ERROR_SHIFT (1U) -#define PXP_STAT_AXI_WRITE_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_AXI_WRITE_ERROR_SHIFT)) & PXP_STAT_AXI_WRITE_ERROR_MASK) - -#define PXP_STAT_AXI_READ_ERROR_MASK (0x4U) -#define PXP_STAT_AXI_READ_ERROR_SHIFT (2U) -#define PXP_STAT_AXI_READ_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_AXI_READ_ERROR_SHIFT)) & PXP_STAT_AXI_READ_ERROR_MASK) - -#define PXP_STAT_NEXT_IRQ_MASK (0x8U) -#define PXP_STAT_NEXT_IRQ_SHIFT (3U) -#define PXP_STAT_NEXT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_NEXT_IRQ_SHIFT)) & PXP_STAT_NEXT_IRQ_MASK) - -#define PXP_STAT_AXI_ERROR_ID_MASK (0xF0U) -#define PXP_STAT_AXI_ERROR_ID_SHIFT (4U) -#define PXP_STAT_AXI_ERROR_ID(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_AXI_ERROR_ID_SHIFT)) & PXP_STAT_AXI_ERROR_ID_MASK) - -#define PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_MASK (0x100U) -#define PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_SHIFT (8U) -#define PXP_STAT_LUT_DMA_LOAD_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_SHIFT)) & PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_MASK) - -#define PXP_STAT_RSVD2_MASK (0xFE00U) -#define PXP_STAT_RSVD2_SHIFT (9U) -#define PXP_STAT_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_RSVD2_SHIFT)) & PXP_STAT_RSVD2_MASK) - -#define PXP_STAT_BLOCKY_MASK (0xFF0000U) -#define PXP_STAT_BLOCKY_SHIFT (16U) -#define PXP_STAT_BLOCKY(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_BLOCKY_SHIFT)) & PXP_STAT_BLOCKY_MASK) - -#define PXP_STAT_BLOCKX_MASK (0xFF000000U) -#define PXP_STAT_BLOCKX_SHIFT (24U) -#define PXP_STAT_BLOCKX(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_BLOCKX_SHIFT)) & PXP_STAT_BLOCKX_MASK) -/*! @} */ - -/*! @name STAT_SET - Status Register */ -/*! @{ */ - -#define PXP_STAT_SET_IRQ_MASK (0x1U) -#define PXP_STAT_SET_IRQ_SHIFT (0U) -#define PXP_STAT_SET_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_IRQ_SHIFT)) & PXP_STAT_SET_IRQ_MASK) - -#define PXP_STAT_SET_AXI_WRITE_ERROR_MASK (0x2U) -#define PXP_STAT_SET_AXI_WRITE_ERROR_SHIFT (1U) -#define PXP_STAT_SET_AXI_WRITE_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_AXI_WRITE_ERROR_SHIFT)) & PXP_STAT_SET_AXI_WRITE_ERROR_MASK) - -#define PXP_STAT_SET_AXI_READ_ERROR_MASK (0x4U) -#define PXP_STAT_SET_AXI_READ_ERROR_SHIFT (2U) -#define PXP_STAT_SET_AXI_READ_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_AXI_READ_ERROR_SHIFT)) & PXP_STAT_SET_AXI_READ_ERROR_MASK) - -#define PXP_STAT_SET_NEXT_IRQ_MASK (0x8U) -#define PXP_STAT_SET_NEXT_IRQ_SHIFT (3U) -#define PXP_STAT_SET_NEXT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_NEXT_IRQ_SHIFT)) & PXP_STAT_SET_NEXT_IRQ_MASK) - -#define PXP_STAT_SET_AXI_ERROR_ID_MASK (0xF0U) -#define PXP_STAT_SET_AXI_ERROR_ID_SHIFT (4U) -#define PXP_STAT_SET_AXI_ERROR_ID(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_AXI_ERROR_ID_SHIFT)) & PXP_STAT_SET_AXI_ERROR_ID_MASK) - -#define PXP_STAT_SET_LUT_DMA_LOAD_DONE_IRQ_MASK (0x100U) -#define PXP_STAT_SET_LUT_DMA_LOAD_DONE_IRQ_SHIFT (8U) -#define PXP_STAT_SET_LUT_DMA_LOAD_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_LUT_DMA_LOAD_DONE_IRQ_SHIFT)) & PXP_STAT_SET_LUT_DMA_LOAD_DONE_IRQ_MASK) - -#define PXP_STAT_SET_RSVD2_MASK (0xFE00U) -#define PXP_STAT_SET_RSVD2_SHIFT (9U) -#define PXP_STAT_SET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_RSVD2_SHIFT)) & PXP_STAT_SET_RSVD2_MASK) - -#define PXP_STAT_SET_BLOCKY_MASK (0xFF0000U) -#define PXP_STAT_SET_BLOCKY_SHIFT (16U) -#define PXP_STAT_SET_BLOCKY(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_BLOCKY_SHIFT)) & PXP_STAT_SET_BLOCKY_MASK) - -#define PXP_STAT_SET_BLOCKX_MASK (0xFF000000U) -#define PXP_STAT_SET_BLOCKX_SHIFT (24U) -#define PXP_STAT_SET_BLOCKX(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_SET_BLOCKX_SHIFT)) & PXP_STAT_SET_BLOCKX_MASK) -/*! @} */ - -/*! @name STAT_CLR - Status Register */ -/*! @{ */ - -#define PXP_STAT_CLR_IRQ_MASK (0x1U) -#define PXP_STAT_CLR_IRQ_SHIFT (0U) -#define PXP_STAT_CLR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_IRQ_SHIFT)) & PXP_STAT_CLR_IRQ_MASK) - -#define PXP_STAT_CLR_AXI_WRITE_ERROR_MASK (0x2U) -#define PXP_STAT_CLR_AXI_WRITE_ERROR_SHIFT (1U) -#define PXP_STAT_CLR_AXI_WRITE_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_AXI_WRITE_ERROR_SHIFT)) & PXP_STAT_CLR_AXI_WRITE_ERROR_MASK) - -#define PXP_STAT_CLR_AXI_READ_ERROR_MASK (0x4U) -#define PXP_STAT_CLR_AXI_READ_ERROR_SHIFT (2U) -#define PXP_STAT_CLR_AXI_READ_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_AXI_READ_ERROR_SHIFT)) & PXP_STAT_CLR_AXI_READ_ERROR_MASK) - -#define PXP_STAT_CLR_NEXT_IRQ_MASK (0x8U) -#define PXP_STAT_CLR_NEXT_IRQ_SHIFT (3U) -#define PXP_STAT_CLR_NEXT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_NEXT_IRQ_SHIFT)) & PXP_STAT_CLR_NEXT_IRQ_MASK) - -#define PXP_STAT_CLR_AXI_ERROR_ID_MASK (0xF0U) -#define PXP_STAT_CLR_AXI_ERROR_ID_SHIFT (4U) -#define PXP_STAT_CLR_AXI_ERROR_ID(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_AXI_ERROR_ID_SHIFT)) & PXP_STAT_CLR_AXI_ERROR_ID_MASK) - -#define PXP_STAT_CLR_LUT_DMA_LOAD_DONE_IRQ_MASK (0x100U) -#define PXP_STAT_CLR_LUT_DMA_LOAD_DONE_IRQ_SHIFT (8U) -#define PXP_STAT_CLR_LUT_DMA_LOAD_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_LUT_DMA_LOAD_DONE_IRQ_SHIFT)) & PXP_STAT_CLR_LUT_DMA_LOAD_DONE_IRQ_MASK) - -#define PXP_STAT_CLR_RSVD2_MASK (0xFE00U) -#define PXP_STAT_CLR_RSVD2_SHIFT (9U) -#define PXP_STAT_CLR_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_RSVD2_SHIFT)) & PXP_STAT_CLR_RSVD2_MASK) - -#define PXP_STAT_CLR_BLOCKY_MASK (0xFF0000U) -#define PXP_STAT_CLR_BLOCKY_SHIFT (16U) -#define PXP_STAT_CLR_BLOCKY(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_BLOCKY_SHIFT)) & PXP_STAT_CLR_BLOCKY_MASK) - -#define PXP_STAT_CLR_BLOCKX_MASK (0xFF000000U) -#define PXP_STAT_CLR_BLOCKX_SHIFT (24U) -#define PXP_STAT_CLR_BLOCKX(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_CLR_BLOCKX_SHIFT)) & PXP_STAT_CLR_BLOCKX_MASK) -/*! @} */ - -/*! @name STAT_TOG - Status Register */ -/*! @{ */ - -#define PXP_STAT_TOG_IRQ_MASK (0x1U) -#define PXP_STAT_TOG_IRQ_SHIFT (0U) -#define PXP_STAT_TOG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_IRQ_SHIFT)) & PXP_STAT_TOG_IRQ_MASK) - -#define PXP_STAT_TOG_AXI_WRITE_ERROR_MASK (0x2U) -#define PXP_STAT_TOG_AXI_WRITE_ERROR_SHIFT (1U) -#define PXP_STAT_TOG_AXI_WRITE_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_AXI_WRITE_ERROR_SHIFT)) & PXP_STAT_TOG_AXI_WRITE_ERROR_MASK) - -#define PXP_STAT_TOG_AXI_READ_ERROR_MASK (0x4U) -#define PXP_STAT_TOG_AXI_READ_ERROR_SHIFT (2U) -#define PXP_STAT_TOG_AXI_READ_ERROR(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_AXI_READ_ERROR_SHIFT)) & PXP_STAT_TOG_AXI_READ_ERROR_MASK) - -#define PXP_STAT_TOG_NEXT_IRQ_MASK (0x8U) -#define PXP_STAT_TOG_NEXT_IRQ_SHIFT (3U) -#define PXP_STAT_TOG_NEXT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_NEXT_IRQ_SHIFT)) & PXP_STAT_TOG_NEXT_IRQ_MASK) - -#define PXP_STAT_TOG_AXI_ERROR_ID_MASK (0xF0U) -#define PXP_STAT_TOG_AXI_ERROR_ID_SHIFT (4U) -#define PXP_STAT_TOG_AXI_ERROR_ID(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_AXI_ERROR_ID_SHIFT)) & PXP_STAT_TOG_AXI_ERROR_ID_MASK) - -#define PXP_STAT_TOG_LUT_DMA_LOAD_DONE_IRQ_MASK (0x100U) -#define PXP_STAT_TOG_LUT_DMA_LOAD_DONE_IRQ_SHIFT (8U) -#define PXP_STAT_TOG_LUT_DMA_LOAD_DONE_IRQ(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_LUT_DMA_LOAD_DONE_IRQ_SHIFT)) & PXP_STAT_TOG_LUT_DMA_LOAD_DONE_IRQ_MASK) - -#define PXP_STAT_TOG_RSVD2_MASK (0xFE00U) -#define PXP_STAT_TOG_RSVD2_SHIFT (9U) -#define PXP_STAT_TOG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_RSVD2_SHIFT)) & PXP_STAT_TOG_RSVD2_MASK) - -#define PXP_STAT_TOG_BLOCKY_MASK (0xFF0000U) -#define PXP_STAT_TOG_BLOCKY_SHIFT (16U) -#define PXP_STAT_TOG_BLOCKY(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_BLOCKY_SHIFT)) & PXP_STAT_TOG_BLOCKY_MASK) - -#define PXP_STAT_TOG_BLOCKX_MASK (0xFF000000U) -#define PXP_STAT_TOG_BLOCKX_SHIFT (24U) -#define PXP_STAT_TOG_BLOCKX(x) (((uint32_t)(((uint32_t)(x)) << PXP_STAT_TOG_BLOCKX_SHIFT)) & PXP_STAT_TOG_BLOCKX_MASK) -/*! @} */ - -/*! @name OUT_CTRL - Output Buffer Control Register */ -/*! @{ */ - -#define PXP_OUT_CTRL_FORMAT_MASK (0x1FU) -#define PXP_OUT_CTRL_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00000..32-bit pixels - * 0b00100..32-bit pixels (unpacked 24-bit pixel in 32 bit DWORD.) - * 0b00101..24-bit pixels (packed 24-bit format) - * 0b01000..16-bit pixels - * 0b01001..16-bit pixels - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - */ -#define PXP_OUT_CTRL_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_FORMAT_SHIFT)) & PXP_OUT_CTRL_FORMAT_MASK) - -#define PXP_OUT_CTRL_RSVD0_MASK (0xE0U) -#define PXP_OUT_CTRL_RSVD0_SHIFT (5U) -#define PXP_OUT_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_RSVD0_SHIFT)) & PXP_OUT_CTRL_RSVD0_MASK) - -#define PXP_OUT_CTRL_INTERLACED_OUTPUT_MASK (0x300U) -#define PXP_OUT_CTRL_INTERLACED_OUTPUT_SHIFT (8U) -/*! INTERLACED_OUTPUT - * 0b00..All data written in progressive format to the OUTBUF Pointer. - * 0b01..Interlaced output: only data for field 0 is written to the OUTBUF Pointer. - * 0b10..Interlaced output: only data for field 1 is written to the OUTBUF2 Pointer. - * 0b11..Interlaced output: data for field 0 is written to OUTBUF and data for field 1 is written to OUTBUF2. - */ -#define PXP_OUT_CTRL_INTERLACED_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_INTERLACED_OUTPUT_SHIFT)) & PXP_OUT_CTRL_INTERLACED_OUTPUT_MASK) - -#define PXP_OUT_CTRL_RSVD1_MASK (0x7FFC00U) -#define PXP_OUT_CTRL_RSVD1_SHIFT (10U) -#define PXP_OUT_CTRL_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_RSVD1_SHIFT)) & PXP_OUT_CTRL_RSVD1_MASK) - -#define PXP_OUT_CTRL_ALPHA_OUTPUT_MASK (0x800000U) -#define PXP_OUT_CTRL_ALPHA_OUTPUT_SHIFT (23U) -#define PXP_OUT_CTRL_ALPHA_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_ALPHA_OUTPUT_SHIFT)) & PXP_OUT_CTRL_ALPHA_OUTPUT_MASK) - -#define PXP_OUT_CTRL_ALPHA_MASK (0xFF000000U) -#define PXP_OUT_CTRL_ALPHA_SHIFT (24U) -#define PXP_OUT_CTRL_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_ALPHA_SHIFT)) & PXP_OUT_CTRL_ALPHA_MASK) -/*! @} */ - -/*! @name OUT_CTRL_SET - Output Buffer Control Register */ -/*! @{ */ - -#define PXP_OUT_CTRL_SET_FORMAT_MASK (0x1FU) -#define PXP_OUT_CTRL_SET_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00000..32-bit pixels - * 0b00100..32-bit pixels (unpacked 24-bit pixel in 32 bit DWORD.) - * 0b00101..24-bit pixels (packed 24-bit format) - * 0b01000..16-bit pixels - * 0b01001..16-bit pixels - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - */ -#define PXP_OUT_CTRL_SET_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_FORMAT_SHIFT)) & PXP_OUT_CTRL_SET_FORMAT_MASK) - -#define PXP_OUT_CTRL_SET_RSVD0_MASK (0xE0U) -#define PXP_OUT_CTRL_SET_RSVD0_SHIFT (5U) -#define PXP_OUT_CTRL_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_RSVD0_SHIFT)) & PXP_OUT_CTRL_SET_RSVD0_MASK) - -#define PXP_OUT_CTRL_SET_INTERLACED_OUTPUT_MASK (0x300U) -#define PXP_OUT_CTRL_SET_INTERLACED_OUTPUT_SHIFT (8U) -/*! INTERLACED_OUTPUT - * 0b00..All data written in progressive format to the OUTBUF Pointer. - * 0b01..Interlaced output: only data for field 0 is written to the OUTBUF Pointer. - * 0b10..Interlaced output: only data for field 1 is written to the OUTBUF2 Pointer. - * 0b11..Interlaced output: data for field 0 is written to OUTBUF and data for field 1 is written to OUTBUF2. - */ -#define PXP_OUT_CTRL_SET_INTERLACED_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_INTERLACED_OUTPUT_SHIFT)) & PXP_OUT_CTRL_SET_INTERLACED_OUTPUT_MASK) - -#define PXP_OUT_CTRL_SET_RSVD1_MASK (0x7FFC00U) -#define PXP_OUT_CTRL_SET_RSVD1_SHIFT (10U) -#define PXP_OUT_CTRL_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_RSVD1_SHIFT)) & PXP_OUT_CTRL_SET_RSVD1_MASK) - -#define PXP_OUT_CTRL_SET_ALPHA_OUTPUT_MASK (0x800000U) -#define PXP_OUT_CTRL_SET_ALPHA_OUTPUT_SHIFT (23U) -#define PXP_OUT_CTRL_SET_ALPHA_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_ALPHA_OUTPUT_SHIFT)) & PXP_OUT_CTRL_SET_ALPHA_OUTPUT_MASK) - -#define PXP_OUT_CTRL_SET_ALPHA_MASK (0xFF000000U) -#define PXP_OUT_CTRL_SET_ALPHA_SHIFT (24U) -#define PXP_OUT_CTRL_SET_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_SET_ALPHA_SHIFT)) & PXP_OUT_CTRL_SET_ALPHA_MASK) -/*! @} */ - -/*! @name OUT_CTRL_CLR - Output Buffer Control Register */ -/*! @{ */ - -#define PXP_OUT_CTRL_CLR_FORMAT_MASK (0x1FU) -#define PXP_OUT_CTRL_CLR_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00000..32-bit pixels - * 0b00100..32-bit pixels (unpacked 24-bit pixel in 32 bit DWORD.) - * 0b00101..24-bit pixels (packed 24-bit format) - * 0b01000..16-bit pixels - * 0b01001..16-bit pixels - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - */ -#define PXP_OUT_CTRL_CLR_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_FORMAT_SHIFT)) & PXP_OUT_CTRL_CLR_FORMAT_MASK) - -#define PXP_OUT_CTRL_CLR_RSVD0_MASK (0xE0U) -#define PXP_OUT_CTRL_CLR_RSVD0_SHIFT (5U) -#define PXP_OUT_CTRL_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_RSVD0_SHIFT)) & PXP_OUT_CTRL_CLR_RSVD0_MASK) - -#define PXP_OUT_CTRL_CLR_INTERLACED_OUTPUT_MASK (0x300U) -#define PXP_OUT_CTRL_CLR_INTERLACED_OUTPUT_SHIFT (8U) -/*! INTERLACED_OUTPUT - * 0b00..All data written in progressive format to the OUTBUF Pointer. - * 0b01..Interlaced output: only data for field 0 is written to the OUTBUF Pointer. - * 0b10..Interlaced output: only data for field 1 is written to the OUTBUF2 Pointer. - * 0b11..Interlaced output: data for field 0 is written to OUTBUF and data for field 1 is written to OUTBUF2. - */ -#define PXP_OUT_CTRL_CLR_INTERLACED_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_INTERLACED_OUTPUT_SHIFT)) & PXP_OUT_CTRL_CLR_INTERLACED_OUTPUT_MASK) - -#define PXP_OUT_CTRL_CLR_RSVD1_MASK (0x7FFC00U) -#define PXP_OUT_CTRL_CLR_RSVD1_SHIFT (10U) -#define PXP_OUT_CTRL_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_RSVD1_SHIFT)) & PXP_OUT_CTRL_CLR_RSVD1_MASK) - -#define PXP_OUT_CTRL_CLR_ALPHA_OUTPUT_MASK (0x800000U) -#define PXP_OUT_CTRL_CLR_ALPHA_OUTPUT_SHIFT (23U) -#define PXP_OUT_CTRL_CLR_ALPHA_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_ALPHA_OUTPUT_SHIFT)) & PXP_OUT_CTRL_CLR_ALPHA_OUTPUT_MASK) - -#define PXP_OUT_CTRL_CLR_ALPHA_MASK (0xFF000000U) -#define PXP_OUT_CTRL_CLR_ALPHA_SHIFT (24U) -#define PXP_OUT_CTRL_CLR_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_CLR_ALPHA_SHIFT)) & PXP_OUT_CTRL_CLR_ALPHA_MASK) -/*! @} */ - -/*! @name OUT_CTRL_TOG - Output Buffer Control Register */ -/*! @{ */ - -#define PXP_OUT_CTRL_TOG_FORMAT_MASK (0x1FU) -#define PXP_OUT_CTRL_TOG_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00000..32-bit pixels - * 0b00100..32-bit pixels (unpacked 24-bit pixel in 32 bit DWORD.) - * 0b00101..24-bit pixels (packed 24-bit format) - * 0b01000..16-bit pixels - * 0b01001..16-bit pixels - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - */ -#define PXP_OUT_CTRL_TOG_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_FORMAT_SHIFT)) & PXP_OUT_CTRL_TOG_FORMAT_MASK) - -#define PXP_OUT_CTRL_TOG_RSVD0_MASK (0xE0U) -#define PXP_OUT_CTRL_TOG_RSVD0_SHIFT (5U) -#define PXP_OUT_CTRL_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_RSVD0_SHIFT)) & PXP_OUT_CTRL_TOG_RSVD0_MASK) - -#define PXP_OUT_CTRL_TOG_INTERLACED_OUTPUT_MASK (0x300U) -#define PXP_OUT_CTRL_TOG_INTERLACED_OUTPUT_SHIFT (8U) -/*! INTERLACED_OUTPUT - * 0b00..All data written in progressive format to the OUTBUF Pointer. - * 0b01..Interlaced output: only data for field 0 is written to the OUTBUF Pointer. - * 0b10..Interlaced output: only data for field 1 is written to the OUTBUF2 Pointer. - * 0b11..Interlaced output: data for field 0 is written to OUTBUF and data for field 1 is written to OUTBUF2. - */ -#define PXP_OUT_CTRL_TOG_INTERLACED_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_INTERLACED_OUTPUT_SHIFT)) & PXP_OUT_CTRL_TOG_INTERLACED_OUTPUT_MASK) - -#define PXP_OUT_CTRL_TOG_RSVD1_MASK (0x7FFC00U) -#define PXP_OUT_CTRL_TOG_RSVD1_SHIFT (10U) -#define PXP_OUT_CTRL_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_RSVD1_SHIFT)) & PXP_OUT_CTRL_TOG_RSVD1_MASK) - -#define PXP_OUT_CTRL_TOG_ALPHA_OUTPUT_MASK (0x800000U) -#define PXP_OUT_CTRL_TOG_ALPHA_OUTPUT_SHIFT (23U) -#define PXP_OUT_CTRL_TOG_ALPHA_OUTPUT(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_ALPHA_OUTPUT_SHIFT)) & PXP_OUT_CTRL_TOG_ALPHA_OUTPUT_MASK) - -#define PXP_OUT_CTRL_TOG_ALPHA_MASK (0xFF000000U) -#define PXP_OUT_CTRL_TOG_ALPHA_SHIFT (24U) -#define PXP_OUT_CTRL_TOG_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_CTRL_TOG_ALPHA_SHIFT)) & PXP_OUT_CTRL_TOG_ALPHA_MASK) -/*! @} */ - -/*! @name OUT_BUF - Output Frame Buffer Pointer */ -/*! @{ */ - -#define PXP_OUT_BUF_ADDR_MASK (0xFFFFFFFFU) -#define PXP_OUT_BUF_ADDR_SHIFT (0U) -#define PXP_OUT_BUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_BUF_ADDR_SHIFT)) & PXP_OUT_BUF_ADDR_MASK) -/*! @} */ - -/*! @name OUT_BUF2 - Output Frame Buffer Pointer #2 */ -/*! @{ */ - -#define PXP_OUT_BUF2_ADDR_MASK (0xFFFFFFFFU) -#define PXP_OUT_BUF2_ADDR_SHIFT (0U) -#define PXP_OUT_BUF2_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_BUF2_ADDR_SHIFT)) & PXP_OUT_BUF2_ADDR_MASK) -/*! @} */ - -/*! @name OUT_PITCH - Output Buffer Pitch */ -/*! @{ */ - -#define PXP_OUT_PITCH_PITCH_MASK (0xFFFFU) -#define PXP_OUT_PITCH_PITCH_SHIFT (0U) -#define PXP_OUT_PITCH_PITCH(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PITCH_PITCH_SHIFT)) & PXP_OUT_PITCH_PITCH_MASK) - -#define PXP_OUT_PITCH_RSVD_MASK (0xFFFF0000U) -#define PXP_OUT_PITCH_RSVD_SHIFT (16U) -#define PXP_OUT_PITCH_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PITCH_RSVD_SHIFT)) & PXP_OUT_PITCH_RSVD_MASK) -/*! @} */ - -/*! @name OUT_LRC - Output Surface Lower Right Coordinate */ -/*! @{ */ - -#define PXP_OUT_LRC_Y_MASK (0x3FFFU) -#define PXP_OUT_LRC_Y_SHIFT (0U) -#define PXP_OUT_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_LRC_Y_SHIFT)) & PXP_OUT_LRC_Y_MASK) - -#define PXP_OUT_LRC_RSVD0_MASK (0xC000U) -#define PXP_OUT_LRC_RSVD0_SHIFT (14U) -#define PXP_OUT_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_LRC_RSVD0_SHIFT)) & PXP_OUT_LRC_RSVD0_MASK) - -#define PXP_OUT_LRC_X_MASK (0x3FFF0000U) -#define PXP_OUT_LRC_X_SHIFT (16U) -#define PXP_OUT_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_LRC_X_SHIFT)) & PXP_OUT_LRC_X_MASK) - -#define PXP_OUT_LRC_RSVD1_MASK (0xC0000000U) -#define PXP_OUT_LRC_RSVD1_SHIFT (30U) -#define PXP_OUT_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_LRC_RSVD1_SHIFT)) & PXP_OUT_LRC_RSVD1_MASK) -/*! @} */ - -/*! @name OUT_PS_ULC - Processed Surface Upper Left Coordinate */ -/*! @{ */ - -#define PXP_OUT_PS_ULC_Y_MASK (0x3FFFU) -#define PXP_OUT_PS_ULC_Y_SHIFT (0U) -#define PXP_OUT_PS_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_ULC_Y_SHIFT)) & PXP_OUT_PS_ULC_Y_MASK) - -#define PXP_OUT_PS_ULC_RSVD0_MASK (0xC000U) -#define PXP_OUT_PS_ULC_RSVD0_SHIFT (14U) -#define PXP_OUT_PS_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_ULC_RSVD0_SHIFT)) & PXP_OUT_PS_ULC_RSVD0_MASK) - -#define PXP_OUT_PS_ULC_X_MASK (0x3FFF0000U) -#define PXP_OUT_PS_ULC_X_SHIFT (16U) -#define PXP_OUT_PS_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_ULC_X_SHIFT)) & PXP_OUT_PS_ULC_X_MASK) - -#define PXP_OUT_PS_ULC_RSVD1_MASK (0xC0000000U) -#define PXP_OUT_PS_ULC_RSVD1_SHIFT (30U) -#define PXP_OUT_PS_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_ULC_RSVD1_SHIFT)) & PXP_OUT_PS_ULC_RSVD1_MASK) -/*! @} */ - -/*! @name OUT_PS_LRC - Processed Surface Lower Right Coordinate */ -/*! @{ */ - -#define PXP_OUT_PS_LRC_Y_MASK (0x3FFFU) -#define PXP_OUT_PS_LRC_Y_SHIFT (0U) -#define PXP_OUT_PS_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_LRC_Y_SHIFT)) & PXP_OUT_PS_LRC_Y_MASK) - -#define PXP_OUT_PS_LRC_RSVD0_MASK (0xC000U) -#define PXP_OUT_PS_LRC_RSVD0_SHIFT (14U) -#define PXP_OUT_PS_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_LRC_RSVD0_SHIFT)) & PXP_OUT_PS_LRC_RSVD0_MASK) - -#define PXP_OUT_PS_LRC_X_MASK (0x3FFF0000U) -#define PXP_OUT_PS_LRC_X_SHIFT (16U) -#define PXP_OUT_PS_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_LRC_X_SHIFT)) & PXP_OUT_PS_LRC_X_MASK) - -#define PXP_OUT_PS_LRC_RSVD1_MASK (0xC0000000U) -#define PXP_OUT_PS_LRC_RSVD1_SHIFT (30U) -#define PXP_OUT_PS_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_PS_LRC_RSVD1_SHIFT)) & PXP_OUT_PS_LRC_RSVD1_MASK) -/*! @} */ - -/*! @name OUT_AS_ULC - Alpha Surface Upper Left Coordinate */ -/*! @{ */ - -#define PXP_OUT_AS_ULC_Y_MASK (0x3FFFU) -#define PXP_OUT_AS_ULC_Y_SHIFT (0U) -#define PXP_OUT_AS_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_ULC_Y_SHIFT)) & PXP_OUT_AS_ULC_Y_MASK) - -#define PXP_OUT_AS_ULC_RSVD0_MASK (0xC000U) -#define PXP_OUT_AS_ULC_RSVD0_SHIFT (14U) -#define PXP_OUT_AS_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_ULC_RSVD0_SHIFT)) & PXP_OUT_AS_ULC_RSVD0_MASK) - -#define PXP_OUT_AS_ULC_X_MASK (0x3FFF0000U) -#define PXP_OUT_AS_ULC_X_SHIFT (16U) -#define PXP_OUT_AS_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_ULC_X_SHIFT)) & PXP_OUT_AS_ULC_X_MASK) - -#define PXP_OUT_AS_ULC_RSVD1_MASK (0xC0000000U) -#define PXP_OUT_AS_ULC_RSVD1_SHIFT (30U) -#define PXP_OUT_AS_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_ULC_RSVD1_SHIFT)) & PXP_OUT_AS_ULC_RSVD1_MASK) -/*! @} */ - -/*! @name OUT_AS_LRC - Alpha Surface Lower Right Coordinate */ -/*! @{ */ - -#define PXP_OUT_AS_LRC_Y_MASK (0x3FFFU) -#define PXP_OUT_AS_LRC_Y_SHIFT (0U) -#define PXP_OUT_AS_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_LRC_Y_SHIFT)) & PXP_OUT_AS_LRC_Y_MASK) - -#define PXP_OUT_AS_LRC_RSVD0_MASK (0xC000U) -#define PXP_OUT_AS_LRC_RSVD0_SHIFT (14U) -#define PXP_OUT_AS_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_LRC_RSVD0_SHIFT)) & PXP_OUT_AS_LRC_RSVD0_MASK) - -#define PXP_OUT_AS_LRC_X_MASK (0x3FFF0000U) -#define PXP_OUT_AS_LRC_X_SHIFT (16U) -#define PXP_OUT_AS_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_LRC_X_SHIFT)) & PXP_OUT_AS_LRC_X_MASK) - -#define PXP_OUT_AS_LRC_RSVD1_MASK (0xC0000000U) -#define PXP_OUT_AS_LRC_RSVD1_SHIFT (30U) -#define PXP_OUT_AS_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_OUT_AS_LRC_RSVD1_SHIFT)) & PXP_OUT_AS_LRC_RSVD1_MASK) -/*! @} */ - -/*! @name PS_CTRL - Processed Surface (PS) Control Register */ -/*! @{ */ - -#define PXP_PS_CTRL_FORMAT_MASK (0x1FU) -#define PXP_PS_CTRL_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00100..32-bit pixels (unpacked 24-bit format) - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - * 0b11110..16-bit pixels (3-plane format) - * 0b11111..16-bit pixels (3-plane format) - */ -#define PXP_PS_CTRL_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_FORMAT_SHIFT)) & PXP_PS_CTRL_FORMAT_MASK) - -#define PXP_PS_CTRL_WB_SWAP_MASK (0x20U) -#define PXP_PS_CTRL_WB_SWAP_SHIFT (5U) -#define PXP_PS_CTRL_WB_SWAP(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_WB_SWAP_SHIFT)) & PXP_PS_CTRL_WB_SWAP_MASK) - -#define PXP_PS_CTRL_RSVD0_MASK (0xC0U) -#define PXP_PS_CTRL_RSVD0_SHIFT (6U) -#define PXP_PS_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_RSVD0_SHIFT)) & PXP_PS_CTRL_RSVD0_MASK) - -#define PXP_PS_CTRL_DECY_MASK (0x300U) -#define PXP_PS_CTRL_DECY_SHIFT (8U) -/*! DECY - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_DECY(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_DECY_SHIFT)) & PXP_PS_CTRL_DECY_MASK) - -#define PXP_PS_CTRL_DECX_MASK (0xC00U) -#define PXP_PS_CTRL_DECX_SHIFT (10U) -/*! DECX - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_DECX(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_DECX_SHIFT)) & PXP_PS_CTRL_DECX_MASK) - -#define PXP_PS_CTRL_RSVD1_MASK (0xFFFFF000U) -#define PXP_PS_CTRL_RSVD1_SHIFT (12U) -#define PXP_PS_CTRL_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_RSVD1_SHIFT)) & PXP_PS_CTRL_RSVD1_MASK) -/*! @} */ - -/*! @name PS_CTRL_SET - Processed Surface (PS) Control Register */ -/*! @{ */ - -#define PXP_PS_CTRL_SET_FORMAT_MASK (0x1FU) -#define PXP_PS_CTRL_SET_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00100..32-bit pixels (unpacked 24-bit format) - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - * 0b11110..16-bit pixels (3-plane format) - * 0b11111..16-bit pixels (3-plane format) - */ -#define PXP_PS_CTRL_SET_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_FORMAT_SHIFT)) & PXP_PS_CTRL_SET_FORMAT_MASK) - -#define PXP_PS_CTRL_SET_WB_SWAP_MASK (0x20U) -#define PXP_PS_CTRL_SET_WB_SWAP_SHIFT (5U) -#define PXP_PS_CTRL_SET_WB_SWAP(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_WB_SWAP_SHIFT)) & PXP_PS_CTRL_SET_WB_SWAP_MASK) - -#define PXP_PS_CTRL_SET_RSVD0_MASK (0xC0U) -#define PXP_PS_CTRL_SET_RSVD0_SHIFT (6U) -#define PXP_PS_CTRL_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_RSVD0_SHIFT)) & PXP_PS_CTRL_SET_RSVD0_MASK) - -#define PXP_PS_CTRL_SET_DECY_MASK (0x300U) -#define PXP_PS_CTRL_SET_DECY_SHIFT (8U) -/*! DECY - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_SET_DECY(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_DECY_SHIFT)) & PXP_PS_CTRL_SET_DECY_MASK) - -#define PXP_PS_CTRL_SET_DECX_MASK (0xC00U) -#define PXP_PS_CTRL_SET_DECX_SHIFT (10U) -/*! DECX - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_SET_DECX(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_DECX_SHIFT)) & PXP_PS_CTRL_SET_DECX_MASK) - -#define PXP_PS_CTRL_SET_RSVD1_MASK (0xFFFFF000U) -#define PXP_PS_CTRL_SET_RSVD1_SHIFT (12U) -#define PXP_PS_CTRL_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_SET_RSVD1_SHIFT)) & PXP_PS_CTRL_SET_RSVD1_MASK) -/*! @} */ - -/*! @name PS_CTRL_CLR - Processed Surface (PS) Control Register */ -/*! @{ */ - -#define PXP_PS_CTRL_CLR_FORMAT_MASK (0x1FU) -#define PXP_PS_CTRL_CLR_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00100..32-bit pixels (unpacked 24-bit format) - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - * 0b11110..16-bit pixels (3-plane format) - * 0b11111..16-bit pixels (3-plane format) - */ -#define PXP_PS_CTRL_CLR_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_FORMAT_SHIFT)) & PXP_PS_CTRL_CLR_FORMAT_MASK) - -#define PXP_PS_CTRL_CLR_WB_SWAP_MASK (0x20U) -#define PXP_PS_CTRL_CLR_WB_SWAP_SHIFT (5U) -#define PXP_PS_CTRL_CLR_WB_SWAP(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_WB_SWAP_SHIFT)) & PXP_PS_CTRL_CLR_WB_SWAP_MASK) - -#define PXP_PS_CTRL_CLR_RSVD0_MASK (0xC0U) -#define PXP_PS_CTRL_CLR_RSVD0_SHIFT (6U) -#define PXP_PS_CTRL_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_RSVD0_SHIFT)) & PXP_PS_CTRL_CLR_RSVD0_MASK) - -#define PXP_PS_CTRL_CLR_DECY_MASK (0x300U) -#define PXP_PS_CTRL_CLR_DECY_SHIFT (8U) -/*! DECY - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_CLR_DECY(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_DECY_SHIFT)) & PXP_PS_CTRL_CLR_DECY_MASK) - -#define PXP_PS_CTRL_CLR_DECX_MASK (0xC00U) -#define PXP_PS_CTRL_CLR_DECX_SHIFT (10U) -/*! DECX - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_CLR_DECX(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_DECX_SHIFT)) & PXP_PS_CTRL_CLR_DECX_MASK) - -#define PXP_PS_CTRL_CLR_RSVD1_MASK (0xFFFFF000U) -#define PXP_PS_CTRL_CLR_RSVD1_SHIFT (12U) -#define PXP_PS_CTRL_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_CLR_RSVD1_SHIFT)) & PXP_PS_CTRL_CLR_RSVD1_MASK) -/*! @} */ - -/*! @name PS_CTRL_TOG - Processed Surface (PS) Control Register */ -/*! @{ */ - -#define PXP_PS_CTRL_TOG_FORMAT_MASK (0x1FU) -#define PXP_PS_CTRL_TOG_FORMAT_SHIFT (0U) -/*! FORMAT - * 0b00100..32-bit pixels (unpacked 24-bit format) - * 0b01100..16-bit pixels - * 0b01101..16-bit pixels - * 0b01110..16-bit pixels - * 0b10000..32-bit pixels (1-plane XYUV unpacked) - * 0b10010..16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) - * 0b10011..16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) - * 0b10100..8-bit monochrome pixels (1-plane Y luma output) - * 0b10101..4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) - * 0b11000..16-bit pixels (2-plane UV interleaved bytes) - * 0b11001..16-bit pixels (2-plane UV) - * 0b11010..16-bit pixels (2-plane VU interleaved bytes) - * 0b11011..16-bit pixels (2-plane VU) - * 0b11110..16-bit pixels (3-plane format) - * 0b11111..16-bit pixels (3-plane format) - */ -#define PXP_PS_CTRL_TOG_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_FORMAT_SHIFT)) & PXP_PS_CTRL_TOG_FORMAT_MASK) - -#define PXP_PS_CTRL_TOG_WB_SWAP_MASK (0x20U) -#define PXP_PS_CTRL_TOG_WB_SWAP_SHIFT (5U) -#define PXP_PS_CTRL_TOG_WB_SWAP(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_WB_SWAP_SHIFT)) & PXP_PS_CTRL_TOG_WB_SWAP_MASK) - -#define PXP_PS_CTRL_TOG_RSVD0_MASK (0xC0U) -#define PXP_PS_CTRL_TOG_RSVD0_SHIFT (6U) -#define PXP_PS_CTRL_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_RSVD0_SHIFT)) & PXP_PS_CTRL_TOG_RSVD0_MASK) - -#define PXP_PS_CTRL_TOG_DECY_MASK (0x300U) -#define PXP_PS_CTRL_TOG_DECY_SHIFT (8U) -/*! DECY - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_TOG_DECY(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_DECY_SHIFT)) & PXP_PS_CTRL_TOG_DECY_MASK) - -#define PXP_PS_CTRL_TOG_DECX_MASK (0xC00U) -#define PXP_PS_CTRL_TOG_DECX_SHIFT (10U) -/*! DECX - * 0b00..Disable pre-decimation filter. - * 0b01..Decimate PS by 2. - * 0b10..Decimate PS by 4. - * 0b11..Decimate PS by 8. - */ -#define PXP_PS_CTRL_TOG_DECX(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_DECX_SHIFT)) & PXP_PS_CTRL_TOG_DECX_MASK) - -#define PXP_PS_CTRL_TOG_RSVD1_MASK (0xFFFFF000U) -#define PXP_PS_CTRL_TOG_RSVD1_SHIFT (12U) -#define PXP_PS_CTRL_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CTRL_TOG_RSVD1_SHIFT)) & PXP_PS_CTRL_TOG_RSVD1_MASK) -/*! @} */ - -/*! @name PS_BUF - PS Input Buffer Address */ -/*! @{ */ - -#define PXP_PS_BUF_ADDR_MASK (0xFFFFFFFFU) -#define PXP_PS_BUF_ADDR_SHIFT (0U) -#define PXP_PS_BUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_BUF_ADDR_SHIFT)) & PXP_PS_BUF_ADDR_MASK) -/*! @} */ - -/*! @name PS_UBUF - PS U/Cb or 2 Plane UV Input Buffer Address */ -/*! @{ */ - -#define PXP_PS_UBUF_ADDR_MASK (0xFFFFFFFFU) -#define PXP_PS_UBUF_ADDR_SHIFT (0U) -#define PXP_PS_UBUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_UBUF_ADDR_SHIFT)) & PXP_PS_UBUF_ADDR_MASK) -/*! @} */ - -/*! @name PS_VBUF - PS V/Cr Input Buffer Address */ -/*! @{ */ - -#define PXP_PS_VBUF_ADDR_MASK (0xFFFFFFFFU) -#define PXP_PS_VBUF_ADDR_SHIFT (0U) -#define PXP_PS_VBUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_VBUF_ADDR_SHIFT)) & PXP_PS_VBUF_ADDR_MASK) -/*! @} */ - -/*! @name PS_PITCH - Processed Surface Pitch */ -/*! @{ */ - -#define PXP_PS_PITCH_PITCH_MASK (0xFFFFU) -#define PXP_PS_PITCH_PITCH_SHIFT (0U) -#define PXP_PS_PITCH_PITCH(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_PITCH_PITCH_SHIFT)) & PXP_PS_PITCH_PITCH_MASK) - -#define PXP_PS_PITCH_RSVD_MASK (0xFFFF0000U) -#define PXP_PS_PITCH_RSVD_SHIFT (16U) -#define PXP_PS_PITCH_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_PITCH_RSVD_SHIFT)) & PXP_PS_PITCH_RSVD_MASK) -/*! @} */ - -/*! @name PS_BACKGROUND - PS Background Color */ -/*! @{ */ - -#define PXP_PS_BACKGROUND_COLOR_MASK (0xFFFFFFU) -#define PXP_PS_BACKGROUND_COLOR_SHIFT (0U) -#define PXP_PS_BACKGROUND_COLOR(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_BACKGROUND_COLOR_SHIFT)) & PXP_PS_BACKGROUND_COLOR_MASK) - -#define PXP_PS_BACKGROUND_RSVD_MASK (0xFF000000U) -#define PXP_PS_BACKGROUND_RSVD_SHIFT (24U) -#define PXP_PS_BACKGROUND_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_BACKGROUND_RSVD_SHIFT)) & PXP_PS_BACKGROUND_RSVD_MASK) -/*! @} */ - -/*! @name PS_SCALE - PS Scale Factor Register */ -/*! @{ */ - -#define PXP_PS_SCALE_XSCALE_MASK (0x7FFFU) -#define PXP_PS_SCALE_XSCALE_SHIFT (0U) -#define PXP_PS_SCALE_XSCALE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_SCALE_XSCALE_SHIFT)) & PXP_PS_SCALE_XSCALE_MASK) - -#define PXP_PS_SCALE_RSVD1_MASK (0x8000U) -#define PXP_PS_SCALE_RSVD1_SHIFT (15U) -#define PXP_PS_SCALE_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_SCALE_RSVD1_SHIFT)) & PXP_PS_SCALE_RSVD1_MASK) - -#define PXP_PS_SCALE_YSCALE_MASK (0x7FFF0000U) -#define PXP_PS_SCALE_YSCALE_SHIFT (16U) -#define PXP_PS_SCALE_YSCALE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_SCALE_YSCALE_SHIFT)) & PXP_PS_SCALE_YSCALE_MASK) - -#define PXP_PS_SCALE_RSVD2_MASK (0x80000000U) -#define PXP_PS_SCALE_RSVD2_SHIFT (31U) -#define PXP_PS_SCALE_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_SCALE_RSVD2_SHIFT)) & PXP_PS_SCALE_RSVD2_MASK) -/*! @} */ - -/*! @name PS_OFFSET - PS Scale Offset Register */ -/*! @{ */ - -#define PXP_PS_OFFSET_XOFFSET_MASK (0xFFFU) -#define PXP_PS_OFFSET_XOFFSET_SHIFT (0U) -#define PXP_PS_OFFSET_XOFFSET(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_OFFSET_XOFFSET_SHIFT)) & PXP_PS_OFFSET_XOFFSET_MASK) - -#define PXP_PS_OFFSET_RSVD1_MASK (0xF000U) -#define PXP_PS_OFFSET_RSVD1_SHIFT (12U) -#define PXP_PS_OFFSET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_OFFSET_RSVD1_SHIFT)) & PXP_PS_OFFSET_RSVD1_MASK) - -#define PXP_PS_OFFSET_YOFFSET_MASK (0xFFF0000U) -#define PXP_PS_OFFSET_YOFFSET_SHIFT (16U) -#define PXP_PS_OFFSET_YOFFSET(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_OFFSET_YOFFSET_SHIFT)) & PXP_PS_OFFSET_YOFFSET_MASK) - -#define PXP_PS_OFFSET_RSVD2_MASK (0xF0000000U) -#define PXP_PS_OFFSET_RSVD2_SHIFT (28U) -#define PXP_PS_OFFSET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_OFFSET_RSVD2_SHIFT)) & PXP_PS_OFFSET_RSVD2_MASK) -/*! @} */ - -/*! @name PS_CLRKEYLOW - PS Color Key Low */ -/*! @{ */ - -#define PXP_PS_CLRKEYLOW_PIXEL_MASK (0xFFFFFFU) -#define PXP_PS_CLRKEYLOW_PIXEL_SHIFT (0U) -#define PXP_PS_CLRKEYLOW_PIXEL(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CLRKEYLOW_PIXEL_SHIFT)) & PXP_PS_CLRKEYLOW_PIXEL_MASK) - -#define PXP_PS_CLRKEYLOW_RSVD1_MASK (0xFF000000U) -#define PXP_PS_CLRKEYLOW_RSVD1_SHIFT (24U) -#define PXP_PS_CLRKEYLOW_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CLRKEYLOW_RSVD1_SHIFT)) & PXP_PS_CLRKEYLOW_RSVD1_MASK) -/*! @} */ - -/*! @name PS_CLRKEYHIGH - PS Color Key High */ -/*! @{ */ - -#define PXP_PS_CLRKEYHIGH_PIXEL_MASK (0xFFFFFFU) -#define PXP_PS_CLRKEYHIGH_PIXEL_SHIFT (0U) -#define PXP_PS_CLRKEYHIGH_PIXEL(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CLRKEYHIGH_PIXEL_SHIFT)) & PXP_PS_CLRKEYHIGH_PIXEL_MASK) - -#define PXP_PS_CLRKEYHIGH_RSVD1_MASK (0xFF000000U) -#define PXP_PS_CLRKEYHIGH_RSVD1_SHIFT (24U) -#define PXP_PS_CLRKEYHIGH_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_PS_CLRKEYHIGH_RSVD1_SHIFT)) & PXP_PS_CLRKEYHIGH_RSVD1_MASK) -/*! @} */ - -/*! @name AS_CTRL - Alpha Surface Control */ -/*! @{ */ - -#define PXP_AS_CTRL_RSVD0_MASK (0x1U) -#define PXP_AS_CTRL_RSVD0_SHIFT (0U) -#define PXP_AS_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_RSVD0_SHIFT)) & PXP_AS_CTRL_RSVD0_MASK) - -#define PXP_AS_CTRL_ALPHA_CTRL_MASK (0x6U) -#define PXP_AS_CTRL_ALPHA_CTRL_SHIFT (1U) -/*! ALPHA_CTRL - * 0b00..Indicates that the AS pixel alpha value will be used to blend the AS with PS. The ALPHA field is ignored. - * 0b01..Indicates that the value in the ALPHA field should be used instead of the alpha values present in the input pixels. - * 0b10..Indicates that the value in the ALPHA field should be used to scale all pixel alpha values. Each pixel - * alpha is multiplied by the value in the ALPHA field. - * 0b11..Enable ROPs. The ROP field indicates an operation to be performed on the alpha surface and PS pixels. - */ -#define PXP_AS_CTRL_ALPHA_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_ALPHA_CTRL_SHIFT)) & PXP_AS_CTRL_ALPHA_CTRL_MASK) - -#define PXP_AS_CTRL_ENABLE_COLORKEY_MASK (0x8U) -#define PXP_AS_CTRL_ENABLE_COLORKEY_SHIFT (3U) -#define PXP_AS_CTRL_ENABLE_COLORKEY(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_ENABLE_COLORKEY_SHIFT)) & PXP_AS_CTRL_ENABLE_COLORKEY_MASK) - -#define PXP_AS_CTRL_FORMAT_MASK (0xF0U) -#define PXP_AS_CTRL_FORMAT_SHIFT (4U) -/*! FORMAT - * 0b0000..32-bit pixels with alpha - * 0b0100..32-bit pixels without alpha (unpacked 24-bit format) - * 0b1000..16-bit pixels with alpha - * 0b1001..16-bit pixels with alpha - * 0b1100..16-bit pixels without alpha - * 0b1101..16-bit pixels without alpha - * 0b1110..16-bit pixels without alpha - */ -#define PXP_AS_CTRL_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_FORMAT_SHIFT)) & PXP_AS_CTRL_FORMAT_MASK) - -#define PXP_AS_CTRL_ALPHA_MASK (0xFF00U) -#define PXP_AS_CTRL_ALPHA_SHIFT (8U) -#define PXP_AS_CTRL_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_ALPHA_SHIFT)) & PXP_AS_CTRL_ALPHA_MASK) - -#define PXP_AS_CTRL_ROP_MASK (0xF0000U) -#define PXP_AS_CTRL_ROP_SHIFT (16U) -/*! ROP - * 0b0000..AS AND PS - * 0b0001..nAS AND PS - * 0b0010..AS AND nPS - * 0b0011..AS OR PS - * 0b0100..nAS OR PS - * 0b0101..AS OR nPS - * 0b0110..nAS - * 0b0111..nPS - * 0b1000..AS NAND PS - * 0b1001..AS NOR PS - * 0b1010..AS XOR PS - * 0b1011..AS XNOR PS - */ -#define PXP_AS_CTRL_ROP(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_ROP_SHIFT)) & PXP_AS_CTRL_ROP_MASK) - -#define PXP_AS_CTRL_ALPHA_INVERT_MASK (0x100000U) -#define PXP_AS_CTRL_ALPHA_INVERT_SHIFT (20U) -#define PXP_AS_CTRL_ALPHA_INVERT(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_ALPHA_INVERT_SHIFT)) & PXP_AS_CTRL_ALPHA_INVERT_MASK) - -#define PXP_AS_CTRL_RSVD1_MASK (0xFFE00000U) -#define PXP_AS_CTRL_RSVD1_SHIFT (21U) -#define PXP_AS_CTRL_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CTRL_RSVD1_SHIFT)) & PXP_AS_CTRL_RSVD1_MASK) -/*! @} */ - -/*! @name AS_BUF - Alpha Surface Buffer Pointer */ -/*! @{ */ - -#define PXP_AS_BUF_ADDR_MASK (0xFFFFFFFFU) -#define PXP_AS_BUF_ADDR_SHIFT (0U) -#define PXP_AS_BUF_ADDR(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_BUF_ADDR_SHIFT)) & PXP_AS_BUF_ADDR_MASK) -/*! @} */ - -/*! @name AS_PITCH - Alpha Surface Pitch */ -/*! @{ */ - -#define PXP_AS_PITCH_PITCH_MASK (0xFFFFU) -#define PXP_AS_PITCH_PITCH_SHIFT (0U) -#define PXP_AS_PITCH_PITCH(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_PITCH_PITCH_SHIFT)) & PXP_AS_PITCH_PITCH_MASK) - -#define PXP_AS_PITCH_RSVD_MASK (0xFFFF0000U) -#define PXP_AS_PITCH_RSVD_SHIFT (16U) -#define PXP_AS_PITCH_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_PITCH_RSVD_SHIFT)) & PXP_AS_PITCH_RSVD_MASK) -/*! @} */ - -/*! @name AS_CLRKEYLOW - Overlay Color Key Low */ -/*! @{ */ - -#define PXP_AS_CLRKEYLOW_PIXEL_MASK (0xFFFFFFU) -#define PXP_AS_CLRKEYLOW_PIXEL_SHIFT (0U) -#define PXP_AS_CLRKEYLOW_PIXEL(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CLRKEYLOW_PIXEL_SHIFT)) & PXP_AS_CLRKEYLOW_PIXEL_MASK) - -#define PXP_AS_CLRKEYLOW_RSVD1_MASK (0xFF000000U) -#define PXP_AS_CLRKEYLOW_RSVD1_SHIFT (24U) -#define PXP_AS_CLRKEYLOW_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CLRKEYLOW_RSVD1_SHIFT)) & PXP_AS_CLRKEYLOW_RSVD1_MASK) -/*! @} */ - -/*! @name AS_CLRKEYHIGH - Overlay Color Key High */ -/*! @{ */ - -#define PXP_AS_CLRKEYHIGH_PIXEL_MASK (0xFFFFFFU) -#define PXP_AS_CLRKEYHIGH_PIXEL_SHIFT (0U) -#define PXP_AS_CLRKEYHIGH_PIXEL(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CLRKEYHIGH_PIXEL_SHIFT)) & PXP_AS_CLRKEYHIGH_PIXEL_MASK) - -#define PXP_AS_CLRKEYHIGH_RSVD1_MASK (0xFF000000U) -#define PXP_AS_CLRKEYHIGH_RSVD1_SHIFT (24U) -#define PXP_AS_CLRKEYHIGH_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_AS_CLRKEYHIGH_RSVD1_SHIFT)) & PXP_AS_CLRKEYHIGH_RSVD1_MASK) -/*! @} */ - -/*! @name CSC1_COEF0 - Color Space Conversion Coefficient Register 0 */ -/*! @{ */ - -#define PXP_CSC1_COEF0_Y_OFFSET_MASK (0x1FFU) -#define PXP_CSC1_COEF0_Y_OFFSET_SHIFT (0U) -#define PXP_CSC1_COEF0_Y_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_Y_OFFSET_SHIFT)) & PXP_CSC1_COEF0_Y_OFFSET_MASK) - -#define PXP_CSC1_COEF0_UV_OFFSET_MASK (0x3FE00U) -#define PXP_CSC1_COEF0_UV_OFFSET_SHIFT (9U) -#define PXP_CSC1_COEF0_UV_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_UV_OFFSET_SHIFT)) & PXP_CSC1_COEF0_UV_OFFSET_MASK) - -#define PXP_CSC1_COEF0_C0_MASK (0x1FFC0000U) -#define PXP_CSC1_COEF0_C0_SHIFT (18U) -#define PXP_CSC1_COEF0_C0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_C0_SHIFT)) & PXP_CSC1_COEF0_C0_MASK) - -#define PXP_CSC1_COEF0_RSVD1_MASK (0x20000000U) -#define PXP_CSC1_COEF0_RSVD1_SHIFT (29U) -#define PXP_CSC1_COEF0_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_RSVD1_SHIFT)) & PXP_CSC1_COEF0_RSVD1_MASK) - -#define PXP_CSC1_COEF0_BYPASS_MASK (0x40000000U) -#define PXP_CSC1_COEF0_BYPASS_SHIFT (30U) -#define PXP_CSC1_COEF0_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_BYPASS_SHIFT)) & PXP_CSC1_COEF0_BYPASS_MASK) - -#define PXP_CSC1_COEF0_YCBCR_MODE_MASK (0x80000000U) -#define PXP_CSC1_COEF0_YCBCR_MODE_SHIFT (31U) -#define PXP_CSC1_COEF0_YCBCR_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF0_YCBCR_MODE_SHIFT)) & PXP_CSC1_COEF0_YCBCR_MODE_MASK) -/*! @} */ - -/*! @name CSC1_COEF1 - Color Space Conversion Coefficient Register 1 */ -/*! @{ */ - -#define PXP_CSC1_COEF1_C4_MASK (0x7FFU) -#define PXP_CSC1_COEF1_C4_SHIFT (0U) -#define PXP_CSC1_COEF1_C4(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF1_C4_SHIFT)) & PXP_CSC1_COEF1_C4_MASK) - -#define PXP_CSC1_COEF1_RSVD0_MASK (0xF800U) -#define PXP_CSC1_COEF1_RSVD0_SHIFT (11U) -#define PXP_CSC1_COEF1_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF1_RSVD0_SHIFT)) & PXP_CSC1_COEF1_RSVD0_MASK) - -#define PXP_CSC1_COEF1_C1_MASK (0x7FF0000U) -#define PXP_CSC1_COEF1_C1_SHIFT (16U) -#define PXP_CSC1_COEF1_C1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF1_C1_SHIFT)) & PXP_CSC1_COEF1_C1_MASK) - -#define PXP_CSC1_COEF1_RSVD1_MASK (0xF8000000U) -#define PXP_CSC1_COEF1_RSVD1_SHIFT (27U) -#define PXP_CSC1_COEF1_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF1_RSVD1_SHIFT)) & PXP_CSC1_COEF1_RSVD1_MASK) -/*! @} */ - -/*! @name CSC1_COEF2 - Color Space Conversion Coefficient Register 2 */ -/*! @{ */ - -#define PXP_CSC1_COEF2_C3_MASK (0x7FFU) -#define PXP_CSC1_COEF2_C3_SHIFT (0U) -#define PXP_CSC1_COEF2_C3(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF2_C3_SHIFT)) & PXP_CSC1_COEF2_C3_MASK) - -#define PXP_CSC1_COEF2_RSVD0_MASK (0xF800U) -#define PXP_CSC1_COEF2_RSVD0_SHIFT (11U) -#define PXP_CSC1_COEF2_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF2_RSVD0_SHIFT)) & PXP_CSC1_COEF2_RSVD0_MASK) - -#define PXP_CSC1_COEF2_C2_MASK (0x7FF0000U) -#define PXP_CSC1_COEF2_C2_SHIFT (16U) -#define PXP_CSC1_COEF2_C2(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF2_C2_SHIFT)) & PXP_CSC1_COEF2_C2_MASK) - -#define PXP_CSC1_COEF2_RSVD1_MASK (0xF8000000U) -#define PXP_CSC1_COEF2_RSVD1_SHIFT (27U) -#define PXP_CSC1_COEF2_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << PXP_CSC1_COEF2_RSVD1_SHIFT)) & PXP_CSC1_COEF2_RSVD1_MASK) -/*! @} */ - -/*! @name POWER - PXP Power Control Register */ -/*! @{ */ - -#define PXP_POWER_ROT_MEM_LP_STATE_MASK (0xE00U) -#define PXP_POWER_ROT_MEM_LP_STATE_SHIFT (9U) -/*! ROT_MEM_LP_STATE - * 0b000..Memory is not in low power state. - * 0b001..Light Sleep Mode. Low leakage mode, maintain memory contents. - * 0b010..Deep Sleep Mode. Low leakage mode, maintain memory contents. - * 0b100..Shut Down Mode. Shut Down periphery and core, no memory retention. - */ -#define PXP_POWER_ROT_MEM_LP_STATE(x) (((uint32_t)(((uint32_t)(x)) << PXP_POWER_ROT_MEM_LP_STATE_SHIFT)) & PXP_POWER_ROT_MEM_LP_STATE_MASK) - -#define PXP_POWER_CTRL_MASK (0xFFFFF000U) -#define PXP_POWER_CTRL_SHIFT (12U) -#define PXP_POWER_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PXP_POWER_CTRL_SHIFT)) & PXP_POWER_CTRL_MASK) -/*! @} */ - -/*! @name NEXT - Next Frame Pointer */ -/*! @{ */ - -#define PXP_NEXT_ENABLED_MASK (0x1U) -#define PXP_NEXT_ENABLED_SHIFT (0U) -#define PXP_NEXT_ENABLED(x) (((uint32_t)(((uint32_t)(x)) << PXP_NEXT_ENABLED_SHIFT)) & PXP_NEXT_ENABLED_MASK) - -#define PXP_NEXT_RSVD_MASK (0x2U) -#define PXP_NEXT_RSVD_SHIFT (1U) -#define PXP_NEXT_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PXP_NEXT_RSVD_SHIFT)) & PXP_NEXT_RSVD_MASK) - -#define PXP_NEXT_POINTER_MASK (0xFFFFFFFCU) -#define PXP_NEXT_POINTER_SHIFT (2U) -#define PXP_NEXT_POINTER(x) (((uint32_t)(((uint32_t)(x)) << PXP_NEXT_POINTER_SHIFT)) & PXP_NEXT_POINTER_MASK) -/*! @} */ - -/*! @name PORTER_DUFF_CTRL - PXP Alpha Engine A Control Register. */ -/*! @{ */ - -#define PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_MASK (0x1U) -#define PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_SHIFT (0U) -#define PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_SHIFT)) & PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE_MASK (0x6U) -#define PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE_SHIFT (1U) -#define PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE_MASK (0x18U) -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE_SHIFT (3U) -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE_MASK (0x20U) -#define PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE_SHIFT (5U) -#define PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE_MASK (0x40U) -#define PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE_SHIFT (6U) -#define PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE_MASK (0x300U) -#define PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE_SHIFT (8U) -#define PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE_MASK (0xC00U) -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE_SHIFT (10U) -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE_MASK (0x1000U) -#define PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE_SHIFT (12U) -#define PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE_MASK (0x2000U) -#define PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE_SHIFT (13U) -#define PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE_SHIFT)) & PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE_MASK) - -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MASK (0xFF0000U) -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_SHIFT (16U) -#define PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_SHIFT)) & PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MASK) - -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MASK (0xFF000000U) -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_SHIFT (24U) -#define PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_SHIFT)) & PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group PXP_Register_Masks */ - - -/* PXP - Peripheral instance base addresses */ -/** Peripheral PXP base address */ -#define PXP_BASE (0x402B4000u) -/** Peripheral PXP base pointer */ -#define PXP ((PXP_Type *)PXP_BASE) -/** Array initializer of PXP peripheral base addresses */ -#define PXP_BASE_ADDRS { PXP_BASE } -/** Array initializer of PXP peripheral base pointers */ -#define PXP_BASE_PTRS { PXP } -/** Interrupt vectors for the PXP peripheral type */ -#define PXP_IRQ0_IRQS { PXP_IRQn } - -/*! - * @} - */ /* end of group PXP_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- ROMC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ROMC_Peripheral_Access_Layer ROMC Peripheral Access Layer - * @{ - */ - -/** ROMC - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[212]; - __IO uint32_t ROMPATCHD[8]; /**< ROMC Data Registers, array offset: 0xD4, array step: 0x4 */ - __IO uint32_t ROMPATCHCNTL; /**< ROMC Control Register, offset: 0xF4 */ - uint32_t ROMPATCHENH; /**< ROMC Enable Register High, offset: 0xF8 */ - __IO uint32_t ROMPATCHENL; /**< ROMC Enable Register Low, offset: 0xFC */ - __IO uint32_t ROMPATCHA[16]; /**< ROMC Address Registers, array offset: 0x100, array step: 0x4 */ - uint8_t RESERVED_1[200]; - __IO uint32_t ROMPATCHSR; /**< ROMC Status Register, offset: 0x208 */ -} ROMC_Type; - -/* ---------------------------------------------------------------------------- - -- ROMC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup ROMC_Register_Masks ROMC Register Masks - * @{ - */ - -/*! @name ROMPATCHD - ROMC Data Registers */ -/*! @{ */ - -#define ROMC_ROMPATCHD_DATAX_MASK (0xFFFFFFFFU) -#define ROMC_ROMPATCHD_DATAX_SHIFT (0U) -#define ROMC_ROMPATCHD_DATAX(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHD_DATAX_SHIFT)) & ROMC_ROMPATCHD_DATAX_MASK) -/*! @} */ - -/* The count of ROMC_ROMPATCHD */ -#define ROMC_ROMPATCHD_COUNT (8U) - -/*! @name ROMPATCHCNTL - ROMC Control Register */ -/*! @{ */ - -#define ROMC_ROMPATCHCNTL_DATAFIX_MASK (0xFFU) -#define ROMC_ROMPATCHCNTL_DATAFIX_SHIFT (0U) -/*! DATAFIX - * 0b00000000..Address comparator triggers a opcode patch - * 0b00000001..Address comparator triggers a data fix - */ -#define ROMC_ROMPATCHCNTL_DATAFIX(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHCNTL_DATAFIX_SHIFT)) & ROMC_ROMPATCHCNTL_DATAFIX_MASK) - -#define ROMC_ROMPATCHCNTL_DIS_MASK (0x20000000U) -#define ROMC_ROMPATCHCNTL_DIS_SHIFT (29U) -/*! DIS - * 0b0..Does not affect any ROMC functions (default) - * 0b1..Disable all ROMC functions: data fixing, and opcode patching - */ -#define ROMC_ROMPATCHCNTL_DIS(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHCNTL_DIS_SHIFT)) & ROMC_ROMPATCHCNTL_DIS_MASK) -/*! @} */ - -/*! @name ROMPATCHENL - ROMC Enable Register Low */ -/*! @{ */ - -#define ROMC_ROMPATCHENL_ENABLE_MASK (0xFFFFU) -#define ROMC_ROMPATCHENL_ENABLE_SHIFT (0U) -/*! ENABLE - * 0b0000000000000000..Address comparator disabled - * 0b0000000000000001..Address comparator enabled, ROMC will trigger a opcode patch or data fix event upon matching of the associated address - */ -#define ROMC_ROMPATCHENL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHENL_ENABLE_SHIFT)) & ROMC_ROMPATCHENL_ENABLE_MASK) -/*! @} */ - -/*! @name ROMPATCHA - ROMC Address Registers */ -/*! @{ */ - -#define ROMC_ROMPATCHA_THUMBX_MASK (0x1U) -#define ROMC_ROMPATCHA_THUMBX_SHIFT (0U) -/*! THUMBX - * 0b0..Arm patch - * 0b1..THUMB patch (ignore if data fix) - */ -#define ROMC_ROMPATCHA_THUMBX(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHA_THUMBX_SHIFT)) & ROMC_ROMPATCHA_THUMBX_MASK) - -#define ROMC_ROMPATCHA_ADDRX_MASK (0x7FFFFEU) -#define ROMC_ROMPATCHA_ADDRX_SHIFT (1U) -#define ROMC_ROMPATCHA_ADDRX(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHA_ADDRX_SHIFT)) & ROMC_ROMPATCHA_ADDRX_MASK) -/*! @} */ - -/* The count of ROMC_ROMPATCHA */ -#define ROMC_ROMPATCHA_COUNT (16U) - -/*! @name ROMPATCHSR - ROMC Status Register */ -/*! @{ */ - -#define ROMC_ROMPATCHSR_SOURCE_MASK (0x3FU) -#define ROMC_ROMPATCHSR_SOURCE_SHIFT (0U) -/*! SOURCE - * 0b000000..Address Comparator 0 matched - * 0b000001..Address Comparator 1 matched - * 0b001111..Address Comparator 15 matched - */ -#define ROMC_ROMPATCHSR_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHSR_SOURCE_SHIFT)) & ROMC_ROMPATCHSR_SOURCE_MASK) - -#define ROMC_ROMPATCHSR_SW_MASK (0x20000U) -#define ROMC_ROMPATCHSR_SW_SHIFT (17U) -/*! SW - * 0b0..no event or comparator collisions - * 0b1..a collision has occurred - */ -#define ROMC_ROMPATCHSR_SW(x) (((uint32_t)(((uint32_t)(x)) << ROMC_ROMPATCHSR_SW_SHIFT)) & ROMC_ROMPATCHSR_SW_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group ROMC_Register_Masks */ - - -/* ROMC - Peripheral instance base addresses */ -/** Peripheral ROMC base address */ -#define ROMC_BASE (0x40180000u) -/** Peripheral ROMC base pointer */ -#define ROMC ((ROMC_Type *)ROMC_BASE) -/** Array initializer of ROMC peripheral base addresses */ -#define ROMC_BASE_ADDRS { ROMC_BASE } -/** Array initializer of ROMC peripheral base pointers */ -#define ROMC_BASE_PTRS { ROMC } - -/*! - * @} - */ /* end of group ROMC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- RTWDOG Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup RTWDOG_Peripheral_Access_Layer RTWDOG Peripheral Access Layer - * @{ - */ - -/** RTWDOG - Register Layout Typedef */ -typedef struct { - __IO uint32_t CS; /**< Watchdog Control and Status Register, offset: 0x0 */ - __IO uint32_t CNT; /**< Watchdog Counter Register, offset: 0x4 */ - __IO uint32_t TOVAL; /**< Watchdog Timeout Value Register, offset: 0x8 */ - __IO uint32_t WIN; /**< Watchdog Window Register, offset: 0xC */ -} RTWDOG_Type; - -/* ---------------------------------------------------------------------------- - -- RTWDOG Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup RTWDOG_Register_Masks RTWDOG Register Masks - * @{ - */ - -/*! @name CS - Watchdog Control and Status Register */ -/*! @{ */ - -#define RTWDOG_CS_STOP_MASK (0x1U) -#define RTWDOG_CS_STOP_SHIFT (0U) -/*! STOP - Stop Enable - * 0b0..Watchdog disabled in chip stop mode. - * 0b1..Watchdog enabled in chip stop mode. - */ -#define RTWDOG_CS_STOP(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_STOP_SHIFT)) & RTWDOG_CS_STOP_MASK) - -#define RTWDOG_CS_WAIT_MASK (0x2U) -#define RTWDOG_CS_WAIT_SHIFT (1U) -/*! WAIT - Wait Enable - * 0b0..Watchdog disabled in chip wait mode. - * 0b1..Watchdog enabled in chip wait mode. - */ -#define RTWDOG_CS_WAIT(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_WAIT_SHIFT)) & RTWDOG_CS_WAIT_MASK) - -#define RTWDOG_CS_DBG_MASK (0x4U) -#define RTWDOG_CS_DBG_SHIFT (2U) -/*! DBG - Debug Enable - * 0b0..Watchdog disabled in chip debug mode. - * 0b1..Watchdog enabled in chip debug mode. - */ -#define RTWDOG_CS_DBG(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_DBG_SHIFT)) & RTWDOG_CS_DBG_MASK) - -#define RTWDOG_CS_TST_MASK (0x18U) -#define RTWDOG_CS_TST_SHIFT (3U) -/*! TST - Watchdog Test - * 0b00..Watchdog test mode disabled. - * 0b01..Watchdog user mode enabled. (Watchdog test mode disabled.) After testing the watchdog, software should - * use this setting to indicate that the watchdog is functioning normally in user mode. - * 0b10..Watchdog test mode enabled, only the low byte is used. CNT[CNTLOW] is compared with TOVAL[TOVALLOW]. - * 0b11..Watchdog test mode enabled, only the high byte is used. CNT[CNTHIGH] is compared with TOVAL[TOVALHIGH]. - */ -#define RTWDOG_CS_TST(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_TST_SHIFT)) & RTWDOG_CS_TST_MASK) - -#define RTWDOG_CS_UPDATE_MASK (0x20U) -#define RTWDOG_CS_UPDATE_SHIFT (5U) -/*! UPDATE - Allow updates - * 0b0..Updates not allowed. After the initial configuration, the watchdog cannot be later modified without forcing a reset. - * 0b1..Updates allowed. Software can modify the watchdog configuration registers within 128 bus clocks after performing the unlock write sequence. - */ -#define RTWDOG_CS_UPDATE(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_UPDATE_SHIFT)) & RTWDOG_CS_UPDATE_MASK) - -#define RTWDOG_CS_INT_MASK (0x40U) -#define RTWDOG_CS_INT_SHIFT (6U) -/*! INT - Watchdog Interrupt - * 0b0..Watchdog interrupts are disabled. Watchdog resets are not delayed. - * 0b1..Watchdog interrupts are enabled. Watchdog resets are delayed by 128 bus clocks from the interrupt vector fetch. - */ -#define RTWDOG_CS_INT(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_INT_SHIFT)) & RTWDOG_CS_INT_MASK) - -#define RTWDOG_CS_EN_MASK (0x80U) -#define RTWDOG_CS_EN_SHIFT (7U) -/*! EN - Watchdog Enable - * 0b0..Watchdog disabled. - * 0b1..Watchdog enabled. - */ -#define RTWDOG_CS_EN(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_EN_SHIFT)) & RTWDOG_CS_EN_MASK) - -#define RTWDOG_CS_CLK_MASK (0x300U) -#define RTWDOG_CS_CLK_SHIFT (8U) -/*! CLK - Watchdog Clock - * 0b00..Bus clock - * 0b01..LPO clock - * 0b10..INTCLK (internal clock) - * 0b11..ERCLK (external reference clock) - */ -#define RTWDOG_CS_CLK(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_CLK_SHIFT)) & RTWDOG_CS_CLK_MASK) - -#define RTWDOG_CS_RCS_MASK (0x400U) -#define RTWDOG_CS_RCS_SHIFT (10U) -/*! RCS - Reconfiguration Success - * 0b0..Reconfiguring WDOG. - * 0b1..Reconfiguration is successful. - */ -#define RTWDOG_CS_RCS(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_RCS_SHIFT)) & RTWDOG_CS_RCS_MASK) - -#define RTWDOG_CS_ULK_MASK (0x800U) -#define RTWDOG_CS_ULK_SHIFT (11U) -/*! ULK - Unlock status - * 0b0..WDOG is locked. - * 0b1..WDOG is unlocked. - */ -#define RTWDOG_CS_ULK(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_ULK_SHIFT)) & RTWDOG_CS_ULK_MASK) - -#define RTWDOG_CS_PRES_MASK (0x1000U) -#define RTWDOG_CS_PRES_SHIFT (12U) -/*! PRES - Watchdog prescaler - * 0b0..256 prescaler disabled. - * 0b1..256 prescaler enabled. - */ -#define RTWDOG_CS_PRES(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_PRES_SHIFT)) & RTWDOG_CS_PRES_MASK) - -#define RTWDOG_CS_CMD32EN_MASK (0x2000U) -#define RTWDOG_CS_CMD32EN_SHIFT (13U) -/*! CMD32EN - Enables or disables WDOG support for 32-bit (otherwise 16-bit or 8-bit) refresh/unlock command write words - * 0b0..Disables support for 32-bit refresh/unlock command write words. Only 16-bit or 8-bit is supported. - * 0b1..Enables support for 32-bit refresh/unlock command write words. 16-bit or 8-bit is NOT supported. - */ -#define RTWDOG_CS_CMD32EN(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_CMD32EN_SHIFT)) & RTWDOG_CS_CMD32EN_MASK) - -#define RTWDOG_CS_FLG_MASK (0x4000U) -#define RTWDOG_CS_FLG_SHIFT (14U) -/*! FLG - Watchdog Interrupt Flag - * 0b0..No interrupt occurred. - * 0b1..An interrupt occurred. - */ -#define RTWDOG_CS_FLG(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_FLG_SHIFT)) & RTWDOG_CS_FLG_MASK) - -#define RTWDOG_CS_WIN_MASK (0x8000U) -#define RTWDOG_CS_WIN_SHIFT (15U) -/*! WIN - Watchdog Window - * 0b0..Window mode disabled. - * 0b1..Window mode enabled. - */ -#define RTWDOG_CS_WIN(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CS_WIN_SHIFT)) & RTWDOG_CS_WIN_MASK) -/*! @} */ - -/*! @name CNT - Watchdog Counter Register */ -/*! @{ */ - -#define RTWDOG_CNT_CNTLOW_MASK (0xFFU) -#define RTWDOG_CNT_CNTLOW_SHIFT (0U) -/*! CNTLOW - Low byte of the Watchdog Counter - */ -#define RTWDOG_CNT_CNTLOW(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CNT_CNTLOW_SHIFT)) & RTWDOG_CNT_CNTLOW_MASK) - -#define RTWDOG_CNT_CNTHIGH_MASK (0xFF00U) -#define RTWDOG_CNT_CNTHIGH_SHIFT (8U) -/*! CNTHIGH - High byte of the Watchdog Counter - */ -#define RTWDOG_CNT_CNTHIGH(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_CNT_CNTHIGH_SHIFT)) & RTWDOG_CNT_CNTHIGH_MASK) -/*! @} */ - -/*! @name TOVAL - Watchdog Timeout Value Register */ -/*! @{ */ - -#define RTWDOG_TOVAL_TOVALLOW_MASK (0xFFU) -#define RTWDOG_TOVAL_TOVALLOW_SHIFT (0U) -/*! TOVALLOW - Low byte of the timeout value - */ -#define RTWDOG_TOVAL_TOVALLOW(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_TOVAL_TOVALLOW_SHIFT)) & RTWDOG_TOVAL_TOVALLOW_MASK) - -#define RTWDOG_TOVAL_TOVALHIGH_MASK (0xFF00U) -#define RTWDOG_TOVAL_TOVALHIGH_SHIFT (8U) -/*! TOVALHIGH - High byte of the timeout value - */ -#define RTWDOG_TOVAL_TOVALHIGH(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_TOVAL_TOVALHIGH_SHIFT)) & RTWDOG_TOVAL_TOVALHIGH_MASK) -/*! @} */ - -/*! @name WIN - Watchdog Window Register */ -/*! @{ */ - -#define RTWDOG_WIN_WINLOW_MASK (0xFFU) -#define RTWDOG_WIN_WINLOW_SHIFT (0U) -/*! WINLOW - Low byte of Watchdog Window - */ -#define RTWDOG_WIN_WINLOW(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_WIN_WINLOW_SHIFT)) & RTWDOG_WIN_WINLOW_MASK) - -#define RTWDOG_WIN_WINHIGH_MASK (0xFF00U) -#define RTWDOG_WIN_WINHIGH_SHIFT (8U) -/*! WINHIGH - High byte of Watchdog Window - */ -#define RTWDOG_WIN_WINHIGH(x) (((uint32_t)(((uint32_t)(x)) << RTWDOG_WIN_WINHIGH_SHIFT)) & RTWDOG_WIN_WINHIGH_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group RTWDOG_Register_Masks */ - - -/* RTWDOG - Peripheral instance base addresses */ -/** Peripheral RTWDOG base address */ -#define RTWDOG_BASE (0x400BC000u) -/** Peripheral RTWDOG base pointer */ -#define RTWDOG ((RTWDOG_Type *)RTWDOG_BASE) -/** Array initializer of RTWDOG peripheral base addresses */ -#define RTWDOG_BASE_ADDRS { RTWDOG_BASE } -/** Array initializer of RTWDOG peripheral base pointers */ -#define RTWDOG_BASE_PTRS { RTWDOG } -/** Interrupt vectors for the RTWDOG peripheral type */ -#define RTWDOG_IRQS { RTWDOG_IRQn } -/* Extra definition */ -#define RTWDOG_UPDATE_KEY (0xD928C520U) -#define RTWDOG_REFRESH_KEY (0xB480A602U) - - -/*! - * @} - */ /* end of group RTWDOG_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- SEMC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SEMC_Peripheral_Access_Layer SEMC Peripheral Access Layer - * @{ - */ - -/** SEMC - Register Layout Typedef */ -typedef struct { - __IO uint32_t MCR; /**< Module Control Register, offset: 0x0 */ - __IO uint32_t IOCR; /**< IO Mux Control Register, offset: 0x4 */ - __IO uint32_t BMCR0; /**< Master Bus (AXI) Control Register 0, offset: 0x8 */ - __IO uint32_t BMCR1; /**< Master Bus (AXI) Control Register 1, offset: 0xC */ - __IO uint32_t BR[9]; /**< Base Register 0 (For SDRAM CS0 device)..Base Register 8 (For NAND device), array offset: 0x10, array step: 0x4 */ - uint8_t RESERVED_0[4]; - __IO uint32_t INTEN; /**< Interrupt Enable Register, offset: 0x38 */ - __IO uint32_t INTR; /**< Interrupt Enable Register, offset: 0x3C */ - __IO uint32_t SDRAMCR0; /**< SDRAM control register 0, offset: 0x40 */ - __IO uint32_t SDRAMCR1; /**< SDRAM control register 1, offset: 0x44 */ - __IO uint32_t SDRAMCR2; /**< SDRAM control register 2, offset: 0x48 */ - __IO uint32_t SDRAMCR3; /**< SDRAM control register 3, offset: 0x4C */ - __IO uint32_t NANDCR0; /**< NAND control register 0, offset: 0x50 */ - __IO uint32_t NANDCR1; /**< NAND control register 1, offset: 0x54 */ - __IO uint32_t NANDCR2; /**< NAND control register 2, offset: 0x58 */ - __IO uint32_t NANDCR3; /**< NAND control register 3, offset: 0x5C */ - __IO uint32_t NORCR0; /**< NOR control register 0, offset: 0x60 */ - __IO uint32_t NORCR1; /**< NOR control register 1, offset: 0x64 */ - __IO uint32_t NORCR2; /**< NOR control register 2, offset: 0x68 */ - uint32_t NORCR3; /**< NOR control register 3, offset: 0x6C */ - __IO uint32_t SRAMCR0; /**< SRAM control register 0, offset: 0x70 */ - __IO uint32_t SRAMCR1; /**< SRAM control register 1, offset: 0x74 */ - __IO uint32_t SRAMCR2; /**< SRAM control register 2, offset: 0x78 */ - uint32_t SRAMCR3; /**< SRAM control register 3, offset: 0x7C */ - __IO uint32_t DBICR0; /**< DBI-B control register 0, offset: 0x80 */ - __IO uint32_t DBICR1; /**< DBI-B control register 1, offset: 0x84 */ - uint8_t RESERVED_1[8]; - __IO uint32_t IPCR0; /**< IP Command control register 0, offset: 0x90 */ - __IO uint32_t IPCR1; /**< IP Command control register 1, offset: 0x94 */ - __IO uint32_t IPCR2; /**< IP Command control register 2, offset: 0x98 */ - __IO uint32_t IPCMD; /**< IP Command register, offset: 0x9C */ - __IO uint32_t IPTXDAT; /**< TX DATA register (for IP Command), offset: 0xA0 */ - uint8_t RESERVED_2[12]; - __I uint32_t IPRXDAT; /**< RX DATA register (for IP Command), offset: 0xB0 */ - uint8_t RESERVED_3[12]; - __I uint32_t STS0; /**< Status register 0, offset: 0xC0 */ - uint32_t STS1; /**< Status register 1, offset: 0xC4 */ - __I uint32_t STS2; /**< Status register 2, offset: 0xC8 */ - uint32_t STS3; /**< Status register 3, offset: 0xCC */ - uint32_t STS4; /**< Status register 4, offset: 0xD0 */ - uint32_t STS5; /**< Status register 5, offset: 0xD4 */ - uint32_t STS6; /**< Status register 6, offset: 0xD8 */ - uint32_t STS7; /**< Status register 7, offset: 0xDC */ - uint32_t STS8; /**< Status register 8, offset: 0xE0 */ - uint32_t STS9; /**< Status register 9, offset: 0xE4 */ - uint32_t STS10; /**< Status register 10, offset: 0xE8 */ - uint32_t STS11; /**< Status register 11, offset: 0xEC */ - __I uint32_t STS12; /**< Status register 12, offset: 0xF0 */ - uint32_t STS13; /**< Status register 13, offset: 0xF4 */ - uint32_t STS14; /**< Status register 14, offset: 0xF8 */ - uint32_t STS15; /**< Status register 15, offset: 0xFC */ -} SEMC_Type; - -/* ---------------------------------------------------------------------------- - -- SEMC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SEMC_Register_Masks SEMC Register Masks - * @{ - */ - -/*! @name MCR - Module Control Register */ -/*! @{ */ - -#define SEMC_MCR_SWRST_MASK (0x1U) -#define SEMC_MCR_SWRST_SHIFT (0U) -/*! SWRST - Software Reset - */ -#define SEMC_MCR_SWRST(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_SWRST_SHIFT)) & SEMC_MCR_SWRST_MASK) - -#define SEMC_MCR_MDIS_MASK (0x2U) -#define SEMC_MCR_MDIS_SHIFT (1U) -/*! MDIS - Module Disable - * 0b0..Module enabled - * 0b1..Module disabled. - */ -#define SEMC_MCR_MDIS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_MDIS_SHIFT)) & SEMC_MCR_MDIS_MASK) - -#define SEMC_MCR_DQSMD_MASK (0x4U) -#define SEMC_MCR_DQSMD_SHIFT (2U) -/*! DQSMD - DQS (read strobe) mode - * 0b0..Dummy read strobe loopbacked internally - * 0b1..Dummy read strobe loopbacked from DQS pad - */ -#define SEMC_MCR_DQSMD(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_DQSMD_SHIFT)) & SEMC_MCR_DQSMD_MASK) - -#define SEMC_MCR_WPOL0_MASK (0x40U) -#define SEMC_MCR_WPOL0_SHIFT (6U) -/*! WPOL0 - WAIT/RDY# polarity for NOR/PSRAM - * 0b0..Low active - * 0b1..High active - */ -#define SEMC_MCR_WPOL0(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_WPOL0_SHIFT)) & SEMC_MCR_WPOL0_MASK) - -#define SEMC_MCR_WPOL1_MASK (0x80U) -#define SEMC_MCR_WPOL1_SHIFT (7U) -/*! WPOL1 - WAIT/RDY# polarity for NAND - * 0b0..Low active - * 0b1..High active - */ -#define SEMC_MCR_WPOL1(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_WPOL1_SHIFT)) & SEMC_MCR_WPOL1_MASK) - -#define SEMC_MCR_CTO_MASK (0xFF0000U) -#define SEMC_MCR_CTO_SHIFT (16U) -/*! CTO - Command Execution timeout cycles - */ -#define SEMC_MCR_CTO(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_CTO_SHIFT)) & SEMC_MCR_CTO_MASK) - -#define SEMC_MCR_BTO_MASK (0x1F000000U) -#define SEMC_MCR_BTO_SHIFT (24U) -/*! BTO - Bus timeout cycles - * 0b00000..255*1 - * 0b00001-0b11110..255*2 - 255*2^30 - * 0b11111..255*2^31 - */ -#define SEMC_MCR_BTO(x) (((uint32_t)(((uint32_t)(x)) << SEMC_MCR_BTO_SHIFT)) & SEMC_MCR_BTO_MASK) -/*! @} */ - -/*! @name IOCR - IO Mux Control Register */ -/*! @{ */ - -#define SEMC_IOCR_MUX_A8_MASK (0x7U) -#define SEMC_IOCR_MUX_A8_SHIFT (0U) -/*! MUX_A8 - SEMC_A8 output selection - * 0b000..SDRAM Address bit (A8) - * 0b001..NAND CE# - * 0b010..NOR CE# - * 0b011..PSRAM CE# - * 0b100..DBI CSX - * 0b101..SDRAM Address bit (A8) - * 0b110..SDRAM Address bit (A8) - * 0b111..SDRAM Address bit (A8) - */ -#define SEMC_IOCR_MUX_A8(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_A8_SHIFT)) & SEMC_IOCR_MUX_A8_MASK) - -#define SEMC_IOCR_MUX_CSX0_MASK (0x38U) -#define SEMC_IOCR_MUX_CSX0_SHIFT (3U) -/*! MUX_CSX0 - SEMC_CSX0 output selection - * 0b000..NOR/PSRAM Address bit 24 (A24) - * 0b001..SDRAM CS1 - * 0b010..SDRAM CS2 - * 0b011..SDRAM CS3 - * 0b100..NAND CE# - * 0b101..NOR CE# - * 0b110..PSRAM CE# - * 0b111..DBI CSX - */ -#define SEMC_IOCR_MUX_CSX0(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_CSX0_SHIFT)) & SEMC_IOCR_MUX_CSX0_MASK) - -#define SEMC_IOCR_MUX_CSX1_MASK (0x1C0U) -#define SEMC_IOCR_MUX_CSX1_SHIFT (6U) -/*! MUX_CSX1 - SEMC_CSX1 output selection - * 0b000..NOR/PSRAM Address bit 25 (A25) - * 0b001..SDRAM CS1 - * 0b010..SDRAM CS2 - * 0b011..SDRAM CS3 - * 0b100..NAND CE# - * 0b101..NOR CE# - * 0b110..PSRAM CE# - * 0b111..DBI CSX - */ -#define SEMC_IOCR_MUX_CSX1(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_CSX1_SHIFT)) & SEMC_IOCR_MUX_CSX1_MASK) - -#define SEMC_IOCR_MUX_CSX2_MASK (0xE00U) -#define SEMC_IOCR_MUX_CSX2_SHIFT (9U) -/*! MUX_CSX2 - SEMC_CSX2 output selection - * 0b000..NOR/PSRAM Address bit 26 (A26) - * 0b001..SDRAM CS1 - * 0b010..SDRAM CS2 - * 0b011..SDRAM CS3 - * 0b100..NAND CE# - * 0b101..NOR CE# - * 0b110..PSRAM CE# - * 0b111..DBI CSX - */ -#define SEMC_IOCR_MUX_CSX2(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_CSX2_SHIFT)) & SEMC_IOCR_MUX_CSX2_MASK) - -#define SEMC_IOCR_MUX_CSX3_MASK (0x7000U) -#define SEMC_IOCR_MUX_CSX3_SHIFT (12U) -/*! MUX_CSX3 - SEMC_CSX3 output selection - * 0b000..NOR/PSRAM Address bit 27 (A27) - * 0b001..SDRAM CS1 - * 0b010..SDRAM CS2 - * 0b011..SDRAM CS3 - * 0b100..NAND CE# - * 0b101..NOR CE# - * 0b110..PSRAM CE# - * 0b111..DBI CSX - */ -#define SEMC_IOCR_MUX_CSX3(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_CSX3_SHIFT)) & SEMC_IOCR_MUX_CSX3_MASK) - -#define SEMC_IOCR_MUX_RDY_MASK (0x38000U) -#define SEMC_IOCR_MUX_RDY_SHIFT (15U) -/*! MUX_RDY - SEMC_RDY function selection - * 0b000..NAND Ready/Wait# input - * 0b001..SDRAM CS1 - * 0b010..SDRAM CS2 - * 0b011..SDRAM CS3 - * 0b100..NOR CE# - * 0b101..PSRAM CE# - * 0b110..DBI CSX - * 0b111..NOR/PSRAM Address bit 27 - */ -#define SEMC_IOCR_MUX_RDY(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IOCR_MUX_RDY_SHIFT)) & SEMC_IOCR_MUX_RDY_MASK) -/*! @} */ - -/*! @name BMCR0 - Master Bus (AXI) Control Register 0 */ -/*! @{ */ - -#define SEMC_BMCR0_WQOS_MASK (0xFU) -#define SEMC_BMCR0_WQOS_SHIFT (0U) -/*! WQOS - Weight of QoS - */ -#define SEMC_BMCR0_WQOS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR0_WQOS_SHIFT)) & SEMC_BMCR0_WQOS_MASK) - -#define SEMC_BMCR0_WAGE_MASK (0xF0U) -#define SEMC_BMCR0_WAGE_SHIFT (4U) -/*! WAGE - Weight of Aging - */ -#define SEMC_BMCR0_WAGE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR0_WAGE_SHIFT)) & SEMC_BMCR0_WAGE_MASK) - -#define SEMC_BMCR0_WSH_MASK (0xFF00U) -#define SEMC_BMCR0_WSH_SHIFT (8U) -/*! WSH - Weight of Slave Hit (no read/write switch) - */ -#define SEMC_BMCR0_WSH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR0_WSH_SHIFT)) & SEMC_BMCR0_WSH_MASK) - -#define SEMC_BMCR0_WRWS_MASK (0xFF0000U) -#define SEMC_BMCR0_WRWS_SHIFT (16U) -/*! WRWS - Weight of Slave Hit (Read/Write switch) - */ -#define SEMC_BMCR0_WRWS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR0_WRWS_SHIFT)) & SEMC_BMCR0_WRWS_MASK) -/*! @} */ - -/*! @name BMCR1 - Master Bus (AXI) Control Register 1 */ -/*! @{ */ - -#define SEMC_BMCR1_WQOS_MASK (0xFU) -#define SEMC_BMCR1_WQOS_SHIFT (0U) -/*! WQOS - Weight of QoS - */ -#define SEMC_BMCR1_WQOS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR1_WQOS_SHIFT)) & SEMC_BMCR1_WQOS_MASK) - -#define SEMC_BMCR1_WAGE_MASK (0xF0U) -#define SEMC_BMCR1_WAGE_SHIFT (4U) -/*! WAGE - Weight of Aging - */ -#define SEMC_BMCR1_WAGE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR1_WAGE_SHIFT)) & SEMC_BMCR1_WAGE_MASK) - -#define SEMC_BMCR1_WPH_MASK (0xFF00U) -#define SEMC_BMCR1_WPH_SHIFT (8U) -/*! WPH - Weight of Page Hit - */ -#define SEMC_BMCR1_WPH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR1_WPH_SHIFT)) & SEMC_BMCR1_WPH_MASK) - -#define SEMC_BMCR1_WRWS_MASK (0xFF0000U) -#define SEMC_BMCR1_WRWS_SHIFT (16U) -/*! WRWS - Weight of Read/Write switch - */ -#define SEMC_BMCR1_WRWS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR1_WRWS_SHIFT)) & SEMC_BMCR1_WRWS_MASK) - -#define SEMC_BMCR1_WBR_MASK (0xFF000000U) -#define SEMC_BMCR1_WBR_SHIFT (24U) -/*! WBR - Weight of Bank Rotation - */ -#define SEMC_BMCR1_WBR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BMCR1_WBR_SHIFT)) & SEMC_BMCR1_WBR_MASK) -/*! @} */ - -/*! @name BR - Base Register 0 (For SDRAM CS0 device)..Base Register 8 (For NAND device) */ -/*! @{ */ - -#define SEMC_BR_VLD_MASK (0x1U) -#define SEMC_BR_VLD_SHIFT (0U) -/*! VLD - Valid - */ -#define SEMC_BR_VLD(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BR_VLD_SHIFT)) & SEMC_BR_VLD_MASK) - -#define SEMC_BR_MS_MASK (0x3EU) -#define SEMC_BR_MS_SHIFT (1U) -/*! MS - Memory size - * 0b00000..4KB - * 0b00001..8KB - * 0b00010..16KB - * 0b00011..32KB - * 0b00100..64KB - * 0b00101..128KB - * 0b00110..256KB - * 0b00111..512KB - * 0b01000..1MB - * 0b01001..2MB - * 0b01010..4MB - * 0b01011..8MB - * 0b01100..16MB - * 0b01101..32MB - * 0b01110..64MB - * 0b01111..128MB - * 0b10000..256MB - * 0b10001..512MB - * 0b10010..1GB - * 0b10011..2GB - * 0b10100..4GB - * 0b10101..4GB - * 0b10110..4GB - * 0b10111..4GB - * 0b11000..4GB - * 0b11001..4GB - * 0b11010..4GB - * 0b11011..4GB - * 0b11100..4GB - * 0b11101..4GB - * 0b11110..4GB - * 0b11111..4GB - */ -#define SEMC_BR_MS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BR_MS_SHIFT)) & SEMC_BR_MS_MASK) - -#define SEMC_BR_BA_MASK (0xFFFFF000U) -#define SEMC_BR_BA_SHIFT (12U) -/*! BA - Base Address - */ -#define SEMC_BR_BA(x) (((uint32_t)(((uint32_t)(x)) << SEMC_BR_BA_SHIFT)) & SEMC_BR_BA_MASK) -/*! @} */ - -/* The count of SEMC_BR */ -#define SEMC_BR_COUNT (9U) - -/*! @name INTEN - Interrupt Enable Register */ -/*! @{ */ - -#define SEMC_INTEN_IPCMDDONEEN_MASK (0x1U) -#define SEMC_INTEN_IPCMDDONEEN_SHIFT (0U) -/*! IPCMDDONEEN - IP command done interrupt enable - */ -#define SEMC_INTEN_IPCMDDONEEN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_IPCMDDONEEN_SHIFT)) & SEMC_INTEN_IPCMDDONEEN_MASK) - -#define SEMC_INTEN_IPCMDERREN_MASK (0x2U) -#define SEMC_INTEN_IPCMDERREN_SHIFT (1U) -/*! IPCMDERREN - IP command error interrupt enable - */ -#define SEMC_INTEN_IPCMDERREN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_IPCMDERREN_SHIFT)) & SEMC_INTEN_IPCMDERREN_MASK) - -#define SEMC_INTEN_AXICMDERREN_MASK (0x4U) -#define SEMC_INTEN_AXICMDERREN_SHIFT (2U) -/*! AXICMDERREN - AXI command error interrupt enable - */ -#define SEMC_INTEN_AXICMDERREN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_AXICMDERREN_SHIFT)) & SEMC_INTEN_AXICMDERREN_MASK) - -#define SEMC_INTEN_AXIBUSERREN_MASK (0x8U) -#define SEMC_INTEN_AXIBUSERREN_SHIFT (3U) -/*! AXIBUSERREN - AXI bus error interrupt enable - */ -#define SEMC_INTEN_AXIBUSERREN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_AXIBUSERREN_SHIFT)) & SEMC_INTEN_AXIBUSERREN_MASK) - -#define SEMC_INTEN_NDPAGEENDEN_MASK (0x10U) -#define SEMC_INTEN_NDPAGEENDEN_SHIFT (4U) -/*! NDPAGEENDEN - This bit enable/disable the NDPAGEEND interrupt generation. - * 0b0..Disable - * 0b1..Enable - */ -#define SEMC_INTEN_NDPAGEENDEN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_NDPAGEENDEN_SHIFT)) & SEMC_INTEN_NDPAGEENDEN_MASK) - -#define SEMC_INTEN_NDNOPENDEN_MASK (0x20U) -#define SEMC_INTEN_NDNOPENDEN_SHIFT (5U) -/*! NDNOPENDEN - This bit enable/disable the NDNOPEND interrupt generation. - * 0b0..Disable - * 0b1..Enable - */ -#define SEMC_INTEN_NDNOPENDEN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTEN_NDNOPENDEN_SHIFT)) & SEMC_INTEN_NDNOPENDEN_MASK) -/*! @} */ - -/*! @name INTR - Interrupt Enable Register */ -/*! @{ */ - -#define SEMC_INTR_IPCMDDONE_MASK (0x1U) -#define SEMC_INTR_IPCMDDONE_SHIFT (0U) -/*! IPCMDDONE - IP command normal done interrupt - */ -#define SEMC_INTR_IPCMDDONE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_IPCMDDONE_SHIFT)) & SEMC_INTR_IPCMDDONE_MASK) - -#define SEMC_INTR_IPCMDERR_MASK (0x2U) -#define SEMC_INTR_IPCMDERR_SHIFT (1U) -/*! IPCMDERR - IP command error done interrupt - */ -#define SEMC_INTR_IPCMDERR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_IPCMDERR_SHIFT)) & SEMC_INTR_IPCMDERR_MASK) - -#define SEMC_INTR_AXICMDERR_MASK (0x4U) -#define SEMC_INTR_AXICMDERR_SHIFT (2U) -/*! AXICMDERR - AXI command error interrupt - */ -#define SEMC_INTR_AXICMDERR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_AXICMDERR_SHIFT)) & SEMC_INTR_AXICMDERR_MASK) - -#define SEMC_INTR_AXIBUSERR_MASK (0x8U) -#define SEMC_INTR_AXIBUSERR_SHIFT (3U) -/*! AXIBUSERR - AXI bus error interrupt - */ -#define SEMC_INTR_AXIBUSERR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_AXIBUSERR_SHIFT)) & SEMC_INTR_AXIBUSERR_MASK) - -#define SEMC_INTR_NDPAGEEND_MASK (0x10U) -#define SEMC_INTR_NDPAGEEND_SHIFT (4U) -/*! NDPAGEEND - This interrupt is generated when the last address of one page in NAND device is written by AXI command - */ -#define SEMC_INTR_NDPAGEEND(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_NDPAGEEND_SHIFT)) & SEMC_INTR_NDPAGEEND_MASK) - -#define SEMC_INTR_NDNOPEND_MASK (0x20U) -#define SEMC_INTR_NDNOPEND_SHIFT (5U) -/*! NDNOPEND - This interrupt is generated when all pending AXI write command to NAND is finished on NAND interface. - */ -#define SEMC_INTR_NDNOPEND(x) (((uint32_t)(((uint32_t)(x)) << SEMC_INTR_NDNOPEND_SHIFT)) & SEMC_INTR_NDNOPEND_MASK) -/*! @} */ - -/*! @name SDRAMCR0 - SDRAM control register 0 */ -/*! @{ */ - -#define SEMC_SDRAMCR0_PS_MASK (0x1U) -#define SEMC_SDRAMCR0_PS_SHIFT (0U) -/*! PS - Port Size - * 0b0..8bit - * 0b1..16bit - */ -#define SEMC_SDRAMCR0_PS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR0_PS_SHIFT)) & SEMC_SDRAMCR0_PS_MASK) - -#define SEMC_SDRAMCR0_BL_MASK (0x70U) -#define SEMC_SDRAMCR0_BL_SHIFT (4U) -/*! BL - Burst Length - * 0b000..1 - * 0b001..2 - * 0b010..4 - * 0b011..8 - * 0b100..8 - * 0b101..8 - * 0b110..8 - * 0b111..8 - */ -#define SEMC_SDRAMCR0_BL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR0_BL_SHIFT)) & SEMC_SDRAMCR0_BL_MASK) - -#define SEMC_SDRAMCR0_COL_MASK (0x300U) -#define SEMC_SDRAMCR0_COL_SHIFT (8U) -/*! COL - Column address bit number - * 0b00..12 bit - * 0b01..11 bit - * 0b10..10 bit - * 0b11..9 bit - */ -#define SEMC_SDRAMCR0_COL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR0_COL_SHIFT)) & SEMC_SDRAMCR0_COL_MASK) - -#define SEMC_SDRAMCR0_CL_MASK (0xC00U) -#define SEMC_SDRAMCR0_CL_SHIFT (10U) -/*! CL - CAS Latency - * 0b00..1 - * 0b01..1 - * 0b10..2 - * 0b11..3 - */ -#define SEMC_SDRAMCR0_CL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR0_CL_SHIFT)) & SEMC_SDRAMCR0_CL_MASK) -/*! @} */ - -/*! @name SDRAMCR1 - SDRAM control register 1 */ -/*! @{ */ - -#define SEMC_SDRAMCR1_PRE2ACT_MASK (0xFU) -#define SEMC_SDRAMCR1_PRE2ACT_SHIFT (0U) -/*! PRE2ACT - PRECHARGE to ACT/Refresh wait time - */ -#define SEMC_SDRAMCR1_PRE2ACT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_PRE2ACT_SHIFT)) & SEMC_SDRAMCR1_PRE2ACT_MASK) - -#define SEMC_SDRAMCR1_ACT2RW_MASK (0xF0U) -#define SEMC_SDRAMCR1_ACT2RW_SHIFT (4U) -/*! ACT2RW - ACT to Read/Write wait time - */ -#define SEMC_SDRAMCR1_ACT2RW(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_ACT2RW_SHIFT)) & SEMC_SDRAMCR1_ACT2RW_MASK) - -#define SEMC_SDRAMCR1_RFRC_MASK (0x1F00U) -#define SEMC_SDRAMCR1_RFRC_SHIFT (8U) -/*! RFRC - Refresh recovery time - */ -#define SEMC_SDRAMCR1_RFRC(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_RFRC_SHIFT)) & SEMC_SDRAMCR1_RFRC_MASK) - -#define SEMC_SDRAMCR1_WRC_MASK (0xE000U) -#define SEMC_SDRAMCR1_WRC_SHIFT (13U) -/*! WRC - Write recovery time - */ -#define SEMC_SDRAMCR1_WRC(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_WRC_SHIFT)) & SEMC_SDRAMCR1_WRC_MASK) - -#define SEMC_SDRAMCR1_CKEOFF_MASK (0xF0000U) -#define SEMC_SDRAMCR1_CKEOFF_SHIFT (16U) -/*! CKEOFF - CKE OFF minimum time - */ -#define SEMC_SDRAMCR1_CKEOFF(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_CKEOFF_SHIFT)) & SEMC_SDRAMCR1_CKEOFF_MASK) - -#define SEMC_SDRAMCR1_ACT2PRE_MASK (0xF00000U) -#define SEMC_SDRAMCR1_ACT2PRE_SHIFT (20U) -/*! ACT2PRE - ACT to Precharge minimum time - */ -#define SEMC_SDRAMCR1_ACT2PRE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR1_ACT2PRE_SHIFT)) & SEMC_SDRAMCR1_ACT2PRE_MASK) -/*! @} */ - -/*! @name SDRAMCR2 - SDRAM control register 2 */ -/*! @{ */ - -#define SEMC_SDRAMCR2_SRRC_MASK (0xFFU) -#define SEMC_SDRAMCR2_SRRC_SHIFT (0U) -/*! SRRC - Self Refresh Recovery time - */ -#define SEMC_SDRAMCR2_SRRC(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR2_SRRC_SHIFT)) & SEMC_SDRAMCR2_SRRC_MASK) - -#define SEMC_SDRAMCR2_REF2REF_MASK (0xFF00U) -#define SEMC_SDRAMCR2_REF2REF_SHIFT (8U) -/*! REF2REF - Refresh to Refresh wait time - */ -#define SEMC_SDRAMCR2_REF2REF(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR2_REF2REF_SHIFT)) & SEMC_SDRAMCR2_REF2REF_MASK) - -#define SEMC_SDRAMCR2_ACT2ACT_MASK (0xFF0000U) -#define SEMC_SDRAMCR2_ACT2ACT_SHIFT (16U) -/*! ACT2ACT - ACT to ACT wait time - */ -#define SEMC_SDRAMCR2_ACT2ACT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR2_ACT2ACT_SHIFT)) & SEMC_SDRAMCR2_ACT2ACT_MASK) - -#define SEMC_SDRAMCR2_ITO_MASK (0xFF000000U) -#define SEMC_SDRAMCR2_ITO_SHIFT (24U) -/*! ITO - SDRAM Idle timeout - * 0b00000000..IDLE timeout period is 256*Prescale period. - * 0b00000001-0b11111111..IDLE timeout period is ITO*Prescale period. - */ -#define SEMC_SDRAMCR2_ITO(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR2_ITO_SHIFT)) & SEMC_SDRAMCR2_ITO_MASK) -/*! @} */ - -/*! @name SDRAMCR3 - SDRAM control register 3 */ -/*! @{ */ - -#define SEMC_SDRAMCR3_REN_MASK (0x1U) -#define SEMC_SDRAMCR3_REN_SHIFT (0U) -/*! REN - Refresh enable - */ -#define SEMC_SDRAMCR3_REN(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR3_REN_SHIFT)) & SEMC_SDRAMCR3_REN_MASK) - -#define SEMC_SDRAMCR3_REBL_MASK (0xEU) -#define SEMC_SDRAMCR3_REBL_SHIFT (1U) -/*! REBL - Refresh burst length - * 0b000..1 - * 0b001..2 - * 0b010..3 - * 0b011..4 - * 0b100..5 - * 0b101..6 - * 0b110..7 - * 0b111..8 - */ -#define SEMC_SDRAMCR3_REBL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR3_REBL_SHIFT)) & SEMC_SDRAMCR3_REBL_MASK) - -#define SEMC_SDRAMCR3_PRESCALE_MASK (0xFF00U) -#define SEMC_SDRAMCR3_PRESCALE_SHIFT (8U) -/*! PRESCALE - Prescaler timer period - * 0b00000000..256*16 cycle - * 0b00000001-0b11111111..PRESCALE*16 cycle - */ -#define SEMC_SDRAMCR3_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR3_PRESCALE_SHIFT)) & SEMC_SDRAMCR3_PRESCALE_MASK) - -#define SEMC_SDRAMCR3_RT_MASK (0xFF0000U) -#define SEMC_SDRAMCR3_RT_SHIFT (16U) -/*! RT - Refresh timer period - * 0b00000000..256*Prescaler period - * 0b00000001-0b11111111..RT*Prescaler period - */ -#define SEMC_SDRAMCR3_RT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR3_RT_SHIFT)) & SEMC_SDRAMCR3_RT_MASK) - -#define SEMC_SDRAMCR3_UT_MASK (0xFF000000U) -#define SEMC_SDRAMCR3_UT_SHIFT (24U) -/*! UT - Refresh urgent threshold - * 0b00000000..256*Prescaler period - * 0b00000001-0b11111111..UT*Prescaler period - */ -#define SEMC_SDRAMCR3_UT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SDRAMCR3_UT_SHIFT)) & SEMC_SDRAMCR3_UT_MASK) -/*! @} */ - -/*! @name NANDCR0 - NAND control register 0 */ -/*! @{ */ - -#define SEMC_NANDCR0_PS_MASK (0x1U) -#define SEMC_NANDCR0_PS_SHIFT (0U) -/*! PS - Port Size - * 0b0..8bit - * 0b1..16bit - */ -#define SEMC_NANDCR0_PS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR0_PS_SHIFT)) & SEMC_NANDCR0_PS_MASK) - -#define SEMC_NANDCR0_BL_MASK (0x70U) -#define SEMC_NANDCR0_BL_SHIFT (4U) -/*! BL - Burst Length - * 0b000..1 - * 0b001..2 - * 0b010..4 - * 0b011..8 - * 0b100..16 - * 0b101..32 - * 0b110..64 - * 0b111..64 - */ -#define SEMC_NANDCR0_BL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR0_BL_SHIFT)) & SEMC_NANDCR0_BL_MASK) - -#define SEMC_NANDCR0_EDO_MASK (0x80U) -#define SEMC_NANDCR0_EDO_SHIFT (7U) -/*! EDO - EDO mode enabled - * 0b0..EDO mode disabled - * 0b1..EDO mode enabled - */ -#define SEMC_NANDCR0_EDO(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR0_EDO_SHIFT)) & SEMC_NANDCR0_EDO_MASK) - -#define SEMC_NANDCR0_COL_MASK (0x700U) -#define SEMC_NANDCR0_COL_SHIFT (8U) -/*! COL - Column address bit number - * 0b000..16 - * 0b001..15 - * 0b010..14 - * 0b011..13 - * 0b100..12 - * 0b101..11 - * 0b110..10 - * 0b111..9 - */ -#define SEMC_NANDCR0_COL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR0_COL_SHIFT)) & SEMC_NANDCR0_COL_MASK) -/*! @} */ - -/*! @name NANDCR1 - NAND control register 1 */ -/*! @{ */ - -#define SEMC_NANDCR1_CES_MASK (0xFU) -#define SEMC_NANDCR1_CES_SHIFT (0U) -/*! CES - CE setup time - */ -#define SEMC_NANDCR1_CES(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_CES_SHIFT)) & SEMC_NANDCR1_CES_MASK) - -#define SEMC_NANDCR1_CEH_MASK (0xF0U) -#define SEMC_NANDCR1_CEH_SHIFT (4U) -/*! CEH - CE hold time - */ -#define SEMC_NANDCR1_CEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_CEH_SHIFT)) & SEMC_NANDCR1_CEH_MASK) - -#define SEMC_NANDCR1_WEL_MASK (0xF00U) -#define SEMC_NANDCR1_WEL_SHIFT (8U) -/*! WEL - WE# LOW time - */ -#define SEMC_NANDCR1_WEL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_WEL_SHIFT)) & SEMC_NANDCR1_WEL_MASK) - -#define SEMC_NANDCR1_WEH_MASK (0xF000U) -#define SEMC_NANDCR1_WEH_SHIFT (12U) -/*! WEH - WE# HIGH time - */ -#define SEMC_NANDCR1_WEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_WEH_SHIFT)) & SEMC_NANDCR1_WEH_MASK) - -#define SEMC_NANDCR1_REL_MASK (0xF0000U) -#define SEMC_NANDCR1_REL_SHIFT (16U) -/*! REL - RE# LOW time - */ -#define SEMC_NANDCR1_REL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_REL_SHIFT)) & SEMC_NANDCR1_REL_MASK) - -#define SEMC_NANDCR1_REH_MASK (0xF00000U) -#define SEMC_NANDCR1_REH_SHIFT (20U) -/*! REH - RE# HIGH time - */ -#define SEMC_NANDCR1_REH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_REH_SHIFT)) & SEMC_NANDCR1_REH_MASK) - -#define SEMC_NANDCR1_TA_MASK (0xF000000U) -#define SEMC_NANDCR1_TA_SHIFT (24U) -/*! TA - Turnaround time - */ -#define SEMC_NANDCR1_TA(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_TA_SHIFT)) & SEMC_NANDCR1_TA_MASK) - -#define SEMC_NANDCR1_CEITV_MASK (0xF0000000U) -#define SEMC_NANDCR1_CEITV_SHIFT (28U) -/*! CEITV - CE# interval time - */ -#define SEMC_NANDCR1_CEITV(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR1_CEITV_SHIFT)) & SEMC_NANDCR1_CEITV_MASK) -/*! @} */ - -/*! @name NANDCR2 - NAND control register 2 */ -/*! @{ */ - -#define SEMC_NANDCR2_TWHR_MASK (0x3FU) -#define SEMC_NANDCR2_TWHR_SHIFT (0U) -/*! TWHR - WE# HIGH to RE# LOW wait time - */ -#define SEMC_NANDCR2_TWHR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR2_TWHR_SHIFT)) & SEMC_NANDCR2_TWHR_MASK) - -#define SEMC_NANDCR2_TRHW_MASK (0xFC0U) -#define SEMC_NANDCR2_TRHW_SHIFT (6U) -/*! TRHW - RE# HIGH to WE# LOW wait time - */ -#define SEMC_NANDCR2_TRHW(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR2_TRHW_SHIFT)) & SEMC_NANDCR2_TRHW_MASK) - -#define SEMC_NANDCR2_TADL_MASK (0x3F000U) -#define SEMC_NANDCR2_TADL_SHIFT (12U) -/*! TADL - ALE to WRITE Data start wait time - */ -#define SEMC_NANDCR2_TADL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR2_TADL_SHIFT)) & SEMC_NANDCR2_TADL_MASK) - -#define SEMC_NANDCR2_TRR_MASK (0xFC0000U) -#define SEMC_NANDCR2_TRR_SHIFT (18U) -/*! TRR - Ready to RE# LOW min wait time - */ -#define SEMC_NANDCR2_TRR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR2_TRR_SHIFT)) & SEMC_NANDCR2_TRR_MASK) - -#define SEMC_NANDCR2_TWB_MASK (0x3F000000U) -#define SEMC_NANDCR2_TWB_SHIFT (24U) -/*! TWB - WE# HIGH to busy wait time - */ -#define SEMC_NANDCR2_TWB(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR2_TWB_SHIFT)) & SEMC_NANDCR2_TWB_MASK) -/*! @} */ - -/*! @name NANDCR3 - NAND control register 3 */ -/*! @{ */ - -#define SEMC_NANDCR3_NDOPT1_MASK (0x1U) -#define SEMC_NANDCR3_NDOPT1_SHIFT (0U) -/*! NDOPT1 - NAND option bit 1 - */ -#define SEMC_NANDCR3_NDOPT1(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR3_NDOPT1_SHIFT)) & SEMC_NANDCR3_NDOPT1_MASK) - -#define SEMC_NANDCR3_NDOPT2_MASK (0x2U) -#define SEMC_NANDCR3_NDOPT2_SHIFT (1U) -/*! NDOPT2 - NAND option bit 2 - */ -#define SEMC_NANDCR3_NDOPT2(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR3_NDOPT2_SHIFT)) & SEMC_NANDCR3_NDOPT2_MASK) - -#define SEMC_NANDCR3_NDOPT3_MASK (0x4U) -#define SEMC_NANDCR3_NDOPT3_SHIFT (2U) -/*! NDOPT3 - NAND option bit 3 - */ -#define SEMC_NANDCR3_NDOPT3(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NANDCR3_NDOPT3_SHIFT)) & SEMC_NANDCR3_NDOPT3_MASK) -/*! @} */ - -/*! @name NORCR0 - NOR control register 0 */ -/*! @{ */ - -#define SEMC_NORCR0_PS_MASK (0x1U) -#define SEMC_NORCR0_PS_SHIFT (0U) -/*! PS - Port Size - * 0b0..8bit - * 0b1..16bit - */ -#define SEMC_NORCR0_PS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR0_PS_SHIFT)) & SEMC_NORCR0_PS_MASK) - -#define SEMC_NORCR0_BL_MASK (0x70U) -#define SEMC_NORCR0_BL_SHIFT (4U) -/*! BL - Burst Length - * 0b000..1 - * 0b001..2 - * 0b010..4 - * 0b011..8 - * 0b100..16 - * 0b101..32 - * 0b110..64 - * 0b111..64 - */ -#define SEMC_NORCR0_BL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR0_BL_SHIFT)) & SEMC_NORCR0_BL_MASK) - -#define SEMC_NORCR0_AM_MASK (0x300U) -#define SEMC_NORCR0_AM_SHIFT (8U) -/*! AM - Address Mode - * 0b00..Address/Data MUX mode - * 0b01..Advanced Address/Data MUX mode - * 0b10..Address/Data non-MUX mode - * 0b11..Address/Data non-MUX mode - */ -#define SEMC_NORCR0_AM(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR0_AM_SHIFT)) & SEMC_NORCR0_AM_MASK) - -#define SEMC_NORCR0_ADVP_MASK (0x400U) -#define SEMC_NORCR0_ADVP_SHIFT (10U) -/*! ADVP - ADV# polarity - * 0b0..ADV# is Low Active. In ASYNC mode, device sample address with ADV# rise edge; In SYNC mode, device sample address when ADV# is LOW. - * 0b1..ADV# is High Active. In ASYNC mode, device sample address with ADV# fall edge; In SYNC mode, device sample address when ADV# is HIGH. - */ -#define SEMC_NORCR0_ADVP(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR0_ADVP_SHIFT)) & SEMC_NORCR0_ADVP_MASK) - -#define SEMC_NORCR0_COL_MASK (0xF000U) -#define SEMC_NORCR0_COL_SHIFT (12U) -/*! COL - Column Address bit width - * 0b0000..12 Bits - * 0b0001..11 Bits - * 0b0010..10 Bits - * 0b0011..9 Bits - * 0b0100..8 Bits - * 0b0101..7 Bits - * 0b0110..6 Bits - * 0b0111..5 Bits - * 0b1000..4 Bits - * 0b1001..3 Bits - * 0b1010..2 Bits - * 0b1011..12 Bits - * 0b1100..12 Bits - * 0b1101..12 Bits - * 0b1110..12 Bits - * 0b1111..12 Bits - */ -#define SEMC_NORCR0_COL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR0_COL_SHIFT)) & SEMC_NORCR0_COL_MASK) -/*! @} */ - -/*! @name NORCR1 - NOR control register 1 */ -/*! @{ */ - -#define SEMC_NORCR1_CES_MASK (0xFU) -#define SEMC_NORCR1_CES_SHIFT (0U) -/*! CES - CE setup time cycle - */ -#define SEMC_NORCR1_CES(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_CES_SHIFT)) & SEMC_NORCR1_CES_MASK) - -#define SEMC_NORCR1_CEH_MASK (0xF0U) -#define SEMC_NORCR1_CEH_SHIFT (4U) -/*! CEH - CE hold min time (CEH+1) cycle - */ -#define SEMC_NORCR1_CEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_CEH_SHIFT)) & SEMC_NORCR1_CEH_MASK) - -#define SEMC_NORCR1_AS_MASK (0xF00U) -#define SEMC_NORCR1_AS_SHIFT (8U) -/*! AS - Address setup time - */ -#define SEMC_NORCR1_AS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_AS_SHIFT)) & SEMC_NORCR1_AS_MASK) - -#define SEMC_NORCR1_AH_MASK (0xF000U) -#define SEMC_NORCR1_AH_SHIFT (12U) -/*! AH - Address hold time - */ -#define SEMC_NORCR1_AH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_AH_SHIFT)) & SEMC_NORCR1_AH_MASK) - -#define SEMC_NORCR1_WEL_MASK (0xF0000U) -#define SEMC_NORCR1_WEL_SHIFT (16U) -/*! WEL - WE LOW time (WEL+1) cycle - */ -#define SEMC_NORCR1_WEL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_WEL_SHIFT)) & SEMC_NORCR1_WEL_MASK) - -#define SEMC_NORCR1_WEH_MASK (0xF00000U) -#define SEMC_NORCR1_WEH_SHIFT (20U) -/*! WEH - WE HIGH time (WEH+1) cycle - */ -#define SEMC_NORCR1_WEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_WEH_SHIFT)) & SEMC_NORCR1_WEH_MASK) - -#define SEMC_NORCR1_REL_MASK (0xF000000U) -#define SEMC_NORCR1_REL_SHIFT (24U) -/*! REL - RE LOW time (REL+1) cycle - */ -#define SEMC_NORCR1_REL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_REL_SHIFT)) & SEMC_NORCR1_REL_MASK) - -#define SEMC_NORCR1_REH_MASK (0xF0000000U) -#define SEMC_NORCR1_REH_SHIFT (28U) -/*! REH - RE HIGH time (REH+1) cycle - */ -#define SEMC_NORCR1_REH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR1_REH_SHIFT)) & SEMC_NORCR1_REH_MASK) -/*! @} */ - -/*! @name NORCR2 - NOR control register 2 */ -/*! @{ */ - -#define SEMC_NORCR2_WDS_MASK (0xFU) -#define SEMC_NORCR2_WDS_SHIFT (0U) -/*! WDS - Write Data setup time (WDS+1) cycle - */ -#define SEMC_NORCR2_WDS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_WDS_SHIFT)) & SEMC_NORCR2_WDS_MASK) - -#define SEMC_NORCR2_WDH_MASK (0xF0U) -#define SEMC_NORCR2_WDH_SHIFT (4U) -/*! WDH - Write Data hold time (WDH+1) cycle - */ -#define SEMC_NORCR2_WDH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_WDH_SHIFT)) & SEMC_NORCR2_WDH_MASK) - -#define SEMC_NORCR2_TA_MASK (0xF00U) -#define SEMC_NORCR2_TA_SHIFT (8U) -/*! TA - Turnaround time cycle - */ -#define SEMC_NORCR2_TA(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_TA_SHIFT)) & SEMC_NORCR2_TA_MASK) - -#define SEMC_NORCR2_AWDH_MASK (0xF000U) -#define SEMC_NORCR2_AWDH_SHIFT (12U) -/*! AWDH - Address to write data hold time cycle - */ -#define SEMC_NORCR2_AWDH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_AWDH_SHIFT)) & SEMC_NORCR2_AWDH_MASK) - -#define SEMC_NORCR2_LC_MASK (0xF0000U) -#define SEMC_NORCR2_LC_SHIFT (16U) -/*! LC - Latency count - */ -#define SEMC_NORCR2_LC(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_LC_SHIFT)) & SEMC_NORCR2_LC_MASK) - -#define SEMC_NORCR2_RD_MASK (0xF00000U) -#define SEMC_NORCR2_RD_SHIFT (20U) -/*! RD - Read cycle time - */ -#define SEMC_NORCR2_RD(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_RD_SHIFT)) & SEMC_NORCR2_RD_MASK) - -#define SEMC_NORCR2_CEITV_MASK (0xF000000U) -#define SEMC_NORCR2_CEITV_SHIFT (24U) -/*! CEITV - CE# interval min time - */ -#define SEMC_NORCR2_CEITV(x) (((uint32_t)(((uint32_t)(x)) << SEMC_NORCR2_CEITV_SHIFT)) & SEMC_NORCR2_CEITV_MASK) -/*! @} */ - -/*! @name SRAMCR0 - SRAM control register 0 */ -/*! @{ */ - -#define SEMC_SRAMCR0_PS_MASK (0x1U) -#define SEMC_SRAMCR0_PS_SHIFT (0U) -/*! PS - Port Size - * 0b0..8bit - * 0b1..16bit - */ -#define SEMC_SRAMCR0_PS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR0_PS_SHIFT)) & SEMC_SRAMCR0_PS_MASK) - -#define SEMC_SRAMCR0_BL_MASK (0x70U) -#define SEMC_SRAMCR0_BL_SHIFT (4U) -/*! BL - Burst Length - * 0b000..1 - * 0b001..2 - * 0b010..4 - * 0b011..8 - * 0b100..16 - * 0b101..32 - * 0b110..64 - * 0b111..64 - */ -#define SEMC_SRAMCR0_BL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR0_BL_SHIFT)) & SEMC_SRAMCR0_BL_MASK) - -#define SEMC_SRAMCR0_AM_MASK (0x300U) -#define SEMC_SRAMCR0_AM_SHIFT (8U) -/*! AM - Address Mode - * 0b00..Address/Data MUX mode - * 0b01..Advanced Address/Data MUX mode - * 0b10..Address/Data non-MUX mode - * 0b11..Address/Data non-MUX mode - */ -#define SEMC_SRAMCR0_AM(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR0_AM_SHIFT)) & SEMC_SRAMCR0_AM_MASK) - -#define SEMC_SRAMCR0_ADVP_MASK (0x400U) -#define SEMC_SRAMCR0_ADVP_SHIFT (10U) -/*! ADVP - ADV# polarity - * 0b0..ADV# is Low Active. In ASYNC mode, device sample address with ADV# rise edge; In SYNC mode, device sample address when ADV# is LOW. - * 0b1..ADV# is High Active. In ASYNC mode, device sample address with ADV# fall edge; In SYNC mode, device sample address when ADV# is HIGH. - */ -#define SEMC_SRAMCR0_ADVP(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR0_ADVP_SHIFT)) & SEMC_SRAMCR0_ADVP_MASK) - -#define SEMC_SRAMCR0_COL_MASK (0xF000U) -#define SEMC_SRAMCR0_COL_SHIFT (12U) -/*! COL - Column Address bit width - * 0b0000..12 Bits - * 0b0001..11 Bits - * 0b0010..10 Bits - * 0b0011..9 Bits - * 0b0100..8 Bits - * 0b0101..7 Bits - * 0b0110..6 Bits - * 0b0111..5 Bits - * 0b1000..4 Bits - * 0b1001..3 Bits - * 0b1010..2 Bits - * 0b1011..12 Bits - * 0b1100..12 Bits - * 0b1101..12 Bits - * 0b1110..12 Bits - * 0b1111..12 Bits - */ -#define SEMC_SRAMCR0_COL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR0_COL_SHIFT)) & SEMC_SRAMCR0_COL_MASK) -/*! @} */ - -/*! @name SRAMCR1 - SRAM control register 1 */ -/*! @{ */ - -#define SEMC_SRAMCR1_CES_MASK (0xFU) -#define SEMC_SRAMCR1_CES_SHIFT (0U) -/*! CES - CE setup time cycle - */ -#define SEMC_SRAMCR1_CES(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_CES_SHIFT)) & SEMC_SRAMCR1_CES_MASK) - -#define SEMC_SRAMCR1_CEH_MASK (0xF0U) -#define SEMC_SRAMCR1_CEH_SHIFT (4U) -/*! CEH - CE hold min time (CEH+1) cycle - */ -#define SEMC_SRAMCR1_CEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_CEH_SHIFT)) & SEMC_SRAMCR1_CEH_MASK) - -#define SEMC_SRAMCR1_AS_MASK (0xF00U) -#define SEMC_SRAMCR1_AS_SHIFT (8U) -/*! AS - Address setup time - */ -#define SEMC_SRAMCR1_AS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_AS_SHIFT)) & SEMC_SRAMCR1_AS_MASK) - -#define SEMC_SRAMCR1_AH_MASK (0xF000U) -#define SEMC_SRAMCR1_AH_SHIFT (12U) -/*! AH - Address hold time - */ -#define SEMC_SRAMCR1_AH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_AH_SHIFT)) & SEMC_SRAMCR1_AH_MASK) - -#define SEMC_SRAMCR1_WEL_MASK (0xF0000U) -#define SEMC_SRAMCR1_WEL_SHIFT (16U) -/*! WEL - WE LOW time (WEL+1) cycle - */ -#define SEMC_SRAMCR1_WEL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_WEL_SHIFT)) & SEMC_SRAMCR1_WEL_MASK) - -#define SEMC_SRAMCR1_WEH_MASK (0xF00000U) -#define SEMC_SRAMCR1_WEH_SHIFT (20U) -/*! WEH - WE HIGH time (WEH+1) cycle - */ -#define SEMC_SRAMCR1_WEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_WEH_SHIFT)) & SEMC_SRAMCR1_WEH_MASK) - -#define SEMC_SRAMCR1_REL_MASK (0xF000000U) -#define SEMC_SRAMCR1_REL_SHIFT (24U) -/*! REL - RE LOW time (REL+1) cycle - */ -#define SEMC_SRAMCR1_REL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_REL_SHIFT)) & SEMC_SRAMCR1_REL_MASK) - -#define SEMC_SRAMCR1_REH_MASK (0xF0000000U) -#define SEMC_SRAMCR1_REH_SHIFT (28U) -/*! REH - RE HIGH time (REH+1) cycle - */ -#define SEMC_SRAMCR1_REH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR1_REH_SHIFT)) & SEMC_SRAMCR1_REH_MASK) -/*! @} */ - -/*! @name SRAMCR2 - SRAM control register 2 */ -/*! @{ */ - -#define SEMC_SRAMCR2_WDS_MASK (0xFU) -#define SEMC_SRAMCR2_WDS_SHIFT (0U) -/*! WDS - Write Data setup time (WDS+1) cycle - */ -#define SEMC_SRAMCR2_WDS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_WDS_SHIFT)) & SEMC_SRAMCR2_WDS_MASK) - -#define SEMC_SRAMCR2_WDH_MASK (0xF0U) -#define SEMC_SRAMCR2_WDH_SHIFT (4U) -/*! WDH - Write Data hold time (WDH+1) cycle - */ -#define SEMC_SRAMCR2_WDH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_WDH_SHIFT)) & SEMC_SRAMCR2_WDH_MASK) - -#define SEMC_SRAMCR2_TA_MASK (0xF00U) -#define SEMC_SRAMCR2_TA_SHIFT (8U) -/*! TA - Turnaround time cycle - */ -#define SEMC_SRAMCR2_TA(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_TA_SHIFT)) & SEMC_SRAMCR2_TA_MASK) - -#define SEMC_SRAMCR2_AWDH_MASK (0xF000U) -#define SEMC_SRAMCR2_AWDH_SHIFT (12U) -/*! AWDH - Address to write data hold time cycle - */ -#define SEMC_SRAMCR2_AWDH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_AWDH_SHIFT)) & SEMC_SRAMCR2_AWDH_MASK) - -#define SEMC_SRAMCR2_LC_MASK (0xF0000U) -#define SEMC_SRAMCR2_LC_SHIFT (16U) -/*! LC - Latency count - */ -#define SEMC_SRAMCR2_LC(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_LC_SHIFT)) & SEMC_SRAMCR2_LC_MASK) - -#define SEMC_SRAMCR2_RD_MASK (0xF00000U) -#define SEMC_SRAMCR2_RD_SHIFT (20U) -/*! RD - Read cycle time - */ -#define SEMC_SRAMCR2_RD(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_RD_SHIFT)) & SEMC_SRAMCR2_RD_MASK) - -#define SEMC_SRAMCR2_CEITV_MASK (0xF000000U) -#define SEMC_SRAMCR2_CEITV_SHIFT (24U) -/*! CEITV - CE# interval min time - */ -#define SEMC_SRAMCR2_CEITV(x) (((uint32_t)(((uint32_t)(x)) << SEMC_SRAMCR2_CEITV_SHIFT)) & SEMC_SRAMCR2_CEITV_MASK) -/*! @} */ - -/*! @name DBICR0 - DBI-B control register 0 */ -/*! @{ */ - -#define SEMC_DBICR0_PS_MASK (0x1U) -#define SEMC_DBICR0_PS_SHIFT (0U) -/*! PS - Port Size - * 0b0..8bit - * 0b1..16bit - */ -#define SEMC_DBICR0_PS(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR0_PS_SHIFT)) & SEMC_DBICR0_PS_MASK) - -#define SEMC_DBICR0_BL_MASK (0x70U) -#define SEMC_DBICR0_BL_SHIFT (4U) -/*! BL - Burst Length - * 0b000..1 - * 0b001..2 - * 0b010..4 - * 0b011..8 - * 0b100..16 - * 0b101..32 - * 0b110..64 - * 0b111..64 - */ -#define SEMC_DBICR0_BL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR0_BL_SHIFT)) & SEMC_DBICR0_BL_MASK) - -#define SEMC_DBICR0_COL_MASK (0xF000U) -#define SEMC_DBICR0_COL_SHIFT (12U) -/*! COL - Column Address bit width - * 0b0000..12 Bits - * 0b0001..11 Bits - * 0b0010..10 Bits - * 0b0011..9 Bits - * 0b0100..8 Bits - * 0b0101..7 Bits - * 0b0110..6 Bits - * 0b0111..5 Bits - * 0b1000..4 Bits - * 0b1001..3 Bits - * 0b1010..2 Bits - * 0b1011..12 Bits - * 0b1100..12 Bits - * 0b1101..12 Bits - * 0b1110..12 Bits - * 0b1111..12 Bits - */ -#define SEMC_DBICR0_COL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR0_COL_SHIFT)) & SEMC_DBICR0_COL_MASK) -/*! @} */ - -/*! @name DBICR1 - DBI-B control register 1 */ -/*! @{ */ - -#define SEMC_DBICR1_CES_MASK (0xFU) -#define SEMC_DBICR1_CES_SHIFT (0U) -/*! CES - CSX Setup Time - */ -#define SEMC_DBICR1_CES(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_CES_SHIFT)) & SEMC_DBICR1_CES_MASK) - -#define SEMC_DBICR1_CEH_MASK (0xF0U) -#define SEMC_DBICR1_CEH_SHIFT (4U) -/*! CEH - CSX Hold Time - */ -#define SEMC_DBICR1_CEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_CEH_SHIFT)) & SEMC_DBICR1_CEH_MASK) - -#define SEMC_DBICR1_WEL_MASK (0xF00U) -#define SEMC_DBICR1_WEL_SHIFT (8U) -/*! WEL - WRX Low Time - */ -#define SEMC_DBICR1_WEL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_WEL_SHIFT)) & SEMC_DBICR1_WEL_MASK) - -#define SEMC_DBICR1_WEH_MASK (0xF000U) -#define SEMC_DBICR1_WEH_SHIFT (12U) -/*! WEH - WRX High Time - */ -#define SEMC_DBICR1_WEH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_WEH_SHIFT)) & SEMC_DBICR1_WEH_MASK) - -#define SEMC_DBICR1_REL_MASK (0xF0000U) -#define SEMC_DBICR1_REL_SHIFT (16U) -/*! REL - RDX Low Time bit [3:0] - */ -#define SEMC_DBICR1_REL(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_REL_SHIFT)) & SEMC_DBICR1_REL_MASK) - -#define SEMC_DBICR1_REH_MASK (0xF00000U) -#define SEMC_DBICR1_REH_SHIFT (20U) -/*! REH - RDX High Time bit [3:0] - */ -#define SEMC_DBICR1_REH(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_REH_SHIFT)) & SEMC_DBICR1_REH_MASK) - -#define SEMC_DBICR1_CEITV_MASK (0xF000000U) -#define SEMC_DBICR1_CEITV_SHIFT (24U) -/*! CEITV - CSX interval min time - */ -#define SEMC_DBICR1_CEITV(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_CEITV_SHIFT)) & SEMC_DBICR1_CEITV_MASK) - -#define SEMC_DBICR1_REL2_MASK (0x30000000U) -#define SEMC_DBICR1_REL2_SHIFT (28U) -/*! REL2 - RDX Low Time bit [5:4] - */ -#define SEMC_DBICR1_REL2(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_REL2_SHIFT)) & SEMC_DBICR1_REL2_MASK) - -#define SEMC_DBICR1_REH2_MASK (0xC0000000U) -#define SEMC_DBICR1_REH2_SHIFT (30U) -/*! REH2 - RDX High Time bit [5:4] - */ -#define SEMC_DBICR1_REH2(x) (((uint32_t)(((uint32_t)(x)) << SEMC_DBICR1_REH2_SHIFT)) & SEMC_DBICR1_REH2_MASK) -/*! @} */ - -/*! @name IPCR0 - IP Command control register 0 */ -/*! @{ */ - -#define SEMC_IPCR0_SA_MASK (0xFFFFFFFFU) -#define SEMC_IPCR0_SA_SHIFT (0U) -/*! SA - Slave address - */ -#define SEMC_IPCR0_SA(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR0_SA_SHIFT)) & SEMC_IPCR0_SA_MASK) -/*! @} */ - -/*! @name IPCR1 - IP Command control register 1 */ -/*! @{ */ - -#define SEMC_IPCR1_DATSZ_MASK (0x7U) -#define SEMC_IPCR1_DATSZ_SHIFT (0U) -/*! DATSZ - Data Size in Byte - * 0b000..4 - * 0b001..1 - * 0b010..2 - * 0b011..3 - * 0b100..4 - * 0b101..4 - * 0b110..4 - * 0b111..4 - */ -#define SEMC_IPCR1_DATSZ(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR1_DATSZ_SHIFT)) & SEMC_IPCR1_DATSZ_MASK) -/*! @} */ - -/*! @name IPCR2 - IP Command control register 2 */ -/*! @{ */ - -#define SEMC_IPCR2_BM0_MASK (0x1U) -#define SEMC_IPCR2_BM0_SHIFT (0U) -/*! BM0 - Byte Mask for Byte 0 (IPTXD bit 7:0) - * 0b0..Byte Unmasked - * 0b1..Byte Masked - */ -#define SEMC_IPCR2_BM0(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR2_BM0_SHIFT)) & SEMC_IPCR2_BM0_MASK) - -#define SEMC_IPCR2_BM1_MASK (0x2U) -#define SEMC_IPCR2_BM1_SHIFT (1U) -/*! BM1 - Byte Mask for Byte 1 (IPTXD bit 15:8) - * 0b0..Byte Unmasked - * 0b1..Byte Masked - */ -#define SEMC_IPCR2_BM1(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR2_BM1_SHIFT)) & SEMC_IPCR2_BM1_MASK) - -#define SEMC_IPCR2_BM2_MASK (0x4U) -#define SEMC_IPCR2_BM2_SHIFT (2U) -/*! BM2 - Byte Mask for Byte 2 (IPTXD bit 23:16) - * 0b0..Byte Unmasked - * 0b1..Byte Masked - */ -#define SEMC_IPCR2_BM2(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR2_BM2_SHIFT)) & SEMC_IPCR2_BM2_MASK) - -#define SEMC_IPCR2_BM3_MASK (0x8U) -#define SEMC_IPCR2_BM3_SHIFT (3U) -/*! BM3 - Byte Mask for Byte 3 (IPTXD bit 31:24) - * 0b0..Byte Unmasked - * 0b1..Byte Masked - */ -#define SEMC_IPCR2_BM3(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCR2_BM3_SHIFT)) & SEMC_IPCR2_BM3_MASK) -/*! @} */ - -/*! @name IPCMD - IP Command register */ -/*! @{ */ - -#define SEMC_IPCMD_CMD_MASK (0xFFFFU) -#define SEMC_IPCMD_CMD_SHIFT (0U) -#define SEMC_IPCMD_CMD(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCMD_CMD_SHIFT)) & SEMC_IPCMD_CMD_MASK) - -#define SEMC_IPCMD_KEY_MASK (0xFFFF0000U) -#define SEMC_IPCMD_KEY_SHIFT (16U) -/*! KEY - This field should be written with 0xA55A when trigging an IP command. - */ -#define SEMC_IPCMD_KEY(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPCMD_KEY_SHIFT)) & SEMC_IPCMD_KEY_MASK) -/*! @} */ - -/*! @name IPTXDAT - TX DATA register (for IP Command) */ -/*! @{ */ - -#define SEMC_IPTXDAT_DAT_MASK (0xFFFFFFFFU) -#define SEMC_IPTXDAT_DAT_SHIFT (0U) -#define SEMC_IPTXDAT_DAT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPTXDAT_DAT_SHIFT)) & SEMC_IPTXDAT_DAT_MASK) -/*! @} */ - -/*! @name IPRXDAT - RX DATA register (for IP Command) */ -/*! @{ */ - -#define SEMC_IPRXDAT_DAT_MASK (0xFFFFFFFFU) -#define SEMC_IPRXDAT_DAT_SHIFT (0U) -#define SEMC_IPRXDAT_DAT(x) (((uint32_t)(((uint32_t)(x)) << SEMC_IPRXDAT_DAT_SHIFT)) & SEMC_IPRXDAT_DAT_MASK) -/*! @} */ - -/*! @name STS0 - Status register 0 */ -/*! @{ */ - -#define SEMC_STS0_IDLE_MASK (0x1U) -#define SEMC_STS0_IDLE_SHIFT (0U) -/*! IDLE - Indicating whether SEMC is in IDLE state. - */ -#define SEMC_STS0_IDLE(x) (((uint32_t)(((uint32_t)(x)) << SEMC_STS0_IDLE_SHIFT)) & SEMC_STS0_IDLE_MASK) - -#define SEMC_STS0_NARDY_MASK (0x2U) -#define SEMC_STS0_NARDY_SHIFT (1U) -/*! NARDY - Indicating NAND device Ready/WAIT# pin level. - * 0b0..NAND device is not ready - * 0b1..NAND device is ready - */ -#define SEMC_STS0_NARDY(x) (((uint32_t)(((uint32_t)(x)) << SEMC_STS0_NARDY_SHIFT)) & SEMC_STS0_NARDY_MASK) -/*! @} */ - -/*! @name STS2 - Status register 2 */ -/*! @{ */ - -#define SEMC_STS2_NDWRPEND_MASK (0x8U) -#define SEMC_STS2_NDWRPEND_SHIFT (3U) -/*! NDWRPEND - This field indicating whether there is pending AXI command (write) to NAND device. - * 0b0..No pending - * 0b1..Pending - */ -#define SEMC_STS2_NDWRPEND(x) (((uint32_t)(((uint32_t)(x)) << SEMC_STS2_NDWRPEND_SHIFT)) & SEMC_STS2_NDWRPEND_MASK) -/*! @} */ - -/*! @name STS12 - Status register 12 */ -/*! @{ */ - -#define SEMC_STS12_NDADDR_MASK (0xFFFFFFFFU) -#define SEMC_STS12_NDADDR_SHIFT (0U) -/*! NDADDR - This field indicating the last write address (AXI command) to NAND device (without base address in SEMC_BR4). - */ -#define SEMC_STS12_NDADDR(x) (((uint32_t)(((uint32_t)(x)) << SEMC_STS12_NDADDR_SHIFT)) & SEMC_STS12_NDADDR_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group SEMC_Register_Masks */ - - -/* SEMC - Peripheral instance base addresses */ -/** Peripheral SEMC base address */ -#define SEMC_BASE (0x402F0000u) -/** Peripheral SEMC base pointer */ -#define SEMC ((SEMC_Type *)SEMC_BASE) -/** Array initializer of SEMC peripheral base addresses */ -#define SEMC_BASE_ADDRS { SEMC_BASE } -/** Array initializer of SEMC peripheral base pointers */ -#define SEMC_BASE_PTRS { SEMC } -/** Interrupt vectors for the SEMC peripheral type */ -#define SEMC_IRQS { SEMC_IRQn } - -/*! - * @} - */ /* end of group SEMC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- SNVS Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SNVS_Peripheral_Access_Layer SNVS Peripheral Access Layer - * @{ - */ - -/** SNVS - Register Layout Typedef */ -typedef struct { - __IO uint32_t HPLR; /**< SNVS_HP Lock Register, offset: 0x0 */ - __IO uint32_t HPCOMR; /**< SNVS_HP Command Register, offset: 0x4 */ - __IO uint32_t HPCR; /**< SNVS_HP Control Register, offset: 0x8 */ - __IO uint32_t HPSICR; /**< SNVS_HP Security Interrupt Control Register, offset: 0xC */ - __IO uint32_t HPSVCR; /**< SNVS_HP Security Violation Control Register, offset: 0x10 */ - __IO uint32_t HPSR; /**< SNVS_HP Status Register, offset: 0x14 */ - __IO uint32_t HPSVSR; /**< SNVS_HP Security Violation Status Register, offset: 0x18 */ - __IO uint32_t HPHACIVR; /**< SNVS_HP High Assurance Counter IV Register, offset: 0x1C */ - __I uint32_t HPHACR; /**< SNVS_HP High Assurance Counter Register, offset: 0x20 */ - __IO uint32_t HPRTCMR; /**< SNVS_HP Real Time Counter MSB Register, offset: 0x24 */ - __IO uint32_t HPRTCLR; /**< SNVS_HP Real Time Counter LSB Register, offset: 0x28 */ - __IO uint32_t HPTAMR; /**< SNVS_HP Time Alarm MSB Register, offset: 0x2C */ - __IO uint32_t HPTALR; /**< SNVS_HP Time Alarm LSB Register, offset: 0x30 */ - __IO uint32_t LPLR; /**< SNVS_LP Lock Register, offset: 0x34 */ - __IO uint32_t LPCR; /**< SNVS_LP Control Register, offset: 0x38 */ - __IO uint32_t LPMKCR; /**< SNVS_LP Master Key Control Register, offset: 0x3C */ - __IO uint32_t LPSVCR; /**< SNVS_LP Security Violation Control Register, offset: 0x40 */ - uint8_t RESERVED_0[4]; - __IO uint32_t LPTDCR; /**< SNVS_LP Tamper Detectors Configuration Register, offset: 0x48 */ - __IO uint32_t LPSR; /**< SNVS_LP Status Register, offset: 0x4C */ - __IO uint32_t LPSRTCMR; /**< SNVS_LP Secure Real Time Counter MSB Register, offset: 0x50 */ - __IO uint32_t LPSRTCLR; /**< SNVS_LP Secure Real Time Counter LSB Register, offset: 0x54 */ - __IO uint32_t LPTAR; /**< SNVS_LP Time Alarm Register, offset: 0x58 */ - __I uint32_t LPSMCMR; /**< SNVS_LP Secure Monotonic Counter MSB Register, offset: 0x5C */ - __I uint32_t LPSMCLR; /**< SNVS_LP Secure Monotonic Counter LSB Register, offset: 0x60 */ - __IO uint32_t LPPGDR; /**< SNVS_LP Power Glitch Detector Register, offset: 0x64 */ - __IO uint32_t LPGPR0_LEGACY_ALIAS; /**< SNVS_LP General Purpose Register 0 (legacy alias), offset: 0x68 */ - __IO uint32_t LPZMKR[8]; /**< SNVS_LP Zeroizable Master Key Register, array offset: 0x6C, array step: 0x4 */ - uint8_t RESERVED_1[4]; - __IO uint32_t LPGPR_ALIAS[4]; /**< SNVS_LP General Purpose Registers 0 .. 3, array offset: 0x90, array step: 0x4 */ - uint8_t RESERVED_2[96]; - __IO uint32_t LPGPR[8]; /**< SNVS_LP General Purpose Registers 0 .. 7, array offset: 0x100, array step: 0x4 */ - uint8_t RESERVED_3[2776]; - __I uint32_t HPVIDR1; /**< SNVS_HP Version ID Register 1, offset: 0xBF8 */ - __I uint32_t HPVIDR2; /**< SNVS_HP Version ID Register 2, offset: 0xBFC */ -} SNVS_Type; - -/* ---------------------------------------------------------------------------- - -- SNVS Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SNVS_Register_Masks SNVS Register Masks - * @{ - */ - -/*! @name HPLR - SNVS_HP Lock Register */ -/*! @{ */ - -#define SNVS_HPLR_ZMK_WSL_MASK (0x1U) -#define SNVS_HPLR_ZMK_WSL_SHIFT (0U) -/*! ZMK_WSL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_ZMK_WSL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_ZMK_WSL_SHIFT)) & SNVS_HPLR_ZMK_WSL_MASK) - -#define SNVS_HPLR_ZMK_RSL_MASK (0x2U) -#define SNVS_HPLR_ZMK_RSL_SHIFT (1U) -/*! ZMK_RSL - * 0b0..Read access is allowed (only in software Programming mode) - * 0b1..Read access is not allowed - */ -#define SNVS_HPLR_ZMK_RSL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_ZMK_RSL_SHIFT)) & SNVS_HPLR_ZMK_RSL_MASK) - -#define SNVS_HPLR_SRTC_SL_MASK (0x4U) -#define SNVS_HPLR_SRTC_SL_SHIFT (2U) -/*! SRTC_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_SRTC_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_SRTC_SL_SHIFT)) & SNVS_HPLR_SRTC_SL_MASK) - -#define SNVS_HPLR_LPCALB_SL_MASK (0x8U) -#define SNVS_HPLR_LPCALB_SL_SHIFT (3U) -/*! LPCALB_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_LPCALB_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPCALB_SL_SHIFT)) & SNVS_HPLR_LPCALB_SL_MASK) - -#define SNVS_HPLR_MC_SL_MASK (0x10U) -#define SNVS_HPLR_MC_SL_SHIFT (4U) -/*! MC_SL - * 0b0..Write access (increment) is allowed - * 0b1..Write access (increment) is not allowed - */ -#define SNVS_HPLR_MC_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_MC_SL_SHIFT)) & SNVS_HPLR_MC_SL_MASK) - -#define SNVS_HPLR_GPR_SL_MASK (0x20U) -#define SNVS_HPLR_GPR_SL_SHIFT (5U) -/*! GPR_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_GPR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_GPR_SL_SHIFT)) & SNVS_HPLR_GPR_SL_MASK) - -#define SNVS_HPLR_LPSVCR_SL_MASK (0x40U) -#define SNVS_HPLR_LPSVCR_SL_SHIFT (6U) -/*! LPSVCR_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_LPSVCR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPSVCR_SL_SHIFT)) & SNVS_HPLR_LPSVCR_SL_MASK) - -#define SNVS_HPLR_LPTDCR_SL_MASK (0x100U) -#define SNVS_HPLR_LPTDCR_SL_SHIFT (8U) -/*! LPTDCR_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_LPTDCR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPTDCR_SL_SHIFT)) & SNVS_HPLR_LPTDCR_SL_MASK) - -#define SNVS_HPLR_MKS_SL_MASK (0x200U) -#define SNVS_HPLR_MKS_SL_SHIFT (9U) -/*! MKS_SL - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_MKS_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_MKS_SL_SHIFT)) & SNVS_HPLR_MKS_SL_MASK) - -#define SNVS_HPLR_HPSVCR_L_MASK (0x10000U) -#define SNVS_HPLR_HPSVCR_L_SHIFT (16U) -/*! HPSVCR_L - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_HPSVCR_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HPSVCR_L_SHIFT)) & SNVS_HPLR_HPSVCR_L_MASK) - -#define SNVS_HPLR_HPSICR_L_MASK (0x20000U) -#define SNVS_HPLR_HPSICR_L_SHIFT (17U) -/*! HPSICR_L - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_HPSICR_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HPSICR_L_SHIFT)) & SNVS_HPLR_HPSICR_L_MASK) - -#define SNVS_HPLR_HAC_L_MASK (0x40000U) -#define SNVS_HPLR_HAC_L_SHIFT (18U) -/*! HAC_L - * 0b0..Write access is allowed - * 0b1..Write access is not allowed - */ -#define SNVS_HPLR_HAC_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HAC_L_SHIFT)) & SNVS_HPLR_HAC_L_MASK) -/*! @} */ - -/*! @name HPCOMR - SNVS_HP Command Register */ -/*! @{ */ - -#define SNVS_HPCOMR_SSM_ST_MASK (0x1U) -#define SNVS_HPCOMR_SSM_ST_SHIFT (0U) -#define SNVS_HPCOMR_SSM_ST(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_ST_SHIFT)) & SNVS_HPCOMR_SSM_ST_MASK) - -#define SNVS_HPCOMR_SSM_ST_DIS_MASK (0x2U) -#define SNVS_HPCOMR_SSM_ST_DIS_SHIFT (1U) -/*! SSM_ST_DIS - * 0b0..Secure to Trusted State transition is enabled - * 0b1..Secure to Trusted State transition is disabled - */ -#define SNVS_HPCOMR_SSM_ST_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_ST_DIS_SHIFT)) & SNVS_HPCOMR_SSM_ST_DIS_MASK) - -#define SNVS_HPCOMR_SSM_SFNS_DIS_MASK (0x4U) -#define SNVS_HPCOMR_SSM_SFNS_DIS_SHIFT (2U) -/*! SSM_SFNS_DIS - * 0b0..Soft Fail to Non-Secure State transition is enabled - * 0b1..Soft Fail to Non-Secure State transition is disabled - */ -#define SNVS_HPCOMR_SSM_SFNS_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_SFNS_DIS_SHIFT)) & SNVS_HPCOMR_SSM_SFNS_DIS_MASK) - -#define SNVS_HPCOMR_LP_SWR_MASK (0x10U) -#define SNVS_HPCOMR_LP_SWR_SHIFT (4U) -/*! LP_SWR - * 0b0..No Action - * 0b1..Reset LP section - */ -#define SNVS_HPCOMR_LP_SWR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_LP_SWR_SHIFT)) & SNVS_HPCOMR_LP_SWR_MASK) - -#define SNVS_HPCOMR_LP_SWR_DIS_MASK (0x20U) -#define SNVS_HPCOMR_LP_SWR_DIS_SHIFT (5U) -/*! LP_SWR_DIS - * 0b0..LP software reset is enabled - * 0b1..LP software reset is disabled - */ -#define SNVS_HPCOMR_LP_SWR_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_LP_SWR_DIS_SHIFT)) & SNVS_HPCOMR_LP_SWR_DIS_MASK) - -#define SNVS_HPCOMR_SW_SV_MASK (0x100U) -#define SNVS_HPCOMR_SW_SV_SHIFT (8U) -#define SNVS_HPCOMR_SW_SV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_SV_SHIFT)) & SNVS_HPCOMR_SW_SV_MASK) - -#define SNVS_HPCOMR_SW_FSV_MASK (0x200U) -#define SNVS_HPCOMR_SW_FSV_SHIFT (9U) -#define SNVS_HPCOMR_SW_FSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_FSV_SHIFT)) & SNVS_HPCOMR_SW_FSV_MASK) - -#define SNVS_HPCOMR_SW_LPSV_MASK (0x400U) -#define SNVS_HPCOMR_SW_LPSV_SHIFT (10U) -#define SNVS_HPCOMR_SW_LPSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_LPSV_SHIFT)) & SNVS_HPCOMR_SW_LPSV_MASK) - -#define SNVS_HPCOMR_PROG_ZMK_MASK (0x1000U) -#define SNVS_HPCOMR_PROG_ZMK_SHIFT (12U) -/*! PROG_ZMK - * 0b0..No Action - * 0b1..Activate hardware key programming mechanism - */ -#define SNVS_HPCOMR_PROG_ZMK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_PROG_ZMK_SHIFT)) & SNVS_HPCOMR_PROG_ZMK_MASK) - -#define SNVS_HPCOMR_MKS_EN_MASK (0x2000U) -#define SNVS_HPCOMR_MKS_EN_SHIFT (13U) -/*! MKS_EN - * 0b0..OTP master key is selected as an SNVS master key - * 0b1..SNVS master key is selected according to the setting of the MASTER_KEY_SEL field of LPMKCR - */ -#define SNVS_HPCOMR_MKS_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_MKS_EN_SHIFT)) & SNVS_HPCOMR_MKS_EN_MASK) - -#define SNVS_HPCOMR_HAC_EN_MASK (0x10000U) -#define SNVS_HPCOMR_HAC_EN_SHIFT (16U) -/*! HAC_EN - * 0b0..High Assurance Counter is disabled - * 0b1..High Assurance Counter is enabled - */ -#define SNVS_HPCOMR_HAC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_EN_SHIFT)) & SNVS_HPCOMR_HAC_EN_MASK) - -#define SNVS_HPCOMR_HAC_LOAD_MASK (0x20000U) -#define SNVS_HPCOMR_HAC_LOAD_SHIFT (17U) -/*! HAC_LOAD - * 0b0..No Action - * 0b1..Load the HAC - */ -#define SNVS_HPCOMR_HAC_LOAD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_LOAD_SHIFT)) & SNVS_HPCOMR_HAC_LOAD_MASK) - -#define SNVS_HPCOMR_HAC_CLEAR_MASK (0x40000U) -#define SNVS_HPCOMR_HAC_CLEAR_SHIFT (18U) -/*! HAC_CLEAR - * 0b0..No Action - * 0b1..Clear the HAC - */ -#define SNVS_HPCOMR_HAC_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_CLEAR_SHIFT)) & SNVS_HPCOMR_HAC_CLEAR_MASK) - -#define SNVS_HPCOMR_HAC_STOP_MASK (0x80000U) -#define SNVS_HPCOMR_HAC_STOP_SHIFT (19U) -#define SNVS_HPCOMR_HAC_STOP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_STOP_SHIFT)) & SNVS_HPCOMR_HAC_STOP_MASK) - -#define SNVS_HPCOMR_NPSWA_EN_MASK (0x80000000U) -#define SNVS_HPCOMR_NPSWA_EN_SHIFT (31U) -#define SNVS_HPCOMR_NPSWA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_NPSWA_EN_SHIFT)) & SNVS_HPCOMR_NPSWA_EN_MASK) -/*! @} */ - -/*! @name HPCR - SNVS_HP Control Register */ -/*! @{ */ - -#define SNVS_HPCR_RTC_EN_MASK (0x1U) -#define SNVS_HPCR_RTC_EN_SHIFT (0U) -/*! RTC_EN - * 0b0..RTC is disabled - * 0b1..RTC is enabled - */ -#define SNVS_HPCR_RTC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_RTC_EN_SHIFT)) & SNVS_HPCR_RTC_EN_MASK) - -#define SNVS_HPCR_HPTA_EN_MASK (0x2U) -#define SNVS_HPCR_HPTA_EN_SHIFT (1U) -/*! HPTA_EN - * 0b0..HP Time Alarm Interrupt is disabled - * 0b1..HP Time Alarm Interrupt is enabled - */ -#define SNVS_HPCR_HPTA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPTA_EN_SHIFT)) & SNVS_HPCR_HPTA_EN_MASK) - -#define SNVS_HPCR_DIS_PI_MASK (0x4U) -#define SNVS_HPCR_DIS_PI_SHIFT (2U) -/*! DIS_PI - * 0b0..Periodic interrupt will trigger a functional interrupt - * 0b1..Disable periodic interrupt in the function interrupt - */ -#define SNVS_HPCR_DIS_PI(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_DIS_PI_SHIFT)) & SNVS_HPCR_DIS_PI_MASK) - -#define SNVS_HPCR_PI_EN_MASK (0x8U) -#define SNVS_HPCR_PI_EN_SHIFT (3U) -/*! PI_EN - * 0b0..HP Periodic Interrupt is disabled - * 0b1..HP Periodic Interrupt is enabled - */ -#define SNVS_HPCR_PI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_PI_EN_SHIFT)) & SNVS_HPCR_PI_EN_MASK) - -#define SNVS_HPCR_PI_FREQ_MASK (0xF0U) -#define SNVS_HPCR_PI_FREQ_SHIFT (4U) -/*! PI_FREQ - * 0b0000..- bit 0 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0001..- bit 1 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0010..- bit 2 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0011..- bit 3 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0100..- bit 4 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0101..- bit 5 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0110..- bit 6 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b0111..- bit 7 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1000..- bit 8 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1001..- bit 9 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1010..- bit 10 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1011..- bit 11 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1100..- bit 12 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1101..- bit 13 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1110..- bit 14 of the HPRTCLR is selected as a source of the periodic interrupt - * 0b1111..- bit 15 of the HPRTCLR is selected as a source of the periodic interrupt - */ -#define SNVS_HPCR_PI_FREQ(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_PI_FREQ_SHIFT)) & SNVS_HPCR_PI_FREQ_MASK) - -#define SNVS_HPCR_HPCALB_EN_MASK (0x100U) -#define SNVS_HPCR_HPCALB_EN_SHIFT (8U) -/*! HPCALB_EN - * 0b0..HP Timer calibration disabled - * 0b1..HP Timer calibration enabled - */ -#define SNVS_HPCR_HPCALB_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPCALB_EN_SHIFT)) & SNVS_HPCR_HPCALB_EN_MASK) - -#define SNVS_HPCR_HPCALB_VAL_MASK (0x7C00U) -#define SNVS_HPCR_HPCALB_VAL_SHIFT (10U) -/*! HPCALB_VAL - * 0b00000..+0 counts per each 32768 ticks of the counter - * 0b00001..+1 counts per each 32768 ticks of the counter - * 0b00010..+2 counts per each 32768 ticks of the counter - * 0b01111..+15 counts per each 32768 ticks of the counter - * 0b10000..-16 counts per each 32768 ticks of the counter - * 0b10001..-15 counts per each 32768 ticks of the counter - * 0b11110..-2 counts per each 32768 ticks of the counter - * 0b11111..-1 counts per each 32768 ticks of the counter - */ -#define SNVS_HPCR_HPCALB_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPCALB_VAL_SHIFT)) & SNVS_HPCR_HPCALB_VAL_MASK) - -#define SNVS_HPCR_HP_TS_MASK (0x10000U) -#define SNVS_HPCR_HP_TS_SHIFT (16U) -/*! HP_TS - * 0b0..No Action - * 0b1..Synchronize the HP Time Counter to the LP Time Counter - */ -#define SNVS_HPCR_HP_TS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HP_TS_SHIFT)) & SNVS_HPCR_HP_TS_MASK) - -#define SNVS_HPCR_BTN_CONFIG_MASK (0x7000000U) -#define SNVS_HPCR_BTN_CONFIG_SHIFT (24U) -#define SNVS_HPCR_BTN_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_BTN_CONFIG_SHIFT)) & SNVS_HPCR_BTN_CONFIG_MASK) - -#define SNVS_HPCR_BTN_MASK_MASK (0x8000000U) -#define SNVS_HPCR_BTN_MASK_SHIFT (27U) -#define SNVS_HPCR_BTN_MASK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_BTN_MASK_SHIFT)) & SNVS_HPCR_BTN_MASK_MASK) -/*! @} */ - -/*! @name HPSICR - SNVS_HP Security Interrupt Control Register */ -/*! @{ */ - -#define SNVS_HPSICR_SV0_EN_MASK (0x1U) -#define SNVS_HPSICR_SV0_EN_SHIFT (0U) -/*! SV0_EN - * 0b0..Security Violation 0 Interrupt is Disabled - * 0b1..Security Violation 0 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV0_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV0_EN_SHIFT)) & SNVS_HPSICR_SV0_EN_MASK) - -#define SNVS_HPSICR_SV1_EN_MASK (0x2U) -#define SNVS_HPSICR_SV1_EN_SHIFT (1U) -/*! SV1_EN - * 0b0..Security Violation 1 Interrupt is Disabled - * 0b1..Security Violation 1 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV1_EN_SHIFT)) & SNVS_HPSICR_SV1_EN_MASK) - -#define SNVS_HPSICR_SV2_EN_MASK (0x4U) -#define SNVS_HPSICR_SV2_EN_SHIFT (2U) -/*! SV2_EN - * 0b0..Security Violation 2 Interrupt is Disabled - * 0b1..Security Violation 2 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV2_EN_SHIFT)) & SNVS_HPSICR_SV2_EN_MASK) - -#define SNVS_HPSICR_SV3_EN_MASK (0x8U) -#define SNVS_HPSICR_SV3_EN_SHIFT (3U) -/*! SV3_EN - * 0b0..Security Violation 3 Interrupt is Disabled - * 0b1..Security Violation 3 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV3_EN_SHIFT)) & SNVS_HPSICR_SV3_EN_MASK) - -#define SNVS_HPSICR_SV4_EN_MASK (0x10U) -#define SNVS_HPSICR_SV4_EN_SHIFT (4U) -/*! SV4_EN - * 0b0..Security Violation 4 Interrupt is Disabled - * 0b1..Security Violation 4 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV4_EN_SHIFT)) & SNVS_HPSICR_SV4_EN_MASK) - -#define SNVS_HPSICR_SV5_EN_MASK (0x20U) -#define SNVS_HPSICR_SV5_EN_SHIFT (5U) -/*! SV5_EN - * 0b0..Security Violation 5 Interrupt is Disabled - * 0b1..Security Violation 5 Interrupt is Enabled - */ -#define SNVS_HPSICR_SV5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV5_EN_SHIFT)) & SNVS_HPSICR_SV5_EN_MASK) - -#define SNVS_HPSICR_LPSVI_EN_MASK (0x80000000U) -#define SNVS_HPSICR_LPSVI_EN_SHIFT (31U) -/*! LPSVI_EN - * 0b0..LP Security Violation Interrupt is Disabled - * 0b1..LP Security Violation Interrupt is Enabled - */ -#define SNVS_HPSICR_LPSVI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_LPSVI_EN_SHIFT)) & SNVS_HPSICR_LPSVI_EN_MASK) -/*! @} */ - -/*! @name HPSVCR - SNVS_HP Security Violation Control Register */ -/*! @{ */ - -#define SNVS_HPSVCR_SV0_CFG_MASK (0x1U) -#define SNVS_HPSVCR_SV0_CFG_SHIFT (0U) -/*! SV0_CFG - * 0b0..Security Violation 0 is a non-fatal violation - * 0b1..Security Violation 0 is a fatal violation - */ -#define SNVS_HPSVCR_SV0_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV0_CFG_SHIFT)) & SNVS_HPSVCR_SV0_CFG_MASK) - -#define SNVS_HPSVCR_SV1_CFG_MASK (0x2U) -#define SNVS_HPSVCR_SV1_CFG_SHIFT (1U) -/*! SV1_CFG - * 0b0..Security Violation 1 is a non-fatal violation - * 0b1..Security Violation 1 is a fatal violation - */ -#define SNVS_HPSVCR_SV1_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV1_CFG_SHIFT)) & SNVS_HPSVCR_SV1_CFG_MASK) - -#define SNVS_HPSVCR_SV2_CFG_MASK (0x4U) -#define SNVS_HPSVCR_SV2_CFG_SHIFT (2U) -/*! SV2_CFG - * 0b0..Security Violation 2 is a non-fatal violation - * 0b1..Security Violation 2 is a fatal violation - */ -#define SNVS_HPSVCR_SV2_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV2_CFG_SHIFT)) & SNVS_HPSVCR_SV2_CFG_MASK) - -#define SNVS_HPSVCR_SV3_CFG_MASK (0x8U) -#define SNVS_HPSVCR_SV3_CFG_SHIFT (3U) -/*! SV3_CFG - * 0b0..Security Violation 3 is a non-fatal violation - * 0b1..Security Violation 3 is a fatal violation - */ -#define SNVS_HPSVCR_SV3_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV3_CFG_SHIFT)) & SNVS_HPSVCR_SV3_CFG_MASK) - -#define SNVS_HPSVCR_SV4_CFG_MASK (0x10U) -#define SNVS_HPSVCR_SV4_CFG_SHIFT (4U) -/*! SV4_CFG - * 0b0..Security Violation 4 is a non-fatal violation - * 0b1..Security Violation 4 is a fatal violation - */ -#define SNVS_HPSVCR_SV4_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV4_CFG_SHIFT)) & SNVS_HPSVCR_SV4_CFG_MASK) - -#define SNVS_HPSVCR_SV5_CFG_MASK (0x60U) -#define SNVS_HPSVCR_SV5_CFG_SHIFT (5U) -/*! SV5_CFG - * 0b00..Security Violation 5 is disabled - * 0b01..Security Violation 5 is a non-fatal violation - * 0b1x..Security Violation 5 is a fatal violation - */ -#define SNVS_HPSVCR_SV5_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV5_CFG_SHIFT)) & SNVS_HPSVCR_SV5_CFG_MASK) - -#define SNVS_HPSVCR_LPSV_CFG_MASK (0xC0000000U) -#define SNVS_HPSVCR_LPSV_CFG_SHIFT (30U) -/*! LPSV_CFG - * 0b00..LP security violation is disabled - * 0b01..LP security violation is a non-fatal violation - * 0b1x..LP security violation is a fatal violation - */ -#define SNVS_HPSVCR_LPSV_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_LPSV_CFG_SHIFT)) & SNVS_HPSVCR_LPSV_CFG_MASK) -/*! @} */ - -/*! @name HPSR - SNVS_HP Status Register */ -/*! @{ */ - -#define SNVS_HPSR_HPTA_MASK (0x1U) -#define SNVS_HPSR_HPTA_SHIFT (0U) -/*! HPTA - * 0b0..No time alarm interrupt occurred. - * 0b1..A time alarm interrupt occurred. - */ -#define SNVS_HPSR_HPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_HPTA_SHIFT)) & SNVS_HPSR_HPTA_MASK) - -#define SNVS_HPSR_PI_MASK (0x2U) -#define SNVS_HPSR_PI_SHIFT (1U) -/*! PI - * 0b0..No periodic interrupt occurred. - * 0b1..A periodic interrupt occurred. - */ -#define SNVS_HPSR_PI(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_PI_SHIFT)) & SNVS_HPSR_PI_MASK) - -#define SNVS_HPSR_LPDIS_MASK (0x10U) -#define SNVS_HPSR_LPDIS_SHIFT (4U) -#define SNVS_HPSR_LPDIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_LPDIS_SHIFT)) & SNVS_HPSR_LPDIS_MASK) - -#define SNVS_HPSR_BTN_MASK (0x40U) -#define SNVS_HPSR_BTN_SHIFT (6U) -#define SNVS_HPSR_BTN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_BTN_SHIFT)) & SNVS_HPSR_BTN_MASK) - -#define SNVS_HPSR_BI_MASK (0x80U) -#define SNVS_HPSR_BI_SHIFT (7U) -#define SNVS_HPSR_BI(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_BI_SHIFT)) & SNVS_HPSR_BI_MASK) - -#define SNVS_HPSR_SSM_STATE_MASK (0xF00U) -#define SNVS_HPSR_SSM_STATE_SHIFT (8U) -/*! SSM_STATE - * 0b0000..Init - * 0b0001..Hard Fail - * 0b0011..Soft Fail - * 0b1000..Init Intermediate (transition state between Init and Check - SSM stays in this state only one clock cycle) - * 0b1001..Check - * 0b1011..Non-Secure - * 0b1101..Trusted - * 0b1111..Secure - */ -#define SNVS_HPSR_SSM_STATE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_SSM_STATE_SHIFT)) & SNVS_HPSR_SSM_STATE_MASK) - -#define SNVS_HPSR_SECURITY_CONFIG_MASK (0xF000U) -#define SNVS_HPSR_SECURITY_CONFIG_SHIFT (12U) -/*! SECURITY_CONFIG - * 0b0000, 0b1000..FAB configuration - * 0b0001, 0b0010, 0b0011..OPEN configuration - * 0b1010, 0b1001, 0b1011..CLOSED configuration - * 0bx1xx..FIELD RETURN configuration - */ -#define SNVS_HPSR_SECURITY_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_SECURITY_CONFIG_SHIFT)) & SNVS_HPSR_SECURITY_CONFIG_MASK) - -#define SNVS_HPSR_OTPMK_SYNDROME_MASK (0x1FF0000U) -#define SNVS_HPSR_OTPMK_SYNDROME_SHIFT (16U) -#define SNVS_HPSR_OTPMK_SYNDROME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_OTPMK_SYNDROME_SHIFT)) & SNVS_HPSR_OTPMK_SYNDROME_MASK) - -#define SNVS_HPSR_OTPMK_ZERO_MASK (0x8000000U) -#define SNVS_HPSR_OTPMK_ZERO_SHIFT (27U) -/*! OTPMK_ZERO - * 0b0..The OTPMK is not zero. - * 0b1..The OTPMK is zero. - */ -#define SNVS_HPSR_OTPMK_ZERO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_OTPMK_ZERO_SHIFT)) & SNVS_HPSR_OTPMK_ZERO_MASK) - -#define SNVS_HPSR_ZMK_ZERO_MASK (0x80000000U) -#define SNVS_HPSR_ZMK_ZERO_SHIFT (31U) -/*! ZMK_ZERO - * 0b0..The ZMK is not zero. - * 0b1..The ZMK is zero. - */ -#define SNVS_HPSR_ZMK_ZERO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_ZMK_ZERO_SHIFT)) & SNVS_HPSR_ZMK_ZERO_MASK) -/*! @} */ - -/*! @name HPSVSR - SNVS_HP Security Violation Status Register */ -/*! @{ */ - -#define SNVS_HPSVSR_SV0_MASK (0x1U) -#define SNVS_HPSVSR_SV0_SHIFT (0U) -/*! SV0 - * 0b0..No Security Violation 0 security violation was detected. - * 0b1..Security Violation 0 security violation was detected. - */ -#define SNVS_HPSVSR_SV0(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV0_SHIFT)) & SNVS_HPSVSR_SV0_MASK) - -#define SNVS_HPSVSR_SV1_MASK (0x2U) -#define SNVS_HPSVSR_SV1_SHIFT (1U) -/*! SV1 - * 0b0..No Security Violation 1 security violation was detected. - * 0b1..Security Violation 1 security violation was detected. - */ -#define SNVS_HPSVSR_SV1(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV1_SHIFT)) & SNVS_HPSVSR_SV1_MASK) - -#define SNVS_HPSVSR_SV2_MASK (0x4U) -#define SNVS_HPSVSR_SV2_SHIFT (2U) -/*! SV2 - * 0b0..No Security Violation 2 security violation was detected. - * 0b1..Security Violation 2 security violation was detected. - */ -#define SNVS_HPSVSR_SV2(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV2_SHIFT)) & SNVS_HPSVSR_SV2_MASK) - -#define SNVS_HPSVSR_SV3_MASK (0x8U) -#define SNVS_HPSVSR_SV3_SHIFT (3U) -/*! SV3 - * 0b0..No Security Violation 3 security violation was detected. - * 0b1..Security Violation 3 security violation was detected. - */ -#define SNVS_HPSVSR_SV3(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV3_SHIFT)) & SNVS_HPSVSR_SV3_MASK) - -#define SNVS_HPSVSR_SV4_MASK (0x10U) -#define SNVS_HPSVSR_SV4_SHIFT (4U) -/*! SV4 - * 0b0..No Security Violation 4 security violation was detected. - * 0b1..Security Violation 4 security violation was detected. - */ -#define SNVS_HPSVSR_SV4(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV4_SHIFT)) & SNVS_HPSVSR_SV4_MASK) - -#define SNVS_HPSVSR_SV5_MASK (0x20U) -#define SNVS_HPSVSR_SV5_SHIFT (5U) -/*! SV5 - * 0b0..No Security Violation 5 security violation was detected. - * 0b1..Security Violation 5 security violation was detected. - */ -#define SNVS_HPSVSR_SV5(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV5_SHIFT)) & SNVS_HPSVSR_SV5_MASK) - -#define SNVS_HPSVSR_SW_SV_MASK (0x2000U) -#define SNVS_HPSVSR_SW_SV_SHIFT (13U) -#define SNVS_HPSVSR_SW_SV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_SV_SHIFT)) & SNVS_HPSVSR_SW_SV_MASK) - -#define SNVS_HPSVSR_SW_FSV_MASK (0x4000U) -#define SNVS_HPSVSR_SW_FSV_SHIFT (14U) -#define SNVS_HPSVSR_SW_FSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_FSV_SHIFT)) & SNVS_HPSVSR_SW_FSV_MASK) - -#define SNVS_HPSVSR_SW_LPSV_MASK (0x8000U) -#define SNVS_HPSVSR_SW_LPSV_SHIFT (15U) -#define SNVS_HPSVSR_SW_LPSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_LPSV_SHIFT)) & SNVS_HPSVSR_SW_LPSV_MASK) - -#define SNVS_HPSVSR_ZMK_SYNDROME_MASK (0x1FF0000U) -#define SNVS_HPSVSR_ZMK_SYNDROME_SHIFT (16U) -#define SNVS_HPSVSR_ZMK_SYNDROME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_ZMK_SYNDROME_SHIFT)) & SNVS_HPSVSR_ZMK_SYNDROME_MASK) - -#define SNVS_HPSVSR_ZMK_ECC_FAIL_MASK (0x8000000U) -#define SNVS_HPSVSR_ZMK_ECC_FAIL_SHIFT (27U) -/*! ZMK_ECC_FAIL - * 0b0..ZMK ECC Failure was not detected. - * 0b1..ZMK ECC Failure was detected. - */ -#define SNVS_HPSVSR_ZMK_ECC_FAIL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_ZMK_ECC_FAIL_SHIFT)) & SNVS_HPSVSR_ZMK_ECC_FAIL_MASK) - -#define SNVS_HPSVSR_LP_SEC_VIO_MASK (0x80000000U) -#define SNVS_HPSVSR_LP_SEC_VIO_SHIFT (31U) -#define SNVS_HPSVSR_LP_SEC_VIO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_LP_SEC_VIO_SHIFT)) & SNVS_HPSVSR_LP_SEC_VIO_MASK) -/*! @} */ - -/*! @name HPHACIVR - SNVS_HP High Assurance Counter IV Register */ -/*! @{ */ - -#define SNVS_HPHACIVR_HAC_COUNTER_IV_MASK (0xFFFFFFFFU) -#define SNVS_HPHACIVR_HAC_COUNTER_IV_SHIFT (0U) -#define SNVS_HPHACIVR_HAC_COUNTER_IV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPHACIVR_HAC_COUNTER_IV_SHIFT)) & SNVS_HPHACIVR_HAC_COUNTER_IV_MASK) -/*! @} */ - -/*! @name HPHACR - SNVS_HP High Assurance Counter Register */ -/*! @{ */ - -#define SNVS_HPHACR_HAC_COUNTER_MASK (0xFFFFFFFFU) -#define SNVS_HPHACR_HAC_COUNTER_SHIFT (0U) -#define SNVS_HPHACR_HAC_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPHACR_HAC_COUNTER_SHIFT)) & SNVS_HPHACR_HAC_COUNTER_MASK) -/*! @} */ - -/*! @name HPRTCMR - SNVS_HP Real Time Counter MSB Register */ -/*! @{ */ - -#define SNVS_HPRTCMR_RTC_MASK (0x7FFFU) -#define SNVS_HPRTCMR_RTC_SHIFT (0U) -#define SNVS_HPRTCMR_RTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPRTCMR_RTC_SHIFT)) & SNVS_HPRTCMR_RTC_MASK) -/*! @} */ - -/*! @name HPRTCLR - SNVS_HP Real Time Counter LSB Register */ -/*! @{ */ - -#define SNVS_HPRTCLR_RTC_MASK (0xFFFFFFFFU) -#define SNVS_HPRTCLR_RTC_SHIFT (0U) -#define SNVS_HPRTCLR_RTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPRTCLR_RTC_SHIFT)) & SNVS_HPRTCLR_RTC_MASK) -/*! @} */ - -/*! @name HPTAMR - SNVS_HP Time Alarm MSB Register */ -/*! @{ */ - -#define SNVS_HPTAMR_HPTA_MS_MASK (0x7FFFU) -#define SNVS_HPTAMR_HPTA_MS_SHIFT (0U) -#define SNVS_HPTAMR_HPTA_MS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPTAMR_HPTA_MS_SHIFT)) & SNVS_HPTAMR_HPTA_MS_MASK) -/*! @} */ - -/*! @name HPTALR - SNVS_HP Time Alarm LSB Register */ -/*! @{ */ - -#define SNVS_HPTALR_HPTA_LS_MASK (0xFFFFFFFFU) -#define SNVS_HPTALR_HPTA_LS_SHIFT (0U) -#define SNVS_HPTALR_HPTA_LS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPTALR_HPTA_LS_SHIFT)) & SNVS_HPTALR_HPTA_LS_MASK) -/*! @} */ - -/*! @name LPLR - SNVS_LP Lock Register */ -/*! @{ */ - -#define SNVS_LPLR_ZMK_WHL_MASK (0x1U) -#define SNVS_LPLR_ZMK_WHL_SHIFT (0U) -/*! ZMK_WHL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_ZMK_WHL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_ZMK_WHL_SHIFT)) & SNVS_LPLR_ZMK_WHL_MASK) - -#define SNVS_LPLR_ZMK_RHL_MASK (0x2U) -#define SNVS_LPLR_ZMK_RHL_SHIFT (1U) -/*! ZMK_RHL - * 0b0..Read access is allowed (only in software programming mode). - * 0b1..Read access is not allowed. - */ -#define SNVS_LPLR_ZMK_RHL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_ZMK_RHL_SHIFT)) & SNVS_LPLR_ZMK_RHL_MASK) - -#define SNVS_LPLR_SRTC_HL_MASK (0x4U) -#define SNVS_LPLR_SRTC_HL_SHIFT (2U) -/*! SRTC_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_SRTC_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_SRTC_HL_SHIFT)) & SNVS_LPLR_SRTC_HL_MASK) - -#define SNVS_LPLR_LPCALB_HL_MASK (0x8U) -#define SNVS_LPLR_LPCALB_HL_SHIFT (3U) -/*! LPCALB_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_LPCALB_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPCALB_HL_SHIFT)) & SNVS_LPLR_LPCALB_HL_MASK) - -#define SNVS_LPLR_MC_HL_MASK (0x10U) -#define SNVS_LPLR_MC_HL_SHIFT (4U) -/*! MC_HL - * 0b0..Write access (increment) is allowed. - * 0b1..Write access (increment) is not allowed. - */ -#define SNVS_LPLR_MC_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_MC_HL_SHIFT)) & SNVS_LPLR_MC_HL_MASK) - -#define SNVS_LPLR_GPR_HL_MASK (0x20U) -#define SNVS_LPLR_GPR_HL_SHIFT (5U) -/*! GPR_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_GPR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_GPR_HL_SHIFT)) & SNVS_LPLR_GPR_HL_MASK) - -#define SNVS_LPLR_LPSVCR_HL_MASK (0x40U) -#define SNVS_LPLR_LPSVCR_HL_SHIFT (6U) -/*! LPSVCR_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_LPSVCR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPSVCR_HL_SHIFT)) & SNVS_LPLR_LPSVCR_HL_MASK) - -#define SNVS_LPLR_LPTDCR_HL_MASK (0x100U) -#define SNVS_LPLR_LPTDCR_HL_SHIFT (8U) -/*! LPTDCR_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_LPTDCR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPTDCR_HL_SHIFT)) & SNVS_LPLR_LPTDCR_HL_MASK) - -#define SNVS_LPLR_MKS_HL_MASK (0x200U) -#define SNVS_LPLR_MKS_HL_SHIFT (9U) -/*! MKS_HL - * 0b0..Write access is allowed. - * 0b1..Write access is not allowed. - */ -#define SNVS_LPLR_MKS_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_MKS_HL_SHIFT)) & SNVS_LPLR_MKS_HL_MASK) -/*! @} */ - -/*! @name LPCR - SNVS_LP Control Register */ -/*! @{ */ - -#define SNVS_LPCR_SRTC_ENV_MASK (0x1U) -#define SNVS_LPCR_SRTC_ENV_SHIFT (0U) -/*! SRTC_ENV - * 0b0..SRTC is disabled or invalid. - * 0b1..SRTC is enabled and valid. - */ -#define SNVS_LPCR_SRTC_ENV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_SRTC_ENV_SHIFT)) & SNVS_LPCR_SRTC_ENV_MASK) - -#define SNVS_LPCR_LPTA_EN_MASK (0x2U) -#define SNVS_LPCR_LPTA_EN_SHIFT (1U) -/*! LPTA_EN - * 0b0..LP time alarm interrupt is disabled. - * 0b1..LP time alarm interrupt is enabled. - */ -#define SNVS_LPCR_LPTA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPTA_EN_SHIFT)) & SNVS_LPCR_LPTA_EN_MASK) - -#define SNVS_LPCR_MC_ENV_MASK (0x4U) -#define SNVS_LPCR_MC_ENV_SHIFT (2U) -/*! MC_ENV - * 0b0..MC is disabled or invalid. - * 0b1..MC is enabled and valid. - */ -#define SNVS_LPCR_MC_ENV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_MC_ENV_SHIFT)) & SNVS_LPCR_MC_ENV_MASK) - -#define SNVS_LPCR_LPWUI_EN_MASK (0x8U) -#define SNVS_LPCR_LPWUI_EN_SHIFT (3U) -#define SNVS_LPCR_LPWUI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPWUI_EN_SHIFT)) & SNVS_LPCR_LPWUI_EN_MASK) - -#define SNVS_LPCR_SRTC_INV_EN_MASK (0x10U) -#define SNVS_LPCR_SRTC_INV_EN_SHIFT (4U) -/*! SRTC_INV_EN - * 0b0..SRTC stays valid in the case of security violation. - * 0b1..SRTC is invalidated in the case of security violation. - */ -#define SNVS_LPCR_SRTC_INV_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_SRTC_INV_EN_SHIFT)) & SNVS_LPCR_SRTC_INV_EN_MASK) - -#define SNVS_LPCR_DP_EN_MASK (0x20U) -#define SNVS_LPCR_DP_EN_SHIFT (5U) -/*! DP_EN - * 0b0..Smart PMIC enabled. - * 0b1..Dumb PMIC enabled. - */ -#define SNVS_LPCR_DP_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_DP_EN_SHIFT)) & SNVS_LPCR_DP_EN_MASK) - -#define SNVS_LPCR_TOP_MASK (0x40U) -#define SNVS_LPCR_TOP_SHIFT (6U) -/*! TOP - * 0b0..Leave system power on. - * 0b1..Turn off system power. - */ -#define SNVS_LPCR_TOP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_TOP_SHIFT)) & SNVS_LPCR_TOP_MASK) - -#define SNVS_LPCR_PWR_GLITCH_EN_MASK (0x80U) -#define SNVS_LPCR_PWR_GLITCH_EN_SHIFT (7U) -#define SNVS_LPCR_PWR_GLITCH_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PWR_GLITCH_EN_SHIFT)) & SNVS_LPCR_PWR_GLITCH_EN_MASK) - -#define SNVS_LPCR_LPCALB_EN_MASK (0x100U) -#define SNVS_LPCR_LPCALB_EN_SHIFT (8U) -/*! LPCALB_EN - * 0b0..SRTC Time calibration is disabled. - * 0b1..SRTC Time calibration is enabled. - */ -#define SNVS_LPCR_LPCALB_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPCALB_EN_SHIFT)) & SNVS_LPCR_LPCALB_EN_MASK) - -#define SNVS_LPCR_LPCALB_VAL_MASK (0x7C00U) -#define SNVS_LPCR_LPCALB_VAL_SHIFT (10U) -/*! LPCALB_VAL - * 0b00000..+0 counts per each 32768 ticks of the counter clock - * 0b00001..+1 counts per each 32768 ticks of the counter clock - * 0b00010..+2 counts per each 32768 ticks of the counter clock - * 0b01111..+15 counts per each 32768 ticks of the counter clock - * 0b10000..-16 counts per each 32768 ticks of the counter clock - * 0b10001..-15 counts per each 32768 ticks of the counter clock - * 0b11110..-2 counts per each 32768 ticks of the counter clock - * 0b11111..-1 counts per each 32768 ticks of the counter clock - */ -#define SNVS_LPCR_LPCALB_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPCALB_VAL_SHIFT)) & SNVS_LPCR_LPCALB_VAL_MASK) - -#define SNVS_LPCR_BTN_PRESS_TIME_MASK (0x30000U) -#define SNVS_LPCR_BTN_PRESS_TIME_SHIFT (16U) -#define SNVS_LPCR_BTN_PRESS_TIME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_BTN_PRESS_TIME_SHIFT)) & SNVS_LPCR_BTN_PRESS_TIME_MASK) - -#define SNVS_LPCR_DEBOUNCE_MASK (0xC0000U) -#define SNVS_LPCR_DEBOUNCE_SHIFT (18U) -#define SNVS_LPCR_DEBOUNCE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_DEBOUNCE_SHIFT)) & SNVS_LPCR_DEBOUNCE_MASK) - -#define SNVS_LPCR_ON_TIME_MASK (0x300000U) -#define SNVS_LPCR_ON_TIME_SHIFT (20U) -#define SNVS_LPCR_ON_TIME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_ON_TIME_SHIFT)) & SNVS_LPCR_ON_TIME_MASK) - -#define SNVS_LPCR_PK_EN_MASK (0x400000U) -#define SNVS_LPCR_PK_EN_SHIFT (22U) -#define SNVS_LPCR_PK_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PK_EN_SHIFT)) & SNVS_LPCR_PK_EN_MASK) - -#define SNVS_LPCR_PK_OVERRIDE_MASK (0x800000U) -#define SNVS_LPCR_PK_OVERRIDE_SHIFT (23U) -#define SNVS_LPCR_PK_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PK_OVERRIDE_SHIFT)) & SNVS_LPCR_PK_OVERRIDE_MASK) - -#define SNVS_LPCR_GPR_Z_DIS_MASK (0x1000000U) -#define SNVS_LPCR_GPR_Z_DIS_SHIFT (24U) -#define SNVS_LPCR_GPR_Z_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_GPR_Z_DIS_SHIFT)) & SNVS_LPCR_GPR_Z_DIS_MASK) -/*! @} */ - -/*! @name LPMKCR - SNVS_LP Master Key Control Register */ -/*! @{ */ - -#define SNVS_LPMKCR_MASTER_KEY_SEL_MASK (0x3U) -#define SNVS_LPMKCR_MASTER_KEY_SEL_SHIFT (0U) -/*! MASTER_KEY_SEL - * 0b0x..Select one time programmable master key. - * 0b10..Select zeroizable master key when MKS_EN bit is set . - * 0b11..Select combined master key when MKS_EN bit is set . - */ -#define SNVS_LPMKCR_MASTER_KEY_SEL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_MASTER_KEY_SEL_SHIFT)) & SNVS_LPMKCR_MASTER_KEY_SEL_MASK) - -#define SNVS_LPMKCR_ZMK_HWP_MASK (0x4U) -#define SNVS_LPMKCR_ZMK_HWP_SHIFT (2U) -/*! ZMK_HWP - * 0b0..ZMK is in the software programming mode. - * 0b1..ZMK is in the hardware programming mode. - */ -#define SNVS_LPMKCR_ZMK_HWP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_HWP_SHIFT)) & SNVS_LPMKCR_ZMK_HWP_MASK) - -#define SNVS_LPMKCR_ZMK_VAL_MASK (0x8U) -#define SNVS_LPMKCR_ZMK_VAL_SHIFT (3U) -/*! ZMK_VAL - * 0b0..ZMK is not valid. - * 0b1..ZMK is valid. - */ -#define SNVS_LPMKCR_ZMK_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_VAL_SHIFT)) & SNVS_LPMKCR_ZMK_VAL_MASK) - -#define SNVS_LPMKCR_ZMK_ECC_EN_MASK (0x10U) -#define SNVS_LPMKCR_ZMK_ECC_EN_SHIFT (4U) -/*! ZMK_ECC_EN - * 0b0..ZMK ECC check is disabled. - * 0b1..ZMK ECC check is enabled. - */ -#define SNVS_LPMKCR_ZMK_ECC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_ECC_EN_SHIFT)) & SNVS_LPMKCR_ZMK_ECC_EN_MASK) - -#define SNVS_LPMKCR_ZMK_ECC_VALUE_MASK (0xFF80U) -#define SNVS_LPMKCR_ZMK_ECC_VALUE_SHIFT (7U) -#define SNVS_LPMKCR_ZMK_ECC_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_ECC_VALUE_SHIFT)) & SNVS_LPMKCR_ZMK_ECC_VALUE_MASK) -/*! @} */ - -/*! @name LPSVCR - SNVS_LP Security Violation Control Register */ -/*! @{ */ - -#define SNVS_LPSVCR_SV0_EN_MASK (0x1U) -#define SNVS_LPSVCR_SV0_EN_SHIFT (0U) -/*! SV0_EN - * 0b0..Security Violation 0 is disabled in the LP domain. - * 0b1..Security Violation 0 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV0_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV0_EN_SHIFT)) & SNVS_LPSVCR_SV0_EN_MASK) - -#define SNVS_LPSVCR_SV1_EN_MASK (0x2U) -#define SNVS_LPSVCR_SV1_EN_SHIFT (1U) -/*! SV1_EN - * 0b0..Security Violation 1 is disabled in the LP domain. - * 0b1..Security Violation 1 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV1_EN_SHIFT)) & SNVS_LPSVCR_SV1_EN_MASK) - -#define SNVS_LPSVCR_SV2_EN_MASK (0x4U) -#define SNVS_LPSVCR_SV2_EN_SHIFT (2U) -/*! SV2_EN - * 0b0..Security Violation 2 is disabled in the LP domain. - * 0b1..Security Violation 2 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV2_EN_SHIFT)) & SNVS_LPSVCR_SV2_EN_MASK) - -#define SNVS_LPSVCR_SV3_EN_MASK (0x8U) -#define SNVS_LPSVCR_SV3_EN_SHIFT (3U) -/*! SV3_EN - * 0b0..Security Violation 3 is disabled in the LP domain. - * 0b1..Security Violation 3 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV3_EN_SHIFT)) & SNVS_LPSVCR_SV3_EN_MASK) - -#define SNVS_LPSVCR_SV4_EN_MASK (0x10U) -#define SNVS_LPSVCR_SV4_EN_SHIFT (4U) -/*! SV4_EN - * 0b0..Security Violation 4 is disabled in the LP domain. - * 0b1..Security Violation 4 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV4_EN_SHIFT)) & SNVS_LPSVCR_SV4_EN_MASK) - -#define SNVS_LPSVCR_SV5_EN_MASK (0x20U) -#define SNVS_LPSVCR_SV5_EN_SHIFT (5U) -/*! SV5_EN - * 0b0..Security Violation 5 is disabled in the LP domain. - * 0b1..Security Violation 5 is enabled in the LP domain. - */ -#define SNVS_LPSVCR_SV5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV5_EN_SHIFT)) & SNVS_LPSVCR_SV5_EN_MASK) -/*! @} */ - -/*! @name LPTDCR - SNVS_LP Tamper Detectors Configuration Register */ -/*! @{ */ - -#define SNVS_LPTDCR_SRTCR_EN_MASK (0x2U) -#define SNVS_LPTDCR_SRTCR_EN_SHIFT (1U) -/*! SRTCR_EN - * 0b0..SRTC rollover is disabled. - * 0b1..SRTC rollover is enabled. - */ -#define SNVS_LPTDCR_SRTCR_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_SRTCR_EN_SHIFT)) & SNVS_LPTDCR_SRTCR_EN_MASK) - -#define SNVS_LPTDCR_MCR_EN_MASK (0x4U) -#define SNVS_LPTDCR_MCR_EN_SHIFT (2U) -/*! MCR_EN - * 0b0..MC rollover is disabled. - * 0b1..MC rollover is enabled. - */ -#define SNVS_LPTDCR_MCR_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_MCR_EN_SHIFT)) & SNVS_LPTDCR_MCR_EN_MASK) - -#define SNVS_LPTDCR_ET1_EN_MASK (0x200U) -#define SNVS_LPTDCR_ET1_EN_SHIFT (9U) -/*! ET1_EN - * 0b0..External tamper 1 is disabled. - * 0b1..External tamper 1 is enabled. - */ -#define SNVS_LPTDCR_ET1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET1_EN_SHIFT)) & SNVS_LPTDCR_ET1_EN_MASK) - -#define SNVS_LPTDCR_ET1P_MASK (0x800U) -#define SNVS_LPTDCR_ET1P_SHIFT (11U) -/*! ET1P - * 0b0..External tamper 1 is active low. - * 0b1..External tamper 1 is active high. - */ -#define SNVS_LPTDCR_ET1P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET1P_SHIFT)) & SNVS_LPTDCR_ET1P_MASK) - -#define SNVS_LPTDCR_PFD_OBSERV_MASK (0x4000U) -#define SNVS_LPTDCR_PFD_OBSERV_SHIFT (14U) -#define SNVS_LPTDCR_PFD_OBSERV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_PFD_OBSERV_SHIFT)) & SNVS_LPTDCR_PFD_OBSERV_MASK) - -#define SNVS_LPTDCR_POR_OBSERV_MASK (0x8000U) -#define SNVS_LPTDCR_POR_OBSERV_SHIFT (15U) -#define SNVS_LPTDCR_POR_OBSERV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_POR_OBSERV_SHIFT)) & SNVS_LPTDCR_POR_OBSERV_MASK) - -#define SNVS_LPTDCR_OSCB_MASK (0x10000000U) -#define SNVS_LPTDCR_OSCB_SHIFT (28U) -/*! OSCB - * 0b0..Normal SRTC clock oscillator not bypassed. - * 0b1..Normal SRTC clock oscillator bypassed. Alternate clock can drive the SRTC clock source. - */ -#define SNVS_LPTDCR_OSCB(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_OSCB_SHIFT)) & SNVS_LPTDCR_OSCB_MASK) -/*! @} */ - -/*! @name LPSR - SNVS_LP Status Register */ -/*! @{ */ - -#define SNVS_LPSR_LPTA_MASK (0x1U) -#define SNVS_LPSR_LPTA_SHIFT (0U) -/*! LPTA - * 0b0..No time alarm interrupt occurred. - * 0b1..A time alarm interrupt occurred. - */ -#define SNVS_LPSR_LPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPTA_SHIFT)) & SNVS_LPSR_LPTA_MASK) - -#define SNVS_LPSR_SRTCR_MASK (0x2U) -#define SNVS_LPSR_SRTCR_SHIFT (1U) -/*! SRTCR - * 0b0..SRTC has not reached its maximum value. - * 0b1..SRTC has reached its maximum value. - */ -#define SNVS_LPSR_SRTCR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SRTCR_SHIFT)) & SNVS_LPSR_SRTCR_MASK) - -#define SNVS_LPSR_MCR_MASK (0x4U) -#define SNVS_LPSR_MCR_SHIFT (2U) -/*! MCR - * 0b0..MC has not reached its maximum value. - * 0b1..MC has reached its maximum value. - */ -#define SNVS_LPSR_MCR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_MCR_SHIFT)) & SNVS_LPSR_MCR_MASK) - -#define SNVS_LPSR_PGD_MASK (0x8U) -#define SNVS_LPSR_PGD_SHIFT (3U) -#define SNVS_LPSR_PGD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_PGD_SHIFT)) & SNVS_LPSR_PGD_MASK) - -#define SNVS_LPSR_ET1D_MASK (0x200U) -#define SNVS_LPSR_ET1D_SHIFT (9U) -/*! ET1D - * 0b0..External tampering 1 not detected. - * 0b1..External tampering 1 detected. - */ -#define SNVS_LPSR_ET1D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_ET1D_SHIFT)) & SNVS_LPSR_ET1D_MASK) - -#define SNVS_LPSR_ESVD_MASK (0x10000U) -#define SNVS_LPSR_ESVD_SHIFT (16U) -/*! ESVD - * 0b0..No external security violation. - * 0b1..External security violation is detected. - */ -#define SNVS_LPSR_ESVD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_ESVD_SHIFT)) & SNVS_LPSR_ESVD_MASK) - -#define SNVS_LPSR_EO_MASK (0x20000U) -#define SNVS_LPSR_EO_SHIFT (17U) -/*! EO - * 0b0..Emergency off was not detected. - * 0b1..Emergency off was detected. - */ -#define SNVS_LPSR_EO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_EO_SHIFT)) & SNVS_LPSR_EO_MASK) - -#define SNVS_LPSR_SPO_MASK (0x40000U) -#define SNVS_LPSR_SPO_SHIFT (18U) -/*! SPO - * 0b0..Set Power Off was not detected. - * 0b1..Set Power Off was detected. - */ -#define SNVS_LPSR_SPO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SPO_SHIFT)) & SNVS_LPSR_SPO_MASK) - -#define SNVS_LPSR_SED_MASK (0x100000U) -#define SNVS_LPSR_SED_SHIFT (20U) -/*! SED - * 0b0..Scan exit was not detected. - * 0b1..Scan exit was detected. - */ -#define SNVS_LPSR_SED(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SED_SHIFT)) & SNVS_LPSR_SED_MASK) - -#define SNVS_LPSR_LPNS_MASK (0x40000000U) -#define SNVS_LPSR_LPNS_SHIFT (30U) -/*! LPNS - * 0b0..LP section was not programmed in the non-secure state. - * 0b1..LP section was programmed in the non-secure state. - */ -#define SNVS_LPSR_LPNS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPNS_SHIFT)) & SNVS_LPSR_LPNS_MASK) - -#define SNVS_LPSR_LPS_MASK (0x80000000U) -#define SNVS_LPSR_LPS_SHIFT (31U) -/*! LPS - * 0b0..LP section was not programmed in secure or trusted state. - * 0b1..LP section was programmed in secure or trusted state. - */ -#define SNVS_LPSR_LPS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPS_SHIFT)) & SNVS_LPSR_LPS_MASK) -/*! @} */ - -/*! @name LPSRTCMR - SNVS_LP Secure Real Time Counter MSB Register */ -/*! @{ */ - -#define SNVS_LPSRTCMR_SRTC_MASK (0x7FFFU) -#define SNVS_LPSRTCMR_SRTC_SHIFT (0U) -#define SNVS_LPSRTCMR_SRTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSRTCMR_SRTC_SHIFT)) & SNVS_LPSRTCMR_SRTC_MASK) -/*! @} */ - -/*! @name LPSRTCLR - SNVS_LP Secure Real Time Counter LSB Register */ -/*! @{ */ - -#define SNVS_LPSRTCLR_SRTC_MASK (0xFFFFFFFFU) -#define SNVS_LPSRTCLR_SRTC_SHIFT (0U) -#define SNVS_LPSRTCLR_SRTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSRTCLR_SRTC_SHIFT)) & SNVS_LPSRTCLR_SRTC_MASK) -/*! @} */ - -/*! @name LPTAR - SNVS_LP Time Alarm Register */ -/*! @{ */ - -#define SNVS_LPTAR_LPTA_MASK (0xFFFFFFFFU) -#define SNVS_LPTAR_LPTA_SHIFT (0U) -#define SNVS_LPTAR_LPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTAR_LPTA_SHIFT)) & SNVS_LPTAR_LPTA_MASK) -/*! @} */ - -/*! @name LPSMCMR - SNVS_LP Secure Monotonic Counter MSB Register */ -/*! @{ */ - -#define SNVS_LPSMCMR_MON_COUNTER_MASK (0xFFFFU) -#define SNVS_LPSMCMR_MON_COUNTER_SHIFT (0U) -#define SNVS_LPSMCMR_MON_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCMR_MON_COUNTER_SHIFT)) & SNVS_LPSMCMR_MON_COUNTER_MASK) - -#define SNVS_LPSMCMR_MC_ERA_BITS_MASK (0xFFFF0000U) -#define SNVS_LPSMCMR_MC_ERA_BITS_SHIFT (16U) -#define SNVS_LPSMCMR_MC_ERA_BITS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCMR_MC_ERA_BITS_SHIFT)) & SNVS_LPSMCMR_MC_ERA_BITS_MASK) -/*! @} */ - -/*! @name LPSMCLR - SNVS_LP Secure Monotonic Counter LSB Register */ -/*! @{ */ - -#define SNVS_LPSMCLR_MON_COUNTER_MASK (0xFFFFFFFFU) -#define SNVS_LPSMCLR_MON_COUNTER_SHIFT (0U) -#define SNVS_LPSMCLR_MON_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCLR_MON_COUNTER_SHIFT)) & SNVS_LPSMCLR_MON_COUNTER_MASK) -/*! @} */ - -/*! @name LPPGDR - SNVS_LP Power Glitch Detector Register */ -/*! @{ */ - -#define SNVS_LPPGDR_PGD_MASK (0xFFFFFFFFU) -#define SNVS_LPPGDR_PGD_SHIFT (0U) -#define SNVS_LPPGDR_PGD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPPGDR_PGD_SHIFT)) & SNVS_LPPGDR_PGD_MASK) -/*! @} */ - -/*! @name LPGPR0_LEGACY_ALIAS - SNVS_LP General Purpose Register 0 (legacy alias) */ -/*! @{ */ - -#define SNVS_LPGPR0_LEGACY_ALIAS_GPR_MASK (0xFFFFFFFFU) -#define SNVS_LPGPR0_LEGACY_ALIAS_GPR_SHIFT (0U) -#define SNVS_LPGPR0_LEGACY_ALIAS_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR0_LEGACY_ALIAS_GPR_SHIFT)) & SNVS_LPGPR0_LEGACY_ALIAS_GPR_MASK) -/*! @} */ - -/*! @name LPZMKR - SNVS_LP Zeroizable Master Key Register */ -/*! @{ */ - -#define SNVS_LPZMKR_ZMK_MASK (0xFFFFFFFFU) -#define SNVS_LPZMKR_ZMK_SHIFT (0U) -#define SNVS_LPZMKR_ZMK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPZMKR_ZMK_SHIFT)) & SNVS_LPZMKR_ZMK_MASK) -/*! @} */ - -/* The count of SNVS_LPZMKR */ -#define SNVS_LPZMKR_COUNT (8U) - -/*! @name LPGPR_ALIAS - SNVS_LP General Purpose Registers 0 .. 3 */ -/*! @{ */ - -#define SNVS_LPGPR_ALIAS_GPR_MASK (0xFFFFFFFFU) -#define SNVS_LPGPR_ALIAS_GPR_SHIFT (0U) -#define SNVS_LPGPR_ALIAS_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR_ALIAS_GPR_SHIFT)) & SNVS_LPGPR_ALIAS_GPR_MASK) -/*! @} */ - -/* The count of SNVS_LPGPR_ALIAS */ -#define SNVS_LPGPR_ALIAS_COUNT (4U) - -/*! @name LPGPR - SNVS_LP General Purpose Registers 0 .. 7 */ -/*! @{ */ - -#define SNVS_LPGPR_GPR_MASK (0xFFFFFFFFU) -#define SNVS_LPGPR_GPR_SHIFT (0U) -#define SNVS_LPGPR_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR_GPR_SHIFT)) & SNVS_LPGPR_GPR_MASK) -/*! @} */ - -/* The count of SNVS_LPGPR */ -#define SNVS_LPGPR_COUNT (8U) - -/*! @name HPVIDR1 - SNVS_HP Version ID Register 1 */ -/*! @{ */ - -#define SNVS_HPVIDR1_MINOR_REV_MASK (0xFFU) -#define SNVS_HPVIDR1_MINOR_REV_SHIFT (0U) -#define SNVS_HPVIDR1_MINOR_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_MINOR_REV_SHIFT)) & SNVS_HPVIDR1_MINOR_REV_MASK) - -#define SNVS_HPVIDR1_MAJOR_REV_MASK (0xFF00U) -#define SNVS_HPVIDR1_MAJOR_REV_SHIFT (8U) -#define SNVS_HPVIDR1_MAJOR_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_MAJOR_REV_SHIFT)) & SNVS_HPVIDR1_MAJOR_REV_MASK) - -#define SNVS_HPVIDR1_IP_ID_MASK (0xFFFF0000U) -#define SNVS_HPVIDR1_IP_ID_SHIFT (16U) -#define SNVS_HPVIDR1_IP_ID(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_IP_ID_SHIFT)) & SNVS_HPVIDR1_IP_ID_MASK) -/*! @} */ - -/*! @name HPVIDR2 - SNVS_HP Version ID Register 2 */ -/*! @{ */ - -#define SNVS_HPVIDR2_CONFIG_OPT_MASK (0xFFU) -#define SNVS_HPVIDR2_CONFIG_OPT_SHIFT (0U) -#define SNVS_HPVIDR2_CONFIG_OPT(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_CONFIG_OPT_SHIFT)) & SNVS_HPVIDR2_CONFIG_OPT_MASK) - -#define SNVS_HPVIDR2_ECO_REV_MASK (0xFF00U) -#define SNVS_HPVIDR2_ECO_REV_SHIFT (8U) -#define SNVS_HPVIDR2_ECO_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_ECO_REV_SHIFT)) & SNVS_HPVIDR2_ECO_REV_MASK) - -#define SNVS_HPVIDR2_INTG_OPT_MASK (0xFF0000U) -#define SNVS_HPVIDR2_INTG_OPT_SHIFT (16U) -#define SNVS_HPVIDR2_INTG_OPT(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_INTG_OPT_SHIFT)) & SNVS_HPVIDR2_INTG_OPT_MASK) - -#define SNVS_HPVIDR2_IP_ERA_MASK (0xFF000000U) -#define SNVS_HPVIDR2_IP_ERA_SHIFT (24U) -#define SNVS_HPVIDR2_IP_ERA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_IP_ERA_SHIFT)) & SNVS_HPVIDR2_IP_ERA_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group SNVS_Register_Masks */ - - -/* SNVS - Peripheral instance base addresses */ -/** Peripheral SNVS base address */ -#define SNVS_BASE (0x400D4000u) -/** Peripheral SNVS base pointer */ -#define SNVS ((SNVS_Type *)SNVS_BASE) -/** Array initializer of SNVS peripheral base addresses */ -#define SNVS_BASE_ADDRS { SNVS_BASE } -/** Array initializer of SNVS peripheral base pointers */ -#define SNVS_BASE_PTRS { SNVS } -/** Interrupt vectors for the SNVS peripheral type */ -#define SNVS_IRQS { SNVS_LP_WRAPPER_IRQn } -#define SNVS_CONSOLIDATED_IRQS { SNVS_HP_WRAPPER_IRQn } -#define SNVS_SECURITY_IRQS { SNVS_HP_WRAPPER_TZ_IRQn } - -/*! - * @} - */ /* end of group SNVS_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- SPDIF Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SPDIF_Peripheral_Access_Layer SPDIF Peripheral Access Layer - * @{ - */ - -/** SPDIF - Register Layout Typedef */ -typedef struct { - __IO uint32_t SCR; /**< SPDIF Configuration Register, offset: 0x0 */ - __IO uint32_t SRCD; /**< CDText Control Register, offset: 0x4 */ - __IO uint32_t SRPC; /**< PhaseConfig Register, offset: 0x8 */ - __IO uint32_t SIE; /**< InterruptEn Register, offset: 0xC */ - union { /* offset: 0x10 */ - __O uint32_t SIC; /**< InterruptClear Register, offset: 0x10 */ - __I uint32_t SIS; /**< InterruptStat Register, offset: 0x10 */ - }; - __I uint32_t SRL; /**< SPDIFRxLeft Register, offset: 0x14 */ - __I uint32_t SRR; /**< SPDIFRxRight Register, offset: 0x18 */ - __I uint32_t SRCSH; /**< SPDIFRxCChannel_h Register, offset: 0x1C */ - __I uint32_t SRCSL; /**< SPDIFRxCChannel_l Register, offset: 0x20 */ - __I uint32_t SRU; /**< UchannelRx Register, offset: 0x24 */ - __I uint32_t SRQ; /**< QchannelRx Register, offset: 0x28 */ - __O uint32_t STL; /**< SPDIFTxLeft Register, offset: 0x2C */ - __O uint32_t STR; /**< SPDIFTxRight Register, offset: 0x30 */ - __IO uint32_t STCSCH; /**< SPDIFTxCChannelCons_h Register, offset: 0x34 */ - __IO uint32_t STCSCL; /**< SPDIFTxCChannelCons_l Register, offset: 0x38 */ - uint8_t RESERVED_0[8]; - __I uint32_t SRFM; /**< FreqMeas Register, offset: 0x44 */ - uint8_t RESERVED_1[8]; - __IO uint32_t STC; /**< SPDIFTxClk Register, offset: 0x50 */ -} SPDIF_Type; - -/* ---------------------------------------------------------------------------- - -- SPDIF Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SPDIF_Register_Masks SPDIF Register Masks - * @{ - */ - -/*! @name SCR - SPDIF Configuration Register */ -/*! @{ */ - -#define SPDIF_SCR_USRC_SEL_MASK (0x3U) -#define SPDIF_SCR_USRC_SEL_SHIFT (0U) -/*! USrc_Sel - * 0b00..No embedded U channel - * 0b01..U channel from SPDIF receive block (CD mode) - * 0b10..Reserved - * 0b11..U channel from on chip transmitter - */ -#define SPDIF_SCR_USRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_USRC_SEL_SHIFT)) & SPDIF_SCR_USRC_SEL_MASK) - -#define SPDIF_SCR_TXSEL_MASK (0x1CU) -#define SPDIF_SCR_TXSEL_SHIFT (2U) -/*! TxSel - * 0b000..Off and output 0 - * 0b001..Feed-through SPDIFIN - * 0b101..Tx Normal operation - */ -#define SPDIF_SCR_TXSEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_TXSEL_SHIFT)) & SPDIF_SCR_TXSEL_MASK) - -#define SPDIF_SCR_VALCTRL_MASK (0x20U) -#define SPDIF_SCR_VALCTRL_SHIFT (5U) -/*! ValCtrl - * 0b0..Outgoing Validity always set - * 0b1..Outgoing Validity always clear - */ -#define SPDIF_SCR_VALCTRL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_VALCTRL_SHIFT)) & SPDIF_SCR_VALCTRL_MASK) - -#define SPDIF_SCR_DMA_TX_EN_MASK (0x100U) -#define SPDIF_SCR_DMA_TX_EN_SHIFT (8U) -#define SPDIF_SCR_DMA_TX_EN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_DMA_TX_EN_SHIFT)) & SPDIF_SCR_DMA_TX_EN_MASK) - -#define SPDIF_SCR_DMA_RX_EN_MASK (0x200U) -#define SPDIF_SCR_DMA_RX_EN_SHIFT (9U) -#define SPDIF_SCR_DMA_RX_EN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_DMA_RX_EN_SHIFT)) & SPDIF_SCR_DMA_RX_EN_MASK) - -#define SPDIF_SCR_TXFIFO_CTRL_MASK (0xC00U) -#define SPDIF_SCR_TXFIFO_CTRL_SHIFT (10U) -/*! TxFIFO_Ctrl - * 0b00..Send out digital zero on SPDIF Tx - * 0b01..Tx Normal operation - * 0b10..Reset to 1 sample remaining - * 0b11..Reserved - */ -#define SPDIF_SCR_TXFIFO_CTRL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_TXFIFO_CTRL_SHIFT)) & SPDIF_SCR_TXFIFO_CTRL_MASK) - -#define SPDIF_SCR_SOFT_RESET_MASK (0x1000U) -#define SPDIF_SCR_SOFT_RESET_SHIFT (12U) -#define SPDIF_SCR_SOFT_RESET(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_SOFT_RESET_SHIFT)) & SPDIF_SCR_SOFT_RESET_MASK) - -#define SPDIF_SCR_LOW_POWER_MASK (0x2000U) -#define SPDIF_SCR_LOW_POWER_SHIFT (13U) -#define SPDIF_SCR_LOW_POWER(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_LOW_POWER_SHIFT)) & SPDIF_SCR_LOW_POWER_MASK) - -#define SPDIF_SCR_TXFIFOEMPTY_SEL_MASK (0x18000U) -#define SPDIF_SCR_TXFIFOEMPTY_SEL_SHIFT (15U) -/*! TxFIFOEmpty_Sel - * 0b00..Empty interrupt if 0 sample in Tx left and right FIFOs - * 0b01..Empty interrupt if at most 4 sample in Tx left and right FIFOs - * 0b10..Empty interrupt if at most 8 sample in Tx left and right FIFOs - * 0b11..Empty interrupt if at most 12 sample in Tx left and right FIFOs - */ -#define SPDIF_SCR_TXFIFOEMPTY_SEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_TXFIFOEMPTY_SEL_SHIFT)) & SPDIF_SCR_TXFIFOEMPTY_SEL_MASK) - -#define SPDIF_SCR_TXAUTOSYNC_MASK (0x20000U) -#define SPDIF_SCR_TXAUTOSYNC_SHIFT (17U) -/*! TxAutoSync - * 0b0..Tx FIFO auto sync off - * 0b1..Tx FIFO auto sync on - */ -#define SPDIF_SCR_TXAUTOSYNC(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_TXAUTOSYNC_SHIFT)) & SPDIF_SCR_TXAUTOSYNC_MASK) - -#define SPDIF_SCR_RXAUTOSYNC_MASK (0x40000U) -#define SPDIF_SCR_RXAUTOSYNC_SHIFT (18U) -/*! RxAutoSync - * 0b0..Rx FIFO auto sync off - * 0b1..RxFIFO auto sync on - */ -#define SPDIF_SCR_RXAUTOSYNC(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_RXAUTOSYNC_SHIFT)) & SPDIF_SCR_RXAUTOSYNC_MASK) - -#define SPDIF_SCR_RXFIFOFULL_SEL_MASK (0x180000U) -#define SPDIF_SCR_RXFIFOFULL_SEL_SHIFT (19U) -/*! RxFIFOFull_Sel - * 0b00..Full interrupt if at least 1 sample in Rx left and right FIFOs - * 0b01..Full interrupt if at least 4 sample in Rx left and right FIFOs - * 0b10..Full interrupt if at least 8 sample in Rx left and right FIFOs - * 0b11..Full interrupt if at least 16 sample in Rx left and right FIFO - */ -#define SPDIF_SCR_RXFIFOFULL_SEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_RXFIFOFULL_SEL_SHIFT)) & SPDIF_SCR_RXFIFOFULL_SEL_MASK) - -#define SPDIF_SCR_RXFIFO_RST_MASK (0x200000U) -#define SPDIF_SCR_RXFIFO_RST_SHIFT (21U) -/*! RxFIFO_Rst - * 0b0..Normal operation - * 0b1..Reset register to 1 sample remaining - */ -#define SPDIF_SCR_RXFIFO_RST(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_RXFIFO_RST_SHIFT)) & SPDIF_SCR_RXFIFO_RST_MASK) - -#define SPDIF_SCR_RXFIFO_OFF_ON_MASK (0x400000U) -#define SPDIF_SCR_RXFIFO_OFF_ON_SHIFT (22U) -/*! RxFIFO_Off_On - * 0b0..SPDIF Rx FIFO is on - * 0b1..SPDIF Rx FIFO is off. Does not accept data from interface - */ -#define SPDIF_SCR_RXFIFO_OFF_ON(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_RXFIFO_OFF_ON_SHIFT)) & SPDIF_SCR_RXFIFO_OFF_ON_MASK) - -#define SPDIF_SCR_RXFIFO_CTRL_MASK (0x800000U) -#define SPDIF_SCR_RXFIFO_CTRL_SHIFT (23U) -/*! RxFIFO_Ctrl - * 0b0..Normal operation - * 0b1..Always read zero from Rx data register - */ -#define SPDIF_SCR_RXFIFO_CTRL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SCR_RXFIFO_CTRL_SHIFT)) & SPDIF_SCR_RXFIFO_CTRL_MASK) -/*! @} */ - -/*! @name SRCD - CDText Control Register */ -/*! @{ */ - -#define SPDIF_SRCD_USYNCMODE_MASK (0x2U) -#define SPDIF_SRCD_USYNCMODE_SHIFT (1U) -/*! USyncMode - * 0b0..Non-CD data - * 0b1..CD user channel subcode - */ -#define SPDIF_SRCD_USYNCMODE(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRCD_USYNCMODE_SHIFT)) & SPDIF_SRCD_USYNCMODE_MASK) -/*! @} */ - -/*! @name SRPC - PhaseConfig Register */ -/*! @{ */ - -#define SPDIF_SRPC_GAINSEL_MASK (0x38U) -#define SPDIF_SRPC_GAINSEL_SHIFT (3U) -/*! GainSel - * 0b000..24*(2**10) - * 0b001..16*(2**10) - * 0b010..12*(2**10) - * 0b011..8*(2**10) - * 0b100..6*(2**10) - * 0b101..4*(2**10) - * 0b110..3*(2**10) - */ -#define SPDIF_SRPC_GAINSEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRPC_GAINSEL_SHIFT)) & SPDIF_SRPC_GAINSEL_MASK) - -#define SPDIF_SRPC_LOCK_MASK (0x40U) -#define SPDIF_SRPC_LOCK_SHIFT (6U) -#define SPDIF_SRPC_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRPC_LOCK_SHIFT)) & SPDIF_SRPC_LOCK_MASK) - -#define SPDIF_SRPC_CLKSRC_SEL_MASK (0x780U) -#define SPDIF_SRPC_CLKSRC_SEL_SHIFT (7U) -/*! ClkSrc_Sel - * 0b0000..if (DPLL Locked) SPDIF_RxClk else REF_CLK_32K (XTALOSC) - * 0b0001..if (DPLL Locked) SPDIF_RxClk else tx_clk (SPDIF0_CLK_ROOT) - * 0b0011..if (DPLL Locked) SPDIF_RxClk else SPDIF_EXT_CLK - * 0b0101..REF_CLK_32K (XTALOSC) - * 0b0110..tx_clk (SPDIF0_CLK_ROOT) - * 0b1000..SPDIF_EXT_CLK - */ -#define SPDIF_SRPC_CLKSRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRPC_CLKSRC_SEL_SHIFT)) & SPDIF_SRPC_CLKSRC_SEL_MASK) -/*! @} */ - -/*! @name SIE - InterruptEn Register */ -/*! @{ */ - -#define SPDIF_SIE_RXFIFOFUL_MASK (0x1U) -#define SPDIF_SIE_RXFIFOFUL_SHIFT (0U) -#define SPDIF_SIE_RXFIFOFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_RXFIFOFUL_SHIFT)) & SPDIF_SIE_RXFIFOFUL_MASK) - -#define SPDIF_SIE_TXEM_MASK (0x2U) -#define SPDIF_SIE_TXEM_SHIFT (1U) -#define SPDIF_SIE_TXEM(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_TXEM_SHIFT)) & SPDIF_SIE_TXEM_MASK) - -#define SPDIF_SIE_LOCKLOSS_MASK (0x4U) -#define SPDIF_SIE_LOCKLOSS_SHIFT (2U) -#define SPDIF_SIE_LOCKLOSS(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_LOCKLOSS_SHIFT)) & SPDIF_SIE_LOCKLOSS_MASK) - -#define SPDIF_SIE_RXFIFORESYN_MASK (0x8U) -#define SPDIF_SIE_RXFIFORESYN_SHIFT (3U) -#define SPDIF_SIE_RXFIFORESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_RXFIFORESYN_SHIFT)) & SPDIF_SIE_RXFIFORESYN_MASK) - -#define SPDIF_SIE_RXFIFOUNOV_MASK (0x10U) -#define SPDIF_SIE_RXFIFOUNOV_SHIFT (4U) -#define SPDIF_SIE_RXFIFOUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_RXFIFOUNOV_SHIFT)) & SPDIF_SIE_RXFIFOUNOV_MASK) - -#define SPDIF_SIE_UQERR_MASK (0x20U) -#define SPDIF_SIE_UQERR_SHIFT (5U) -#define SPDIF_SIE_UQERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_UQERR_SHIFT)) & SPDIF_SIE_UQERR_MASK) - -#define SPDIF_SIE_UQSYNC_MASK (0x40U) -#define SPDIF_SIE_UQSYNC_SHIFT (6U) -#define SPDIF_SIE_UQSYNC(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_UQSYNC_SHIFT)) & SPDIF_SIE_UQSYNC_MASK) - -#define SPDIF_SIE_QRXOV_MASK (0x80U) -#define SPDIF_SIE_QRXOV_SHIFT (7U) -#define SPDIF_SIE_QRXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_QRXOV_SHIFT)) & SPDIF_SIE_QRXOV_MASK) - -#define SPDIF_SIE_QRXFUL_MASK (0x100U) -#define SPDIF_SIE_QRXFUL_SHIFT (8U) -#define SPDIF_SIE_QRXFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_QRXFUL_SHIFT)) & SPDIF_SIE_QRXFUL_MASK) - -#define SPDIF_SIE_URXOV_MASK (0x200U) -#define SPDIF_SIE_URXOV_SHIFT (9U) -#define SPDIF_SIE_URXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_URXOV_SHIFT)) & SPDIF_SIE_URXOV_MASK) - -#define SPDIF_SIE_URXFUL_MASK (0x400U) -#define SPDIF_SIE_URXFUL_SHIFT (10U) -#define SPDIF_SIE_URXFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_URXFUL_SHIFT)) & SPDIF_SIE_URXFUL_MASK) - -#define SPDIF_SIE_BITERR_MASK (0x4000U) -#define SPDIF_SIE_BITERR_SHIFT (14U) -#define SPDIF_SIE_BITERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_BITERR_SHIFT)) & SPDIF_SIE_BITERR_MASK) - -#define SPDIF_SIE_SYMERR_MASK (0x8000U) -#define SPDIF_SIE_SYMERR_SHIFT (15U) -#define SPDIF_SIE_SYMERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_SYMERR_SHIFT)) & SPDIF_SIE_SYMERR_MASK) - -#define SPDIF_SIE_VALNOGOOD_MASK (0x10000U) -#define SPDIF_SIE_VALNOGOOD_SHIFT (16U) -#define SPDIF_SIE_VALNOGOOD(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_VALNOGOOD_SHIFT)) & SPDIF_SIE_VALNOGOOD_MASK) - -#define SPDIF_SIE_CNEW_MASK (0x20000U) -#define SPDIF_SIE_CNEW_SHIFT (17U) -#define SPDIF_SIE_CNEW(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_CNEW_SHIFT)) & SPDIF_SIE_CNEW_MASK) - -#define SPDIF_SIE_TXRESYN_MASK (0x40000U) -#define SPDIF_SIE_TXRESYN_SHIFT (18U) -#define SPDIF_SIE_TXRESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_TXRESYN_SHIFT)) & SPDIF_SIE_TXRESYN_MASK) - -#define SPDIF_SIE_TXUNOV_MASK (0x80000U) -#define SPDIF_SIE_TXUNOV_SHIFT (19U) -#define SPDIF_SIE_TXUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_TXUNOV_SHIFT)) & SPDIF_SIE_TXUNOV_MASK) - -#define SPDIF_SIE_LOCK_MASK (0x100000U) -#define SPDIF_SIE_LOCK_SHIFT (20U) -#define SPDIF_SIE_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIE_LOCK_SHIFT)) & SPDIF_SIE_LOCK_MASK) -/*! @} */ - -/*! @name SIC - InterruptClear Register */ -/*! @{ */ - -#define SPDIF_SIC_LOCKLOSS_MASK (0x4U) -#define SPDIF_SIC_LOCKLOSS_SHIFT (2U) -#define SPDIF_SIC_LOCKLOSS(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_LOCKLOSS_SHIFT)) & SPDIF_SIC_LOCKLOSS_MASK) - -#define SPDIF_SIC_RXFIFORESYN_MASK (0x8U) -#define SPDIF_SIC_RXFIFORESYN_SHIFT (3U) -#define SPDIF_SIC_RXFIFORESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_RXFIFORESYN_SHIFT)) & SPDIF_SIC_RXFIFORESYN_MASK) - -#define SPDIF_SIC_RXFIFOUNOV_MASK (0x10U) -#define SPDIF_SIC_RXFIFOUNOV_SHIFT (4U) -#define SPDIF_SIC_RXFIFOUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_RXFIFOUNOV_SHIFT)) & SPDIF_SIC_RXFIFOUNOV_MASK) - -#define SPDIF_SIC_UQERR_MASK (0x20U) -#define SPDIF_SIC_UQERR_SHIFT (5U) -#define SPDIF_SIC_UQERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_UQERR_SHIFT)) & SPDIF_SIC_UQERR_MASK) - -#define SPDIF_SIC_UQSYNC_MASK (0x40U) -#define SPDIF_SIC_UQSYNC_SHIFT (6U) -#define SPDIF_SIC_UQSYNC(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_UQSYNC_SHIFT)) & SPDIF_SIC_UQSYNC_MASK) - -#define SPDIF_SIC_QRXOV_MASK (0x80U) -#define SPDIF_SIC_QRXOV_SHIFT (7U) -#define SPDIF_SIC_QRXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_QRXOV_SHIFT)) & SPDIF_SIC_QRXOV_MASK) - -#define SPDIF_SIC_URXOV_MASK (0x200U) -#define SPDIF_SIC_URXOV_SHIFT (9U) -#define SPDIF_SIC_URXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_URXOV_SHIFT)) & SPDIF_SIC_URXOV_MASK) - -#define SPDIF_SIC_BITERR_MASK (0x4000U) -#define SPDIF_SIC_BITERR_SHIFT (14U) -#define SPDIF_SIC_BITERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_BITERR_SHIFT)) & SPDIF_SIC_BITERR_MASK) - -#define SPDIF_SIC_SYMERR_MASK (0x8000U) -#define SPDIF_SIC_SYMERR_SHIFT (15U) -#define SPDIF_SIC_SYMERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_SYMERR_SHIFT)) & SPDIF_SIC_SYMERR_MASK) - -#define SPDIF_SIC_VALNOGOOD_MASK (0x10000U) -#define SPDIF_SIC_VALNOGOOD_SHIFT (16U) -#define SPDIF_SIC_VALNOGOOD(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_VALNOGOOD_SHIFT)) & SPDIF_SIC_VALNOGOOD_MASK) - -#define SPDIF_SIC_CNEW_MASK (0x20000U) -#define SPDIF_SIC_CNEW_SHIFT (17U) -#define SPDIF_SIC_CNEW(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_CNEW_SHIFT)) & SPDIF_SIC_CNEW_MASK) - -#define SPDIF_SIC_TXRESYN_MASK (0x40000U) -#define SPDIF_SIC_TXRESYN_SHIFT (18U) -#define SPDIF_SIC_TXRESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_TXRESYN_SHIFT)) & SPDIF_SIC_TXRESYN_MASK) - -#define SPDIF_SIC_TXUNOV_MASK (0x80000U) -#define SPDIF_SIC_TXUNOV_SHIFT (19U) -#define SPDIF_SIC_TXUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_TXUNOV_SHIFT)) & SPDIF_SIC_TXUNOV_MASK) - -#define SPDIF_SIC_LOCK_MASK (0x100000U) -#define SPDIF_SIC_LOCK_SHIFT (20U) -#define SPDIF_SIC_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIC_LOCK_SHIFT)) & SPDIF_SIC_LOCK_MASK) -/*! @} */ - -/*! @name SIS - InterruptStat Register */ -/*! @{ */ - -#define SPDIF_SIS_RXFIFOFUL_MASK (0x1U) -#define SPDIF_SIS_RXFIFOFUL_SHIFT (0U) -#define SPDIF_SIS_RXFIFOFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_RXFIFOFUL_SHIFT)) & SPDIF_SIS_RXFIFOFUL_MASK) - -#define SPDIF_SIS_TXEM_MASK (0x2U) -#define SPDIF_SIS_TXEM_SHIFT (1U) -#define SPDIF_SIS_TXEM(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_TXEM_SHIFT)) & SPDIF_SIS_TXEM_MASK) - -#define SPDIF_SIS_LOCKLOSS_MASK (0x4U) -#define SPDIF_SIS_LOCKLOSS_SHIFT (2U) -#define SPDIF_SIS_LOCKLOSS(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_LOCKLOSS_SHIFT)) & SPDIF_SIS_LOCKLOSS_MASK) - -#define SPDIF_SIS_RXFIFORESYN_MASK (0x8U) -#define SPDIF_SIS_RXFIFORESYN_SHIFT (3U) -#define SPDIF_SIS_RXFIFORESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_RXFIFORESYN_SHIFT)) & SPDIF_SIS_RXFIFORESYN_MASK) - -#define SPDIF_SIS_RXFIFOUNOV_MASK (0x10U) -#define SPDIF_SIS_RXFIFOUNOV_SHIFT (4U) -#define SPDIF_SIS_RXFIFOUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_RXFIFOUNOV_SHIFT)) & SPDIF_SIS_RXFIFOUNOV_MASK) - -#define SPDIF_SIS_UQERR_MASK (0x20U) -#define SPDIF_SIS_UQERR_SHIFT (5U) -#define SPDIF_SIS_UQERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_UQERR_SHIFT)) & SPDIF_SIS_UQERR_MASK) - -#define SPDIF_SIS_UQSYNC_MASK (0x40U) -#define SPDIF_SIS_UQSYNC_SHIFT (6U) -#define SPDIF_SIS_UQSYNC(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_UQSYNC_SHIFT)) & SPDIF_SIS_UQSYNC_MASK) - -#define SPDIF_SIS_QRXOV_MASK (0x80U) -#define SPDIF_SIS_QRXOV_SHIFT (7U) -#define SPDIF_SIS_QRXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_QRXOV_SHIFT)) & SPDIF_SIS_QRXOV_MASK) - -#define SPDIF_SIS_QRXFUL_MASK (0x100U) -#define SPDIF_SIS_QRXFUL_SHIFT (8U) -#define SPDIF_SIS_QRXFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_QRXFUL_SHIFT)) & SPDIF_SIS_QRXFUL_MASK) - -#define SPDIF_SIS_URXOV_MASK (0x200U) -#define SPDIF_SIS_URXOV_SHIFT (9U) -#define SPDIF_SIS_URXOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_URXOV_SHIFT)) & SPDIF_SIS_URXOV_MASK) - -#define SPDIF_SIS_URXFUL_MASK (0x400U) -#define SPDIF_SIS_URXFUL_SHIFT (10U) -#define SPDIF_SIS_URXFUL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_URXFUL_SHIFT)) & SPDIF_SIS_URXFUL_MASK) - -#define SPDIF_SIS_BITERR_MASK (0x4000U) -#define SPDIF_SIS_BITERR_SHIFT (14U) -#define SPDIF_SIS_BITERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_BITERR_SHIFT)) & SPDIF_SIS_BITERR_MASK) - -#define SPDIF_SIS_SYMERR_MASK (0x8000U) -#define SPDIF_SIS_SYMERR_SHIFT (15U) -#define SPDIF_SIS_SYMERR(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_SYMERR_SHIFT)) & SPDIF_SIS_SYMERR_MASK) - -#define SPDIF_SIS_VALNOGOOD_MASK (0x10000U) -#define SPDIF_SIS_VALNOGOOD_SHIFT (16U) -#define SPDIF_SIS_VALNOGOOD(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_VALNOGOOD_SHIFT)) & SPDIF_SIS_VALNOGOOD_MASK) - -#define SPDIF_SIS_CNEW_MASK (0x20000U) -#define SPDIF_SIS_CNEW_SHIFT (17U) -#define SPDIF_SIS_CNEW(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_CNEW_SHIFT)) & SPDIF_SIS_CNEW_MASK) - -#define SPDIF_SIS_TXRESYN_MASK (0x40000U) -#define SPDIF_SIS_TXRESYN_SHIFT (18U) -#define SPDIF_SIS_TXRESYN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_TXRESYN_SHIFT)) & SPDIF_SIS_TXRESYN_MASK) - -#define SPDIF_SIS_TXUNOV_MASK (0x80000U) -#define SPDIF_SIS_TXUNOV_SHIFT (19U) -#define SPDIF_SIS_TXUNOV(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_TXUNOV_SHIFT)) & SPDIF_SIS_TXUNOV_MASK) - -#define SPDIF_SIS_LOCK_MASK (0x100000U) -#define SPDIF_SIS_LOCK_SHIFT (20U) -#define SPDIF_SIS_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SIS_LOCK_SHIFT)) & SPDIF_SIS_LOCK_MASK) -/*! @} */ - -/*! @name SRL - SPDIFRxLeft Register */ -/*! @{ */ - -#define SPDIF_SRL_RXDATALEFT_MASK (0xFFFFFFU) -#define SPDIF_SRL_RXDATALEFT_SHIFT (0U) -#define SPDIF_SRL_RXDATALEFT(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRL_RXDATALEFT_SHIFT)) & SPDIF_SRL_RXDATALEFT_MASK) -/*! @} */ - -/*! @name SRR - SPDIFRxRight Register */ -/*! @{ */ - -#define SPDIF_SRR_RXDATARIGHT_MASK (0xFFFFFFU) -#define SPDIF_SRR_RXDATARIGHT_SHIFT (0U) -#define SPDIF_SRR_RXDATARIGHT(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRR_RXDATARIGHT_SHIFT)) & SPDIF_SRR_RXDATARIGHT_MASK) -/*! @} */ - -/*! @name SRCSH - SPDIFRxCChannel_h Register */ -/*! @{ */ - -#define SPDIF_SRCSH_RXCCHANNEL_H_MASK (0xFFFFFFU) -#define SPDIF_SRCSH_RXCCHANNEL_H_SHIFT (0U) -#define SPDIF_SRCSH_RXCCHANNEL_H(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRCSH_RXCCHANNEL_H_SHIFT)) & SPDIF_SRCSH_RXCCHANNEL_H_MASK) -/*! @} */ - -/*! @name SRCSL - SPDIFRxCChannel_l Register */ -/*! @{ */ - -#define SPDIF_SRCSL_RXCCHANNEL_L_MASK (0xFFFFFFU) -#define SPDIF_SRCSL_RXCCHANNEL_L_SHIFT (0U) -#define SPDIF_SRCSL_RXCCHANNEL_L(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRCSL_RXCCHANNEL_L_SHIFT)) & SPDIF_SRCSL_RXCCHANNEL_L_MASK) -/*! @} */ - -/*! @name SRU - UchannelRx Register */ -/*! @{ */ - -#define SPDIF_SRU_RXUCHANNEL_MASK (0xFFFFFFU) -#define SPDIF_SRU_RXUCHANNEL_SHIFT (0U) -#define SPDIF_SRU_RXUCHANNEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRU_RXUCHANNEL_SHIFT)) & SPDIF_SRU_RXUCHANNEL_MASK) -/*! @} */ - -/*! @name SRQ - QchannelRx Register */ -/*! @{ */ - -#define SPDIF_SRQ_RXQCHANNEL_MASK (0xFFFFFFU) -#define SPDIF_SRQ_RXQCHANNEL_SHIFT (0U) -#define SPDIF_SRQ_RXQCHANNEL(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRQ_RXQCHANNEL_SHIFT)) & SPDIF_SRQ_RXQCHANNEL_MASK) -/*! @} */ - -/*! @name STL - SPDIFTxLeft Register */ -/*! @{ */ - -#define SPDIF_STL_TXDATALEFT_MASK (0xFFFFFFU) -#define SPDIF_STL_TXDATALEFT_SHIFT (0U) -#define SPDIF_STL_TXDATALEFT(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STL_TXDATALEFT_SHIFT)) & SPDIF_STL_TXDATALEFT_MASK) -/*! @} */ - -/*! @name STR - SPDIFTxRight Register */ -/*! @{ */ - -#define SPDIF_STR_TXDATARIGHT_MASK (0xFFFFFFU) -#define SPDIF_STR_TXDATARIGHT_SHIFT (0U) -#define SPDIF_STR_TXDATARIGHT(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STR_TXDATARIGHT_SHIFT)) & SPDIF_STR_TXDATARIGHT_MASK) -/*! @} */ - -/*! @name STCSCH - SPDIFTxCChannelCons_h Register */ -/*! @{ */ - -#define SPDIF_STCSCH_TXCCHANNELCONS_H_MASK (0xFFFFFFU) -#define SPDIF_STCSCH_TXCCHANNELCONS_H_SHIFT (0U) -#define SPDIF_STCSCH_TXCCHANNELCONS_H(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STCSCH_TXCCHANNELCONS_H_SHIFT)) & SPDIF_STCSCH_TXCCHANNELCONS_H_MASK) -/*! @} */ - -/*! @name STCSCL - SPDIFTxCChannelCons_l Register */ -/*! @{ */ - -#define SPDIF_STCSCL_TXCCHANNELCONS_L_MASK (0xFFFFFFU) -#define SPDIF_STCSCL_TXCCHANNELCONS_L_SHIFT (0U) -#define SPDIF_STCSCL_TXCCHANNELCONS_L(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STCSCL_TXCCHANNELCONS_L_SHIFT)) & SPDIF_STCSCL_TXCCHANNELCONS_L_MASK) -/*! @} */ - -/*! @name SRFM - FreqMeas Register */ -/*! @{ */ - -#define SPDIF_SRFM_FREQMEAS_MASK (0xFFFFFFU) -#define SPDIF_SRFM_FREQMEAS_SHIFT (0U) -#define SPDIF_SRFM_FREQMEAS(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_SRFM_FREQMEAS_SHIFT)) & SPDIF_SRFM_FREQMEAS_MASK) -/*! @} */ - -/*! @name STC - SPDIFTxClk Register */ -/*! @{ */ - -#define SPDIF_STC_TXCLK_DF_MASK (0x7FU) -#define SPDIF_STC_TXCLK_DF_SHIFT (0U) -/*! TxClk_DF - * 0b0000000..divider factor is 1 - * 0b0000001..divider factor is 2 - * 0b1111111..divider factor is 128 - */ -#define SPDIF_STC_TXCLK_DF(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STC_TXCLK_DF_SHIFT)) & SPDIF_STC_TXCLK_DF_MASK) - -#define SPDIF_STC_TX_ALL_CLK_EN_MASK (0x80U) -#define SPDIF_STC_TX_ALL_CLK_EN_SHIFT (7U) -/*! tx_all_clk_en - * 0b0..disable transfer clock. - * 0b1..enable transfer clock. - */ -#define SPDIF_STC_TX_ALL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STC_TX_ALL_CLK_EN_SHIFT)) & SPDIF_STC_TX_ALL_CLK_EN_MASK) - -#define SPDIF_STC_TXCLK_SOURCE_MASK (0x700U) -#define SPDIF_STC_TXCLK_SOURCE_SHIFT (8U) -/*! TxClk_Source - * 0b000..REF_CLK_32K input (XTALOSC 32 kHz clock) - * 0b001..tx_clk input (from SPDIF0_CLK_ROOT. See CCM.) - * 0b011..SPDIF_EXT_CLK, from pads - * 0b101..ipg_clk input (frequency divided) - */ -#define SPDIF_STC_TXCLK_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STC_TXCLK_SOURCE_SHIFT)) & SPDIF_STC_TXCLK_SOURCE_MASK) - -#define SPDIF_STC_SYSCLK_DF_MASK (0xFF800U) -#define SPDIF_STC_SYSCLK_DF_SHIFT (11U) -/*! SYSCLK_DF - * 0b000000000..no clock signal - * 0b000000001..divider factor is 2 - * 0b111111111..divider factor is 512 - */ -#define SPDIF_STC_SYSCLK_DF(x) (((uint32_t)(((uint32_t)(x)) << SPDIF_STC_SYSCLK_DF_SHIFT)) & SPDIF_STC_SYSCLK_DF_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group SPDIF_Register_Masks */ - - -/* SPDIF - Peripheral instance base addresses */ -/** Peripheral SPDIF base address */ -#define SPDIF_BASE (0x40380000u) -/** Peripheral SPDIF base pointer */ -#define SPDIF ((SPDIF_Type *)SPDIF_BASE) -/** Array initializer of SPDIF peripheral base addresses */ -#define SPDIF_BASE_ADDRS { SPDIF_BASE } -/** Array initializer of SPDIF peripheral base pointers */ -#define SPDIF_BASE_PTRS { SPDIF } -/** Interrupt vectors for the SPDIF peripheral type */ -#define SPDIF_IRQS { SPDIF_IRQn } - -/*! - * @} - */ /* end of group SPDIF_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- SRC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SRC_Peripheral_Access_Layer SRC Peripheral Access Layer - * @{ - */ - -/** SRC - Register Layout Typedef */ -typedef struct { - __IO uint32_t SCR; /**< SRC Control Register, offset: 0x0 */ - __I uint32_t SBMR1; /**< SRC Boot Mode Register 1, offset: 0x4 */ - __IO uint32_t SRSR; /**< SRC Reset Status Register, offset: 0x8 */ - uint8_t RESERVED_0[16]; - __I uint32_t SBMR2; /**< SRC Boot Mode Register 2, offset: 0x1C */ - __IO uint32_t GPR[10]; /**< SRC General Purpose Register 1..SRC General Purpose Register 10, array offset: 0x20, array step: 0x4 */ -} SRC_Type; - -/* ---------------------------------------------------------------------------- - -- SRC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SRC_Register_Masks SRC Register Masks - * @{ - */ - -/*! @name SCR - SRC Control Register */ -/*! @{ */ - -#define SRC_SCR_MASK_WDOG_RST_MASK (0x780U) -#define SRC_SCR_MASK_WDOG_RST_SHIFT (7U) -/*! mask_wdog_rst - * 0b0101..wdog_rst_b is masked - * 0b1010..wdog_rst_b is not masked (default) - */ -#define SRC_SCR_MASK_WDOG_RST(x) (((uint32_t)(((uint32_t)(x)) << SRC_SCR_MASK_WDOG_RST_SHIFT)) & SRC_SCR_MASK_WDOG_RST_MASK) - -#define SRC_SCR_CORE0_RST_MASK (0x2000U) -#define SRC_SCR_CORE0_RST_SHIFT (13U) -/*! core0_rst - * 0b0..do not assert core0 reset - * 0b1..assert core0 reset - */ -#define SRC_SCR_CORE0_RST(x) (((uint32_t)(((uint32_t)(x)) << SRC_SCR_CORE0_RST_SHIFT)) & SRC_SCR_CORE0_RST_MASK) - -#define SRC_SCR_CORE0_DBG_RST_MASK (0x20000U) -#define SRC_SCR_CORE0_DBG_RST_SHIFT (17U) -/*! core0_dbg_rst - * 0b0..do not assert core0 debug reset - * 0b1..assert core0 debug reset - */ -#define SRC_SCR_CORE0_DBG_RST(x) (((uint32_t)(((uint32_t)(x)) << SRC_SCR_CORE0_DBG_RST_SHIFT)) & SRC_SCR_CORE0_DBG_RST_MASK) - -#define SRC_SCR_DBG_RST_MSK_PG_MASK (0x2000000U) -#define SRC_SCR_DBG_RST_MSK_PG_SHIFT (25U) -/*! dbg_rst_msk_pg - * 0b0..do not mask core debug resets (debug resets will be asserted after power gating event) - * 0b1..mask core debug resets (debug resets won't be asserted after power gating event) - */ -#define SRC_SCR_DBG_RST_MSK_PG(x) (((uint32_t)(((uint32_t)(x)) << SRC_SCR_DBG_RST_MSK_PG_SHIFT)) & SRC_SCR_DBG_RST_MSK_PG_MASK) - -#define SRC_SCR_MASK_WDOG3_RST_MASK (0xF0000000U) -#define SRC_SCR_MASK_WDOG3_RST_SHIFT (28U) -/*! mask_wdog3_rst - * 0b0101..wdog3_rst_b is masked - * 0b1010..wdog3_rst_b is not masked - */ -#define SRC_SCR_MASK_WDOG3_RST(x) (((uint32_t)(((uint32_t)(x)) << SRC_SCR_MASK_WDOG3_RST_SHIFT)) & SRC_SCR_MASK_WDOG3_RST_MASK) -/*! @} */ - -/*! @name SBMR1 - SRC Boot Mode Register 1 */ -/*! @{ */ - -#define SRC_SBMR1_BOOT_CFG1_MASK (0xFFU) -#define SRC_SBMR1_BOOT_CFG1_SHIFT (0U) -#define SRC_SBMR1_BOOT_CFG1(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR1_BOOT_CFG1_SHIFT)) & SRC_SBMR1_BOOT_CFG1_MASK) - -#define SRC_SBMR1_BOOT_CFG2_MASK (0xFF00U) -#define SRC_SBMR1_BOOT_CFG2_SHIFT (8U) -#define SRC_SBMR1_BOOT_CFG2(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR1_BOOT_CFG2_SHIFT)) & SRC_SBMR1_BOOT_CFG2_MASK) - -#define SRC_SBMR1_BOOT_CFG3_MASK (0xFF0000U) -#define SRC_SBMR1_BOOT_CFG3_SHIFT (16U) -#define SRC_SBMR1_BOOT_CFG3(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR1_BOOT_CFG3_SHIFT)) & SRC_SBMR1_BOOT_CFG3_MASK) - -#define SRC_SBMR1_BOOT_CFG4_MASK (0xFF000000U) -#define SRC_SBMR1_BOOT_CFG4_SHIFT (24U) -#define SRC_SBMR1_BOOT_CFG4(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR1_BOOT_CFG4_SHIFT)) & SRC_SBMR1_BOOT_CFG4_MASK) -/*! @} */ - -/*! @name SRSR - SRC Reset Status Register */ -/*! @{ */ - -#define SRC_SRSR_IPP_RESET_B_MASK (0x1U) -#define SRC_SRSR_IPP_RESET_B_SHIFT (0U) -/*! ipp_reset_b - * 0b0..Reset is not a result of ipp_reset_b pin. - * 0b1..Reset is a result of ipp_reset_b pin. - */ -#define SRC_SRSR_IPP_RESET_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_IPP_RESET_B_SHIFT)) & SRC_SRSR_IPP_RESET_B_MASK) - -#define SRC_SRSR_LOCKUP_SYSRESETREQ_MASK (0x2U) -#define SRC_SRSR_LOCKUP_SYSRESETREQ_SHIFT (1U) -/*! lockup_sysresetreq - * 0b0..Reset is not a result of the mentioned case. - * 0b1..Reset is a result of the mentioned case. - */ -#define SRC_SRSR_LOCKUP_SYSRESETREQ(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_LOCKUP_SYSRESETREQ_SHIFT)) & SRC_SRSR_LOCKUP_SYSRESETREQ_MASK) - -#define SRC_SRSR_CSU_RESET_B_MASK (0x4U) -#define SRC_SRSR_CSU_RESET_B_SHIFT (2U) -/*! csu_reset_b - * 0b0..Reset is not a result of the csu_reset_b event. - * 0b1..Reset is a result of the csu_reset_b event. - */ -#define SRC_SRSR_CSU_RESET_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_CSU_RESET_B_SHIFT)) & SRC_SRSR_CSU_RESET_B_MASK) - -#define SRC_SRSR_IPP_USER_RESET_B_MASK (0x8U) -#define SRC_SRSR_IPP_USER_RESET_B_SHIFT (3U) -/*! ipp_user_reset_b - * 0b0..Reset is not a result of the ipp_user_reset_b qualified as COLD reset event. - * 0b1..Reset is a result of the ipp_user_reset_b qualified as COLD reset event. - */ -#define SRC_SRSR_IPP_USER_RESET_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_IPP_USER_RESET_B_SHIFT)) & SRC_SRSR_IPP_USER_RESET_B_MASK) - -#define SRC_SRSR_WDOG_RST_B_MASK (0x10U) -#define SRC_SRSR_WDOG_RST_B_SHIFT (4U) -/*! wdog_rst_b - * 0b0..Reset is not a result of the watchdog time-out event. - * 0b1..Reset is a result of the watchdog time-out event. - */ -#define SRC_SRSR_WDOG_RST_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_WDOG_RST_B_SHIFT)) & SRC_SRSR_WDOG_RST_B_MASK) - -#define SRC_SRSR_JTAG_RST_B_MASK (0x20U) -#define SRC_SRSR_JTAG_RST_B_SHIFT (5U) -/*! jtag_rst_b - * 0b0..Reset is not a result of HIGH-Z reset from JTAG. - * 0b1..Reset is a result of HIGH-Z reset from JTAG. - */ -#define SRC_SRSR_JTAG_RST_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_JTAG_RST_B_SHIFT)) & SRC_SRSR_JTAG_RST_B_MASK) - -#define SRC_SRSR_JTAG_SW_RST_MASK (0x40U) -#define SRC_SRSR_JTAG_SW_RST_SHIFT (6U) -/*! jtag_sw_rst - * 0b0..Reset is not a result of software reset from JTAG. - * 0b1..Reset is a result of software reset from JTAG. - */ -#define SRC_SRSR_JTAG_SW_RST(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_JTAG_SW_RST_SHIFT)) & SRC_SRSR_JTAG_SW_RST_MASK) - -#define SRC_SRSR_WDOG3_RST_B_MASK (0x80U) -#define SRC_SRSR_WDOG3_RST_B_SHIFT (7U) -/*! wdog3_rst_b - * 0b0..Reset is not a result of the watchdog3 time-out event. - * 0b1..Reset is a result of the watchdog3 time-out event. - */ -#define SRC_SRSR_WDOG3_RST_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_WDOG3_RST_B_SHIFT)) & SRC_SRSR_WDOG3_RST_B_MASK) - -#define SRC_SRSR_TEMPSENSE_RST_B_MASK (0x100U) -#define SRC_SRSR_TEMPSENSE_RST_B_SHIFT (8U) -/*! tempsense_rst_b - * 0b0..Reset is not a result of software reset from Temperature Sensor. - * 0b1..Reset is a result of software reset from Temperature Sensor. - */ -#define SRC_SRSR_TEMPSENSE_RST_B(x) (((uint32_t)(((uint32_t)(x)) << SRC_SRSR_TEMPSENSE_RST_B_SHIFT)) & SRC_SRSR_TEMPSENSE_RST_B_MASK) -/*! @} */ - -/*! @name SBMR2 - SRC Boot Mode Register 2 */ -/*! @{ */ - -#define SRC_SBMR2_SEC_CONFIG_MASK (0x3U) -#define SRC_SBMR2_SEC_CONFIG_SHIFT (0U) -#define SRC_SBMR2_SEC_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR2_SEC_CONFIG_SHIFT)) & SRC_SBMR2_SEC_CONFIG_MASK) - -#define SRC_SBMR2_DIR_BT_DIS_MASK (0x8U) -#define SRC_SBMR2_DIR_BT_DIS_SHIFT (3U) -#define SRC_SBMR2_DIR_BT_DIS(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR2_DIR_BT_DIS_SHIFT)) & SRC_SBMR2_DIR_BT_DIS_MASK) - -#define SRC_SBMR2_BT_FUSE_SEL_MASK (0x10U) -#define SRC_SBMR2_BT_FUSE_SEL_SHIFT (4U) -#define SRC_SBMR2_BT_FUSE_SEL(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR2_BT_FUSE_SEL_SHIFT)) & SRC_SBMR2_BT_FUSE_SEL_MASK) - -#define SRC_SBMR2_BMOD_MASK (0x3000000U) -#define SRC_SBMR2_BMOD_SHIFT (24U) -#define SRC_SBMR2_BMOD(x) (((uint32_t)(((uint32_t)(x)) << SRC_SBMR2_BMOD_SHIFT)) & SRC_SBMR2_BMOD_MASK) -/*! @} */ - -/*! @name GPR - SRC General Purpose Register 1..SRC General Purpose Register 10 */ -/*! @{ */ - -#define SRC_GPR_PERSISTENT_ARG0_MASK (0xFFFFFFFFU) -#define SRC_GPR_PERSISTENT_ARG0_SHIFT (0U) -#define SRC_GPR_PERSISTENT_ARG0(x) (((uint32_t)(((uint32_t)(x)) << SRC_GPR_PERSISTENT_ARG0_SHIFT)) & SRC_GPR_PERSISTENT_ARG0_MASK) - -#define SRC_GPR_PERSISTENT_ENTRY0_MASK (0xFFFFFFFFU) -#define SRC_GPR_PERSISTENT_ENTRY0_SHIFT (0U) -#define SRC_GPR_PERSISTENT_ENTRY0(x) (((uint32_t)(((uint32_t)(x)) << SRC_GPR_PERSISTENT_ENTRY0_SHIFT)) & SRC_GPR_PERSISTENT_ENTRY0_MASK) -/*! @} */ - -/* The count of SRC_GPR */ -#define SRC_GPR_COUNT (10U) - - -/*! - * @} - */ /* end of group SRC_Register_Masks */ - - -/* SRC - Peripheral instance base addresses */ -/** Peripheral SRC base address */ -#define SRC_BASE (0x400F8000u) -/** Peripheral SRC base pointer */ -#define SRC ((SRC_Type *)SRC_BASE) -/** Array initializer of SRC peripheral base addresses */ -#define SRC_BASE_ADDRS { SRC_BASE } -/** Array initializer of SRC peripheral base pointers */ -#define SRC_BASE_PTRS { SRC } -/** Interrupt vectors for the SRC peripheral type */ -#define SRC_IRQS { SRC_IRQn } -/* Backward compatibility */ -#define SRC_SCR_MWDR_MASK SRC_SCR_MASK_WDOG_RST_MASK -#define SRC_SCR_MWDR_SHIFT SRC_SCR_MASK_WDOG_RST_SHIFT -#define SRC_SCR_MWDR(x) SRC_SCR_MASK_WDOG_RST(x) -#define SRC_SRSR_WDOG_MASK SRC_SRSR_WDOG_RST_B_MASK -#define SRC_SRSR_WDOG_SHIFT SRC_SRSR_WDOG_RST_B_SHIFT -#define SRC_SRSR_WDOG(x) SRC_SRSR_WDOG_RST_B(x) -#define SRC_SRSR_JTAG_MASK SRC_SRSR_JTAG_RST_B_MASK -#define SRC_SRSR_JTAG_SHIFT SRC_SRSR_JTAG_RST_B_SHIFT -#define SRC_SRSR_JTAG(x) SRC_SRSR_JTAG_RST_B(x) -#define SRC_SRSR_SJC_MASK SRC_SRSR_JTAG_SW_RST_MASK -#define SRC_SRSR_SJC_SHIFT SRC_SRSR_JTAG_SW_RST_SHIFT -#define SRC_SRSR_SJC(x) SRC_SRSR_JTAG_SW_RST(x) -#define SRC_SRSR_TSR_MASK SRC_SRSR_TEMPSENSE_RST_B_MASK -#define SRC_SRSR_TSR_SHIFT SRC_SRSR_TEMPSENSE_RST_B_SHIFT -#define SRC_SRSR_TSR(x) SRC_SRSR_TEMPSENSE_RST_B(x) -/* Extra definition */ -#define SRC_SRSR_W1C_BITS_MASK ( SRC_SRSR_WDOG3_RST_B_MASK \ - | SRC_SRSR_JTAG_SW_RST_MASK \ - | SRC_SRSR_JTAG_RST_B_MASK \ - | SRC_SRSR_WDOG_RST_B_MASK \ - | SRC_SRSR_IPP_USER_RESET_B_MASK \ - | SRC_SRSR_CSU_RESET_B_MASK \ - | SRC_SRSR_LOCKUP_SYSRESETREQ_MASK \ - | SRC_SRSR_IPP_RESET_B_MASK) - - -/*! - * @} - */ /* end of group SRC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- TEMPMON Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TEMPMON_Peripheral_Access_Layer TEMPMON Peripheral Access Layer - * @{ - */ - -/** TEMPMON - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[384]; - __IO uint32_t TEMPSENSE0; /**< Tempsensor Control Register 0, offset: 0x180 */ - __IO uint32_t TEMPSENSE0_SET; /**< Tempsensor Control Register 0, offset: 0x184 */ - __IO uint32_t TEMPSENSE0_CLR; /**< Tempsensor Control Register 0, offset: 0x188 */ - __IO uint32_t TEMPSENSE0_TOG; /**< Tempsensor Control Register 0, offset: 0x18C */ - __IO uint32_t TEMPSENSE1; /**< Tempsensor Control Register 1, offset: 0x190 */ - __IO uint32_t TEMPSENSE1_SET; /**< Tempsensor Control Register 1, offset: 0x194 */ - __IO uint32_t TEMPSENSE1_CLR; /**< Tempsensor Control Register 1, offset: 0x198 */ - __IO uint32_t TEMPSENSE1_TOG; /**< Tempsensor Control Register 1, offset: 0x19C */ - uint8_t RESERVED_1[240]; - __IO uint32_t TEMPSENSE2; /**< Tempsensor Control Register 2, offset: 0x290 */ - __IO uint32_t TEMPSENSE2_SET; /**< Tempsensor Control Register 2, offset: 0x294 */ - __IO uint32_t TEMPSENSE2_CLR; /**< Tempsensor Control Register 2, offset: 0x298 */ - __IO uint32_t TEMPSENSE2_TOG; /**< Tempsensor Control Register 2, offset: 0x29C */ -} TEMPMON_Type; - -/* ---------------------------------------------------------------------------- - -- TEMPMON Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TEMPMON_Register_Masks TEMPMON Register Masks - * @{ - */ - -/*! @name TEMPSENSE0 - Tempsensor Control Register 0 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE0_POWER_DOWN_MASK (0x1U) -#define TEMPMON_TEMPSENSE0_POWER_DOWN_SHIFT (0U) -/*! POWER_DOWN - * 0b0..Enable power to the temperature sensor. - * 0b1..Power down the temperature sensor. - */ -#define TEMPMON_TEMPSENSE0_POWER_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_POWER_DOWN_SHIFT)) & TEMPMON_TEMPSENSE0_POWER_DOWN_MASK) - -#define TEMPMON_TEMPSENSE0_MEASURE_TEMP_MASK (0x2U) -#define TEMPMON_TEMPSENSE0_MEASURE_TEMP_SHIFT (1U) -/*! MEASURE_TEMP - * 0b0..Do not start the measurement process. - * 0b1..Start the measurement process. - */ -#define TEMPMON_TEMPSENSE0_MEASURE_TEMP(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_MEASURE_TEMP_SHIFT)) & TEMPMON_TEMPSENSE0_MEASURE_TEMP_MASK) - -#define TEMPMON_TEMPSENSE0_FINISHED_MASK (0x4U) -#define TEMPMON_TEMPSENSE0_FINISHED_SHIFT (2U) -/*! FINISHED - * 0b0..Last measurement is not ready yet. - * 0b1..Last measurement is valid. - */ -#define TEMPMON_TEMPSENSE0_FINISHED(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_FINISHED_SHIFT)) & TEMPMON_TEMPSENSE0_FINISHED_MASK) - -#define TEMPMON_TEMPSENSE0_TEMP_CNT_MASK (0xFFF00U) -#define TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT (8U) -#define TEMPMON_TEMPSENSE0_TEMP_CNT(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT)) & TEMPMON_TEMPSENSE0_TEMP_CNT_MASK) - -#define TEMPMON_TEMPSENSE0_ALARM_VALUE_MASK (0xFFF00000U) -#define TEMPMON_TEMPSENSE0_ALARM_VALUE_SHIFT (20U) -#define TEMPMON_TEMPSENSE0_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE0_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE0_SET - Tempsensor Control Register 0 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE0_SET_POWER_DOWN_MASK (0x1U) -#define TEMPMON_TEMPSENSE0_SET_POWER_DOWN_SHIFT (0U) -/*! POWER_DOWN - * 0b0..Enable power to the temperature sensor. - * 0b1..Power down the temperature sensor. - */ -#define TEMPMON_TEMPSENSE0_SET_POWER_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_SET_POWER_DOWN_SHIFT)) & TEMPMON_TEMPSENSE0_SET_POWER_DOWN_MASK) - -#define TEMPMON_TEMPSENSE0_SET_MEASURE_TEMP_MASK (0x2U) -#define TEMPMON_TEMPSENSE0_SET_MEASURE_TEMP_SHIFT (1U) -/*! MEASURE_TEMP - * 0b0..Do not start the measurement process. - * 0b1..Start the measurement process. - */ -#define TEMPMON_TEMPSENSE0_SET_MEASURE_TEMP(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_SET_MEASURE_TEMP_SHIFT)) & TEMPMON_TEMPSENSE0_SET_MEASURE_TEMP_MASK) - -#define TEMPMON_TEMPSENSE0_SET_FINISHED_MASK (0x4U) -#define TEMPMON_TEMPSENSE0_SET_FINISHED_SHIFT (2U) -/*! FINISHED - * 0b0..Last measurement is not ready yet. - * 0b1..Last measurement is valid. - */ -#define TEMPMON_TEMPSENSE0_SET_FINISHED(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_SET_FINISHED_SHIFT)) & TEMPMON_TEMPSENSE0_SET_FINISHED_MASK) - -#define TEMPMON_TEMPSENSE0_SET_TEMP_CNT_MASK (0xFFF00U) -#define TEMPMON_TEMPSENSE0_SET_TEMP_CNT_SHIFT (8U) -#define TEMPMON_TEMPSENSE0_SET_TEMP_CNT(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_SET_TEMP_CNT_SHIFT)) & TEMPMON_TEMPSENSE0_SET_TEMP_CNT_MASK) - -#define TEMPMON_TEMPSENSE0_SET_ALARM_VALUE_MASK (0xFFF00000U) -#define TEMPMON_TEMPSENSE0_SET_ALARM_VALUE_SHIFT (20U) -#define TEMPMON_TEMPSENSE0_SET_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_SET_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE0_SET_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE0_CLR - Tempsensor Control Register 0 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE0_CLR_POWER_DOWN_MASK (0x1U) -#define TEMPMON_TEMPSENSE0_CLR_POWER_DOWN_SHIFT (0U) -/*! POWER_DOWN - * 0b0..Enable power to the temperature sensor. - * 0b1..Power down the temperature sensor. - */ -#define TEMPMON_TEMPSENSE0_CLR_POWER_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_CLR_POWER_DOWN_SHIFT)) & TEMPMON_TEMPSENSE0_CLR_POWER_DOWN_MASK) - -#define TEMPMON_TEMPSENSE0_CLR_MEASURE_TEMP_MASK (0x2U) -#define TEMPMON_TEMPSENSE0_CLR_MEASURE_TEMP_SHIFT (1U) -/*! MEASURE_TEMP - * 0b0..Do not start the measurement process. - * 0b1..Start the measurement process. - */ -#define TEMPMON_TEMPSENSE0_CLR_MEASURE_TEMP(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_CLR_MEASURE_TEMP_SHIFT)) & TEMPMON_TEMPSENSE0_CLR_MEASURE_TEMP_MASK) - -#define TEMPMON_TEMPSENSE0_CLR_FINISHED_MASK (0x4U) -#define TEMPMON_TEMPSENSE0_CLR_FINISHED_SHIFT (2U) -/*! FINISHED - * 0b0..Last measurement is not ready yet. - * 0b1..Last measurement is valid. - */ -#define TEMPMON_TEMPSENSE0_CLR_FINISHED(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_CLR_FINISHED_SHIFT)) & TEMPMON_TEMPSENSE0_CLR_FINISHED_MASK) - -#define TEMPMON_TEMPSENSE0_CLR_TEMP_CNT_MASK (0xFFF00U) -#define TEMPMON_TEMPSENSE0_CLR_TEMP_CNT_SHIFT (8U) -#define TEMPMON_TEMPSENSE0_CLR_TEMP_CNT(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_CLR_TEMP_CNT_SHIFT)) & TEMPMON_TEMPSENSE0_CLR_TEMP_CNT_MASK) - -#define TEMPMON_TEMPSENSE0_CLR_ALARM_VALUE_MASK (0xFFF00000U) -#define TEMPMON_TEMPSENSE0_CLR_ALARM_VALUE_SHIFT (20U) -#define TEMPMON_TEMPSENSE0_CLR_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_CLR_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE0_CLR_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE0_TOG - Tempsensor Control Register 0 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE0_TOG_POWER_DOWN_MASK (0x1U) -#define TEMPMON_TEMPSENSE0_TOG_POWER_DOWN_SHIFT (0U) -/*! POWER_DOWN - * 0b0..Enable power to the temperature sensor. - * 0b1..Power down the temperature sensor. - */ -#define TEMPMON_TEMPSENSE0_TOG_POWER_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TOG_POWER_DOWN_SHIFT)) & TEMPMON_TEMPSENSE0_TOG_POWER_DOWN_MASK) - -#define TEMPMON_TEMPSENSE0_TOG_MEASURE_TEMP_MASK (0x2U) -#define TEMPMON_TEMPSENSE0_TOG_MEASURE_TEMP_SHIFT (1U) -/*! MEASURE_TEMP - * 0b0..Do not start the measurement process. - * 0b1..Start the measurement process. - */ -#define TEMPMON_TEMPSENSE0_TOG_MEASURE_TEMP(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TOG_MEASURE_TEMP_SHIFT)) & TEMPMON_TEMPSENSE0_TOG_MEASURE_TEMP_MASK) - -#define TEMPMON_TEMPSENSE0_TOG_FINISHED_MASK (0x4U) -#define TEMPMON_TEMPSENSE0_TOG_FINISHED_SHIFT (2U) -/*! FINISHED - * 0b0..Last measurement is not ready yet. - * 0b1..Last measurement is valid. - */ -#define TEMPMON_TEMPSENSE0_TOG_FINISHED(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TOG_FINISHED_SHIFT)) & TEMPMON_TEMPSENSE0_TOG_FINISHED_MASK) - -#define TEMPMON_TEMPSENSE0_TOG_TEMP_CNT_MASK (0xFFF00U) -#define TEMPMON_TEMPSENSE0_TOG_TEMP_CNT_SHIFT (8U) -#define TEMPMON_TEMPSENSE0_TOG_TEMP_CNT(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TOG_TEMP_CNT_SHIFT)) & TEMPMON_TEMPSENSE0_TOG_TEMP_CNT_MASK) - -#define TEMPMON_TEMPSENSE0_TOG_ALARM_VALUE_MASK (0xFFF00000U) -#define TEMPMON_TEMPSENSE0_TOG_ALARM_VALUE_SHIFT (20U) -#define TEMPMON_TEMPSENSE0_TOG_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE0_TOG_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE0_TOG_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE1 - Tempsensor Control Register 1 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE1_MEASURE_FREQ_MASK (0xFFFFU) -#define TEMPMON_TEMPSENSE1_MEASURE_FREQ_SHIFT (0U) -#define TEMPMON_TEMPSENSE1_MEASURE_FREQ(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE1_MEASURE_FREQ_SHIFT)) & TEMPMON_TEMPSENSE1_MEASURE_FREQ_MASK) -/*! @} */ - -/*! @name TEMPSENSE1_SET - Tempsensor Control Register 1 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE1_SET_MEASURE_FREQ_MASK (0xFFFFU) -#define TEMPMON_TEMPSENSE1_SET_MEASURE_FREQ_SHIFT (0U) -#define TEMPMON_TEMPSENSE1_SET_MEASURE_FREQ(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE1_SET_MEASURE_FREQ_SHIFT)) & TEMPMON_TEMPSENSE1_SET_MEASURE_FREQ_MASK) -/*! @} */ - -/*! @name TEMPSENSE1_CLR - Tempsensor Control Register 1 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE1_CLR_MEASURE_FREQ_MASK (0xFFFFU) -#define TEMPMON_TEMPSENSE1_CLR_MEASURE_FREQ_SHIFT (0U) -#define TEMPMON_TEMPSENSE1_CLR_MEASURE_FREQ(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE1_CLR_MEASURE_FREQ_SHIFT)) & TEMPMON_TEMPSENSE1_CLR_MEASURE_FREQ_MASK) -/*! @} */ - -/*! @name TEMPSENSE1_TOG - Tempsensor Control Register 1 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE1_TOG_MEASURE_FREQ_MASK (0xFFFFU) -#define TEMPMON_TEMPSENSE1_TOG_MEASURE_FREQ_SHIFT (0U) -#define TEMPMON_TEMPSENSE1_TOG_MEASURE_FREQ(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE1_TOG_MEASURE_FREQ_SHIFT)) & TEMPMON_TEMPSENSE1_TOG_MEASURE_FREQ_MASK) -/*! @} */ - -/*! @name TEMPSENSE2 - Tempsensor Control Register 2 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE_MASK (0xFFFU) -#define TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE_SHIFT (0U) -#define TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE_MASK) - -#define TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE_MASK (0xFFF0000U) -#define TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE_SHIFT (16U) -#define TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE2_SET - Tempsensor Control Register 2 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE2_SET_LOW_ALARM_VALUE_MASK (0xFFFU) -#define TEMPMON_TEMPSENSE2_SET_LOW_ALARM_VALUE_SHIFT (0U) -#define TEMPMON_TEMPSENSE2_SET_LOW_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_SET_LOW_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_SET_LOW_ALARM_VALUE_MASK) - -#define TEMPMON_TEMPSENSE2_SET_PANIC_ALARM_VALUE_MASK (0xFFF0000U) -#define TEMPMON_TEMPSENSE2_SET_PANIC_ALARM_VALUE_SHIFT (16U) -#define TEMPMON_TEMPSENSE2_SET_PANIC_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_SET_PANIC_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_SET_PANIC_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE2_CLR - Tempsensor Control Register 2 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE2_CLR_LOW_ALARM_VALUE_MASK (0xFFFU) -#define TEMPMON_TEMPSENSE2_CLR_LOW_ALARM_VALUE_SHIFT (0U) -#define TEMPMON_TEMPSENSE2_CLR_LOW_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_CLR_LOW_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_CLR_LOW_ALARM_VALUE_MASK) - -#define TEMPMON_TEMPSENSE2_CLR_PANIC_ALARM_VALUE_MASK (0xFFF0000U) -#define TEMPMON_TEMPSENSE2_CLR_PANIC_ALARM_VALUE_SHIFT (16U) -#define TEMPMON_TEMPSENSE2_CLR_PANIC_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_CLR_PANIC_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_CLR_PANIC_ALARM_VALUE_MASK) -/*! @} */ - -/*! @name TEMPSENSE2_TOG - Tempsensor Control Register 2 */ -/*! @{ */ - -#define TEMPMON_TEMPSENSE2_TOG_LOW_ALARM_VALUE_MASK (0xFFFU) -#define TEMPMON_TEMPSENSE2_TOG_LOW_ALARM_VALUE_SHIFT (0U) -#define TEMPMON_TEMPSENSE2_TOG_LOW_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_TOG_LOW_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_TOG_LOW_ALARM_VALUE_MASK) - -#define TEMPMON_TEMPSENSE2_TOG_PANIC_ALARM_VALUE_MASK (0xFFF0000U) -#define TEMPMON_TEMPSENSE2_TOG_PANIC_ALARM_VALUE_SHIFT (16U) -#define TEMPMON_TEMPSENSE2_TOG_PANIC_ALARM_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TEMPMON_TEMPSENSE2_TOG_PANIC_ALARM_VALUE_SHIFT)) & TEMPMON_TEMPSENSE2_TOG_PANIC_ALARM_VALUE_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group TEMPMON_Register_Masks */ - - -/* TEMPMON - Peripheral instance base addresses */ -/** Peripheral TEMPMON base address */ -#define TEMPMON_BASE (0x400D8000u) -/** Peripheral TEMPMON base pointer */ -#define TEMPMON ((TEMPMON_Type *)TEMPMON_BASE) -/** Array initializer of TEMPMON peripheral base addresses */ -#define TEMPMON_BASE_ADDRS { TEMPMON_BASE } -/** Array initializer of TEMPMON peripheral base pointers */ -#define TEMPMON_BASE_PTRS { TEMPMON } - -/*! - * @} - */ /* end of group TEMPMON_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- TMR Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TMR_Peripheral_Access_Layer TMR Peripheral Access Layer - * @{ - */ - -/** TMR - Register Layout Typedef */ -typedef struct { - struct { /* offset: 0x0, array step: 0x20 */ - __IO uint16_t COMP1; /**< Timer Channel Compare Register 1, array offset: 0x0, array step: 0x20 */ - __IO uint16_t COMP2; /**< Timer Channel Compare Register 2, array offset: 0x2, array step: 0x20 */ - __IO uint16_t CAPT; /**< Timer Channel Capture Register, array offset: 0x4, array step: 0x20 */ - __IO uint16_t LOAD; /**< Timer Channel Load Register, array offset: 0x6, array step: 0x20 */ - __IO uint16_t HOLD; /**< Timer Channel Hold Register, array offset: 0x8, array step: 0x20 */ - __IO uint16_t CNTR; /**< Timer Channel Counter Register, array offset: 0xA, array step: 0x20 */ - __IO uint16_t CTRL; /**< Timer Channel Control Register, array offset: 0xC, array step: 0x20 */ - __IO uint16_t SCTRL; /**< Timer Channel Status and Control Register, array offset: 0xE, array step: 0x20 */ - __IO uint16_t CMPLD1; /**< Timer Channel Comparator Load Register 1, array offset: 0x10, array step: 0x20 */ - __IO uint16_t CMPLD2; /**< Timer Channel Comparator Load Register 2, array offset: 0x12, array step: 0x20 */ - __IO uint16_t CSCTRL; /**< Timer Channel Comparator Status and Control Register, array offset: 0x14, array step: 0x20 */ - __IO uint16_t FILT; /**< Timer Channel Input Filter Register, array offset: 0x16, array step: 0x20 */ - __IO uint16_t DMA; /**< Timer Channel DMA Enable Register, array offset: 0x18, array step: 0x20 */ - uint8_t RESERVED_0[4]; - __IO uint16_t ENBL; /**< Timer Channel Enable Register, array offset: 0x1E, array step: 0x20, this item is not available for all array instances */ - } CHANNEL[4]; -} TMR_Type; - -/* ---------------------------------------------------------------------------- - -- TMR Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TMR_Register_Masks TMR Register Masks - * @{ - */ - -/*! @name COMP1 - Timer Channel Compare Register 1 */ -/*! @{ */ - -#define TMR_COMP1_COMPARISON_1_MASK (0xFFFFU) -#define TMR_COMP1_COMPARISON_1_SHIFT (0U) -/*! COMPARISON_1 - Comparison Value 1 - */ -#define TMR_COMP1_COMPARISON_1(x) (((uint16_t)(((uint16_t)(x)) << TMR_COMP1_COMPARISON_1_SHIFT)) & TMR_COMP1_COMPARISON_1_MASK) -/*! @} */ - -/* The count of TMR_COMP1 */ -#define TMR_COMP1_COUNT (4U) - -/*! @name COMP2 - Timer Channel Compare Register 2 */ -/*! @{ */ - -#define TMR_COMP2_COMPARISON_2_MASK (0xFFFFU) -#define TMR_COMP2_COMPARISON_2_SHIFT (0U) -/*! COMPARISON_2 - Comparison Value 2 - */ -#define TMR_COMP2_COMPARISON_2(x) (((uint16_t)(((uint16_t)(x)) << TMR_COMP2_COMPARISON_2_SHIFT)) & TMR_COMP2_COMPARISON_2_MASK) -/*! @} */ - -/* The count of TMR_COMP2 */ -#define TMR_COMP2_COUNT (4U) - -/*! @name CAPT - Timer Channel Capture Register */ -/*! @{ */ - -#define TMR_CAPT_CAPTURE_MASK (0xFFFFU) -#define TMR_CAPT_CAPTURE_SHIFT (0U) -/*! CAPTURE - Capture Value - */ -#define TMR_CAPT_CAPTURE(x) (((uint16_t)(((uint16_t)(x)) << TMR_CAPT_CAPTURE_SHIFT)) & TMR_CAPT_CAPTURE_MASK) -/*! @} */ - -/* The count of TMR_CAPT */ -#define TMR_CAPT_COUNT (4U) - -/*! @name LOAD - Timer Channel Load Register */ -/*! @{ */ - -#define TMR_LOAD_LOAD_MASK (0xFFFFU) -#define TMR_LOAD_LOAD_SHIFT (0U) -/*! LOAD - Timer Load Register - */ -#define TMR_LOAD_LOAD(x) (((uint16_t)(((uint16_t)(x)) << TMR_LOAD_LOAD_SHIFT)) & TMR_LOAD_LOAD_MASK) -/*! @} */ - -/* The count of TMR_LOAD */ -#define TMR_LOAD_COUNT (4U) - -/*! @name HOLD - Timer Channel Hold Register */ -/*! @{ */ - -#define TMR_HOLD_HOLD_MASK (0xFFFFU) -#define TMR_HOLD_HOLD_SHIFT (0U) -#define TMR_HOLD_HOLD(x) (((uint16_t)(((uint16_t)(x)) << TMR_HOLD_HOLD_SHIFT)) & TMR_HOLD_HOLD_MASK) -/*! @} */ - -/* The count of TMR_HOLD */ -#define TMR_HOLD_COUNT (4U) - -/*! @name CNTR - Timer Channel Counter Register */ -/*! @{ */ - -#define TMR_CNTR_COUNTER_MASK (0xFFFFU) -#define TMR_CNTR_COUNTER_SHIFT (0U) -#define TMR_CNTR_COUNTER(x) (((uint16_t)(((uint16_t)(x)) << TMR_CNTR_COUNTER_SHIFT)) & TMR_CNTR_COUNTER_MASK) -/*! @} */ - -/* The count of TMR_CNTR */ -#define TMR_CNTR_COUNT (4U) - -/*! @name CTRL - Timer Channel Control Register */ -/*! @{ */ - -#define TMR_CTRL_OUTMODE_MASK (0x7U) -#define TMR_CTRL_OUTMODE_SHIFT (0U) -/*! OUTMODE - Output Mode - * 0b000..Asserted while counter is active - * 0b001..Clear OFLAG output on successful compare - * 0b010..Set OFLAG output on successful compare - * 0b011..Toggle OFLAG output on successful compare - * 0b100..Toggle OFLAG output using alternating compare registers - * 0b101..Set on compare, cleared on secondary source input edge - * 0b110..Set on compare, cleared on counter rollover - * 0b111..Enable gated clock output while counter is active - */ -#define TMR_CTRL_OUTMODE(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_OUTMODE_SHIFT)) & TMR_CTRL_OUTMODE_MASK) - -#define TMR_CTRL_COINIT_MASK (0x8U) -#define TMR_CTRL_COINIT_SHIFT (3U) -/*! COINIT - Co-Channel Initialization - * 0b0..Co-channel counter/timers cannot force a re-initialization of this counter/timer - * 0b1..Co-channel counter/timers may force a re-initialization of this counter/timer - */ -#define TMR_CTRL_COINIT(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_COINIT_SHIFT)) & TMR_CTRL_COINIT_MASK) - -#define TMR_CTRL_DIR_MASK (0x10U) -#define TMR_CTRL_DIR_SHIFT (4U) -/*! DIR - Count Direction - * 0b0..Count up. - * 0b1..Count down. - */ -#define TMR_CTRL_DIR(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_DIR_SHIFT)) & TMR_CTRL_DIR_MASK) - -#define TMR_CTRL_LENGTH_MASK (0x20U) -#define TMR_CTRL_LENGTH_SHIFT (5U) -/*! LENGTH - Count Length - * 0b0..Count until roll over at $FFFF and continue from $0000. - * 0b1..Count until compare, then re-initialize. If counting up, a successful compare occurs when the counter - * reaches a COMP1 value. If counting down, a successful compare occurs when the counter reaches a COMP2 value. - * When output mode $4 is used, alternating values of COMP1 and COMP2 are used to generate successful - * comparisons. For example, the counter counts until a COMP1 value is reached, re-initializes, counts until COMP2 - * value is reached, re-initializes, counts until COMP1 value is reached, and so on. - */ -#define TMR_CTRL_LENGTH(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_LENGTH_SHIFT)) & TMR_CTRL_LENGTH_MASK) - -#define TMR_CTRL_ONCE_MASK (0x40U) -#define TMR_CTRL_ONCE_SHIFT (6U) -/*! ONCE - Count Once - * 0b0..Count repeatedly. - * 0b1..Count until compare and then stop. If counting up, a successful compare occurs when the counter reaches a - * COMP1 value. If counting down, a successful compare occurs when the counter reaches a COMP2 value. When - * output mode $4 is used, the counter re-initializes after reaching the COMP1 value, continues to count to - * the COMP2 value, and then stops. - */ -#define TMR_CTRL_ONCE(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_ONCE_SHIFT)) & TMR_CTRL_ONCE_MASK) - -#define TMR_CTRL_SCS_MASK (0x180U) -#define TMR_CTRL_SCS_SHIFT (7U) -/*! SCS - Secondary Count Source - * 0b00..Counter 0 input pin - * 0b01..Counter 1 input pin - * 0b10..Counter 2 input pin - * 0b11..Counter 3 input pin - */ -#define TMR_CTRL_SCS(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_SCS_SHIFT)) & TMR_CTRL_SCS_MASK) - -#define TMR_CTRL_PCS_MASK (0x1E00U) -#define TMR_CTRL_PCS_SHIFT (9U) -/*! PCS - Primary Count Source - * 0b0000..Counter 0 input pin - * 0b0001..Counter 1 input pin - * 0b0010..Counter 2 input pin - * 0b0011..Counter 3 input pin - * 0b0100..Counter 0 output - * 0b0101..Counter 1 output - * 0b0110..Counter 2 output - * 0b0111..Counter 3 output - * 0b1000..IP bus clock divide by 1 prescaler - * 0b1001..IP bus clock divide by 2 prescaler - * 0b1010..IP bus clock divide by 4 prescaler - * 0b1011..IP bus clock divide by 8 prescaler - * 0b1100..IP bus clock divide by 16 prescaler - * 0b1101..IP bus clock divide by 32 prescaler - * 0b1110..IP bus clock divide by 64 prescaler - * 0b1111..IP bus clock divide by 128 prescaler - */ -#define TMR_CTRL_PCS(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_PCS_SHIFT)) & TMR_CTRL_PCS_MASK) - -#define TMR_CTRL_CM_MASK (0xE000U) -#define TMR_CTRL_CM_SHIFT (13U) -/*! CM - Count Mode - * 0b000..No operation - * 0b001..Count rising edges of primary sourceRising edges are counted only when SCTRL[IPS] = 0. Falling edges - * are counted when SCTRL[IPS] = 1. If the primary count source is IP bus clock divide by 1, only rising - * edges are counted regardless of the value of SCTRL[IPS]. - * 0b010..Count rising and falling edges of primary sourceIP bus clock divide by 1 cannot be used as a primary count source in edge count mode. - * 0b011..Count rising edges of primary source while secondary input high active - * 0b100..Quadrature count mode, uses primary and secondary sources - * 0b101..Count rising edges of primary source; secondary source specifies directionRising edges are counted only - * when SCTRL[IPS] = 0. Falling edges are counted when SCTRL[IPS] = 1. - * 0b110..Edge of secondary source triggers primary count until compare - * 0b111..Cascaded counter mode (up/down)The primary count source must be set to one of the counter outputs. - */ -#define TMR_CTRL_CM(x) (((uint16_t)(((uint16_t)(x)) << TMR_CTRL_CM_SHIFT)) & TMR_CTRL_CM_MASK) -/*! @} */ - -/* The count of TMR_CTRL */ -#define TMR_CTRL_COUNT (4U) - -/*! @name SCTRL - Timer Channel Status and Control Register */ -/*! @{ */ - -#define TMR_SCTRL_OEN_MASK (0x1U) -#define TMR_SCTRL_OEN_SHIFT (0U) -/*! OEN - Output Enable - * 0b0..The external pin is configured as an input. - * 0b1..The OFLAG output signal is driven on the external pin. Other timer groups using this external pin as - * their input see the driven value. The polarity of the signal is determined by OPS. - */ -#define TMR_SCTRL_OEN(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_OEN_SHIFT)) & TMR_SCTRL_OEN_MASK) - -#define TMR_SCTRL_OPS_MASK (0x2U) -#define TMR_SCTRL_OPS_SHIFT (1U) -/*! OPS - Output Polarity Select - * 0b0..True polarity. - * 0b1..Inverted polarity. - */ -#define TMR_SCTRL_OPS(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_OPS_SHIFT)) & TMR_SCTRL_OPS_MASK) - -#define TMR_SCTRL_FORCE_MASK (0x4U) -#define TMR_SCTRL_FORCE_SHIFT (2U) -/*! FORCE - Force OFLAG Output - */ -#define TMR_SCTRL_FORCE(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_FORCE_SHIFT)) & TMR_SCTRL_FORCE_MASK) - -#define TMR_SCTRL_VAL_MASK (0x8U) -#define TMR_SCTRL_VAL_SHIFT (3U) -/*! VAL - Forced OFLAG Value - */ -#define TMR_SCTRL_VAL(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_VAL_SHIFT)) & TMR_SCTRL_VAL_MASK) - -#define TMR_SCTRL_EEOF_MASK (0x10U) -#define TMR_SCTRL_EEOF_SHIFT (4U) -/*! EEOF - Enable External OFLAG Force - */ -#define TMR_SCTRL_EEOF(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_EEOF_SHIFT)) & TMR_SCTRL_EEOF_MASK) - -#define TMR_SCTRL_MSTR_MASK (0x20U) -#define TMR_SCTRL_MSTR_SHIFT (5U) -/*! MSTR - Master Mode - */ -#define TMR_SCTRL_MSTR(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_MSTR_SHIFT)) & TMR_SCTRL_MSTR_MASK) - -#define TMR_SCTRL_CAPTURE_MODE_MASK (0xC0U) -#define TMR_SCTRL_CAPTURE_MODE_SHIFT (6U) -/*! CAPTURE_MODE - Input Capture Mode - * 0b00..Capture function is disabled - * 0b01..Load capture register on rising edge (when IPS=0) or falling edge (when IPS=1) of input - * 0b10..Load capture register on falling edge (when IPS=0) or rising edge (when IPS=1) of input - * 0b11..Load capture register on both edges of input - */ -#define TMR_SCTRL_CAPTURE_MODE(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_CAPTURE_MODE_SHIFT)) & TMR_SCTRL_CAPTURE_MODE_MASK) - -#define TMR_SCTRL_INPUT_MASK (0x100U) -#define TMR_SCTRL_INPUT_SHIFT (8U) -/*! INPUT - External Input Signal - */ -#define TMR_SCTRL_INPUT(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_INPUT_SHIFT)) & TMR_SCTRL_INPUT_MASK) - -#define TMR_SCTRL_IPS_MASK (0x200U) -#define TMR_SCTRL_IPS_SHIFT (9U) -/*! IPS - Input Polarity Select - */ -#define TMR_SCTRL_IPS(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_IPS_SHIFT)) & TMR_SCTRL_IPS_MASK) - -#define TMR_SCTRL_IEFIE_MASK (0x400U) -#define TMR_SCTRL_IEFIE_SHIFT (10U) -/*! IEFIE - Input Edge Flag Interrupt Enable - */ -#define TMR_SCTRL_IEFIE(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_IEFIE_SHIFT)) & TMR_SCTRL_IEFIE_MASK) - -#define TMR_SCTRL_IEF_MASK (0x800U) -#define TMR_SCTRL_IEF_SHIFT (11U) -/*! IEF - Input Edge Flag - */ -#define TMR_SCTRL_IEF(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_IEF_SHIFT)) & TMR_SCTRL_IEF_MASK) - -#define TMR_SCTRL_TOFIE_MASK (0x1000U) -#define TMR_SCTRL_TOFIE_SHIFT (12U) -/*! TOFIE - Timer Overflow Flag Interrupt Enable - */ -#define TMR_SCTRL_TOFIE(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_TOFIE_SHIFT)) & TMR_SCTRL_TOFIE_MASK) - -#define TMR_SCTRL_TOF_MASK (0x2000U) -#define TMR_SCTRL_TOF_SHIFT (13U) -/*! TOF - Timer Overflow Flag - */ -#define TMR_SCTRL_TOF(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_TOF_SHIFT)) & TMR_SCTRL_TOF_MASK) - -#define TMR_SCTRL_TCFIE_MASK (0x4000U) -#define TMR_SCTRL_TCFIE_SHIFT (14U) -/*! TCFIE - Timer Compare Flag Interrupt Enable - */ -#define TMR_SCTRL_TCFIE(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_TCFIE_SHIFT)) & TMR_SCTRL_TCFIE_MASK) - -#define TMR_SCTRL_TCF_MASK (0x8000U) -#define TMR_SCTRL_TCF_SHIFT (15U) -/*! TCF - Timer Compare Flag - */ -#define TMR_SCTRL_TCF(x) (((uint16_t)(((uint16_t)(x)) << TMR_SCTRL_TCF_SHIFT)) & TMR_SCTRL_TCF_MASK) -/*! @} */ - -/* The count of TMR_SCTRL */ -#define TMR_SCTRL_COUNT (4U) - -/*! @name CMPLD1 - Timer Channel Comparator Load Register 1 */ -/*! @{ */ - -#define TMR_CMPLD1_COMPARATOR_LOAD_1_MASK (0xFFFFU) -#define TMR_CMPLD1_COMPARATOR_LOAD_1_SHIFT (0U) -#define TMR_CMPLD1_COMPARATOR_LOAD_1(x) (((uint16_t)(((uint16_t)(x)) << TMR_CMPLD1_COMPARATOR_LOAD_1_SHIFT)) & TMR_CMPLD1_COMPARATOR_LOAD_1_MASK) -/*! @} */ - -/* The count of TMR_CMPLD1 */ -#define TMR_CMPLD1_COUNT (4U) - -/*! @name CMPLD2 - Timer Channel Comparator Load Register 2 */ -/*! @{ */ - -#define TMR_CMPLD2_COMPARATOR_LOAD_2_MASK (0xFFFFU) -#define TMR_CMPLD2_COMPARATOR_LOAD_2_SHIFT (0U) -#define TMR_CMPLD2_COMPARATOR_LOAD_2(x) (((uint16_t)(((uint16_t)(x)) << TMR_CMPLD2_COMPARATOR_LOAD_2_SHIFT)) & TMR_CMPLD2_COMPARATOR_LOAD_2_MASK) -/*! @} */ - -/* The count of TMR_CMPLD2 */ -#define TMR_CMPLD2_COUNT (4U) - -/*! @name CSCTRL - Timer Channel Comparator Status and Control Register */ -/*! @{ */ - -#define TMR_CSCTRL_CL1_MASK (0x3U) -#define TMR_CSCTRL_CL1_SHIFT (0U) -/*! CL1 - Compare Load Control 1 - * 0b00..Never preload - * 0b01..Load upon successful compare with the value in COMP1 - * 0b10..Load upon successful compare with the value in COMP2 - * 0b11..Reserved - */ -#define TMR_CSCTRL_CL1(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_CL1_SHIFT)) & TMR_CSCTRL_CL1_MASK) - -#define TMR_CSCTRL_CL2_MASK (0xCU) -#define TMR_CSCTRL_CL2_SHIFT (2U) -/*! CL2 - Compare Load Control 2 - * 0b00..Never preload - * 0b01..Load upon successful compare with the value in COMP1 - * 0b10..Load upon successful compare with the value in COMP2 - * 0b11..Reserved - */ -#define TMR_CSCTRL_CL2(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_CL2_SHIFT)) & TMR_CSCTRL_CL2_MASK) - -#define TMR_CSCTRL_TCF1_MASK (0x10U) -#define TMR_CSCTRL_TCF1_SHIFT (4U) -/*! TCF1 - Timer Compare 1 Interrupt Flag - */ -#define TMR_CSCTRL_TCF1(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_TCF1_SHIFT)) & TMR_CSCTRL_TCF1_MASK) - -#define TMR_CSCTRL_TCF2_MASK (0x20U) -#define TMR_CSCTRL_TCF2_SHIFT (5U) -/*! TCF2 - Timer Compare 2 Interrupt Flag - */ -#define TMR_CSCTRL_TCF2(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_TCF2_SHIFT)) & TMR_CSCTRL_TCF2_MASK) - -#define TMR_CSCTRL_TCF1EN_MASK (0x40U) -#define TMR_CSCTRL_TCF1EN_SHIFT (6U) -/*! TCF1EN - Timer Compare 1 Interrupt Enable - */ -#define TMR_CSCTRL_TCF1EN(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_TCF1EN_SHIFT)) & TMR_CSCTRL_TCF1EN_MASK) - -#define TMR_CSCTRL_TCF2EN_MASK (0x80U) -#define TMR_CSCTRL_TCF2EN_SHIFT (7U) -/*! TCF2EN - Timer Compare 2 Interrupt Enable - */ -#define TMR_CSCTRL_TCF2EN(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_TCF2EN_SHIFT)) & TMR_CSCTRL_TCF2EN_MASK) - -#define TMR_CSCTRL_UP_MASK (0x200U) -#define TMR_CSCTRL_UP_SHIFT (9U) -/*! UP - Counting Direction Indicator - * 0b0..The last count was in the DOWN direction. - * 0b1..The last count was in the UP direction. - */ -#define TMR_CSCTRL_UP(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_UP_SHIFT)) & TMR_CSCTRL_UP_MASK) - -#define TMR_CSCTRL_TCI_MASK (0x400U) -#define TMR_CSCTRL_TCI_SHIFT (10U) -/*! TCI - Triggered Count Initialization Control - * 0b0..Stop counter upon receiving a second trigger event while still counting from the first trigger event. - * 0b1..Reload the counter upon receiving a second trigger event while still counting from the first trigger event. - */ -#define TMR_CSCTRL_TCI(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_TCI_SHIFT)) & TMR_CSCTRL_TCI_MASK) - -#define TMR_CSCTRL_ROC_MASK (0x800U) -#define TMR_CSCTRL_ROC_SHIFT (11U) -/*! ROC - Reload on Capture - * 0b0..Do not reload the counter on a capture event. - * 0b1..Reload the counter on a capture event. - */ -#define TMR_CSCTRL_ROC(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_ROC_SHIFT)) & TMR_CSCTRL_ROC_MASK) - -#define TMR_CSCTRL_ALT_LOAD_MASK (0x1000U) -#define TMR_CSCTRL_ALT_LOAD_SHIFT (12U) -/*! ALT_LOAD - Alternative Load Enable - * 0b0..Counter can be re-initialized only with the LOAD register. - * 0b1..Counter can be re-initialized with the LOAD or CMPLD2 registers depending on count direction. - */ -#define TMR_CSCTRL_ALT_LOAD(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_ALT_LOAD_SHIFT)) & TMR_CSCTRL_ALT_LOAD_MASK) - -#define TMR_CSCTRL_FAULT_MASK (0x2000U) -#define TMR_CSCTRL_FAULT_SHIFT (13U) -/*! FAULT - Fault Enable - * 0b0..Fault function disabled. - * 0b1..Fault function enabled. - */ -#define TMR_CSCTRL_FAULT(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_FAULT_SHIFT)) & TMR_CSCTRL_FAULT_MASK) - -#define TMR_CSCTRL_DBG_EN_MASK (0xC000U) -#define TMR_CSCTRL_DBG_EN_SHIFT (14U) -/*! DBG_EN - Debug Actions Enable - * 0b00..Continue with normal operation during debug mode. (default) - * 0b01..Halt TMR counter during debug mode. - * 0b10..Force TMR output to logic 0 (prior to consideration of SCTRL[OPS]). - * 0b11..Both halt counter and force output to 0 during debug mode. - */ -#define TMR_CSCTRL_DBG_EN(x) (((uint16_t)(((uint16_t)(x)) << TMR_CSCTRL_DBG_EN_SHIFT)) & TMR_CSCTRL_DBG_EN_MASK) -/*! @} */ - -/* The count of TMR_CSCTRL */ -#define TMR_CSCTRL_COUNT (4U) - -/*! @name FILT - Timer Channel Input Filter Register */ -/*! @{ */ - -#define TMR_FILT_FILT_PER_MASK (0xFFU) -#define TMR_FILT_FILT_PER_SHIFT (0U) -/*! FILT_PER - Input Filter Sample Period - */ -#define TMR_FILT_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << TMR_FILT_FILT_PER_SHIFT)) & TMR_FILT_FILT_PER_MASK) - -#define TMR_FILT_FILT_CNT_MASK (0x700U) -#define TMR_FILT_FILT_CNT_SHIFT (8U) -/*! FILT_CNT - Input Filter Sample Count - */ -#define TMR_FILT_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << TMR_FILT_FILT_CNT_SHIFT)) & TMR_FILT_FILT_CNT_MASK) -/*! @} */ - -/* The count of TMR_FILT */ -#define TMR_FILT_COUNT (4U) - -/*! @name DMA - Timer Channel DMA Enable Register */ -/*! @{ */ - -#define TMR_DMA_IEFDE_MASK (0x1U) -#define TMR_DMA_IEFDE_SHIFT (0U) -/*! IEFDE - Input Edge Flag DMA Enable - */ -#define TMR_DMA_IEFDE(x) (((uint16_t)(((uint16_t)(x)) << TMR_DMA_IEFDE_SHIFT)) & TMR_DMA_IEFDE_MASK) - -#define TMR_DMA_CMPLD1DE_MASK (0x2U) -#define TMR_DMA_CMPLD1DE_SHIFT (1U) -/*! CMPLD1DE - Comparator Preload Register 1 DMA Enable - */ -#define TMR_DMA_CMPLD1DE(x) (((uint16_t)(((uint16_t)(x)) << TMR_DMA_CMPLD1DE_SHIFT)) & TMR_DMA_CMPLD1DE_MASK) - -#define TMR_DMA_CMPLD2DE_MASK (0x4U) -#define TMR_DMA_CMPLD2DE_SHIFT (2U) -/*! CMPLD2DE - Comparator Preload Register 2 DMA Enable - */ -#define TMR_DMA_CMPLD2DE(x) (((uint16_t)(((uint16_t)(x)) << TMR_DMA_CMPLD2DE_SHIFT)) & TMR_DMA_CMPLD2DE_MASK) -/*! @} */ - -/* The count of TMR_DMA */ -#define TMR_DMA_COUNT (4U) - -/*! @name ENBL - Timer Channel Enable Register */ -/*! @{ */ - -#define TMR_ENBL_ENBL_MASK (0xFU) -#define TMR_ENBL_ENBL_SHIFT (0U) -/*! ENBL - Timer Channel Enable - * 0b0000..Timer channel is disabled. - * 0b0001..Timer channel is enabled. (default) - */ -#define TMR_ENBL_ENBL(x) (((uint16_t)(((uint16_t)(x)) << TMR_ENBL_ENBL_SHIFT)) & TMR_ENBL_ENBL_MASK) -/*! @} */ - -/* The count of TMR_ENBL */ -#define TMR_ENBL_COUNT (4U) - - -/*! - * @} - */ /* end of group TMR_Register_Masks */ - - -/* TMR - Peripheral instance base addresses */ -/** Peripheral TMR1 base address */ -#define TMR1_BASE (0x401DC000u) -/** Peripheral TMR1 base pointer */ -#define TMR1 ((TMR_Type *)TMR1_BASE) -/** Peripheral TMR2 base address */ -#define TMR2_BASE (0x401E0000u) -/** Peripheral TMR2 base pointer */ -#define TMR2 ((TMR_Type *)TMR2_BASE) -/** Peripheral TMR3 base address */ -#define TMR3_BASE (0x401E4000u) -/** Peripheral TMR3 base pointer */ -#define TMR3 ((TMR_Type *)TMR3_BASE) -/** Peripheral TMR4 base address */ -#define TMR4_BASE (0x401E8000u) -/** Peripheral TMR4 base pointer */ -#define TMR4 ((TMR_Type *)TMR4_BASE) -/** Array initializer of TMR peripheral base addresses */ -#define TMR_BASE_ADDRS { 0u, TMR1_BASE, TMR2_BASE, TMR3_BASE, TMR4_BASE } -/** Array initializer of TMR peripheral base pointers */ -#define TMR_BASE_PTRS { (TMR_Type *)0u, TMR1, TMR2, TMR3, TMR4 } -/** Interrupt vectors for the TMR peripheral type */ -#define TMR_IRQS { NotAvail_IRQn, TMR1_IRQn, TMR2_IRQn, TMR3_IRQn, TMR4_IRQn } - -/*! - * @} - */ /* end of group TMR_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- TRNG Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TRNG_Peripheral_Access_Layer TRNG Peripheral Access Layer - * @{ - */ - -/** TRNG - Register Layout Typedef */ -typedef struct { - __IO uint32_t MCTL; /**< Miscellaneous Control Register, offset: 0x0 */ - __IO uint32_t SCMISC; /**< Statistical Check Miscellaneous Register, offset: 0x4 */ - __IO uint32_t PKRRNG; /**< Poker Range Register, offset: 0x8 */ - union { /* offset: 0xC */ - __IO uint32_t PKRMAX; /**< Poker Maximum Limit Register, offset: 0xC */ - __I uint32_t PKRSQ; /**< Poker Square Calculation Result Register, offset: 0xC */ - }; - __IO uint32_t SDCTL; /**< Seed Control Register, offset: 0x10 */ - union { /* offset: 0x14 */ - __IO uint32_t SBLIM; /**< Sparse Bit Limit Register, offset: 0x14 */ - __I uint32_t TOTSAM; /**< Total Samples Register, offset: 0x14 */ - }; - __IO uint32_t FRQMIN; /**< Frequency Count Minimum Limit Register, offset: 0x18 */ - union { /* offset: 0x1C */ - __I uint32_t FRQCNT; /**< Frequency Count Register, offset: 0x1C */ - __IO uint32_t FRQMAX; /**< Frequency Count Maximum Limit Register, offset: 0x1C */ - }; - union { /* offset: 0x20 */ - __I uint32_t SCMC; /**< Statistical Check Monobit Count Register, offset: 0x20 */ - __IO uint32_t SCML; /**< Statistical Check Monobit Limit Register, offset: 0x20 */ - }; - union { /* offset: 0x24 */ - __I uint32_t SCR1C; /**< Statistical Check Run Length 1 Count Register, offset: 0x24 */ - __IO uint32_t SCR1L; /**< Statistical Check Run Length 1 Limit Register, offset: 0x24 */ - }; - union { /* offset: 0x28 */ - __I uint32_t SCR2C; /**< Statistical Check Run Length 2 Count Register, offset: 0x28 */ - __IO uint32_t SCR2L; /**< Statistical Check Run Length 2 Limit Register, offset: 0x28 */ - }; - union { /* offset: 0x2C */ - __I uint32_t SCR3C; /**< Statistical Check Run Length 3 Count Register, offset: 0x2C */ - __IO uint32_t SCR3L; /**< Statistical Check Run Length 3 Limit Register, offset: 0x2C */ - }; - union { /* offset: 0x30 */ - __I uint32_t SCR4C; /**< Statistical Check Run Length 4 Count Register, offset: 0x30 */ - __IO uint32_t SCR4L; /**< Statistical Check Run Length 4 Limit Register, offset: 0x30 */ - }; - union { /* offset: 0x34 */ - __I uint32_t SCR5C; /**< Statistical Check Run Length 5 Count Register, offset: 0x34 */ - __IO uint32_t SCR5L; /**< Statistical Check Run Length 5 Limit Register, offset: 0x34 */ - }; - union { /* offset: 0x38 */ - __I uint32_t SCR6PC; /**< Statistical Check Run Length 6+ Count Register, offset: 0x38 */ - __IO uint32_t SCR6PL; /**< Statistical Check Run Length 6+ Limit Register, offset: 0x38 */ - }; - __I uint32_t STATUS; /**< Status Register, offset: 0x3C */ - __I uint32_t ENT[16]; /**< Entropy Read Register, array offset: 0x40, array step: 0x4 */ - __I uint32_t PKRCNT10; /**< Statistical Check Poker Count 1 and 0 Register, offset: 0x80 */ - __I uint32_t PKRCNT32; /**< Statistical Check Poker Count 3 and 2 Register, offset: 0x84 */ - __I uint32_t PKRCNT54; /**< Statistical Check Poker Count 5 and 4 Register, offset: 0x88 */ - __I uint32_t PKRCNT76; /**< Statistical Check Poker Count 7 and 6 Register, offset: 0x8C */ - __I uint32_t PKRCNT98; /**< Statistical Check Poker Count 9 and 8 Register, offset: 0x90 */ - __I uint32_t PKRCNTBA; /**< Statistical Check Poker Count B and A Register, offset: 0x94 */ - __I uint32_t PKRCNTDC; /**< Statistical Check Poker Count D and C Register, offset: 0x98 */ - __I uint32_t PKRCNTFE; /**< Statistical Check Poker Count F and E Register, offset: 0x9C */ - __IO uint32_t SEC_CFG; /**< Security Configuration Register, offset: 0xA0 */ - __IO uint32_t INT_CTRL; /**< Interrupt Control Register, offset: 0xA4 */ - __IO uint32_t INT_MASK; /**< Mask Register, offset: 0xA8 */ - __I uint32_t INT_STATUS; /**< Interrupt Status Register, offset: 0xAC */ - uint8_t RESERVED_0[64]; - __I uint32_t VID1; /**< Version ID Register (MS), offset: 0xF0 */ - __I uint32_t VID2; /**< Version ID Register (LS), offset: 0xF4 */ -} TRNG_Type; - -/* ---------------------------------------------------------------------------- - -- TRNG Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TRNG_Register_Masks TRNG Register Masks - * @{ - */ - -/*! @name MCTL - Miscellaneous Control Register */ -/*! @{ */ - -#define TRNG_MCTL_SAMP_MODE_MASK (0x3U) -#define TRNG_MCTL_SAMP_MODE_SHIFT (0U) -/*! SAMP_MODE - * 0b00..use Von Neumann data into both Entropy shifter and Statistical Checker - * 0b01..use raw data into both Entropy shifter and Statistical Checker - * 0b10..use Von Neumann data into Entropy shifter. Use raw data into Statistical Checker - * 0b11..undefined/reserved. - */ -#define TRNG_MCTL_SAMP_MODE(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_SAMP_MODE_SHIFT)) & TRNG_MCTL_SAMP_MODE_MASK) - -#define TRNG_MCTL_OSC_DIV_MASK (0xCU) -#define TRNG_MCTL_OSC_DIV_SHIFT (2U) -/*! OSC_DIV - * 0b00..use ring oscillator with no divide - * 0b01..use ring oscillator divided-by-2 - * 0b10..use ring oscillator divided-by-4 - * 0b11..use ring oscillator divided-by-8 - */ -#define TRNG_MCTL_OSC_DIV(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_OSC_DIV_SHIFT)) & TRNG_MCTL_OSC_DIV_MASK) - -#define TRNG_MCTL_UNUSED4_MASK (0x10U) -#define TRNG_MCTL_UNUSED4_SHIFT (4U) -#define TRNG_MCTL_UNUSED4(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_UNUSED4_SHIFT)) & TRNG_MCTL_UNUSED4_MASK) - -#define TRNG_MCTL_UNUSED5_MASK (0x20U) -#define TRNG_MCTL_UNUSED5_SHIFT (5U) -#define TRNG_MCTL_UNUSED5(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_UNUSED5_SHIFT)) & TRNG_MCTL_UNUSED5_MASK) - -#define TRNG_MCTL_RST_DEF_MASK (0x40U) -#define TRNG_MCTL_RST_DEF_SHIFT (6U) -#define TRNG_MCTL_RST_DEF(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_RST_DEF_SHIFT)) & TRNG_MCTL_RST_DEF_MASK) - -#define TRNG_MCTL_FOR_SCLK_MASK (0x80U) -#define TRNG_MCTL_FOR_SCLK_SHIFT (7U) -#define TRNG_MCTL_FOR_SCLK(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FOR_SCLK_SHIFT)) & TRNG_MCTL_FOR_SCLK_MASK) - -#define TRNG_MCTL_FCT_FAIL_MASK (0x100U) -#define TRNG_MCTL_FCT_FAIL_SHIFT (8U) -#define TRNG_MCTL_FCT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FCT_FAIL_SHIFT)) & TRNG_MCTL_FCT_FAIL_MASK) - -#define TRNG_MCTL_FCT_VAL_MASK (0x200U) -#define TRNG_MCTL_FCT_VAL_SHIFT (9U) -#define TRNG_MCTL_FCT_VAL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FCT_VAL_SHIFT)) & TRNG_MCTL_FCT_VAL_MASK) - -#define TRNG_MCTL_ENT_VAL_MASK (0x400U) -#define TRNG_MCTL_ENT_VAL_SHIFT (10U) -#define TRNG_MCTL_ENT_VAL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_ENT_VAL_SHIFT)) & TRNG_MCTL_ENT_VAL_MASK) - -#define TRNG_MCTL_TST_OUT_MASK (0x800U) -#define TRNG_MCTL_TST_OUT_SHIFT (11U) -#define TRNG_MCTL_TST_OUT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_TST_OUT_SHIFT)) & TRNG_MCTL_TST_OUT_MASK) - -#define TRNG_MCTL_ERR_MASK (0x1000U) -#define TRNG_MCTL_ERR_SHIFT (12U) -#define TRNG_MCTL_ERR(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_ERR_SHIFT)) & TRNG_MCTL_ERR_MASK) - -#define TRNG_MCTL_TSTOP_OK_MASK (0x2000U) -#define TRNG_MCTL_TSTOP_OK_SHIFT (13U) -#define TRNG_MCTL_TSTOP_OK(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_TSTOP_OK_SHIFT)) & TRNG_MCTL_TSTOP_OK_MASK) - -#define TRNG_MCTL_LRUN_CONT_MASK (0x4000U) -#define TRNG_MCTL_LRUN_CONT_SHIFT (14U) -#define TRNG_MCTL_LRUN_CONT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_LRUN_CONT_SHIFT)) & TRNG_MCTL_LRUN_CONT_MASK) - -#define TRNG_MCTL_PRGM_MASK (0x10000U) -#define TRNG_MCTL_PRGM_SHIFT (16U) -#define TRNG_MCTL_PRGM(x) (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_PRGM_SHIFT)) & TRNG_MCTL_PRGM_MASK) -/*! @} */ - -/*! @name SCMISC - Statistical Check Miscellaneous Register */ -/*! @{ */ - -#define TRNG_SCMISC_LRUN_MAX_MASK (0xFFU) -#define TRNG_SCMISC_LRUN_MAX_SHIFT (0U) -#define TRNG_SCMISC_LRUN_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCMISC_LRUN_MAX_SHIFT)) & TRNG_SCMISC_LRUN_MAX_MASK) - -#define TRNG_SCMISC_RTY_CT_MASK (0xF0000U) -#define TRNG_SCMISC_RTY_CT_SHIFT (16U) -#define TRNG_SCMISC_RTY_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCMISC_RTY_CT_SHIFT)) & TRNG_SCMISC_RTY_CT_MASK) -/*! @} */ - -/*! @name PKRRNG - Poker Range Register */ -/*! @{ */ - -#define TRNG_PKRRNG_PKR_RNG_MASK (0xFFFFU) -#define TRNG_PKRRNG_PKR_RNG_SHIFT (0U) -#define TRNG_PKRRNG_PKR_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRRNG_PKR_RNG_SHIFT)) & TRNG_PKRRNG_PKR_RNG_MASK) -/*! @} */ - -/*! @name PKRMAX - Poker Maximum Limit Register */ -/*! @{ */ - -#define TRNG_PKRMAX_PKR_MAX_MASK (0xFFFFFFU) -#define TRNG_PKRMAX_PKR_MAX_SHIFT (0U) -/*! PKR_MAX - Poker Maximum Limit. - */ -#define TRNG_PKRMAX_PKR_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRMAX_PKR_MAX_SHIFT)) & TRNG_PKRMAX_PKR_MAX_MASK) -/*! @} */ - -/*! @name PKRSQ - Poker Square Calculation Result Register */ -/*! @{ */ - -#define TRNG_PKRSQ_PKR_SQ_MASK (0xFFFFFFU) -#define TRNG_PKRSQ_PKR_SQ_SHIFT (0U) -/*! PKR_SQ - Poker Square Calculation Result. - */ -#define TRNG_PKRSQ_PKR_SQ(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRSQ_PKR_SQ_SHIFT)) & TRNG_PKRSQ_PKR_SQ_MASK) -/*! @} */ - -/*! @name SDCTL - Seed Control Register */ -/*! @{ */ - -#define TRNG_SDCTL_SAMP_SIZE_MASK (0xFFFFU) -#define TRNG_SDCTL_SAMP_SIZE_SHIFT (0U) -#define TRNG_SDCTL_SAMP_SIZE(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SDCTL_SAMP_SIZE_SHIFT)) & TRNG_SDCTL_SAMP_SIZE_MASK) - -#define TRNG_SDCTL_ENT_DLY_MASK (0xFFFF0000U) -#define TRNG_SDCTL_ENT_DLY_SHIFT (16U) -#define TRNG_SDCTL_ENT_DLY(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SDCTL_ENT_DLY_SHIFT)) & TRNG_SDCTL_ENT_DLY_MASK) -/*! @} */ - -/*! @name SBLIM - Sparse Bit Limit Register */ -/*! @{ */ - -#define TRNG_SBLIM_SB_LIM_MASK (0x3FFU) -#define TRNG_SBLIM_SB_LIM_SHIFT (0U) -#define TRNG_SBLIM_SB_LIM(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SBLIM_SB_LIM_SHIFT)) & TRNG_SBLIM_SB_LIM_MASK) -/*! @} */ - -/*! @name TOTSAM - Total Samples Register */ -/*! @{ */ - -#define TRNG_TOTSAM_TOT_SAM_MASK (0xFFFFFU) -#define TRNG_TOTSAM_TOT_SAM_SHIFT (0U) -#define TRNG_TOTSAM_TOT_SAM(x) (((uint32_t)(((uint32_t)(x)) << TRNG_TOTSAM_TOT_SAM_SHIFT)) & TRNG_TOTSAM_TOT_SAM_MASK) -/*! @} */ - -/*! @name FRQMIN - Frequency Count Minimum Limit Register */ -/*! @{ */ - -#define TRNG_FRQMIN_FRQ_MIN_MASK (0x3FFFFFU) -#define TRNG_FRQMIN_FRQ_MIN_SHIFT (0U) -#define TRNG_FRQMIN_FRQ_MIN(x) (((uint32_t)(((uint32_t)(x)) << TRNG_FRQMIN_FRQ_MIN_SHIFT)) & TRNG_FRQMIN_FRQ_MIN_MASK) -/*! @} */ - -/*! @name FRQCNT - Frequency Count Register */ -/*! @{ */ - -#define TRNG_FRQCNT_FRQ_CT_MASK (0x3FFFFFU) -#define TRNG_FRQCNT_FRQ_CT_SHIFT (0U) -#define TRNG_FRQCNT_FRQ_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_FRQCNT_FRQ_CT_SHIFT)) & TRNG_FRQCNT_FRQ_CT_MASK) -/*! @} */ - -/*! @name FRQMAX - Frequency Count Maximum Limit Register */ -/*! @{ */ - -#define TRNG_FRQMAX_FRQ_MAX_MASK (0x3FFFFFU) -#define TRNG_FRQMAX_FRQ_MAX_SHIFT (0U) -#define TRNG_FRQMAX_FRQ_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_FRQMAX_FRQ_MAX_SHIFT)) & TRNG_FRQMAX_FRQ_MAX_MASK) -/*! @} */ - -/*! @name SCMC - Statistical Check Monobit Count Register */ -/*! @{ */ - -#define TRNG_SCMC_MONO_CT_MASK (0xFFFFU) -#define TRNG_SCMC_MONO_CT_SHIFT (0U) -#define TRNG_SCMC_MONO_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCMC_MONO_CT_SHIFT)) & TRNG_SCMC_MONO_CT_MASK) -/*! @} */ - -/*! @name SCML - Statistical Check Monobit Limit Register */ -/*! @{ */ - -#define TRNG_SCML_MONO_MAX_MASK (0xFFFFU) -#define TRNG_SCML_MONO_MAX_SHIFT (0U) -#define TRNG_SCML_MONO_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCML_MONO_MAX_SHIFT)) & TRNG_SCML_MONO_MAX_MASK) - -#define TRNG_SCML_MONO_RNG_MASK (0xFFFF0000U) -#define TRNG_SCML_MONO_RNG_SHIFT (16U) -#define TRNG_SCML_MONO_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCML_MONO_RNG_SHIFT)) & TRNG_SCML_MONO_RNG_MASK) -/*! @} */ - -/*! @name SCR1C - Statistical Check Run Length 1 Count Register */ -/*! @{ */ - -#define TRNG_SCR1C_R1_0_CT_MASK (0x7FFFU) -#define TRNG_SCR1C_R1_0_CT_SHIFT (0U) -#define TRNG_SCR1C_R1_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1C_R1_0_CT_SHIFT)) & TRNG_SCR1C_R1_0_CT_MASK) - -#define TRNG_SCR1C_R1_1_CT_MASK (0x7FFF0000U) -#define TRNG_SCR1C_R1_1_CT_SHIFT (16U) -#define TRNG_SCR1C_R1_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1C_R1_1_CT_SHIFT)) & TRNG_SCR1C_R1_1_CT_MASK) -/*! @} */ - -/*! @name SCR1L - Statistical Check Run Length 1 Limit Register */ -/*! @{ */ - -#define TRNG_SCR1L_RUN1_MAX_MASK (0x7FFFU) -#define TRNG_SCR1L_RUN1_MAX_SHIFT (0U) -#define TRNG_SCR1L_RUN1_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1L_RUN1_MAX_SHIFT)) & TRNG_SCR1L_RUN1_MAX_MASK) - -#define TRNG_SCR1L_RUN1_RNG_MASK (0x7FFF0000U) -#define TRNG_SCR1L_RUN1_RNG_SHIFT (16U) -#define TRNG_SCR1L_RUN1_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1L_RUN1_RNG_SHIFT)) & TRNG_SCR1L_RUN1_RNG_MASK) -/*! @} */ - -/*! @name SCR2C - Statistical Check Run Length 2 Count Register */ -/*! @{ */ - -#define TRNG_SCR2C_R2_0_CT_MASK (0x3FFFU) -#define TRNG_SCR2C_R2_0_CT_SHIFT (0U) -#define TRNG_SCR2C_R2_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2C_R2_0_CT_SHIFT)) & TRNG_SCR2C_R2_0_CT_MASK) - -#define TRNG_SCR2C_R2_1_CT_MASK (0x3FFF0000U) -#define TRNG_SCR2C_R2_1_CT_SHIFT (16U) -#define TRNG_SCR2C_R2_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2C_R2_1_CT_SHIFT)) & TRNG_SCR2C_R2_1_CT_MASK) -/*! @} */ - -/*! @name SCR2L - Statistical Check Run Length 2 Limit Register */ -/*! @{ */ - -#define TRNG_SCR2L_RUN2_MAX_MASK (0x3FFFU) -#define TRNG_SCR2L_RUN2_MAX_SHIFT (0U) -#define TRNG_SCR2L_RUN2_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2L_RUN2_MAX_SHIFT)) & TRNG_SCR2L_RUN2_MAX_MASK) - -#define TRNG_SCR2L_RUN2_RNG_MASK (0x3FFF0000U) -#define TRNG_SCR2L_RUN2_RNG_SHIFT (16U) -#define TRNG_SCR2L_RUN2_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2L_RUN2_RNG_SHIFT)) & TRNG_SCR2L_RUN2_RNG_MASK) -/*! @} */ - -/*! @name SCR3C - Statistical Check Run Length 3 Count Register */ -/*! @{ */ - -#define TRNG_SCR3C_R3_0_CT_MASK (0x1FFFU) -#define TRNG_SCR3C_R3_0_CT_SHIFT (0U) -#define TRNG_SCR3C_R3_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3C_R3_0_CT_SHIFT)) & TRNG_SCR3C_R3_0_CT_MASK) - -#define TRNG_SCR3C_R3_1_CT_MASK (0x1FFF0000U) -#define TRNG_SCR3C_R3_1_CT_SHIFT (16U) -#define TRNG_SCR3C_R3_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3C_R3_1_CT_SHIFT)) & TRNG_SCR3C_R3_1_CT_MASK) -/*! @} */ - -/*! @name SCR3L - Statistical Check Run Length 3 Limit Register */ -/*! @{ */ - -#define TRNG_SCR3L_RUN3_MAX_MASK (0x1FFFU) -#define TRNG_SCR3L_RUN3_MAX_SHIFT (0U) -#define TRNG_SCR3L_RUN3_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3L_RUN3_MAX_SHIFT)) & TRNG_SCR3L_RUN3_MAX_MASK) - -#define TRNG_SCR3L_RUN3_RNG_MASK (0x1FFF0000U) -#define TRNG_SCR3L_RUN3_RNG_SHIFT (16U) -#define TRNG_SCR3L_RUN3_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3L_RUN3_RNG_SHIFT)) & TRNG_SCR3L_RUN3_RNG_MASK) -/*! @} */ - -/*! @name SCR4C - Statistical Check Run Length 4 Count Register */ -/*! @{ */ - -#define TRNG_SCR4C_R4_0_CT_MASK (0xFFFU) -#define TRNG_SCR4C_R4_0_CT_SHIFT (0U) -#define TRNG_SCR4C_R4_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR4C_R4_0_CT_SHIFT)) & TRNG_SCR4C_R4_0_CT_MASK) - -#define TRNG_SCR4C_R4_1_CT_MASK (0xFFF0000U) -#define TRNG_SCR4C_R4_1_CT_SHIFT (16U) -#define TRNG_SCR4C_R4_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR4C_R4_1_CT_SHIFT)) & TRNG_SCR4C_R4_1_CT_MASK) -/*! @} */ - -/*! @name SCR4L - Statistical Check Run Length 4 Limit Register */ -/*! @{ */ - -#define TRNG_SCR4L_RUN4_MAX_MASK (0xFFFU) -#define TRNG_SCR4L_RUN4_MAX_SHIFT (0U) -#define TRNG_SCR4L_RUN4_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR4L_RUN4_MAX_SHIFT)) & TRNG_SCR4L_RUN4_MAX_MASK) - -#define TRNG_SCR4L_RUN4_RNG_MASK (0xFFF0000U) -#define TRNG_SCR4L_RUN4_RNG_SHIFT (16U) -#define TRNG_SCR4L_RUN4_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR4L_RUN4_RNG_SHIFT)) & TRNG_SCR4L_RUN4_RNG_MASK) -/*! @} */ - -/*! @name SCR5C - Statistical Check Run Length 5 Count Register */ -/*! @{ */ - -#define TRNG_SCR5C_R5_0_CT_MASK (0x7FFU) -#define TRNG_SCR5C_R5_0_CT_SHIFT (0U) -#define TRNG_SCR5C_R5_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR5C_R5_0_CT_SHIFT)) & TRNG_SCR5C_R5_0_CT_MASK) - -#define TRNG_SCR5C_R5_1_CT_MASK (0x7FF0000U) -#define TRNG_SCR5C_R5_1_CT_SHIFT (16U) -#define TRNG_SCR5C_R5_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR5C_R5_1_CT_SHIFT)) & TRNG_SCR5C_R5_1_CT_MASK) -/*! @} */ - -/*! @name SCR5L - Statistical Check Run Length 5 Limit Register */ -/*! @{ */ - -#define TRNG_SCR5L_RUN5_MAX_MASK (0x7FFU) -#define TRNG_SCR5L_RUN5_MAX_SHIFT (0U) -#define TRNG_SCR5L_RUN5_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR5L_RUN5_MAX_SHIFT)) & TRNG_SCR5L_RUN5_MAX_MASK) - -#define TRNG_SCR5L_RUN5_RNG_MASK (0x7FF0000U) -#define TRNG_SCR5L_RUN5_RNG_SHIFT (16U) -#define TRNG_SCR5L_RUN5_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR5L_RUN5_RNG_SHIFT)) & TRNG_SCR5L_RUN5_RNG_MASK) -/*! @} */ - -/*! @name SCR6PC - Statistical Check Run Length 6+ Count Register */ -/*! @{ */ - -#define TRNG_SCR6PC_R6P_0_CT_MASK (0x7FFU) -#define TRNG_SCR6PC_R6P_0_CT_SHIFT (0U) -#define TRNG_SCR6PC_R6P_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR6PC_R6P_0_CT_SHIFT)) & TRNG_SCR6PC_R6P_0_CT_MASK) - -#define TRNG_SCR6PC_R6P_1_CT_MASK (0x7FF0000U) -#define TRNG_SCR6PC_R6P_1_CT_SHIFT (16U) -#define TRNG_SCR6PC_R6P_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR6PC_R6P_1_CT_SHIFT)) & TRNG_SCR6PC_R6P_1_CT_MASK) -/*! @} */ - -/*! @name SCR6PL - Statistical Check Run Length 6+ Limit Register */ -/*! @{ */ - -#define TRNG_SCR6PL_RUN6P_MAX_MASK (0x7FFU) -#define TRNG_SCR6PL_RUN6P_MAX_SHIFT (0U) -#define TRNG_SCR6PL_RUN6P_MAX(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR6PL_RUN6P_MAX_SHIFT)) & TRNG_SCR6PL_RUN6P_MAX_MASK) - -#define TRNG_SCR6PL_RUN6P_RNG_MASK (0x7FF0000U) -#define TRNG_SCR6PL_RUN6P_RNG_SHIFT (16U) -#define TRNG_SCR6PL_RUN6P_RNG(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SCR6PL_RUN6P_RNG_SHIFT)) & TRNG_SCR6PL_RUN6P_RNG_MASK) -/*! @} */ - -/*! @name STATUS - Status Register */ -/*! @{ */ - -#define TRNG_STATUS_TF1BR0_MASK (0x1U) -#define TRNG_STATUS_TF1BR0_SHIFT (0U) -#define TRNG_STATUS_TF1BR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF1BR0_SHIFT)) & TRNG_STATUS_TF1BR0_MASK) - -#define TRNG_STATUS_TF1BR1_MASK (0x2U) -#define TRNG_STATUS_TF1BR1_SHIFT (1U) -#define TRNG_STATUS_TF1BR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF1BR1_SHIFT)) & TRNG_STATUS_TF1BR1_MASK) - -#define TRNG_STATUS_TF2BR0_MASK (0x4U) -#define TRNG_STATUS_TF2BR0_SHIFT (2U) -#define TRNG_STATUS_TF2BR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF2BR0_SHIFT)) & TRNG_STATUS_TF2BR0_MASK) - -#define TRNG_STATUS_TF2BR1_MASK (0x8U) -#define TRNG_STATUS_TF2BR1_SHIFT (3U) -#define TRNG_STATUS_TF2BR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF2BR1_SHIFT)) & TRNG_STATUS_TF2BR1_MASK) - -#define TRNG_STATUS_TF3BR0_MASK (0x10U) -#define TRNG_STATUS_TF3BR0_SHIFT (4U) -#define TRNG_STATUS_TF3BR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF3BR0_SHIFT)) & TRNG_STATUS_TF3BR0_MASK) - -#define TRNG_STATUS_TF3BR1_MASK (0x20U) -#define TRNG_STATUS_TF3BR1_SHIFT (5U) -#define TRNG_STATUS_TF3BR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF3BR1_SHIFT)) & TRNG_STATUS_TF3BR1_MASK) - -#define TRNG_STATUS_TF4BR0_MASK (0x40U) -#define TRNG_STATUS_TF4BR0_SHIFT (6U) -#define TRNG_STATUS_TF4BR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF4BR0_SHIFT)) & TRNG_STATUS_TF4BR0_MASK) - -#define TRNG_STATUS_TF4BR1_MASK (0x80U) -#define TRNG_STATUS_TF4BR1_SHIFT (7U) -#define TRNG_STATUS_TF4BR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF4BR1_SHIFT)) & TRNG_STATUS_TF4BR1_MASK) - -#define TRNG_STATUS_TF5BR0_MASK (0x100U) -#define TRNG_STATUS_TF5BR0_SHIFT (8U) -#define TRNG_STATUS_TF5BR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF5BR0_SHIFT)) & TRNG_STATUS_TF5BR0_MASK) - -#define TRNG_STATUS_TF5BR1_MASK (0x200U) -#define TRNG_STATUS_TF5BR1_SHIFT (9U) -#define TRNG_STATUS_TF5BR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF5BR1_SHIFT)) & TRNG_STATUS_TF5BR1_MASK) - -#define TRNG_STATUS_TF6PBR0_MASK (0x400U) -#define TRNG_STATUS_TF6PBR0_SHIFT (10U) -#define TRNG_STATUS_TF6PBR0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF6PBR0_SHIFT)) & TRNG_STATUS_TF6PBR0_MASK) - -#define TRNG_STATUS_TF6PBR1_MASK (0x800U) -#define TRNG_STATUS_TF6PBR1_SHIFT (11U) -#define TRNG_STATUS_TF6PBR1(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF6PBR1_SHIFT)) & TRNG_STATUS_TF6PBR1_MASK) - -#define TRNG_STATUS_TFSB_MASK (0x1000U) -#define TRNG_STATUS_TFSB_SHIFT (12U) -#define TRNG_STATUS_TFSB(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFSB_SHIFT)) & TRNG_STATUS_TFSB_MASK) - -#define TRNG_STATUS_TFLR_MASK (0x2000U) -#define TRNG_STATUS_TFLR_SHIFT (13U) -#define TRNG_STATUS_TFLR(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFLR_SHIFT)) & TRNG_STATUS_TFLR_MASK) - -#define TRNG_STATUS_TFP_MASK (0x4000U) -#define TRNG_STATUS_TFP_SHIFT (14U) -#define TRNG_STATUS_TFP(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFP_SHIFT)) & TRNG_STATUS_TFP_MASK) - -#define TRNG_STATUS_TFMB_MASK (0x8000U) -#define TRNG_STATUS_TFMB_SHIFT (15U) -#define TRNG_STATUS_TFMB(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFMB_SHIFT)) & TRNG_STATUS_TFMB_MASK) - -#define TRNG_STATUS_RETRY_CT_MASK (0xF0000U) -#define TRNG_STATUS_RETRY_CT_SHIFT (16U) -#define TRNG_STATUS_RETRY_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_RETRY_CT_SHIFT)) & TRNG_STATUS_RETRY_CT_MASK) -/*! @} */ - -/*! @name ENT - Entropy Read Register */ -/*! @{ */ - -#define TRNG_ENT_ENT_MASK (0xFFFFFFFFU) -#define TRNG_ENT_ENT_SHIFT (0U) -#define TRNG_ENT_ENT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_ENT_ENT_SHIFT)) & TRNG_ENT_ENT_MASK) -/*! @} */ - -/* The count of TRNG_ENT */ -#define TRNG_ENT_COUNT (16U) - -/*! @name PKRCNT10 - Statistical Check Poker Count 1 and 0 Register */ -/*! @{ */ - -#define TRNG_PKRCNT10_PKR_0_CT_MASK (0xFFFFU) -#define TRNG_PKRCNT10_PKR_0_CT_SHIFT (0U) -#define TRNG_PKRCNT10_PKR_0_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT10_PKR_0_CT_SHIFT)) & TRNG_PKRCNT10_PKR_0_CT_MASK) - -#define TRNG_PKRCNT10_PKR_1_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNT10_PKR_1_CT_SHIFT (16U) -#define TRNG_PKRCNT10_PKR_1_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT10_PKR_1_CT_SHIFT)) & TRNG_PKRCNT10_PKR_1_CT_MASK) -/*! @} */ - -/*! @name PKRCNT32 - Statistical Check Poker Count 3 and 2 Register */ -/*! @{ */ - -#define TRNG_PKRCNT32_PKR_2_CT_MASK (0xFFFFU) -#define TRNG_PKRCNT32_PKR_2_CT_SHIFT (0U) -#define TRNG_PKRCNT32_PKR_2_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT32_PKR_2_CT_SHIFT)) & TRNG_PKRCNT32_PKR_2_CT_MASK) - -#define TRNG_PKRCNT32_PKR_3_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNT32_PKR_3_CT_SHIFT (16U) -#define TRNG_PKRCNT32_PKR_3_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT32_PKR_3_CT_SHIFT)) & TRNG_PKRCNT32_PKR_3_CT_MASK) -/*! @} */ - -/*! @name PKRCNT54 - Statistical Check Poker Count 5 and 4 Register */ -/*! @{ */ - -#define TRNG_PKRCNT54_PKR_4_CT_MASK (0xFFFFU) -#define TRNG_PKRCNT54_PKR_4_CT_SHIFT (0U) -#define TRNG_PKRCNT54_PKR_4_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT54_PKR_4_CT_SHIFT)) & TRNG_PKRCNT54_PKR_4_CT_MASK) - -#define TRNG_PKRCNT54_PKR_5_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNT54_PKR_5_CT_SHIFT (16U) -#define TRNG_PKRCNT54_PKR_5_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT54_PKR_5_CT_SHIFT)) & TRNG_PKRCNT54_PKR_5_CT_MASK) -/*! @} */ - -/*! @name PKRCNT76 - Statistical Check Poker Count 7 and 6 Register */ -/*! @{ */ - -#define TRNG_PKRCNT76_PKR_6_CT_MASK (0xFFFFU) -#define TRNG_PKRCNT76_PKR_6_CT_SHIFT (0U) -#define TRNG_PKRCNT76_PKR_6_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT76_PKR_6_CT_SHIFT)) & TRNG_PKRCNT76_PKR_6_CT_MASK) - -#define TRNG_PKRCNT76_PKR_7_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNT76_PKR_7_CT_SHIFT (16U) -#define TRNG_PKRCNT76_PKR_7_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT76_PKR_7_CT_SHIFT)) & TRNG_PKRCNT76_PKR_7_CT_MASK) -/*! @} */ - -/*! @name PKRCNT98 - Statistical Check Poker Count 9 and 8 Register */ -/*! @{ */ - -#define TRNG_PKRCNT98_PKR_8_CT_MASK (0xFFFFU) -#define TRNG_PKRCNT98_PKR_8_CT_SHIFT (0U) -#define TRNG_PKRCNT98_PKR_8_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT98_PKR_8_CT_SHIFT)) & TRNG_PKRCNT98_PKR_8_CT_MASK) - -#define TRNG_PKRCNT98_PKR_9_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNT98_PKR_9_CT_SHIFT (16U) -#define TRNG_PKRCNT98_PKR_9_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNT98_PKR_9_CT_SHIFT)) & TRNG_PKRCNT98_PKR_9_CT_MASK) -/*! @} */ - -/*! @name PKRCNTBA - Statistical Check Poker Count B and A Register */ -/*! @{ */ - -#define TRNG_PKRCNTBA_PKR_A_CT_MASK (0xFFFFU) -#define TRNG_PKRCNTBA_PKR_A_CT_SHIFT (0U) -#define TRNG_PKRCNTBA_PKR_A_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTBA_PKR_A_CT_SHIFT)) & TRNG_PKRCNTBA_PKR_A_CT_MASK) - -#define TRNG_PKRCNTBA_PKR_B_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNTBA_PKR_B_CT_SHIFT (16U) -#define TRNG_PKRCNTBA_PKR_B_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTBA_PKR_B_CT_SHIFT)) & TRNG_PKRCNTBA_PKR_B_CT_MASK) -/*! @} */ - -/*! @name PKRCNTDC - Statistical Check Poker Count D and C Register */ -/*! @{ */ - -#define TRNG_PKRCNTDC_PKR_C_CT_MASK (0xFFFFU) -#define TRNG_PKRCNTDC_PKR_C_CT_SHIFT (0U) -#define TRNG_PKRCNTDC_PKR_C_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTDC_PKR_C_CT_SHIFT)) & TRNG_PKRCNTDC_PKR_C_CT_MASK) - -#define TRNG_PKRCNTDC_PKR_D_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNTDC_PKR_D_CT_SHIFT (16U) -#define TRNG_PKRCNTDC_PKR_D_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTDC_PKR_D_CT_SHIFT)) & TRNG_PKRCNTDC_PKR_D_CT_MASK) -/*! @} */ - -/*! @name PKRCNTFE - Statistical Check Poker Count F and E Register */ -/*! @{ */ - -#define TRNG_PKRCNTFE_PKR_E_CT_MASK (0xFFFFU) -#define TRNG_PKRCNTFE_PKR_E_CT_SHIFT (0U) -#define TRNG_PKRCNTFE_PKR_E_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTFE_PKR_E_CT_SHIFT)) & TRNG_PKRCNTFE_PKR_E_CT_MASK) - -#define TRNG_PKRCNTFE_PKR_F_CT_MASK (0xFFFF0000U) -#define TRNG_PKRCNTFE_PKR_F_CT_SHIFT (16U) -#define TRNG_PKRCNTFE_PKR_F_CT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_PKRCNTFE_PKR_F_CT_SHIFT)) & TRNG_PKRCNTFE_PKR_F_CT_MASK) -/*! @} */ - -/*! @name SEC_CFG - Security Configuration Register */ -/*! @{ */ - -#define TRNG_SEC_CFG_UNUSED0_MASK (0x1U) -#define TRNG_SEC_CFG_UNUSED0_SHIFT (0U) -#define TRNG_SEC_CFG_UNUSED0(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_UNUSED0_SHIFT)) & TRNG_SEC_CFG_UNUSED0_MASK) - -#define TRNG_SEC_CFG_NO_PRGM_MASK (0x2U) -#define TRNG_SEC_CFG_NO_PRGM_SHIFT (1U) -/*! NO_PRGM - * 0b0..Programability of registers controlled only by the Miscellaneous Control Register's access mode bit. - * 0b1..Overides Miscellaneous Control Register access mode and prevents TRNG register programming. - */ -#define TRNG_SEC_CFG_NO_PRGM(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_NO_PRGM_SHIFT)) & TRNG_SEC_CFG_NO_PRGM_MASK) - -#define TRNG_SEC_CFG_UNUSED2_MASK (0x4U) -#define TRNG_SEC_CFG_UNUSED2_SHIFT (2U) -#define TRNG_SEC_CFG_UNUSED2(x) (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_UNUSED2_SHIFT)) & TRNG_SEC_CFG_UNUSED2_MASK) -/*! @} */ - -/*! @name INT_CTRL - Interrupt Control Register */ -/*! @{ */ - -#define TRNG_INT_CTRL_HW_ERR_MASK (0x1U) -#define TRNG_INT_CTRL_HW_ERR_SHIFT (0U) -/*! HW_ERR - * 0b0..Corresponding bit of INT_STATUS register cleared. - * 0b1..Corresponding bit of INT_STATUS register active. - */ -#define TRNG_INT_CTRL_HW_ERR(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_HW_ERR_SHIFT)) & TRNG_INT_CTRL_HW_ERR_MASK) - -#define TRNG_INT_CTRL_ENT_VAL_MASK (0x2U) -#define TRNG_INT_CTRL_ENT_VAL_SHIFT (1U) -/*! ENT_VAL - * 0b0..Same behavior as bit 0 of this register. - * 0b1..Same behavior as bit 0 of this register. - */ -#define TRNG_INT_CTRL_ENT_VAL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_ENT_VAL_SHIFT)) & TRNG_INT_CTRL_ENT_VAL_MASK) - -#define TRNG_INT_CTRL_FRQ_CT_FAIL_MASK (0x4U) -#define TRNG_INT_CTRL_FRQ_CT_FAIL_SHIFT (2U) -/*! FRQ_CT_FAIL - * 0b0..Same behavior as bit 0 of this register. - * 0b1..Same behavior as bit 0 of this register. - */ -#define TRNG_INT_CTRL_FRQ_CT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_CTRL_FRQ_CT_FAIL_MASK) - -#define TRNG_INT_CTRL_UNUSED_MASK (0xFFFFFFF8U) -#define TRNG_INT_CTRL_UNUSED_SHIFT (3U) -#define TRNG_INT_CTRL_UNUSED(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_UNUSED_SHIFT)) & TRNG_INT_CTRL_UNUSED_MASK) -/*! @} */ - -/*! @name INT_MASK - Mask Register */ -/*! @{ */ - -#define TRNG_INT_MASK_HW_ERR_MASK (0x1U) -#define TRNG_INT_MASK_HW_ERR_SHIFT (0U) -/*! HW_ERR - * 0b0..Corresponding interrupt of INT_STATUS is masked. - * 0b1..Corresponding bit of INT_STATUS is active. - */ -#define TRNG_INT_MASK_HW_ERR(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_HW_ERR_SHIFT)) & TRNG_INT_MASK_HW_ERR_MASK) - -#define TRNG_INT_MASK_ENT_VAL_MASK (0x2U) -#define TRNG_INT_MASK_ENT_VAL_SHIFT (1U) -/*! ENT_VAL - * 0b0..Same behavior as bit 0 of this register. - * 0b1..Same behavior as bit 0 of this register. - */ -#define TRNG_INT_MASK_ENT_VAL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_ENT_VAL_SHIFT)) & TRNG_INT_MASK_ENT_VAL_MASK) - -#define TRNG_INT_MASK_FRQ_CT_FAIL_MASK (0x4U) -#define TRNG_INT_MASK_FRQ_CT_FAIL_SHIFT (2U) -/*! FRQ_CT_FAIL - * 0b0..Same behavior as bit 0 of this register. - * 0b1..Same behavior as bit 0 of this register. - */ -#define TRNG_INT_MASK_FRQ_CT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_MASK_FRQ_CT_FAIL_MASK) -/*! @} */ - -/*! @name INT_STATUS - Interrupt Status Register */ -/*! @{ */ - -#define TRNG_INT_STATUS_HW_ERR_MASK (0x1U) -#define TRNG_INT_STATUS_HW_ERR_SHIFT (0U) -/*! HW_ERR - * 0b0..no error - * 0b1..error detected. - */ -#define TRNG_INT_STATUS_HW_ERR(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_HW_ERR_SHIFT)) & TRNG_INT_STATUS_HW_ERR_MASK) - -#define TRNG_INT_STATUS_ENT_VAL_MASK (0x2U) -#define TRNG_INT_STATUS_ENT_VAL_SHIFT (1U) -/*! ENT_VAL - * 0b0..Busy generation entropy. Any value read is invalid. - * 0b1..TRNG can be stopped and entropy is valid if read. - */ -#define TRNG_INT_STATUS_ENT_VAL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_ENT_VAL_SHIFT)) & TRNG_INT_STATUS_ENT_VAL_MASK) - -#define TRNG_INT_STATUS_FRQ_CT_FAIL_MASK (0x4U) -#define TRNG_INT_STATUS_FRQ_CT_FAIL_SHIFT (2U) -/*! FRQ_CT_FAIL - * 0b0..No hardware nor self test frequency errors. - * 0b1..The frequency counter has detected a failure. - */ -#define TRNG_INT_STATUS_FRQ_CT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_STATUS_FRQ_CT_FAIL_MASK) -/*! @} */ - -/*! @name VID1 - Version ID Register (MS) */ -/*! @{ */ - -#define TRNG_VID1_MIN_REV_MASK (0xFFU) -#define TRNG_VID1_MIN_REV_SHIFT (0U) -/*! MIN_REV - * 0b00000000..Minor revision number for TRNG. - */ -#define TRNG_VID1_MIN_REV(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_MIN_REV_SHIFT)) & TRNG_VID1_MIN_REV_MASK) - -#define TRNG_VID1_MAJ_REV_MASK (0xFF00U) -#define TRNG_VID1_MAJ_REV_SHIFT (8U) -/*! MAJ_REV - * 0b00000001..Major revision number for TRNG. - */ -#define TRNG_VID1_MAJ_REV(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_MAJ_REV_SHIFT)) & TRNG_VID1_MAJ_REV_MASK) - -#define TRNG_VID1_IP_ID_MASK (0xFFFF0000U) -#define TRNG_VID1_IP_ID_SHIFT (16U) -/*! IP_ID - * 0b0000000000110000..ID for TRNG. - */ -#define TRNG_VID1_IP_ID(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_IP_ID_SHIFT)) & TRNG_VID1_IP_ID_MASK) -/*! @} */ - -/*! @name VID2 - Version ID Register (LS) */ -/*! @{ */ - -#define TRNG_VID2_CONFIG_OPT_MASK (0xFFU) -#define TRNG_VID2_CONFIG_OPT_SHIFT (0U) -/*! CONFIG_OPT - * 0b00000000..TRNG_CONFIG_OPT for TRNG. - */ -#define TRNG_VID2_CONFIG_OPT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_CONFIG_OPT_SHIFT)) & TRNG_VID2_CONFIG_OPT_MASK) - -#define TRNG_VID2_ECO_REV_MASK (0xFF00U) -#define TRNG_VID2_ECO_REV_SHIFT (8U) -/*! ECO_REV - * 0b00000000..TRNG_ECO_REV for TRNG. - */ -#define TRNG_VID2_ECO_REV(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_ECO_REV_SHIFT)) & TRNG_VID2_ECO_REV_MASK) - -#define TRNG_VID2_INTG_OPT_MASK (0xFF0000U) -#define TRNG_VID2_INTG_OPT_SHIFT (16U) -/*! INTG_OPT - * 0b00000000..INTG_OPT for TRNG. - */ -#define TRNG_VID2_INTG_OPT(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_INTG_OPT_SHIFT)) & TRNG_VID2_INTG_OPT_MASK) - -#define TRNG_VID2_ERA_MASK (0xFF000000U) -#define TRNG_VID2_ERA_SHIFT (24U) -/*! ERA - * 0b00000000..COMPILE_OPT for TRNG. - */ -#define TRNG_VID2_ERA(x) (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_ERA_SHIFT)) & TRNG_VID2_ERA_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group TRNG_Register_Masks */ - - -/* TRNG - Peripheral instance base addresses */ -/** Peripheral TRNG base address */ -#define TRNG_BASE (0x400CC000u) -/** Peripheral TRNG base pointer */ -#define TRNG ((TRNG_Type *)TRNG_BASE) -/** Array initializer of TRNG peripheral base addresses */ -#define TRNG_BASE_ADDRS { TRNG_BASE } -/** Array initializer of TRNG peripheral base pointers */ -#define TRNG_BASE_PTRS { TRNG } -/** Interrupt vectors for the TRNG peripheral type */ -#define TRNG_IRQS { TRNG_IRQn } - -/*! - * @} - */ /* end of group TRNG_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- TSC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TSC_Peripheral_Access_Layer TSC Peripheral Access Layer - * @{ - */ - -/** TSC - Register Layout Typedef */ -typedef struct { - __IO uint32_t BASIC_SETTING; /**< Basic Setting, offset: 0x0 */ - uint8_t RESERVED_0[12]; - __IO uint32_t PRE_CHARGE_TIME; /**< Pre-charge Time, offset: 0x10 */ - uint8_t RESERVED_1[12]; - __IO uint32_t FLOW_CONTROL; /**< Flow Control, offset: 0x20 */ - uint8_t RESERVED_2[12]; - __I uint32_t MEASEURE_VALUE; /**< Measure Value, offset: 0x30 */ - uint8_t RESERVED_3[12]; - __IO uint32_t INT_EN; /**< Interrupt Enable, offset: 0x40 */ - uint8_t RESERVED_4[12]; - __IO uint32_t INT_SIG_EN; /**< Interrupt Signal Enable, offset: 0x50 */ - uint8_t RESERVED_5[12]; - __IO uint32_t INT_STATUS; /**< Intterrupt Status, offset: 0x60 */ - uint8_t RESERVED_6[12]; - __IO uint32_t DEBUG_MODE; /**< Debug Mode Register, offset: 0x70 */ - uint8_t RESERVED_7[12]; - __IO uint32_t DEBUG_MODE2; /**< Debug Mode Register 2, offset: 0x80 */ -} TSC_Type; - -/* ---------------------------------------------------------------------------- - -- TSC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup TSC_Register_Masks TSC Register Masks - * @{ - */ - -/*! @name BASIC_SETTING - Basic Setting */ -/*! @{ */ - -#define TSC_BASIC_SETTING_AUTO_MEASURE_MASK (0x1U) -#define TSC_BASIC_SETTING_AUTO_MEASURE_SHIFT (0U) -/*! AUTO_MEASURE - Auto Measure - * 0b0..Disable Auto Measure - * 0b1..Auto Measure - */ -#define TSC_BASIC_SETTING_AUTO_MEASURE(x) (((uint32_t)(((uint32_t)(x)) << TSC_BASIC_SETTING_AUTO_MEASURE_SHIFT)) & TSC_BASIC_SETTING_AUTO_MEASURE_MASK) - -#define TSC_BASIC_SETTING_WIRE_4_5_MASK (0x10U) -#define TSC_BASIC_SETTING_WIRE_4_5_SHIFT (4U) -/*! WIRE_4_5 - 4/5 Wire detection - * 0b0..4-Wire Detection Mode - * 0b1..5-Wire Detection Mode - */ -#define TSC_BASIC_SETTING_WIRE_4_5(x) (((uint32_t)(((uint32_t)(x)) << TSC_BASIC_SETTING_WIRE_4_5_SHIFT)) & TSC_BASIC_SETTING_WIRE_4_5_MASK) - -#define TSC_BASIC_SETTING_MEASURE_DELAY_TIME_MASK (0xFFFFFF00U) -#define TSC_BASIC_SETTING_MEASURE_DELAY_TIME_SHIFT (8U) -/*! MEASURE_DELAY_TIME - Measure Delay Time - */ -#define TSC_BASIC_SETTING_MEASURE_DELAY_TIME(x) (((uint32_t)(((uint32_t)(x)) << TSC_BASIC_SETTING_MEASURE_DELAY_TIME_SHIFT)) & TSC_BASIC_SETTING_MEASURE_DELAY_TIME_MASK) -/*! @} */ - -/*! @name PRE_CHARGE_TIME - Pre-charge Time */ -/*! @{ */ - -#define TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME_MASK (0xFFFFFFFFU) -#define TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME_SHIFT (0U) -#define TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME(x) (((uint32_t)(((uint32_t)(x)) << TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME_SHIFT)) & TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME_MASK) -/*! @} */ - -/*! @name FLOW_CONTROL - Flow Control */ -/*! @{ */ - -#define TSC_FLOW_CONTROL_SW_RST_MASK (0x1U) -#define TSC_FLOW_CONTROL_SW_RST_SHIFT (0U) -/*! SW_RST - Soft Reset - */ -#define TSC_FLOW_CONTROL_SW_RST(x) (((uint32_t)(((uint32_t)(x)) << TSC_FLOW_CONTROL_SW_RST_SHIFT)) & TSC_FLOW_CONTROL_SW_RST_MASK) - -#define TSC_FLOW_CONTROL_START_MEASURE_MASK (0x10U) -#define TSC_FLOW_CONTROL_START_MEASURE_SHIFT (4U) -/*! START_MEASURE - Start Measure - * 0b0..Do not start measure for now - * 0b1..Start measure the X/Y coordinate value - */ -#define TSC_FLOW_CONTROL_START_MEASURE(x) (((uint32_t)(((uint32_t)(x)) << TSC_FLOW_CONTROL_START_MEASURE_SHIFT)) & TSC_FLOW_CONTROL_START_MEASURE_MASK) - -#define TSC_FLOW_CONTROL_DROP_MEASURE_MASK (0x100U) -#define TSC_FLOW_CONTROL_DROP_MEASURE_SHIFT (8U) -/*! DROP_MEASURE - Drop Measure - * 0b0..Do not drop measure for now - * 0b1..Drop the measure and controller return to idle status - */ -#define TSC_FLOW_CONTROL_DROP_MEASURE(x) (((uint32_t)(((uint32_t)(x)) << TSC_FLOW_CONTROL_DROP_MEASURE_SHIFT)) & TSC_FLOW_CONTROL_DROP_MEASURE_MASK) - -#define TSC_FLOW_CONTROL_START_SENSE_MASK (0x1000U) -#define TSC_FLOW_CONTROL_START_SENSE_SHIFT (12U) -/*! START_SENSE - Start Sense - * 0b0..Stay at idle status - * 0b1..Start sense detection and (if auto_measure set to 1) measure after detect a touch - */ -#define TSC_FLOW_CONTROL_START_SENSE(x) (((uint32_t)(((uint32_t)(x)) << TSC_FLOW_CONTROL_START_SENSE_SHIFT)) & TSC_FLOW_CONTROL_START_SENSE_MASK) - -#define TSC_FLOW_CONTROL_DISABLE_MASK (0x10000U) -#define TSC_FLOW_CONTROL_DISABLE_SHIFT (16U) -/*! DISABLE - * 0b0..Leave HW state machine control - * 0b1..SW set to idle status - */ -#define TSC_FLOW_CONTROL_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << TSC_FLOW_CONTROL_DISABLE_SHIFT)) & TSC_FLOW_CONTROL_DISABLE_MASK) -/*! @} */ - -/*! @name MEASEURE_VALUE - Measure Value */ -/*! @{ */ - -#define TSC_MEASEURE_VALUE_Y_VALUE_MASK (0xFFFU) -#define TSC_MEASEURE_VALUE_Y_VALUE_SHIFT (0U) -/*! Y_VALUE - Y Value - */ -#define TSC_MEASEURE_VALUE_Y_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TSC_MEASEURE_VALUE_Y_VALUE_SHIFT)) & TSC_MEASEURE_VALUE_Y_VALUE_MASK) - -#define TSC_MEASEURE_VALUE_X_VALUE_MASK (0xFFF0000U) -#define TSC_MEASEURE_VALUE_X_VALUE_SHIFT (16U) -/*! X_VALUE - X Value - */ -#define TSC_MEASEURE_VALUE_X_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TSC_MEASEURE_VALUE_X_VALUE_SHIFT)) & TSC_MEASEURE_VALUE_X_VALUE_MASK) -/*! @} */ - -/*! @name INT_EN - Interrupt Enable */ -/*! @{ */ - -#define TSC_INT_EN_MEASURE_INT_EN_MASK (0x1U) -#define TSC_INT_EN_MEASURE_INT_EN_SHIFT (0U) -/*! MEASURE_INT_EN - Measure Interrupt Enable - * 0b0..Disable measure interrupt - * 0b1..Enable measure interrupt - */ -#define TSC_INT_EN_MEASURE_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_EN_MEASURE_INT_EN_SHIFT)) & TSC_INT_EN_MEASURE_INT_EN_MASK) - -#define TSC_INT_EN_DETECT_INT_EN_MASK (0x10U) -#define TSC_INT_EN_DETECT_INT_EN_SHIFT (4U) -/*! DETECT_INT_EN - Detect Interrupt Enable - * 0b0..Disable detect interrupt - * 0b1..Enable detect interrupt - */ -#define TSC_INT_EN_DETECT_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_EN_DETECT_INT_EN_SHIFT)) & TSC_INT_EN_DETECT_INT_EN_MASK) - -#define TSC_INT_EN_IDLE_SW_INT_EN_MASK (0x1000U) -#define TSC_INT_EN_IDLE_SW_INT_EN_SHIFT (12U) -/*! IDLE_SW_INT_EN - Idle Software Interrupt Enable - * 0b0..Disable idle software interrupt - * 0b1..Enable idle software interrupt - */ -#define TSC_INT_EN_IDLE_SW_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_EN_IDLE_SW_INT_EN_SHIFT)) & TSC_INT_EN_IDLE_SW_INT_EN_MASK) -/*! @} */ - -/*! @name INT_SIG_EN - Interrupt Signal Enable */ -/*! @{ */ - -#define TSC_INT_SIG_EN_MEASURE_SIG_EN_MASK (0x1U) -#define TSC_INT_SIG_EN_MEASURE_SIG_EN_SHIFT (0U) -/*! MEASURE_SIG_EN - Measure Signal Enable - */ -#define TSC_INT_SIG_EN_MEASURE_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_SIG_EN_MEASURE_SIG_EN_SHIFT)) & TSC_INT_SIG_EN_MEASURE_SIG_EN_MASK) - -#define TSC_INT_SIG_EN_DETECT_SIG_EN_MASK (0x10U) -#define TSC_INT_SIG_EN_DETECT_SIG_EN_SHIFT (4U) -/*! DETECT_SIG_EN - Detect Signal Enable - * 0b0..Disable detect signal - * 0b1..Enable detect signal - */ -#define TSC_INT_SIG_EN_DETECT_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_SIG_EN_DETECT_SIG_EN_SHIFT)) & TSC_INT_SIG_EN_DETECT_SIG_EN_MASK) - -#define TSC_INT_SIG_EN_VALID_SIG_EN_MASK (0x100U) -#define TSC_INT_SIG_EN_VALID_SIG_EN_SHIFT (8U) -/*! VALID_SIG_EN - Valid Signal Enable - * 0b0..Disable valid signal - * 0b1..Enable valid signal - */ -#define TSC_INT_SIG_EN_VALID_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_SIG_EN_VALID_SIG_EN_SHIFT)) & TSC_INT_SIG_EN_VALID_SIG_EN_MASK) - -#define TSC_INT_SIG_EN_IDLE_SW_SIG_EN_MASK (0x1000U) -#define TSC_INT_SIG_EN_IDLE_SW_SIG_EN_SHIFT (12U) -/*! IDLE_SW_SIG_EN - Idle Software Signal Enable - * 0b0..Disable idle software signal - * 0b1..Enable idle software signal - */ -#define TSC_INT_SIG_EN_IDLE_SW_SIG_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_SIG_EN_IDLE_SW_SIG_EN_SHIFT)) & TSC_INT_SIG_EN_IDLE_SW_SIG_EN_MASK) -/*! @} */ - -/*! @name INT_STATUS - Intterrupt Status */ -/*! @{ */ - -#define TSC_INT_STATUS_MEASURE_MASK (0x1U) -#define TSC_INT_STATUS_MEASURE_SHIFT (0U) -/*! MEASURE - Measure Signal - * 0b0..Does not exist a measure signal - * 0b1..Exist a measure signal - */ -#define TSC_INT_STATUS_MEASURE(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_STATUS_MEASURE_SHIFT)) & TSC_INT_STATUS_MEASURE_MASK) - -#define TSC_INT_STATUS_DETECT_MASK (0x10U) -#define TSC_INT_STATUS_DETECT_SHIFT (4U) -/*! DETECT - Detect Signal - * 0b0..Does not exist a detect signal - * 0b1..Exist detect signal - */ -#define TSC_INT_STATUS_DETECT(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_STATUS_DETECT_SHIFT)) & TSC_INT_STATUS_DETECT_MASK) - -#define TSC_INT_STATUS_VALID_MASK (0x100U) -#define TSC_INT_STATUS_VALID_SHIFT (8U) -/*! VALID - Valid Signal - * 0b0..There is no touch detected after measurement, indicates that the measured value is not valid - * 0b1..There is touch detection after measurement, indicates that the measure is valid - */ -#define TSC_INT_STATUS_VALID(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_STATUS_VALID_SHIFT)) & TSC_INT_STATUS_VALID_MASK) - -#define TSC_INT_STATUS_IDLE_SW_MASK (0x1000U) -#define TSC_INT_STATUS_IDLE_SW_SHIFT (12U) -/*! IDLE_SW - Idle Software - * 0b0..Haven't return to idle status - * 0b1..Already return to idle status - */ -#define TSC_INT_STATUS_IDLE_SW(x) (((uint32_t)(((uint32_t)(x)) << TSC_INT_STATUS_IDLE_SW_SHIFT)) & TSC_INT_STATUS_IDLE_SW_MASK) -/*! @} */ - -/*! @name DEBUG_MODE - Debug Mode Register */ -/*! @{ */ - -#define TSC_DEBUG_MODE_ADC_CONV_VALUE_MASK (0xFFFU) -#define TSC_DEBUG_MODE_ADC_CONV_VALUE_SHIFT (0U) -/*! ADC_CONV_VALUE - ADC Conversion Value - */ -#define TSC_DEBUG_MODE_ADC_CONV_VALUE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_ADC_CONV_VALUE_SHIFT)) & TSC_DEBUG_MODE_ADC_CONV_VALUE_MASK) - -#define TSC_DEBUG_MODE_ADC_COCO_MASK (0x1000U) -#define TSC_DEBUG_MODE_ADC_COCO_SHIFT (12U) -/*! ADC_COCO - ADC COCO Signal - */ -#define TSC_DEBUG_MODE_ADC_COCO(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_ADC_COCO_SHIFT)) & TSC_DEBUG_MODE_ADC_COCO_MASK) - -#define TSC_DEBUG_MODE_EXT_HWTS_MASK (0x1F0000U) -#define TSC_DEBUG_MODE_EXT_HWTS_SHIFT (16U) -/*! EXT_HWTS - Hardware Trigger Select Signal - */ -#define TSC_DEBUG_MODE_EXT_HWTS(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_EXT_HWTS_SHIFT)) & TSC_DEBUG_MODE_EXT_HWTS_MASK) - -#define TSC_DEBUG_MODE_TRIGGER_MASK (0x1000000U) -#define TSC_DEBUG_MODE_TRIGGER_SHIFT (24U) -/*! TRIGGER - Trigger - * 0b0..No hardware trigger signal - * 0b1..Hardware trigger signal, the signal must last at least 1 ips clock period - */ -#define TSC_DEBUG_MODE_TRIGGER(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_TRIGGER_SHIFT)) & TSC_DEBUG_MODE_TRIGGER_MASK) - -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR_MASK (0x2000000U) -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR_SHIFT (25U) -/*! ADC_COCO_CLEAR - ADC Coco Clear - * 0b0..No ADC COCO clear - * 0b1..Set ADC COCO clear - */ -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_ADC_COCO_CLEAR_SHIFT)) & TSC_DEBUG_MODE_ADC_COCO_CLEAR_MASK) - -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_MASK (0x4000000U) -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_SHIFT (26U) -/*! ADC_COCO_CLEAR_DISABLE - ADC COCO Clear Disable - * 0b0..Allow TSC hardware generates ADC COCO clear - * 0b1..Prevent TSC from generate ADC COCO clear signal - */ -#define TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_SHIFT)) & TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_MASK) - -#define TSC_DEBUG_MODE_DEBUG_EN_MASK (0x10000000U) -#define TSC_DEBUG_MODE_DEBUG_EN_SHIFT (28U) -/*! DEBUG_EN - Debug Enable - * 0b0..Enable debug mode - * 0b1..Disable debug mode - */ -#define TSC_DEBUG_MODE_DEBUG_EN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE_DEBUG_EN_SHIFT)) & TSC_DEBUG_MODE_DEBUG_EN_MASK) -/*! @} */ - -/*! @name DEBUG_MODE2 - Debug Mode Register 2 */ -/*! @{ */ - -#define TSC_DEBUG_MODE2_XPUL_PULL_DOWN_MASK (0x1U) -#define TSC_DEBUG_MODE2_XPUL_PULL_DOWN_SHIFT (0U) -/*! XPUL_PULL_DOWN - XPUL Wire Pull Down Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XPUL_PULL_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XPUL_PULL_DOWN_SHIFT)) & TSC_DEBUG_MODE2_XPUL_PULL_DOWN_MASK) - -#define TSC_DEBUG_MODE2_XPUL_PULL_UP_MASK (0x2U) -#define TSC_DEBUG_MODE2_XPUL_PULL_UP_SHIFT (1U) -/*! XPUL_PULL_UP - XPUL Wire Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XPUL_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XPUL_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_XPUL_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_XPUL_200K_PULL_UP_MASK (0x4U) -#define TSC_DEBUG_MODE2_XPUL_200K_PULL_UP_SHIFT (2U) -/*! XPUL_200K_PULL_UP - XPUL Wire 200K Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XPUL_200K_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XPUL_200K_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_XPUL_200K_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_XNUR_PULL_DOWN_MASK (0x8U) -#define TSC_DEBUG_MODE2_XNUR_PULL_DOWN_SHIFT (3U) -/*! XNUR_PULL_DOWN - XNUR Wire Pull Down Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XNUR_PULL_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XNUR_PULL_DOWN_SHIFT)) & TSC_DEBUG_MODE2_XNUR_PULL_DOWN_MASK) - -#define TSC_DEBUG_MODE2_XNUR_PULL_UP_MASK (0x10U) -#define TSC_DEBUG_MODE2_XNUR_PULL_UP_SHIFT (4U) -/*! XNUR_PULL_UP - XNUR Wire Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XNUR_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XNUR_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_XNUR_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_XNUR_200K_PULL_UP_MASK (0x20U) -#define TSC_DEBUG_MODE2_XNUR_200K_PULL_UP_SHIFT (5U) -/*! XNUR_200K_PULL_UP - XNUR Wire 200K Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_XNUR_200K_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_XNUR_200K_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_XNUR_200K_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_YPLL_PULL_DOWN_MASK (0x40U) -#define TSC_DEBUG_MODE2_YPLL_PULL_DOWN_SHIFT (6U) -/*! YPLL_PULL_DOWN - YPLL Wire Pull Down Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_YPLL_PULL_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YPLL_PULL_DOWN_SHIFT)) & TSC_DEBUG_MODE2_YPLL_PULL_DOWN_MASK) - -#define TSC_DEBUG_MODE2_YPLL_PULL_UP_MASK (0x80U) -#define TSC_DEBUG_MODE2_YPLL_PULL_UP_SHIFT (7U) -/*! YPLL_PULL_UP - YPLL Wire Pull Up Switch - * 0b0..Close the switch - * 0b1..Open the switch - */ -#define TSC_DEBUG_MODE2_YPLL_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YPLL_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_YPLL_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_YPLL_200K_PULL_UP_MASK (0x100U) -#define TSC_DEBUG_MODE2_YPLL_200K_PULL_UP_SHIFT (8U) -/*! YPLL_200K_PULL_UP - YPLL Wire 200K Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_YPLL_200K_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YPLL_200K_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_YPLL_200K_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_YNLR_PULL_DOWN_MASK (0x200U) -#define TSC_DEBUG_MODE2_YNLR_PULL_DOWN_SHIFT (9U) -/*! YNLR_PULL_DOWN - YNLR Wire Pull Down Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_YNLR_PULL_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YNLR_PULL_DOWN_SHIFT)) & TSC_DEBUG_MODE2_YNLR_PULL_DOWN_MASK) - -#define TSC_DEBUG_MODE2_YNLR_PULL_UP_MASK (0x400U) -#define TSC_DEBUG_MODE2_YNLR_PULL_UP_SHIFT (10U) -/*! YNLR_PULL_UP - YNLR Wire Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_YNLR_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YNLR_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_YNLR_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_YNLR_200K_PULL_UP_MASK (0x800U) -#define TSC_DEBUG_MODE2_YNLR_200K_PULL_UP_SHIFT (11U) -/*! YNLR_200K_PULL_UP - YNLR Wire 200K Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_YNLR_200K_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_YNLR_200K_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_YNLR_200K_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_WIPER_PULL_DOWN_MASK (0x1000U) -#define TSC_DEBUG_MODE2_WIPER_PULL_DOWN_SHIFT (12U) -/*! WIPER_PULL_DOWN - Wiper Wire Pull Down Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_WIPER_PULL_DOWN(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_WIPER_PULL_DOWN_SHIFT)) & TSC_DEBUG_MODE2_WIPER_PULL_DOWN_MASK) - -#define TSC_DEBUG_MODE2_WIPER_PULL_UP_MASK (0x2000U) -#define TSC_DEBUG_MODE2_WIPER_PULL_UP_SHIFT (13U) -/*! WIPER_PULL_UP - Wiper Wire Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_WIPER_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_WIPER_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_WIPER_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_WIPER_200K_PULL_UP_MASK (0x4000U) -#define TSC_DEBUG_MODE2_WIPER_200K_PULL_UP_SHIFT (14U) -/*! WIPER_200K_PULL_UP - Wiper Wire 200K Pull Up Switch - * 0b0..Close the switch - * 0b1..Open up the switch - */ -#define TSC_DEBUG_MODE2_WIPER_200K_PULL_UP(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_WIPER_200K_PULL_UP_SHIFT)) & TSC_DEBUG_MODE2_WIPER_200K_PULL_UP_MASK) - -#define TSC_DEBUG_MODE2_DETECT_FOUR_WIRE_MASK (0x10000U) -#define TSC_DEBUG_MODE2_DETECT_FOUR_WIRE_SHIFT (16U) -/*! DETECT_FOUR_WIRE - Detect Four Wire - * 0b0..No detect signal - * 0b1..Yes, there is a detect on the touch screen. - */ -#define TSC_DEBUG_MODE2_DETECT_FOUR_WIRE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_DETECT_FOUR_WIRE_SHIFT)) & TSC_DEBUG_MODE2_DETECT_FOUR_WIRE_MASK) - -#define TSC_DEBUG_MODE2_DETECT_FIVE_WIRE_MASK (0x20000U) -#define TSC_DEBUG_MODE2_DETECT_FIVE_WIRE_SHIFT (17U) -/*! DETECT_FIVE_WIRE - Detect Five Wire - * 0b0..No detect signal - * 0b1..Yes, there is a detect on the touch screen. - */ -#define TSC_DEBUG_MODE2_DETECT_FIVE_WIRE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_DETECT_FIVE_WIRE_SHIFT)) & TSC_DEBUG_MODE2_DETECT_FIVE_WIRE_MASK) - -#define TSC_DEBUG_MODE2_STATE_MACHINE_MASK (0x700000U) -#define TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT (20U) -/*! STATE_MACHINE - State Machine - * 0b000..Idle - * 0b001..Pre-charge - * 0b010..Detect - * 0b011..X-measure - * 0b100..Y-measure - * 0b101..Pre-charge - * 0b110..Detect - */ -#define TSC_DEBUG_MODE2_STATE_MACHINE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT)) & TSC_DEBUG_MODE2_STATE_MACHINE_MASK) - -#define TSC_DEBUG_MODE2_INTERMEDIATE_MASK (0x800000U) -#define TSC_DEBUG_MODE2_INTERMEDIATE_SHIFT (23U) -/*! INTERMEDIATE - Intermediate State - * 0b0..Not in intermedia - * 0b1..Intermedia - */ -#define TSC_DEBUG_MODE2_INTERMEDIATE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_INTERMEDIATE_SHIFT)) & TSC_DEBUG_MODE2_INTERMEDIATE_MASK) - -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_MASK (0x1000000U) -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_SHIFT (24U) -/*! DETECT_ENABLE_FOUR_WIRE - Detect Enable Four Wire - * 0b0..Do not read four wire detect value, read default value from analogue - * 0b1..Read four wire detect status from analogue - */ -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_SHIFT)) & TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_MASK) - -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_MASK (0x10000000U) -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_SHIFT (28U) -/*! DETECT_ENABLE_FIVE_WIRE - Detect Enable Five Wire - * 0b0..Do not read five wire detect value, read default value from analogue - * 0b1..Read five wire detect status from analogue - */ -#define TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_SHIFT)) & TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_MASK) - -#define TSC_DEBUG_MODE2_DE_GLITCH_MASK (0x60000000U) -#define TSC_DEBUG_MODE2_DE_GLITCH_SHIFT (29U) -/*! DE_GLITCH - * 0b00..Normal function: 0x1fff ipg clock cycles; Low power mode: 0x9 low power clock cycles - * 0b01..Normal function: 0xfff ipg clock cycles; Low power mode: :0x7 low power clock cycles - * 0b10..Normal function: 0x7ff ipg clock cycles; Low power mode:0x5 low power clock cycles - * 0b11..Normal function: 0x3 ipg clock cycles; Low power mode:0x3 low power clock cycles - */ -#define TSC_DEBUG_MODE2_DE_GLITCH(x) (((uint32_t)(((uint32_t)(x)) << TSC_DEBUG_MODE2_DE_GLITCH_SHIFT)) & TSC_DEBUG_MODE2_DE_GLITCH_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group TSC_Register_Masks */ - - -/* TSC - Peripheral instance base addresses */ -/** Peripheral TSC base address */ -#define TSC_BASE (0x400E0000u) -/** Peripheral TSC base pointer */ -#define TSC ((TSC_Type *)TSC_BASE) -/** Array initializer of TSC peripheral base addresses */ -#define TSC_BASE_ADDRS { TSC_BASE } -/** Array initializer of TSC peripheral base pointers */ -#define TSC_BASE_PTRS { TSC } -/** Interrupt vectors for the TSC peripheral type */ -#define TSC_IRQS { TSC_DIG_IRQn } -/* Backward compatibility */ -#define TSC_BASIC_SETTING__4_5_WIRE_MASK TSC_BASIC_SETTING_WIRE_4_5_MASK -#define TSC_BASIC_SETTING__4_5_WIRE_SHIFT TSC_BASIC_SETTING_WIRE_4_5_SHIFT -#define TSC_BASIC_SETTING__4_5_WIRE(x) TSC_BASIC_SETTING_WIRE_4_5(x) - - -/*! - * @} - */ /* end of group TSC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- USB Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USB_Peripheral_Access_Layer USB Peripheral Access Layer - * @{ - */ - -/** USB - Register Layout Typedef */ -typedef struct { - __I uint32_t ID; /**< Identification register, offset: 0x0 */ - __I uint32_t HWGENERAL; /**< Hardware General, offset: 0x4 */ - __I uint32_t HWHOST; /**< Host Hardware Parameters, offset: 0x8 */ - __I uint32_t HWDEVICE; /**< Device Hardware Parameters, offset: 0xC */ - __I uint32_t HWTXBUF; /**< TX Buffer Hardware Parameters, offset: 0x10 */ - __I uint32_t HWRXBUF; /**< RX Buffer Hardware Parameters, offset: 0x14 */ - uint8_t RESERVED_0[104]; - __IO uint32_t GPTIMER0LD; /**< General Purpose Timer #0 Load, offset: 0x80 */ - __IO uint32_t GPTIMER0CTRL; /**< General Purpose Timer #0 Controller, offset: 0x84 */ - __IO uint32_t GPTIMER1LD; /**< General Purpose Timer #1 Load, offset: 0x88 */ - __IO uint32_t GPTIMER1CTRL; /**< General Purpose Timer #1 Controller, offset: 0x8C */ - __IO uint32_t SBUSCFG; /**< System Bus Config, offset: 0x90 */ - uint8_t RESERVED_1[108]; - __I uint8_t CAPLENGTH; /**< Capability Registers Length, offset: 0x100 */ - uint8_t RESERVED_2[1]; - __I uint16_t HCIVERSION; /**< Host Controller Interface Version, offset: 0x102 */ - __I uint32_t HCSPARAMS; /**< Host Controller Structural Parameters, offset: 0x104 */ - __I uint32_t HCCPARAMS; /**< Host Controller Capability Parameters, offset: 0x108 */ - uint8_t RESERVED_3[20]; - __I uint16_t DCIVERSION; /**< Device Controller Interface Version, offset: 0x120 */ - uint8_t RESERVED_4[2]; - __I uint32_t DCCPARAMS; /**< Device Controller Capability Parameters, offset: 0x124 */ - uint8_t RESERVED_5[24]; - __IO uint32_t USBCMD; /**< USB Command Register, offset: 0x140 */ - __IO uint32_t USBSTS; /**< USB Status Register, offset: 0x144 */ - __IO uint32_t USBINTR; /**< Interrupt Enable Register, offset: 0x148 */ - __IO uint32_t FRINDEX; /**< USB Frame Index, offset: 0x14C */ - uint8_t RESERVED_6[4]; - union { /* offset: 0x154 */ - __IO uint32_t DEVICEADDR; /**< Device Address, offset: 0x154 */ - __IO uint32_t PERIODICLISTBASE; /**< Frame List Base Address, offset: 0x154 */ - }; - union { /* offset: 0x158 */ - __IO uint32_t ASYNCLISTADDR; /**< Next Asynch. Address, offset: 0x158 */ - __IO uint32_t ENDPTLISTADDR; /**< Endpoint List Address, offset: 0x158 */ - }; - uint8_t RESERVED_7[4]; - __IO uint32_t BURSTSIZE; /**< Programmable Burst Size, offset: 0x160 */ - __IO uint32_t TXFILLTUNING; /**< TX FIFO Fill Tuning, offset: 0x164 */ - uint8_t RESERVED_8[16]; - __IO uint32_t ENDPTNAK; /**< Endpoint NAK, offset: 0x178 */ - __IO uint32_t ENDPTNAKEN; /**< Endpoint NAK Enable, offset: 0x17C */ - __I uint32_t CONFIGFLAG; /**< Configure Flag Register, offset: 0x180 */ - __IO uint32_t PORTSC1; /**< Port Status & Control, offset: 0x184 */ - uint8_t RESERVED_9[28]; - __IO uint32_t OTGSC; /**< On-The-Go Status & control, offset: 0x1A4 */ - __IO uint32_t USBMODE; /**< USB Device Mode, offset: 0x1A8 */ - __IO uint32_t ENDPTSETUPSTAT; /**< Endpoint Setup Status, offset: 0x1AC */ - __IO uint32_t ENDPTPRIME; /**< Endpoint Prime, offset: 0x1B0 */ - __IO uint32_t ENDPTFLUSH; /**< Endpoint Flush, offset: 0x1B4 */ - __I uint32_t ENDPTSTAT; /**< Endpoint Status, offset: 0x1B8 */ - __IO uint32_t ENDPTCOMPLETE; /**< Endpoint Complete, offset: 0x1BC */ - __IO uint32_t ENDPTCTRL0; /**< Endpoint Control0, offset: 0x1C0 */ - __IO uint32_t ENDPTCTRL[7]; /**< Endpoint Control 1..Endpoint Control 7, array offset: 0x1C4, array step: 0x4 */ -} USB_Type; - -/* ---------------------------------------------------------------------------- - -- USB Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USB_Register_Masks USB Register Masks - * @{ - */ - -/*! @name ID - Identification register */ -/*! @{ */ - -#define USB_ID_ID_MASK (0x3FU) -#define USB_ID_ID_SHIFT (0U) -#define USB_ID_ID(x) (((uint32_t)(((uint32_t)(x)) << USB_ID_ID_SHIFT)) & USB_ID_ID_MASK) - -#define USB_ID_NID_MASK (0x3F00U) -#define USB_ID_NID_SHIFT (8U) -#define USB_ID_NID(x) (((uint32_t)(((uint32_t)(x)) << USB_ID_NID_SHIFT)) & USB_ID_NID_MASK) - -#define USB_ID_REVISION_MASK (0xFF0000U) -#define USB_ID_REVISION_SHIFT (16U) -#define USB_ID_REVISION(x) (((uint32_t)(((uint32_t)(x)) << USB_ID_REVISION_SHIFT)) & USB_ID_REVISION_MASK) -/*! @} */ - -/*! @name HWGENERAL - Hardware General */ -/*! @{ */ - -#define USB_HWGENERAL_PHYW_MASK (0x30U) -#define USB_HWGENERAL_PHYW_SHIFT (4U) -/*! PHYW - * 0b00..8 bit wide data bus Software non-programmable - * 0b01..16 bit wide data bus Software non-programmable - * 0b10..Reset to 8 bit wide data bus Software programmable - * 0b11..Reset to 16 bit wide data bus Software programmable - */ -#define USB_HWGENERAL_PHYW(x) (((uint32_t)(((uint32_t)(x)) << USB_HWGENERAL_PHYW_SHIFT)) & USB_HWGENERAL_PHYW_MASK) - -#define USB_HWGENERAL_PHYM_MASK (0x1C0U) -#define USB_HWGENERAL_PHYM_SHIFT (6U) -/*! PHYM - * 0b000..UTMI/UMTI+ - * 0b001..ULPI DDR - * 0b010..ULPI - * 0b011..Serial Only - * 0b100..Software programmable - reset to UTMI/UTMI+ - * 0b101..Software programmable - reset to ULPI DDR - * 0b110..Software programmable - reset to ULPI - * 0b111..Software programmable - reset to Serial - */ -#define USB_HWGENERAL_PHYM(x) (((uint32_t)(((uint32_t)(x)) << USB_HWGENERAL_PHYM_SHIFT)) & USB_HWGENERAL_PHYM_MASK) - -#define USB_HWGENERAL_SM_MASK (0x600U) -#define USB_HWGENERAL_SM_SHIFT (9U) -/*! SM - * 0b00..No Serial Engine, always use parallel signalling. - * 0b01..Serial Engine present, always use serial signalling for FS/LS. - * 0b10..Software programmable - Reset to use parallel signalling for FS/LS - * 0b11..Software programmable - Reset to use serial signalling for FS/LS - */ -#define USB_HWGENERAL_SM(x) (((uint32_t)(((uint32_t)(x)) << USB_HWGENERAL_SM_SHIFT)) & USB_HWGENERAL_SM_MASK) -/*! @} */ - -/*! @name HWHOST - Host Hardware Parameters */ -/*! @{ */ - -#define USB_HWHOST_HC_MASK (0x1U) -#define USB_HWHOST_HC_SHIFT (0U) -/*! HC - * 0b1..Supported - * 0b0..Not supported - */ -#define USB_HWHOST_HC(x) (((uint32_t)(((uint32_t)(x)) << USB_HWHOST_HC_SHIFT)) & USB_HWHOST_HC_MASK) - -#define USB_HWHOST_NPORT_MASK (0xEU) -#define USB_HWHOST_NPORT_SHIFT (1U) -#define USB_HWHOST_NPORT(x) (((uint32_t)(((uint32_t)(x)) << USB_HWHOST_NPORT_SHIFT)) & USB_HWHOST_NPORT_MASK) -/*! @} */ - -/*! @name HWDEVICE - Device Hardware Parameters */ -/*! @{ */ - -#define USB_HWDEVICE_DC_MASK (0x1U) -#define USB_HWDEVICE_DC_SHIFT (0U) -/*! DC - * 0b1..Supported - * 0b0..Not supported - */ -#define USB_HWDEVICE_DC(x) (((uint32_t)(((uint32_t)(x)) << USB_HWDEVICE_DC_SHIFT)) & USB_HWDEVICE_DC_MASK) - -#define USB_HWDEVICE_DEVEP_MASK (0x3EU) -#define USB_HWDEVICE_DEVEP_SHIFT (1U) -#define USB_HWDEVICE_DEVEP(x) (((uint32_t)(((uint32_t)(x)) << USB_HWDEVICE_DEVEP_SHIFT)) & USB_HWDEVICE_DEVEP_MASK) -/*! @} */ - -/*! @name HWTXBUF - TX Buffer Hardware Parameters */ -/*! @{ */ - -#define USB_HWTXBUF_TXBURST_MASK (0xFFU) -#define USB_HWTXBUF_TXBURST_SHIFT (0U) -#define USB_HWTXBUF_TXBURST(x) (((uint32_t)(((uint32_t)(x)) << USB_HWTXBUF_TXBURST_SHIFT)) & USB_HWTXBUF_TXBURST_MASK) - -#define USB_HWTXBUF_TXCHANADD_MASK (0xFF0000U) -#define USB_HWTXBUF_TXCHANADD_SHIFT (16U) -#define USB_HWTXBUF_TXCHANADD(x) (((uint32_t)(((uint32_t)(x)) << USB_HWTXBUF_TXCHANADD_SHIFT)) & USB_HWTXBUF_TXCHANADD_MASK) -/*! @} */ - -/*! @name HWRXBUF - RX Buffer Hardware Parameters */ -/*! @{ */ - -#define USB_HWRXBUF_RXBURST_MASK (0xFFU) -#define USB_HWRXBUF_RXBURST_SHIFT (0U) -#define USB_HWRXBUF_RXBURST(x) (((uint32_t)(((uint32_t)(x)) << USB_HWRXBUF_RXBURST_SHIFT)) & USB_HWRXBUF_RXBURST_MASK) - -#define USB_HWRXBUF_RXADD_MASK (0xFF00U) -#define USB_HWRXBUF_RXADD_SHIFT (8U) -#define USB_HWRXBUF_RXADD(x) (((uint32_t)(((uint32_t)(x)) << USB_HWRXBUF_RXADD_SHIFT)) & USB_HWRXBUF_RXADD_MASK) -/*! @} */ - -/*! @name GPTIMER0LD - General Purpose Timer #0 Load */ -/*! @{ */ - -#define USB_GPTIMER0LD_GPTLD_MASK (0xFFFFFFU) -#define USB_GPTIMER0LD_GPTLD_SHIFT (0U) -#define USB_GPTIMER0LD_GPTLD(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER0LD_GPTLD_SHIFT)) & USB_GPTIMER0LD_GPTLD_MASK) -/*! @} */ - -/*! @name GPTIMER0CTRL - General Purpose Timer #0 Controller */ -/*! @{ */ - -#define USB_GPTIMER0CTRL_GPTCNT_MASK (0xFFFFFFU) -#define USB_GPTIMER0CTRL_GPTCNT_SHIFT (0U) -#define USB_GPTIMER0CTRL_GPTCNT(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER0CTRL_GPTCNT_SHIFT)) & USB_GPTIMER0CTRL_GPTCNT_MASK) - -#define USB_GPTIMER0CTRL_GPTMODE_MASK (0x1000000U) -#define USB_GPTIMER0CTRL_GPTMODE_SHIFT (24U) -/*! GPTMODE - * 0b0..One Shot Mode - * 0b1..Repeat Mode - */ -#define USB_GPTIMER0CTRL_GPTMODE(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER0CTRL_GPTMODE_SHIFT)) & USB_GPTIMER0CTRL_GPTMODE_MASK) - -#define USB_GPTIMER0CTRL_GPTRST_MASK (0x40000000U) -#define USB_GPTIMER0CTRL_GPTRST_SHIFT (30U) -/*! GPTRST - * 0b0..No action - * 0b1..Load counter value from GPTLD bits in n_GPTIMER0LD - */ -#define USB_GPTIMER0CTRL_GPTRST(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER0CTRL_GPTRST_SHIFT)) & USB_GPTIMER0CTRL_GPTRST_MASK) - -#define USB_GPTIMER0CTRL_GPTRUN_MASK (0x80000000U) -#define USB_GPTIMER0CTRL_GPTRUN_SHIFT (31U) -/*! GPTRUN - * 0b0..Stop counting - * 0b1..Run - */ -#define USB_GPTIMER0CTRL_GPTRUN(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER0CTRL_GPTRUN_SHIFT)) & USB_GPTIMER0CTRL_GPTRUN_MASK) -/*! @} */ - -/*! @name GPTIMER1LD - General Purpose Timer #1 Load */ -/*! @{ */ - -#define USB_GPTIMER1LD_GPTLD_MASK (0xFFFFFFU) -#define USB_GPTIMER1LD_GPTLD_SHIFT (0U) -#define USB_GPTIMER1LD_GPTLD(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER1LD_GPTLD_SHIFT)) & USB_GPTIMER1LD_GPTLD_MASK) -/*! @} */ - -/*! @name GPTIMER1CTRL - General Purpose Timer #1 Controller */ -/*! @{ */ - -#define USB_GPTIMER1CTRL_GPTCNT_MASK (0xFFFFFFU) -#define USB_GPTIMER1CTRL_GPTCNT_SHIFT (0U) -#define USB_GPTIMER1CTRL_GPTCNT(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER1CTRL_GPTCNT_SHIFT)) & USB_GPTIMER1CTRL_GPTCNT_MASK) - -#define USB_GPTIMER1CTRL_GPTMODE_MASK (0x1000000U) -#define USB_GPTIMER1CTRL_GPTMODE_SHIFT (24U) -/*! GPTMODE - * 0b0..One Shot Mode - * 0b1..Repeat Mode - */ -#define USB_GPTIMER1CTRL_GPTMODE(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER1CTRL_GPTMODE_SHIFT)) & USB_GPTIMER1CTRL_GPTMODE_MASK) - -#define USB_GPTIMER1CTRL_GPTRST_MASK (0x40000000U) -#define USB_GPTIMER1CTRL_GPTRST_SHIFT (30U) -/*! GPTRST - * 0b0..No action - * 0b1..Load counter value from GPTLD bits in USB_n_GPTIMER0LD - */ -#define USB_GPTIMER1CTRL_GPTRST(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER1CTRL_GPTRST_SHIFT)) & USB_GPTIMER1CTRL_GPTRST_MASK) - -#define USB_GPTIMER1CTRL_GPTRUN_MASK (0x80000000U) -#define USB_GPTIMER1CTRL_GPTRUN_SHIFT (31U) -/*! GPTRUN - * 0b0..Stop counting - * 0b1..Run - */ -#define USB_GPTIMER1CTRL_GPTRUN(x) (((uint32_t)(((uint32_t)(x)) << USB_GPTIMER1CTRL_GPTRUN_SHIFT)) & USB_GPTIMER1CTRL_GPTRUN_MASK) -/*! @} */ - -/*! @name SBUSCFG - System Bus Config */ -/*! @{ */ - -#define USB_SBUSCFG_AHBBRST_MASK (0x7U) -#define USB_SBUSCFG_AHBBRST_SHIFT (0U) -/*! AHBBRST - * 0b000..Incremental burst of unspecified length only - * 0b001..INCR4 burst, then single transfer - * 0b010..INCR8 burst, INCR4 burst, then single transfer - * 0b011..INCR16 burst, INCR8 burst, INCR4 burst, then single transfer - * 0b100..Reserved, don't use - * 0b101..INCR4 burst, then incremental burst of unspecified length - * 0b110..INCR8 burst, INCR4 burst, then incremental burst of unspecified length - * 0b111..INCR16 burst, INCR8 burst, INCR4 burst, then incremental burst of unspecified length - */ -#define USB_SBUSCFG_AHBBRST(x) (((uint32_t)(((uint32_t)(x)) << USB_SBUSCFG_AHBBRST_SHIFT)) & USB_SBUSCFG_AHBBRST_MASK) -/*! @} */ - -/*! @name CAPLENGTH - Capability Registers Length */ -/*! @{ */ - -#define USB_CAPLENGTH_CAPLENGTH_MASK (0xFFU) -#define USB_CAPLENGTH_CAPLENGTH_SHIFT (0U) -#define USB_CAPLENGTH_CAPLENGTH(x) (((uint8_t)(((uint8_t)(x)) << USB_CAPLENGTH_CAPLENGTH_SHIFT)) & USB_CAPLENGTH_CAPLENGTH_MASK) -/*! @} */ - -/*! @name HCIVERSION - Host Controller Interface Version */ -/*! @{ */ - -#define USB_HCIVERSION_HCIVERSION_MASK (0xFFFFU) -#define USB_HCIVERSION_HCIVERSION_SHIFT (0U) -#define USB_HCIVERSION_HCIVERSION(x) (((uint16_t)(((uint16_t)(x)) << USB_HCIVERSION_HCIVERSION_SHIFT)) & USB_HCIVERSION_HCIVERSION_MASK) -/*! @} */ - -/*! @name HCSPARAMS - Host Controller Structural Parameters */ -/*! @{ */ - -#define USB_HCSPARAMS_N_PORTS_MASK (0xFU) -#define USB_HCSPARAMS_N_PORTS_SHIFT (0U) -#define USB_HCSPARAMS_N_PORTS(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_N_PORTS_SHIFT)) & USB_HCSPARAMS_N_PORTS_MASK) - -#define USB_HCSPARAMS_PPC_MASK (0x10U) -#define USB_HCSPARAMS_PPC_SHIFT (4U) -#define USB_HCSPARAMS_PPC(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_PPC_SHIFT)) & USB_HCSPARAMS_PPC_MASK) - -#define USB_HCSPARAMS_N_PCC_MASK (0xF00U) -#define USB_HCSPARAMS_N_PCC_SHIFT (8U) -#define USB_HCSPARAMS_N_PCC(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_N_PCC_SHIFT)) & USB_HCSPARAMS_N_PCC_MASK) - -#define USB_HCSPARAMS_N_CC_MASK (0xF000U) -#define USB_HCSPARAMS_N_CC_SHIFT (12U) -/*! N_CC - * 0b0000..There is no internal Companion Controller and port-ownership hand-off is not supported. - * 0b0001..There are internal companion controller(s) and port-ownership hand-offs is supported. - */ -#define USB_HCSPARAMS_N_CC(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_N_CC_SHIFT)) & USB_HCSPARAMS_N_CC_MASK) - -#define USB_HCSPARAMS_PI_MASK (0x10000U) -#define USB_HCSPARAMS_PI_SHIFT (16U) -#define USB_HCSPARAMS_PI(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_PI_SHIFT)) & USB_HCSPARAMS_PI_MASK) - -#define USB_HCSPARAMS_N_PTT_MASK (0xF00000U) -#define USB_HCSPARAMS_N_PTT_SHIFT (20U) -#define USB_HCSPARAMS_N_PTT(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_N_PTT_SHIFT)) & USB_HCSPARAMS_N_PTT_MASK) - -#define USB_HCSPARAMS_N_TT_MASK (0xF000000U) -#define USB_HCSPARAMS_N_TT_SHIFT (24U) -#define USB_HCSPARAMS_N_TT(x) (((uint32_t)(((uint32_t)(x)) << USB_HCSPARAMS_N_TT_SHIFT)) & USB_HCSPARAMS_N_TT_MASK) -/*! @} */ - -/*! @name HCCPARAMS - Host Controller Capability Parameters */ -/*! @{ */ - -#define USB_HCCPARAMS_ADC_MASK (0x1U) -#define USB_HCCPARAMS_ADC_SHIFT (0U) -#define USB_HCCPARAMS_ADC(x) (((uint32_t)(((uint32_t)(x)) << USB_HCCPARAMS_ADC_SHIFT)) & USB_HCCPARAMS_ADC_MASK) - -#define USB_HCCPARAMS_PFL_MASK (0x2U) -#define USB_HCCPARAMS_PFL_SHIFT (1U) -#define USB_HCCPARAMS_PFL(x) (((uint32_t)(((uint32_t)(x)) << USB_HCCPARAMS_PFL_SHIFT)) & USB_HCCPARAMS_PFL_MASK) - -#define USB_HCCPARAMS_ASP_MASK (0x4U) -#define USB_HCCPARAMS_ASP_SHIFT (2U) -#define USB_HCCPARAMS_ASP(x) (((uint32_t)(((uint32_t)(x)) << USB_HCCPARAMS_ASP_SHIFT)) & USB_HCCPARAMS_ASP_MASK) - -#define USB_HCCPARAMS_IST_MASK (0xF0U) -#define USB_HCCPARAMS_IST_SHIFT (4U) -#define USB_HCCPARAMS_IST(x) (((uint32_t)(((uint32_t)(x)) << USB_HCCPARAMS_IST_SHIFT)) & USB_HCCPARAMS_IST_MASK) - -#define USB_HCCPARAMS_EECP_MASK (0xFF00U) -#define USB_HCCPARAMS_EECP_SHIFT (8U) -#define USB_HCCPARAMS_EECP(x) (((uint32_t)(((uint32_t)(x)) << USB_HCCPARAMS_EECP_SHIFT)) & USB_HCCPARAMS_EECP_MASK) -/*! @} */ - -/*! @name DCIVERSION - Device Controller Interface Version */ -/*! @{ */ - -#define USB_DCIVERSION_DCIVERSION_MASK (0xFFFFU) -#define USB_DCIVERSION_DCIVERSION_SHIFT (0U) -#define USB_DCIVERSION_DCIVERSION(x) (((uint16_t)(((uint16_t)(x)) << USB_DCIVERSION_DCIVERSION_SHIFT)) & USB_DCIVERSION_DCIVERSION_MASK) -/*! @} */ - -/*! @name DCCPARAMS - Device Controller Capability Parameters */ -/*! @{ */ - -#define USB_DCCPARAMS_DEN_MASK (0x1FU) -#define USB_DCCPARAMS_DEN_SHIFT (0U) -#define USB_DCCPARAMS_DEN(x) (((uint32_t)(((uint32_t)(x)) << USB_DCCPARAMS_DEN_SHIFT)) & USB_DCCPARAMS_DEN_MASK) - -#define USB_DCCPARAMS_DC_MASK (0x80U) -#define USB_DCCPARAMS_DC_SHIFT (7U) -#define USB_DCCPARAMS_DC(x) (((uint32_t)(((uint32_t)(x)) << USB_DCCPARAMS_DC_SHIFT)) & USB_DCCPARAMS_DC_MASK) - -#define USB_DCCPARAMS_HC_MASK (0x100U) -#define USB_DCCPARAMS_HC_SHIFT (8U) -#define USB_DCCPARAMS_HC(x) (((uint32_t)(((uint32_t)(x)) << USB_DCCPARAMS_HC_SHIFT)) & USB_DCCPARAMS_HC_MASK) -/*! @} */ - -/*! @name USBCMD - USB Command Register */ -/*! @{ */ - -#define USB_USBCMD_RS_MASK (0x1U) -#define USB_USBCMD_RS_SHIFT (0U) -#define USB_USBCMD_RS(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_RS_SHIFT)) & USB_USBCMD_RS_MASK) - -#define USB_USBCMD_RST_MASK (0x2U) -#define USB_USBCMD_RST_SHIFT (1U) -#define USB_USBCMD_RST(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_RST_SHIFT)) & USB_USBCMD_RST_MASK) - -#define USB_USBCMD_FS_1_MASK (0xCU) -#define USB_USBCMD_FS_1_SHIFT (2U) -#define USB_USBCMD_FS_1(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_FS_1_SHIFT)) & USB_USBCMD_FS_1_MASK) - -#define USB_USBCMD_PSE_MASK (0x10U) -#define USB_USBCMD_PSE_SHIFT (4U) -/*! PSE - * 0b0..Do not process the Periodic Schedule - * 0b1..Use the PERIODICLISTBASE register to access the Periodic Schedule. - */ -#define USB_USBCMD_PSE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_PSE_SHIFT)) & USB_USBCMD_PSE_MASK) - -#define USB_USBCMD_ASE_MASK (0x20U) -#define USB_USBCMD_ASE_SHIFT (5U) -/*! ASE - * 0b0..Do not process the Asynchronous Schedule. - * 0b1..Use the ASYNCLISTADDR register to access the Asynchronous Schedule. - */ -#define USB_USBCMD_ASE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_ASE_SHIFT)) & USB_USBCMD_ASE_MASK) - -#define USB_USBCMD_IAA_MASK (0x40U) -#define USB_USBCMD_IAA_SHIFT (6U) -#define USB_USBCMD_IAA(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_IAA_SHIFT)) & USB_USBCMD_IAA_MASK) - -#define USB_USBCMD_ASP_MASK (0x300U) -#define USB_USBCMD_ASP_SHIFT (8U) -#define USB_USBCMD_ASP(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_ASP_SHIFT)) & USB_USBCMD_ASP_MASK) - -#define USB_USBCMD_ASPE_MASK (0x800U) -#define USB_USBCMD_ASPE_SHIFT (11U) -#define USB_USBCMD_ASPE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_ASPE_SHIFT)) & USB_USBCMD_ASPE_MASK) - -#define USB_USBCMD_ATDTW_MASK (0x1000U) -#define USB_USBCMD_ATDTW_SHIFT (12U) -#define USB_USBCMD_ATDTW(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_ATDTW_SHIFT)) & USB_USBCMD_ATDTW_MASK) - -#define USB_USBCMD_SUTW_MASK (0x2000U) -#define USB_USBCMD_SUTW_SHIFT (13U) -#define USB_USBCMD_SUTW(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_SUTW_SHIFT)) & USB_USBCMD_SUTW_MASK) - -#define USB_USBCMD_FS_2_MASK (0x8000U) -#define USB_USBCMD_FS_2_SHIFT (15U) -/*! FS_2 - * 0b0..1024 elements (4096 bytes) Default value - * 0b1..512 elements (2048 bytes) - */ -#define USB_USBCMD_FS_2(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_FS_2_SHIFT)) & USB_USBCMD_FS_2_MASK) - -#define USB_USBCMD_ITC_MASK (0xFF0000U) -#define USB_USBCMD_ITC_SHIFT (16U) -/*! ITC - * 0b00000000..Immediate (no threshold) - * 0b00000001..1 micro-frame - * 0b00000010..2 micro-frames - * 0b00000100..4 micro-frames - * 0b00001000..8 micro-frames - * 0b00010000..16 micro-frames - * 0b00100000..32 micro-frames - * 0b01000000..64 micro-frames - */ -#define USB_USBCMD_ITC(x) (((uint32_t)(((uint32_t)(x)) << USB_USBCMD_ITC_SHIFT)) & USB_USBCMD_ITC_MASK) -/*! @} */ - -/*! @name USBSTS - USB Status Register */ -/*! @{ */ - -#define USB_USBSTS_UI_MASK (0x1U) -#define USB_USBSTS_UI_SHIFT (0U) -#define USB_USBSTS_UI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_UI_SHIFT)) & USB_USBSTS_UI_MASK) - -#define USB_USBSTS_UEI_MASK (0x2U) -#define USB_USBSTS_UEI_SHIFT (1U) -#define USB_USBSTS_UEI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_UEI_SHIFT)) & USB_USBSTS_UEI_MASK) - -#define USB_USBSTS_PCI_MASK (0x4U) -#define USB_USBSTS_PCI_SHIFT (2U) -#define USB_USBSTS_PCI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_PCI_SHIFT)) & USB_USBSTS_PCI_MASK) - -#define USB_USBSTS_FRI_MASK (0x8U) -#define USB_USBSTS_FRI_SHIFT (3U) -#define USB_USBSTS_FRI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_FRI_SHIFT)) & USB_USBSTS_FRI_MASK) - -#define USB_USBSTS_SEI_MASK (0x10U) -#define USB_USBSTS_SEI_SHIFT (4U) -#define USB_USBSTS_SEI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_SEI_SHIFT)) & USB_USBSTS_SEI_MASK) - -#define USB_USBSTS_AAI_MASK (0x20U) -#define USB_USBSTS_AAI_SHIFT (5U) -#define USB_USBSTS_AAI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_AAI_SHIFT)) & USB_USBSTS_AAI_MASK) - -#define USB_USBSTS_URI_MASK (0x40U) -#define USB_USBSTS_URI_SHIFT (6U) -#define USB_USBSTS_URI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_URI_SHIFT)) & USB_USBSTS_URI_MASK) - -#define USB_USBSTS_SRI_MASK (0x80U) -#define USB_USBSTS_SRI_SHIFT (7U) -#define USB_USBSTS_SRI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_SRI_SHIFT)) & USB_USBSTS_SRI_MASK) - -#define USB_USBSTS_SLI_MASK (0x100U) -#define USB_USBSTS_SLI_SHIFT (8U) -#define USB_USBSTS_SLI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_SLI_SHIFT)) & USB_USBSTS_SLI_MASK) - -#define USB_USBSTS_ULPII_MASK (0x400U) -#define USB_USBSTS_ULPII_SHIFT (10U) -#define USB_USBSTS_ULPII(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_ULPII_SHIFT)) & USB_USBSTS_ULPII_MASK) - -#define USB_USBSTS_HCH_MASK (0x1000U) -#define USB_USBSTS_HCH_SHIFT (12U) -#define USB_USBSTS_HCH(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_HCH_SHIFT)) & USB_USBSTS_HCH_MASK) - -#define USB_USBSTS_RCL_MASK (0x2000U) -#define USB_USBSTS_RCL_SHIFT (13U) -#define USB_USBSTS_RCL(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_RCL_SHIFT)) & USB_USBSTS_RCL_MASK) - -#define USB_USBSTS_PS_MASK (0x4000U) -#define USB_USBSTS_PS_SHIFT (14U) -#define USB_USBSTS_PS(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_PS_SHIFT)) & USB_USBSTS_PS_MASK) - -#define USB_USBSTS_AS_MASK (0x8000U) -#define USB_USBSTS_AS_SHIFT (15U) -#define USB_USBSTS_AS(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_AS_SHIFT)) & USB_USBSTS_AS_MASK) - -#define USB_USBSTS_NAKI_MASK (0x10000U) -#define USB_USBSTS_NAKI_SHIFT (16U) -#define USB_USBSTS_NAKI(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_NAKI_SHIFT)) & USB_USBSTS_NAKI_MASK) - -#define USB_USBSTS_TI0_MASK (0x1000000U) -#define USB_USBSTS_TI0_SHIFT (24U) -#define USB_USBSTS_TI0(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_TI0_SHIFT)) & USB_USBSTS_TI0_MASK) - -#define USB_USBSTS_TI1_MASK (0x2000000U) -#define USB_USBSTS_TI1_SHIFT (25U) -#define USB_USBSTS_TI1(x) (((uint32_t)(((uint32_t)(x)) << USB_USBSTS_TI1_SHIFT)) & USB_USBSTS_TI1_MASK) -/*! @} */ - -/*! @name USBINTR - Interrupt Enable Register */ -/*! @{ */ - -#define USB_USBINTR_UE_MASK (0x1U) -#define USB_USBINTR_UE_SHIFT (0U) -#define USB_USBINTR_UE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_UE_SHIFT)) & USB_USBINTR_UE_MASK) - -#define USB_USBINTR_UEE_MASK (0x2U) -#define USB_USBINTR_UEE_SHIFT (1U) -#define USB_USBINTR_UEE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_UEE_SHIFT)) & USB_USBINTR_UEE_MASK) - -#define USB_USBINTR_PCE_MASK (0x4U) -#define USB_USBINTR_PCE_SHIFT (2U) -#define USB_USBINTR_PCE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_PCE_SHIFT)) & USB_USBINTR_PCE_MASK) - -#define USB_USBINTR_FRE_MASK (0x8U) -#define USB_USBINTR_FRE_SHIFT (3U) -#define USB_USBINTR_FRE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_FRE_SHIFT)) & USB_USBINTR_FRE_MASK) - -#define USB_USBINTR_SEE_MASK (0x10U) -#define USB_USBINTR_SEE_SHIFT (4U) -#define USB_USBINTR_SEE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_SEE_SHIFT)) & USB_USBINTR_SEE_MASK) - -#define USB_USBINTR_AAE_MASK (0x20U) -#define USB_USBINTR_AAE_SHIFT (5U) -#define USB_USBINTR_AAE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_AAE_SHIFT)) & USB_USBINTR_AAE_MASK) - -#define USB_USBINTR_URE_MASK (0x40U) -#define USB_USBINTR_URE_SHIFT (6U) -#define USB_USBINTR_URE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_URE_SHIFT)) & USB_USBINTR_URE_MASK) - -#define USB_USBINTR_SRE_MASK (0x80U) -#define USB_USBINTR_SRE_SHIFT (7U) -#define USB_USBINTR_SRE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_SRE_SHIFT)) & USB_USBINTR_SRE_MASK) - -#define USB_USBINTR_SLE_MASK (0x100U) -#define USB_USBINTR_SLE_SHIFT (8U) -#define USB_USBINTR_SLE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_SLE_SHIFT)) & USB_USBINTR_SLE_MASK) - -#define USB_USBINTR_ULPIE_MASK (0x400U) -#define USB_USBINTR_ULPIE_SHIFT (10U) -#define USB_USBINTR_ULPIE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_ULPIE_SHIFT)) & USB_USBINTR_ULPIE_MASK) - -#define USB_USBINTR_NAKE_MASK (0x10000U) -#define USB_USBINTR_NAKE_SHIFT (16U) -#define USB_USBINTR_NAKE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_NAKE_SHIFT)) & USB_USBINTR_NAKE_MASK) - -#define USB_USBINTR_UAIE_MASK (0x40000U) -#define USB_USBINTR_UAIE_SHIFT (18U) -#define USB_USBINTR_UAIE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_UAIE_SHIFT)) & USB_USBINTR_UAIE_MASK) - -#define USB_USBINTR_UPIE_MASK (0x80000U) -#define USB_USBINTR_UPIE_SHIFT (19U) -#define USB_USBINTR_UPIE(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_UPIE_SHIFT)) & USB_USBINTR_UPIE_MASK) - -#define USB_USBINTR_TIE0_MASK (0x1000000U) -#define USB_USBINTR_TIE0_SHIFT (24U) -#define USB_USBINTR_TIE0(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_TIE0_SHIFT)) & USB_USBINTR_TIE0_MASK) - -#define USB_USBINTR_TIE1_MASK (0x2000000U) -#define USB_USBINTR_TIE1_SHIFT (25U) -#define USB_USBINTR_TIE1(x) (((uint32_t)(((uint32_t)(x)) << USB_USBINTR_TIE1_SHIFT)) & USB_USBINTR_TIE1_MASK) -/*! @} */ - -/*! @name FRINDEX - USB Frame Index */ -/*! @{ */ - -#define USB_FRINDEX_FRINDEX_MASK (0x3FFFU) -#define USB_FRINDEX_FRINDEX_SHIFT (0U) -/*! FRINDEX - * 0b00000000000000..(1024) 12 - * 0b00000000000001..(512) 11 - * 0b00000000000010..(256) 10 - * 0b00000000000011..(128) 9 - * 0b00000000000100..(64) 8 - * 0b00000000000101..(32) 7 - * 0b00000000000110..(16) 6 - * 0b00000000000111..(8) 5 - */ -#define USB_FRINDEX_FRINDEX(x) (((uint32_t)(((uint32_t)(x)) << USB_FRINDEX_FRINDEX_SHIFT)) & USB_FRINDEX_FRINDEX_MASK) -/*! @} */ - -/*! @name DEVICEADDR - Device Address */ -/*! @{ */ - -#define USB_DEVICEADDR_USBADRA_MASK (0x1000000U) -#define USB_DEVICEADDR_USBADRA_SHIFT (24U) -#define USB_DEVICEADDR_USBADRA(x) (((uint32_t)(((uint32_t)(x)) << USB_DEVICEADDR_USBADRA_SHIFT)) & USB_DEVICEADDR_USBADRA_MASK) - -#define USB_DEVICEADDR_USBADR_MASK (0xFE000000U) -#define USB_DEVICEADDR_USBADR_SHIFT (25U) -#define USB_DEVICEADDR_USBADR(x) (((uint32_t)(((uint32_t)(x)) << USB_DEVICEADDR_USBADR_SHIFT)) & USB_DEVICEADDR_USBADR_MASK) -/*! @} */ - -/*! @name PERIODICLISTBASE - Frame List Base Address */ -/*! @{ */ - -#define USB_PERIODICLISTBASE_BASEADR_MASK (0xFFFFF000U) -#define USB_PERIODICLISTBASE_BASEADR_SHIFT (12U) -#define USB_PERIODICLISTBASE_BASEADR(x) (((uint32_t)(((uint32_t)(x)) << USB_PERIODICLISTBASE_BASEADR_SHIFT)) & USB_PERIODICLISTBASE_BASEADR_MASK) -/*! @} */ - -/*! @name ASYNCLISTADDR - Next Asynch. Address */ -/*! @{ */ - -#define USB_ASYNCLISTADDR_ASYBASE_MASK (0xFFFFFFE0U) -#define USB_ASYNCLISTADDR_ASYBASE_SHIFT (5U) -#define USB_ASYNCLISTADDR_ASYBASE(x) (((uint32_t)(((uint32_t)(x)) << USB_ASYNCLISTADDR_ASYBASE_SHIFT)) & USB_ASYNCLISTADDR_ASYBASE_MASK) -/*! @} */ - -/*! @name ENDPTLISTADDR - Endpoint List Address */ -/*! @{ */ - -#define USB_ENDPTLISTADDR_EPBASE_MASK (0xFFFFF800U) -#define USB_ENDPTLISTADDR_EPBASE_SHIFT (11U) -#define USB_ENDPTLISTADDR_EPBASE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTLISTADDR_EPBASE_SHIFT)) & USB_ENDPTLISTADDR_EPBASE_MASK) -/*! @} */ - -/*! @name BURSTSIZE - Programmable Burst Size */ -/*! @{ */ - -#define USB_BURSTSIZE_RXPBURST_MASK (0xFFU) -#define USB_BURSTSIZE_RXPBURST_SHIFT (0U) -#define USB_BURSTSIZE_RXPBURST(x) (((uint32_t)(((uint32_t)(x)) << USB_BURSTSIZE_RXPBURST_SHIFT)) & USB_BURSTSIZE_RXPBURST_MASK) - -#define USB_BURSTSIZE_TXPBURST_MASK (0x1FF00U) -#define USB_BURSTSIZE_TXPBURST_SHIFT (8U) -#define USB_BURSTSIZE_TXPBURST(x) (((uint32_t)(((uint32_t)(x)) << USB_BURSTSIZE_TXPBURST_SHIFT)) & USB_BURSTSIZE_TXPBURST_MASK) -/*! @} */ - -/*! @name TXFILLTUNING - TX FIFO Fill Tuning */ -/*! @{ */ - -#define USB_TXFILLTUNING_TXSCHOH_MASK (0xFFU) -#define USB_TXFILLTUNING_TXSCHOH_SHIFT (0U) -#define USB_TXFILLTUNING_TXSCHOH(x) (((uint32_t)(((uint32_t)(x)) << USB_TXFILLTUNING_TXSCHOH_SHIFT)) & USB_TXFILLTUNING_TXSCHOH_MASK) - -#define USB_TXFILLTUNING_TXSCHHEALTH_MASK (0x1F00U) -#define USB_TXFILLTUNING_TXSCHHEALTH_SHIFT (8U) -#define USB_TXFILLTUNING_TXSCHHEALTH(x) (((uint32_t)(((uint32_t)(x)) << USB_TXFILLTUNING_TXSCHHEALTH_SHIFT)) & USB_TXFILLTUNING_TXSCHHEALTH_MASK) - -#define USB_TXFILLTUNING_TXFIFOTHRES_MASK (0x3F0000U) -#define USB_TXFILLTUNING_TXFIFOTHRES_SHIFT (16U) -#define USB_TXFILLTUNING_TXFIFOTHRES(x) (((uint32_t)(((uint32_t)(x)) << USB_TXFILLTUNING_TXFIFOTHRES_SHIFT)) & USB_TXFILLTUNING_TXFIFOTHRES_MASK) -/*! @} */ - -/*! @name ENDPTNAK - Endpoint NAK */ -/*! @{ */ - -#define USB_ENDPTNAK_EPRN_MASK (0xFFU) -#define USB_ENDPTNAK_EPRN_SHIFT (0U) -#define USB_ENDPTNAK_EPRN(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTNAK_EPRN_SHIFT)) & USB_ENDPTNAK_EPRN_MASK) - -#define USB_ENDPTNAK_EPTN_MASK (0xFF0000U) -#define USB_ENDPTNAK_EPTN_SHIFT (16U) -#define USB_ENDPTNAK_EPTN(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTNAK_EPTN_SHIFT)) & USB_ENDPTNAK_EPTN_MASK) -/*! @} */ - -/*! @name ENDPTNAKEN - Endpoint NAK Enable */ -/*! @{ */ - -#define USB_ENDPTNAKEN_EPRNE_MASK (0xFFU) -#define USB_ENDPTNAKEN_EPRNE_SHIFT (0U) -#define USB_ENDPTNAKEN_EPRNE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTNAKEN_EPRNE_SHIFT)) & USB_ENDPTNAKEN_EPRNE_MASK) - -#define USB_ENDPTNAKEN_EPTNE_MASK (0xFF0000U) -#define USB_ENDPTNAKEN_EPTNE_SHIFT (16U) -#define USB_ENDPTNAKEN_EPTNE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTNAKEN_EPTNE_SHIFT)) & USB_ENDPTNAKEN_EPTNE_MASK) -/*! @} */ - -/*! @name CONFIGFLAG - Configure Flag Register */ -/*! @{ */ - -#define USB_CONFIGFLAG_CF_MASK (0x1U) -#define USB_CONFIGFLAG_CF_SHIFT (0U) -/*! CF - * 0b0..Port routing control logic default-routes each port to an implementation dependent classic host controller. - * 0b1..Port routing control logic default-routes all ports to this host controller. - */ -#define USB_CONFIGFLAG_CF(x) (((uint32_t)(((uint32_t)(x)) << USB_CONFIGFLAG_CF_SHIFT)) & USB_CONFIGFLAG_CF_MASK) -/*! @} */ - -/*! @name PORTSC1 - Port Status & Control */ -/*! @{ */ - -#define USB_PORTSC1_CCS_MASK (0x1U) -#define USB_PORTSC1_CCS_SHIFT (0U) -#define USB_PORTSC1_CCS(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_CCS_SHIFT)) & USB_PORTSC1_CCS_MASK) - -#define USB_PORTSC1_CSC_MASK (0x2U) -#define USB_PORTSC1_CSC_SHIFT (1U) -#define USB_PORTSC1_CSC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_CSC_SHIFT)) & USB_PORTSC1_CSC_MASK) - -#define USB_PORTSC1_PE_MASK (0x4U) -#define USB_PORTSC1_PE_SHIFT (2U) -#define USB_PORTSC1_PE(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PE_SHIFT)) & USB_PORTSC1_PE_MASK) - -#define USB_PORTSC1_PEC_MASK (0x8U) -#define USB_PORTSC1_PEC_SHIFT (3U) -#define USB_PORTSC1_PEC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PEC_SHIFT)) & USB_PORTSC1_PEC_MASK) - -#define USB_PORTSC1_OCA_MASK (0x10U) -#define USB_PORTSC1_OCA_SHIFT (4U) -/*! OCA - * 0b1..This port currently has an over-current condition - * 0b0..This port does not have an over-current condition. - */ -#define USB_PORTSC1_OCA(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_OCA_SHIFT)) & USB_PORTSC1_OCA_MASK) - -#define USB_PORTSC1_OCC_MASK (0x20U) -#define USB_PORTSC1_OCC_SHIFT (5U) -#define USB_PORTSC1_OCC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_OCC_SHIFT)) & USB_PORTSC1_OCC_MASK) - -#define USB_PORTSC1_FPR_MASK (0x40U) -#define USB_PORTSC1_FPR_SHIFT (6U) -#define USB_PORTSC1_FPR(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_FPR_SHIFT)) & USB_PORTSC1_FPR_MASK) - -#define USB_PORTSC1_SUSP_MASK (0x80U) -#define USB_PORTSC1_SUSP_SHIFT (7U) -#define USB_PORTSC1_SUSP(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_SUSP_SHIFT)) & USB_PORTSC1_SUSP_MASK) - -#define USB_PORTSC1_PR_MASK (0x100U) -#define USB_PORTSC1_PR_SHIFT (8U) -#define USB_PORTSC1_PR(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PR_SHIFT)) & USB_PORTSC1_PR_MASK) - -#define USB_PORTSC1_HSP_MASK (0x200U) -#define USB_PORTSC1_HSP_SHIFT (9U) -#define USB_PORTSC1_HSP(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_HSP_SHIFT)) & USB_PORTSC1_HSP_MASK) - -#define USB_PORTSC1_LS_MASK (0xC00U) -#define USB_PORTSC1_LS_SHIFT (10U) -/*! LS - * 0b00..SE0 - * 0b10..J-state - * 0b01..K-state - * 0b11..Undefined - */ -#define USB_PORTSC1_LS(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_LS_SHIFT)) & USB_PORTSC1_LS_MASK) - -#define USB_PORTSC1_PP_MASK (0x1000U) -#define USB_PORTSC1_PP_SHIFT (12U) -#define USB_PORTSC1_PP(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PP_SHIFT)) & USB_PORTSC1_PP_MASK) - -#define USB_PORTSC1_PO_MASK (0x2000U) -#define USB_PORTSC1_PO_SHIFT (13U) -#define USB_PORTSC1_PO(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PO_SHIFT)) & USB_PORTSC1_PO_MASK) - -#define USB_PORTSC1_PIC_MASK (0xC000U) -#define USB_PORTSC1_PIC_SHIFT (14U) -/*! PIC - * 0b00..Port indicators are off - * 0b01..Amber - * 0b10..Green - * 0b11..Undefined - */ -#define USB_PORTSC1_PIC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PIC_SHIFT)) & USB_PORTSC1_PIC_MASK) - -#define USB_PORTSC1_PTC_MASK (0xF0000U) -#define USB_PORTSC1_PTC_SHIFT (16U) -/*! PTC - * 0b0000..TEST_MODE_DISABLE - * 0b0001..J_STATE - * 0b0010..K_STATE - * 0b0011..SE0 (host) / NAK (device) - * 0b0100..Packet - * 0b0101..FORCE_ENABLE_HS - * 0b0110..FORCE_ENABLE_FS - * 0b0111..FORCE_ENABLE_LS - */ -#define USB_PORTSC1_PTC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PTC_SHIFT)) & USB_PORTSC1_PTC_MASK) - -#define USB_PORTSC1_WKCN_MASK (0x100000U) -#define USB_PORTSC1_WKCN_SHIFT (20U) -#define USB_PORTSC1_WKCN(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_WKCN_SHIFT)) & USB_PORTSC1_WKCN_MASK) - -#define USB_PORTSC1_WKDC_MASK (0x200000U) -#define USB_PORTSC1_WKDC_SHIFT (21U) -#define USB_PORTSC1_WKDC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_WKDC_SHIFT)) & USB_PORTSC1_WKDC_MASK) - -#define USB_PORTSC1_WKOC_MASK (0x400000U) -#define USB_PORTSC1_WKOC_SHIFT (22U) -#define USB_PORTSC1_WKOC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_WKOC_SHIFT)) & USB_PORTSC1_WKOC_MASK) - -#define USB_PORTSC1_PHCD_MASK (0x800000U) -#define USB_PORTSC1_PHCD_SHIFT (23U) -/*! PHCD - * 0b1..Disable PHY clock - * 0b0..Enable PHY clock - */ -#define USB_PORTSC1_PHCD(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PHCD_SHIFT)) & USB_PORTSC1_PHCD_MASK) - -#define USB_PORTSC1_PFSC_MASK (0x1000000U) -#define USB_PORTSC1_PFSC_SHIFT (24U) -/*! PFSC - * 0b1..Forced to full speed - * 0b0..Normal operation - */ -#define USB_PORTSC1_PFSC(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PFSC_SHIFT)) & USB_PORTSC1_PFSC_MASK) - -#define USB_PORTSC1_PTS_2_MASK (0x2000000U) -#define USB_PORTSC1_PTS_2_SHIFT (25U) -#define USB_PORTSC1_PTS_2(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PTS_2_SHIFT)) & USB_PORTSC1_PTS_2_MASK) - -#define USB_PORTSC1_PSPD_MASK (0xC000000U) -#define USB_PORTSC1_PSPD_SHIFT (26U) -/*! PSPD - * 0b00..Full Speed - * 0b01..Low Speed - * 0b10..High Speed - * 0b11..Undefined - */ -#define USB_PORTSC1_PSPD(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PSPD_SHIFT)) & USB_PORTSC1_PSPD_MASK) - -#define USB_PORTSC1_PTW_MASK (0x10000000U) -#define USB_PORTSC1_PTW_SHIFT (28U) -/*! PTW - * 0b0..Select the 8-bit UTMI interface [60MHz] - * 0b1..Select the 16-bit UTMI interface [30MHz] - */ -#define USB_PORTSC1_PTW(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PTW_SHIFT)) & USB_PORTSC1_PTW_MASK) - -#define USB_PORTSC1_STS_MASK (0x20000000U) -#define USB_PORTSC1_STS_SHIFT (29U) -#define USB_PORTSC1_STS(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_STS_SHIFT)) & USB_PORTSC1_STS_MASK) - -#define USB_PORTSC1_PTS_1_MASK (0xC0000000U) -#define USB_PORTSC1_PTS_1_SHIFT (30U) -#define USB_PORTSC1_PTS_1(x) (((uint32_t)(((uint32_t)(x)) << USB_PORTSC1_PTS_1_SHIFT)) & USB_PORTSC1_PTS_1_MASK) -/*! @} */ - -/*! @name OTGSC - On-The-Go Status & control */ -/*! @{ */ - -#define USB_OTGSC_VD_MASK (0x1U) -#define USB_OTGSC_VD_SHIFT (0U) -#define USB_OTGSC_VD(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_VD_SHIFT)) & USB_OTGSC_VD_MASK) - -#define USB_OTGSC_VC_MASK (0x2U) -#define USB_OTGSC_VC_SHIFT (1U) -#define USB_OTGSC_VC(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_VC_SHIFT)) & USB_OTGSC_VC_MASK) - -#define USB_OTGSC_OT_MASK (0x8U) -#define USB_OTGSC_OT_SHIFT (3U) -#define USB_OTGSC_OT(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_OT_SHIFT)) & USB_OTGSC_OT_MASK) - -#define USB_OTGSC_DP_MASK (0x10U) -#define USB_OTGSC_DP_SHIFT (4U) -#define USB_OTGSC_DP(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_DP_SHIFT)) & USB_OTGSC_DP_MASK) - -#define USB_OTGSC_IDPU_MASK (0x20U) -#define USB_OTGSC_IDPU_SHIFT (5U) -#define USB_OTGSC_IDPU(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_IDPU_SHIFT)) & USB_OTGSC_IDPU_MASK) - -#define USB_OTGSC_ID_MASK (0x100U) -#define USB_OTGSC_ID_SHIFT (8U) -#define USB_OTGSC_ID(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_ID_SHIFT)) & USB_OTGSC_ID_MASK) - -#define USB_OTGSC_AVV_MASK (0x200U) -#define USB_OTGSC_AVV_SHIFT (9U) -#define USB_OTGSC_AVV(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_AVV_SHIFT)) & USB_OTGSC_AVV_MASK) - -#define USB_OTGSC_ASV_MASK (0x400U) -#define USB_OTGSC_ASV_SHIFT (10U) -#define USB_OTGSC_ASV(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_ASV_SHIFT)) & USB_OTGSC_ASV_MASK) - -#define USB_OTGSC_BSV_MASK (0x800U) -#define USB_OTGSC_BSV_SHIFT (11U) -#define USB_OTGSC_BSV(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSV_SHIFT)) & USB_OTGSC_BSV_MASK) - -#define USB_OTGSC_BSE_MASK (0x1000U) -#define USB_OTGSC_BSE_SHIFT (12U) -#define USB_OTGSC_BSE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSE_SHIFT)) & USB_OTGSC_BSE_MASK) - -#define USB_OTGSC_TOG_1MS_MASK (0x2000U) -#define USB_OTGSC_TOG_1MS_SHIFT (13U) -#define USB_OTGSC_TOG_1MS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_TOG_1MS_SHIFT)) & USB_OTGSC_TOG_1MS_MASK) - -#define USB_OTGSC_DPS_MASK (0x4000U) -#define USB_OTGSC_DPS_SHIFT (14U) -#define USB_OTGSC_DPS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_DPS_SHIFT)) & USB_OTGSC_DPS_MASK) - -#define USB_OTGSC_IDIS_MASK (0x10000U) -#define USB_OTGSC_IDIS_SHIFT (16U) -#define USB_OTGSC_IDIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_IDIS_SHIFT)) & USB_OTGSC_IDIS_MASK) - -#define USB_OTGSC_AVVIS_MASK (0x20000U) -#define USB_OTGSC_AVVIS_SHIFT (17U) -#define USB_OTGSC_AVVIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_AVVIS_SHIFT)) & USB_OTGSC_AVVIS_MASK) - -#define USB_OTGSC_ASVIS_MASK (0x40000U) -#define USB_OTGSC_ASVIS_SHIFT (18U) -#define USB_OTGSC_ASVIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_ASVIS_SHIFT)) & USB_OTGSC_ASVIS_MASK) - -#define USB_OTGSC_BSVIS_MASK (0x80000U) -#define USB_OTGSC_BSVIS_SHIFT (19U) -#define USB_OTGSC_BSVIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSVIS_SHIFT)) & USB_OTGSC_BSVIS_MASK) - -#define USB_OTGSC_BSEIS_MASK (0x100000U) -#define USB_OTGSC_BSEIS_SHIFT (20U) -#define USB_OTGSC_BSEIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSEIS_SHIFT)) & USB_OTGSC_BSEIS_MASK) - -#define USB_OTGSC_STATUS_1MS_MASK (0x200000U) -#define USB_OTGSC_STATUS_1MS_SHIFT (21U) -#define USB_OTGSC_STATUS_1MS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_STATUS_1MS_SHIFT)) & USB_OTGSC_STATUS_1MS_MASK) - -#define USB_OTGSC_DPIS_MASK (0x400000U) -#define USB_OTGSC_DPIS_SHIFT (22U) -#define USB_OTGSC_DPIS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_DPIS_SHIFT)) & USB_OTGSC_DPIS_MASK) - -#define USB_OTGSC_IDIE_MASK (0x1000000U) -#define USB_OTGSC_IDIE_SHIFT (24U) -#define USB_OTGSC_IDIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_IDIE_SHIFT)) & USB_OTGSC_IDIE_MASK) - -#define USB_OTGSC_AVVIE_MASK (0x2000000U) -#define USB_OTGSC_AVVIE_SHIFT (25U) -#define USB_OTGSC_AVVIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_AVVIE_SHIFT)) & USB_OTGSC_AVVIE_MASK) - -#define USB_OTGSC_ASVIE_MASK (0x4000000U) -#define USB_OTGSC_ASVIE_SHIFT (26U) -#define USB_OTGSC_ASVIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_ASVIE_SHIFT)) & USB_OTGSC_ASVIE_MASK) - -#define USB_OTGSC_BSVIE_MASK (0x8000000U) -#define USB_OTGSC_BSVIE_SHIFT (27U) -#define USB_OTGSC_BSVIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSVIE_SHIFT)) & USB_OTGSC_BSVIE_MASK) - -#define USB_OTGSC_BSEIE_MASK (0x10000000U) -#define USB_OTGSC_BSEIE_SHIFT (28U) -#define USB_OTGSC_BSEIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_BSEIE_SHIFT)) & USB_OTGSC_BSEIE_MASK) - -#define USB_OTGSC_EN_1MS_MASK (0x20000000U) -#define USB_OTGSC_EN_1MS_SHIFT (29U) -#define USB_OTGSC_EN_1MS(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_EN_1MS_SHIFT)) & USB_OTGSC_EN_1MS_MASK) - -#define USB_OTGSC_DPIE_MASK (0x40000000U) -#define USB_OTGSC_DPIE_SHIFT (30U) -#define USB_OTGSC_DPIE(x) (((uint32_t)(((uint32_t)(x)) << USB_OTGSC_DPIE_SHIFT)) & USB_OTGSC_DPIE_MASK) -/*! @} */ - -/*! @name USBMODE - USB Device Mode */ -/*! @{ */ - -#define USB_USBMODE_CM_MASK (0x3U) -#define USB_USBMODE_CM_SHIFT (0U) -/*! CM - * 0b00..Idle [Default for combination host/device] - * 0b01..Reserved - * 0b10..Device Controller [Default for device only controller] - * 0b11..Host Controller [Default for host only controller] - */ -#define USB_USBMODE_CM(x) (((uint32_t)(((uint32_t)(x)) << USB_USBMODE_CM_SHIFT)) & USB_USBMODE_CM_MASK) - -#define USB_USBMODE_ES_MASK (0x4U) -#define USB_USBMODE_ES_SHIFT (2U) -/*! ES - * 0b0..Little Endian [Default] - * 0b1..Big Endian - */ -#define USB_USBMODE_ES(x) (((uint32_t)(((uint32_t)(x)) << USB_USBMODE_ES_SHIFT)) & USB_USBMODE_ES_MASK) - -#define USB_USBMODE_SLOM_MASK (0x8U) -#define USB_USBMODE_SLOM_SHIFT (3U) -/*! SLOM - * 0b0..Setup Lockouts On (default); - * 0b1..Setup Lockouts Off (DCD requires use of Setup Data Buffer Tripwire in USBCMDUSB Command Register . - */ -#define USB_USBMODE_SLOM(x) (((uint32_t)(((uint32_t)(x)) << USB_USBMODE_SLOM_SHIFT)) & USB_USBMODE_SLOM_MASK) - -#define USB_USBMODE_SDIS_MASK (0x10U) -#define USB_USBMODE_SDIS_SHIFT (4U) -#define USB_USBMODE_SDIS(x) (((uint32_t)(((uint32_t)(x)) << USB_USBMODE_SDIS_SHIFT)) & USB_USBMODE_SDIS_MASK) -/*! @} */ - -/*! @name ENDPTSETUPSTAT - Endpoint Setup Status */ -/*! @{ */ - -#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK (0xFFFFU) -#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT (0U) -#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT)) & USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK) -/*! @} */ - -/*! @name ENDPTPRIME - Endpoint Prime */ -/*! @{ */ - -#define USB_ENDPTPRIME_PERB_MASK (0xFFU) -#define USB_ENDPTPRIME_PERB_SHIFT (0U) -#define USB_ENDPTPRIME_PERB(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTPRIME_PERB_SHIFT)) & USB_ENDPTPRIME_PERB_MASK) - -#define USB_ENDPTPRIME_PETB_MASK (0xFF0000U) -#define USB_ENDPTPRIME_PETB_SHIFT (16U) -#define USB_ENDPTPRIME_PETB(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTPRIME_PETB_SHIFT)) & USB_ENDPTPRIME_PETB_MASK) -/*! @} */ - -/*! @name ENDPTFLUSH - Endpoint Flush */ -/*! @{ */ - -#define USB_ENDPTFLUSH_FERB_MASK (0xFFU) -#define USB_ENDPTFLUSH_FERB_SHIFT (0U) -#define USB_ENDPTFLUSH_FERB(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTFLUSH_FERB_SHIFT)) & USB_ENDPTFLUSH_FERB_MASK) - -#define USB_ENDPTFLUSH_FETB_MASK (0xFF0000U) -#define USB_ENDPTFLUSH_FETB_SHIFT (16U) -#define USB_ENDPTFLUSH_FETB(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTFLUSH_FETB_SHIFT)) & USB_ENDPTFLUSH_FETB_MASK) -/*! @} */ - -/*! @name ENDPTSTAT - Endpoint Status */ -/*! @{ */ - -#define USB_ENDPTSTAT_ERBR_MASK (0xFFU) -#define USB_ENDPTSTAT_ERBR_SHIFT (0U) -#define USB_ENDPTSTAT_ERBR(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTSTAT_ERBR_SHIFT)) & USB_ENDPTSTAT_ERBR_MASK) - -#define USB_ENDPTSTAT_ETBR_MASK (0xFF0000U) -#define USB_ENDPTSTAT_ETBR_SHIFT (16U) -#define USB_ENDPTSTAT_ETBR(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTSTAT_ETBR_SHIFT)) & USB_ENDPTSTAT_ETBR_MASK) -/*! @} */ - -/*! @name ENDPTCOMPLETE - Endpoint Complete */ -/*! @{ */ - -#define USB_ENDPTCOMPLETE_ERCE_MASK (0xFFU) -#define USB_ENDPTCOMPLETE_ERCE_SHIFT (0U) -#define USB_ENDPTCOMPLETE_ERCE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCOMPLETE_ERCE_SHIFT)) & USB_ENDPTCOMPLETE_ERCE_MASK) - -#define USB_ENDPTCOMPLETE_ETCE_MASK (0xFF0000U) -#define USB_ENDPTCOMPLETE_ETCE_SHIFT (16U) -#define USB_ENDPTCOMPLETE_ETCE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCOMPLETE_ETCE_SHIFT)) & USB_ENDPTCOMPLETE_ETCE_MASK) -/*! @} */ - -/*! @name ENDPTCTRL0 - Endpoint Control0 */ -/*! @{ */ - -#define USB_ENDPTCTRL0_RXS_MASK (0x1U) -#define USB_ENDPTCTRL0_RXS_SHIFT (0U) -#define USB_ENDPTCTRL0_RXS(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_RXS_SHIFT)) & USB_ENDPTCTRL0_RXS_MASK) - -#define USB_ENDPTCTRL0_RXT_MASK (0xCU) -#define USB_ENDPTCTRL0_RXT_SHIFT (2U) -#define USB_ENDPTCTRL0_RXT(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_RXT_SHIFT)) & USB_ENDPTCTRL0_RXT_MASK) - -#define USB_ENDPTCTRL0_RXE_MASK (0x80U) -#define USB_ENDPTCTRL0_RXE_SHIFT (7U) -#define USB_ENDPTCTRL0_RXE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_RXE_SHIFT)) & USB_ENDPTCTRL0_RXE_MASK) - -#define USB_ENDPTCTRL0_TXS_MASK (0x10000U) -#define USB_ENDPTCTRL0_TXS_SHIFT (16U) -#define USB_ENDPTCTRL0_TXS(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_TXS_SHIFT)) & USB_ENDPTCTRL0_TXS_MASK) - -#define USB_ENDPTCTRL0_TXT_MASK (0xC0000U) -#define USB_ENDPTCTRL0_TXT_SHIFT (18U) -#define USB_ENDPTCTRL0_TXT(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_TXT_SHIFT)) & USB_ENDPTCTRL0_TXT_MASK) - -#define USB_ENDPTCTRL0_TXE_MASK (0x800000U) -#define USB_ENDPTCTRL0_TXE_SHIFT (23U) -#define USB_ENDPTCTRL0_TXE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL0_TXE_SHIFT)) & USB_ENDPTCTRL0_TXE_MASK) -/*! @} */ - -/*! @name ENDPTCTRL - Endpoint Control 1..Endpoint Control 7 */ -/*! @{ */ - -#define USB_ENDPTCTRL_RXS_MASK (0x1U) -#define USB_ENDPTCTRL_RXS_SHIFT (0U) -#define USB_ENDPTCTRL_RXS(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXS_SHIFT)) & USB_ENDPTCTRL_RXS_MASK) - -#define USB_ENDPTCTRL_RXD_MASK (0x2U) -#define USB_ENDPTCTRL_RXD_SHIFT (1U) -#define USB_ENDPTCTRL_RXD(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXD_SHIFT)) & USB_ENDPTCTRL_RXD_MASK) - -#define USB_ENDPTCTRL_RXT_MASK (0xCU) -#define USB_ENDPTCTRL_RXT_SHIFT (2U) -#define USB_ENDPTCTRL_RXT(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXT_SHIFT)) & USB_ENDPTCTRL_RXT_MASK) - -#define USB_ENDPTCTRL_RXI_MASK (0x20U) -#define USB_ENDPTCTRL_RXI_SHIFT (5U) -#define USB_ENDPTCTRL_RXI(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXI_SHIFT)) & USB_ENDPTCTRL_RXI_MASK) - -#define USB_ENDPTCTRL_RXR_MASK (0x40U) -#define USB_ENDPTCTRL_RXR_SHIFT (6U) -#define USB_ENDPTCTRL_RXR(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXR_SHIFT)) & USB_ENDPTCTRL_RXR_MASK) - -#define USB_ENDPTCTRL_RXE_MASK (0x80U) -#define USB_ENDPTCTRL_RXE_SHIFT (7U) -#define USB_ENDPTCTRL_RXE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_RXE_SHIFT)) & USB_ENDPTCTRL_RXE_MASK) - -#define USB_ENDPTCTRL_TXS_MASK (0x10000U) -#define USB_ENDPTCTRL_TXS_SHIFT (16U) -#define USB_ENDPTCTRL_TXS(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXS_SHIFT)) & USB_ENDPTCTRL_TXS_MASK) - -#define USB_ENDPTCTRL_TXD_MASK (0x20000U) -#define USB_ENDPTCTRL_TXD_SHIFT (17U) -#define USB_ENDPTCTRL_TXD(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXD_SHIFT)) & USB_ENDPTCTRL_TXD_MASK) - -#define USB_ENDPTCTRL_TXT_MASK (0xC0000U) -#define USB_ENDPTCTRL_TXT_SHIFT (18U) -#define USB_ENDPTCTRL_TXT(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXT_SHIFT)) & USB_ENDPTCTRL_TXT_MASK) - -#define USB_ENDPTCTRL_TXI_MASK (0x200000U) -#define USB_ENDPTCTRL_TXI_SHIFT (21U) -#define USB_ENDPTCTRL_TXI(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXI_SHIFT)) & USB_ENDPTCTRL_TXI_MASK) - -#define USB_ENDPTCTRL_TXR_MASK (0x400000U) -#define USB_ENDPTCTRL_TXR_SHIFT (22U) -#define USB_ENDPTCTRL_TXR(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXR_SHIFT)) & USB_ENDPTCTRL_TXR_MASK) - -#define USB_ENDPTCTRL_TXE_MASK (0x800000U) -#define USB_ENDPTCTRL_TXE_SHIFT (23U) -#define USB_ENDPTCTRL_TXE(x) (((uint32_t)(((uint32_t)(x)) << USB_ENDPTCTRL_TXE_SHIFT)) & USB_ENDPTCTRL_TXE_MASK) -/*! @} */ - -/* The count of USB_ENDPTCTRL */ -#define USB_ENDPTCTRL_COUNT (7U) - - -/*! - * @} - */ /* end of group USB_Register_Masks */ - - -/* USB - Peripheral instance base addresses */ -/** Peripheral USB1 base address */ -#define USB1_BASE (0x402E0000u) -/** Peripheral USB1 base pointer */ -#define USB1 ((USB_Type *)USB1_BASE) -/** Peripheral USB2 base address */ -#define USB2_BASE (0x402E0200u) -/** Peripheral USB2 base pointer */ -#define USB2 ((USB_Type *)USB2_BASE) -/** Array initializer of USB peripheral base addresses */ -#define USB_BASE_ADDRS { 0u, USB1_BASE, USB2_BASE } -/** Array initializer of USB peripheral base pointers */ -#define USB_BASE_PTRS { (USB_Type *)0u, USB1, USB2 } -/** Interrupt vectors for the USB peripheral type */ -#define USB_IRQS { NotAvail_IRQn, USB_OTG1_IRQn, USB_OTG2_IRQn } -/* Backward compatibility */ -#define GPTIMER0CTL GPTIMER0CTRL -#define GPTIMER1CTL GPTIMER1CTRL -#define USB_SBUSCFG SBUSCFG -#define EPLISTADDR ENDPTLISTADDR -#define EPSETUPSR ENDPTSETUPSTAT -#define EPPRIME ENDPTPRIME -#define EPFLUSH ENDPTFLUSH -#define EPSR ENDPTSTAT -#define EPCOMPLETE ENDPTCOMPLETE -#define EPCR ENDPTCTRL -#define EPCR0 ENDPTCTRL0 -#define USBHS_ID_ID_MASK USB_ID_ID_MASK -#define USBHS_ID_ID_SHIFT USB_ID_ID_SHIFT -#define USBHS_ID_ID(x) USB_ID_ID(x) -#define USBHS_ID_NID_MASK USB_ID_NID_MASK -#define USBHS_ID_NID_SHIFT USB_ID_NID_SHIFT -#define USBHS_ID_NID(x) USB_ID_NID(x) -#define USBHS_ID_REVISION_MASK USB_ID_REVISION_MASK -#define USBHS_ID_REVISION_SHIFT USB_ID_REVISION_SHIFT -#define USBHS_ID_REVISION(x) USB_ID_REVISION(x) -#define USBHS_HWGENERAL_PHYW_MASK USB_HWGENERAL_PHYW_MASK -#define USBHS_HWGENERAL_PHYW_SHIFT USB_HWGENERAL_PHYW_SHIFT -#define USBHS_HWGENERAL_PHYW(x) USB_HWGENERAL_PHYW(x) -#define USBHS_HWGENERAL_PHYM_MASK USB_HWGENERAL_PHYM_MASK -#define USBHS_HWGENERAL_PHYM_SHIFT USB_HWGENERAL_PHYM_SHIFT -#define USBHS_HWGENERAL_PHYM(x) USB_HWGENERAL_PHYM(x) -#define USBHS_HWGENERAL_SM_MASK USB_HWGENERAL_SM_MASK -#define USBHS_HWGENERAL_SM_SHIFT USB_HWGENERAL_SM_SHIFT -#define USBHS_HWGENERAL_SM(x) USB_HWGENERAL_SM(x) -#define USBHS_HWHOST_HC_MASK USB_HWHOST_HC_MASK -#define USBHS_HWHOST_HC_SHIFT USB_HWHOST_HC_SHIFT -#define USBHS_HWHOST_HC(x) USB_HWHOST_HC(x) -#define USBHS_HWHOST_NPORT_MASK USB_HWHOST_NPORT_MASK -#define USBHS_HWHOST_NPORT_SHIFT USB_HWHOST_NPORT_SHIFT -#define USBHS_HWHOST_NPORT(x) USB_HWHOST_NPORT(x) -#define USBHS_HWDEVICE_DC_MASK USB_HWDEVICE_DC_MASK -#define USBHS_HWDEVICE_DC_SHIFT USB_HWDEVICE_DC_SHIFT -#define USBHS_HWDEVICE_DC(x) USB_HWDEVICE_DC(x) -#define USBHS_HWDEVICE_DEVEP_MASK USB_HWDEVICE_DEVEP_MASK -#define USBHS_HWDEVICE_DEVEP_SHIFT USB_HWDEVICE_DEVEP_SHIFT -#define USBHS_HWDEVICE_DEVEP(x) USB_HWDEVICE_DEVEP(x) -#define USBHS_HWTXBUF_TXBURST_MASK USB_HWTXBUF_TXBURST_MASK -#define USBHS_HWTXBUF_TXBURST_SHIFT USB_HWTXBUF_TXBURST_SHIFT -#define USBHS_HWTXBUF_TXBURST(x) USB_HWTXBUF_TXBURST(x) -#define USBHS_HWTXBUF_TXCHANADD_MASK USB_HWTXBUF_TXCHANADD_MASK -#define USBHS_HWTXBUF_TXCHANADD_SHIFT USB_HWTXBUF_TXCHANADD_SHIFT -#define USBHS_HWTXBUF_TXCHANADD(x) USB_HWTXBUF_TXCHANADD(x) -#define USBHS_HWRXBUF_RXBURST_MASK USB_HWRXBUF_RXBURST_MASK -#define USBHS_HWRXBUF_RXBURST_SHIFT USB_HWRXBUF_RXBURST_SHIFT -#define USBHS_HWRXBUF_RXBURST(x) USB_HWRXBUF_RXBURST(x) -#define USBHS_HWRXBUF_RXADD_MASK USB_HWRXBUF_RXADD_MASK -#define USBHS_HWRXBUF_RXADD_SHIFT USB_HWRXBUF_RXADD_SHIFT -#define USBHS_HWRXBUF_RXADD(x) USB_HWRXBUF_RXADD(x) -#define USBHS_GPTIMER0LD_GPTLD_MASK USB_GPTIMER0LD_GPTLD_MASK -#define USBHS_GPTIMER0LD_GPTLD_SHIFT USB_GPTIMER0LD_GPTLD_SHIFT -#define USBHS_GPTIMER0LD_GPTLD(x) USB_GPTIMER0LD_GPTLD(x) -#define USBHS_GPTIMER0CTL_GPTCNT_MASK USB_GPTIMER0CTRL_GPTCNT_MASK -#define USBHS_GPTIMER0CTL_GPTCNT_SHIFT USB_GPTIMER0CTRL_GPTCNT_SHIFT -#define USBHS_GPTIMER0CTL_GPTCNT(x) USB_GPTIMER0CTRL_GPTCNT(x) -#define USBHS_GPTIMER0CTL_MODE_MASK USB_GPTIMER0CTRL_GPTMODE_MASK -#define USBHS_GPTIMER0CTL_MODE_SHIFT USB_GPTIMER0CTRL_GPTMODE_SHIFT -#define USBHS_GPTIMER0CTL_MODE(x) USB_GPTIMER0CTRL_GPTMODE(x) -#define USBHS_GPTIMER0CTL_RST_MASK USB_GPTIMER0CTRL_GPTRST_MASK -#define USBHS_GPTIMER0CTL_RST_SHIFT USB_GPTIMER0CTRL_GPTRST_SHIFT -#define USBHS_GPTIMER0CTL_RST(x) USB_GPTIMER0CTRL_GPTRST(x) -#define USBHS_GPTIMER0CTL_RUN_MASK USB_GPTIMER0CTRL_GPTRUN_MASK -#define USBHS_GPTIMER0CTL_RUN_SHIFT USB_GPTIMER0CTRL_GPTRUN_SHIFT -#define USBHS_GPTIMER0CTL_RUN(x) USB_GPTIMER0CTRL_GPTRUN(x) -#define USBHS_GPTIMER1LD_GPTLD_MASK USB_GPTIMER1LD_GPTLD_MASK -#define USBHS_GPTIMER1LD_GPTLD_SHIFT USB_GPTIMER1LD_GPTLD_SHIFT -#define USBHS_GPTIMER1LD_GPTLD(x) USB_GPTIMER1LD_GPTLD(x) -#define USBHS_GPTIMER1CTL_GPTCNT_MASK USB_GPTIMER1CTRL_GPTCNT_MASK -#define USBHS_GPTIMER1CTL_GPTCNT_SHIFT USB_GPTIMER1CTRL_GPTCNT_SHIFT -#define USBHS_GPTIMER1CTL_GPTCNT(x) USB_GPTIMER1CTRL_GPTCNT(x) -#define USBHS_GPTIMER1CTL_MODE_MASK USB_GPTIMER1CTRL_GPTMODE_MASK -#define USBHS_GPTIMER1CTL_MODE_SHIFT USB_GPTIMER1CTRL_GPTMODE_SHIFT -#define USBHS_GPTIMER1CTL_MODE(x) USB_GPTIMER1CTRL_GPTMODE(x) -#define USBHS_GPTIMER1CTL_RST_MASK USB_GPTIMER1CTRL_GPTRST_MASK -#define USBHS_GPTIMER1CTL_RST_SHIFT USB_GPTIMER1CTRL_GPTRST_SHIFT -#define USBHS_GPTIMER1CTL_RST(x) USB_GPTIMER1CTRL_GPTRST(x) -#define USBHS_GPTIMER1CTL_RUN_MASK USB_GPTIMER1CTRL_GPTRUN_MASK -#define USBHS_GPTIMER1CTL_RUN_SHIFT USB_GPTIMER1CTRL_GPTRUN_SHIFT -#define USBHS_GPTIMER1CTL_RUN(x) USB_GPTIMER1CTRL_GPTRUN(x) -#define USBHS_USB_SBUSCFG_BURSTMODE_MASK USB_SBUSCFG_AHBBRST_MASK -#define USBHS_USB_SBUSCFG_BURSTMODE_SHIFT USB_SBUSCFG_AHBBRST_SHIFT -#define USBHS_USB_SBUSCFG_BURSTMODE(x) USB_SBUSCFG_AHBBRST(x) -#define USBHS_HCIVERSION_CAPLENGTH(x) USB_HCIVERSION_CAPLENGTH(x) -#define USBHS_HCIVERSION_HCIVERSION_MASK USB_HCIVERSION_HCIVERSION_MASK -#define USBHS_HCIVERSION_HCIVERSION_SHIFT USB_HCIVERSION_HCIVERSION_SHIFT -#define USBHS_HCIVERSION_HCIVERSION(x) USB_HCIVERSION_HCIVERSION(x) -#define USBHS_HCSPARAMS_N_PORTS_MASK USB_HCSPARAMS_N_PORTS_MASK -#define USBHS_HCSPARAMS_N_PORTS_SHIFT USB_HCSPARAMS_N_PORTS_SHIFT -#define USBHS_HCSPARAMS_N_PORTS(x) USB_HCSPARAMS_N_PORTS(x) -#define USBHS_HCSPARAMS_PPC_MASK USB_HCSPARAMS_PPC_MASK -#define USBHS_HCSPARAMS_PPC_SHIFT USB_HCSPARAMS_PPC_SHIFT -#define USBHS_HCSPARAMS_PPC(x) USB_HCSPARAMS_PPC(x) -#define USBHS_HCSPARAMS_N_PCC_MASK USB_HCSPARAMS_N_PCC_MASK -#define USBHS_HCSPARAMS_N_PCC_SHIFT USB_HCSPARAMS_N_PCC_SHIFT -#define USBHS_HCSPARAMS_N_PCC(x) USB_HCSPARAMS_N_PCC(x) -#define USBHS_HCSPARAMS_N_CC_MASK USB_HCSPARAMS_N_CC_MASK -#define USBHS_HCSPARAMS_N_CC_SHIFT USB_HCSPARAMS_N_CC_SHIFT -#define USBHS_HCSPARAMS_N_CC(x) USB_HCSPARAMS_N_CC(x) -#define USBHS_HCSPARAMS_PI_MASK USB_HCSPARAMS_PI_MASK -#define USBHS_HCSPARAMS_PI_SHIFT USB_HCSPARAMS_PI_SHIFT -#define USBHS_HCSPARAMS_PI(x) USB_HCSPARAMS_PI(x) -#define USBHS_HCSPARAMS_N_PTT_MASK USB_HCSPARAMS_N_PTT_MASK -#define USBHS_HCSPARAMS_N_PTT_SHIFT USB_HCSPARAMS_N_PTT_SHIFT -#define USBHS_HCSPARAMS_N_PTT(x) USB_HCSPARAMS_N_PTT(x) -#define USBHS_HCSPARAMS_N_TT_MASK USB_HCSPARAMS_N_TT_MASK -#define USBHS_HCSPARAMS_N_TT_SHIFT USB_HCSPARAMS_N_TT_SHIFT -#define USBHS_HCSPARAMS_N_TT(x) USB_HCSPARAMS_N_TT(x) -#define USBHS_HCCPARAMS_ADC_MASK USB_HCCPARAMS_ADC_MASK -#define USBHS_HCCPARAMS_ADC_SHIFT USB_HCCPARAMS_ADC_SHIFT -#define USBHS_HCCPARAMS_ADC(x) USB_HCCPARAMS_ADC(x) -#define USBHS_HCCPARAMS_PFL_MASK USB_HCCPARAMS_PFL_MASK -#define USBHS_HCCPARAMS_PFL_SHIFT USB_HCCPARAMS_PFL_SHIFT -#define USBHS_HCCPARAMS_PFL(x) USB_HCCPARAMS_PFL(x) -#define USBHS_HCCPARAMS_ASP_MASK USB_HCCPARAMS_ASP_MASK -#define USBHS_HCCPARAMS_ASP_SHIFT USB_HCCPARAMS_ASP_SHIFT -#define USBHS_HCCPARAMS_ASP(x) USB_HCCPARAMS_ASP(x) -#define USBHS_HCCPARAMS_IST_MASK USB_HCCPARAMS_IST_MASK -#define USBHS_HCCPARAMS_IST_SHIFT USB_HCCPARAMS_IST_SHIFT -#define USBHS_HCCPARAMS_IST(x) USB_HCCPARAMS_IST(x) -#define USBHS_HCCPARAMS_EECP_MASK USB_HCCPARAMS_EECP_MASK -#define USBHS_HCCPARAMS_EECP_SHIFT USB_HCCPARAMS_EECP_SHIFT -#define USBHS_HCCPARAMS_EECP(x) USB_HCCPARAMS_EECP(x) -#define USBHS_DCIVERSION_DCIVERSION_MASK USB_DCIVERSION_DCIVERSION_MASK -#define USBHS_DCIVERSION_DCIVERSION_SHIFT USB_DCIVERSION_DCIVERSION_SHIFT -#define USBHS_DCIVERSION_DCIVERSION(x) USB_DCIVERSION_DCIVERSION(x) -#define USBHS_DCCPARAMS_DEN_MASK USB_DCCPARAMS_DEN_MASK -#define USBHS_DCCPARAMS_DEN_SHIFT USB_DCCPARAMS_DEN_SHIFT -#define USBHS_DCCPARAMS_DEN(x) USB_DCCPARAMS_DEN(x) -#define USBHS_DCCPARAMS_DC_MASK USB_DCCPARAMS_DC_MASK -#define USBHS_DCCPARAMS_DC_SHIFT USB_DCCPARAMS_DC_SHIFT -#define USBHS_DCCPARAMS_DC(x) USB_DCCPARAMS_DC(x) -#define USBHS_DCCPARAMS_HC_MASK USB_DCCPARAMS_HC_MASK -#define USBHS_DCCPARAMS_HC_SHIFT USB_DCCPARAMS_HC_SHIFT -#define USBHS_DCCPARAMS_HC(x) USB_DCCPARAMS_HC(x) -#define USBHS_USBCMD_RS_MASK USB_USBCMD_RS_MASK -#define USBHS_USBCMD_RS_SHIFT USB_USBCMD_RS_SHIFT -#define USBHS_USBCMD_RS(x) USB_USBCMD_RS(x) -#define USBHS_USBCMD_RST_MASK USB_USBCMD_RST_MASK -#define USBHS_USBCMD_RST_SHIFT USB_USBCMD_RST_SHIFT -#define USBHS_USBCMD_RST(x) USB_USBCMD_RST(x) -#define USBHS_USBCMD_FS_MASK USB_USBCMD_FS_1_MASK -#define USBHS_USBCMD_FS_SHIFT USB_USBCMD_FS_1_SHIFT -#define USBHS_USBCMD_FS(x) USB_USBCMD_FS_1(x) -#define USBHS_USBCMD_PSE_MASK USB_USBCMD_PSE_MASK -#define USBHS_USBCMD_PSE_SHIFT USB_USBCMD_PSE_SHIFT -#define USBHS_USBCMD_PSE(x) USB_USBCMD_PSE(x) -#define USBHS_USBCMD_ASE_MASK USB_USBCMD_ASE_MASK -#define USBHS_USBCMD_ASE_SHIFT USB_USBCMD_ASE_SHIFT -#define USBHS_USBCMD_ASE(x) USB_USBCMD_ASE(x) -#define USBHS_USBCMD_IAA_MASK USB_USBCMD_IAA_MASK -#define USBHS_USBCMD_IAA_SHIFT USB_USBCMD_IAA_SHIFT -#define USBHS_USBCMD_IAA(x) USB_USBCMD_IAA(x) -#define USBHS_USBCMD_ASP_MASK USB_USBCMD_ASP_MASK -#define USBHS_USBCMD_ASP_SHIFT USB_USBCMD_ASP_SHIFT -#define USBHS_USBCMD_ASP(x) USB_USBCMD_ASP(x) -#define USBHS_USBCMD_ASPE_MASK USB_USBCMD_ASPE_MASK -#define USBHS_USBCMD_ASPE_SHIFT USB_USBCMD_ASPE_SHIFT -#define USBHS_USBCMD_ASPE(x) USB_USBCMD_ASPE(x) -#define USBHS_USBCMD_ATDTW_MASK USB_USBCMD_ATDTW_MASK -#define USBHS_USBCMD_ATDTW_SHIFT USB_USBCMD_ATDTW_SHIFT -#define USBHS_USBCMD_ATDTW(x) USB_USBCMD_ATDTW(x) -#define USBHS_USBCMD_SUTW_MASK USB_USBCMD_SUTW_MASK -#define USBHS_USBCMD_SUTW_SHIFT USB_USBCMD_SUTW_SHIFT -#define USBHS_USBCMD_SUTW(x) USB_USBCMD_SUTW(x) -#define USBHS_USBCMD_FS2_MASK USB_USBCMD_FS_2_MASK -#define USBHS_USBCMD_FS2_SHIFT USB_USBCMD_FS_2_SHIFT -#define USBHS_USBCMD_FS2(x) USB_USBCMD_FS_2(x) -#define USBHS_USBCMD_ITC_MASK USB_USBCMD_ITC_MASK -#define USBHS_USBCMD_ITC_SHIFT USB_USBCMD_ITC_SHIFT -#define USBHS_USBCMD_ITC(x) USB_USBCMD_ITC(x) -#define USBHS_USBSTS_UI_MASK USB_USBSTS_UI_MASK -#define USBHS_USBSTS_UI_SHIFT USB_USBSTS_UI_SHIFT -#define USBHS_USBSTS_UI(x) USB_USBSTS_UI(x) -#define USBHS_USBSTS_UEI_MASK USB_USBSTS_UEI_MASK -#define USBHS_USBSTS_UEI_SHIFT USB_USBSTS_UEI_SHIFT -#define USBHS_USBSTS_UEI(x) USB_USBSTS_UEI(x) -#define USBHS_USBSTS_PCI_MASK USB_USBSTS_PCI_MASK -#define USBHS_USBSTS_PCI_SHIFT USB_USBSTS_PCI_SHIFT -#define USBHS_USBSTS_PCI(x) USB_USBSTS_PCI(x) -#define USBHS_USBSTS_FRI_MASK USB_USBSTS_FRI_MASK -#define USBHS_USBSTS_FRI_SHIFT USB_USBSTS_FRI_SHIFT -#define USBHS_USBSTS_FRI(x) USB_USBSTS_FRI(x) -#define USBHS_USBSTS_SEI_MASK USB_USBSTS_SEI_MASK -#define USBHS_USBSTS_SEI_SHIFT USB_USBSTS_SEI_SHIFT -#define USBHS_USBSTS_SEI(x) USB_USBSTS_SEI(x) -#define USBHS_USBSTS_AAI_MASK USB_USBSTS_AAI_MASK -#define USBHS_USBSTS_AAI_SHIFT USB_USBSTS_AAI_SHIFT -#define USBHS_USBSTS_AAI(x) USB_USBSTS_AAI(x) -#define USBHS_USBSTS_URI_MASK USB_USBSTS_URI_MASK -#define USBHS_USBSTS_URI_SHIFT USB_USBSTS_URI_SHIFT -#define USBHS_USBSTS_URI(x) USB_USBSTS_URI(x) -#define USBHS_USBSTS_SRI_MASK USB_USBSTS_SRI_MASK -#define USBHS_USBSTS_SRI_SHIFT USB_USBSTS_SRI_SHIFT -#define USBHS_USBSTS_SRI(x) USB_USBSTS_SRI(x) -#define USBHS_USBSTS_SLI_MASK USB_USBSTS_SLI_MASK -#define USBHS_USBSTS_SLI_SHIFT USB_USBSTS_SLI_SHIFT -#define USBHS_USBSTS_SLI(x) USB_USBSTS_SLI(x) -#define USBHS_USBSTS_ULPII_MASK USB_USBSTS_ULPII_MASK -#define USBHS_USBSTS_ULPII_SHIFT USB_USBSTS_ULPII_SHIFT -#define USBHS_USBSTS_ULPII(x) USB_USBSTS_ULPII(x) -#define USBHS_USBSTS_HCH_MASK USB_USBSTS_HCH_MASK -#define USBHS_USBSTS_HCH_SHIFT USB_USBSTS_HCH_SHIFT -#define USBHS_USBSTS_HCH(x) USB_USBSTS_HCH(x) -#define USBHS_USBSTS_RCL_MASK USB_USBSTS_RCL_MASK -#define USBHS_USBSTS_RCL_SHIFT USB_USBSTS_RCL_SHIFT -#define USBHS_USBSTS_RCL(x) USB_USBSTS_RCL(x) -#define USBHS_USBSTS_PS_MASK USB_USBSTS_PS_MASK -#define USBHS_USBSTS_PS_SHIFT USB_USBSTS_PS_SHIFT -#define USBHS_USBSTS_PS(x) USB_USBSTS_PS(x) -#define USBHS_USBSTS_AS_MASK USB_USBSTS_AS_MASK -#define USBHS_USBSTS_AS_SHIFT USB_USBSTS_AS_SHIFT -#define USBHS_USBSTS_AS(x) USB_USBSTS_AS(x) -#define USBHS_USBSTS_NAKI_MASK USB_USBSTS_NAKI_MASK -#define USBHS_USBSTS_NAKI_SHIFT USB_USBSTS_NAKI_SHIFT -#define USBHS_USBSTS_NAKI(x) USB_USBSTS_NAKI(x) -#define USBHS_USBSTS_TI0_MASK USB_USBSTS_TI0_MASK -#define USBHS_USBSTS_TI0_SHIFT USB_USBSTS_TI0_SHIFT -#define USBHS_USBSTS_TI0(x) USB_USBSTS_TI0(x) -#define USBHS_USBSTS_TI1_MASK USB_USBSTS_TI1_MASK -#define USBHS_USBSTS_TI1_SHIFT USB_USBSTS_TI1_SHIFT -#define USBHS_USBSTS_TI1(x) USB_USBSTS_TI1(x) -#define USBHS_USBINTR_UE_MASK USB_USBINTR_UE_MASK -#define USBHS_USBINTR_UE_SHIFT USB_USBINTR_UE_SHIFT -#define USBHS_USBINTR_UE(x) USB_USBINTR_UE(x) -#define USBHS_USBINTR_UEE_MASK USB_USBINTR_UEE_MASK -#define USBHS_USBINTR_UEE_SHIFT USB_USBINTR_UEE_SHIFT -#define USBHS_USBINTR_UEE(x) USB_USBINTR_UEE(x) -#define USBHS_USBINTR_PCE_MASK USB_USBINTR_PCE_MASK -#define USBHS_USBINTR_PCE_SHIFT USB_USBINTR_PCE_SHIFT -#define USBHS_USBINTR_PCE(x) USB_USBINTR_PCE(x) -#define USBHS_USBINTR_FRE_MASK USB_USBINTR_FRE_MASK -#define USBHS_USBINTR_FRE_SHIFT USB_USBINTR_FRE_SHIFT -#define USBHS_USBINTR_FRE(x) USB_USBINTR_FRE(x) -#define USBHS_USBINTR_SEE_MASK USB_USBINTR_SEE_MASK -#define USBHS_USBINTR_SEE_SHIFT USB_USBINTR_SEE_SHIFT -#define USBHS_USBINTR_SEE(x) USB_USBINTR_SEE(x) -#define USBHS_USBINTR_AAE_MASK USB_USBINTR_AAE_MASK -#define USBHS_USBINTR_AAE_SHIFT USB_USBINTR_AAE_SHIFT -#define USBHS_USBINTR_AAE(x) USB_USBINTR_AAE(x) -#define USBHS_USBINTR_URE_MASK USB_USBINTR_URE_MASK -#define USBHS_USBINTR_URE_SHIFT USB_USBINTR_URE_SHIFT -#define USBHS_USBINTR_URE(x) USB_USBINTR_URE(x) -#define USBHS_USBINTR_SRE_MASK USB_USBINTR_SRE_MASK -#define USBHS_USBINTR_SRE_SHIFT USB_USBINTR_SRE_SHIFT -#define USBHS_USBINTR_SRE(x) USB_USBINTR_SRE(x) -#define USBHS_USBINTR_SLE_MASK USB_USBINTR_SLE_MASK -#define USBHS_USBINTR_SLE_SHIFT USB_USBINTR_SLE_SHIFT -#define USBHS_USBINTR_SLE(x) USB_USBINTR_SLE(x) -#define USBHS_USBINTR_ULPIE_MASK USB_USBINTR_ULPIE_MASK -#define USBHS_USBINTR_ULPIE_SHIFT USB_USBINTR_ULPIE_SHIFT -#define USBHS_USBINTR_ULPIE(x) USB_USBINTR_ULPIE(x) -#define USBHS_USBINTR_NAKE_MASK USB_USBINTR_NAKE_MASK -#define USBHS_USBINTR_NAKE_SHIFT USB_USBINTR_NAKE_SHIFT -#define USBHS_USBINTR_NAKE(x) USB_USBINTR_NAKE(x) -#define USBHS_USBINTR_UAIE_MASK USB_USBINTR_UAIE_MASK -#define USBHS_USBINTR_UAIE_SHIFT USB_USBINTR_UAIE_SHIFT -#define USBHS_USBINTR_UAIE(x) USB_USBINTR_UAIE(x) -#define USBHS_USBINTR_UPIE_MASK USB_USBINTR_UPIE_MASK -#define USBHS_USBINTR_UPIE_SHIFT USB_USBINTR_UPIE_SHIFT -#define USBHS_USBINTR_UPIE(x) USB_USBINTR_UPIE(x) -#define USBHS_USBINTR_TIE0_MASK USB_USBINTR_TIE0_MASK -#define USBHS_USBINTR_TIE0_SHIFT USB_USBINTR_TIE0_SHIFT -#define USBHS_USBINTR_TIE0(x) USB_USBINTR_TIE0(x) -#define USBHS_USBINTR_TIE1_MASK USB_USBINTR_TIE1_MASK -#define USBHS_USBINTR_TIE1_SHIFT USB_USBINTR_TIE1_SHIFT -#define USBHS_USBINTR_TIE1(x) USB_USBINTR_TIE1(x) -#define USBHS_FRINDEX_FRINDEX_MASK USB_FRINDEX_FRINDEX_MASK -#define USBHS_FRINDEX_FRINDEX_SHIFT USB_FRINDEX_FRINDEX_SHIFT -#define USBHS_FRINDEX_FRINDEX(x) USB_FRINDEX_FRINDEX(x) -#define USBHS_DEVICEADDR_USBADRA_MASK USB_DEVICEADDR_USBADRA_MASK -#define USBHS_DEVICEADDR_USBADRA_SHIFT USB_DEVICEADDR_USBADRA_SHIFT -#define USBHS_DEVICEADDR_USBADRA(x) USB_DEVICEADDR_USBADRA(x) -#define USBHS_DEVICEADDR_USBADR_MASK USB_DEVICEADDR_USBADR_MASK -#define USBHS_DEVICEADDR_USBADR_SHIFT USB_DEVICEADDR_USBADR_SHIFT -#define USBHS_DEVICEADDR_USBADR(x) USB_DEVICEADDR_USBADR(x) -#define USBHS_PERIODICLISTBASE_PERBASE_MASK USB_PERIODICLISTBASE_BASEADR_MASK -#define USBHS_PERIODICLISTBASE_PERBASE_SHIFT USB_PERIODICLISTBASE_BASEADR_SHIFT -#define USBHS_PERIODICLISTBASE_PERBASE(x) USB_PERIODICLISTBASE_BASEADR(x) -#define USBHS_ASYNCLISTADDR_ASYBASE_MASK USB_ASYNCLISTADDR_ASYBASE_MASK -#define USBHS_ASYNCLISTADDR_ASYBASE_SHIFT USB_ASYNCLISTADDR_ASYBASE_SHIFT -#define USBHS_ASYNCLISTADDR_ASYBASE(x) USB_ASYNCLISTADDR_ASYBASE(x) -#define USBHS_EPLISTADDR_EPBASE_MASK USB_ENDPTLISTADDR_EPBASE_MASK -#define USBHS_EPLISTADDR_EPBASE_SHIFT USB_ENDPTLISTADDR_EPBASE_SHIFT -#define USBHS_EPLISTADDR_EPBASE(x) USB_ENDPTLISTADDR_EPBASE(x) -#define USBHS_BURSTSIZE_RXPBURST_MASK USB_BURSTSIZE_RXPBURST_MASK -#define USBHS_BURSTSIZE_RXPBURST_SHIFT USB_BURSTSIZE_RXPBURST_SHIFT -#define USBHS_BURSTSIZE_RXPBURST(x) USB_BURSTSIZE_RXPBURST(x) -#define USBHS_BURSTSIZE_TXPBURST_MASK USB_BURSTSIZE_TXPBURST_MASK -#define USBHS_BURSTSIZE_TXPBURST_SHIFT USB_BURSTSIZE_TXPBURST_SHIFT -#define USBHS_BURSTSIZE_TXPBURST(x) USB_BURSTSIZE_TXPBURST(x) -#define USBHS_TXFILLTUNING_TXSCHOH_MASK USB_TXFILLTUNING_TXSCHOH_MASK -#define USBHS_TXFILLTUNING_TXSCHOH_SHIFT USB_TXFILLTUNING_TXSCHOH_SHIFT -#define USBHS_TXFILLTUNING_TXSCHOH(x) USB_TXFILLTUNING_TXSCHOH(x) -#define USBHS_TXFILLTUNING_TXSCHHEALTH_MASK USB_TXFILLTUNING_TXSCHHEALTH_MASK -#define USBHS_TXFILLTUNING_TXSCHHEALTH_SHIFT USB_TXFILLTUNING_TXSCHHEALTH_SHIFT -#define USBHS_TXFILLTUNING_TXSCHHEALTH(x) USB_TXFILLTUNING_TXSCHHEALTH(x) -#define USBHS_TXFILLTUNING_TXFIFOTHRES_MASK USB_TXFILLTUNING_TXFIFOTHRES_MASK -#define USBHS_TXFILLTUNING_TXFIFOTHRES_SHIFT USB_TXFILLTUNING_TXFIFOTHRES_SHIFT -#define USBHS_TXFILLTUNING_TXFIFOTHRES(x) USB_TXFILLTUNING_TXFIFOTHRES(x) -#define USBHS_ENDPTNAK_EPRN_MASK USB_ENDPTNAK_EPRN_MASK -#define USBHS_ENDPTNAK_EPRN_SHIFT USB_ENDPTNAK_EPRN_SHIFT -#define USBHS_ENDPTNAK_EPRN(x) USB_ENDPTNAK_EPRN(x) -#define USBHS_ENDPTNAK_EPTN_MASK USB_ENDPTNAK_EPTN_MASK -#define USBHS_ENDPTNAK_EPTN_SHIFT USB_ENDPTNAK_EPTN_SHIFT -#define USBHS_ENDPTNAK_EPTN(x) USB_ENDPTNAK_EPTN(x) -#define USBHS_ENDPTNAKEN_EPRNE_MASK USB_ENDPTNAKEN_EPRNE_MASK -#define USBHS_ENDPTNAKEN_EPRNE_SHIFT USB_ENDPTNAKEN_EPRNE_SHIFT -#define USBHS_ENDPTNAKEN_EPRNE(x) USB_ENDPTNAKEN_EPRNE(x) -#define USBHS_ENDPTNAKEN_EPTNE_MASK USB_ENDPTNAKEN_EPTNE_MASK -#define USBHS_ENDPTNAKEN_EPTNE_SHIFT USB_ENDPTNAKEN_EPTNE_SHIFT -#define USBHS_ENDPTNAKEN_EPTNE(x) USB_ENDPTNAKEN_EPTNE(x) -#define USBHS_CONFIGFLAG_CF_MASK USB_CONFIGFLAG_CF_MASK -#define USBHS_CONFIGFLAG_CF_SHIFT USB_CONFIGFLAG_CF_SHIFT -#define USBHS_CONFIGFLAG_CF(x) USB_CONFIGFLAG_CF(x) -#define USBHS_PORTSC1_CCS_MASK USB_PORTSC1_CCS_MASK -#define USBHS_PORTSC1_CCS_SHIFT USB_PORTSC1_CCS_SHIFT -#define USBHS_PORTSC1_CCS(x) USB_PORTSC1_CCS(x) -#define USBHS_PORTSC1_CSC_MASK USB_PORTSC1_CSC_MASK -#define USBHS_PORTSC1_CSC_SHIFT USB_PORTSC1_CSC_SHIFT -#define USBHS_PORTSC1_CSC(x) USB_PORTSC1_CSC(x) -#define USBHS_PORTSC1_PE_MASK USB_PORTSC1_PE_MASK -#define USBHS_PORTSC1_PE_SHIFT USB_PORTSC1_PE_SHIFT -#define USBHS_PORTSC1_PE(x) USB_PORTSC1_PE(x) -#define USBHS_PORTSC1_PEC_MASK USB_PORTSC1_PEC_MASK -#define USBHS_PORTSC1_PEC_SHIFT USB_PORTSC1_PEC_SHIFT -#define USBHS_PORTSC1_PEC(x) USB_PORTSC1_PEC(x) -#define USBHS_PORTSC1_OCA_MASK USB_PORTSC1_OCA_MASK -#define USBHS_PORTSC1_OCA_SHIFT USB_PORTSC1_OCA_SHIFT -#define USBHS_PORTSC1_OCA(x) USB_PORTSC1_OCA(x) -#define USBHS_PORTSC1_OCC_MASK USB_PORTSC1_OCC_MASK -#define USBHS_PORTSC1_OCC_SHIFT USB_PORTSC1_OCC_SHIFT -#define USBHS_PORTSC1_OCC(x) USB_PORTSC1_OCC(x) -#define USBHS_PORTSC1_FPR_MASK USB_PORTSC1_FPR_MASK -#define USBHS_PORTSC1_FPR_SHIFT USB_PORTSC1_FPR_SHIFT -#define USBHS_PORTSC1_FPR(x) USB_PORTSC1_FPR(x) -#define USBHS_PORTSC1_SUSP_MASK USB_PORTSC1_SUSP_MASK -#define USBHS_PORTSC1_SUSP_SHIFT USB_PORTSC1_SUSP_SHIFT -#define USBHS_PORTSC1_SUSP(x) USB_PORTSC1_SUSP(x) -#define USBHS_PORTSC1_PR_MASK USB_PORTSC1_PR_MASK -#define USBHS_PORTSC1_PR_SHIFT USB_PORTSC1_PR_SHIFT -#define USBHS_PORTSC1_PR(x) USB_PORTSC1_PR(x) -#define USBHS_PORTSC1_HSP_MASK USB_PORTSC1_HSP_MASK -#define USBHS_PORTSC1_HSP_SHIFT USB_PORTSC1_HSP_SHIFT -#define USBHS_PORTSC1_HSP(x) USB_PORTSC1_HSP(x) -#define USBHS_PORTSC1_LS_MASK USB_PORTSC1_LS_MASK -#define USBHS_PORTSC1_LS_SHIFT USB_PORTSC1_LS_SHIFT -#define USBHS_PORTSC1_LS(x) USB_PORTSC1_LS(x) -#define USBHS_PORTSC1_PP_MASK USB_PORTSC1_PP_MASK -#define USBHS_PORTSC1_PP_SHIFT USB_PORTSC1_PP_SHIFT -#define USBHS_PORTSC1_PP(x) USB_PORTSC1_PP(x) -#define USBHS_PORTSC1_PO_MASK USB_PORTSC1_PO_MASK -#define USBHS_PORTSC1_PO_SHIFT USB_PORTSC1_PO_SHIFT -#define USBHS_PORTSC1_PO(x) USB_PORTSC1_PO(x) -#define USBHS_PORTSC1_PIC_MASK USB_PORTSC1_PIC_MASK -#define USBHS_PORTSC1_PIC_SHIFT USB_PORTSC1_PIC_SHIFT -#define USBHS_PORTSC1_PIC(x) USB_PORTSC1_PIC(x) -#define USBHS_PORTSC1_PTC_MASK USB_PORTSC1_PTC_MASK -#define USBHS_PORTSC1_PTC_SHIFT USB_PORTSC1_PTC_SHIFT -#define USBHS_PORTSC1_PTC(x) USB_PORTSC1_PTC(x) -#define USBHS_PORTSC1_WKCN_MASK USB_PORTSC1_WKCN_MASK -#define USBHS_PORTSC1_WKCN_SHIFT USB_PORTSC1_WKCN_SHIFT -#define USBHS_PORTSC1_WKCN(x) USB_PORTSC1_WKCN(x) -#define USBHS_PORTSC1_WKDS_MASK USB_PORTSC1_WKDC_MASK -#define USBHS_PORTSC1_WKDS_SHIFT USB_PORTSC1_WKDC_SHIFT -#define USBHS_PORTSC1_WKDS(x) USB_PORTSC1_WKDC(x) -#define USBHS_PORTSC1_WKOC_MASK USB_PORTSC1_WKOC_MASK -#define USBHS_PORTSC1_WKOC_SHIFT USB_PORTSC1_WKOC_SHIFT -#define USBHS_PORTSC1_WKOC(x) USB_PORTSC1_WKOC(x) -#define USBHS_PORTSC1_PHCD_MASK USB_PORTSC1_PHCD_MASK -#define USBHS_PORTSC1_PHCD_SHIFT USB_PORTSC1_PHCD_SHIFT -#define USBHS_PORTSC1_PHCD(x) USB_PORTSC1_PHCD(x) -#define USBHS_PORTSC1_PFSC_MASK USB_PORTSC1_PFSC_MASK -#define USBHS_PORTSC1_PFSC_SHIFT USB_PORTSC1_PFSC_SHIFT -#define USBHS_PORTSC1_PFSC(x) USB_PORTSC1_PFSC(x) -#define USBHS_PORTSC1_PTS2_MASK USB_PORTSC1_PTS_2_MASK -#define USBHS_PORTSC1_PTS2_SHIFT USB_PORTSC1_PTS_2_SHIFT -#define USBHS_PORTSC1_PTS2(x) USB_PORTSC1_PTS_2(x) -#define USBHS_PORTSC1_PSPD_MASK USB_PORTSC1_PSPD_MASK -#define USBHS_PORTSC1_PSPD_SHIFT USB_PORTSC1_PSPD_SHIFT -#define USBHS_PORTSC1_PSPD(x) USB_PORTSC1_PSPD(x) -#define USBHS_PORTSC1_PTW_MASK USB_PORTSC1_PTW_MASK -#define USBHS_PORTSC1_PTW_SHIFT USB_PORTSC1_PTW_SHIFT -#define USBHS_PORTSC1_PTW(x) USB_PORTSC1_PTW(x) -#define USBHS_PORTSC1_STS_MASK USB_PORTSC1_STS_MASK -#define USBHS_PORTSC1_STS_SHIFT USB_PORTSC1_STS_SHIFT -#define USBHS_PORTSC1_STS(x) USB_PORTSC1_STS(x) -#define USBHS_PORTSC1_PTS_MASK USB_PORTSC1_PTS_1_MASK -#define USBHS_PORTSC1_PTS_SHIFT USB_PORTSC1_PTS_1_SHIFT -#define USBHS_PORTSC1_PTS(x) USB_PORTSC1_PTS_1(x) -#define USBHS_OTGSC_VD_MASK USB_OTGSC_VD_MASK -#define USBHS_OTGSC_VD_SHIFT USB_OTGSC_VD_SHIFT -#define USBHS_OTGSC_VD(x) USB_OTGSC_VD(x) -#define USBHS_OTGSC_VC_MASK USB_OTGSC_VC_MASK -#define USBHS_OTGSC_VC_SHIFT USB_OTGSC_VC_SHIFT -#define USBHS_OTGSC_VC(x) USB_OTGSC_VC(x) -#define USBHS_OTGSC_OT_MASK USB_OTGSC_OT_MASK -#define USBHS_OTGSC_OT_SHIFT USB_OTGSC_OT_SHIFT -#define USBHS_OTGSC_OT(x) USB_OTGSC_OT(x) -#define USBHS_OTGSC_DP_MASK USB_OTGSC_DP_MASK -#define USBHS_OTGSC_DP_SHIFT USB_OTGSC_DP_SHIFT -#define USBHS_OTGSC_DP(x) USB_OTGSC_DP(x) -#define USBHS_OTGSC_IDPU_MASK USB_OTGSC_IDPU_MASK -#define USBHS_OTGSC_IDPU_SHIFT USB_OTGSC_IDPU_SHIFT -#define USBHS_OTGSC_IDPU(x) USB_OTGSC_IDPU(x) -#define USBHS_OTGSC_ID_MASK USB_OTGSC_ID_MASK -#define USBHS_OTGSC_ID_SHIFT USB_OTGSC_ID_SHIFT -#define USBHS_OTGSC_ID(x) USB_OTGSC_ID(x) -#define USBHS_OTGSC_AVV_MASK USB_OTGSC_AVV_MASK -#define USBHS_OTGSC_AVV_SHIFT USB_OTGSC_AVV_SHIFT -#define USBHS_OTGSC_AVV(x) USB_OTGSC_AVV(x) -#define USBHS_OTGSC_ASV_MASK USB_OTGSC_ASV_MASK -#define USBHS_OTGSC_ASV_SHIFT USB_OTGSC_ASV_SHIFT -#define USBHS_OTGSC_ASV(x) USB_OTGSC_ASV(x) -#define USBHS_OTGSC_BSV_MASK USB_OTGSC_BSV_MASK -#define USBHS_OTGSC_BSV_SHIFT USB_OTGSC_BSV_SHIFT -#define USBHS_OTGSC_BSV(x) USB_OTGSC_BSV(x) -#define USBHS_OTGSC_BSE_MASK USB_OTGSC_BSE_MASK -#define USBHS_OTGSC_BSE_SHIFT USB_OTGSC_BSE_SHIFT -#define USBHS_OTGSC_BSE(x) USB_OTGSC_BSE(x) -#define USBHS_OTGSC_MST_MASK USB_OTGSC_TOG_1MS_MASK -#define USBHS_OTGSC_MST_SHIFT USB_OTGSC_TOG_1MS_SHIFT -#define USBHS_OTGSC_MST(x) USB_OTGSC_TOG_1MS(x) -#define USBHS_OTGSC_DPS_MASK USB_OTGSC_DPS_MASK -#define USBHS_OTGSC_DPS_SHIFT USB_OTGSC_DPS_SHIFT -#define USBHS_OTGSC_DPS(x) USB_OTGSC_DPS(x) -#define USBHS_OTGSC_IDIS_MASK USB_OTGSC_IDIS_MASK -#define USBHS_OTGSC_IDIS_SHIFT USB_OTGSC_IDIS_SHIFT -#define USBHS_OTGSC_IDIS(x) USB_OTGSC_IDIS(x) -#define USBHS_OTGSC_AVVIS_MASK USB_OTGSC_AVVIS_MASK -#define USBHS_OTGSC_AVVIS_SHIFT USB_OTGSC_AVVIS_SHIFT -#define USBHS_OTGSC_AVVIS(x) USB_OTGSC_AVVIS(x) -#define USBHS_OTGSC_ASVIS_MASK USB_OTGSC_ASVIS_MASK -#define USBHS_OTGSC_ASVIS_SHIFT USB_OTGSC_ASVIS_SHIFT -#define USBHS_OTGSC_ASVIS(x) USB_OTGSC_ASVIS(x) -#define USBHS_OTGSC_BSVIS_MASK USB_OTGSC_BSVIS_MASK -#define USBHS_OTGSC_BSVIS_SHIFT USB_OTGSC_BSVIS_SHIFT -#define USBHS_OTGSC_BSVIS(x) USB_OTGSC_BSVIS(x) -#define USBHS_OTGSC_BSEIS_MASK USB_OTGSC_BSEIS_MASK -#define USBHS_OTGSC_BSEIS_SHIFT USB_OTGSC_BSEIS_SHIFT -#define USBHS_OTGSC_BSEIS(x) USB_OTGSC_BSEIS(x) -#define USBHS_OTGSC_MSS_MASK USB_OTGSC_STATUS_1MS_MASK -#define USBHS_OTGSC_MSS_SHIFT USB_OTGSC_STATUS_1MS_SHIFT -#define USBHS_OTGSC_MSS(x) USB_OTGSC_STATUS_1MS(x) -#define USBHS_OTGSC_DPIS_MASK USB_OTGSC_DPIS_MASK -#define USBHS_OTGSC_DPIS_SHIFT USB_OTGSC_DPIS_SHIFT -#define USBHS_OTGSC_DPIS(x) USB_OTGSC_DPIS(x) -#define USBHS_OTGSC_IDIE_MASK USB_OTGSC_IDIE_MASK -#define USBHS_OTGSC_IDIE_SHIFT USB_OTGSC_IDIE_SHIFT -#define USBHS_OTGSC_IDIE(x) USB_OTGSC_IDIE(x) -#define USBHS_OTGSC_AVVIE_MASK USB_OTGSC_AVVIE_MASK -#define USBHS_OTGSC_AVVIE_SHIFT USB_OTGSC_AVVIE_SHIFT -#define USBHS_OTGSC_AVVIE(x) USB_OTGSC_AVVIE(x) -#define USBHS_OTGSC_ASVIE_MASK USB_OTGSC_ASVIE_MASK -#define USBHS_OTGSC_ASVIE_SHIFT USB_OTGSC_ASVIE_SHIFT -#define USBHS_OTGSC_ASVIE(x) USB_OTGSC_ASVIE(x) -#define USBHS_OTGSC_BSVIE_MASK USB_OTGSC_BSVIE_MASK -#define USBHS_OTGSC_BSVIE_SHIFT USB_OTGSC_BSVIE_SHIFT -#define USBHS_OTGSC_BSVIE(x) USB_OTGSC_BSVIE(x) -#define USBHS_OTGSC_BSEIE_MASK USB_OTGSC_BSEIE_MASK -#define USBHS_OTGSC_BSEIE_SHIFT USB_OTGSC_BSEIE_SHIFT -#define USBHS_OTGSC_BSEIE(x) USB_OTGSC_BSEIE(x) -#define USBHS_OTGSC_MSE_MASK USB_OTGSC_EN_1MS_MASK -#define USBHS_OTGSC_MSE_SHIFT USB_OTGSC_EN_1MS_SHIFT -#define USBHS_OTGSC_MSE(x) USB_OTGSC_EN_1MS(x) -#define USBHS_OTGSC_DPIE_MASK USB_OTGSC_DPIE_MASK -#define USBHS_OTGSC_DPIE_SHIFT USB_OTGSC_DPIE_SHIFT -#define USBHS_OTGSC_DPIE(x) USB_OTGSC_DPIE(x) -#define USBHS_USBMODE_CM_MASK USB_USBMODE_CM_MASK -#define USBHS_USBMODE_CM_SHIFT USB_USBMODE_CM_SHIFT -#define USBHS_USBMODE_CM(x) USB_USBMODE_CM(x) -#define USBHS_USBMODE_ES_MASK USB_USBMODE_ES_MASK -#define USBHS_USBMODE_ES_SHIFT USB_USBMODE_ES_SHIFT -#define USBHS_USBMODE_ES(x) USB_USBMODE_ES(x) -#define USBHS_USBMODE_SLOM_MASK USB_USBMODE_SLOM_MASK -#define USBHS_USBMODE_SLOM_SHIFT USB_USBMODE_SLOM_SHIFT -#define USBHS_USBMODE_SLOM(x) USB_USBMODE_SLOM(x) -#define USBHS_USBMODE_SDIS_MASK USB_USBMODE_SDIS_MASK -#define USBHS_USBMODE_SDIS_SHIFT USB_USBMODE_SDIS_SHIFT -#define USBHS_USBMODE_SDIS(x) USB_USBMODE_SDIS(x) -#define USBHS_EPSETUPSR_EPSETUPSTAT_MASK USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK -#define USBHS_EPSETUPSR_EPSETUPSTAT_SHIFT USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT -#define USBHS_EPSETUPSR_EPSETUPSTAT(x) USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT(x) -#define USBHS_EPPRIME_PERB_MASK USB_ENDPTPRIME_PERB_MASK -#define USBHS_EPPRIME_PERB_SHIFT USB_ENDPTPRIME_PERB_SHIFT -#define USBHS_EPPRIME_PERB(x) USB_ENDPTPRIME_PERB(x) -#define USBHS_EPPRIME_PETB_MASK USB_ENDPTPRIME_PETB_MASK -#define USBHS_EPPRIME_PETB_SHIFT USB_ENDPTPRIME_PETB_SHIFT -#define USBHS_EPPRIME_PETB(x) USB_ENDPTPRIME_PETB(x) -#define USBHS_EPFLUSH_FERB_MASK USB_ENDPTFLUSH_FERB_MASK -#define USBHS_EPFLUSH_FERB_SHIFT USB_ENDPTFLUSH_FERB_SHIFT -#define USBHS_EPFLUSH_FERB(x) USB_ENDPTFLUSH_FERB(x) -#define USBHS_EPFLUSH_FETB_MASK USB_ENDPTFLUSH_FETB_MASK -#define USBHS_EPFLUSH_FETB_SHIFT USB_ENDPTFLUSH_FETB_SHIFT -#define USBHS_EPFLUSH_FETB(x) USB_ENDPTFLUSH_FETB(x) -#define USBHS_EPSR_ERBR_MASK USB_ENDPTSTAT_ERBR_MASK -#define USBHS_EPSR_ERBR_SHIFT USB_ENDPTSTAT_ERBR_SHIFT -#define USBHS_EPSR_ERBR(x) USB_ENDPTSTAT_ERBR(x) -#define USBHS_EPSR_ETBR_MASK USB_ENDPTSTAT_ETBR_MASK -#define USBHS_EPSR_ETBR_SHIFT USB_ENDPTSTAT_ETBR_SHIFT -#define USBHS_EPSR_ETBR(x) USB_ENDPTSTAT_ETBR(x) -#define USBHS_EPCOMPLETE_ERCE_MASK USB_ENDPTCOMPLETE_ERCE_MASK -#define USBHS_EPCOMPLETE_ERCE_SHIFT USB_ENDPTCOMPLETE_ERCE_SHIFT -#define USBHS_EPCOMPLETE_ERCE(x) USB_ENDPTCOMPLETE_ERCE(x) -#define USBHS_EPCOMPLETE_ETCE_MASK USB_ENDPTCOMPLETE_ETCE_MASK -#define USBHS_EPCOMPLETE_ETCE_SHIFT USB_ENDPTCOMPLETE_ETCE_SHIFT -#define USBHS_EPCOMPLETE_ETCE(x) USB_ENDPTCOMPLETE_ETCE(x) -#define USBHS_EPCR0_RXS_MASK USB_ENDPTCTRL0_RXS_MASK -#define USBHS_EPCR0_RXS_SHIFT USB_ENDPTCTRL0_RXS_SHIFT -#define USBHS_EPCR0_RXS(x) USB_ENDPTCTRL0_RXS(x) -#define USBHS_EPCR0_RXT_MASK USB_ENDPTCTRL0_RXT_MASK -#define USBHS_EPCR0_RXT_SHIFT USB_ENDPTCTRL0_RXT_SHIFT -#define USBHS_EPCR0_RXT(x) USB_ENDPTCTRL0_RXT(x) -#define USBHS_EPCR0_RXE_MASK USB_ENDPTCTRL0_RXE_MASK -#define USBHS_EPCR0_RXE_SHIFT USB_ENDPTCTRL0_RXE_SHIFT -#define USBHS_EPCR0_RXE(x) USB_ENDPTCTRL0_RXE(x) -#define USBHS_EPCR0_TXS_MASK USB_ENDPTCTRL0_TXS_MASK -#define USBHS_EPCR0_TXS_SHIFT USB_ENDPTCTRL0_TXS_SHIFT -#define USBHS_EPCR0_TXS(x) USB_ENDPTCTRL0_TXS(x) -#define USBHS_EPCR0_TXT_MASK USB_ENDPTCTRL0_TXT_MASK -#define USBHS_EPCR0_TXT_SHIFT USB_ENDPTCTRL0_TXT_SHIFT -#define USBHS_EPCR0_TXT(x) USB_ENDPTCTRL0_TXT(x) -#define USBHS_EPCR0_TXE_MASK USB_ENDPTCTRL0_TXE_MASK -#define USBHS_EPCR0_TXE_SHIFT USB_ENDPTCTRL0_TXE_SHIFT -#define USBHS_EPCR0_TXE(x) USB_ENDPTCTRL0_TXE(x) -#define USBHS_EPCR_RXS_MASK USB_ENDPTCTRL_RXS_MASK -#define USBHS_EPCR_RXS_SHIFT USB_ENDPTCTRL_RXS_SHIFT -#define USBHS_EPCR_RXS(x) USB_ENDPTCTRL_RXS(x) -#define USBHS_EPCR_RXD_MASK USB_ENDPTCTRL_RXD_MASK -#define USBHS_EPCR_RXD_SHIFT USB_ENDPTCTRL_RXD_SHIFT -#define USBHS_EPCR_RXD(x) USB_ENDPTCTRL_RXD(x) -#define USBHS_EPCR_RXT_MASK USB_ENDPTCTRL_RXT_MASK -#define USBHS_EPCR_RXT_SHIFT USB_ENDPTCTRL_RXT_SHIFT -#define USBHS_EPCR_RXT(x) USB_ENDPTCTRL_RXT(x) -#define USBHS_EPCR_RXI_MASK USB_ENDPTCTRL_RXI_MASK -#define USBHS_EPCR_RXI_SHIFT USB_ENDPTCTRL_RXI_SHIFT -#define USBHS_EPCR_RXI(x) USB_ENDPTCTRL_RXI(x) -#define USBHS_EPCR_RXR_MASK USB_ENDPTCTRL_RXR_MASK -#define USBHS_EPCR_RXR_SHIFT USB_ENDPTCTRL_RXR_SHIFT -#define USBHS_EPCR_RXR(x) USB_ENDPTCTRL_RXR(x) -#define USBHS_EPCR_RXE_MASK USB_ENDPTCTRL_RXE_MASK -#define USBHS_EPCR_RXE_SHIFT USB_ENDPTCTRL_RXE_SHIFT -#define USBHS_EPCR_RXE(x) USB_ENDPTCTRL_RXE(x) -#define USBHS_EPCR_TXS_MASK USB_ENDPTCTRL_TXS_MASK -#define USBHS_EPCR_TXS_SHIFT USB_ENDPTCTRL_TXS_SHIFT -#define USBHS_EPCR_TXS(x) USB_ENDPTCTRL_TXS(x) -#define USBHS_EPCR_TXD_MASK USB_ENDPTCTRL_TXD_MASK -#define USBHS_EPCR_TXD_SHIFT USB_ENDPTCTRL_TXD_SHIFT -#define USBHS_EPCR_TXD(x) USB_ENDPTCTRL_TXD(x) -#define USBHS_EPCR_TXT_MASK USB_ENDPTCTRL_TXT_MASK -#define USBHS_EPCR_TXT_SHIFT USB_ENDPTCTRL_TXT_SHIFT -#define USBHS_EPCR_TXT(x) USB_ENDPTCTRL_TXT(x) -#define USBHS_EPCR_TXI_MASK USB_ENDPTCTRL_TXI_MASK -#define USBHS_EPCR_TXI_SHIFT USB_ENDPTCTRL_TXI_SHIFT -#define USBHS_EPCR_TXI(x) USB_ENDPTCTRL_TXI(x) -#define USBHS_EPCR_TXR_MASK USB_ENDPTCTRL_TXR_MASK -#define USBHS_EPCR_TXR_SHIFT USB_ENDPTCTRL_TXR_SHIFT -#define USBHS_EPCR_TXR(x) USB_ENDPTCTRL_TXR(x) -#define USBHS_EPCR_TXE_MASK USB_ENDPTCTRL_TXE_MASK -#define USBHS_EPCR_TXE_SHIFT USB_ENDPTCTRL_TXE_SHIFT -#define USBHS_EPCR_TXE(x) USB_ENDPTCTRL_TXE(x) -#define USBHS_EPCR_COUNT USB_ENDPTCTRL_COUNT -#define USBHS_Type USB_Type -#define USBHS_BASE_ADDRS { USB1_BASE, USB2_BASE } -#define USBHS_IRQS { USB_OTG1_IRQn, USB_OTG2_IRQn } -#define USBHS_IRQHandler USB_OTG1_IRQHandler - - -/*! - * @} - */ /* end of group USB_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- USBNC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USBNC_Peripheral_Access_Layer USBNC Peripheral Access Layer - * @{ - */ - -/** USBNC - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[2048]; - __IO uint32_t USB_OTGn_CTRL; /**< USB OTG1 Control Register..USB OTG2 Control Register, offset: 0x800 */ - uint8_t RESERVED_1[20]; - __IO uint32_t USB_OTGn_PHY_CTRL_0; /**< OTG1 UTMI PHY Control 0 Register..OTG2 UTMI PHY Control 0 Register, offset: 0x818 */ -} USBNC_Type; - -/* ---------------------------------------------------------------------------- - -- USBNC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USBNC_Register_Masks USBNC Register Masks - * @{ - */ - -/*! @name USB_OTGn_CTRL - USB OTG1 Control Register..USB OTG2 Control Register */ -/*! @{ */ - -#define USBNC_USB_OTGn_CTRL_OVER_CUR_DIS_MASK (0x80U) -#define USBNC_USB_OTGn_CTRL_OVER_CUR_DIS_SHIFT (7U) -/*! OVER_CUR_DIS - * 0b1..Disables overcurrent detection - * 0b0..Enables overcurrent detection - */ -#define USBNC_USB_OTGn_CTRL_OVER_CUR_DIS(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_OVER_CUR_DIS_SHIFT)) & USBNC_USB_OTGn_CTRL_OVER_CUR_DIS_MASK) - -#define USBNC_USB_OTGn_CTRL_OVER_CUR_POL_MASK (0x100U) -#define USBNC_USB_OTGn_CTRL_OVER_CUR_POL_SHIFT (8U) -/*! OVER_CUR_POL - * 0b1..Low active (low on this signal represents an overcurrent condition) - * 0b0..High active (high on this signal represents an overcurrent condition) - */ -#define USBNC_USB_OTGn_CTRL_OVER_CUR_POL(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_OVER_CUR_POL_SHIFT)) & USBNC_USB_OTGn_CTRL_OVER_CUR_POL_MASK) - -#define USBNC_USB_OTGn_CTRL_PWR_POL_MASK (0x200U) -#define USBNC_USB_OTGn_CTRL_PWR_POL_SHIFT (9U) -/*! PWR_POL - * 0b1..PMIC Power Pin is High active. - * 0b0..PMIC Power Pin is Low active. - */ -#define USBNC_USB_OTGn_CTRL_PWR_POL(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_PWR_POL_SHIFT)) & USBNC_USB_OTGn_CTRL_PWR_POL_MASK) - -#define USBNC_USB_OTGn_CTRL_WIE_MASK (0x400U) -#define USBNC_USB_OTGn_CTRL_WIE_SHIFT (10U) -/*! WIE - * 0b1..Interrupt Enabled - * 0b0..Interrupt Disabled - */ -#define USBNC_USB_OTGn_CTRL_WIE(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WIE_SHIFT)) & USBNC_USB_OTGn_CTRL_WIE_MASK) - -#define USBNC_USB_OTGn_CTRL_WKUP_SW_EN_MASK (0x4000U) -#define USBNC_USB_OTGn_CTRL_WKUP_SW_EN_SHIFT (14U) -/*! WKUP_SW_EN - * 0b1..Enable - * 0b0..Disable - */ -#define USBNC_USB_OTGn_CTRL_WKUP_SW_EN(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WKUP_SW_EN_SHIFT)) & USBNC_USB_OTGn_CTRL_WKUP_SW_EN_MASK) - -#define USBNC_USB_OTGn_CTRL_WKUP_SW_MASK (0x8000U) -#define USBNC_USB_OTGn_CTRL_WKUP_SW_SHIFT (15U) -/*! WKUP_SW - * 0b1..Force wake-up - * 0b0..Inactive - */ -#define USBNC_USB_OTGn_CTRL_WKUP_SW(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WKUP_SW_SHIFT)) & USBNC_USB_OTGn_CTRL_WKUP_SW_MASK) - -#define USBNC_USB_OTGn_CTRL_WKUP_ID_EN_MASK (0x10000U) -#define USBNC_USB_OTGn_CTRL_WKUP_ID_EN_SHIFT (16U) -/*! WKUP_ID_EN - * 0b1..Enable - * 0b0..Disable - */ -#define USBNC_USB_OTGn_CTRL_WKUP_ID_EN(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WKUP_ID_EN_SHIFT)) & USBNC_USB_OTGn_CTRL_WKUP_ID_EN_MASK) - -#define USBNC_USB_OTGn_CTRL_WKUP_VBUS_EN_MASK (0x20000U) -#define USBNC_USB_OTGn_CTRL_WKUP_VBUS_EN_SHIFT (17U) -/*! WKUP_VBUS_EN - * 0b1..Enable - * 0b0..Disable - */ -#define USBNC_USB_OTGn_CTRL_WKUP_VBUS_EN(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WKUP_VBUS_EN_SHIFT)) & USBNC_USB_OTGn_CTRL_WKUP_VBUS_EN_MASK) - -#define USBNC_USB_OTGn_CTRL_WKUP_DPDM_EN_MASK (0x20000000U) -#define USBNC_USB_OTGn_CTRL_WKUP_DPDM_EN_SHIFT (29U) -/*! WKUP_DPDM_EN - * 0b1..(Default) DPDM changes wake-up to be enabled, it is for device only. - * 0b0..DPDM changes wake-up to be disabled only when VBUS is 0. - */ -#define USBNC_USB_OTGn_CTRL_WKUP_DPDM_EN(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WKUP_DPDM_EN_SHIFT)) & USBNC_USB_OTGn_CTRL_WKUP_DPDM_EN_MASK) - -#define USBNC_USB_OTGn_CTRL_WIR_MASK (0x80000000U) -#define USBNC_USB_OTGn_CTRL_WIR_SHIFT (31U) -/*! WIR - * 0b1..Wake-up Interrupt Request received - * 0b0..No wake-up interrupt request received - */ -#define USBNC_USB_OTGn_CTRL_WIR(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_CTRL_WIR_SHIFT)) & USBNC_USB_OTGn_CTRL_WIR_MASK) -/*! @} */ - -/*! @name USB_OTGn_PHY_CTRL_0 - OTG1 UTMI PHY Control 0 Register..OTG2 UTMI PHY Control 0 Register */ -/*! @{ */ - -#define USBNC_USB_OTGn_PHY_CTRL_0_UTMI_CLK_VLD_MASK (0x80000000U) -#define USBNC_USB_OTGn_PHY_CTRL_0_UTMI_CLK_VLD_SHIFT (31U) -/*! UTMI_CLK_VLD - * 0b1..Valid - * 0b0..Invalid - */ -#define USBNC_USB_OTGn_PHY_CTRL_0_UTMI_CLK_VLD(x) (((uint32_t)(((uint32_t)(x)) << USBNC_USB_OTGn_PHY_CTRL_0_UTMI_CLK_VLD_SHIFT)) & USBNC_USB_OTGn_PHY_CTRL_0_UTMI_CLK_VLD_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group USBNC_Register_Masks */ - - -/* USBNC - Peripheral instance base addresses */ -/** Peripheral USBNC1 base address */ -#define USBNC1_BASE (0x402E0000u) -/** Peripheral USBNC1 base pointer */ -#define USBNC1 ((USBNC_Type *)USBNC1_BASE) -/** Peripheral USBNC2 base address */ -#define USBNC2_BASE (0x402E0004u) -/** Peripheral USBNC2 base pointer */ -#define USBNC2 ((USBNC_Type *)USBNC2_BASE) -/** Array initializer of USBNC peripheral base addresses */ -#define USBNC_BASE_ADDRS { 0u, USBNC1_BASE, USBNC2_BASE } -/** Array initializer of USBNC peripheral base pointers */ -#define USBNC_BASE_PTRS { (USBNC_Type *)0u, USBNC1, USBNC2 } - -/*! - * @} - */ /* end of group USBNC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- USBPHY Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USBPHY_Peripheral_Access_Layer USBPHY Peripheral Access Layer - * @{ - */ - -/** USBPHY - Register Layout Typedef */ -typedef struct { - __IO uint32_t PWD; /**< USB PHY Power-Down Register, offset: 0x0 */ - __IO uint32_t PWD_SET; /**< USB PHY Power-Down Register, offset: 0x4 */ - __IO uint32_t PWD_CLR; /**< USB PHY Power-Down Register, offset: 0x8 */ - __IO uint32_t PWD_TOG; /**< USB PHY Power-Down Register, offset: 0xC */ - __IO uint32_t TX; /**< USB PHY Transmitter Control Register, offset: 0x10 */ - __IO uint32_t TX_SET; /**< USB PHY Transmitter Control Register, offset: 0x14 */ - __IO uint32_t TX_CLR; /**< USB PHY Transmitter Control Register, offset: 0x18 */ - __IO uint32_t TX_TOG; /**< USB PHY Transmitter Control Register, offset: 0x1C */ - __IO uint32_t RX; /**< USB PHY Receiver Control Register, offset: 0x20 */ - __IO uint32_t RX_SET; /**< USB PHY Receiver Control Register, offset: 0x24 */ - __IO uint32_t RX_CLR; /**< USB PHY Receiver Control Register, offset: 0x28 */ - __IO uint32_t RX_TOG; /**< USB PHY Receiver Control Register, offset: 0x2C */ - __IO uint32_t CTRL; /**< USB PHY General Control Register, offset: 0x30 */ - __IO uint32_t CTRL_SET; /**< USB PHY General Control Register, offset: 0x34 */ - __IO uint32_t CTRL_CLR; /**< USB PHY General Control Register, offset: 0x38 */ - __IO uint32_t CTRL_TOG; /**< USB PHY General Control Register, offset: 0x3C */ - __IO uint32_t STATUS; /**< USB PHY Status Register, offset: 0x40 */ - uint8_t RESERVED_0[12]; - __IO uint32_t DEBUGr; /**< USB PHY Debug Register, offset: 0x50 */ - __IO uint32_t DEBUG_SET; /**< USB PHY Debug Register, offset: 0x54 */ - __IO uint32_t DEBUG_CLR; /**< USB PHY Debug Register, offset: 0x58 */ - __IO uint32_t DEBUG_TOG; /**< USB PHY Debug Register, offset: 0x5C */ - __I uint32_t DEBUG0_STATUS; /**< UTMI Debug Status Register 0, offset: 0x60 */ - uint8_t RESERVED_1[12]; - __IO uint32_t DEBUG1; /**< UTMI Debug Status Register 1, offset: 0x70 */ - __IO uint32_t DEBUG1_SET; /**< UTMI Debug Status Register 1, offset: 0x74 */ - __IO uint32_t DEBUG1_CLR; /**< UTMI Debug Status Register 1, offset: 0x78 */ - __IO uint32_t DEBUG1_TOG; /**< UTMI Debug Status Register 1, offset: 0x7C */ - __I uint32_t VERSION; /**< UTMI RTL Version, offset: 0x80 */ -} USBPHY_Type; - -/* ---------------------------------------------------------------------------- - -- USBPHY Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USBPHY_Register_Masks USBPHY Register Masks - * @{ - */ - -/*! @name PWD - USB PHY Power-Down Register */ -/*! @{ */ - -#define USBPHY_PWD_RSVD0_MASK (0x3FFU) -#define USBPHY_PWD_RSVD0_SHIFT (0U) -#define USBPHY_PWD_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RSVD0_SHIFT)) & USBPHY_PWD_RSVD0_MASK) - -#define USBPHY_PWD_TXPWDFS_MASK (0x400U) -#define USBPHY_PWD_TXPWDFS_SHIFT (10U) -#define USBPHY_PWD_TXPWDFS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TXPWDFS_SHIFT)) & USBPHY_PWD_TXPWDFS_MASK) - -#define USBPHY_PWD_TXPWDIBIAS_MASK (0x800U) -#define USBPHY_PWD_TXPWDIBIAS_SHIFT (11U) -#define USBPHY_PWD_TXPWDIBIAS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TXPWDIBIAS_SHIFT)) & USBPHY_PWD_TXPWDIBIAS_MASK) - -#define USBPHY_PWD_TXPWDV2I_MASK (0x1000U) -#define USBPHY_PWD_TXPWDV2I_SHIFT (12U) -#define USBPHY_PWD_TXPWDV2I(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TXPWDV2I_SHIFT)) & USBPHY_PWD_TXPWDV2I_MASK) - -#define USBPHY_PWD_RSVD1_MASK (0x1E000U) -#define USBPHY_PWD_RSVD1_SHIFT (13U) -#define USBPHY_PWD_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RSVD1_SHIFT)) & USBPHY_PWD_RSVD1_MASK) - -#define USBPHY_PWD_RXPWDENV_MASK (0x20000U) -#define USBPHY_PWD_RXPWDENV_SHIFT (17U) -#define USBPHY_PWD_RXPWDENV(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RXPWDENV_SHIFT)) & USBPHY_PWD_RXPWDENV_MASK) - -#define USBPHY_PWD_RXPWD1PT1_MASK (0x40000U) -#define USBPHY_PWD_RXPWD1PT1_SHIFT (18U) -#define USBPHY_PWD_RXPWD1PT1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RXPWD1PT1_SHIFT)) & USBPHY_PWD_RXPWD1PT1_MASK) - -#define USBPHY_PWD_RXPWDDIFF_MASK (0x80000U) -#define USBPHY_PWD_RXPWDDIFF_SHIFT (19U) -#define USBPHY_PWD_RXPWDDIFF(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RXPWDDIFF_SHIFT)) & USBPHY_PWD_RXPWDDIFF_MASK) - -#define USBPHY_PWD_RXPWDRX_MASK (0x100000U) -#define USBPHY_PWD_RXPWDRX_SHIFT (20U) -#define USBPHY_PWD_RXPWDRX(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RXPWDRX_SHIFT)) & USBPHY_PWD_RXPWDRX_MASK) - -#define USBPHY_PWD_RSVD2_MASK (0xFFE00000U) -#define USBPHY_PWD_RSVD2_SHIFT (21U) -#define USBPHY_PWD_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_RSVD2_SHIFT)) & USBPHY_PWD_RSVD2_MASK) -/*! @} */ - -/*! @name PWD_SET - USB PHY Power-Down Register */ -/*! @{ */ - -#define USBPHY_PWD_SET_RSVD0_MASK (0x3FFU) -#define USBPHY_PWD_SET_RSVD0_SHIFT (0U) -#define USBPHY_PWD_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RSVD0_SHIFT)) & USBPHY_PWD_SET_RSVD0_MASK) - -#define USBPHY_PWD_SET_TXPWDFS_MASK (0x400U) -#define USBPHY_PWD_SET_TXPWDFS_SHIFT (10U) -#define USBPHY_PWD_SET_TXPWDFS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_TXPWDFS_SHIFT)) & USBPHY_PWD_SET_TXPWDFS_MASK) - -#define USBPHY_PWD_SET_TXPWDIBIAS_MASK (0x800U) -#define USBPHY_PWD_SET_TXPWDIBIAS_SHIFT (11U) -#define USBPHY_PWD_SET_TXPWDIBIAS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_TXPWDIBIAS_SHIFT)) & USBPHY_PWD_SET_TXPWDIBIAS_MASK) - -#define USBPHY_PWD_SET_TXPWDV2I_MASK (0x1000U) -#define USBPHY_PWD_SET_TXPWDV2I_SHIFT (12U) -#define USBPHY_PWD_SET_TXPWDV2I(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_TXPWDV2I_SHIFT)) & USBPHY_PWD_SET_TXPWDV2I_MASK) - -#define USBPHY_PWD_SET_RSVD1_MASK (0x1E000U) -#define USBPHY_PWD_SET_RSVD1_SHIFT (13U) -#define USBPHY_PWD_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RSVD1_SHIFT)) & USBPHY_PWD_SET_RSVD1_MASK) - -#define USBPHY_PWD_SET_RXPWDENV_MASK (0x20000U) -#define USBPHY_PWD_SET_RXPWDENV_SHIFT (17U) -#define USBPHY_PWD_SET_RXPWDENV(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RXPWDENV_SHIFT)) & USBPHY_PWD_SET_RXPWDENV_MASK) - -#define USBPHY_PWD_SET_RXPWD1PT1_MASK (0x40000U) -#define USBPHY_PWD_SET_RXPWD1PT1_SHIFT (18U) -#define USBPHY_PWD_SET_RXPWD1PT1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RXPWD1PT1_SHIFT)) & USBPHY_PWD_SET_RXPWD1PT1_MASK) - -#define USBPHY_PWD_SET_RXPWDDIFF_MASK (0x80000U) -#define USBPHY_PWD_SET_RXPWDDIFF_SHIFT (19U) -#define USBPHY_PWD_SET_RXPWDDIFF(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RXPWDDIFF_SHIFT)) & USBPHY_PWD_SET_RXPWDDIFF_MASK) - -#define USBPHY_PWD_SET_RXPWDRX_MASK (0x100000U) -#define USBPHY_PWD_SET_RXPWDRX_SHIFT (20U) -#define USBPHY_PWD_SET_RXPWDRX(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RXPWDRX_SHIFT)) & USBPHY_PWD_SET_RXPWDRX_MASK) - -#define USBPHY_PWD_SET_RSVD2_MASK (0xFFE00000U) -#define USBPHY_PWD_SET_RSVD2_SHIFT (21U) -#define USBPHY_PWD_SET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_SET_RSVD2_SHIFT)) & USBPHY_PWD_SET_RSVD2_MASK) -/*! @} */ - -/*! @name PWD_CLR - USB PHY Power-Down Register */ -/*! @{ */ - -#define USBPHY_PWD_CLR_RSVD0_MASK (0x3FFU) -#define USBPHY_PWD_CLR_RSVD0_SHIFT (0U) -#define USBPHY_PWD_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RSVD0_SHIFT)) & USBPHY_PWD_CLR_RSVD0_MASK) - -#define USBPHY_PWD_CLR_TXPWDFS_MASK (0x400U) -#define USBPHY_PWD_CLR_TXPWDFS_SHIFT (10U) -#define USBPHY_PWD_CLR_TXPWDFS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_TXPWDFS_SHIFT)) & USBPHY_PWD_CLR_TXPWDFS_MASK) - -#define USBPHY_PWD_CLR_TXPWDIBIAS_MASK (0x800U) -#define USBPHY_PWD_CLR_TXPWDIBIAS_SHIFT (11U) -#define USBPHY_PWD_CLR_TXPWDIBIAS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_TXPWDIBIAS_SHIFT)) & USBPHY_PWD_CLR_TXPWDIBIAS_MASK) - -#define USBPHY_PWD_CLR_TXPWDV2I_MASK (0x1000U) -#define USBPHY_PWD_CLR_TXPWDV2I_SHIFT (12U) -#define USBPHY_PWD_CLR_TXPWDV2I(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_TXPWDV2I_SHIFT)) & USBPHY_PWD_CLR_TXPWDV2I_MASK) - -#define USBPHY_PWD_CLR_RSVD1_MASK (0x1E000U) -#define USBPHY_PWD_CLR_RSVD1_SHIFT (13U) -#define USBPHY_PWD_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RSVD1_SHIFT)) & USBPHY_PWD_CLR_RSVD1_MASK) - -#define USBPHY_PWD_CLR_RXPWDENV_MASK (0x20000U) -#define USBPHY_PWD_CLR_RXPWDENV_SHIFT (17U) -#define USBPHY_PWD_CLR_RXPWDENV(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RXPWDENV_SHIFT)) & USBPHY_PWD_CLR_RXPWDENV_MASK) - -#define USBPHY_PWD_CLR_RXPWD1PT1_MASK (0x40000U) -#define USBPHY_PWD_CLR_RXPWD1PT1_SHIFT (18U) -#define USBPHY_PWD_CLR_RXPWD1PT1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RXPWD1PT1_SHIFT)) & USBPHY_PWD_CLR_RXPWD1PT1_MASK) - -#define USBPHY_PWD_CLR_RXPWDDIFF_MASK (0x80000U) -#define USBPHY_PWD_CLR_RXPWDDIFF_SHIFT (19U) -#define USBPHY_PWD_CLR_RXPWDDIFF(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RXPWDDIFF_SHIFT)) & USBPHY_PWD_CLR_RXPWDDIFF_MASK) - -#define USBPHY_PWD_CLR_RXPWDRX_MASK (0x100000U) -#define USBPHY_PWD_CLR_RXPWDRX_SHIFT (20U) -#define USBPHY_PWD_CLR_RXPWDRX(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RXPWDRX_SHIFT)) & USBPHY_PWD_CLR_RXPWDRX_MASK) - -#define USBPHY_PWD_CLR_RSVD2_MASK (0xFFE00000U) -#define USBPHY_PWD_CLR_RSVD2_SHIFT (21U) -#define USBPHY_PWD_CLR_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_CLR_RSVD2_SHIFT)) & USBPHY_PWD_CLR_RSVD2_MASK) -/*! @} */ - -/*! @name PWD_TOG - USB PHY Power-Down Register */ -/*! @{ */ - -#define USBPHY_PWD_TOG_RSVD0_MASK (0x3FFU) -#define USBPHY_PWD_TOG_RSVD0_SHIFT (0U) -#define USBPHY_PWD_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RSVD0_SHIFT)) & USBPHY_PWD_TOG_RSVD0_MASK) - -#define USBPHY_PWD_TOG_TXPWDFS_MASK (0x400U) -#define USBPHY_PWD_TOG_TXPWDFS_SHIFT (10U) -#define USBPHY_PWD_TOG_TXPWDFS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_TXPWDFS_SHIFT)) & USBPHY_PWD_TOG_TXPWDFS_MASK) - -#define USBPHY_PWD_TOG_TXPWDIBIAS_MASK (0x800U) -#define USBPHY_PWD_TOG_TXPWDIBIAS_SHIFT (11U) -#define USBPHY_PWD_TOG_TXPWDIBIAS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_TXPWDIBIAS_SHIFT)) & USBPHY_PWD_TOG_TXPWDIBIAS_MASK) - -#define USBPHY_PWD_TOG_TXPWDV2I_MASK (0x1000U) -#define USBPHY_PWD_TOG_TXPWDV2I_SHIFT (12U) -#define USBPHY_PWD_TOG_TXPWDV2I(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_TXPWDV2I_SHIFT)) & USBPHY_PWD_TOG_TXPWDV2I_MASK) - -#define USBPHY_PWD_TOG_RSVD1_MASK (0x1E000U) -#define USBPHY_PWD_TOG_RSVD1_SHIFT (13U) -#define USBPHY_PWD_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RSVD1_SHIFT)) & USBPHY_PWD_TOG_RSVD1_MASK) - -#define USBPHY_PWD_TOG_RXPWDENV_MASK (0x20000U) -#define USBPHY_PWD_TOG_RXPWDENV_SHIFT (17U) -#define USBPHY_PWD_TOG_RXPWDENV(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RXPWDENV_SHIFT)) & USBPHY_PWD_TOG_RXPWDENV_MASK) - -#define USBPHY_PWD_TOG_RXPWD1PT1_MASK (0x40000U) -#define USBPHY_PWD_TOG_RXPWD1PT1_SHIFT (18U) -#define USBPHY_PWD_TOG_RXPWD1PT1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RXPWD1PT1_SHIFT)) & USBPHY_PWD_TOG_RXPWD1PT1_MASK) - -#define USBPHY_PWD_TOG_RXPWDDIFF_MASK (0x80000U) -#define USBPHY_PWD_TOG_RXPWDDIFF_SHIFT (19U) -#define USBPHY_PWD_TOG_RXPWDDIFF(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RXPWDDIFF_SHIFT)) & USBPHY_PWD_TOG_RXPWDDIFF_MASK) - -#define USBPHY_PWD_TOG_RXPWDRX_MASK (0x100000U) -#define USBPHY_PWD_TOG_RXPWDRX_SHIFT (20U) -#define USBPHY_PWD_TOG_RXPWDRX(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RXPWDRX_SHIFT)) & USBPHY_PWD_TOG_RXPWDRX_MASK) - -#define USBPHY_PWD_TOG_RSVD2_MASK (0xFFE00000U) -#define USBPHY_PWD_TOG_RSVD2_SHIFT (21U) -#define USBPHY_PWD_TOG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_PWD_TOG_RSVD2_SHIFT)) & USBPHY_PWD_TOG_RSVD2_MASK) -/*! @} */ - -/*! @name TX - USB PHY Transmitter Control Register */ -/*! @{ */ - -#define USBPHY_TX_D_CAL_MASK (0xFU) -#define USBPHY_TX_D_CAL_SHIFT (0U) -#define USBPHY_TX_D_CAL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_D_CAL_SHIFT)) & USBPHY_TX_D_CAL_MASK) - -#define USBPHY_TX_RSVD0_MASK (0xF0U) -#define USBPHY_TX_RSVD0_SHIFT (4U) -#define USBPHY_TX_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_RSVD0_SHIFT)) & USBPHY_TX_RSVD0_MASK) - -#define USBPHY_TX_TXCAL45DN_MASK (0xF00U) -#define USBPHY_TX_TXCAL45DN_SHIFT (8U) -#define USBPHY_TX_TXCAL45DN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TXCAL45DN_SHIFT)) & USBPHY_TX_TXCAL45DN_MASK) - -#define USBPHY_TX_RSVD1_MASK (0xF000U) -#define USBPHY_TX_RSVD1_SHIFT (12U) -#define USBPHY_TX_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_RSVD1_SHIFT)) & USBPHY_TX_RSVD1_MASK) - -#define USBPHY_TX_TXCAL45DP_MASK (0xF0000U) -#define USBPHY_TX_TXCAL45DP_SHIFT (16U) -#define USBPHY_TX_TXCAL45DP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TXCAL45DP_SHIFT)) & USBPHY_TX_TXCAL45DP_MASK) - -#define USBPHY_TX_RSVD2_MASK (0x3F00000U) -#define USBPHY_TX_RSVD2_SHIFT (20U) -#define USBPHY_TX_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_RSVD2_SHIFT)) & USBPHY_TX_RSVD2_MASK) - -#define USBPHY_TX_USBPHY_TX_EDGECTRL_MASK (0x1C000000U) -#define USBPHY_TX_USBPHY_TX_EDGECTRL_SHIFT (26U) -#define USBPHY_TX_USBPHY_TX_EDGECTRL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_USBPHY_TX_EDGECTRL_SHIFT)) & USBPHY_TX_USBPHY_TX_EDGECTRL_MASK) - -#define USBPHY_TX_RSVD5_MASK (0xE0000000U) -#define USBPHY_TX_RSVD5_SHIFT (29U) -#define USBPHY_TX_RSVD5(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_RSVD5_SHIFT)) & USBPHY_TX_RSVD5_MASK) -/*! @} */ - -/*! @name TX_SET - USB PHY Transmitter Control Register */ -/*! @{ */ - -#define USBPHY_TX_SET_D_CAL_MASK (0xFU) -#define USBPHY_TX_SET_D_CAL_SHIFT (0U) -#define USBPHY_TX_SET_D_CAL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_D_CAL_SHIFT)) & USBPHY_TX_SET_D_CAL_MASK) - -#define USBPHY_TX_SET_RSVD0_MASK (0xF0U) -#define USBPHY_TX_SET_RSVD0_SHIFT (4U) -#define USBPHY_TX_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_RSVD0_SHIFT)) & USBPHY_TX_SET_RSVD0_MASK) - -#define USBPHY_TX_SET_TXCAL45DN_MASK (0xF00U) -#define USBPHY_TX_SET_TXCAL45DN_SHIFT (8U) -#define USBPHY_TX_SET_TXCAL45DN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_TXCAL45DN_SHIFT)) & USBPHY_TX_SET_TXCAL45DN_MASK) - -#define USBPHY_TX_SET_RSVD1_MASK (0xF000U) -#define USBPHY_TX_SET_RSVD1_SHIFT (12U) -#define USBPHY_TX_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_RSVD1_SHIFT)) & USBPHY_TX_SET_RSVD1_MASK) - -#define USBPHY_TX_SET_TXCAL45DP_MASK (0xF0000U) -#define USBPHY_TX_SET_TXCAL45DP_SHIFT (16U) -#define USBPHY_TX_SET_TXCAL45DP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_TXCAL45DP_SHIFT)) & USBPHY_TX_SET_TXCAL45DP_MASK) - -#define USBPHY_TX_SET_RSVD2_MASK (0x3F00000U) -#define USBPHY_TX_SET_RSVD2_SHIFT (20U) -#define USBPHY_TX_SET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_RSVD2_SHIFT)) & USBPHY_TX_SET_RSVD2_MASK) - -#define USBPHY_TX_SET_USBPHY_TX_EDGECTRL_MASK (0x1C000000U) -#define USBPHY_TX_SET_USBPHY_TX_EDGECTRL_SHIFT (26U) -#define USBPHY_TX_SET_USBPHY_TX_EDGECTRL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_USBPHY_TX_EDGECTRL_SHIFT)) & USBPHY_TX_SET_USBPHY_TX_EDGECTRL_MASK) - -#define USBPHY_TX_SET_RSVD5_MASK (0xE0000000U) -#define USBPHY_TX_SET_RSVD5_SHIFT (29U) -#define USBPHY_TX_SET_RSVD5(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_SET_RSVD5_SHIFT)) & USBPHY_TX_SET_RSVD5_MASK) -/*! @} */ - -/*! @name TX_CLR - USB PHY Transmitter Control Register */ -/*! @{ */ - -#define USBPHY_TX_CLR_D_CAL_MASK (0xFU) -#define USBPHY_TX_CLR_D_CAL_SHIFT (0U) -#define USBPHY_TX_CLR_D_CAL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_D_CAL_SHIFT)) & USBPHY_TX_CLR_D_CAL_MASK) - -#define USBPHY_TX_CLR_RSVD0_MASK (0xF0U) -#define USBPHY_TX_CLR_RSVD0_SHIFT (4U) -#define USBPHY_TX_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_RSVD0_SHIFT)) & USBPHY_TX_CLR_RSVD0_MASK) - -#define USBPHY_TX_CLR_TXCAL45DN_MASK (0xF00U) -#define USBPHY_TX_CLR_TXCAL45DN_SHIFT (8U) -#define USBPHY_TX_CLR_TXCAL45DN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_TXCAL45DN_SHIFT)) & USBPHY_TX_CLR_TXCAL45DN_MASK) - -#define USBPHY_TX_CLR_RSVD1_MASK (0xF000U) -#define USBPHY_TX_CLR_RSVD1_SHIFT (12U) -#define USBPHY_TX_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_RSVD1_SHIFT)) & USBPHY_TX_CLR_RSVD1_MASK) - -#define USBPHY_TX_CLR_TXCAL45DP_MASK (0xF0000U) -#define USBPHY_TX_CLR_TXCAL45DP_SHIFT (16U) -#define USBPHY_TX_CLR_TXCAL45DP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_TXCAL45DP_SHIFT)) & USBPHY_TX_CLR_TXCAL45DP_MASK) - -#define USBPHY_TX_CLR_RSVD2_MASK (0x3F00000U) -#define USBPHY_TX_CLR_RSVD2_SHIFT (20U) -#define USBPHY_TX_CLR_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_RSVD2_SHIFT)) & USBPHY_TX_CLR_RSVD2_MASK) - -#define USBPHY_TX_CLR_USBPHY_TX_EDGECTRL_MASK (0x1C000000U) -#define USBPHY_TX_CLR_USBPHY_TX_EDGECTRL_SHIFT (26U) -#define USBPHY_TX_CLR_USBPHY_TX_EDGECTRL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_USBPHY_TX_EDGECTRL_SHIFT)) & USBPHY_TX_CLR_USBPHY_TX_EDGECTRL_MASK) - -#define USBPHY_TX_CLR_RSVD5_MASK (0xE0000000U) -#define USBPHY_TX_CLR_RSVD5_SHIFT (29U) -#define USBPHY_TX_CLR_RSVD5(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_CLR_RSVD5_SHIFT)) & USBPHY_TX_CLR_RSVD5_MASK) -/*! @} */ - -/*! @name TX_TOG - USB PHY Transmitter Control Register */ -/*! @{ */ - -#define USBPHY_TX_TOG_D_CAL_MASK (0xFU) -#define USBPHY_TX_TOG_D_CAL_SHIFT (0U) -#define USBPHY_TX_TOG_D_CAL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_D_CAL_SHIFT)) & USBPHY_TX_TOG_D_CAL_MASK) - -#define USBPHY_TX_TOG_RSVD0_MASK (0xF0U) -#define USBPHY_TX_TOG_RSVD0_SHIFT (4U) -#define USBPHY_TX_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_RSVD0_SHIFT)) & USBPHY_TX_TOG_RSVD0_MASK) - -#define USBPHY_TX_TOG_TXCAL45DN_MASK (0xF00U) -#define USBPHY_TX_TOG_TXCAL45DN_SHIFT (8U) -#define USBPHY_TX_TOG_TXCAL45DN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_TXCAL45DN_SHIFT)) & USBPHY_TX_TOG_TXCAL45DN_MASK) - -#define USBPHY_TX_TOG_RSVD1_MASK (0xF000U) -#define USBPHY_TX_TOG_RSVD1_SHIFT (12U) -#define USBPHY_TX_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_RSVD1_SHIFT)) & USBPHY_TX_TOG_RSVD1_MASK) - -#define USBPHY_TX_TOG_TXCAL45DP_MASK (0xF0000U) -#define USBPHY_TX_TOG_TXCAL45DP_SHIFT (16U) -#define USBPHY_TX_TOG_TXCAL45DP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_TXCAL45DP_SHIFT)) & USBPHY_TX_TOG_TXCAL45DP_MASK) - -#define USBPHY_TX_TOG_RSVD2_MASK (0x3F00000U) -#define USBPHY_TX_TOG_RSVD2_SHIFT (20U) -#define USBPHY_TX_TOG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_RSVD2_SHIFT)) & USBPHY_TX_TOG_RSVD2_MASK) - -#define USBPHY_TX_TOG_USBPHY_TX_EDGECTRL_MASK (0x1C000000U) -#define USBPHY_TX_TOG_USBPHY_TX_EDGECTRL_SHIFT (26U) -#define USBPHY_TX_TOG_USBPHY_TX_EDGECTRL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_USBPHY_TX_EDGECTRL_SHIFT)) & USBPHY_TX_TOG_USBPHY_TX_EDGECTRL_MASK) - -#define USBPHY_TX_TOG_RSVD5_MASK (0xE0000000U) -#define USBPHY_TX_TOG_RSVD5_SHIFT (29U) -#define USBPHY_TX_TOG_RSVD5(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_TX_TOG_RSVD5_SHIFT)) & USBPHY_TX_TOG_RSVD5_MASK) -/*! @} */ - -/*! @name RX - USB PHY Receiver Control Register */ -/*! @{ */ - -#define USBPHY_RX_ENVADJ_MASK (0x7U) -#define USBPHY_RX_ENVADJ_SHIFT (0U) -#define USBPHY_RX_ENVADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_ENVADJ_SHIFT)) & USBPHY_RX_ENVADJ_MASK) - -#define USBPHY_RX_RSVD0_MASK (0x8U) -#define USBPHY_RX_RSVD0_SHIFT (3U) -#define USBPHY_RX_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_RSVD0_SHIFT)) & USBPHY_RX_RSVD0_MASK) - -#define USBPHY_RX_DISCONADJ_MASK (0x70U) -#define USBPHY_RX_DISCONADJ_SHIFT (4U) -#define USBPHY_RX_DISCONADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_DISCONADJ_SHIFT)) & USBPHY_RX_DISCONADJ_MASK) - -#define USBPHY_RX_RSVD1_MASK (0x3FFF80U) -#define USBPHY_RX_RSVD1_SHIFT (7U) -#define USBPHY_RX_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_RSVD1_SHIFT)) & USBPHY_RX_RSVD1_MASK) - -#define USBPHY_RX_RXDBYPASS_MASK (0x400000U) -#define USBPHY_RX_RXDBYPASS_SHIFT (22U) -#define USBPHY_RX_RXDBYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_RXDBYPASS_SHIFT)) & USBPHY_RX_RXDBYPASS_MASK) - -#define USBPHY_RX_RSVD2_MASK (0xFF800000U) -#define USBPHY_RX_RSVD2_SHIFT (23U) -#define USBPHY_RX_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_RSVD2_SHIFT)) & USBPHY_RX_RSVD2_MASK) -/*! @} */ - -/*! @name RX_SET - USB PHY Receiver Control Register */ -/*! @{ */ - -#define USBPHY_RX_SET_ENVADJ_MASK (0x7U) -#define USBPHY_RX_SET_ENVADJ_SHIFT (0U) -#define USBPHY_RX_SET_ENVADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_ENVADJ_SHIFT)) & USBPHY_RX_SET_ENVADJ_MASK) - -#define USBPHY_RX_SET_RSVD0_MASK (0x8U) -#define USBPHY_RX_SET_RSVD0_SHIFT (3U) -#define USBPHY_RX_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_RSVD0_SHIFT)) & USBPHY_RX_SET_RSVD0_MASK) - -#define USBPHY_RX_SET_DISCONADJ_MASK (0x70U) -#define USBPHY_RX_SET_DISCONADJ_SHIFT (4U) -#define USBPHY_RX_SET_DISCONADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_DISCONADJ_SHIFT)) & USBPHY_RX_SET_DISCONADJ_MASK) - -#define USBPHY_RX_SET_RSVD1_MASK (0x3FFF80U) -#define USBPHY_RX_SET_RSVD1_SHIFT (7U) -#define USBPHY_RX_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_RSVD1_SHIFT)) & USBPHY_RX_SET_RSVD1_MASK) - -#define USBPHY_RX_SET_RXDBYPASS_MASK (0x400000U) -#define USBPHY_RX_SET_RXDBYPASS_SHIFT (22U) -#define USBPHY_RX_SET_RXDBYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_RXDBYPASS_SHIFT)) & USBPHY_RX_SET_RXDBYPASS_MASK) - -#define USBPHY_RX_SET_RSVD2_MASK (0xFF800000U) -#define USBPHY_RX_SET_RSVD2_SHIFT (23U) -#define USBPHY_RX_SET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_SET_RSVD2_SHIFT)) & USBPHY_RX_SET_RSVD2_MASK) -/*! @} */ - -/*! @name RX_CLR - USB PHY Receiver Control Register */ -/*! @{ */ - -#define USBPHY_RX_CLR_ENVADJ_MASK (0x7U) -#define USBPHY_RX_CLR_ENVADJ_SHIFT (0U) -#define USBPHY_RX_CLR_ENVADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_ENVADJ_SHIFT)) & USBPHY_RX_CLR_ENVADJ_MASK) - -#define USBPHY_RX_CLR_RSVD0_MASK (0x8U) -#define USBPHY_RX_CLR_RSVD0_SHIFT (3U) -#define USBPHY_RX_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_RSVD0_SHIFT)) & USBPHY_RX_CLR_RSVD0_MASK) - -#define USBPHY_RX_CLR_DISCONADJ_MASK (0x70U) -#define USBPHY_RX_CLR_DISCONADJ_SHIFT (4U) -#define USBPHY_RX_CLR_DISCONADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_DISCONADJ_SHIFT)) & USBPHY_RX_CLR_DISCONADJ_MASK) - -#define USBPHY_RX_CLR_RSVD1_MASK (0x3FFF80U) -#define USBPHY_RX_CLR_RSVD1_SHIFT (7U) -#define USBPHY_RX_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_RSVD1_SHIFT)) & USBPHY_RX_CLR_RSVD1_MASK) - -#define USBPHY_RX_CLR_RXDBYPASS_MASK (0x400000U) -#define USBPHY_RX_CLR_RXDBYPASS_SHIFT (22U) -#define USBPHY_RX_CLR_RXDBYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_RXDBYPASS_SHIFT)) & USBPHY_RX_CLR_RXDBYPASS_MASK) - -#define USBPHY_RX_CLR_RSVD2_MASK (0xFF800000U) -#define USBPHY_RX_CLR_RSVD2_SHIFT (23U) -#define USBPHY_RX_CLR_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_CLR_RSVD2_SHIFT)) & USBPHY_RX_CLR_RSVD2_MASK) -/*! @} */ - -/*! @name RX_TOG - USB PHY Receiver Control Register */ -/*! @{ */ - -#define USBPHY_RX_TOG_ENVADJ_MASK (0x7U) -#define USBPHY_RX_TOG_ENVADJ_SHIFT (0U) -#define USBPHY_RX_TOG_ENVADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_ENVADJ_SHIFT)) & USBPHY_RX_TOG_ENVADJ_MASK) - -#define USBPHY_RX_TOG_RSVD0_MASK (0x8U) -#define USBPHY_RX_TOG_RSVD0_SHIFT (3U) -#define USBPHY_RX_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_RSVD0_SHIFT)) & USBPHY_RX_TOG_RSVD0_MASK) - -#define USBPHY_RX_TOG_DISCONADJ_MASK (0x70U) -#define USBPHY_RX_TOG_DISCONADJ_SHIFT (4U) -#define USBPHY_RX_TOG_DISCONADJ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_DISCONADJ_SHIFT)) & USBPHY_RX_TOG_DISCONADJ_MASK) - -#define USBPHY_RX_TOG_RSVD1_MASK (0x3FFF80U) -#define USBPHY_RX_TOG_RSVD1_SHIFT (7U) -#define USBPHY_RX_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_RSVD1_SHIFT)) & USBPHY_RX_TOG_RSVD1_MASK) - -#define USBPHY_RX_TOG_RXDBYPASS_MASK (0x400000U) -#define USBPHY_RX_TOG_RXDBYPASS_SHIFT (22U) -#define USBPHY_RX_TOG_RXDBYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_RXDBYPASS_SHIFT)) & USBPHY_RX_TOG_RXDBYPASS_MASK) - -#define USBPHY_RX_TOG_RSVD2_MASK (0xFF800000U) -#define USBPHY_RX_TOG_RSVD2_SHIFT (23U) -#define USBPHY_RX_TOG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_RX_TOG_RSVD2_SHIFT)) & USBPHY_RX_TOG_RSVD2_MASK) -/*! @} */ - -/*! @name CTRL - USB PHY General Control Register */ -/*! @{ */ - -#define USBPHY_CTRL_ENOTG_ID_CHG_IRQ_MASK (0x1U) -#define USBPHY_CTRL_ENOTG_ID_CHG_IRQ_SHIFT (0U) -#define USBPHY_CTRL_ENOTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENOTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_ENOTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_ENHOSTDISCONDETECT_MASK (0x2U) -#define USBPHY_CTRL_ENHOSTDISCONDETECT_SHIFT (1U) -#define USBPHY_CTRL_ENHOSTDISCONDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENHOSTDISCONDETECT_SHIFT)) & USBPHY_CTRL_ENHOSTDISCONDETECT_MASK) - -#define USBPHY_CTRL_ENIRQHOSTDISCON_MASK (0x4U) -#define USBPHY_CTRL_ENIRQHOSTDISCON_SHIFT (2U) -#define USBPHY_CTRL_ENIRQHOSTDISCON(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENIRQHOSTDISCON_SHIFT)) & USBPHY_CTRL_ENIRQHOSTDISCON_MASK) - -#define USBPHY_CTRL_HOSTDISCONDETECT_IRQ_MASK (0x8U) -#define USBPHY_CTRL_HOSTDISCONDETECT_IRQ_SHIFT (3U) -#define USBPHY_CTRL_HOSTDISCONDETECT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_HOSTDISCONDETECT_IRQ_SHIFT)) & USBPHY_CTRL_HOSTDISCONDETECT_IRQ_MASK) - -#define USBPHY_CTRL_ENDEVPLUGINDETECT_MASK (0x10U) -#define USBPHY_CTRL_ENDEVPLUGINDETECT_SHIFT (4U) -#define USBPHY_CTRL_ENDEVPLUGINDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENDEVPLUGINDETECT_SHIFT)) & USBPHY_CTRL_ENDEVPLUGINDETECT_MASK) - -#define USBPHY_CTRL_DEVPLUGIN_POLARITY_MASK (0x20U) -#define USBPHY_CTRL_DEVPLUGIN_POLARITY_SHIFT (5U) -#define USBPHY_CTRL_DEVPLUGIN_POLARITY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_DEVPLUGIN_POLARITY_SHIFT)) & USBPHY_CTRL_DEVPLUGIN_POLARITY_MASK) - -#define USBPHY_CTRL_OTG_ID_CHG_IRQ_MASK (0x40U) -#define USBPHY_CTRL_OTG_ID_CHG_IRQ_SHIFT (6U) -#define USBPHY_CTRL_OTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_OTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_OTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_ENOTGIDDETECT_MASK (0x80U) -#define USBPHY_CTRL_ENOTGIDDETECT_SHIFT (7U) -#define USBPHY_CTRL_ENOTGIDDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENOTGIDDETECT_SHIFT)) & USBPHY_CTRL_ENOTGIDDETECT_MASK) - -#define USBPHY_CTRL_RESUMEIRQSTICKY_MASK (0x100U) -#define USBPHY_CTRL_RESUMEIRQSTICKY_SHIFT (8U) -#define USBPHY_CTRL_RESUMEIRQSTICKY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_RESUMEIRQSTICKY_SHIFT)) & USBPHY_CTRL_RESUMEIRQSTICKY_MASK) - -#define USBPHY_CTRL_ENIRQRESUMEDETECT_MASK (0x200U) -#define USBPHY_CTRL_ENIRQRESUMEDETECT_SHIFT (9U) -#define USBPHY_CTRL_ENIRQRESUMEDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENIRQRESUMEDETECT_SHIFT)) & USBPHY_CTRL_ENIRQRESUMEDETECT_MASK) - -#define USBPHY_CTRL_RESUME_IRQ_MASK (0x400U) -#define USBPHY_CTRL_RESUME_IRQ_SHIFT (10U) -#define USBPHY_CTRL_RESUME_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_RESUME_IRQ_SHIFT)) & USBPHY_CTRL_RESUME_IRQ_MASK) - -#define USBPHY_CTRL_ENIRQDEVPLUGIN_MASK (0x800U) -#define USBPHY_CTRL_ENIRQDEVPLUGIN_SHIFT (11U) -#define USBPHY_CTRL_ENIRQDEVPLUGIN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENIRQDEVPLUGIN_SHIFT)) & USBPHY_CTRL_ENIRQDEVPLUGIN_MASK) - -#define USBPHY_CTRL_DEVPLUGIN_IRQ_MASK (0x1000U) -#define USBPHY_CTRL_DEVPLUGIN_IRQ_SHIFT (12U) -#define USBPHY_CTRL_DEVPLUGIN_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_DEVPLUGIN_IRQ_SHIFT)) & USBPHY_CTRL_DEVPLUGIN_IRQ_MASK) - -#define USBPHY_CTRL_DATA_ON_LRADC_MASK (0x2000U) -#define USBPHY_CTRL_DATA_ON_LRADC_SHIFT (13U) -#define USBPHY_CTRL_DATA_ON_LRADC(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_DATA_ON_LRADC_SHIFT)) & USBPHY_CTRL_DATA_ON_LRADC_MASK) - -#define USBPHY_CTRL_ENUTMILEVEL2_MASK (0x4000U) -#define USBPHY_CTRL_ENUTMILEVEL2_SHIFT (14U) -#define USBPHY_CTRL_ENUTMILEVEL2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENUTMILEVEL2_SHIFT)) & USBPHY_CTRL_ENUTMILEVEL2_MASK) - -#define USBPHY_CTRL_ENUTMILEVEL3_MASK (0x8000U) -#define USBPHY_CTRL_ENUTMILEVEL3_SHIFT (15U) -#define USBPHY_CTRL_ENUTMILEVEL3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENUTMILEVEL3_SHIFT)) & USBPHY_CTRL_ENUTMILEVEL3_MASK) - -#define USBPHY_CTRL_ENIRQWAKEUP_MASK (0x10000U) -#define USBPHY_CTRL_ENIRQWAKEUP_SHIFT (16U) -#define USBPHY_CTRL_ENIRQWAKEUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENIRQWAKEUP_SHIFT)) & USBPHY_CTRL_ENIRQWAKEUP_MASK) - -#define USBPHY_CTRL_WAKEUP_IRQ_MASK (0x20000U) -#define USBPHY_CTRL_WAKEUP_IRQ_SHIFT (17U) -#define USBPHY_CTRL_WAKEUP_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_WAKEUP_IRQ_SHIFT)) & USBPHY_CTRL_WAKEUP_IRQ_MASK) - -#define USBPHY_CTRL_ENAUTO_PWRON_PLL_MASK (0x40000U) -#define USBPHY_CTRL_ENAUTO_PWRON_PLL_SHIFT (18U) -#define USBPHY_CTRL_ENAUTO_PWRON_PLL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENAUTO_PWRON_PLL_SHIFT)) & USBPHY_CTRL_ENAUTO_PWRON_PLL_MASK) - -#define USBPHY_CTRL_ENAUTOCLR_CLKGATE_MASK (0x80000U) -#define USBPHY_CTRL_ENAUTOCLR_CLKGATE_SHIFT (19U) -#define USBPHY_CTRL_ENAUTOCLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENAUTOCLR_CLKGATE_SHIFT)) & USBPHY_CTRL_ENAUTOCLR_CLKGATE_MASK) - -#define USBPHY_CTRL_ENAUTOCLR_PHY_PWD_MASK (0x100000U) -#define USBPHY_CTRL_ENAUTOCLR_PHY_PWD_SHIFT (20U) -#define USBPHY_CTRL_ENAUTOCLR_PHY_PWD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENAUTOCLR_PHY_PWD_SHIFT)) & USBPHY_CTRL_ENAUTOCLR_PHY_PWD_MASK) - -#define USBPHY_CTRL_ENDPDMCHG_WKUP_MASK (0x200000U) -#define USBPHY_CTRL_ENDPDMCHG_WKUP_SHIFT (21U) -#define USBPHY_CTRL_ENDPDMCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENDPDMCHG_WKUP_SHIFT)) & USBPHY_CTRL_ENDPDMCHG_WKUP_MASK) - -#define USBPHY_CTRL_ENIDCHG_WKUP_MASK (0x400000U) -#define USBPHY_CTRL_ENIDCHG_WKUP_SHIFT (22U) -#define USBPHY_CTRL_ENIDCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENIDCHG_WKUP_SHIFT)) & USBPHY_CTRL_ENIDCHG_WKUP_MASK) - -#define USBPHY_CTRL_ENVBUSCHG_WKUP_MASK (0x800000U) -#define USBPHY_CTRL_ENVBUSCHG_WKUP_SHIFT (23U) -#define USBPHY_CTRL_ENVBUSCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_ENVBUSCHG_WKUP_SHIFT)) & USBPHY_CTRL_ENVBUSCHG_WKUP_MASK) - -#define USBPHY_CTRL_FSDLL_RST_EN_MASK (0x1000000U) -#define USBPHY_CTRL_FSDLL_RST_EN_SHIFT (24U) -#define USBPHY_CTRL_FSDLL_RST_EN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_FSDLL_RST_EN_SHIFT)) & USBPHY_CTRL_FSDLL_RST_EN_MASK) - -#define USBPHY_CTRL_RSVD1_MASK (0x6000000U) -#define USBPHY_CTRL_RSVD1_SHIFT (25U) -#define USBPHY_CTRL_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_RSVD1_SHIFT)) & USBPHY_CTRL_RSVD1_MASK) - -#define USBPHY_CTRL_OTG_ID_VALUE_MASK (0x8000000U) -#define USBPHY_CTRL_OTG_ID_VALUE_SHIFT (27U) -#define USBPHY_CTRL_OTG_ID_VALUE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_OTG_ID_VALUE_SHIFT)) & USBPHY_CTRL_OTG_ID_VALUE_MASK) - -#define USBPHY_CTRL_HOST_FORCE_LS_SE0_MASK (0x10000000U) -#define USBPHY_CTRL_HOST_FORCE_LS_SE0_SHIFT (28U) -#define USBPHY_CTRL_HOST_FORCE_LS_SE0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_HOST_FORCE_LS_SE0_SHIFT)) & USBPHY_CTRL_HOST_FORCE_LS_SE0_MASK) - -#define USBPHY_CTRL_UTMI_SUSPENDM_MASK (0x20000000U) -#define USBPHY_CTRL_UTMI_SUSPENDM_SHIFT (29U) -#define USBPHY_CTRL_UTMI_SUSPENDM(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_UTMI_SUSPENDM_SHIFT)) & USBPHY_CTRL_UTMI_SUSPENDM_MASK) - -#define USBPHY_CTRL_CLKGATE_MASK (0x40000000U) -#define USBPHY_CTRL_CLKGATE_SHIFT (30U) -#define USBPHY_CTRL_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLKGATE_SHIFT)) & USBPHY_CTRL_CLKGATE_MASK) - -#define USBPHY_CTRL_SFTRST_MASK (0x80000000U) -#define USBPHY_CTRL_SFTRST_SHIFT (31U) -#define USBPHY_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SFTRST_SHIFT)) & USBPHY_CTRL_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_SET - USB PHY General Control Register */ -/*! @{ */ - -#define USBPHY_CTRL_SET_ENOTG_ID_CHG_IRQ_MASK (0x1U) -#define USBPHY_CTRL_SET_ENOTG_ID_CHG_IRQ_SHIFT (0U) -#define USBPHY_CTRL_SET_ENOTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENOTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_SET_ENOTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_SET_ENHOSTDISCONDETECT_MASK (0x2U) -#define USBPHY_CTRL_SET_ENHOSTDISCONDETECT_SHIFT (1U) -#define USBPHY_CTRL_SET_ENHOSTDISCONDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENHOSTDISCONDETECT_SHIFT)) & USBPHY_CTRL_SET_ENHOSTDISCONDETECT_MASK) - -#define USBPHY_CTRL_SET_ENIRQHOSTDISCON_MASK (0x4U) -#define USBPHY_CTRL_SET_ENIRQHOSTDISCON_SHIFT (2U) -#define USBPHY_CTRL_SET_ENIRQHOSTDISCON(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENIRQHOSTDISCON_SHIFT)) & USBPHY_CTRL_SET_ENIRQHOSTDISCON_MASK) - -#define USBPHY_CTRL_SET_HOSTDISCONDETECT_IRQ_MASK (0x8U) -#define USBPHY_CTRL_SET_HOSTDISCONDETECT_IRQ_SHIFT (3U) -#define USBPHY_CTRL_SET_HOSTDISCONDETECT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_HOSTDISCONDETECT_IRQ_SHIFT)) & USBPHY_CTRL_SET_HOSTDISCONDETECT_IRQ_MASK) - -#define USBPHY_CTRL_SET_ENDEVPLUGINDETECT_MASK (0x10U) -#define USBPHY_CTRL_SET_ENDEVPLUGINDETECT_SHIFT (4U) -#define USBPHY_CTRL_SET_ENDEVPLUGINDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENDEVPLUGINDETECT_SHIFT)) & USBPHY_CTRL_SET_ENDEVPLUGINDETECT_MASK) - -#define USBPHY_CTRL_SET_DEVPLUGIN_POLARITY_MASK (0x20U) -#define USBPHY_CTRL_SET_DEVPLUGIN_POLARITY_SHIFT (5U) -#define USBPHY_CTRL_SET_DEVPLUGIN_POLARITY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_DEVPLUGIN_POLARITY_SHIFT)) & USBPHY_CTRL_SET_DEVPLUGIN_POLARITY_MASK) - -#define USBPHY_CTRL_SET_OTG_ID_CHG_IRQ_MASK (0x40U) -#define USBPHY_CTRL_SET_OTG_ID_CHG_IRQ_SHIFT (6U) -#define USBPHY_CTRL_SET_OTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_OTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_SET_OTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_SET_ENOTGIDDETECT_MASK (0x80U) -#define USBPHY_CTRL_SET_ENOTGIDDETECT_SHIFT (7U) -#define USBPHY_CTRL_SET_ENOTGIDDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENOTGIDDETECT_SHIFT)) & USBPHY_CTRL_SET_ENOTGIDDETECT_MASK) - -#define USBPHY_CTRL_SET_RESUMEIRQSTICKY_MASK (0x100U) -#define USBPHY_CTRL_SET_RESUMEIRQSTICKY_SHIFT (8U) -#define USBPHY_CTRL_SET_RESUMEIRQSTICKY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_RESUMEIRQSTICKY_SHIFT)) & USBPHY_CTRL_SET_RESUMEIRQSTICKY_MASK) - -#define USBPHY_CTRL_SET_ENIRQRESUMEDETECT_MASK (0x200U) -#define USBPHY_CTRL_SET_ENIRQRESUMEDETECT_SHIFT (9U) -#define USBPHY_CTRL_SET_ENIRQRESUMEDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENIRQRESUMEDETECT_SHIFT)) & USBPHY_CTRL_SET_ENIRQRESUMEDETECT_MASK) - -#define USBPHY_CTRL_SET_RESUME_IRQ_MASK (0x400U) -#define USBPHY_CTRL_SET_RESUME_IRQ_SHIFT (10U) -#define USBPHY_CTRL_SET_RESUME_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_RESUME_IRQ_SHIFT)) & USBPHY_CTRL_SET_RESUME_IRQ_MASK) - -#define USBPHY_CTRL_SET_ENIRQDEVPLUGIN_MASK (0x800U) -#define USBPHY_CTRL_SET_ENIRQDEVPLUGIN_SHIFT (11U) -#define USBPHY_CTRL_SET_ENIRQDEVPLUGIN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENIRQDEVPLUGIN_SHIFT)) & USBPHY_CTRL_SET_ENIRQDEVPLUGIN_MASK) - -#define USBPHY_CTRL_SET_DEVPLUGIN_IRQ_MASK (0x1000U) -#define USBPHY_CTRL_SET_DEVPLUGIN_IRQ_SHIFT (12U) -#define USBPHY_CTRL_SET_DEVPLUGIN_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_DEVPLUGIN_IRQ_SHIFT)) & USBPHY_CTRL_SET_DEVPLUGIN_IRQ_MASK) - -#define USBPHY_CTRL_SET_DATA_ON_LRADC_MASK (0x2000U) -#define USBPHY_CTRL_SET_DATA_ON_LRADC_SHIFT (13U) -#define USBPHY_CTRL_SET_DATA_ON_LRADC(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_DATA_ON_LRADC_SHIFT)) & USBPHY_CTRL_SET_DATA_ON_LRADC_MASK) - -#define USBPHY_CTRL_SET_ENUTMILEVEL2_MASK (0x4000U) -#define USBPHY_CTRL_SET_ENUTMILEVEL2_SHIFT (14U) -#define USBPHY_CTRL_SET_ENUTMILEVEL2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENUTMILEVEL2_SHIFT)) & USBPHY_CTRL_SET_ENUTMILEVEL2_MASK) - -#define USBPHY_CTRL_SET_ENUTMILEVEL3_MASK (0x8000U) -#define USBPHY_CTRL_SET_ENUTMILEVEL3_SHIFT (15U) -#define USBPHY_CTRL_SET_ENUTMILEVEL3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENUTMILEVEL3_SHIFT)) & USBPHY_CTRL_SET_ENUTMILEVEL3_MASK) - -#define USBPHY_CTRL_SET_ENIRQWAKEUP_MASK (0x10000U) -#define USBPHY_CTRL_SET_ENIRQWAKEUP_SHIFT (16U) -#define USBPHY_CTRL_SET_ENIRQWAKEUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENIRQWAKEUP_SHIFT)) & USBPHY_CTRL_SET_ENIRQWAKEUP_MASK) - -#define USBPHY_CTRL_SET_WAKEUP_IRQ_MASK (0x20000U) -#define USBPHY_CTRL_SET_WAKEUP_IRQ_SHIFT (17U) -#define USBPHY_CTRL_SET_WAKEUP_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_WAKEUP_IRQ_SHIFT)) & USBPHY_CTRL_SET_WAKEUP_IRQ_MASK) - -#define USBPHY_CTRL_SET_ENAUTO_PWRON_PLL_MASK (0x40000U) -#define USBPHY_CTRL_SET_ENAUTO_PWRON_PLL_SHIFT (18U) -#define USBPHY_CTRL_SET_ENAUTO_PWRON_PLL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENAUTO_PWRON_PLL_SHIFT)) & USBPHY_CTRL_SET_ENAUTO_PWRON_PLL_MASK) - -#define USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_MASK (0x80000U) -#define USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_SHIFT (19U) -#define USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_SHIFT)) & USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_MASK) - -#define USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_MASK (0x100000U) -#define USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_SHIFT (20U) -#define USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_SHIFT)) & USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_MASK) - -#define USBPHY_CTRL_SET_ENDPDMCHG_WKUP_MASK (0x200000U) -#define USBPHY_CTRL_SET_ENDPDMCHG_WKUP_SHIFT (21U) -#define USBPHY_CTRL_SET_ENDPDMCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENDPDMCHG_WKUP_SHIFT)) & USBPHY_CTRL_SET_ENDPDMCHG_WKUP_MASK) - -#define USBPHY_CTRL_SET_ENIDCHG_WKUP_MASK (0x400000U) -#define USBPHY_CTRL_SET_ENIDCHG_WKUP_SHIFT (22U) -#define USBPHY_CTRL_SET_ENIDCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENIDCHG_WKUP_SHIFT)) & USBPHY_CTRL_SET_ENIDCHG_WKUP_MASK) - -#define USBPHY_CTRL_SET_ENVBUSCHG_WKUP_MASK (0x800000U) -#define USBPHY_CTRL_SET_ENVBUSCHG_WKUP_SHIFT (23U) -#define USBPHY_CTRL_SET_ENVBUSCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_ENVBUSCHG_WKUP_SHIFT)) & USBPHY_CTRL_SET_ENVBUSCHG_WKUP_MASK) - -#define USBPHY_CTRL_SET_FSDLL_RST_EN_MASK (0x1000000U) -#define USBPHY_CTRL_SET_FSDLL_RST_EN_SHIFT (24U) -#define USBPHY_CTRL_SET_FSDLL_RST_EN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_FSDLL_RST_EN_SHIFT)) & USBPHY_CTRL_SET_FSDLL_RST_EN_MASK) - -#define USBPHY_CTRL_SET_RSVD1_MASK (0x6000000U) -#define USBPHY_CTRL_SET_RSVD1_SHIFT (25U) -#define USBPHY_CTRL_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_RSVD1_SHIFT)) & USBPHY_CTRL_SET_RSVD1_MASK) - -#define USBPHY_CTRL_SET_OTG_ID_VALUE_MASK (0x8000000U) -#define USBPHY_CTRL_SET_OTG_ID_VALUE_SHIFT (27U) -#define USBPHY_CTRL_SET_OTG_ID_VALUE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_OTG_ID_VALUE_SHIFT)) & USBPHY_CTRL_SET_OTG_ID_VALUE_MASK) - -#define USBPHY_CTRL_SET_HOST_FORCE_LS_SE0_MASK (0x10000000U) -#define USBPHY_CTRL_SET_HOST_FORCE_LS_SE0_SHIFT (28U) -#define USBPHY_CTRL_SET_HOST_FORCE_LS_SE0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_HOST_FORCE_LS_SE0_SHIFT)) & USBPHY_CTRL_SET_HOST_FORCE_LS_SE0_MASK) - -#define USBPHY_CTRL_SET_UTMI_SUSPENDM_MASK (0x20000000U) -#define USBPHY_CTRL_SET_UTMI_SUSPENDM_SHIFT (29U) -#define USBPHY_CTRL_SET_UTMI_SUSPENDM(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_UTMI_SUSPENDM_SHIFT)) & USBPHY_CTRL_SET_UTMI_SUSPENDM_MASK) - -#define USBPHY_CTRL_SET_CLKGATE_MASK (0x40000000U) -#define USBPHY_CTRL_SET_CLKGATE_SHIFT (30U) -#define USBPHY_CTRL_SET_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_CLKGATE_SHIFT)) & USBPHY_CTRL_SET_CLKGATE_MASK) - -#define USBPHY_CTRL_SET_SFTRST_MASK (0x80000000U) -#define USBPHY_CTRL_SET_SFTRST_SHIFT (31U) -#define USBPHY_CTRL_SET_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_SET_SFTRST_SHIFT)) & USBPHY_CTRL_SET_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_CLR - USB PHY General Control Register */ -/*! @{ */ - -#define USBPHY_CTRL_CLR_ENOTG_ID_CHG_IRQ_MASK (0x1U) -#define USBPHY_CTRL_CLR_ENOTG_ID_CHG_IRQ_SHIFT (0U) -#define USBPHY_CTRL_CLR_ENOTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENOTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_CLR_ENOTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_CLR_ENHOSTDISCONDETECT_MASK (0x2U) -#define USBPHY_CTRL_CLR_ENHOSTDISCONDETECT_SHIFT (1U) -#define USBPHY_CTRL_CLR_ENHOSTDISCONDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENHOSTDISCONDETECT_SHIFT)) & USBPHY_CTRL_CLR_ENHOSTDISCONDETECT_MASK) - -#define USBPHY_CTRL_CLR_ENIRQHOSTDISCON_MASK (0x4U) -#define USBPHY_CTRL_CLR_ENIRQHOSTDISCON_SHIFT (2U) -#define USBPHY_CTRL_CLR_ENIRQHOSTDISCON(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENIRQHOSTDISCON_SHIFT)) & USBPHY_CTRL_CLR_ENIRQHOSTDISCON_MASK) - -#define USBPHY_CTRL_CLR_HOSTDISCONDETECT_IRQ_MASK (0x8U) -#define USBPHY_CTRL_CLR_HOSTDISCONDETECT_IRQ_SHIFT (3U) -#define USBPHY_CTRL_CLR_HOSTDISCONDETECT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_HOSTDISCONDETECT_IRQ_SHIFT)) & USBPHY_CTRL_CLR_HOSTDISCONDETECT_IRQ_MASK) - -#define USBPHY_CTRL_CLR_ENDEVPLUGINDETECT_MASK (0x10U) -#define USBPHY_CTRL_CLR_ENDEVPLUGINDETECT_SHIFT (4U) -#define USBPHY_CTRL_CLR_ENDEVPLUGINDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENDEVPLUGINDETECT_SHIFT)) & USBPHY_CTRL_CLR_ENDEVPLUGINDETECT_MASK) - -#define USBPHY_CTRL_CLR_DEVPLUGIN_POLARITY_MASK (0x20U) -#define USBPHY_CTRL_CLR_DEVPLUGIN_POLARITY_SHIFT (5U) -#define USBPHY_CTRL_CLR_DEVPLUGIN_POLARITY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_DEVPLUGIN_POLARITY_SHIFT)) & USBPHY_CTRL_CLR_DEVPLUGIN_POLARITY_MASK) - -#define USBPHY_CTRL_CLR_OTG_ID_CHG_IRQ_MASK (0x40U) -#define USBPHY_CTRL_CLR_OTG_ID_CHG_IRQ_SHIFT (6U) -#define USBPHY_CTRL_CLR_OTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_OTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_CLR_OTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_CLR_ENOTGIDDETECT_MASK (0x80U) -#define USBPHY_CTRL_CLR_ENOTGIDDETECT_SHIFT (7U) -#define USBPHY_CTRL_CLR_ENOTGIDDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENOTGIDDETECT_SHIFT)) & USBPHY_CTRL_CLR_ENOTGIDDETECT_MASK) - -#define USBPHY_CTRL_CLR_RESUMEIRQSTICKY_MASK (0x100U) -#define USBPHY_CTRL_CLR_RESUMEIRQSTICKY_SHIFT (8U) -#define USBPHY_CTRL_CLR_RESUMEIRQSTICKY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_RESUMEIRQSTICKY_SHIFT)) & USBPHY_CTRL_CLR_RESUMEIRQSTICKY_MASK) - -#define USBPHY_CTRL_CLR_ENIRQRESUMEDETECT_MASK (0x200U) -#define USBPHY_CTRL_CLR_ENIRQRESUMEDETECT_SHIFT (9U) -#define USBPHY_CTRL_CLR_ENIRQRESUMEDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENIRQRESUMEDETECT_SHIFT)) & USBPHY_CTRL_CLR_ENIRQRESUMEDETECT_MASK) - -#define USBPHY_CTRL_CLR_RESUME_IRQ_MASK (0x400U) -#define USBPHY_CTRL_CLR_RESUME_IRQ_SHIFT (10U) -#define USBPHY_CTRL_CLR_RESUME_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_RESUME_IRQ_SHIFT)) & USBPHY_CTRL_CLR_RESUME_IRQ_MASK) - -#define USBPHY_CTRL_CLR_ENIRQDEVPLUGIN_MASK (0x800U) -#define USBPHY_CTRL_CLR_ENIRQDEVPLUGIN_SHIFT (11U) -#define USBPHY_CTRL_CLR_ENIRQDEVPLUGIN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENIRQDEVPLUGIN_SHIFT)) & USBPHY_CTRL_CLR_ENIRQDEVPLUGIN_MASK) - -#define USBPHY_CTRL_CLR_DEVPLUGIN_IRQ_MASK (0x1000U) -#define USBPHY_CTRL_CLR_DEVPLUGIN_IRQ_SHIFT (12U) -#define USBPHY_CTRL_CLR_DEVPLUGIN_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_DEVPLUGIN_IRQ_SHIFT)) & USBPHY_CTRL_CLR_DEVPLUGIN_IRQ_MASK) - -#define USBPHY_CTRL_CLR_DATA_ON_LRADC_MASK (0x2000U) -#define USBPHY_CTRL_CLR_DATA_ON_LRADC_SHIFT (13U) -#define USBPHY_CTRL_CLR_DATA_ON_LRADC(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_DATA_ON_LRADC_SHIFT)) & USBPHY_CTRL_CLR_DATA_ON_LRADC_MASK) - -#define USBPHY_CTRL_CLR_ENUTMILEVEL2_MASK (0x4000U) -#define USBPHY_CTRL_CLR_ENUTMILEVEL2_SHIFT (14U) -#define USBPHY_CTRL_CLR_ENUTMILEVEL2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENUTMILEVEL2_SHIFT)) & USBPHY_CTRL_CLR_ENUTMILEVEL2_MASK) - -#define USBPHY_CTRL_CLR_ENUTMILEVEL3_MASK (0x8000U) -#define USBPHY_CTRL_CLR_ENUTMILEVEL3_SHIFT (15U) -#define USBPHY_CTRL_CLR_ENUTMILEVEL3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENUTMILEVEL3_SHIFT)) & USBPHY_CTRL_CLR_ENUTMILEVEL3_MASK) - -#define USBPHY_CTRL_CLR_ENIRQWAKEUP_MASK (0x10000U) -#define USBPHY_CTRL_CLR_ENIRQWAKEUP_SHIFT (16U) -#define USBPHY_CTRL_CLR_ENIRQWAKEUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENIRQWAKEUP_SHIFT)) & USBPHY_CTRL_CLR_ENIRQWAKEUP_MASK) - -#define USBPHY_CTRL_CLR_WAKEUP_IRQ_MASK (0x20000U) -#define USBPHY_CTRL_CLR_WAKEUP_IRQ_SHIFT (17U) -#define USBPHY_CTRL_CLR_WAKEUP_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_WAKEUP_IRQ_SHIFT)) & USBPHY_CTRL_CLR_WAKEUP_IRQ_MASK) - -#define USBPHY_CTRL_CLR_ENAUTO_PWRON_PLL_MASK (0x40000U) -#define USBPHY_CTRL_CLR_ENAUTO_PWRON_PLL_SHIFT (18U) -#define USBPHY_CTRL_CLR_ENAUTO_PWRON_PLL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENAUTO_PWRON_PLL_SHIFT)) & USBPHY_CTRL_CLR_ENAUTO_PWRON_PLL_MASK) - -#define USBPHY_CTRL_CLR_ENAUTOCLR_CLKGATE_MASK (0x80000U) -#define USBPHY_CTRL_CLR_ENAUTOCLR_CLKGATE_SHIFT (19U) -#define USBPHY_CTRL_CLR_ENAUTOCLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENAUTOCLR_CLKGATE_SHIFT)) & USBPHY_CTRL_CLR_ENAUTOCLR_CLKGATE_MASK) - -#define USBPHY_CTRL_CLR_ENAUTOCLR_PHY_PWD_MASK (0x100000U) -#define USBPHY_CTRL_CLR_ENAUTOCLR_PHY_PWD_SHIFT (20U) -#define USBPHY_CTRL_CLR_ENAUTOCLR_PHY_PWD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENAUTOCLR_PHY_PWD_SHIFT)) & USBPHY_CTRL_CLR_ENAUTOCLR_PHY_PWD_MASK) - -#define USBPHY_CTRL_CLR_ENDPDMCHG_WKUP_MASK (0x200000U) -#define USBPHY_CTRL_CLR_ENDPDMCHG_WKUP_SHIFT (21U) -#define USBPHY_CTRL_CLR_ENDPDMCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENDPDMCHG_WKUP_SHIFT)) & USBPHY_CTRL_CLR_ENDPDMCHG_WKUP_MASK) - -#define USBPHY_CTRL_CLR_ENIDCHG_WKUP_MASK (0x400000U) -#define USBPHY_CTRL_CLR_ENIDCHG_WKUP_SHIFT (22U) -#define USBPHY_CTRL_CLR_ENIDCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENIDCHG_WKUP_SHIFT)) & USBPHY_CTRL_CLR_ENIDCHG_WKUP_MASK) - -#define USBPHY_CTRL_CLR_ENVBUSCHG_WKUP_MASK (0x800000U) -#define USBPHY_CTRL_CLR_ENVBUSCHG_WKUP_SHIFT (23U) -#define USBPHY_CTRL_CLR_ENVBUSCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_ENVBUSCHG_WKUP_SHIFT)) & USBPHY_CTRL_CLR_ENVBUSCHG_WKUP_MASK) - -#define USBPHY_CTRL_CLR_FSDLL_RST_EN_MASK (0x1000000U) -#define USBPHY_CTRL_CLR_FSDLL_RST_EN_SHIFT (24U) -#define USBPHY_CTRL_CLR_FSDLL_RST_EN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_FSDLL_RST_EN_SHIFT)) & USBPHY_CTRL_CLR_FSDLL_RST_EN_MASK) - -#define USBPHY_CTRL_CLR_RSVD1_MASK (0x6000000U) -#define USBPHY_CTRL_CLR_RSVD1_SHIFT (25U) -#define USBPHY_CTRL_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_RSVD1_SHIFT)) & USBPHY_CTRL_CLR_RSVD1_MASK) - -#define USBPHY_CTRL_CLR_OTG_ID_VALUE_MASK (0x8000000U) -#define USBPHY_CTRL_CLR_OTG_ID_VALUE_SHIFT (27U) -#define USBPHY_CTRL_CLR_OTG_ID_VALUE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_OTG_ID_VALUE_SHIFT)) & USBPHY_CTRL_CLR_OTG_ID_VALUE_MASK) - -#define USBPHY_CTRL_CLR_HOST_FORCE_LS_SE0_MASK (0x10000000U) -#define USBPHY_CTRL_CLR_HOST_FORCE_LS_SE0_SHIFT (28U) -#define USBPHY_CTRL_CLR_HOST_FORCE_LS_SE0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_HOST_FORCE_LS_SE0_SHIFT)) & USBPHY_CTRL_CLR_HOST_FORCE_LS_SE0_MASK) - -#define USBPHY_CTRL_CLR_UTMI_SUSPENDM_MASK (0x20000000U) -#define USBPHY_CTRL_CLR_UTMI_SUSPENDM_SHIFT (29U) -#define USBPHY_CTRL_CLR_UTMI_SUSPENDM(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_UTMI_SUSPENDM_SHIFT)) & USBPHY_CTRL_CLR_UTMI_SUSPENDM_MASK) - -#define USBPHY_CTRL_CLR_CLKGATE_MASK (0x40000000U) -#define USBPHY_CTRL_CLR_CLKGATE_SHIFT (30U) -#define USBPHY_CTRL_CLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_CLKGATE_SHIFT)) & USBPHY_CTRL_CLR_CLKGATE_MASK) - -#define USBPHY_CTRL_CLR_SFTRST_MASK (0x80000000U) -#define USBPHY_CTRL_CLR_SFTRST_SHIFT (31U) -#define USBPHY_CTRL_CLR_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_CLR_SFTRST_SHIFT)) & USBPHY_CTRL_CLR_SFTRST_MASK) -/*! @} */ - -/*! @name CTRL_TOG - USB PHY General Control Register */ -/*! @{ */ - -#define USBPHY_CTRL_TOG_ENOTG_ID_CHG_IRQ_MASK (0x1U) -#define USBPHY_CTRL_TOG_ENOTG_ID_CHG_IRQ_SHIFT (0U) -#define USBPHY_CTRL_TOG_ENOTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENOTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_TOG_ENOTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_TOG_ENHOSTDISCONDETECT_MASK (0x2U) -#define USBPHY_CTRL_TOG_ENHOSTDISCONDETECT_SHIFT (1U) -#define USBPHY_CTRL_TOG_ENHOSTDISCONDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENHOSTDISCONDETECT_SHIFT)) & USBPHY_CTRL_TOG_ENHOSTDISCONDETECT_MASK) - -#define USBPHY_CTRL_TOG_ENIRQHOSTDISCON_MASK (0x4U) -#define USBPHY_CTRL_TOG_ENIRQHOSTDISCON_SHIFT (2U) -#define USBPHY_CTRL_TOG_ENIRQHOSTDISCON(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENIRQHOSTDISCON_SHIFT)) & USBPHY_CTRL_TOG_ENIRQHOSTDISCON_MASK) - -#define USBPHY_CTRL_TOG_HOSTDISCONDETECT_IRQ_MASK (0x8U) -#define USBPHY_CTRL_TOG_HOSTDISCONDETECT_IRQ_SHIFT (3U) -#define USBPHY_CTRL_TOG_HOSTDISCONDETECT_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_HOSTDISCONDETECT_IRQ_SHIFT)) & USBPHY_CTRL_TOG_HOSTDISCONDETECT_IRQ_MASK) - -#define USBPHY_CTRL_TOG_ENDEVPLUGINDETECT_MASK (0x10U) -#define USBPHY_CTRL_TOG_ENDEVPLUGINDETECT_SHIFT (4U) -#define USBPHY_CTRL_TOG_ENDEVPLUGINDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENDEVPLUGINDETECT_SHIFT)) & USBPHY_CTRL_TOG_ENDEVPLUGINDETECT_MASK) - -#define USBPHY_CTRL_TOG_DEVPLUGIN_POLARITY_MASK (0x20U) -#define USBPHY_CTRL_TOG_DEVPLUGIN_POLARITY_SHIFT (5U) -#define USBPHY_CTRL_TOG_DEVPLUGIN_POLARITY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_DEVPLUGIN_POLARITY_SHIFT)) & USBPHY_CTRL_TOG_DEVPLUGIN_POLARITY_MASK) - -#define USBPHY_CTRL_TOG_OTG_ID_CHG_IRQ_MASK (0x40U) -#define USBPHY_CTRL_TOG_OTG_ID_CHG_IRQ_SHIFT (6U) -#define USBPHY_CTRL_TOG_OTG_ID_CHG_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_OTG_ID_CHG_IRQ_SHIFT)) & USBPHY_CTRL_TOG_OTG_ID_CHG_IRQ_MASK) - -#define USBPHY_CTRL_TOG_ENOTGIDDETECT_MASK (0x80U) -#define USBPHY_CTRL_TOG_ENOTGIDDETECT_SHIFT (7U) -#define USBPHY_CTRL_TOG_ENOTGIDDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENOTGIDDETECT_SHIFT)) & USBPHY_CTRL_TOG_ENOTGIDDETECT_MASK) - -#define USBPHY_CTRL_TOG_RESUMEIRQSTICKY_MASK (0x100U) -#define USBPHY_CTRL_TOG_RESUMEIRQSTICKY_SHIFT (8U) -#define USBPHY_CTRL_TOG_RESUMEIRQSTICKY(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_RESUMEIRQSTICKY_SHIFT)) & USBPHY_CTRL_TOG_RESUMEIRQSTICKY_MASK) - -#define USBPHY_CTRL_TOG_ENIRQRESUMEDETECT_MASK (0x200U) -#define USBPHY_CTRL_TOG_ENIRQRESUMEDETECT_SHIFT (9U) -#define USBPHY_CTRL_TOG_ENIRQRESUMEDETECT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENIRQRESUMEDETECT_SHIFT)) & USBPHY_CTRL_TOG_ENIRQRESUMEDETECT_MASK) - -#define USBPHY_CTRL_TOG_RESUME_IRQ_MASK (0x400U) -#define USBPHY_CTRL_TOG_RESUME_IRQ_SHIFT (10U) -#define USBPHY_CTRL_TOG_RESUME_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_RESUME_IRQ_SHIFT)) & USBPHY_CTRL_TOG_RESUME_IRQ_MASK) - -#define USBPHY_CTRL_TOG_ENIRQDEVPLUGIN_MASK (0x800U) -#define USBPHY_CTRL_TOG_ENIRQDEVPLUGIN_SHIFT (11U) -#define USBPHY_CTRL_TOG_ENIRQDEVPLUGIN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENIRQDEVPLUGIN_SHIFT)) & USBPHY_CTRL_TOG_ENIRQDEVPLUGIN_MASK) - -#define USBPHY_CTRL_TOG_DEVPLUGIN_IRQ_MASK (0x1000U) -#define USBPHY_CTRL_TOG_DEVPLUGIN_IRQ_SHIFT (12U) -#define USBPHY_CTRL_TOG_DEVPLUGIN_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_DEVPLUGIN_IRQ_SHIFT)) & USBPHY_CTRL_TOG_DEVPLUGIN_IRQ_MASK) - -#define USBPHY_CTRL_TOG_DATA_ON_LRADC_MASK (0x2000U) -#define USBPHY_CTRL_TOG_DATA_ON_LRADC_SHIFT (13U) -#define USBPHY_CTRL_TOG_DATA_ON_LRADC(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_DATA_ON_LRADC_SHIFT)) & USBPHY_CTRL_TOG_DATA_ON_LRADC_MASK) - -#define USBPHY_CTRL_TOG_ENUTMILEVEL2_MASK (0x4000U) -#define USBPHY_CTRL_TOG_ENUTMILEVEL2_SHIFT (14U) -#define USBPHY_CTRL_TOG_ENUTMILEVEL2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENUTMILEVEL2_SHIFT)) & USBPHY_CTRL_TOG_ENUTMILEVEL2_MASK) - -#define USBPHY_CTRL_TOG_ENUTMILEVEL3_MASK (0x8000U) -#define USBPHY_CTRL_TOG_ENUTMILEVEL3_SHIFT (15U) -#define USBPHY_CTRL_TOG_ENUTMILEVEL3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENUTMILEVEL3_SHIFT)) & USBPHY_CTRL_TOG_ENUTMILEVEL3_MASK) - -#define USBPHY_CTRL_TOG_ENIRQWAKEUP_MASK (0x10000U) -#define USBPHY_CTRL_TOG_ENIRQWAKEUP_SHIFT (16U) -#define USBPHY_CTRL_TOG_ENIRQWAKEUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENIRQWAKEUP_SHIFT)) & USBPHY_CTRL_TOG_ENIRQWAKEUP_MASK) - -#define USBPHY_CTRL_TOG_WAKEUP_IRQ_MASK (0x20000U) -#define USBPHY_CTRL_TOG_WAKEUP_IRQ_SHIFT (17U) -#define USBPHY_CTRL_TOG_WAKEUP_IRQ(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_WAKEUP_IRQ_SHIFT)) & USBPHY_CTRL_TOG_WAKEUP_IRQ_MASK) - -#define USBPHY_CTRL_TOG_ENAUTO_PWRON_PLL_MASK (0x40000U) -#define USBPHY_CTRL_TOG_ENAUTO_PWRON_PLL_SHIFT (18U) -#define USBPHY_CTRL_TOG_ENAUTO_PWRON_PLL(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENAUTO_PWRON_PLL_SHIFT)) & USBPHY_CTRL_TOG_ENAUTO_PWRON_PLL_MASK) - -#define USBPHY_CTRL_TOG_ENAUTOCLR_CLKGATE_MASK (0x80000U) -#define USBPHY_CTRL_TOG_ENAUTOCLR_CLKGATE_SHIFT (19U) -#define USBPHY_CTRL_TOG_ENAUTOCLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENAUTOCLR_CLKGATE_SHIFT)) & USBPHY_CTRL_TOG_ENAUTOCLR_CLKGATE_MASK) - -#define USBPHY_CTRL_TOG_ENAUTOCLR_PHY_PWD_MASK (0x100000U) -#define USBPHY_CTRL_TOG_ENAUTOCLR_PHY_PWD_SHIFT (20U) -#define USBPHY_CTRL_TOG_ENAUTOCLR_PHY_PWD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENAUTOCLR_PHY_PWD_SHIFT)) & USBPHY_CTRL_TOG_ENAUTOCLR_PHY_PWD_MASK) - -#define USBPHY_CTRL_TOG_ENDPDMCHG_WKUP_MASK (0x200000U) -#define USBPHY_CTRL_TOG_ENDPDMCHG_WKUP_SHIFT (21U) -#define USBPHY_CTRL_TOG_ENDPDMCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENDPDMCHG_WKUP_SHIFT)) & USBPHY_CTRL_TOG_ENDPDMCHG_WKUP_MASK) - -#define USBPHY_CTRL_TOG_ENIDCHG_WKUP_MASK (0x400000U) -#define USBPHY_CTRL_TOG_ENIDCHG_WKUP_SHIFT (22U) -#define USBPHY_CTRL_TOG_ENIDCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENIDCHG_WKUP_SHIFT)) & USBPHY_CTRL_TOG_ENIDCHG_WKUP_MASK) - -#define USBPHY_CTRL_TOG_ENVBUSCHG_WKUP_MASK (0x800000U) -#define USBPHY_CTRL_TOG_ENVBUSCHG_WKUP_SHIFT (23U) -#define USBPHY_CTRL_TOG_ENVBUSCHG_WKUP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_ENVBUSCHG_WKUP_SHIFT)) & USBPHY_CTRL_TOG_ENVBUSCHG_WKUP_MASK) - -#define USBPHY_CTRL_TOG_FSDLL_RST_EN_MASK (0x1000000U) -#define USBPHY_CTRL_TOG_FSDLL_RST_EN_SHIFT (24U) -#define USBPHY_CTRL_TOG_FSDLL_RST_EN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_FSDLL_RST_EN_SHIFT)) & USBPHY_CTRL_TOG_FSDLL_RST_EN_MASK) - -#define USBPHY_CTRL_TOG_RSVD1_MASK (0x6000000U) -#define USBPHY_CTRL_TOG_RSVD1_SHIFT (25U) -#define USBPHY_CTRL_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_RSVD1_SHIFT)) & USBPHY_CTRL_TOG_RSVD1_MASK) - -#define USBPHY_CTRL_TOG_OTG_ID_VALUE_MASK (0x8000000U) -#define USBPHY_CTRL_TOG_OTG_ID_VALUE_SHIFT (27U) -#define USBPHY_CTRL_TOG_OTG_ID_VALUE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_OTG_ID_VALUE_SHIFT)) & USBPHY_CTRL_TOG_OTG_ID_VALUE_MASK) - -#define USBPHY_CTRL_TOG_HOST_FORCE_LS_SE0_MASK (0x10000000U) -#define USBPHY_CTRL_TOG_HOST_FORCE_LS_SE0_SHIFT (28U) -#define USBPHY_CTRL_TOG_HOST_FORCE_LS_SE0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_HOST_FORCE_LS_SE0_SHIFT)) & USBPHY_CTRL_TOG_HOST_FORCE_LS_SE0_MASK) - -#define USBPHY_CTRL_TOG_UTMI_SUSPENDM_MASK (0x20000000U) -#define USBPHY_CTRL_TOG_UTMI_SUSPENDM_SHIFT (29U) -#define USBPHY_CTRL_TOG_UTMI_SUSPENDM(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_UTMI_SUSPENDM_SHIFT)) & USBPHY_CTRL_TOG_UTMI_SUSPENDM_MASK) - -#define USBPHY_CTRL_TOG_CLKGATE_MASK (0x40000000U) -#define USBPHY_CTRL_TOG_CLKGATE_SHIFT (30U) -#define USBPHY_CTRL_TOG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_CLKGATE_SHIFT)) & USBPHY_CTRL_TOG_CLKGATE_MASK) - -#define USBPHY_CTRL_TOG_SFTRST_MASK (0x80000000U) -#define USBPHY_CTRL_TOG_SFTRST_SHIFT (31U) -#define USBPHY_CTRL_TOG_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_CTRL_TOG_SFTRST_SHIFT)) & USBPHY_CTRL_TOG_SFTRST_MASK) -/*! @} */ - -/*! @name STATUS - USB PHY Status Register */ -/*! @{ */ - -#define USBPHY_STATUS_RSVD0_MASK (0x7U) -#define USBPHY_STATUS_RSVD0_SHIFT (0U) -#define USBPHY_STATUS_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RSVD0_SHIFT)) & USBPHY_STATUS_RSVD0_MASK) - -#define USBPHY_STATUS_HOSTDISCONDETECT_STATUS_MASK (0x8U) -#define USBPHY_STATUS_HOSTDISCONDETECT_STATUS_SHIFT (3U) -#define USBPHY_STATUS_HOSTDISCONDETECT_STATUS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_HOSTDISCONDETECT_STATUS_SHIFT)) & USBPHY_STATUS_HOSTDISCONDETECT_STATUS_MASK) - -#define USBPHY_STATUS_RSVD1_MASK (0x30U) -#define USBPHY_STATUS_RSVD1_SHIFT (4U) -#define USBPHY_STATUS_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RSVD1_SHIFT)) & USBPHY_STATUS_RSVD1_MASK) - -#define USBPHY_STATUS_DEVPLUGIN_STATUS_MASK (0x40U) -#define USBPHY_STATUS_DEVPLUGIN_STATUS_SHIFT (6U) -#define USBPHY_STATUS_DEVPLUGIN_STATUS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_DEVPLUGIN_STATUS_SHIFT)) & USBPHY_STATUS_DEVPLUGIN_STATUS_MASK) - -#define USBPHY_STATUS_RSVD2_MASK (0x80U) -#define USBPHY_STATUS_RSVD2_SHIFT (7U) -#define USBPHY_STATUS_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RSVD2_SHIFT)) & USBPHY_STATUS_RSVD2_MASK) - -#define USBPHY_STATUS_OTGID_STATUS_MASK (0x100U) -#define USBPHY_STATUS_OTGID_STATUS_SHIFT (8U) -#define USBPHY_STATUS_OTGID_STATUS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_OTGID_STATUS_SHIFT)) & USBPHY_STATUS_OTGID_STATUS_MASK) - -#define USBPHY_STATUS_RSVD3_MASK (0x200U) -#define USBPHY_STATUS_RSVD3_SHIFT (9U) -#define USBPHY_STATUS_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RSVD3_SHIFT)) & USBPHY_STATUS_RSVD3_MASK) - -#define USBPHY_STATUS_RESUME_STATUS_MASK (0x400U) -#define USBPHY_STATUS_RESUME_STATUS_SHIFT (10U) -#define USBPHY_STATUS_RESUME_STATUS(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RESUME_STATUS_SHIFT)) & USBPHY_STATUS_RESUME_STATUS_MASK) - -#define USBPHY_STATUS_RSVD4_MASK (0xFFFFF800U) -#define USBPHY_STATUS_RSVD4_SHIFT (11U) -#define USBPHY_STATUS_RSVD4(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_STATUS_RSVD4_SHIFT)) & USBPHY_STATUS_RSVD4_MASK) -/*! @} */ - -/*! @name DEBUG - USB PHY Debug Register */ -/*! @{ */ - -#define USBPHY_DEBUG_OTGIDPIOLOCK_MASK (0x1U) -#define USBPHY_DEBUG_OTGIDPIOLOCK_SHIFT (0U) -#define USBPHY_DEBUG_OTGIDPIOLOCK(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_OTGIDPIOLOCK_SHIFT)) & USBPHY_DEBUG_OTGIDPIOLOCK_MASK) - -#define USBPHY_DEBUG_DEBUG_INTERFACE_HOLD_MASK (0x2U) -#define USBPHY_DEBUG_DEBUG_INTERFACE_HOLD_SHIFT (1U) -#define USBPHY_DEBUG_DEBUG_INTERFACE_HOLD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_DEBUG_INTERFACE_HOLD_SHIFT)) & USBPHY_DEBUG_DEBUG_INTERFACE_HOLD_MASK) - -#define USBPHY_DEBUG_HSTPULLDOWN_MASK (0xCU) -#define USBPHY_DEBUG_HSTPULLDOWN_SHIFT (2U) -#define USBPHY_DEBUG_HSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_HSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_HSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_ENHSTPULLDOWN_MASK (0x30U) -#define USBPHY_DEBUG_ENHSTPULLDOWN_SHIFT (4U) -#define USBPHY_DEBUG_ENHSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_ENHSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_ENHSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_RSVD0_MASK (0xC0U) -#define USBPHY_DEBUG_RSVD0_SHIFT (6U) -#define USBPHY_DEBUG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_RSVD0_SHIFT)) & USBPHY_DEBUG_RSVD0_MASK) - -#define USBPHY_DEBUG_TX2RXCOUNT_MASK (0xF00U) -#define USBPHY_DEBUG_TX2RXCOUNT_SHIFT (8U) -#define USBPHY_DEBUG_TX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_TX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_ENTX2RXCOUNT_MASK (0x1000U) -#define USBPHY_DEBUG_ENTX2RXCOUNT_SHIFT (12U) -#define USBPHY_DEBUG_ENTX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_ENTX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_ENTX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_RSVD1_MASK (0xE000U) -#define USBPHY_DEBUG_RSVD1_SHIFT (13U) -#define USBPHY_DEBUG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_RSVD1_SHIFT)) & USBPHY_DEBUG_RSVD1_MASK) - -#define USBPHY_DEBUG_SQUELCHRESETCOUNT_MASK (0x1F0000U) -#define USBPHY_DEBUG_SQUELCHRESETCOUNT_SHIFT (16U) -#define USBPHY_DEBUG_SQUELCHRESETCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SQUELCHRESETCOUNT_SHIFT)) & USBPHY_DEBUG_SQUELCHRESETCOUNT_MASK) - -#define USBPHY_DEBUG_RSVD2_MASK (0xE00000U) -#define USBPHY_DEBUG_RSVD2_SHIFT (21U) -#define USBPHY_DEBUG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_RSVD2_SHIFT)) & USBPHY_DEBUG_RSVD2_MASK) - -#define USBPHY_DEBUG_ENSQUELCHRESET_MASK (0x1000000U) -#define USBPHY_DEBUG_ENSQUELCHRESET_SHIFT (24U) -#define USBPHY_DEBUG_ENSQUELCHRESET(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_ENSQUELCHRESET_SHIFT)) & USBPHY_DEBUG_ENSQUELCHRESET_MASK) - -#define USBPHY_DEBUG_SQUELCHRESETLENGTH_MASK (0x1E000000U) -#define USBPHY_DEBUG_SQUELCHRESETLENGTH_SHIFT (25U) -#define USBPHY_DEBUG_SQUELCHRESETLENGTH(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SQUELCHRESETLENGTH_SHIFT)) & USBPHY_DEBUG_SQUELCHRESETLENGTH_MASK) - -#define USBPHY_DEBUG_HOST_RESUME_DEBUG_MASK (0x20000000U) -#define USBPHY_DEBUG_HOST_RESUME_DEBUG_SHIFT (29U) -#define USBPHY_DEBUG_HOST_RESUME_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_HOST_RESUME_DEBUG_SHIFT)) & USBPHY_DEBUG_HOST_RESUME_DEBUG_MASK) - -#define USBPHY_DEBUG_CLKGATE_MASK (0x40000000U) -#define USBPHY_DEBUG_CLKGATE_SHIFT (30U) -#define USBPHY_DEBUG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLKGATE_SHIFT)) & USBPHY_DEBUG_CLKGATE_MASK) - -#define USBPHY_DEBUG_RSVD3_MASK (0x80000000U) -#define USBPHY_DEBUG_RSVD3_SHIFT (31U) -#define USBPHY_DEBUG_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_RSVD3_SHIFT)) & USBPHY_DEBUG_RSVD3_MASK) -/*! @} */ - -/*! @name DEBUG_SET - USB PHY Debug Register */ -/*! @{ */ - -#define USBPHY_DEBUG_SET_OTGIDPIOLOCK_MASK (0x1U) -#define USBPHY_DEBUG_SET_OTGIDPIOLOCK_SHIFT (0U) -#define USBPHY_DEBUG_SET_OTGIDPIOLOCK(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_OTGIDPIOLOCK_SHIFT)) & USBPHY_DEBUG_SET_OTGIDPIOLOCK_MASK) - -#define USBPHY_DEBUG_SET_DEBUG_INTERFACE_HOLD_MASK (0x2U) -#define USBPHY_DEBUG_SET_DEBUG_INTERFACE_HOLD_SHIFT (1U) -#define USBPHY_DEBUG_SET_DEBUG_INTERFACE_HOLD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_DEBUG_INTERFACE_HOLD_SHIFT)) & USBPHY_DEBUG_SET_DEBUG_INTERFACE_HOLD_MASK) - -#define USBPHY_DEBUG_SET_HSTPULLDOWN_MASK (0xCU) -#define USBPHY_DEBUG_SET_HSTPULLDOWN_SHIFT (2U) -#define USBPHY_DEBUG_SET_HSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_HSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_SET_HSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_SET_ENHSTPULLDOWN_MASK (0x30U) -#define USBPHY_DEBUG_SET_ENHSTPULLDOWN_SHIFT (4U) -#define USBPHY_DEBUG_SET_ENHSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_ENHSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_SET_ENHSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_SET_RSVD0_MASK (0xC0U) -#define USBPHY_DEBUG_SET_RSVD0_SHIFT (6U) -#define USBPHY_DEBUG_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_RSVD0_SHIFT)) & USBPHY_DEBUG_SET_RSVD0_MASK) - -#define USBPHY_DEBUG_SET_TX2RXCOUNT_MASK (0xF00U) -#define USBPHY_DEBUG_SET_TX2RXCOUNT_SHIFT (8U) -#define USBPHY_DEBUG_SET_TX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_TX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_SET_TX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_SET_ENTX2RXCOUNT_MASK (0x1000U) -#define USBPHY_DEBUG_SET_ENTX2RXCOUNT_SHIFT (12U) -#define USBPHY_DEBUG_SET_ENTX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_ENTX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_SET_ENTX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_SET_RSVD1_MASK (0xE000U) -#define USBPHY_DEBUG_SET_RSVD1_SHIFT (13U) -#define USBPHY_DEBUG_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_RSVD1_SHIFT)) & USBPHY_DEBUG_SET_RSVD1_MASK) - -#define USBPHY_DEBUG_SET_SQUELCHRESETCOUNT_MASK (0x1F0000U) -#define USBPHY_DEBUG_SET_SQUELCHRESETCOUNT_SHIFT (16U) -#define USBPHY_DEBUG_SET_SQUELCHRESETCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_SQUELCHRESETCOUNT_SHIFT)) & USBPHY_DEBUG_SET_SQUELCHRESETCOUNT_MASK) - -#define USBPHY_DEBUG_SET_RSVD2_MASK (0xE00000U) -#define USBPHY_DEBUG_SET_RSVD2_SHIFT (21U) -#define USBPHY_DEBUG_SET_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_RSVD2_SHIFT)) & USBPHY_DEBUG_SET_RSVD2_MASK) - -#define USBPHY_DEBUG_SET_ENSQUELCHRESET_MASK (0x1000000U) -#define USBPHY_DEBUG_SET_ENSQUELCHRESET_SHIFT (24U) -#define USBPHY_DEBUG_SET_ENSQUELCHRESET(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_ENSQUELCHRESET_SHIFT)) & USBPHY_DEBUG_SET_ENSQUELCHRESET_MASK) - -#define USBPHY_DEBUG_SET_SQUELCHRESETLENGTH_MASK (0x1E000000U) -#define USBPHY_DEBUG_SET_SQUELCHRESETLENGTH_SHIFT (25U) -#define USBPHY_DEBUG_SET_SQUELCHRESETLENGTH(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_SQUELCHRESETLENGTH_SHIFT)) & USBPHY_DEBUG_SET_SQUELCHRESETLENGTH_MASK) - -#define USBPHY_DEBUG_SET_HOST_RESUME_DEBUG_MASK (0x20000000U) -#define USBPHY_DEBUG_SET_HOST_RESUME_DEBUG_SHIFT (29U) -#define USBPHY_DEBUG_SET_HOST_RESUME_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_HOST_RESUME_DEBUG_SHIFT)) & USBPHY_DEBUG_SET_HOST_RESUME_DEBUG_MASK) - -#define USBPHY_DEBUG_SET_CLKGATE_MASK (0x40000000U) -#define USBPHY_DEBUG_SET_CLKGATE_SHIFT (30U) -#define USBPHY_DEBUG_SET_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_CLKGATE_SHIFT)) & USBPHY_DEBUG_SET_CLKGATE_MASK) - -#define USBPHY_DEBUG_SET_RSVD3_MASK (0x80000000U) -#define USBPHY_DEBUG_SET_RSVD3_SHIFT (31U) -#define USBPHY_DEBUG_SET_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_SET_RSVD3_SHIFT)) & USBPHY_DEBUG_SET_RSVD3_MASK) -/*! @} */ - -/*! @name DEBUG_CLR - USB PHY Debug Register */ -/*! @{ */ - -#define USBPHY_DEBUG_CLR_OTGIDPIOLOCK_MASK (0x1U) -#define USBPHY_DEBUG_CLR_OTGIDPIOLOCK_SHIFT (0U) -#define USBPHY_DEBUG_CLR_OTGIDPIOLOCK(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_OTGIDPIOLOCK_SHIFT)) & USBPHY_DEBUG_CLR_OTGIDPIOLOCK_MASK) - -#define USBPHY_DEBUG_CLR_DEBUG_INTERFACE_HOLD_MASK (0x2U) -#define USBPHY_DEBUG_CLR_DEBUG_INTERFACE_HOLD_SHIFT (1U) -#define USBPHY_DEBUG_CLR_DEBUG_INTERFACE_HOLD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_DEBUG_INTERFACE_HOLD_SHIFT)) & USBPHY_DEBUG_CLR_DEBUG_INTERFACE_HOLD_MASK) - -#define USBPHY_DEBUG_CLR_HSTPULLDOWN_MASK (0xCU) -#define USBPHY_DEBUG_CLR_HSTPULLDOWN_SHIFT (2U) -#define USBPHY_DEBUG_CLR_HSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_HSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_CLR_HSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_CLR_ENHSTPULLDOWN_MASK (0x30U) -#define USBPHY_DEBUG_CLR_ENHSTPULLDOWN_SHIFT (4U) -#define USBPHY_DEBUG_CLR_ENHSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_ENHSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_CLR_ENHSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_CLR_RSVD0_MASK (0xC0U) -#define USBPHY_DEBUG_CLR_RSVD0_SHIFT (6U) -#define USBPHY_DEBUG_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_RSVD0_SHIFT)) & USBPHY_DEBUG_CLR_RSVD0_MASK) - -#define USBPHY_DEBUG_CLR_TX2RXCOUNT_MASK (0xF00U) -#define USBPHY_DEBUG_CLR_TX2RXCOUNT_SHIFT (8U) -#define USBPHY_DEBUG_CLR_TX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_TX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_CLR_TX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_CLR_ENTX2RXCOUNT_MASK (0x1000U) -#define USBPHY_DEBUG_CLR_ENTX2RXCOUNT_SHIFT (12U) -#define USBPHY_DEBUG_CLR_ENTX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_ENTX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_CLR_ENTX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_CLR_RSVD1_MASK (0xE000U) -#define USBPHY_DEBUG_CLR_RSVD1_SHIFT (13U) -#define USBPHY_DEBUG_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_RSVD1_SHIFT)) & USBPHY_DEBUG_CLR_RSVD1_MASK) - -#define USBPHY_DEBUG_CLR_SQUELCHRESETCOUNT_MASK (0x1F0000U) -#define USBPHY_DEBUG_CLR_SQUELCHRESETCOUNT_SHIFT (16U) -#define USBPHY_DEBUG_CLR_SQUELCHRESETCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_SQUELCHRESETCOUNT_SHIFT)) & USBPHY_DEBUG_CLR_SQUELCHRESETCOUNT_MASK) - -#define USBPHY_DEBUG_CLR_RSVD2_MASK (0xE00000U) -#define USBPHY_DEBUG_CLR_RSVD2_SHIFT (21U) -#define USBPHY_DEBUG_CLR_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_RSVD2_SHIFT)) & USBPHY_DEBUG_CLR_RSVD2_MASK) - -#define USBPHY_DEBUG_CLR_ENSQUELCHRESET_MASK (0x1000000U) -#define USBPHY_DEBUG_CLR_ENSQUELCHRESET_SHIFT (24U) -#define USBPHY_DEBUG_CLR_ENSQUELCHRESET(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_ENSQUELCHRESET_SHIFT)) & USBPHY_DEBUG_CLR_ENSQUELCHRESET_MASK) - -#define USBPHY_DEBUG_CLR_SQUELCHRESETLENGTH_MASK (0x1E000000U) -#define USBPHY_DEBUG_CLR_SQUELCHRESETLENGTH_SHIFT (25U) -#define USBPHY_DEBUG_CLR_SQUELCHRESETLENGTH(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_SQUELCHRESETLENGTH_SHIFT)) & USBPHY_DEBUG_CLR_SQUELCHRESETLENGTH_MASK) - -#define USBPHY_DEBUG_CLR_HOST_RESUME_DEBUG_MASK (0x20000000U) -#define USBPHY_DEBUG_CLR_HOST_RESUME_DEBUG_SHIFT (29U) -#define USBPHY_DEBUG_CLR_HOST_RESUME_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_HOST_RESUME_DEBUG_SHIFT)) & USBPHY_DEBUG_CLR_HOST_RESUME_DEBUG_MASK) - -#define USBPHY_DEBUG_CLR_CLKGATE_MASK (0x40000000U) -#define USBPHY_DEBUG_CLR_CLKGATE_SHIFT (30U) -#define USBPHY_DEBUG_CLR_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_CLKGATE_SHIFT)) & USBPHY_DEBUG_CLR_CLKGATE_MASK) - -#define USBPHY_DEBUG_CLR_RSVD3_MASK (0x80000000U) -#define USBPHY_DEBUG_CLR_RSVD3_SHIFT (31U) -#define USBPHY_DEBUG_CLR_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_CLR_RSVD3_SHIFT)) & USBPHY_DEBUG_CLR_RSVD3_MASK) -/*! @} */ - -/*! @name DEBUG_TOG - USB PHY Debug Register */ -/*! @{ */ - -#define USBPHY_DEBUG_TOG_OTGIDPIOLOCK_MASK (0x1U) -#define USBPHY_DEBUG_TOG_OTGIDPIOLOCK_SHIFT (0U) -#define USBPHY_DEBUG_TOG_OTGIDPIOLOCK(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_OTGIDPIOLOCK_SHIFT)) & USBPHY_DEBUG_TOG_OTGIDPIOLOCK_MASK) - -#define USBPHY_DEBUG_TOG_DEBUG_INTERFACE_HOLD_MASK (0x2U) -#define USBPHY_DEBUG_TOG_DEBUG_INTERFACE_HOLD_SHIFT (1U) -#define USBPHY_DEBUG_TOG_DEBUG_INTERFACE_HOLD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_DEBUG_INTERFACE_HOLD_SHIFT)) & USBPHY_DEBUG_TOG_DEBUG_INTERFACE_HOLD_MASK) - -#define USBPHY_DEBUG_TOG_HSTPULLDOWN_MASK (0xCU) -#define USBPHY_DEBUG_TOG_HSTPULLDOWN_SHIFT (2U) -#define USBPHY_DEBUG_TOG_HSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_HSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_TOG_HSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_TOG_ENHSTPULLDOWN_MASK (0x30U) -#define USBPHY_DEBUG_TOG_ENHSTPULLDOWN_SHIFT (4U) -#define USBPHY_DEBUG_TOG_ENHSTPULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_ENHSTPULLDOWN_SHIFT)) & USBPHY_DEBUG_TOG_ENHSTPULLDOWN_MASK) - -#define USBPHY_DEBUG_TOG_RSVD0_MASK (0xC0U) -#define USBPHY_DEBUG_TOG_RSVD0_SHIFT (6U) -#define USBPHY_DEBUG_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_RSVD0_SHIFT)) & USBPHY_DEBUG_TOG_RSVD0_MASK) - -#define USBPHY_DEBUG_TOG_TX2RXCOUNT_MASK (0xF00U) -#define USBPHY_DEBUG_TOG_TX2RXCOUNT_SHIFT (8U) -#define USBPHY_DEBUG_TOG_TX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_TX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_TOG_TX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_TOG_ENTX2RXCOUNT_MASK (0x1000U) -#define USBPHY_DEBUG_TOG_ENTX2RXCOUNT_SHIFT (12U) -#define USBPHY_DEBUG_TOG_ENTX2RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_ENTX2RXCOUNT_SHIFT)) & USBPHY_DEBUG_TOG_ENTX2RXCOUNT_MASK) - -#define USBPHY_DEBUG_TOG_RSVD1_MASK (0xE000U) -#define USBPHY_DEBUG_TOG_RSVD1_SHIFT (13U) -#define USBPHY_DEBUG_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_RSVD1_SHIFT)) & USBPHY_DEBUG_TOG_RSVD1_MASK) - -#define USBPHY_DEBUG_TOG_SQUELCHRESETCOUNT_MASK (0x1F0000U) -#define USBPHY_DEBUG_TOG_SQUELCHRESETCOUNT_SHIFT (16U) -#define USBPHY_DEBUG_TOG_SQUELCHRESETCOUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_SQUELCHRESETCOUNT_SHIFT)) & USBPHY_DEBUG_TOG_SQUELCHRESETCOUNT_MASK) - -#define USBPHY_DEBUG_TOG_RSVD2_MASK (0xE00000U) -#define USBPHY_DEBUG_TOG_RSVD2_SHIFT (21U) -#define USBPHY_DEBUG_TOG_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_RSVD2_SHIFT)) & USBPHY_DEBUG_TOG_RSVD2_MASK) - -#define USBPHY_DEBUG_TOG_ENSQUELCHRESET_MASK (0x1000000U) -#define USBPHY_DEBUG_TOG_ENSQUELCHRESET_SHIFT (24U) -#define USBPHY_DEBUG_TOG_ENSQUELCHRESET(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_ENSQUELCHRESET_SHIFT)) & USBPHY_DEBUG_TOG_ENSQUELCHRESET_MASK) - -#define USBPHY_DEBUG_TOG_SQUELCHRESETLENGTH_MASK (0x1E000000U) -#define USBPHY_DEBUG_TOG_SQUELCHRESETLENGTH_SHIFT (25U) -#define USBPHY_DEBUG_TOG_SQUELCHRESETLENGTH(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_SQUELCHRESETLENGTH_SHIFT)) & USBPHY_DEBUG_TOG_SQUELCHRESETLENGTH_MASK) - -#define USBPHY_DEBUG_TOG_HOST_RESUME_DEBUG_MASK (0x20000000U) -#define USBPHY_DEBUG_TOG_HOST_RESUME_DEBUG_SHIFT (29U) -#define USBPHY_DEBUG_TOG_HOST_RESUME_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_HOST_RESUME_DEBUG_SHIFT)) & USBPHY_DEBUG_TOG_HOST_RESUME_DEBUG_MASK) - -#define USBPHY_DEBUG_TOG_CLKGATE_MASK (0x40000000U) -#define USBPHY_DEBUG_TOG_CLKGATE_SHIFT (30U) -#define USBPHY_DEBUG_TOG_CLKGATE(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_CLKGATE_SHIFT)) & USBPHY_DEBUG_TOG_CLKGATE_MASK) - -#define USBPHY_DEBUG_TOG_RSVD3_MASK (0x80000000U) -#define USBPHY_DEBUG_TOG_RSVD3_SHIFT (31U) -#define USBPHY_DEBUG_TOG_RSVD3(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG_TOG_RSVD3_SHIFT)) & USBPHY_DEBUG_TOG_RSVD3_MASK) -/*! @} */ - -/*! @name DEBUG0_STATUS - UTMI Debug Status Register 0 */ -/*! @{ */ - -#define USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT_MASK (0xFFFFU) -#define USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT_SHIFT (0U) -#define USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT_SHIFT)) & USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT_MASK) - -#define USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT_MASK (0x3FF0000U) -#define USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT_SHIFT (16U) -#define USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT_SHIFT)) & USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT_MASK) - -#define USBPHY_DEBUG0_STATUS_SQUELCH_COUNT_MASK (0xFC000000U) -#define USBPHY_DEBUG0_STATUS_SQUELCH_COUNT_SHIFT (26U) -#define USBPHY_DEBUG0_STATUS_SQUELCH_COUNT(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG0_STATUS_SQUELCH_COUNT_SHIFT)) & USBPHY_DEBUG0_STATUS_SQUELCH_COUNT_MASK) -/*! @} */ - -/*! @name DEBUG1 - UTMI Debug Status Register 1 */ -/*! @{ */ - -#define USBPHY_DEBUG1_RSVD0_MASK (0x1FFFU) -#define USBPHY_DEBUG1_RSVD0_SHIFT (0U) -#define USBPHY_DEBUG1_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_RSVD0_SHIFT)) & USBPHY_DEBUG1_RSVD0_MASK) - -#define USBPHY_DEBUG1_ENTAILADJVD_MASK (0x6000U) -#define USBPHY_DEBUG1_ENTAILADJVD_SHIFT (13U) -#define USBPHY_DEBUG1_ENTAILADJVD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_ENTAILADJVD_SHIFT)) & USBPHY_DEBUG1_ENTAILADJVD_MASK) - -#define USBPHY_DEBUG1_RSVD1_MASK (0xFFFF8000U) -#define USBPHY_DEBUG1_RSVD1_SHIFT (15U) -#define USBPHY_DEBUG1_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_RSVD1_SHIFT)) & USBPHY_DEBUG1_RSVD1_MASK) -/*! @} */ - -/*! @name DEBUG1_SET - UTMI Debug Status Register 1 */ -/*! @{ */ - -#define USBPHY_DEBUG1_SET_RSVD0_MASK (0x1FFFU) -#define USBPHY_DEBUG1_SET_RSVD0_SHIFT (0U) -#define USBPHY_DEBUG1_SET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_SET_RSVD0_SHIFT)) & USBPHY_DEBUG1_SET_RSVD0_MASK) - -#define USBPHY_DEBUG1_SET_ENTAILADJVD_MASK (0x6000U) -#define USBPHY_DEBUG1_SET_ENTAILADJVD_SHIFT (13U) -#define USBPHY_DEBUG1_SET_ENTAILADJVD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_SET_ENTAILADJVD_SHIFT)) & USBPHY_DEBUG1_SET_ENTAILADJVD_MASK) - -#define USBPHY_DEBUG1_SET_RSVD1_MASK (0xFFFF8000U) -#define USBPHY_DEBUG1_SET_RSVD1_SHIFT (15U) -#define USBPHY_DEBUG1_SET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_SET_RSVD1_SHIFT)) & USBPHY_DEBUG1_SET_RSVD1_MASK) -/*! @} */ - -/*! @name DEBUG1_CLR - UTMI Debug Status Register 1 */ -/*! @{ */ - -#define USBPHY_DEBUG1_CLR_RSVD0_MASK (0x1FFFU) -#define USBPHY_DEBUG1_CLR_RSVD0_SHIFT (0U) -#define USBPHY_DEBUG1_CLR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_CLR_RSVD0_SHIFT)) & USBPHY_DEBUG1_CLR_RSVD0_MASK) - -#define USBPHY_DEBUG1_CLR_ENTAILADJVD_MASK (0x6000U) -#define USBPHY_DEBUG1_CLR_ENTAILADJVD_SHIFT (13U) -#define USBPHY_DEBUG1_CLR_ENTAILADJVD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_CLR_ENTAILADJVD_SHIFT)) & USBPHY_DEBUG1_CLR_ENTAILADJVD_MASK) - -#define USBPHY_DEBUG1_CLR_RSVD1_MASK (0xFFFF8000U) -#define USBPHY_DEBUG1_CLR_RSVD1_SHIFT (15U) -#define USBPHY_DEBUG1_CLR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_CLR_RSVD1_SHIFT)) & USBPHY_DEBUG1_CLR_RSVD1_MASK) -/*! @} */ - -/*! @name DEBUG1_TOG - UTMI Debug Status Register 1 */ -/*! @{ */ - -#define USBPHY_DEBUG1_TOG_RSVD0_MASK (0x1FFFU) -#define USBPHY_DEBUG1_TOG_RSVD0_SHIFT (0U) -#define USBPHY_DEBUG1_TOG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_TOG_RSVD0_SHIFT)) & USBPHY_DEBUG1_TOG_RSVD0_MASK) - -#define USBPHY_DEBUG1_TOG_ENTAILADJVD_MASK (0x6000U) -#define USBPHY_DEBUG1_TOG_ENTAILADJVD_SHIFT (13U) -#define USBPHY_DEBUG1_TOG_ENTAILADJVD(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_TOG_ENTAILADJVD_SHIFT)) & USBPHY_DEBUG1_TOG_ENTAILADJVD_MASK) - -#define USBPHY_DEBUG1_TOG_RSVD1_MASK (0xFFFF8000U) -#define USBPHY_DEBUG1_TOG_RSVD1_SHIFT (15U) -#define USBPHY_DEBUG1_TOG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_DEBUG1_TOG_RSVD1_SHIFT)) & USBPHY_DEBUG1_TOG_RSVD1_MASK) -/*! @} */ - -/*! @name VERSION - UTMI RTL Version */ -/*! @{ */ - -#define USBPHY_VERSION_STEP_MASK (0xFFFFU) -#define USBPHY_VERSION_STEP_SHIFT (0U) -#define USBPHY_VERSION_STEP(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_VERSION_STEP_SHIFT)) & USBPHY_VERSION_STEP_MASK) - -#define USBPHY_VERSION_MINOR_MASK (0xFF0000U) -#define USBPHY_VERSION_MINOR_SHIFT (16U) -#define USBPHY_VERSION_MINOR(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_VERSION_MINOR_SHIFT)) & USBPHY_VERSION_MINOR_MASK) - -#define USBPHY_VERSION_MAJOR_MASK (0xFF000000U) -#define USBPHY_VERSION_MAJOR_SHIFT (24U) -#define USBPHY_VERSION_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << USBPHY_VERSION_MAJOR_SHIFT)) & USBPHY_VERSION_MAJOR_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group USBPHY_Register_Masks */ - - -/* USBPHY - Peripheral instance base addresses */ -/** Peripheral USBPHY1 base address */ -#define USBPHY1_BASE (0x400D9000u) -/** Peripheral USBPHY1 base pointer */ -#define USBPHY1 ((USBPHY_Type *)USBPHY1_BASE) -/** Peripheral USBPHY2 base address */ -#define USBPHY2_BASE (0x400DA000u) -/** Peripheral USBPHY2 base pointer */ -#define USBPHY2 ((USBPHY_Type *)USBPHY2_BASE) -/** Array initializer of USBPHY peripheral base addresses */ -#define USBPHY_BASE_ADDRS { 0u, USBPHY1_BASE, USBPHY2_BASE } -/** Array initializer of USBPHY peripheral base pointers */ -#define USBPHY_BASE_PTRS { (USBPHY_Type *)0u, USBPHY1, USBPHY2 } -/** Interrupt vectors for the USBPHY peripheral type */ -#define USBPHY_IRQS { NotAvail_IRQn, USB_PHY1_IRQn, USB_PHY2_IRQn } -/* Backward compatibility */ -#define USBPHY_CTRL_ENDEVPLUGINDET_MASK USBPHY_CTRL_ENDEVPLUGINDETECT_MASK -#define USBPHY_CTRL_ENDEVPLUGINDET_SHIFT USBPHY_CTRL_ENDEVPLUGINDETECT_SHIFT -#define USBPHY_CTRL_ENDEVPLUGINDET(x) USBPHY_CTRL_ENDEVPLUGINDETECT(x) -#define USBPHY_TX_TXCAL45DM_MASK USBPHY_TX_TXCAL45DN_MASK -#define USBPHY_TX_TXCAL45DM_SHIFT USBPHY_TX_TXCAL45DN_SHIFT -#define USBPHY_TX_TXCAL45DM(x) USBPHY_TX_TXCAL45DN(x) - - -/*! - * @} - */ /* end of group USBPHY_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- USB_ANALOG Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USB_ANALOG_Peripheral_Access_Layer USB_ANALOG Peripheral Access Layer - * @{ - */ - -/** USB_ANALOG - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[416]; - struct { /* offset: 0x1A0, array step: 0x60 */ - __IO uint32_t VBUS_DETECT; /**< USB VBUS Detect Register, array offset: 0x1A0, array step: 0x60 */ - __IO uint32_t VBUS_DETECT_SET; /**< USB VBUS Detect Register, array offset: 0x1A4, array step: 0x60 */ - __IO uint32_t VBUS_DETECT_CLR; /**< USB VBUS Detect Register, array offset: 0x1A8, array step: 0x60 */ - __IO uint32_t VBUS_DETECT_TOG; /**< USB VBUS Detect Register, array offset: 0x1AC, array step: 0x60 */ - __IO uint32_t CHRG_DETECT; /**< USB Charger Detect Register, array offset: 0x1B0, array step: 0x60 */ - __IO uint32_t CHRG_DETECT_SET; /**< USB Charger Detect Register, array offset: 0x1B4, array step: 0x60 */ - __IO uint32_t CHRG_DETECT_CLR; /**< USB Charger Detect Register, array offset: 0x1B8, array step: 0x60 */ - __IO uint32_t CHRG_DETECT_TOG; /**< USB Charger Detect Register, array offset: 0x1BC, array step: 0x60 */ - __I uint32_t VBUS_DETECT_STAT; /**< USB VBUS Detect Status Register, array offset: 0x1C0, array step: 0x60 */ - uint8_t RESERVED_0[12]; - __I uint32_t CHRG_DETECT_STAT; /**< USB Charger Detect Status Register, array offset: 0x1D0, array step: 0x60 */ - uint8_t RESERVED_1[12]; - __IO uint32_t LOOPBACK; /**< USB Loopback Test Register, array offset: 0x1E0, array step: 0x60 */ - __IO uint32_t LOOPBACK_SET; /**< USB Loopback Test Register, array offset: 0x1E4, array step: 0x60 */ - __IO uint32_t LOOPBACK_CLR; /**< USB Loopback Test Register, array offset: 0x1E8, array step: 0x60 */ - __IO uint32_t LOOPBACK_TOG; /**< USB Loopback Test Register, array offset: 0x1EC, array step: 0x60 */ - __IO uint32_t MISC; /**< USB Misc Register, array offset: 0x1F0, array step: 0x60 */ - __IO uint32_t MISC_SET; /**< USB Misc Register, array offset: 0x1F4, array step: 0x60 */ - __IO uint32_t MISC_CLR; /**< USB Misc Register, array offset: 0x1F8, array step: 0x60 */ - __IO uint32_t MISC_TOG; /**< USB Misc Register, array offset: 0x1FC, array step: 0x60 */ - } INSTANCE[2]; - __I uint32_t DIGPROG; /**< Chip Silicon Version, offset: 0x260 */ -} USB_ANALOG_Type; - -/* ---------------------------------------------------------------------------- - -- USB_ANALOG Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USB_ANALOG_Register_Masks USB_ANALOG Register Masks - * @{ - */ - -/*! @name VBUS_DETECT - USB VBUS Detect Register */ -/*! @{ */ - -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_THRESH_MASK (0x7U) -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_THRESH_SHIFT (0U) -/*! VBUSVALID_THRESH - * 0b000..4.0V - * 0b001..4.1V - * 0b010..4.2V - * 0b011..4.3V - * 0b100..4.4V (default) - * 0b101..4.5V - * 0b110..4.6V - * 0b111..4.7V - */ -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_THRESH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_VBUSVALID_THRESH_SHIFT)) & USB_ANALOG_VBUS_DETECT_VBUSVALID_THRESH_MASK) - -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_PWRUP_CMPS_MASK (0x100000U) -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_PWRUP_CMPS_SHIFT (20U) -#define USB_ANALOG_VBUS_DETECT_VBUSVALID_PWRUP_CMPS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_VBUSVALID_PWRUP_CMPS_SHIFT)) & USB_ANALOG_VBUS_DETECT_VBUSVALID_PWRUP_CMPS_MASK) - -#define USB_ANALOG_VBUS_DETECT_DISCHARGE_VBUS_MASK (0x4000000U) -#define USB_ANALOG_VBUS_DETECT_DISCHARGE_VBUS_SHIFT (26U) -#define USB_ANALOG_VBUS_DETECT_DISCHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_DISCHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_DISCHARGE_VBUS_MASK) - -#define USB_ANALOG_VBUS_DETECT_CHARGE_VBUS_MASK (0x8000000U) -#define USB_ANALOG_VBUS_DETECT_CHARGE_VBUS_SHIFT (27U) -#define USB_ANALOG_VBUS_DETECT_CHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_CHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_CHARGE_VBUS_MASK) -/*! @} */ - -/* The count of USB_ANALOG_VBUS_DETECT */ -#define USB_ANALOG_VBUS_DETECT_COUNT (2U) - -/*! @name VBUS_DETECT_SET - USB VBUS Detect Register */ -/*! @{ */ - -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_THRESH_MASK (0x7U) -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_THRESH_SHIFT (0U) -/*! VBUSVALID_THRESH - * 0b000..4.0V - * 0b001..4.1V - * 0b010..4.2V - * 0b011..4.3V - * 0b100..4.4V (default) - * 0b101..4.5V - * 0b110..4.6V - * 0b111..4.7V - */ -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_THRESH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_THRESH_SHIFT)) & USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_THRESH_MASK) - -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_PWRUP_CMPS_MASK (0x100000U) -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_PWRUP_CMPS_SHIFT (20U) -#define USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_PWRUP_CMPS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_PWRUP_CMPS_SHIFT)) & USB_ANALOG_VBUS_DETECT_SET_VBUSVALID_PWRUP_CMPS_MASK) - -#define USB_ANALOG_VBUS_DETECT_SET_DISCHARGE_VBUS_MASK (0x4000000U) -#define USB_ANALOG_VBUS_DETECT_SET_DISCHARGE_VBUS_SHIFT (26U) -#define USB_ANALOG_VBUS_DETECT_SET_DISCHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_SET_DISCHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_SET_DISCHARGE_VBUS_MASK) - -#define USB_ANALOG_VBUS_DETECT_SET_CHARGE_VBUS_MASK (0x8000000U) -#define USB_ANALOG_VBUS_DETECT_SET_CHARGE_VBUS_SHIFT (27U) -#define USB_ANALOG_VBUS_DETECT_SET_CHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_SET_CHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_SET_CHARGE_VBUS_MASK) -/*! @} */ - -/* The count of USB_ANALOG_VBUS_DETECT_SET */ -#define USB_ANALOG_VBUS_DETECT_SET_COUNT (2U) - -/*! @name VBUS_DETECT_CLR - USB VBUS Detect Register */ -/*! @{ */ - -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_THRESH_MASK (0x7U) -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_THRESH_SHIFT (0U) -/*! VBUSVALID_THRESH - * 0b000..4.0V - * 0b001..4.1V - * 0b010..4.2V - * 0b011..4.3V - * 0b100..4.4V (default) - * 0b101..4.5V - * 0b110..4.6V - * 0b111..4.7V - */ -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_THRESH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_THRESH_SHIFT)) & USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_THRESH_MASK) - -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_PWRUP_CMPS_MASK (0x100000U) -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_PWRUP_CMPS_SHIFT (20U) -#define USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_PWRUP_CMPS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_PWRUP_CMPS_SHIFT)) & USB_ANALOG_VBUS_DETECT_CLR_VBUSVALID_PWRUP_CMPS_MASK) - -#define USB_ANALOG_VBUS_DETECT_CLR_DISCHARGE_VBUS_MASK (0x4000000U) -#define USB_ANALOG_VBUS_DETECT_CLR_DISCHARGE_VBUS_SHIFT (26U) -#define USB_ANALOG_VBUS_DETECT_CLR_DISCHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_CLR_DISCHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_CLR_DISCHARGE_VBUS_MASK) - -#define USB_ANALOG_VBUS_DETECT_CLR_CHARGE_VBUS_MASK (0x8000000U) -#define USB_ANALOG_VBUS_DETECT_CLR_CHARGE_VBUS_SHIFT (27U) -#define USB_ANALOG_VBUS_DETECT_CLR_CHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_CLR_CHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_CLR_CHARGE_VBUS_MASK) -/*! @} */ - -/* The count of USB_ANALOG_VBUS_DETECT_CLR */ -#define USB_ANALOG_VBUS_DETECT_CLR_COUNT (2U) - -/*! @name VBUS_DETECT_TOG - USB VBUS Detect Register */ -/*! @{ */ - -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_THRESH_MASK (0x7U) -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_THRESH_SHIFT (0U) -/*! VBUSVALID_THRESH - * 0b000..4.0V - * 0b001..4.1V - * 0b010..4.2V - * 0b011..4.3V - * 0b100..4.4V (default) - * 0b101..4.5V - * 0b110..4.6V - * 0b111..4.7V - */ -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_THRESH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_THRESH_SHIFT)) & USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_THRESH_MASK) - -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_PWRUP_CMPS_MASK (0x100000U) -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_PWRUP_CMPS_SHIFT (20U) -#define USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_PWRUP_CMPS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_PWRUP_CMPS_SHIFT)) & USB_ANALOG_VBUS_DETECT_TOG_VBUSVALID_PWRUP_CMPS_MASK) - -#define USB_ANALOG_VBUS_DETECT_TOG_DISCHARGE_VBUS_MASK (0x4000000U) -#define USB_ANALOG_VBUS_DETECT_TOG_DISCHARGE_VBUS_SHIFT (26U) -#define USB_ANALOG_VBUS_DETECT_TOG_DISCHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_TOG_DISCHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_TOG_DISCHARGE_VBUS_MASK) - -#define USB_ANALOG_VBUS_DETECT_TOG_CHARGE_VBUS_MASK (0x8000000U) -#define USB_ANALOG_VBUS_DETECT_TOG_CHARGE_VBUS_SHIFT (27U) -#define USB_ANALOG_VBUS_DETECT_TOG_CHARGE_VBUS(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_TOG_CHARGE_VBUS_SHIFT)) & USB_ANALOG_VBUS_DETECT_TOG_CHARGE_VBUS_MASK) -/*! @} */ - -/* The count of USB_ANALOG_VBUS_DETECT_TOG */ -#define USB_ANALOG_VBUS_DETECT_TOG_COUNT (2U) - -/*! @name CHRG_DETECT - USB Charger Detect Register */ -/*! @{ */ - -#define USB_ANALOG_CHRG_DETECT_CHK_CONTACT_MASK (0x40000U) -#define USB_ANALOG_CHRG_DETECT_CHK_CONTACT_SHIFT (18U) -/*! CHK_CONTACT - Check the contact of USB plug - * 0b0..Do not check the contact of USB plug. - * 0b1..Check whether the USB plug has been in contact with each other - */ -#define USB_ANALOG_CHRG_DETECT_CHK_CONTACT(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_CHK_CONTACT_SHIFT)) & USB_ANALOG_CHRG_DETECT_CHK_CONTACT_MASK) - -#define USB_ANALOG_CHRG_DETECT_CHK_CHRG_B_MASK (0x80000U) -#define USB_ANALOG_CHRG_DETECT_CHK_CHRG_B_SHIFT (19U) -/*! CHK_CHRG_B - Check the charger connection - * 0b0..Check whether a charger (either a dedicated charger or a host charger) is connected to USB port. - * 0b1..Do not check whether a charger is connected to the USB port. - */ -#define USB_ANALOG_CHRG_DETECT_CHK_CHRG_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_CHK_CHRG_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_CHK_CHRG_B_MASK) - -#define USB_ANALOG_CHRG_DETECT_EN_B_MASK (0x100000U) -#define USB_ANALOG_CHRG_DETECT_EN_B_SHIFT (20U) -/*! EN_B - * 0b0..Enable the charger detector. - * 0b1..Disable the charger detector. - */ -#define USB_ANALOG_CHRG_DETECT_EN_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_EN_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_EN_B_MASK) -/*! @} */ - -/* The count of USB_ANALOG_CHRG_DETECT */ -#define USB_ANALOG_CHRG_DETECT_COUNT (2U) - -/*! @name CHRG_DETECT_SET - USB Charger Detect Register */ -/*! @{ */ - -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CONTACT_MASK (0x40000U) -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CONTACT_SHIFT (18U) -/*! CHK_CONTACT - Check the contact of USB plug - * 0b0..Do not check the contact of USB plug. - * 0b1..Check whether the USB plug has been in contact with each other - */ -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CONTACT(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_SET_CHK_CONTACT_SHIFT)) & USB_ANALOG_CHRG_DETECT_SET_CHK_CONTACT_MASK) - -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CHRG_B_MASK (0x80000U) -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CHRG_B_SHIFT (19U) -/*! CHK_CHRG_B - Check the charger connection - * 0b0..Check whether a charger (either a dedicated charger or a host charger) is connected to USB port. - * 0b1..Do not check whether a charger is connected to the USB port. - */ -#define USB_ANALOG_CHRG_DETECT_SET_CHK_CHRG_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_SET_CHK_CHRG_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_SET_CHK_CHRG_B_MASK) - -#define USB_ANALOG_CHRG_DETECT_SET_EN_B_MASK (0x100000U) -#define USB_ANALOG_CHRG_DETECT_SET_EN_B_SHIFT (20U) -/*! EN_B - * 0b0..Enable the charger detector. - * 0b1..Disable the charger detector. - */ -#define USB_ANALOG_CHRG_DETECT_SET_EN_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_SET_EN_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_SET_EN_B_MASK) -/*! @} */ - -/* The count of USB_ANALOG_CHRG_DETECT_SET */ -#define USB_ANALOG_CHRG_DETECT_SET_COUNT (2U) - -/*! @name CHRG_DETECT_CLR - USB Charger Detect Register */ -/*! @{ */ - -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CONTACT_MASK (0x40000U) -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CONTACT_SHIFT (18U) -/*! CHK_CONTACT - Check the contact of USB plug - * 0b0..Do not check the contact of USB plug. - * 0b1..Check whether the USB plug has been in contact with each other - */ -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CONTACT(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_CLR_CHK_CONTACT_SHIFT)) & USB_ANALOG_CHRG_DETECT_CLR_CHK_CONTACT_MASK) - -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CHRG_B_MASK (0x80000U) -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CHRG_B_SHIFT (19U) -/*! CHK_CHRG_B - Check the charger connection - * 0b0..Check whether a charger (either a dedicated charger or a host charger) is connected to USB port. - * 0b1..Do not check whether a charger is connected to the USB port. - */ -#define USB_ANALOG_CHRG_DETECT_CLR_CHK_CHRG_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_CLR_CHK_CHRG_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_CLR_CHK_CHRG_B_MASK) - -#define USB_ANALOG_CHRG_DETECT_CLR_EN_B_MASK (0x100000U) -#define USB_ANALOG_CHRG_DETECT_CLR_EN_B_SHIFT (20U) -/*! EN_B - * 0b0..Enable the charger detector. - * 0b1..Disable the charger detector. - */ -#define USB_ANALOG_CHRG_DETECT_CLR_EN_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_CLR_EN_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_CLR_EN_B_MASK) -/*! @} */ - -/* The count of USB_ANALOG_CHRG_DETECT_CLR */ -#define USB_ANALOG_CHRG_DETECT_CLR_COUNT (2U) - -/*! @name CHRG_DETECT_TOG - USB Charger Detect Register */ -/*! @{ */ - -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CONTACT_MASK (0x40000U) -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CONTACT_SHIFT (18U) -/*! CHK_CONTACT - Check the contact of USB plug - * 0b0..Do not check the contact of USB plug. - * 0b1..Check whether the USB plug has been in contact with each other - */ -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CONTACT(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_TOG_CHK_CONTACT_SHIFT)) & USB_ANALOG_CHRG_DETECT_TOG_CHK_CONTACT_MASK) - -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CHRG_B_MASK (0x80000U) -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CHRG_B_SHIFT (19U) -/*! CHK_CHRG_B - Check the charger connection - * 0b0..Check whether a charger (either a dedicated charger or a host charger) is connected to USB port. - * 0b1..Do not check whether a charger is connected to the USB port. - */ -#define USB_ANALOG_CHRG_DETECT_TOG_CHK_CHRG_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_TOG_CHK_CHRG_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_TOG_CHK_CHRG_B_MASK) - -#define USB_ANALOG_CHRG_DETECT_TOG_EN_B_MASK (0x100000U) -#define USB_ANALOG_CHRG_DETECT_TOG_EN_B_SHIFT (20U) -/*! EN_B - * 0b0..Enable the charger detector. - * 0b1..Disable the charger detector. - */ -#define USB_ANALOG_CHRG_DETECT_TOG_EN_B(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_TOG_EN_B_SHIFT)) & USB_ANALOG_CHRG_DETECT_TOG_EN_B_MASK) -/*! @} */ - -/* The count of USB_ANALOG_CHRG_DETECT_TOG */ -#define USB_ANALOG_CHRG_DETECT_TOG_COUNT (2U) - -/*! @name VBUS_DETECT_STAT - USB VBUS Detect Status Register */ -/*! @{ */ - -#define USB_ANALOG_VBUS_DETECT_STAT_SESSEND_MASK (0x1U) -#define USB_ANALOG_VBUS_DETECT_STAT_SESSEND_SHIFT (0U) -#define USB_ANALOG_VBUS_DETECT_STAT_SESSEND(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_STAT_SESSEND_SHIFT)) & USB_ANALOG_VBUS_DETECT_STAT_SESSEND_MASK) - -#define USB_ANALOG_VBUS_DETECT_STAT_BVALID_MASK (0x2U) -#define USB_ANALOG_VBUS_DETECT_STAT_BVALID_SHIFT (1U) -#define USB_ANALOG_VBUS_DETECT_STAT_BVALID(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_STAT_BVALID_SHIFT)) & USB_ANALOG_VBUS_DETECT_STAT_BVALID_MASK) - -#define USB_ANALOG_VBUS_DETECT_STAT_AVALID_MASK (0x4U) -#define USB_ANALOG_VBUS_DETECT_STAT_AVALID_SHIFT (2U) -#define USB_ANALOG_VBUS_DETECT_STAT_AVALID(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_STAT_AVALID_SHIFT)) & USB_ANALOG_VBUS_DETECT_STAT_AVALID_MASK) - -#define USB_ANALOG_VBUS_DETECT_STAT_VBUS_VALID_MASK (0x8U) -#define USB_ANALOG_VBUS_DETECT_STAT_VBUS_VALID_SHIFT (3U) -#define USB_ANALOG_VBUS_DETECT_STAT_VBUS_VALID(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_VBUS_DETECT_STAT_VBUS_VALID_SHIFT)) & USB_ANALOG_VBUS_DETECT_STAT_VBUS_VALID_MASK) -/*! @} */ - -/* The count of USB_ANALOG_VBUS_DETECT_STAT */ -#define USB_ANALOG_VBUS_DETECT_STAT_COUNT (2U) - -/*! @name CHRG_DETECT_STAT - USB Charger Detect Status Register */ -/*! @{ */ - -#define USB_ANALOG_CHRG_DETECT_STAT_PLUG_CONTACT_MASK (0x1U) -#define USB_ANALOG_CHRG_DETECT_STAT_PLUG_CONTACT_SHIFT (0U) -/*! PLUG_CONTACT - * 0b0..The USB plug has not made contact. - * 0b1..The USB plug has made good contact. - */ -#define USB_ANALOG_CHRG_DETECT_STAT_PLUG_CONTACT(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_STAT_PLUG_CONTACT_SHIFT)) & USB_ANALOG_CHRG_DETECT_STAT_PLUG_CONTACT_MASK) - -#define USB_ANALOG_CHRG_DETECT_STAT_CHRG_DETECTED_MASK (0x2U) -#define USB_ANALOG_CHRG_DETECT_STAT_CHRG_DETECTED_SHIFT (1U) -/*! CHRG_DETECTED - * 0b0..The USB port is not connected to a charger. - * 0b1..A charger (either a dedicated charger or a host charger) is connected to the USB port. - */ -#define USB_ANALOG_CHRG_DETECT_STAT_CHRG_DETECTED(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_STAT_CHRG_DETECTED_SHIFT)) & USB_ANALOG_CHRG_DETECT_STAT_CHRG_DETECTED_MASK) - -#define USB_ANALOG_CHRG_DETECT_STAT_DM_STATE_MASK (0x4U) -#define USB_ANALOG_CHRG_DETECT_STAT_DM_STATE_SHIFT (2U) -#define USB_ANALOG_CHRG_DETECT_STAT_DM_STATE(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_STAT_DM_STATE_SHIFT)) & USB_ANALOG_CHRG_DETECT_STAT_DM_STATE_MASK) - -#define USB_ANALOG_CHRG_DETECT_STAT_DP_STATE_MASK (0x8U) -#define USB_ANALOG_CHRG_DETECT_STAT_DP_STATE_SHIFT (3U) -#define USB_ANALOG_CHRG_DETECT_STAT_DP_STATE(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_CHRG_DETECT_STAT_DP_STATE_SHIFT)) & USB_ANALOG_CHRG_DETECT_STAT_DP_STATE_MASK) -/*! @} */ - -/* The count of USB_ANALOG_CHRG_DETECT_STAT */ -#define USB_ANALOG_CHRG_DETECT_STAT_COUNT (2U) - -/*! @name LOOPBACK - USB Loopback Test Register */ -/*! @{ */ - -#define USB_ANALOG_LOOPBACK_UTMI_TESTSTART_MASK (0x1U) -#define USB_ANALOG_LOOPBACK_UTMI_TESTSTART_SHIFT (0U) -#define USB_ANALOG_LOOPBACK_UTMI_TESTSTART(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_LOOPBACK_UTMI_TESTSTART_SHIFT)) & USB_ANALOG_LOOPBACK_UTMI_TESTSTART_MASK) -/*! @} */ - -/* The count of USB_ANALOG_LOOPBACK */ -#define USB_ANALOG_LOOPBACK_COUNT (2U) - -/*! @name LOOPBACK_SET - USB Loopback Test Register */ -/*! @{ */ - -#define USB_ANALOG_LOOPBACK_SET_UTMI_TESTSTART_MASK (0x1U) -#define USB_ANALOG_LOOPBACK_SET_UTMI_TESTSTART_SHIFT (0U) -#define USB_ANALOG_LOOPBACK_SET_UTMI_TESTSTART(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_LOOPBACK_SET_UTMI_TESTSTART_SHIFT)) & USB_ANALOG_LOOPBACK_SET_UTMI_TESTSTART_MASK) -/*! @} */ - -/* The count of USB_ANALOG_LOOPBACK_SET */ -#define USB_ANALOG_LOOPBACK_SET_COUNT (2U) - -/*! @name LOOPBACK_CLR - USB Loopback Test Register */ -/*! @{ */ - -#define USB_ANALOG_LOOPBACK_CLR_UTMI_TESTSTART_MASK (0x1U) -#define USB_ANALOG_LOOPBACK_CLR_UTMI_TESTSTART_SHIFT (0U) -#define USB_ANALOG_LOOPBACK_CLR_UTMI_TESTSTART(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_LOOPBACK_CLR_UTMI_TESTSTART_SHIFT)) & USB_ANALOG_LOOPBACK_CLR_UTMI_TESTSTART_MASK) -/*! @} */ - -/* The count of USB_ANALOG_LOOPBACK_CLR */ -#define USB_ANALOG_LOOPBACK_CLR_COUNT (2U) - -/*! @name LOOPBACK_TOG - USB Loopback Test Register */ -/*! @{ */ - -#define USB_ANALOG_LOOPBACK_TOG_UTMI_TESTSTART_MASK (0x1U) -#define USB_ANALOG_LOOPBACK_TOG_UTMI_TESTSTART_SHIFT (0U) -#define USB_ANALOG_LOOPBACK_TOG_UTMI_TESTSTART(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_LOOPBACK_TOG_UTMI_TESTSTART_SHIFT)) & USB_ANALOG_LOOPBACK_TOG_UTMI_TESTSTART_MASK) -/*! @} */ - -/* The count of USB_ANALOG_LOOPBACK_TOG */ -#define USB_ANALOG_LOOPBACK_TOG_COUNT (2U) - -/*! @name MISC - USB Misc Register */ -/*! @{ */ - -#define USB_ANALOG_MISC_HS_USE_EXTERNAL_R_MASK (0x1U) -#define USB_ANALOG_MISC_HS_USE_EXTERNAL_R_SHIFT (0U) -#define USB_ANALOG_MISC_HS_USE_EXTERNAL_R(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_HS_USE_EXTERNAL_R_SHIFT)) & USB_ANALOG_MISC_HS_USE_EXTERNAL_R_MASK) - -#define USB_ANALOG_MISC_EN_DEGLITCH_MASK (0x2U) -#define USB_ANALOG_MISC_EN_DEGLITCH_SHIFT (1U) -#define USB_ANALOG_MISC_EN_DEGLITCH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_EN_DEGLITCH_SHIFT)) & USB_ANALOG_MISC_EN_DEGLITCH_MASK) - -#define USB_ANALOG_MISC_EN_CLK_UTMI_MASK (0x40000000U) -#define USB_ANALOG_MISC_EN_CLK_UTMI_SHIFT (30U) -#define USB_ANALOG_MISC_EN_CLK_UTMI(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_EN_CLK_UTMI_SHIFT)) & USB_ANALOG_MISC_EN_CLK_UTMI_MASK) -/*! @} */ - -/* The count of USB_ANALOG_MISC */ -#define USB_ANALOG_MISC_COUNT (2U) - -/*! @name MISC_SET - USB Misc Register */ -/*! @{ */ - -#define USB_ANALOG_MISC_SET_HS_USE_EXTERNAL_R_MASK (0x1U) -#define USB_ANALOG_MISC_SET_HS_USE_EXTERNAL_R_SHIFT (0U) -#define USB_ANALOG_MISC_SET_HS_USE_EXTERNAL_R(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_SET_HS_USE_EXTERNAL_R_SHIFT)) & USB_ANALOG_MISC_SET_HS_USE_EXTERNAL_R_MASK) - -#define USB_ANALOG_MISC_SET_EN_DEGLITCH_MASK (0x2U) -#define USB_ANALOG_MISC_SET_EN_DEGLITCH_SHIFT (1U) -#define USB_ANALOG_MISC_SET_EN_DEGLITCH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_SET_EN_DEGLITCH_SHIFT)) & USB_ANALOG_MISC_SET_EN_DEGLITCH_MASK) - -#define USB_ANALOG_MISC_SET_EN_CLK_UTMI_MASK (0x40000000U) -#define USB_ANALOG_MISC_SET_EN_CLK_UTMI_SHIFT (30U) -#define USB_ANALOG_MISC_SET_EN_CLK_UTMI(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_SET_EN_CLK_UTMI_SHIFT)) & USB_ANALOG_MISC_SET_EN_CLK_UTMI_MASK) -/*! @} */ - -/* The count of USB_ANALOG_MISC_SET */ -#define USB_ANALOG_MISC_SET_COUNT (2U) - -/*! @name MISC_CLR - USB Misc Register */ -/*! @{ */ - -#define USB_ANALOG_MISC_CLR_HS_USE_EXTERNAL_R_MASK (0x1U) -#define USB_ANALOG_MISC_CLR_HS_USE_EXTERNAL_R_SHIFT (0U) -#define USB_ANALOG_MISC_CLR_HS_USE_EXTERNAL_R(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_CLR_HS_USE_EXTERNAL_R_SHIFT)) & USB_ANALOG_MISC_CLR_HS_USE_EXTERNAL_R_MASK) - -#define USB_ANALOG_MISC_CLR_EN_DEGLITCH_MASK (0x2U) -#define USB_ANALOG_MISC_CLR_EN_DEGLITCH_SHIFT (1U) -#define USB_ANALOG_MISC_CLR_EN_DEGLITCH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_CLR_EN_DEGLITCH_SHIFT)) & USB_ANALOG_MISC_CLR_EN_DEGLITCH_MASK) - -#define USB_ANALOG_MISC_CLR_EN_CLK_UTMI_MASK (0x40000000U) -#define USB_ANALOG_MISC_CLR_EN_CLK_UTMI_SHIFT (30U) -#define USB_ANALOG_MISC_CLR_EN_CLK_UTMI(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_CLR_EN_CLK_UTMI_SHIFT)) & USB_ANALOG_MISC_CLR_EN_CLK_UTMI_MASK) -/*! @} */ - -/* The count of USB_ANALOG_MISC_CLR */ -#define USB_ANALOG_MISC_CLR_COUNT (2U) - -/*! @name MISC_TOG - USB Misc Register */ -/*! @{ */ - -#define USB_ANALOG_MISC_TOG_HS_USE_EXTERNAL_R_MASK (0x1U) -#define USB_ANALOG_MISC_TOG_HS_USE_EXTERNAL_R_SHIFT (0U) -#define USB_ANALOG_MISC_TOG_HS_USE_EXTERNAL_R(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_TOG_HS_USE_EXTERNAL_R_SHIFT)) & USB_ANALOG_MISC_TOG_HS_USE_EXTERNAL_R_MASK) - -#define USB_ANALOG_MISC_TOG_EN_DEGLITCH_MASK (0x2U) -#define USB_ANALOG_MISC_TOG_EN_DEGLITCH_SHIFT (1U) -#define USB_ANALOG_MISC_TOG_EN_DEGLITCH(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_TOG_EN_DEGLITCH_SHIFT)) & USB_ANALOG_MISC_TOG_EN_DEGLITCH_MASK) - -#define USB_ANALOG_MISC_TOG_EN_CLK_UTMI_MASK (0x40000000U) -#define USB_ANALOG_MISC_TOG_EN_CLK_UTMI_SHIFT (30U) -#define USB_ANALOG_MISC_TOG_EN_CLK_UTMI(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_MISC_TOG_EN_CLK_UTMI_SHIFT)) & USB_ANALOG_MISC_TOG_EN_CLK_UTMI_MASK) -/*! @} */ - -/* The count of USB_ANALOG_MISC_TOG */ -#define USB_ANALOG_MISC_TOG_COUNT (2U) - -/*! @name DIGPROG - Chip Silicon Version */ -/*! @{ */ - -#define USB_ANALOG_DIGPROG_SILICON_REVISION_MASK (0xFFFFFFFFU) -#define USB_ANALOG_DIGPROG_SILICON_REVISION_SHIFT (0U) -/*! SILICON_REVISION - * 0b00000000011010100000000000000001..Silicon revision 1.1 - */ -#define USB_ANALOG_DIGPROG_SILICON_REVISION(x) (((uint32_t)(((uint32_t)(x)) << USB_ANALOG_DIGPROG_SILICON_REVISION_SHIFT)) & USB_ANALOG_DIGPROG_SILICON_REVISION_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group USB_ANALOG_Register_Masks */ - - -/* USB_ANALOG - Peripheral instance base addresses */ -/** Peripheral USB_ANALOG base address */ -#define USB_ANALOG_BASE (0x400D8000u) -/** Peripheral USB_ANALOG base pointer */ -#define USB_ANALOG ((USB_ANALOG_Type *)USB_ANALOG_BASE) -/** Array initializer of USB_ANALOG peripheral base addresses */ -#define USB_ANALOG_BASE_ADDRS { USB_ANALOG_BASE } -/** Array initializer of USB_ANALOG peripheral base pointers */ -#define USB_ANALOG_BASE_PTRS { USB_ANALOG } - -/*! - * @} - */ /* end of group USB_ANALOG_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- USDHC Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USDHC_Peripheral_Access_Layer USDHC Peripheral Access Layer - * @{ - */ - -/** USDHC - Register Layout Typedef */ -typedef struct { - __IO uint32_t DS_ADDR; /**< DMA System Address, offset: 0x0 */ - __IO uint32_t BLK_ATT; /**< Block Attributes, offset: 0x4 */ - __IO uint32_t CMD_ARG; /**< Command Argument, offset: 0x8 */ - __IO uint32_t CMD_XFR_TYP; /**< Command Transfer Type, offset: 0xC */ - __I uint32_t CMD_RSP0; /**< Command Response0, offset: 0x10 */ - __I uint32_t CMD_RSP1; /**< Command Response1, offset: 0x14 */ - __I uint32_t CMD_RSP2; /**< Command Response2, offset: 0x18 */ - __I uint32_t CMD_RSP3; /**< Command Response3, offset: 0x1C */ - __IO uint32_t DATA_BUFF_ACC_PORT; /**< Data Buffer Access Port, offset: 0x20 */ - __I uint32_t PRES_STATE; /**< Present State, offset: 0x24 */ - __IO uint32_t PROT_CTRL; /**< Protocol Control, offset: 0x28 */ - __IO uint32_t SYS_CTRL; /**< System Control, offset: 0x2C */ - __IO uint32_t INT_STATUS; /**< Interrupt Status, offset: 0x30 */ - __IO uint32_t INT_STATUS_EN; /**< Interrupt Status Enable, offset: 0x34 */ - __IO uint32_t INT_SIGNAL_EN; /**< Interrupt Signal Enable, offset: 0x38 */ - __IO uint32_t AUTOCMD12_ERR_STATUS; /**< Auto CMD12 Error Status, offset: 0x3C */ - __IO uint32_t HOST_CTRL_CAP; /**< Host Controller Capabilities, offset: 0x40 */ - __IO uint32_t WTMK_LVL; /**< Watermark Level, offset: 0x44 */ - __IO uint32_t MIX_CTRL; /**< Mixer Control, offset: 0x48 */ - uint8_t RESERVED_0[4]; - __O uint32_t FORCE_EVENT; /**< Force Event, offset: 0x50 */ - __I uint32_t ADMA_ERR_STATUS; /**< ADMA Error Status Register, offset: 0x54 */ - __IO uint32_t ADMA_SYS_ADDR; /**< ADMA System Address, offset: 0x58 */ - uint8_t RESERVED_1[4]; - __IO uint32_t DLL_CTRL; /**< DLL (Delay Line) Control, offset: 0x60 */ - __I uint32_t DLL_STATUS; /**< DLL Status, offset: 0x64 */ - __IO uint32_t CLK_TUNE_CTRL_STATUS; /**< CLK Tuning Control and Status, offset: 0x68 */ - uint8_t RESERVED_2[84]; - __IO uint32_t VEND_SPEC; /**< Vendor Specific Register, offset: 0xC0 */ - __IO uint32_t MMC_BOOT; /**< MMC Boot Register, offset: 0xC4 */ - __IO uint32_t VEND_SPEC2; /**< Vendor Specific 2 Register, offset: 0xC8 */ - __IO uint32_t TUNING_CTRL; /**< Tuning Control Register, offset: 0xCC */ -} USDHC_Type; - -/* ---------------------------------------------------------------------------- - -- USDHC Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup USDHC_Register_Masks USDHC Register Masks - * @{ - */ - -/*! @name DS_ADDR - DMA System Address */ -/*! @{ */ - -#define USDHC_DS_ADDR_DS_ADDR_MASK (0xFFFFFFFFU) -#define USDHC_DS_ADDR_DS_ADDR_SHIFT (0U) -/*! DS_ADDR - DS_ADDR - */ -#define USDHC_DS_ADDR_DS_ADDR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DS_ADDR_DS_ADDR_SHIFT)) & USDHC_DS_ADDR_DS_ADDR_MASK) -/*! @} */ - -/*! @name BLK_ATT - Block Attributes */ -/*! @{ */ - -#define USDHC_BLK_ATT_BLKSIZE_MASK (0x1FFFU) -#define USDHC_BLK_ATT_BLKSIZE_SHIFT (0U) -/*! BLKSIZE - Block Size - * 0b1000000000000..4096 Bytes - * 0b0100000000000..2048 Bytes - * 0b0001000000000..512 Bytes - * 0b0000111111111..511 Bytes - * 0b0000000000100..4 Bytes - * 0b0000000000011..3 Bytes - * 0b0000000000010..2 Bytes - * 0b0000000000001..1 Byte - * 0b0000000000000..No data transfer - */ -#define USDHC_BLK_ATT_BLKSIZE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_BLK_ATT_BLKSIZE_SHIFT)) & USDHC_BLK_ATT_BLKSIZE_MASK) - -#define USDHC_BLK_ATT_BLKCNT_MASK (0xFFFF0000U) -#define USDHC_BLK_ATT_BLKCNT_SHIFT (16U) -/*! BLKCNT - Block Count - * 0b1111111111111111..65535 blocks - * 0b0000000000000010..2 blocks - * 0b0000000000000001..1 block - * 0b0000000000000000..Stop Count - */ -#define USDHC_BLK_ATT_BLKCNT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_BLK_ATT_BLKCNT_SHIFT)) & USDHC_BLK_ATT_BLKCNT_MASK) -/*! @} */ - -/*! @name CMD_ARG - Command Argument */ -/*! @{ */ - -#define USDHC_CMD_ARG_CMDARG_MASK (0xFFFFFFFFU) -#define USDHC_CMD_ARG_CMDARG_SHIFT (0U) -/*! CMDARG - Command Argument - */ -#define USDHC_CMD_ARG_CMDARG(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_ARG_CMDARG_SHIFT)) & USDHC_CMD_ARG_CMDARG_MASK) -/*! @} */ - -/*! @name CMD_XFR_TYP - Command Transfer Type */ -/*! @{ */ - -#define USDHC_CMD_XFR_TYP_RSPTYP_MASK (0x30000U) -#define USDHC_CMD_XFR_TYP_RSPTYP_SHIFT (16U) -/*! RSPTYP - Response Type Select - * 0b00..No Response - * 0b01..Response Length 136 - * 0b10..Response Length 48 - * 0b11..Response Length 48, check Busy after response - */ -#define USDHC_CMD_XFR_TYP_RSPTYP(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_RSPTYP_SHIFT)) & USDHC_CMD_XFR_TYP_RSPTYP_MASK) - -#define USDHC_CMD_XFR_TYP_CCCEN_MASK (0x80000U) -#define USDHC_CMD_XFR_TYP_CCCEN_SHIFT (19U) -/*! CCCEN - Command CRC Check Enable - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_CMD_XFR_TYP_CCCEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_CCCEN_SHIFT)) & USDHC_CMD_XFR_TYP_CCCEN_MASK) - -#define USDHC_CMD_XFR_TYP_CICEN_MASK (0x100000U) -#define USDHC_CMD_XFR_TYP_CICEN_SHIFT (20U) -/*! CICEN - Command Index Check Enable - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_CMD_XFR_TYP_CICEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_CICEN_SHIFT)) & USDHC_CMD_XFR_TYP_CICEN_MASK) - -#define USDHC_CMD_XFR_TYP_DPSEL_MASK (0x200000U) -#define USDHC_CMD_XFR_TYP_DPSEL_SHIFT (21U) -/*! DPSEL - Data Present Select - * 0b1..Data Present - * 0b0..No Data Present - */ -#define USDHC_CMD_XFR_TYP_DPSEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_DPSEL_SHIFT)) & USDHC_CMD_XFR_TYP_DPSEL_MASK) - -#define USDHC_CMD_XFR_TYP_CMDTYP_MASK (0xC00000U) -#define USDHC_CMD_XFR_TYP_CMDTYP_SHIFT (22U) -/*! CMDTYP - Command Type - * 0b11..Abort CMD12, CMD52 for writing I/O Abort in CCCR - * 0b10..Resume CMD52 for writing Function Select in CCCR - * 0b01..Suspend CMD52 for writing Bus Suspend in CCCR - * 0b00..Normal Other commands - */ -#define USDHC_CMD_XFR_TYP_CMDTYP(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_CMDTYP_SHIFT)) & USDHC_CMD_XFR_TYP_CMDTYP_MASK) - -#define USDHC_CMD_XFR_TYP_CMDINX_MASK (0x3F000000U) -#define USDHC_CMD_XFR_TYP_CMDINX_SHIFT (24U) -/*! CMDINX - Command Index - */ -#define USDHC_CMD_XFR_TYP_CMDINX(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_XFR_TYP_CMDINX_SHIFT)) & USDHC_CMD_XFR_TYP_CMDINX_MASK) -/*! @} */ - -/*! @name CMD_RSP0 - Command Response0 */ -/*! @{ */ - -#define USDHC_CMD_RSP0_CMDRSP0_MASK (0xFFFFFFFFU) -#define USDHC_CMD_RSP0_CMDRSP0_SHIFT (0U) -/*! CMDRSP0 - Command Response 0 - */ -#define USDHC_CMD_RSP0_CMDRSP0(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_RSP0_CMDRSP0_SHIFT)) & USDHC_CMD_RSP0_CMDRSP0_MASK) -/*! @} */ - -/*! @name CMD_RSP1 - Command Response1 */ -/*! @{ */ - -#define USDHC_CMD_RSP1_CMDRSP1_MASK (0xFFFFFFFFU) -#define USDHC_CMD_RSP1_CMDRSP1_SHIFT (0U) -/*! CMDRSP1 - Command Response 1 - */ -#define USDHC_CMD_RSP1_CMDRSP1(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_RSP1_CMDRSP1_SHIFT)) & USDHC_CMD_RSP1_CMDRSP1_MASK) -/*! @} */ - -/*! @name CMD_RSP2 - Command Response2 */ -/*! @{ */ - -#define USDHC_CMD_RSP2_CMDRSP2_MASK (0xFFFFFFFFU) -#define USDHC_CMD_RSP2_CMDRSP2_SHIFT (0U) -/*! CMDRSP2 - Command Response 2 - */ -#define USDHC_CMD_RSP2_CMDRSP2(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_RSP2_CMDRSP2_SHIFT)) & USDHC_CMD_RSP2_CMDRSP2_MASK) -/*! @} */ - -/*! @name CMD_RSP3 - Command Response3 */ -/*! @{ */ - -#define USDHC_CMD_RSP3_CMDRSP3_MASK (0xFFFFFFFFU) -#define USDHC_CMD_RSP3_CMDRSP3_SHIFT (0U) -/*! CMDRSP3 - Command Response 3 - */ -#define USDHC_CMD_RSP3_CMDRSP3(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CMD_RSP3_CMDRSP3_SHIFT)) & USDHC_CMD_RSP3_CMDRSP3_MASK) -/*! @} */ - -/*! @name DATA_BUFF_ACC_PORT - Data Buffer Access Port */ -/*! @{ */ - -#define USDHC_DATA_BUFF_ACC_PORT_DATCONT_MASK (0xFFFFFFFFU) -#define USDHC_DATA_BUFF_ACC_PORT_DATCONT_SHIFT (0U) -/*! DATCONT - Data Content - */ -#define USDHC_DATA_BUFF_ACC_PORT_DATCONT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DATA_BUFF_ACC_PORT_DATCONT_SHIFT)) & USDHC_DATA_BUFF_ACC_PORT_DATCONT_MASK) -/*! @} */ - -/*! @name PRES_STATE - Present State */ -/*! @{ */ - -#define USDHC_PRES_STATE_CIHB_MASK (0x1U) -#define USDHC_PRES_STATE_CIHB_SHIFT (0U) -/*! CIHB - Command Inhibit (CMD) - * 0b1..Cannot issue command - * 0b0..Can issue command using only CMD line - */ -#define USDHC_PRES_STATE_CIHB(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_CIHB_SHIFT)) & USDHC_PRES_STATE_CIHB_MASK) - -#define USDHC_PRES_STATE_CDIHB_MASK (0x2U) -#define USDHC_PRES_STATE_CDIHB_SHIFT (1U) -/*! CDIHB - Command Inhibit (DATA) - * 0b1..Cannot issue command which uses the DATA line - * 0b0..Can issue command which uses the DATA line - */ -#define USDHC_PRES_STATE_CDIHB(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_CDIHB_SHIFT)) & USDHC_PRES_STATE_CDIHB_MASK) - -#define USDHC_PRES_STATE_DLA_MASK (0x4U) -#define USDHC_PRES_STATE_DLA_SHIFT (2U) -/*! DLA - Data Line Active - * 0b1..DATA Line Active - * 0b0..DATA Line Inactive - */ -#define USDHC_PRES_STATE_DLA(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_DLA_SHIFT)) & USDHC_PRES_STATE_DLA_MASK) - -#define USDHC_PRES_STATE_SDSTB_MASK (0x8U) -#define USDHC_PRES_STATE_SDSTB_SHIFT (3U) -/*! SDSTB - SD Clock Stable - * 0b1..Clock is stable. - * 0b0..Clock is changing frequency and not stable. - */ -#define USDHC_PRES_STATE_SDSTB(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_SDSTB_SHIFT)) & USDHC_PRES_STATE_SDSTB_MASK) - -#define USDHC_PRES_STATE_IPGOFF_MASK (0x10U) -#define USDHC_PRES_STATE_IPGOFF_SHIFT (4U) -/*! IPGOFF - IPG_CLK Gated Off Internally - * 0b1..IPG_CLK is gated off. - * 0b0..IPG_CLK is active. - */ -#define USDHC_PRES_STATE_IPGOFF(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_IPGOFF_SHIFT)) & USDHC_PRES_STATE_IPGOFF_MASK) - -#define USDHC_PRES_STATE_HCKOFF_MASK (0x20U) -#define USDHC_PRES_STATE_HCKOFF_SHIFT (5U) -/*! HCKOFF - HCLK Gated Off Internally - * 0b1..HCLK is gated off. - * 0b0..HCLK is active. - */ -#define USDHC_PRES_STATE_HCKOFF(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_HCKOFF_SHIFT)) & USDHC_PRES_STATE_HCKOFF_MASK) - -#define USDHC_PRES_STATE_PEROFF_MASK (0x40U) -#define USDHC_PRES_STATE_PEROFF_SHIFT (6U) -/*! PEROFF - IPG_PERCLK Gated Off Internally - * 0b1..IPG_PERCLK is gated off. - * 0b0..IPG_PERCLK is active. - */ -#define USDHC_PRES_STATE_PEROFF(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_PEROFF_SHIFT)) & USDHC_PRES_STATE_PEROFF_MASK) - -#define USDHC_PRES_STATE_SDOFF_MASK (0x80U) -#define USDHC_PRES_STATE_SDOFF_SHIFT (7U) -/*! SDOFF - SD Clock Gated Off Internally - * 0b1..SD Clock is gated off. - * 0b0..SD Clock is active. - */ -#define USDHC_PRES_STATE_SDOFF(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_SDOFF_SHIFT)) & USDHC_PRES_STATE_SDOFF_MASK) - -#define USDHC_PRES_STATE_WTA_MASK (0x100U) -#define USDHC_PRES_STATE_WTA_SHIFT (8U) -/*! WTA - Write Transfer Active - * 0b1..Transferring data - * 0b0..No valid data - */ -#define USDHC_PRES_STATE_WTA(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_WTA_SHIFT)) & USDHC_PRES_STATE_WTA_MASK) - -#define USDHC_PRES_STATE_RTA_MASK (0x200U) -#define USDHC_PRES_STATE_RTA_SHIFT (9U) -/*! RTA - Read Transfer Active - * 0b1..Transferring data - * 0b0..No valid data - */ -#define USDHC_PRES_STATE_RTA(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_RTA_SHIFT)) & USDHC_PRES_STATE_RTA_MASK) - -#define USDHC_PRES_STATE_BWEN_MASK (0x400U) -#define USDHC_PRES_STATE_BWEN_SHIFT (10U) -/*! BWEN - Buffer Write Enable - * 0b1..Write enable - * 0b0..Write disable - */ -#define USDHC_PRES_STATE_BWEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_BWEN_SHIFT)) & USDHC_PRES_STATE_BWEN_MASK) - -#define USDHC_PRES_STATE_BREN_MASK (0x800U) -#define USDHC_PRES_STATE_BREN_SHIFT (11U) -/*! BREN - Buffer Read Enable - * 0b1..Read enable - * 0b0..Read disable - */ -#define USDHC_PRES_STATE_BREN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_BREN_SHIFT)) & USDHC_PRES_STATE_BREN_MASK) - -#define USDHC_PRES_STATE_RTR_MASK (0x1000U) -#define USDHC_PRES_STATE_RTR_SHIFT (12U) -/*! RTR - Re-Tuning Request (only for SD3.0 SDR104 mode and EMMC HS200 mode) - * 0b1..Sampling clock needs re-tuning - * 0b0..Fixed or well tuned sampling clock - */ -#define USDHC_PRES_STATE_RTR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_RTR_SHIFT)) & USDHC_PRES_STATE_RTR_MASK) - -#define USDHC_PRES_STATE_TSCD_MASK (0x8000U) -#define USDHC_PRES_STATE_TSCD_SHIFT (15U) -/*! TSCD - Tape Select Change Done - * 0b1..Delay cell select change is finished. - * 0b0..Delay cell select change is not finished. - */ -#define USDHC_PRES_STATE_TSCD(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_TSCD_SHIFT)) & USDHC_PRES_STATE_TSCD_MASK) - -#define USDHC_PRES_STATE_CINST_MASK (0x10000U) -#define USDHC_PRES_STATE_CINST_SHIFT (16U) -/*! CINST - Card Inserted - * 0b1..Card Inserted - * 0b0..Power on Reset or No Card - */ -#define USDHC_PRES_STATE_CINST(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_CINST_SHIFT)) & USDHC_PRES_STATE_CINST_MASK) - -#define USDHC_PRES_STATE_CDPL_MASK (0x40000U) -#define USDHC_PRES_STATE_CDPL_SHIFT (18U) -/*! CDPL - Card Detect Pin Level - * 0b1..Card present (CD_B = 0) - * 0b0..No card present (CD_B = 1) - */ -#define USDHC_PRES_STATE_CDPL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_CDPL_SHIFT)) & USDHC_PRES_STATE_CDPL_MASK) - -#define USDHC_PRES_STATE_WPSPL_MASK (0x80000U) -#define USDHC_PRES_STATE_WPSPL_SHIFT (19U) -/*! WPSPL - Write Protect Switch Pin Level - * 0b1..Write enabled (WP = 0) - * 0b0..Write protected (WP = 1) - */ -#define USDHC_PRES_STATE_WPSPL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_WPSPL_SHIFT)) & USDHC_PRES_STATE_WPSPL_MASK) - -#define USDHC_PRES_STATE_CLSL_MASK (0x800000U) -#define USDHC_PRES_STATE_CLSL_SHIFT (23U) -/*! CLSL - CMD Line Signal Level - */ -#define USDHC_PRES_STATE_CLSL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_CLSL_SHIFT)) & USDHC_PRES_STATE_CLSL_MASK) - -#define USDHC_PRES_STATE_DLSL_MASK (0xFF000000U) -#define USDHC_PRES_STATE_DLSL_SHIFT (24U) -/*! DLSL - DATA[7:0] Line Signal Level - * 0b00000111..Data 7 line signal level - * 0b00000110..Data 6 line signal level - * 0b00000101..Data 5 line signal level - * 0b00000100..Data 4 line signal level - * 0b00000011..Data 3 line signal level - * 0b00000010..Data 2 line signal level - * 0b00000001..Data 1 line signal level - * 0b00000000..Data 0 line signal level - */ -#define USDHC_PRES_STATE_DLSL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PRES_STATE_DLSL_SHIFT)) & USDHC_PRES_STATE_DLSL_MASK) -/*! @} */ - -/*! @name PROT_CTRL - Protocol Control */ -/*! @{ */ - -#define USDHC_PROT_CTRL_LCTL_MASK (0x1U) -#define USDHC_PROT_CTRL_LCTL_SHIFT (0U) -/*! LCTL - LED Control - * 0b1..LED on - * 0b0..LED off - */ -#define USDHC_PROT_CTRL_LCTL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_LCTL_SHIFT)) & USDHC_PROT_CTRL_LCTL_MASK) - -#define USDHC_PROT_CTRL_DTW_MASK (0x6U) -#define USDHC_PROT_CTRL_DTW_SHIFT (1U) -/*! DTW - Data Transfer Width - * 0b10..8-bit mode - * 0b01..4-bit mode - * 0b00..1-bit mode - * 0b11..Reserved - */ -#define USDHC_PROT_CTRL_DTW(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_DTW_SHIFT)) & USDHC_PROT_CTRL_DTW_MASK) - -#define USDHC_PROT_CTRL_D3CD_MASK (0x8U) -#define USDHC_PROT_CTRL_D3CD_SHIFT (3U) -/*! D3CD - DATA3 as Card Detection Pin - * 0b1..DATA3 as Card Detection Pin - * 0b0..DATA3 does not monitor Card Insertion - */ -#define USDHC_PROT_CTRL_D3CD(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_D3CD_SHIFT)) & USDHC_PROT_CTRL_D3CD_MASK) - -#define USDHC_PROT_CTRL_EMODE_MASK (0x30U) -#define USDHC_PROT_CTRL_EMODE_SHIFT (4U) -/*! EMODE - Endian Mode - * 0b00..Big Endian Mode - * 0b01..Half Word Big Endian Mode - * 0b10..Little Endian Mode - * 0b11..Reserved - */ -#define USDHC_PROT_CTRL_EMODE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_EMODE_SHIFT)) & USDHC_PROT_CTRL_EMODE_MASK) - -#define USDHC_PROT_CTRL_CDTL_MASK (0x40U) -#define USDHC_PROT_CTRL_CDTL_SHIFT (6U) -/*! CDTL - Card Detect Test Level - * 0b1..Card Detect Test Level is 1, card inserted - * 0b0..Card Detect Test Level is 0, no card inserted - */ -#define USDHC_PROT_CTRL_CDTL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_CDTL_SHIFT)) & USDHC_PROT_CTRL_CDTL_MASK) - -#define USDHC_PROT_CTRL_CDSS_MASK (0x80U) -#define USDHC_PROT_CTRL_CDSS_SHIFT (7U) -/*! CDSS - Card Detect Signal Selection - * 0b1..Card Detection Test Level is selected (for test purpose). - * 0b0..Card Detection Level is selected (for normal purpose). - */ -#define USDHC_PROT_CTRL_CDSS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_CDSS_SHIFT)) & USDHC_PROT_CTRL_CDSS_MASK) - -#define USDHC_PROT_CTRL_DMASEL_MASK (0x300U) -#define USDHC_PROT_CTRL_DMASEL_SHIFT (8U) -/*! DMASEL - DMA Select - * 0b00..No DMA or Simple DMA is selected - * 0b01..ADMA1 is selected - * 0b10..ADMA2 is selected - * 0b11..reserved - */ -#define USDHC_PROT_CTRL_DMASEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_DMASEL_SHIFT)) & USDHC_PROT_CTRL_DMASEL_MASK) - -#define USDHC_PROT_CTRL_SABGREQ_MASK (0x10000U) -#define USDHC_PROT_CTRL_SABGREQ_SHIFT (16U) -/*! SABGREQ - Stop At Block Gap Request - * 0b1..Stop - * 0b0..Transfer - */ -#define USDHC_PROT_CTRL_SABGREQ(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_SABGREQ_SHIFT)) & USDHC_PROT_CTRL_SABGREQ_MASK) - -#define USDHC_PROT_CTRL_CREQ_MASK (0x20000U) -#define USDHC_PROT_CTRL_CREQ_SHIFT (17U) -/*! CREQ - Continue Request - * 0b1..Restart - * 0b0..No effect - */ -#define USDHC_PROT_CTRL_CREQ(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_CREQ_SHIFT)) & USDHC_PROT_CTRL_CREQ_MASK) - -#define USDHC_PROT_CTRL_RWCTL_MASK (0x40000U) -#define USDHC_PROT_CTRL_RWCTL_SHIFT (18U) -/*! RWCTL - Read Wait Control - * 0b1..Enable Read Wait Control, and assert Read Wait without stopping SD Clock at block gap when SABGREQ bit is set - * 0b0..Disable Read Wait Control, and stop SD Clock at block gap when SABGREQ bit is set - */ -#define USDHC_PROT_CTRL_RWCTL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_RWCTL_SHIFT)) & USDHC_PROT_CTRL_RWCTL_MASK) - -#define USDHC_PROT_CTRL_IABG_MASK (0x80000U) -#define USDHC_PROT_CTRL_IABG_SHIFT (19U) -/*! IABG - Interrupt At Block Gap - * 0b1..Enabled - * 0b0..Disabled - */ -#define USDHC_PROT_CTRL_IABG(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_IABG_SHIFT)) & USDHC_PROT_CTRL_IABG_MASK) - -#define USDHC_PROT_CTRL_RD_DONE_NO_8CLK_MASK (0x100000U) -#define USDHC_PROT_CTRL_RD_DONE_NO_8CLK_SHIFT (20U) -/*! RD_DONE_NO_8CLK - RD_DONE_NO_8CLK - */ -#define USDHC_PROT_CTRL_RD_DONE_NO_8CLK(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_RD_DONE_NO_8CLK_SHIFT)) & USDHC_PROT_CTRL_RD_DONE_NO_8CLK_MASK) - -#define USDHC_PROT_CTRL_WECINT_MASK (0x1000000U) -#define USDHC_PROT_CTRL_WECINT_SHIFT (24U) -/*! WECINT - Wakeup Event Enable On Card Interrupt - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_PROT_CTRL_WECINT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_WECINT_SHIFT)) & USDHC_PROT_CTRL_WECINT_MASK) - -#define USDHC_PROT_CTRL_WECINS_MASK (0x2000000U) -#define USDHC_PROT_CTRL_WECINS_SHIFT (25U) -/*! WECINS - Wakeup Event Enable On SD Card Insertion - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_PROT_CTRL_WECINS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_WECINS_SHIFT)) & USDHC_PROT_CTRL_WECINS_MASK) - -#define USDHC_PROT_CTRL_WECRM_MASK (0x4000000U) -#define USDHC_PROT_CTRL_WECRM_SHIFT (26U) -/*! WECRM - Wakeup Event Enable On SD Card Removal - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_PROT_CTRL_WECRM(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_WECRM_SHIFT)) & USDHC_PROT_CTRL_WECRM_MASK) - -#define USDHC_PROT_CTRL_BURST_LEN_EN_MASK (0x38000000U) -#define USDHC_PROT_CTRL_BURST_LEN_EN_SHIFT (27U) -/*! BURST_LEN_EN - BURST length enable for INCR, INCR4 / INCR8 / INCR16, INCR4-WRAP / INCR8-WRAP / INCR16-WRAP - * 0bxx1..Burst length is enabled for INCR - * 0bx1x..Burst length is enabled for INCR4 / INCR8 / INCR16 - * 0b1xx..Burst length is enabled for INCR4-WRAP / INCR8-WRAP / INCR16-WRAP - */ -#define USDHC_PROT_CTRL_BURST_LEN_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_BURST_LEN_EN_SHIFT)) & USDHC_PROT_CTRL_BURST_LEN_EN_MASK) - -#define USDHC_PROT_CTRL_NON_EXACT_BLK_RD_MASK (0x40000000U) -#define USDHC_PROT_CTRL_NON_EXACT_BLK_RD_SHIFT (30U) -/*! NON_EXACT_BLK_RD - NON_EXACT_BLK_RD - * 0b1..The block read is non-exact block read. Host driver needs to issue abort command to terminate this multi-block read. - * 0b0..The block read is exact block read. Host driver doesn't need to issue abort command to terminate this multi-block read. - */ -#define USDHC_PROT_CTRL_NON_EXACT_BLK_RD(x) (((uint32_t)(((uint32_t)(x)) << USDHC_PROT_CTRL_NON_EXACT_BLK_RD_SHIFT)) & USDHC_PROT_CTRL_NON_EXACT_BLK_RD_MASK) -/*! @} */ - -/*! @name SYS_CTRL - System Control */ -/*! @{ */ - -#define USDHC_SYS_CTRL_DVS_MASK (0xF0U) -#define USDHC_SYS_CTRL_DVS_SHIFT (4U) -/*! DVS - Divisor - * 0b0000..Divide-by-1 - * 0b0001..Divide-by-2 - * 0b1110..Divide-by-15 - * 0b1111..Divide-by-16 - */ -#define USDHC_SYS_CTRL_DVS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_DVS_SHIFT)) & USDHC_SYS_CTRL_DVS_MASK) - -#define USDHC_SYS_CTRL_SDCLKFS_MASK (0xFF00U) -#define USDHC_SYS_CTRL_SDCLKFS_SHIFT (8U) -/*! SDCLKFS - SDCLK Frequency Select - */ -#define USDHC_SYS_CTRL_SDCLKFS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_SDCLKFS_SHIFT)) & USDHC_SYS_CTRL_SDCLKFS_MASK) - -#define USDHC_SYS_CTRL_DTOCV_MASK (0xF0000U) -#define USDHC_SYS_CTRL_DTOCV_SHIFT (16U) -/*! DTOCV - Data Timeout Counter Value - * 0b1111..SDCLK x 2 29 - * 0b1110..SDCLK x 2 28 - * 0b1101..SDCLK x 2 27 - * 0b0001..SDCLK x 2 15 - * 0b0000..SDCLK x 2 14 - */ -#define USDHC_SYS_CTRL_DTOCV(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_DTOCV_SHIFT)) & USDHC_SYS_CTRL_DTOCV_MASK) - -#define USDHC_SYS_CTRL_IPP_RST_N_MASK (0x800000U) -#define USDHC_SYS_CTRL_IPP_RST_N_SHIFT (23U) -/*! IPP_RST_N - IPP_RST_N - */ -#define USDHC_SYS_CTRL_IPP_RST_N(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_IPP_RST_N_SHIFT)) & USDHC_SYS_CTRL_IPP_RST_N_MASK) - -#define USDHC_SYS_CTRL_RSTA_MASK (0x1000000U) -#define USDHC_SYS_CTRL_RSTA_SHIFT (24U) -/*! RSTA - Software Reset For ALL - * 0b1..Reset - * 0b0..No Reset - */ -#define USDHC_SYS_CTRL_RSTA(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_RSTA_SHIFT)) & USDHC_SYS_CTRL_RSTA_MASK) - -#define USDHC_SYS_CTRL_RSTC_MASK (0x2000000U) -#define USDHC_SYS_CTRL_RSTC_SHIFT (25U) -/*! RSTC - Software Reset For CMD Line - * 0b1..Reset - * 0b0..No Reset - */ -#define USDHC_SYS_CTRL_RSTC(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_RSTC_SHIFT)) & USDHC_SYS_CTRL_RSTC_MASK) - -#define USDHC_SYS_CTRL_RSTD_MASK (0x4000000U) -#define USDHC_SYS_CTRL_RSTD_SHIFT (26U) -/*! RSTD - Software Reset For DATA Line - * 0b1..Reset - * 0b0..No Reset - */ -#define USDHC_SYS_CTRL_RSTD(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_RSTD_SHIFT)) & USDHC_SYS_CTRL_RSTD_MASK) - -#define USDHC_SYS_CTRL_INITA_MASK (0x8000000U) -#define USDHC_SYS_CTRL_INITA_SHIFT (27U) -/*! INITA - Initialization Active - */ -#define USDHC_SYS_CTRL_INITA(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_INITA_SHIFT)) & USDHC_SYS_CTRL_INITA_MASK) - -#define USDHC_SYS_CTRL_RSTT_MASK (0x10000000U) -#define USDHC_SYS_CTRL_RSTT_SHIFT (28U) -/*! RSTT - Reset Tuning - */ -#define USDHC_SYS_CTRL_RSTT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_SYS_CTRL_RSTT_SHIFT)) & USDHC_SYS_CTRL_RSTT_MASK) -/*! @} */ - -/*! @name INT_STATUS - Interrupt Status */ -/*! @{ */ - -#define USDHC_INT_STATUS_CC_MASK (0x1U) -#define USDHC_INT_STATUS_CC_SHIFT (0U) -/*! CC - Command Complete - * 0b1..Command complete - * 0b0..Command not complete - */ -#define USDHC_INT_STATUS_CC(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CC_SHIFT)) & USDHC_INT_STATUS_CC_MASK) - -#define USDHC_INT_STATUS_TC_MASK (0x2U) -#define USDHC_INT_STATUS_TC_SHIFT (1U) -/*! TC - Transfer Complete - * 0b1..Transfer complete - * 0b0..Transfer not complete - */ -#define USDHC_INT_STATUS_TC(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_TC_SHIFT)) & USDHC_INT_STATUS_TC_MASK) - -#define USDHC_INT_STATUS_BGE_MASK (0x4U) -#define USDHC_INT_STATUS_BGE_SHIFT (2U) -/*! BGE - Block Gap Event - * 0b1..Transaction stopped at block gap - * 0b0..No block gap event - */ -#define USDHC_INT_STATUS_BGE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_BGE_SHIFT)) & USDHC_INT_STATUS_BGE_MASK) - -#define USDHC_INT_STATUS_DINT_MASK (0x8U) -#define USDHC_INT_STATUS_DINT_SHIFT (3U) -/*! DINT - DMA Interrupt - * 0b1..DMA Interrupt is generated - * 0b0..No DMA Interrupt - */ -#define USDHC_INT_STATUS_DINT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_DINT_SHIFT)) & USDHC_INT_STATUS_DINT_MASK) - -#define USDHC_INT_STATUS_BWR_MASK (0x10U) -#define USDHC_INT_STATUS_BWR_SHIFT (4U) -/*! BWR - Buffer Write Ready - * 0b1..Ready to write buffer: - * 0b0..Not ready to write buffer - */ -#define USDHC_INT_STATUS_BWR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_BWR_SHIFT)) & USDHC_INT_STATUS_BWR_MASK) - -#define USDHC_INT_STATUS_BRR_MASK (0x20U) -#define USDHC_INT_STATUS_BRR_SHIFT (5U) -/*! BRR - Buffer Read Ready - * 0b1..Ready to read buffer - * 0b0..Not ready to read buffer - */ -#define USDHC_INT_STATUS_BRR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_BRR_SHIFT)) & USDHC_INT_STATUS_BRR_MASK) - -#define USDHC_INT_STATUS_CINS_MASK (0x40U) -#define USDHC_INT_STATUS_CINS_SHIFT (6U) -/*! CINS - Card Insertion - * 0b1..Card inserted - * 0b0..Card state unstable or removed - */ -#define USDHC_INT_STATUS_CINS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CINS_SHIFT)) & USDHC_INT_STATUS_CINS_MASK) - -#define USDHC_INT_STATUS_CRM_MASK (0x80U) -#define USDHC_INT_STATUS_CRM_SHIFT (7U) -/*! CRM - Card Removal - * 0b1..Card removed - * 0b0..Card state unstable or inserted - */ -#define USDHC_INT_STATUS_CRM(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CRM_SHIFT)) & USDHC_INT_STATUS_CRM_MASK) - -#define USDHC_INT_STATUS_CINT_MASK (0x100U) -#define USDHC_INT_STATUS_CINT_SHIFT (8U) -/*! CINT - Card Interrupt - * 0b1..Generate Card Interrupt - * 0b0..No Card Interrupt - */ -#define USDHC_INT_STATUS_CINT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CINT_SHIFT)) & USDHC_INT_STATUS_CINT_MASK) - -#define USDHC_INT_STATUS_RTE_MASK (0x1000U) -#define USDHC_INT_STATUS_RTE_SHIFT (12U) -/*! RTE - Re-Tuning Event: (only for SD3.0 SDR104 mode and EMMC HS200 mode) - * 0b1..Re-Tuning should be performed - * 0b0..Re-Tuning is not required - */ -#define USDHC_INT_STATUS_RTE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_RTE_SHIFT)) & USDHC_INT_STATUS_RTE_MASK) - -#define USDHC_INT_STATUS_TP_MASK (0x4000U) -#define USDHC_INT_STATUS_TP_SHIFT (14U) -/*! TP - Tuning Pass:(only for SD3.0 SDR104 mode and EMMC HS200 mode) - */ -#define USDHC_INT_STATUS_TP(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_TP_SHIFT)) & USDHC_INT_STATUS_TP_MASK) - -#define USDHC_INT_STATUS_CTOE_MASK (0x10000U) -#define USDHC_INT_STATUS_CTOE_SHIFT (16U) -/*! CTOE - Command Timeout Error - * 0b1..Time out - * 0b0..No Error - */ -#define USDHC_INT_STATUS_CTOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CTOE_SHIFT)) & USDHC_INT_STATUS_CTOE_MASK) - -#define USDHC_INT_STATUS_CCE_MASK (0x20000U) -#define USDHC_INT_STATUS_CCE_SHIFT (17U) -/*! CCE - Command CRC Error - * 0b1..CRC Error Generated. - * 0b0..No Error - */ -#define USDHC_INT_STATUS_CCE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CCE_SHIFT)) & USDHC_INT_STATUS_CCE_MASK) - -#define USDHC_INT_STATUS_CEBE_MASK (0x40000U) -#define USDHC_INT_STATUS_CEBE_SHIFT (18U) -/*! CEBE - Command End Bit Error - * 0b1..End Bit Error Generated - * 0b0..No Error - */ -#define USDHC_INT_STATUS_CEBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CEBE_SHIFT)) & USDHC_INT_STATUS_CEBE_MASK) - -#define USDHC_INT_STATUS_CIE_MASK (0x80000U) -#define USDHC_INT_STATUS_CIE_SHIFT (19U) -/*! CIE - Command Index Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_INT_STATUS_CIE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_CIE_SHIFT)) & USDHC_INT_STATUS_CIE_MASK) - -#define USDHC_INT_STATUS_DTOE_MASK (0x100000U) -#define USDHC_INT_STATUS_DTOE_SHIFT (20U) -/*! DTOE - Data Timeout Error - * 0b1..Time out - * 0b0..No Error - */ -#define USDHC_INT_STATUS_DTOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_DTOE_SHIFT)) & USDHC_INT_STATUS_DTOE_MASK) - -#define USDHC_INT_STATUS_DCE_MASK (0x200000U) -#define USDHC_INT_STATUS_DCE_SHIFT (21U) -/*! DCE - Data CRC Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_INT_STATUS_DCE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_DCE_SHIFT)) & USDHC_INT_STATUS_DCE_MASK) - -#define USDHC_INT_STATUS_DEBE_MASK (0x400000U) -#define USDHC_INT_STATUS_DEBE_SHIFT (22U) -/*! DEBE - Data End Bit Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_INT_STATUS_DEBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_DEBE_SHIFT)) & USDHC_INT_STATUS_DEBE_MASK) - -#define USDHC_INT_STATUS_AC12E_MASK (0x1000000U) -#define USDHC_INT_STATUS_AC12E_SHIFT (24U) -/*! AC12E - Auto CMD12 Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_INT_STATUS_AC12E(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_AC12E_SHIFT)) & USDHC_INT_STATUS_AC12E_MASK) - -#define USDHC_INT_STATUS_TNE_MASK (0x4000000U) -#define USDHC_INT_STATUS_TNE_SHIFT (26U) -/*! TNE - Tuning Error: (only for SD3.0 SDR104 mode and EMMC HS200 mode) - */ -#define USDHC_INT_STATUS_TNE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_TNE_SHIFT)) & USDHC_INT_STATUS_TNE_MASK) - -#define USDHC_INT_STATUS_DMAE_MASK (0x10000000U) -#define USDHC_INT_STATUS_DMAE_SHIFT (28U) -/*! DMAE - DMA Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_INT_STATUS_DMAE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_DMAE_SHIFT)) & USDHC_INT_STATUS_DMAE_MASK) -/*! @} */ - -/*! @name INT_STATUS_EN - Interrupt Status Enable */ -/*! @{ */ - -#define USDHC_INT_STATUS_EN_CCSEN_MASK (0x1U) -#define USDHC_INT_STATUS_EN_CCSEN_SHIFT (0U) -/*! CCSEN - Command Complete Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CCSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CCSEN_SHIFT)) & USDHC_INT_STATUS_EN_CCSEN_MASK) - -#define USDHC_INT_STATUS_EN_TCSEN_MASK (0x2U) -#define USDHC_INT_STATUS_EN_TCSEN_SHIFT (1U) -/*! TCSEN - Transfer Complete Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_TCSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_TCSEN_SHIFT)) & USDHC_INT_STATUS_EN_TCSEN_MASK) - -#define USDHC_INT_STATUS_EN_BGESEN_MASK (0x4U) -#define USDHC_INT_STATUS_EN_BGESEN_SHIFT (2U) -/*! BGESEN - Block Gap Event Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_BGESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_BGESEN_SHIFT)) & USDHC_INT_STATUS_EN_BGESEN_MASK) - -#define USDHC_INT_STATUS_EN_DINTSEN_MASK (0x8U) -#define USDHC_INT_STATUS_EN_DINTSEN_SHIFT (3U) -/*! DINTSEN - DMA Interrupt Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_DINTSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_DINTSEN_SHIFT)) & USDHC_INT_STATUS_EN_DINTSEN_MASK) - -#define USDHC_INT_STATUS_EN_BWRSEN_MASK (0x10U) -#define USDHC_INT_STATUS_EN_BWRSEN_SHIFT (4U) -/*! BWRSEN - Buffer Write Ready Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_BWRSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_BWRSEN_SHIFT)) & USDHC_INT_STATUS_EN_BWRSEN_MASK) - -#define USDHC_INT_STATUS_EN_BRRSEN_MASK (0x20U) -#define USDHC_INT_STATUS_EN_BRRSEN_SHIFT (5U) -/*! BRRSEN - Buffer Read Ready Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_BRRSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_BRRSEN_SHIFT)) & USDHC_INT_STATUS_EN_BRRSEN_MASK) - -#define USDHC_INT_STATUS_EN_CINSSEN_MASK (0x40U) -#define USDHC_INT_STATUS_EN_CINSSEN_SHIFT (6U) -/*! CINSSEN - Card Insertion Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CINSSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CINSSEN_SHIFT)) & USDHC_INT_STATUS_EN_CINSSEN_MASK) - -#define USDHC_INT_STATUS_EN_CRMSEN_MASK (0x80U) -#define USDHC_INT_STATUS_EN_CRMSEN_SHIFT (7U) -/*! CRMSEN - Card Removal Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CRMSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CRMSEN_SHIFT)) & USDHC_INT_STATUS_EN_CRMSEN_MASK) - -#define USDHC_INT_STATUS_EN_CINTSEN_MASK (0x100U) -#define USDHC_INT_STATUS_EN_CINTSEN_SHIFT (8U) -/*! CINTSEN - Card Interrupt Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CINTSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CINTSEN_SHIFT)) & USDHC_INT_STATUS_EN_CINTSEN_MASK) - -#define USDHC_INT_STATUS_EN_RTESEN_MASK (0x1000U) -#define USDHC_INT_STATUS_EN_RTESEN_SHIFT (12U) -/*! RTESEN - Re-Tuning Event Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_RTESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_RTESEN_SHIFT)) & USDHC_INT_STATUS_EN_RTESEN_MASK) - -#define USDHC_INT_STATUS_EN_TPSEN_MASK (0x4000U) -#define USDHC_INT_STATUS_EN_TPSEN_SHIFT (14U) -/*! TPSEN - Tuning Pass Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_TPSEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_TPSEN_SHIFT)) & USDHC_INT_STATUS_EN_TPSEN_MASK) - -#define USDHC_INT_STATUS_EN_CTOESEN_MASK (0x10000U) -#define USDHC_INT_STATUS_EN_CTOESEN_SHIFT (16U) -/*! CTOESEN - Command Timeout Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CTOESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CTOESEN_SHIFT)) & USDHC_INT_STATUS_EN_CTOESEN_MASK) - -#define USDHC_INT_STATUS_EN_CCESEN_MASK (0x20000U) -#define USDHC_INT_STATUS_EN_CCESEN_SHIFT (17U) -/*! CCESEN - Command CRC Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CCESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CCESEN_SHIFT)) & USDHC_INT_STATUS_EN_CCESEN_MASK) - -#define USDHC_INT_STATUS_EN_CEBESEN_MASK (0x40000U) -#define USDHC_INT_STATUS_EN_CEBESEN_SHIFT (18U) -/*! CEBESEN - Command End Bit Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CEBESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CEBESEN_SHIFT)) & USDHC_INT_STATUS_EN_CEBESEN_MASK) - -#define USDHC_INT_STATUS_EN_CIESEN_MASK (0x80000U) -#define USDHC_INT_STATUS_EN_CIESEN_SHIFT (19U) -/*! CIESEN - Command Index Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_CIESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_CIESEN_SHIFT)) & USDHC_INT_STATUS_EN_CIESEN_MASK) - -#define USDHC_INT_STATUS_EN_DTOESEN_MASK (0x100000U) -#define USDHC_INT_STATUS_EN_DTOESEN_SHIFT (20U) -/*! DTOESEN - Data Timeout Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_DTOESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_DTOESEN_SHIFT)) & USDHC_INT_STATUS_EN_DTOESEN_MASK) - -#define USDHC_INT_STATUS_EN_DCESEN_MASK (0x200000U) -#define USDHC_INT_STATUS_EN_DCESEN_SHIFT (21U) -/*! DCESEN - Data CRC Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_DCESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_DCESEN_SHIFT)) & USDHC_INT_STATUS_EN_DCESEN_MASK) - -#define USDHC_INT_STATUS_EN_DEBESEN_MASK (0x400000U) -#define USDHC_INT_STATUS_EN_DEBESEN_SHIFT (22U) -/*! DEBESEN - Data End Bit Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_DEBESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_DEBESEN_SHIFT)) & USDHC_INT_STATUS_EN_DEBESEN_MASK) - -#define USDHC_INT_STATUS_EN_AC12ESEN_MASK (0x1000000U) -#define USDHC_INT_STATUS_EN_AC12ESEN_SHIFT (24U) -/*! AC12ESEN - Auto CMD12 Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_AC12ESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_AC12ESEN_SHIFT)) & USDHC_INT_STATUS_EN_AC12ESEN_MASK) - -#define USDHC_INT_STATUS_EN_TNESEN_MASK (0x4000000U) -#define USDHC_INT_STATUS_EN_TNESEN_SHIFT (26U) -/*! TNESEN - Tuning Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_TNESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_TNESEN_SHIFT)) & USDHC_INT_STATUS_EN_TNESEN_MASK) - -#define USDHC_INT_STATUS_EN_DMAESEN_MASK (0x10000000U) -#define USDHC_INT_STATUS_EN_DMAESEN_SHIFT (28U) -/*! DMAESEN - DMA Error Status Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_STATUS_EN_DMAESEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_STATUS_EN_DMAESEN_SHIFT)) & USDHC_INT_STATUS_EN_DMAESEN_MASK) -/*! @} */ - -/*! @name INT_SIGNAL_EN - Interrupt Signal Enable */ -/*! @{ */ - -#define USDHC_INT_SIGNAL_EN_CCIEN_MASK (0x1U) -#define USDHC_INT_SIGNAL_EN_CCIEN_SHIFT (0U) -/*! CCIEN - Command Complete Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CCIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CCIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CCIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_TCIEN_MASK (0x2U) -#define USDHC_INT_SIGNAL_EN_TCIEN_SHIFT (1U) -/*! TCIEN - Transfer Complete Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_TCIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_TCIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_TCIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_BGEIEN_MASK (0x4U) -#define USDHC_INT_SIGNAL_EN_BGEIEN_SHIFT (2U) -/*! BGEIEN - Block Gap Event Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_BGEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_BGEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_BGEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_DINTIEN_MASK (0x8U) -#define USDHC_INT_SIGNAL_EN_DINTIEN_SHIFT (3U) -/*! DINTIEN - DMA Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_DINTIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_DINTIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_DINTIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_BWRIEN_MASK (0x10U) -#define USDHC_INT_SIGNAL_EN_BWRIEN_SHIFT (4U) -/*! BWRIEN - Buffer Write Ready Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_BWRIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_BWRIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_BWRIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_BRRIEN_MASK (0x20U) -#define USDHC_INT_SIGNAL_EN_BRRIEN_SHIFT (5U) -/*! BRRIEN - Buffer Read Ready Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_BRRIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_BRRIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_BRRIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CINSIEN_MASK (0x40U) -#define USDHC_INT_SIGNAL_EN_CINSIEN_SHIFT (6U) -/*! CINSIEN - Card Insertion Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CINSIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CINSIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CINSIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CRMIEN_MASK (0x80U) -#define USDHC_INT_SIGNAL_EN_CRMIEN_SHIFT (7U) -/*! CRMIEN - Card Removal Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CRMIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CRMIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CRMIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CINTIEN_MASK (0x100U) -#define USDHC_INT_SIGNAL_EN_CINTIEN_SHIFT (8U) -/*! CINTIEN - Card Interrupt Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CINTIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CINTIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CINTIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_RTEIEN_MASK (0x1000U) -#define USDHC_INT_SIGNAL_EN_RTEIEN_SHIFT (12U) -/*! RTEIEN - Re-Tuning Event Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_RTEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_RTEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_RTEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_TPIEN_MASK (0x4000U) -#define USDHC_INT_SIGNAL_EN_TPIEN_SHIFT (14U) -/*! TPIEN - Tuning Pass Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_TPIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_TPIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_TPIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CTOEIEN_MASK (0x10000U) -#define USDHC_INT_SIGNAL_EN_CTOEIEN_SHIFT (16U) -/*! CTOEIEN - Command Timeout Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CTOEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CTOEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CTOEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CCEIEN_MASK (0x20000U) -#define USDHC_INT_SIGNAL_EN_CCEIEN_SHIFT (17U) -/*! CCEIEN - Command CRC Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CCEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CCEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CCEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CEBEIEN_MASK (0x40000U) -#define USDHC_INT_SIGNAL_EN_CEBEIEN_SHIFT (18U) -/*! CEBEIEN - Command End Bit Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CEBEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CEBEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CEBEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_CIEIEN_MASK (0x80000U) -#define USDHC_INT_SIGNAL_EN_CIEIEN_SHIFT (19U) -/*! CIEIEN - Command Index Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_CIEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_CIEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_CIEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_DTOEIEN_MASK (0x100000U) -#define USDHC_INT_SIGNAL_EN_DTOEIEN_SHIFT (20U) -/*! DTOEIEN - Data Timeout Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_DTOEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_DTOEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_DTOEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_DCEIEN_MASK (0x200000U) -#define USDHC_INT_SIGNAL_EN_DCEIEN_SHIFT (21U) -/*! DCEIEN - Data CRC Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_DCEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_DCEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_DCEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_DEBEIEN_MASK (0x400000U) -#define USDHC_INT_SIGNAL_EN_DEBEIEN_SHIFT (22U) -/*! DEBEIEN - Data End Bit Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_DEBEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_DEBEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_DEBEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_AC12EIEN_MASK (0x1000000U) -#define USDHC_INT_SIGNAL_EN_AC12EIEN_SHIFT (24U) -/*! AC12EIEN - Auto CMD12 Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_AC12EIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_AC12EIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_AC12EIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_TNEIEN_MASK (0x4000000U) -#define USDHC_INT_SIGNAL_EN_TNEIEN_SHIFT (26U) -/*! TNEIEN - Tuning Error Interrupt Enable - * 0b1..Enabled - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_TNEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_TNEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_TNEIEN_MASK) - -#define USDHC_INT_SIGNAL_EN_DMAEIEN_MASK (0x10000000U) -#define USDHC_INT_SIGNAL_EN_DMAEIEN_SHIFT (28U) -/*! DMAEIEN - DMA Error Interrupt Enable - * 0b1..Enable - * 0b0..Masked - */ -#define USDHC_INT_SIGNAL_EN_DMAEIEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_INT_SIGNAL_EN_DMAEIEN_SHIFT)) & USDHC_INT_SIGNAL_EN_DMAEIEN_MASK) -/*! @} */ - -/*! @name AUTOCMD12_ERR_STATUS - Auto CMD12 Error Status */ -/*! @{ */ - -#define USDHC_AUTOCMD12_ERR_STATUS_AC12NE_MASK (0x1U) -#define USDHC_AUTOCMD12_ERR_STATUS_AC12NE_SHIFT (0U) -/*! AC12NE - Auto CMD12 Not Executed - * 0b1..Not executed - * 0b0..Executed - */ -#define USDHC_AUTOCMD12_ERR_STATUS_AC12NE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_AC12NE_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_AC12NE_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_MASK (0x2U) -#define USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_SHIFT (1U) -/*! AC12TOE - Auto CMD12 / 23 Timeout Error - * 0b1..Time out - * 0b0..No error - */ -#define USDHC_AUTOCMD12_ERR_STATUS_AC12TOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_MASK (0x4U) -#define USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_SHIFT (2U) -/*! AC12EBE - Auto CMD12 / 23 End Bit Error - * 0b1..End Bit Error Generated - * 0b0..No error - */ -#define USDHC_AUTOCMD12_ERR_STATUS_AC12EBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_AC12CE_MASK (0x8U) -#define USDHC_AUTOCMD12_ERR_STATUS_AC12CE_SHIFT (3U) -/*! AC12CE - Auto CMD12 / 23 CRC Error - * 0b1..CRC Error Met in Auto CMD12/23 Response - * 0b0..No CRC error - */ -#define USDHC_AUTOCMD12_ERR_STATUS_AC12CE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_AC12CE_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_AC12CE_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_AC12IE_MASK (0x10U) -#define USDHC_AUTOCMD12_ERR_STATUS_AC12IE_SHIFT (4U) -/*! AC12IE - Auto CMD12 / 23 Index Error - * 0b1..Error, the CMD index in response is not CMD12/23 - * 0b0..No error - */ -#define USDHC_AUTOCMD12_ERR_STATUS_AC12IE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_AC12IE_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_AC12IE_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_MASK (0x80U) -#define USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_SHIFT (7U) -/*! CNIBAC12E - Command Not Issued By Auto CMD12 Error - * 0b1..Not Issued - * 0b0..No error - */ -#define USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK (0x400000U) -#define USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_SHIFT (22U) -/*! EXECUTE_TUNING - Execute Tuning - */ -#define USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK) - -#define USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK (0x800000U) -#define USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_SHIFT (23U) -/*! SMP_CLK_SEL - Sample Clock Select - * 0b1..Tuned clock is used to sample data - * 0b0..Fixed clock is used to sample data - */ -#define USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_SHIFT)) & USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK) -/*! @} */ - -/*! @name HOST_CTRL_CAP - Host Controller Capabilities */ -/*! @{ */ - -#define USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_MASK (0x1U) -#define USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_SHIFT (0U) -/*! SDR50_SUPPORT - SDR50 support - */ -#define USDHC_HOST_CTRL_CAP_SDR50_SUPPORT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_SHIFT)) & USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_MASK) - -#define USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_MASK (0x2U) -#define USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_SHIFT (1U) -/*! SDR104_SUPPORT - SDR104 support - */ -#define USDHC_HOST_CTRL_CAP_SDR104_SUPPORT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_SHIFT)) & USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_MASK) - -#define USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_MASK (0x4U) -#define USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_SHIFT (2U) -/*! DDR50_SUPPORT - DDR50 support - */ -#define USDHC_HOST_CTRL_CAP_DDR50_SUPPORT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_SHIFT)) & USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_MASK) - -#define USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_MASK (0xF00U) -#define USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_SHIFT (8U) -/*! TIME_COUNT_RETUNING - Time Counter for Retuning - */ -#define USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_SHIFT)) & USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_MASK) - -#define USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_MASK (0x2000U) -#define USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_SHIFT (13U) -/*! USE_TUNING_SDR50 - Use Tuning for SDR50 - * 0b1..SDR50 requires tuning - * 0b0..SDR does not require tuning - */ -#define USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_SHIFT)) & USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_MASK) - -#define USDHC_HOST_CTRL_CAP_RETUNING_MODE_MASK (0xC000U) -#define USDHC_HOST_CTRL_CAP_RETUNING_MODE_SHIFT (14U) -/*! RETUNING_MODE - Retuning Mode - * 0b00..Mode 1 - * 0b01..Mode 2 - * 0b10..Mode 3 - * 0b11..Reserved - */ -#define USDHC_HOST_CTRL_CAP_RETUNING_MODE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_RETUNING_MODE_SHIFT)) & USDHC_HOST_CTRL_CAP_RETUNING_MODE_MASK) - -#define USDHC_HOST_CTRL_CAP_MBL_MASK (0x70000U) -#define USDHC_HOST_CTRL_CAP_MBL_SHIFT (16U) -/*! MBL - Max Block Length - * 0b000..512 bytes - * 0b001..1024 bytes - * 0b010..2048 bytes - * 0b011..4096 bytes - */ -#define USDHC_HOST_CTRL_CAP_MBL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_MBL_SHIFT)) & USDHC_HOST_CTRL_CAP_MBL_MASK) - -#define USDHC_HOST_CTRL_CAP_ADMAS_MASK (0x100000U) -#define USDHC_HOST_CTRL_CAP_ADMAS_SHIFT (20U) -/*! ADMAS - ADMA Support - * 0b1..Advanced DMA Supported - * 0b0..Advanced DMA Not supported - */ -#define USDHC_HOST_CTRL_CAP_ADMAS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_ADMAS_SHIFT)) & USDHC_HOST_CTRL_CAP_ADMAS_MASK) - -#define USDHC_HOST_CTRL_CAP_HSS_MASK (0x200000U) -#define USDHC_HOST_CTRL_CAP_HSS_SHIFT (21U) -/*! HSS - High Speed Support - * 0b1..High Speed Supported - * 0b0..High Speed Not Supported - */ -#define USDHC_HOST_CTRL_CAP_HSS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_HSS_SHIFT)) & USDHC_HOST_CTRL_CAP_HSS_MASK) - -#define USDHC_HOST_CTRL_CAP_DMAS_MASK (0x400000U) -#define USDHC_HOST_CTRL_CAP_DMAS_SHIFT (22U) -/*! DMAS - DMA Support - * 0b1..DMA Supported - * 0b0..DMA not supported - */ -#define USDHC_HOST_CTRL_CAP_DMAS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_DMAS_SHIFT)) & USDHC_HOST_CTRL_CAP_DMAS_MASK) - -#define USDHC_HOST_CTRL_CAP_SRS_MASK (0x800000U) -#define USDHC_HOST_CTRL_CAP_SRS_SHIFT (23U) -/*! SRS - Suspend / Resume Support - * 0b1..Supported - * 0b0..Not supported - */ -#define USDHC_HOST_CTRL_CAP_SRS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_SRS_SHIFT)) & USDHC_HOST_CTRL_CAP_SRS_MASK) - -#define USDHC_HOST_CTRL_CAP_VS33_MASK (0x1000000U) -#define USDHC_HOST_CTRL_CAP_VS33_SHIFT (24U) -/*! VS33 - Voltage Support 3.3V - * 0b1..3.3V supported - * 0b0..3.3V not supported - */ -#define USDHC_HOST_CTRL_CAP_VS33(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_VS33_SHIFT)) & USDHC_HOST_CTRL_CAP_VS33_MASK) - -#define USDHC_HOST_CTRL_CAP_VS30_MASK (0x2000000U) -#define USDHC_HOST_CTRL_CAP_VS30_SHIFT (25U) -/*! VS30 - Voltage Support 3.0 V - * 0b1..3.0V supported - * 0b0..3.0V not supported - */ -#define USDHC_HOST_CTRL_CAP_VS30(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_VS30_SHIFT)) & USDHC_HOST_CTRL_CAP_VS30_MASK) - -#define USDHC_HOST_CTRL_CAP_VS18_MASK (0x4000000U) -#define USDHC_HOST_CTRL_CAP_VS18_SHIFT (26U) -/*! VS18 - Voltage Support 1.8 V - * 0b1..1.8V supported - * 0b0..1.8V not supported - */ -#define USDHC_HOST_CTRL_CAP_VS18(x) (((uint32_t)(((uint32_t)(x)) << USDHC_HOST_CTRL_CAP_VS18_SHIFT)) & USDHC_HOST_CTRL_CAP_VS18_MASK) -/*! @} */ - -/*! @name WTMK_LVL - Watermark Level */ -/*! @{ */ - -#define USDHC_WTMK_LVL_RD_WML_MASK (0xFFU) -#define USDHC_WTMK_LVL_RD_WML_SHIFT (0U) -/*! RD_WML - Read Watermark Level - */ -#define USDHC_WTMK_LVL_RD_WML(x) (((uint32_t)(((uint32_t)(x)) << USDHC_WTMK_LVL_RD_WML_SHIFT)) & USDHC_WTMK_LVL_RD_WML_MASK) - -#define USDHC_WTMK_LVL_RD_BRST_LEN_MASK (0x1F00U) -#define USDHC_WTMK_LVL_RD_BRST_LEN_SHIFT (8U) -/*! RD_BRST_LEN - Read Burst Length Due to system restriction, the actual burst length may not exceed 16. - */ -#define USDHC_WTMK_LVL_RD_BRST_LEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_WTMK_LVL_RD_BRST_LEN_SHIFT)) & USDHC_WTMK_LVL_RD_BRST_LEN_MASK) - -#define USDHC_WTMK_LVL_WR_WML_MASK (0xFF0000U) -#define USDHC_WTMK_LVL_WR_WML_SHIFT (16U) -/*! WR_WML - Write Watermark Level - */ -#define USDHC_WTMK_LVL_WR_WML(x) (((uint32_t)(((uint32_t)(x)) << USDHC_WTMK_LVL_WR_WML_SHIFT)) & USDHC_WTMK_LVL_WR_WML_MASK) - -#define USDHC_WTMK_LVL_WR_BRST_LEN_MASK (0x1F000000U) -#define USDHC_WTMK_LVL_WR_BRST_LEN_SHIFT (24U) -/*! WR_BRST_LEN - Write Burst Length Due to system restriction, the actual burst length may not exceed 16. - */ -#define USDHC_WTMK_LVL_WR_BRST_LEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_WTMK_LVL_WR_BRST_LEN_SHIFT)) & USDHC_WTMK_LVL_WR_BRST_LEN_MASK) -/*! @} */ - -/*! @name MIX_CTRL - Mixer Control */ -/*! @{ */ - -#define USDHC_MIX_CTRL_DMAEN_MASK (0x1U) -#define USDHC_MIX_CTRL_DMAEN_SHIFT (0U) -/*! DMAEN - DMA Enable - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_MIX_CTRL_DMAEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_DMAEN_SHIFT)) & USDHC_MIX_CTRL_DMAEN_MASK) - -#define USDHC_MIX_CTRL_BCEN_MASK (0x2U) -#define USDHC_MIX_CTRL_BCEN_SHIFT (1U) -/*! BCEN - Block Count Enable - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_MIX_CTRL_BCEN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_BCEN_SHIFT)) & USDHC_MIX_CTRL_BCEN_MASK) - -#define USDHC_MIX_CTRL_AC12EN_MASK (0x4U) -#define USDHC_MIX_CTRL_AC12EN_SHIFT (2U) -/*! AC12EN - Auto CMD12 Enable - * 0b1..Enable - * 0b0..Disable - */ -#define USDHC_MIX_CTRL_AC12EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_AC12EN_SHIFT)) & USDHC_MIX_CTRL_AC12EN_MASK) - -#define USDHC_MIX_CTRL_DDR_EN_MASK (0x8U) -#define USDHC_MIX_CTRL_DDR_EN_SHIFT (3U) -/*! DDR_EN - Dual Data Rate mode selection - */ -#define USDHC_MIX_CTRL_DDR_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_DDR_EN_SHIFT)) & USDHC_MIX_CTRL_DDR_EN_MASK) - -#define USDHC_MIX_CTRL_DTDSEL_MASK (0x10U) -#define USDHC_MIX_CTRL_DTDSEL_SHIFT (4U) -/*! DTDSEL - Data Transfer Direction Select - * 0b1..Read (Card to Host) - * 0b0..Write (Host to Card) - */ -#define USDHC_MIX_CTRL_DTDSEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_DTDSEL_SHIFT)) & USDHC_MIX_CTRL_DTDSEL_MASK) - -#define USDHC_MIX_CTRL_MSBSEL_MASK (0x20U) -#define USDHC_MIX_CTRL_MSBSEL_SHIFT (5U) -/*! MSBSEL - Multi / Single Block Select - * 0b1..Multiple Blocks - * 0b0..Single Block - */ -#define USDHC_MIX_CTRL_MSBSEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_MSBSEL_SHIFT)) & USDHC_MIX_CTRL_MSBSEL_MASK) - -#define USDHC_MIX_CTRL_NIBBLE_POS_MASK (0x40U) -#define USDHC_MIX_CTRL_NIBBLE_POS_SHIFT (6U) -/*! NIBBLE_POS - NIBBLE_POS - */ -#define USDHC_MIX_CTRL_NIBBLE_POS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_NIBBLE_POS_SHIFT)) & USDHC_MIX_CTRL_NIBBLE_POS_MASK) - -#define USDHC_MIX_CTRL_AC23EN_MASK (0x80U) -#define USDHC_MIX_CTRL_AC23EN_SHIFT (7U) -/*! AC23EN - Auto CMD23 Enable - */ -#define USDHC_MIX_CTRL_AC23EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_AC23EN_SHIFT)) & USDHC_MIX_CTRL_AC23EN_MASK) - -#define USDHC_MIX_CTRL_EXE_TUNE_MASK (0x400000U) -#define USDHC_MIX_CTRL_EXE_TUNE_SHIFT (22U) -/*! EXE_TUNE - Execute Tuning: (Only used for SD3.0, SDR104 mode and EMMC HS200 mode) - * 0b1..Execute Tuning - * 0b0..Not Tuned or Tuning Completed - */ -#define USDHC_MIX_CTRL_EXE_TUNE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_EXE_TUNE_SHIFT)) & USDHC_MIX_CTRL_EXE_TUNE_MASK) - -#define USDHC_MIX_CTRL_SMP_CLK_SEL_MASK (0x800000U) -#define USDHC_MIX_CTRL_SMP_CLK_SEL_SHIFT (23U) -/*! SMP_CLK_SEL - SMP_CLK_SEL - * 0b1..Tuned clock is used to sample data / cmd - * 0b0..Fixed clock is used to sample data / cmd - */ -#define USDHC_MIX_CTRL_SMP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_SMP_CLK_SEL_SHIFT)) & USDHC_MIX_CTRL_SMP_CLK_SEL_MASK) - -#define USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK (0x1000000U) -#define USDHC_MIX_CTRL_AUTO_TUNE_EN_SHIFT (24U) -/*! AUTO_TUNE_EN - Auto Tuning Enable (Only used for SD3.0, SDR104 mode and and EMMC HS200 mode) - * 0b1..Enable auto tuning - * 0b0..Disable auto tuning - */ -#define USDHC_MIX_CTRL_AUTO_TUNE_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_AUTO_TUNE_EN_SHIFT)) & USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK) - -#define USDHC_MIX_CTRL_FBCLK_SEL_MASK (0x2000000U) -#define USDHC_MIX_CTRL_FBCLK_SEL_SHIFT (25U) -/*! FBCLK_SEL - Feedback Clock Source Selection (Only used for SD3.0, SDR104 mode and EMMC HS200 mode) - * 0b1..Feedback clock comes from the ipp_card_clk_out - * 0b0..Feedback clock comes from the loopback CLK - */ -#define USDHC_MIX_CTRL_FBCLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MIX_CTRL_FBCLK_SEL_SHIFT)) & USDHC_MIX_CTRL_FBCLK_SEL_MASK) -/*! @} */ - -/*! @name FORCE_EVENT - Force Event */ -/*! @{ */ - -#define USDHC_FORCE_EVENT_FEVTAC12NE_MASK (0x1U) -#define USDHC_FORCE_EVENT_FEVTAC12NE_SHIFT (0U) -/*! FEVTAC12NE - Force Event Auto Command 12 Not Executed - */ -#define USDHC_FORCE_EVENT_FEVTAC12NE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12NE_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12NE_MASK) - -#define USDHC_FORCE_EVENT_FEVTAC12TOE_MASK (0x2U) -#define USDHC_FORCE_EVENT_FEVTAC12TOE_SHIFT (1U) -/*! FEVTAC12TOE - Force Event Auto Command 12 Time Out Error - */ -#define USDHC_FORCE_EVENT_FEVTAC12TOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12TOE_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12TOE_MASK) - -#define USDHC_FORCE_EVENT_FEVTAC12CE_MASK (0x4U) -#define USDHC_FORCE_EVENT_FEVTAC12CE_SHIFT (2U) -/*! FEVTAC12CE - Force Event Auto Command 12 CRC Error - */ -#define USDHC_FORCE_EVENT_FEVTAC12CE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12CE_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12CE_MASK) - -#define USDHC_FORCE_EVENT_FEVTAC12EBE_MASK (0x8U) -#define USDHC_FORCE_EVENT_FEVTAC12EBE_SHIFT (3U) -/*! FEVTAC12EBE - Force Event Auto Command 12 End Bit Error - */ -#define USDHC_FORCE_EVENT_FEVTAC12EBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12EBE_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12EBE_MASK) - -#define USDHC_FORCE_EVENT_FEVTAC12IE_MASK (0x10U) -#define USDHC_FORCE_EVENT_FEVTAC12IE_SHIFT (4U) -/*! FEVTAC12IE - Force Event Auto Command 12 Index Error - */ -#define USDHC_FORCE_EVENT_FEVTAC12IE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12IE_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12IE_MASK) - -#define USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK (0x80U) -#define USDHC_FORCE_EVENT_FEVTCNIBAC12E_SHIFT (7U) -/*! FEVTCNIBAC12E - Force Event Command Not Executed By Auto Command 12 Error - */ -#define USDHC_FORCE_EVENT_FEVTCNIBAC12E(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCNIBAC12E_SHIFT)) & USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK) - -#define USDHC_FORCE_EVENT_FEVTCTOE_MASK (0x10000U) -#define USDHC_FORCE_EVENT_FEVTCTOE_SHIFT (16U) -/*! FEVTCTOE - Force Event Command Time Out Error - */ -#define USDHC_FORCE_EVENT_FEVTCTOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCTOE_SHIFT)) & USDHC_FORCE_EVENT_FEVTCTOE_MASK) - -#define USDHC_FORCE_EVENT_FEVTCCE_MASK (0x20000U) -#define USDHC_FORCE_EVENT_FEVTCCE_SHIFT (17U) -/*! FEVTCCE - Force Event Command CRC Error - */ -#define USDHC_FORCE_EVENT_FEVTCCE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCCE_SHIFT)) & USDHC_FORCE_EVENT_FEVTCCE_MASK) - -#define USDHC_FORCE_EVENT_FEVTCEBE_MASK (0x40000U) -#define USDHC_FORCE_EVENT_FEVTCEBE_SHIFT (18U) -/*! FEVTCEBE - Force Event Command End Bit Error - */ -#define USDHC_FORCE_EVENT_FEVTCEBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCEBE_SHIFT)) & USDHC_FORCE_EVENT_FEVTCEBE_MASK) - -#define USDHC_FORCE_EVENT_FEVTCIE_MASK (0x80000U) -#define USDHC_FORCE_EVENT_FEVTCIE_SHIFT (19U) -/*! FEVTCIE - Force Event Command Index Error - */ -#define USDHC_FORCE_EVENT_FEVTCIE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCIE_SHIFT)) & USDHC_FORCE_EVENT_FEVTCIE_MASK) - -#define USDHC_FORCE_EVENT_FEVTDTOE_MASK (0x100000U) -#define USDHC_FORCE_EVENT_FEVTDTOE_SHIFT (20U) -/*! FEVTDTOE - Force Event Data Time Out Error - */ -#define USDHC_FORCE_EVENT_FEVTDTOE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTDTOE_SHIFT)) & USDHC_FORCE_EVENT_FEVTDTOE_MASK) - -#define USDHC_FORCE_EVENT_FEVTDCE_MASK (0x200000U) -#define USDHC_FORCE_EVENT_FEVTDCE_SHIFT (21U) -/*! FEVTDCE - Force Event Data CRC Error - */ -#define USDHC_FORCE_EVENT_FEVTDCE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTDCE_SHIFT)) & USDHC_FORCE_EVENT_FEVTDCE_MASK) - -#define USDHC_FORCE_EVENT_FEVTDEBE_MASK (0x400000U) -#define USDHC_FORCE_EVENT_FEVTDEBE_SHIFT (22U) -/*! FEVTDEBE - Force Event Data End Bit Error - */ -#define USDHC_FORCE_EVENT_FEVTDEBE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTDEBE_SHIFT)) & USDHC_FORCE_EVENT_FEVTDEBE_MASK) - -#define USDHC_FORCE_EVENT_FEVTAC12E_MASK (0x1000000U) -#define USDHC_FORCE_EVENT_FEVTAC12E_SHIFT (24U) -/*! FEVTAC12E - Force Event Auto Command 12 Error - */ -#define USDHC_FORCE_EVENT_FEVTAC12E(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTAC12E_SHIFT)) & USDHC_FORCE_EVENT_FEVTAC12E_MASK) - -#define USDHC_FORCE_EVENT_FEVTTNE_MASK (0x4000000U) -#define USDHC_FORCE_EVENT_FEVTTNE_SHIFT (26U) -/*! FEVTTNE - Force Tuning Error - */ -#define USDHC_FORCE_EVENT_FEVTTNE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTTNE_SHIFT)) & USDHC_FORCE_EVENT_FEVTTNE_MASK) - -#define USDHC_FORCE_EVENT_FEVTDMAE_MASK (0x10000000U) -#define USDHC_FORCE_EVENT_FEVTDMAE_SHIFT (28U) -/*! FEVTDMAE - Force Event DMA Error - */ -#define USDHC_FORCE_EVENT_FEVTDMAE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTDMAE_SHIFT)) & USDHC_FORCE_EVENT_FEVTDMAE_MASK) - -#define USDHC_FORCE_EVENT_FEVTCINT_MASK (0x80000000U) -#define USDHC_FORCE_EVENT_FEVTCINT_SHIFT (31U) -/*! FEVTCINT - Force Event Card Interrupt - */ -#define USDHC_FORCE_EVENT_FEVTCINT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_FORCE_EVENT_FEVTCINT_SHIFT)) & USDHC_FORCE_EVENT_FEVTCINT_MASK) -/*! @} */ - -/*! @name ADMA_ERR_STATUS - ADMA Error Status Register */ -/*! @{ */ - -#define USDHC_ADMA_ERR_STATUS_ADMAES_MASK (0x3U) -#define USDHC_ADMA_ERR_STATUS_ADMAES_SHIFT (0U) -/*! ADMAES - ADMA Error State (when ADMA Error is occurred) - */ -#define USDHC_ADMA_ERR_STATUS_ADMAES(x) (((uint32_t)(((uint32_t)(x)) << USDHC_ADMA_ERR_STATUS_ADMAES_SHIFT)) & USDHC_ADMA_ERR_STATUS_ADMAES_MASK) - -#define USDHC_ADMA_ERR_STATUS_ADMALME_MASK (0x4U) -#define USDHC_ADMA_ERR_STATUS_ADMALME_SHIFT (2U) -/*! ADMALME - ADMA Length Mismatch Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_ADMA_ERR_STATUS_ADMALME(x) (((uint32_t)(((uint32_t)(x)) << USDHC_ADMA_ERR_STATUS_ADMALME_SHIFT)) & USDHC_ADMA_ERR_STATUS_ADMALME_MASK) - -#define USDHC_ADMA_ERR_STATUS_ADMADCE_MASK (0x8U) -#define USDHC_ADMA_ERR_STATUS_ADMADCE_SHIFT (3U) -/*! ADMADCE - ADMA Descriptor Error - * 0b1..Error - * 0b0..No Error - */ -#define USDHC_ADMA_ERR_STATUS_ADMADCE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_ADMA_ERR_STATUS_ADMADCE_SHIFT)) & USDHC_ADMA_ERR_STATUS_ADMADCE_MASK) -/*! @} */ - -/*! @name ADMA_SYS_ADDR - ADMA System Address */ -/*! @{ */ - -#define USDHC_ADMA_SYS_ADDR_ADS_ADDR_MASK (0xFFFFFFFCU) -#define USDHC_ADMA_SYS_ADDR_ADS_ADDR_SHIFT (2U) -/*! ADS_ADDR - ADMA System Address - */ -#define USDHC_ADMA_SYS_ADDR_ADS_ADDR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_ADMA_SYS_ADDR_ADS_ADDR_SHIFT)) & USDHC_ADMA_SYS_ADDR_ADS_ADDR_MASK) -/*! @} */ - -/*! @name DLL_CTRL - DLL (Delay Line) Control */ -/*! @{ */ - -#define USDHC_DLL_CTRL_DLL_CTRL_ENABLE_MASK (0x1U) -#define USDHC_DLL_CTRL_DLL_CTRL_ENABLE_SHIFT (0U) -/*! DLL_CTRL_ENABLE - DLL_CTRL_ENABLE - */ -#define USDHC_DLL_CTRL_DLL_CTRL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_ENABLE_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_ENABLE_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_RESET_MASK (0x2U) -#define USDHC_DLL_CTRL_DLL_CTRL_RESET_SHIFT (1U) -/*! DLL_CTRL_RESET - DLL_CTRL_RESET - */ -#define USDHC_DLL_CTRL_DLL_CTRL_RESET(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_RESET_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_RESET_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_FORCE_UPD_MASK (0x4U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_FORCE_UPD_SHIFT (2U) -/*! DLL_CTRL_SLV_FORCE_UPD - DLL_CTRL_SLV_FORCE_UPD - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_FORCE_UPD(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_FORCE_UPD_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_FORCE_UPD_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET0_MASK (0x78U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET0_SHIFT (3U) -/*! DLL_CTRL_SLV_DLY_TARGET0 - DLL_CTRL_SLV_DLY_TARGET0 - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET0(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET0_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET0_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_GATE_UPDATE_MASK (0x80U) -#define USDHC_DLL_CTRL_DLL_CTRL_GATE_UPDATE_SHIFT (7U) -/*! DLL_CTRL_GATE_UPDATE - DLL_CTRL_GATE_UPDATE - */ -#define USDHC_DLL_CTRL_DLL_CTRL_GATE_UPDATE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_GATE_UPDATE_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_GATE_UPDATE_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_MASK (0x100U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_SHIFT (8U) -/*! DLL_CTRL_SLV_OVERRIDE - DLL_CTRL_SLV_OVERRIDE - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_VAL_MASK (0xFE00U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_VAL_SHIFT (9U) -/*! DLL_CTRL_SLV_OVERRIDE_VAL - DLL_CTRL_SLV_OVERRIDE_VAL - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_VAL_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_OVERRIDE_VAL_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET1_MASK (0x70000U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET1_SHIFT (16U) -/*! DLL_CTRL_SLV_DLY_TARGET1 - DLL_CTRL_SLV_DLY_TARGET1 - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET1(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET1_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_DLY_TARGET1_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_UPDATE_INT_MASK (0xFF00000U) -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_UPDATE_INT_SHIFT (20U) -/*! DLL_CTRL_SLV_UPDATE_INT - DLL_CTRL_SLV_UPDATE_INT - */ -#define USDHC_DLL_CTRL_DLL_CTRL_SLV_UPDATE_INT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_SLV_UPDATE_INT_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_SLV_UPDATE_INT_MASK) - -#define USDHC_DLL_CTRL_DLL_CTRL_REF_UPDATE_INT_MASK (0xF0000000U) -#define USDHC_DLL_CTRL_DLL_CTRL_REF_UPDATE_INT_SHIFT (28U) -/*! DLL_CTRL_REF_UPDATE_INT - DLL_CTRL_REF_UPDATE_INT - */ -#define USDHC_DLL_CTRL_DLL_CTRL_REF_UPDATE_INT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_CTRL_DLL_CTRL_REF_UPDATE_INT_SHIFT)) & USDHC_DLL_CTRL_DLL_CTRL_REF_UPDATE_INT_MASK) -/*! @} */ - -/*! @name DLL_STATUS - DLL Status */ -/*! @{ */ - -#define USDHC_DLL_STATUS_DLL_STS_SLV_LOCK_MASK (0x1U) -#define USDHC_DLL_STATUS_DLL_STS_SLV_LOCK_SHIFT (0U) -/*! DLL_STS_SLV_LOCK - DLL_STS_SLV_LOCK - */ -#define USDHC_DLL_STATUS_DLL_STS_SLV_LOCK(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_STATUS_DLL_STS_SLV_LOCK_SHIFT)) & USDHC_DLL_STATUS_DLL_STS_SLV_LOCK_MASK) - -#define USDHC_DLL_STATUS_DLL_STS_REF_LOCK_MASK (0x2U) -#define USDHC_DLL_STATUS_DLL_STS_REF_LOCK_SHIFT (1U) -/*! DLL_STS_REF_LOCK - DLL_STS_REF_LOCK - */ -#define USDHC_DLL_STATUS_DLL_STS_REF_LOCK(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_STATUS_DLL_STS_REF_LOCK_SHIFT)) & USDHC_DLL_STATUS_DLL_STS_REF_LOCK_MASK) - -#define USDHC_DLL_STATUS_DLL_STS_SLV_SEL_MASK (0x1FCU) -#define USDHC_DLL_STATUS_DLL_STS_SLV_SEL_SHIFT (2U) -/*! DLL_STS_SLV_SEL - DLL_STS_SLV_SEL - */ -#define USDHC_DLL_STATUS_DLL_STS_SLV_SEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_STATUS_DLL_STS_SLV_SEL_SHIFT)) & USDHC_DLL_STATUS_DLL_STS_SLV_SEL_MASK) - -#define USDHC_DLL_STATUS_DLL_STS_REF_SEL_MASK (0xFE00U) -#define USDHC_DLL_STATUS_DLL_STS_REF_SEL_SHIFT (9U) -/*! DLL_STS_REF_SEL - DLL_STS_REF_SEL - */ -#define USDHC_DLL_STATUS_DLL_STS_REF_SEL(x) (((uint32_t)(((uint32_t)(x)) << USDHC_DLL_STATUS_DLL_STS_REF_SEL_SHIFT)) & USDHC_DLL_STATUS_DLL_STS_REF_SEL_MASK) -/*! @} */ - -/*! @name CLK_TUNE_CTRL_STATUS - CLK Tuning Control and Status */ -/*! @{ */ - -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_MASK (0xFU) -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_SHIFT (0U) -/*! DLY_CELL_SET_POST - DLY_CELL_SET_POST - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_MASK (0xF0U) -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_SHIFT (4U) -/*! DLY_CELL_SET_OUT - DLY_CELL_SET_OUT - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_MASK (0x7F00U) -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_SHIFT (8U) -/*! DLY_CELL_SET_PRE - DLY_CELL_SET_PRE - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK (0x8000U) -#define USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_SHIFT (15U) -/*! NXT_ERR - NXT_ERR - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_POST_MASK (0xF0000U) -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_POST_SHIFT (16U) -/*! TAP_SEL_POST - TAP_SEL_POST - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_POST(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_POST_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_POST_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_OUT_MASK (0xF00000U) -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_OUT_SHIFT (20U) -/*! TAP_SEL_OUT - TAP_SEL_OUT - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_OUT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_OUT_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_OUT_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_PRE_MASK (0x7F000000U) -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_PRE_SHIFT (24U) -/*! TAP_SEL_PRE - TAP_SEL_PRE - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_PRE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_PRE_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_TAP_SEL_PRE_MASK) - -#define USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK (0x80000000U) -#define USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_SHIFT (31U) -/*! PRE_ERR - PRE_ERR - */ -#define USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR(x) (((uint32_t)(((uint32_t)(x)) << USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_SHIFT)) & USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK) -/*! @} */ - -/*! @name VEND_SPEC - Vendor Specific Register */ -/*! @{ */ - -#define USDHC_VEND_SPEC_VSELECT_MASK (0x2U) -#define USDHC_VEND_SPEC_VSELECT_SHIFT (1U) -/*! VSELECT - Voltage Selection - * 0b1..Change the voltage to low voltage range, around 1.8 V - * 0b0..Change the voltage to high voltage range, around 3.0 V - */ -#define USDHC_VEND_SPEC_VSELECT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_VSELECT_SHIFT)) & USDHC_VEND_SPEC_VSELECT_MASK) - -#define USDHC_VEND_SPEC_CONFLICT_CHK_EN_MASK (0x4U) -#define USDHC_VEND_SPEC_CONFLICT_CHK_EN_SHIFT (2U) -/*! CONFLICT_CHK_EN - Conflict check enable. - * 0b0..Conflict check disable - * 0b1..Conflict check enable - */ -#define USDHC_VEND_SPEC_CONFLICT_CHK_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_CONFLICT_CHK_EN_SHIFT)) & USDHC_VEND_SPEC_CONFLICT_CHK_EN_MASK) - -#define USDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN_MASK (0x8U) -#define USDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN_SHIFT (3U) -/*! AC12_WR_CHKBUSY_EN - AC12_WR_CHKBUSY_EN - * 0b0..Do not check busy after auto CMD12 for write data packet - * 0b1..Check busy after auto CMD12 for write data packet - */ -#define USDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN_SHIFT)) & USDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN_MASK) - -#define USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK (0x100U) -#define USDHC_VEND_SPEC_FRC_SDCLK_ON_SHIFT (8U) -/*! FRC_SDCLK_ON - FRC_SDCLK_ON - * 0b0..CLK active or inactive is fully controlled by the hardware. - * 0b1..Force CLK active. - */ -#define USDHC_VEND_SPEC_FRC_SDCLK_ON(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_FRC_SDCLK_ON_SHIFT)) & USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK) - -#define USDHC_VEND_SPEC_CRC_CHK_DIS_MASK (0x8000U) -#define USDHC_VEND_SPEC_CRC_CHK_DIS_SHIFT (15U) -/*! CRC_CHK_DIS - CRC Check Disable - * 0b0..Check CRC16 for every read data packet and check CRC bits for every write data packet - * 0b1..Ignore CRC16 check for every read data packet and ignore CRC bits check for every write data packet - */ -#define USDHC_VEND_SPEC_CRC_CHK_DIS(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_CRC_CHK_DIS_SHIFT)) & USDHC_VEND_SPEC_CRC_CHK_DIS_MASK) - -#define USDHC_VEND_SPEC_CMD_BYTE_EN_MASK (0x80000000U) -#define USDHC_VEND_SPEC_CMD_BYTE_EN_SHIFT (31U) -/*! CMD_BYTE_EN - CMD_BYTE_EN - * 0b0..Disable - * 0b1..Enable - */ -#define USDHC_VEND_SPEC_CMD_BYTE_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC_CMD_BYTE_EN_SHIFT)) & USDHC_VEND_SPEC_CMD_BYTE_EN_MASK) -/*! @} */ - -/*! @name MMC_BOOT - MMC Boot Register */ -/*! @{ */ - -#define USDHC_MMC_BOOT_DTOCV_ACK_MASK (0xFU) -#define USDHC_MMC_BOOT_DTOCV_ACK_SHIFT (0U) -/*! DTOCV_ACK - DTOCV_ACK - * 0b0000..SDCLK x 2^14 - * 0b0001..SDCLK x 2^15 - * 0b0010..SDCLK x 2^16 - * 0b0011..SDCLK x 2^17 - * 0b0100..SDCLK x 2^18 - * 0b0101..SDCLK x 2^19 - * 0b0110..SDCLK x 2^20 - * 0b0111..SDCLK x 2^21 - * 0b1110..SDCLK x 2^28 - * 0b1111..SDCLK x 2^29 - */ -#define USDHC_MMC_BOOT_DTOCV_ACK(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_DTOCV_ACK_SHIFT)) & USDHC_MMC_BOOT_DTOCV_ACK_MASK) - -#define USDHC_MMC_BOOT_BOOT_ACK_MASK (0x10U) -#define USDHC_MMC_BOOT_BOOT_ACK_SHIFT (4U) -/*! BOOT_ACK - BOOT_ACK - * 0b0..No ack - * 0b1..Ack - */ -#define USDHC_MMC_BOOT_BOOT_ACK(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_BOOT_ACK_SHIFT)) & USDHC_MMC_BOOT_BOOT_ACK_MASK) - -#define USDHC_MMC_BOOT_BOOT_MODE_MASK (0x20U) -#define USDHC_MMC_BOOT_BOOT_MODE_SHIFT (5U) -/*! BOOT_MODE - BOOT_MODE - * 0b0..Normal boot - * 0b1..Alternative boot - */ -#define USDHC_MMC_BOOT_BOOT_MODE(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_BOOT_MODE_SHIFT)) & USDHC_MMC_BOOT_BOOT_MODE_MASK) - -#define USDHC_MMC_BOOT_BOOT_EN_MASK (0x40U) -#define USDHC_MMC_BOOT_BOOT_EN_SHIFT (6U) -/*! BOOT_EN - BOOT_EN - * 0b0..Fast boot disable - * 0b1..Fast boot enable - */ -#define USDHC_MMC_BOOT_BOOT_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_BOOT_EN_SHIFT)) & USDHC_MMC_BOOT_BOOT_EN_MASK) - -#define USDHC_MMC_BOOT_AUTO_SABG_EN_MASK (0x80U) -#define USDHC_MMC_BOOT_AUTO_SABG_EN_SHIFT (7U) -/*! AUTO_SABG_EN - AUTO_SABG_EN - */ -#define USDHC_MMC_BOOT_AUTO_SABG_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_AUTO_SABG_EN_SHIFT)) & USDHC_MMC_BOOT_AUTO_SABG_EN_MASK) - -#define USDHC_MMC_BOOT_DISABLE_TIME_OUT_MASK (0x100U) -#define USDHC_MMC_BOOT_DISABLE_TIME_OUT_SHIFT (8U) -/*! DISABLE_TIME_OUT - Disable Time Out - * 0b0..Enable time out - * 0b1..Disable time out - */ -#define USDHC_MMC_BOOT_DISABLE_TIME_OUT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_DISABLE_TIME_OUT_SHIFT)) & USDHC_MMC_BOOT_DISABLE_TIME_OUT_MASK) - -#define USDHC_MMC_BOOT_BOOT_BLK_CNT_MASK (0xFFFF0000U) -#define USDHC_MMC_BOOT_BOOT_BLK_CNT_SHIFT (16U) -/*! BOOT_BLK_CNT - BOOT_BLK_CNT - */ -#define USDHC_MMC_BOOT_BOOT_BLK_CNT(x) (((uint32_t)(((uint32_t)(x)) << USDHC_MMC_BOOT_BOOT_BLK_CNT_SHIFT)) & USDHC_MMC_BOOT_BOOT_BLK_CNT_MASK) -/*! @} */ - -/*! @name VEND_SPEC2 - Vendor Specific 2 Register */ -/*! @{ */ - -#define USDHC_VEND_SPEC2_CARD_INT_D3_TEST_MASK (0x8U) -#define USDHC_VEND_SPEC2_CARD_INT_D3_TEST_SHIFT (3U) -/*! CARD_INT_D3_TEST - Card Interrupt Detection Test - * 0b0..Check the card interrupt only when DATA3 is high. - * 0b1..Check the card interrupt by ignoring the status of DATA3. - */ -#define USDHC_VEND_SPEC2_CARD_INT_D3_TEST(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_CARD_INT_D3_TEST_SHIFT)) & USDHC_VEND_SPEC2_CARD_INT_D3_TEST_MASK) - -#define USDHC_VEND_SPEC2_TUNING_8bit_EN_MASK (0x10U) -#define USDHC_VEND_SPEC2_TUNING_8bit_EN_SHIFT (4U) -/*! TUNING_8bit_EN - TUNING_8bit_EN - */ -#define USDHC_VEND_SPEC2_TUNING_8bit_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_TUNING_8bit_EN_SHIFT)) & USDHC_VEND_SPEC2_TUNING_8bit_EN_MASK) - -#define USDHC_VEND_SPEC2_TUNING_1bit_EN_MASK (0x20U) -#define USDHC_VEND_SPEC2_TUNING_1bit_EN_SHIFT (5U) -/*! TUNING_1bit_EN - TUNING_1bit_EN - */ -#define USDHC_VEND_SPEC2_TUNING_1bit_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_TUNING_1bit_EN_SHIFT)) & USDHC_VEND_SPEC2_TUNING_1bit_EN_MASK) - -#define USDHC_VEND_SPEC2_TUNING_CMD_EN_MASK (0x40U) -#define USDHC_VEND_SPEC2_TUNING_CMD_EN_SHIFT (6U) -/*! TUNING_CMD_EN - TUNING_CMD_EN - * 0b0..Auto tuning circuit does not check the CMD line. - * 0b1..Auto tuning circuit checks the CMD line. - */ -#define USDHC_VEND_SPEC2_TUNING_CMD_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_TUNING_CMD_EN_SHIFT)) & USDHC_VEND_SPEC2_TUNING_CMD_EN_MASK) - -#define USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_MASK (0x1000U) -#define USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_SHIFT (12U) -/*! ACMD23_ARGU2_EN - Argument2 register enable for ACMD23 - * 0b1..Argument2 register enable for ACMD23 sharing with SDMA system address register. Default is enable. - * 0b0..Disable - */ -#define USDHC_VEND_SPEC2_ACMD23_ARGU2_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_SHIFT)) & USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_MASK) - -#define USDHC_VEND_SPEC2_PART_DLL_DEBUG_MASK (0x2000U) -#define USDHC_VEND_SPEC2_PART_DLL_DEBUG_SHIFT (13U) -/*! PART_DLL_DEBUG - debug for part dll - */ -#define USDHC_VEND_SPEC2_PART_DLL_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_PART_DLL_DEBUG_SHIFT)) & USDHC_VEND_SPEC2_PART_DLL_DEBUG_MASK) - -#define USDHC_VEND_SPEC2_BUS_RST_MASK (0x4000U) -#define USDHC_VEND_SPEC2_BUS_RST_SHIFT (14U) -/*! BUS_RST - BUS reset - */ -#define USDHC_VEND_SPEC2_BUS_RST(x) (((uint32_t)(((uint32_t)(x)) << USDHC_VEND_SPEC2_BUS_RST_SHIFT)) & USDHC_VEND_SPEC2_BUS_RST_MASK) -/*! @} */ - -/*! @name TUNING_CTRL - Tuning Control Register */ -/*! @{ */ - -#define USDHC_TUNING_CTRL_TUNING_START_TAP_MASK (0xFFU) -#define USDHC_TUNING_CTRL_TUNING_START_TAP_SHIFT (0U) -/*! TUNING_START_TAP - TUNING_START_TAP - */ -#define USDHC_TUNING_CTRL_TUNING_START_TAP(x) (((uint32_t)(((uint32_t)(x)) << USDHC_TUNING_CTRL_TUNING_START_TAP_SHIFT)) & USDHC_TUNING_CTRL_TUNING_START_TAP_MASK) - -#define USDHC_TUNING_CTRL_TUNING_COUNTER_MASK (0xFF00U) -#define USDHC_TUNING_CTRL_TUNING_COUNTER_SHIFT (8U) -/*! TUNING_COUNTER - TUNING_COUNTER - */ -#define USDHC_TUNING_CTRL_TUNING_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << USDHC_TUNING_CTRL_TUNING_COUNTER_SHIFT)) & USDHC_TUNING_CTRL_TUNING_COUNTER_MASK) - -#define USDHC_TUNING_CTRL_TUNING_STEP_MASK (0x70000U) -#define USDHC_TUNING_CTRL_TUNING_STEP_SHIFT (16U) -/*! TUNING_STEP - TUNING_STEP - */ -#define USDHC_TUNING_CTRL_TUNING_STEP(x) (((uint32_t)(((uint32_t)(x)) << USDHC_TUNING_CTRL_TUNING_STEP_SHIFT)) & USDHC_TUNING_CTRL_TUNING_STEP_MASK) - -#define USDHC_TUNING_CTRL_TUNING_WINDOW_MASK (0x700000U) -#define USDHC_TUNING_CTRL_TUNING_WINDOW_SHIFT (20U) -/*! TUNING_WINDOW - TUNING_WINDOW - */ -#define USDHC_TUNING_CTRL_TUNING_WINDOW(x) (((uint32_t)(((uint32_t)(x)) << USDHC_TUNING_CTRL_TUNING_WINDOW_SHIFT)) & USDHC_TUNING_CTRL_TUNING_WINDOW_MASK) - -#define USDHC_TUNING_CTRL_STD_TUNING_EN_MASK (0x1000000U) -#define USDHC_TUNING_CTRL_STD_TUNING_EN_SHIFT (24U) -/*! STD_TUNING_EN - STD_TUNING_EN - */ -#define USDHC_TUNING_CTRL_STD_TUNING_EN(x) (((uint32_t)(((uint32_t)(x)) << USDHC_TUNING_CTRL_STD_TUNING_EN_SHIFT)) & USDHC_TUNING_CTRL_STD_TUNING_EN_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group USDHC_Register_Masks */ - - -/* USDHC - Peripheral instance base addresses */ -/** Peripheral USDHC1 base address */ -#define USDHC1_BASE (0x402C0000u) -/** Peripheral USDHC1 base pointer */ -#define USDHC1 ((USDHC_Type *)USDHC1_BASE) -/** Peripheral USDHC2 base address */ -#define USDHC2_BASE (0x402C4000u) -/** Peripheral USDHC2 base pointer */ -#define USDHC2 ((USDHC_Type *)USDHC2_BASE) -/** Array initializer of USDHC peripheral base addresses */ -#define USDHC_BASE_ADDRS { 0u, USDHC1_BASE, USDHC2_BASE } -/** Array initializer of USDHC peripheral base pointers */ -#define USDHC_BASE_PTRS { (USDHC_Type *)0u, USDHC1, USDHC2 } -/** Interrupt vectors for the USDHC peripheral type */ -#define USDHC_IRQS { NotAvail_IRQn, USDHC1_IRQn, USDHC2_IRQn } - -/*! - * @} - */ /* end of group USDHC_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- WDOG Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup WDOG_Peripheral_Access_Layer WDOG Peripheral Access Layer - * @{ - */ - -/** WDOG - Register Layout Typedef */ -typedef struct { - __IO uint16_t WCR; /**< Watchdog Control Register, offset: 0x0 */ - __IO uint16_t WSR; /**< Watchdog Service Register, offset: 0x2 */ - __I uint16_t WRSR; /**< Watchdog Reset Status Register, offset: 0x4 */ - __IO uint16_t WICR; /**< Watchdog Interrupt Control Register, offset: 0x6 */ - __IO uint16_t WMCR; /**< Watchdog Miscellaneous Control Register, offset: 0x8 */ -} WDOG_Type; - -/* ---------------------------------------------------------------------------- - -- WDOG Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup WDOG_Register_Masks WDOG Register Masks - * @{ - */ - -/*! @name WCR - Watchdog Control Register */ -/*! @{ */ - -#define WDOG_WCR_WDZST_MASK (0x1U) -#define WDOG_WCR_WDZST_SHIFT (0U) -/*! WDZST - WDZST - * 0b0..Continue timer operation (Default). - * 0b1..Suspend the watchdog timer. - */ -#define WDOG_WCR_WDZST(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDZST_SHIFT)) & WDOG_WCR_WDZST_MASK) - -#define WDOG_WCR_WDBG_MASK (0x2U) -#define WDOG_WCR_WDBG_SHIFT (1U) -/*! WDBG - WDBG - * 0b0..Continue WDOG timer operation (Default). - * 0b1..Suspend the watchdog timer. - */ -#define WDOG_WCR_WDBG(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDBG_SHIFT)) & WDOG_WCR_WDBG_MASK) - -#define WDOG_WCR_WDE_MASK (0x4U) -#define WDOG_WCR_WDE_SHIFT (2U) -/*! WDE - WDE - * 0b0..Disable the Watchdog (Default). - * 0b1..Enable the Watchdog. - */ -#define WDOG_WCR_WDE(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDE_SHIFT)) & WDOG_WCR_WDE_MASK) - -#define WDOG_WCR_WDT_MASK (0x8U) -#define WDOG_WCR_WDT_SHIFT (3U) -/*! WDT - WDT - * 0b0..No effect on WDOG_B (Default). - * 0b1..Assert WDOG_B upon a Watchdog Time-out event. - */ -#define WDOG_WCR_WDT(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDT_SHIFT)) & WDOG_WCR_WDT_MASK) - -#define WDOG_WCR_SRS_MASK (0x10U) -#define WDOG_WCR_SRS_SHIFT (4U) -/*! SRS - SRS - * 0b0..Assert system reset signal. - * 0b1..No effect on the system (Default). - */ -#define WDOG_WCR_SRS(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_SRS_SHIFT)) & WDOG_WCR_SRS_MASK) - -#define WDOG_WCR_WDA_MASK (0x20U) -#define WDOG_WCR_WDA_SHIFT (5U) -/*! WDA - WDA - * 0b0..Assert WDOG_B output. - * 0b1..No effect on system (Default). - */ -#define WDOG_WCR_WDA(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDA_SHIFT)) & WDOG_WCR_WDA_MASK) - -#define WDOG_WCR_SRE_MASK (0x40U) -#define WDOG_WCR_SRE_SHIFT (6U) -/*! SRE - software reset extension, an option way to generate software reset - * 0b0..using original way to generate software reset (default) - * 0b1..using new way to generate software reset. - */ -#define WDOG_WCR_SRE(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_SRE_SHIFT)) & WDOG_WCR_SRE_MASK) - -#define WDOG_WCR_WDW_MASK (0x80U) -#define WDOG_WCR_WDW_SHIFT (7U) -/*! WDW - WDW - * 0b0..Continue WDOG timer operation (Default). - * 0b1..Suspend WDOG timer operation. - */ -#define WDOG_WCR_WDW(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WDW_SHIFT)) & WDOG_WCR_WDW_MASK) - -#define WDOG_WCR_WT_MASK (0xFF00U) -#define WDOG_WCR_WT_SHIFT (8U) -/*! WT - WT - * 0b00000000..- 0.5 Seconds (Default). - * 0b00000001..- 1.0 Seconds. - * 0b00000010..- 1.5 Seconds. - * 0b00000011..- 2.0 Seconds. - * 0b11111111..- 128 Seconds. - */ -#define WDOG_WCR_WT(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WCR_WT_SHIFT)) & WDOG_WCR_WT_MASK) -/*! @} */ - -/*! @name WSR - Watchdog Service Register */ -/*! @{ */ - -#define WDOG_WSR_WSR_MASK (0xFFFFU) -#define WDOG_WSR_WSR_SHIFT (0U) -/*! WSR - WSR - * 0b0101010101010101..Write to the Watchdog Service Register (WDOG_WSR). - * 0b1010101010101010..Write to the Watchdog Service Register (WDOG_WSR). - */ -#define WDOG_WSR_WSR(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WSR_WSR_SHIFT)) & WDOG_WSR_WSR_MASK) -/*! @} */ - -/*! @name WRSR - Watchdog Reset Status Register */ -/*! @{ */ - -#define WDOG_WRSR_SFTW_MASK (0x1U) -#define WDOG_WRSR_SFTW_SHIFT (0U) -/*! SFTW - SFTW - * 0b0..Reset is not the result of a software reset. - * 0b1..Reset is the result of a software reset. - */ -#define WDOG_WRSR_SFTW(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WRSR_SFTW_SHIFT)) & WDOG_WRSR_SFTW_MASK) - -#define WDOG_WRSR_TOUT_MASK (0x2U) -#define WDOG_WRSR_TOUT_SHIFT (1U) -/*! TOUT - TOUT - * 0b0..Reset is not the result of a WDOG timeout. - * 0b1..Reset is the result of a WDOG timeout. - */ -#define WDOG_WRSR_TOUT(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WRSR_TOUT_SHIFT)) & WDOG_WRSR_TOUT_MASK) - -#define WDOG_WRSR_POR_MASK (0x10U) -#define WDOG_WRSR_POR_SHIFT (4U) -/*! POR - POR - * 0b0..Reset is not the result of a power on reset. - * 0b1..Reset is the result of a power on reset. - */ -#define WDOG_WRSR_POR(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WRSR_POR_SHIFT)) & WDOG_WRSR_POR_MASK) -/*! @} */ - -/*! @name WICR - Watchdog Interrupt Control Register */ -/*! @{ */ - -#define WDOG_WICR_WICT_MASK (0xFFU) -#define WDOG_WICR_WICT_SHIFT (0U) -/*! WICT - WICT - * 0b00000000..WICT[7:0] = Time duration between interrupt and time-out is 0 seconds. - * 0b00000001..WICT[7:0] = Time duration between interrupt and time-out is 0.5 seconds. - * 0b00000100..WICT[7:0] = Time duration between interrupt and time-out is 2 seconds (Default). - * 0b11111111..WICT[7:0] = Time duration between interrupt and time-out is 127.5 seconds. - */ -#define WDOG_WICR_WICT(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WICR_WICT_SHIFT)) & WDOG_WICR_WICT_MASK) - -#define WDOG_WICR_WTIS_MASK (0x4000U) -#define WDOG_WICR_WTIS_SHIFT (14U) -/*! WTIS - WTIS - * 0b0..No interrupt has occurred (Default). - * 0b1..Interrupt has occurred - */ -#define WDOG_WICR_WTIS(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WICR_WTIS_SHIFT)) & WDOG_WICR_WTIS_MASK) - -#define WDOG_WICR_WIE_MASK (0x8000U) -#define WDOG_WICR_WIE_SHIFT (15U) -/*! WIE - WIE - * 0b0..Disable Interrupt (Default). - * 0b1..Enable Interrupt. - */ -#define WDOG_WICR_WIE(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WICR_WIE_SHIFT)) & WDOG_WICR_WIE_MASK) -/*! @} */ - -/*! @name WMCR - Watchdog Miscellaneous Control Register */ -/*! @{ */ - -#define WDOG_WMCR_PDE_MASK (0x1U) -#define WDOG_WMCR_PDE_SHIFT (0U) -/*! PDE - PDE - * 0b0..Power Down Counter of WDOG is disabled. - * 0b1..Power Down Counter of WDOG is enabled (Default). - */ -#define WDOG_WMCR_PDE(x) (((uint16_t)(((uint16_t)(x)) << WDOG_WMCR_PDE_SHIFT)) & WDOG_WMCR_PDE_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group WDOG_Register_Masks */ - - -/* WDOG - Peripheral instance base addresses */ -/** Peripheral WDOG1 base address */ -#define WDOG1_BASE (0x400B8000u) -/** Peripheral WDOG1 base pointer */ -#define WDOG1 ((WDOG_Type *)WDOG1_BASE) -/** Peripheral WDOG2 base address */ -#define WDOG2_BASE (0x400D0000u) -/** Peripheral WDOG2 base pointer */ -#define WDOG2 ((WDOG_Type *)WDOG2_BASE) -/** Array initializer of WDOG peripheral base addresses */ -#define WDOG_BASE_ADDRS { 0u, WDOG1_BASE, WDOG2_BASE } -/** Array initializer of WDOG peripheral base pointers */ -#define WDOG_BASE_PTRS { (WDOG_Type *)0u, WDOG1, WDOG2 } -/** Interrupt vectors for the WDOG peripheral type */ -#define WDOG_IRQS { NotAvail_IRQn, WDOG1_IRQn, WDOG2_IRQn } - -/*! - * @} - */ /* end of group WDOG_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- XBARA Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XBARA_Peripheral_Access_Layer XBARA Peripheral Access Layer - * @{ - */ - -/** XBARA - Register Layout Typedef */ -typedef struct { - __IO uint16_t SEL0; /**< Crossbar A Select Register 0, offset: 0x0 */ - __IO uint16_t SEL1; /**< Crossbar A Select Register 1, offset: 0x2 */ - __IO uint16_t SEL2; /**< Crossbar A Select Register 2, offset: 0x4 */ - __IO uint16_t SEL3; /**< Crossbar A Select Register 3, offset: 0x6 */ - __IO uint16_t SEL4; /**< Crossbar A Select Register 4, offset: 0x8 */ - __IO uint16_t SEL5; /**< Crossbar A Select Register 5, offset: 0xA */ - __IO uint16_t SEL6; /**< Crossbar A Select Register 6, offset: 0xC */ - __IO uint16_t SEL7; /**< Crossbar A Select Register 7, offset: 0xE */ - __IO uint16_t SEL8; /**< Crossbar A Select Register 8, offset: 0x10 */ - __IO uint16_t SEL9; /**< Crossbar A Select Register 9, offset: 0x12 */ - __IO uint16_t SEL10; /**< Crossbar A Select Register 10, offset: 0x14 */ - __IO uint16_t SEL11; /**< Crossbar A Select Register 11, offset: 0x16 */ - __IO uint16_t SEL12; /**< Crossbar A Select Register 12, offset: 0x18 */ - __IO uint16_t SEL13; /**< Crossbar A Select Register 13, offset: 0x1A */ - __IO uint16_t SEL14; /**< Crossbar A Select Register 14, offset: 0x1C */ - __IO uint16_t SEL15; /**< Crossbar A Select Register 15, offset: 0x1E */ - __IO uint16_t SEL16; /**< Crossbar A Select Register 16, offset: 0x20 */ - __IO uint16_t SEL17; /**< Crossbar A Select Register 17, offset: 0x22 */ - __IO uint16_t SEL18; /**< Crossbar A Select Register 18, offset: 0x24 */ - __IO uint16_t SEL19; /**< Crossbar A Select Register 19, offset: 0x26 */ - __IO uint16_t SEL20; /**< Crossbar A Select Register 20, offset: 0x28 */ - __IO uint16_t SEL21; /**< Crossbar A Select Register 21, offset: 0x2A */ - __IO uint16_t SEL22; /**< Crossbar A Select Register 22, offset: 0x2C */ - __IO uint16_t SEL23; /**< Crossbar A Select Register 23, offset: 0x2E */ - __IO uint16_t SEL24; /**< Crossbar A Select Register 24, offset: 0x30 */ - __IO uint16_t SEL25; /**< Crossbar A Select Register 25, offset: 0x32 */ - __IO uint16_t SEL26; /**< Crossbar A Select Register 26, offset: 0x34 */ - __IO uint16_t SEL27; /**< Crossbar A Select Register 27, offset: 0x36 */ - __IO uint16_t SEL28; /**< Crossbar A Select Register 28, offset: 0x38 */ - __IO uint16_t SEL29; /**< Crossbar A Select Register 29, offset: 0x3A */ - __IO uint16_t SEL30; /**< Crossbar A Select Register 30, offset: 0x3C */ - __IO uint16_t SEL31; /**< Crossbar A Select Register 31, offset: 0x3E */ - __IO uint16_t SEL32; /**< Crossbar A Select Register 32, offset: 0x40 */ - __IO uint16_t SEL33; /**< Crossbar A Select Register 33, offset: 0x42 */ - __IO uint16_t SEL34; /**< Crossbar A Select Register 34, offset: 0x44 */ - __IO uint16_t SEL35; /**< Crossbar A Select Register 35, offset: 0x46 */ - __IO uint16_t SEL36; /**< Crossbar A Select Register 36, offset: 0x48 */ - __IO uint16_t SEL37; /**< Crossbar A Select Register 37, offset: 0x4A */ - __IO uint16_t SEL38; /**< Crossbar A Select Register 38, offset: 0x4C */ - __IO uint16_t SEL39; /**< Crossbar A Select Register 39, offset: 0x4E */ - __IO uint16_t SEL40; /**< Crossbar A Select Register 40, offset: 0x50 */ - __IO uint16_t SEL41; /**< Crossbar A Select Register 41, offset: 0x52 */ - __IO uint16_t SEL42; /**< Crossbar A Select Register 42, offset: 0x54 */ - __IO uint16_t SEL43; /**< Crossbar A Select Register 43, offset: 0x56 */ - __IO uint16_t SEL44; /**< Crossbar A Select Register 44, offset: 0x58 */ - __IO uint16_t SEL45; /**< Crossbar A Select Register 45, offset: 0x5A */ - __IO uint16_t SEL46; /**< Crossbar A Select Register 46, offset: 0x5C */ - __IO uint16_t SEL47; /**< Crossbar A Select Register 47, offset: 0x5E */ - __IO uint16_t SEL48; /**< Crossbar A Select Register 48, offset: 0x60 */ - __IO uint16_t SEL49; /**< Crossbar A Select Register 49, offset: 0x62 */ - __IO uint16_t SEL50; /**< Crossbar A Select Register 50, offset: 0x64 */ - __IO uint16_t SEL51; /**< Crossbar A Select Register 51, offset: 0x66 */ - __IO uint16_t SEL52; /**< Crossbar A Select Register 52, offset: 0x68 */ - __IO uint16_t SEL53; /**< Crossbar A Select Register 53, offset: 0x6A */ - __IO uint16_t SEL54; /**< Crossbar A Select Register 54, offset: 0x6C */ - __IO uint16_t SEL55; /**< Crossbar A Select Register 55, offset: 0x6E */ - __IO uint16_t SEL56; /**< Crossbar A Select Register 56, offset: 0x70 */ - __IO uint16_t SEL57; /**< Crossbar A Select Register 57, offset: 0x72 */ - __IO uint16_t SEL58; /**< Crossbar A Select Register 58, offset: 0x74 */ - __IO uint16_t SEL59; /**< Crossbar A Select Register 59, offset: 0x76 */ - __IO uint16_t SEL60; /**< Crossbar A Select Register 60, offset: 0x78 */ - __IO uint16_t SEL61; /**< Crossbar A Select Register 61, offset: 0x7A */ - __IO uint16_t SEL62; /**< Crossbar A Select Register 62, offset: 0x7C */ - __IO uint16_t SEL63; /**< Crossbar A Select Register 63, offset: 0x7E */ - __IO uint16_t SEL64; /**< Crossbar A Select Register 64, offset: 0x80 */ - __IO uint16_t SEL65; /**< Crossbar A Select Register 65, offset: 0x82 */ - __IO uint16_t CTRL0; /**< Crossbar A Control Register 0, offset: 0x84 */ - __IO uint16_t CTRL1; /**< Crossbar A Control Register 1, offset: 0x86 */ -} XBARA_Type; - -/* ---------------------------------------------------------------------------- - -- XBARA Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XBARA_Register_Masks XBARA Register Masks - * @{ - */ - -/*! @name SEL0 - Crossbar A Select Register 0 */ -/*! @{ */ - -#define XBARA_SEL0_SEL0_MASK (0x7FU) -#define XBARA_SEL0_SEL0_SHIFT (0U) -#define XBARA_SEL0_SEL0(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL0_SEL0_SHIFT)) & XBARA_SEL0_SEL0_MASK) - -#define XBARA_SEL0_SEL1_MASK (0x7F00U) -#define XBARA_SEL0_SEL1_SHIFT (8U) -#define XBARA_SEL0_SEL1(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL0_SEL1_SHIFT)) & XBARA_SEL0_SEL1_MASK) -/*! @} */ - -/*! @name SEL1 - Crossbar A Select Register 1 */ -/*! @{ */ - -#define XBARA_SEL1_SEL2_MASK (0x7FU) -#define XBARA_SEL1_SEL2_SHIFT (0U) -#define XBARA_SEL1_SEL2(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL1_SEL2_SHIFT)) & XBARA_SEL1_SEL2_MASK) - -#define XBARA_SEL1_SEL3_MASK (0x7F00U) -#define XBARA_SEL1_SEL3_SHIFT (8U) -#define XBARA_SEL1_SEL3(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL1_SEL3_SHIFT)) & XBARA_SEL1_SEL3_MASK) -/*! @} */ - -/*! @name SEL2 - Crossbar A Select Register 2 */ -/*! @{ */ - -#define XBARA_SEL2_SEL4_MASK (0x7FU) -#define XBARA_SEL2_SEL4_SHIFT (0U) -#define XBARA_SEL2_SEL4(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL2_SEL4_SHIFT)) & XBARA_SEL2_SEL4_MASK) - -#define XBARA_SEL2_SEL5_MASK (0x7F00U) -#define XBARA_SEL2_SEL5_SHIFT (8U) -#define XBARA_SEL2_SEL5(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL2_SEL5_SHIFT)) & XBARA_SEL2_SEL5_MASK) -/*! @} */ - -/*! @name SEL3 - Crossbar A Select Register 3 */ -/*! @{ */ - -#define XBARA_SEL3_SEL6_MASK (0x7FU) -#define XBARA_SEL3_SEL6_SHIFT (0U) -#define XBARA_SEL3_SEL6(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL3_SEL6_SHIFT)) & XBARA_SEL3_SEL6_MASK) - -#define XBARA_SEL3_SEL7_MASK (0x7F00U) -#define XBARA_SEL3_SEL7_SHIFT (8U) -#define XBARA_SEL3_SEL7(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL3_SEL7_SHIFT)) & XBARA_SEL3_SEL7_MASK) -/*! @} */ - -/*! @name SEL4 - Crossbar A Select Register 4 */ -/*! @{ */ - -#define XBARA_SEL4_SEL8_MASK (0x7FU) -#define XBARA_SEL4_SEL8_SHIFT (0U) -#define XBARA_SEL4_SEL8(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL4_SEL8_SHIFT)) & XBARA_SEL4_SEL8_MASK) - -#define XBARA_SEL4_SEL9_MASK (0x7F00U) -#define XBARA_SEL4_SEL9_SHIFT (8U) -#define XBARA_SEL4_SEL9(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL4_SEL9_SHIFT)) & XBARA_SEL4_SEL9_MASK) -/*! @} */ - -/*! @name SEL5 - Crossbar A Select Register 5 */ -/*! @{ */ - -#define XBARA_SEL5_SEL10_MASK (0x7FU) -#define XBARA_SEL5_SEL10_SHIFT (0U) -#define XBARA_SEL5_SEL10(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL5_SEL10_SHIFT)) & XBARA_SEL5_SEL10_MASK) - -#define XBARA_SEL5_SEL11_MASK (0x7F00U) -#define XBARA_SEL5_SEL11_SHIFT (8U) -#define XBARA_SEL5_SEL11(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL5_SEL11_SHIFT)) & XBARA_SEL5_SEL11_MASK) -/*! @} */ - -/*! @name SEL6 - Crossbar A Select Register 6 */ -/*! @{ */ - -#define XBARA_SEL6_SEL12_MASK (0x7FU) -#define XBARA_SEL6_SEL12_SHIFT (0U) -#define XBARA_SEL6_SEL12(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL6_SEL12_SHIFT)) & XBARA_SEL6_SEL12_MASK) - -#define XBARA_SEL6_SEL13_MASK (0x7F00U) -#define XBARA_SEL6_SEL13_SHIFT (8U) -#define XBARA_SEL6_SEL13(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL6_SEL13_SHIFT)) & XBARA_SEL6_SEL13_MASK) -/*! @} */ - -/*! @name SEL7 - Crossbar A Select Register 7 */ -/*! @{ */ - -#define XBARA_SEL7_SEL14_MASK (0x7FU) -#define XBARA_SEL7_SEL14_SHIFT (0U) -#define XBARA_SEL7_SEL14(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL7_SEL14_SHIFT)) & XBARA_SEL7_SEL14_MASK) - -#define XBARA_SEL7_SEL15_MASK (0x7F00U) -#define XBARA_SEL7_SEL15_SHIFT (8U) -#define XBARA_SEL7_SEL15(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL7_SEL15_SHIFT)) & XBARA_SEL7_SEL15_MASK) -/*! @} */ - -/*! @name SEL8 - Crossbar A Select Register 8 */ -/*! @{ */ - -#define XBARA_SEL8_SEL16_MASK (0x7FU) -#define XBARA_SEL8_SEL16_SHIFT (0U) -#define XBARA_SEL8_SEL16(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL8_SEL16_SHIFT)) & XBARA_SEL8_SEL16_MASK) - -#define XBARA_SEL8_SEL17_MASK (0x7F00U) -#define XBARA_SEL8_SEL17_SHIFT (8U) -#define XBARA_SEL8_SEL17(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL8_SEL17_SHIFT)) & XBARA_SEL8_SEL17_MASK) -/*! @} */ - -/*! @name SEL9 - Crossbar A Select Register 9 */ -/*! @{ */ - -#define XBARA_SEL9_SEL18_MASK (0x7FU) -#define XBARA_SEL9_SEL18_SHIFT (0U) -#define XBARA_SEL9_SEL18(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL9_SEL18_SHIFT)) & XBARA_SEL9_SEL18_MASK) - -#define XBARA_SEL9_SEL19_MASK (0x7F00U) -#define XBARA_SEL9_SEL19_SHIFT (8U) -#define XBARA_SEL9_SEL19(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL9_SEL19_SHIFT)) & XBARA_SEL9_SEL19_MASK) -/*! @} */ - -/*! @name SEL10 - Crossbar A Select Register 10 */ -/*! @{ */ - -#define XBARA_SEL10_SEL20_MASK (0x7FU) -#define XBARA_SEL10_SEL20_SHIFT (0U) -#define XBARA_SEL10_SEL20(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL10_SEL20_SHIFT)) & XBARA_SEL10_SEL20_MASK) - -#define XBARA_SEL10_SEL21_MASK (0x7F00U) -#define XBARA_SEL10_SEL21_SHIFT (8U) -#define XBARA_SEL10_SEL21(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL10_SEL21_SHIFT)) & XBARA_SEL10_SEL21_MASK) -/*! @} */ - -/*! @name SEL11 - Crossbar A Select Register 11 */ -/*! @{ */ - -#define XBARA_SEL11_SEL22_MASK (0x7FU) -#define XBARA_SEL11_SEL22_SHIFT (0U) -#define XBARA_SEL11_SEL22(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL11_SEL22_SHIFT)) & XBARA_SEL11_SEL22_MASK) - -#define XBARA_SEL11_SEL23_MASK (0x7F00U) -#define XBARA_SEL11_SEL23_SHIFT (8U) -#define XBARA_SEL11_SEL23(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL11_SEL23_SHIFT)) & XBARA_SEL11_SEL23_MASK) -/*! @} */ - -/*! @name SEL12 - Crossbar A Select Register 12 */ -/*! @{ */ - -#define XBARA_SEL12_SEL24_MASK (0x7FU) -#define XBARA_SEL12_SEL24_SHIFT (0U) -#define XBARA_SEL12_SEL24(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL12_SEL24_SHIFT)) & XBARA_SEL12_SEL24_MASK) - -#define XBARA_SEL12_SEL25_MASK (0x7F00U) -#define XBARA_SEL12_SEL25_SHIFT (8U) -#define XBARA_SEL12_SEL25(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL12_SEL25_SHIFT)) & XBARA_SEL12_SEL25_MASK) -/*! @} */ - -/*! @name SEL13 - Crossbar A Select Register 13 */ -/*! @{ */ - -#define XBARA_SEL13_SEL26_MASK (0x7FU) -#define XBARA_SEL13_SEL26_SHIFT (0U) -#define XBARA_SEL13_SEL26(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL13_SEL26_SHIFT)) & XBARA_SEL13_SEL26_MASK) - -#define XBARA_SEL13_SEL27_MASK (0x7F00U) -#define XBARA_SEL13_SEL27_SHIFT (8U) -#define XBARA_SEL13_SEL27(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL13_SEL27_SHIFT)) & XBARA_SEL13_SEL27_MASK) -/*! @} */ - -/*! @name SEL14 - Crossbar A Select Register 14 */ -/*! @{ */ - -#define XBARA_SEL14_SEL28_MASK (0x7FU) -#define XBARA_SEL14_SEL28_SHIFT (0U) -#define XBARA_SEL14_SEL28(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL14_SEL28_SHIFT)) & XBARA_SEL14_SEL28_MASK) - -#define XBARA_SEL14_SEL29_MASK (0x7F00U) -#define XBARA_SEL14_SEL29_SHIFT (8U) -#define XBARA_SEL14_SEL29(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL14_SEL29_SHIFT)) & XBARA_SEL14_SEL29_MASK) -/*! @} */ - -/*! @name SEL15 - Crossbar A Select Register 15 */ -/*! @{ */ - -#define XBARA_SEL15_SEL30_MASK (0x7FU) -#define XBARA_SEL15_SEL30_SHIFT (0U) -#define XBARA_SEL15_SEL30(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL15_SEL30_SHIFT)) & XBARA_SEL15_SEL30_MASK) - -#define XBARA_SEL15_SEL31_MASK (0x7F00U) -#define XBARA_SEL15_SEL31_SHIFT (8U) -#define XBARA_SEL15_SEL31(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL15_SEL31_SHIFT)) & XBARA_SEL15_SEL31_MASK) -/*! @} */ - -/*! @name SEL16 - Crossbar A Select Register 16 */ -/*! @{ */ - -#define XBARA_SEL16_SEL32_MASK (0x7FU) -#define XBARA_SEL16_SEL32_SHIFT (0U) -#define XBARA_SEL16_SEL32(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL16_SEL32_SHIFT)) & XBARA_SEL16_SEL32_MASK) - -#define XBARA_SEL16_SEL33_MASK (0x7F00U) -#define XBARA_SEL16_SEL33_SHIFT (8U) -#define XBARA_SEL16_SEL33(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL16_SEL33_SHIFT)) & XBARA_SEL16_SEL33_MASK) -/*! @} */ - -/*! @name SEL17 - Crossbar A Select Register 17 */ -/*! @{ */ - -#define XBARA_SEL17_SEL34_MASK (0x7FU) -#define XBARA_SEL17_SEL34_SHIFT (0U) -#define XBARA_SEL17_SEL34(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL17_SEL34_SHIFT)) & XBARA_SEL17_SEL34_MASK) - -#define XBARA_SEL17_SEL35_MASK (0x7F00U) -#define XBARA_SEL17_SEL35_SHIFT (8U) -#define XBARA_SEL17_SEL35(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL17_SEL35_SHIFT)) & XBARA_SEL17_SEL35_MASK) -/*! @} */ - -/*! @name SEL18 - Crossbar A Select Register 18 */ -/*! @{ */ - -#define XBARA_SEL18_SEL36_MASK (0x7FU) -#define XBARA_SEL18_SEL36_SHIFT (0U) -#define XBARA_SEL18_SEL36(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL18_SEL36_SHIFT)) & XBARA_SEL18_SEL36_MASK) - -#define XBARA_SEL18_SEL37_MASK (0x7F00U) -#define XBARA_SEL18_SEL37_SHIFT (8U) -#define XBARA_SEL18_SEL37(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL18_SEL37_SHIFT)) & XBARA_SEL18_SEL37_MASK) -/*! @} */ - -/*! @name SEL19 - Crossbar A Select Register 19 */ -/*! @{ */ - -#define XBARA_SEL19_SEL38_MASK (0x7FU) -#define XBARA_SEL19_SEL38_SHIFT (0U) -#define XBARA_SEL19_SEL38(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL19_SEL38_SHIFT)) & XBARA_SEL19_SEL38_MASK) - -#define XBARA_SEL19_SEL39_MASK (0x7F00U) -#define XBARA_SEL19_SEL39_SHIFT (8U) -#define XBARA_SEL19_SEL39(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL19_SEL39_SHIFT)) & XBARA_SEL19_SEL39_MASK) -/*! @} */ - -/*! @name SEL20 - Crossbar A Select Register 20 */ -/*! @{ */ - -#define XBARA_SEL20_SEL40_MASK (0x7FU) -#define XBARA_SEL20_SEL40_SHIFT (0U) -#define XBARA_SEL20_SEL40(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL20_SEL40_SHIFT)) & XBARA_SEL20_SEL40_MASK) - -#define XBARA_SEL20_SEL41_MASK (0x7F00U) -#define XBARA_SEL20_SEL41_SHIFT (8U) -#define XBARA_SEL20_SEL41(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL20_SEL41_SHIFT)) & XBARA_SEL20_SEL41_MASK) -/*! @} */ - -/*! @name SEL21 - Crossbar A Select Register 21 */ -/*! @{ */ - -#define XBARA_SEL21_SEL42_MASK (0x7FU) -#define XBARA_SEL21_SEL42_SHIFT (0U) -#define XBARA_SEL21_SEL42(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL21_SEL42_SHIFT)) & XBARA_SEL21_SEL42_MASK) - -#define XBARA_SEL21_SEL43_MASK (0x7F00U) -#define XBARA_SEL21_SEL43_SHIFT (8U) -#define XBARA_SEL21_SEL43(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL21_SEL43_SHIFT)) & XBARA_SEL21_SEL43_MASK) -/*! @} */ - -/*! @name SEL22 - Crossbar A Select Register 22 */ -/*! @{ */ - -#define XBARA_SEL22_SEL44_MASK (0x7FU) -#define XBARA_SEL22_SEL44_SHIFT (0U) -#define XBARA_SEL22_SEL44(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL22_SEL44_SHIFT)) & XBARA_SEL22_SEL44_MASK) - -#define XBARA_SEL22_SEL45_MASK (0x7F00U) -#define XBARA_SEL22_SEL45_SHIFT (8U) -#define XBARA_SEL22_SEL45(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL22_SEL45_SHIFT)) & XBARA_SEL22_SEL45_MASK) -/*! @} */ - -/*! @name SEL23 - Crossbar A Select Register 23 */ -/*! @{ */ - -#define XBARA_SEL23_SEL46_MASK (0x7FU) -#define XBARA_SEL23_SEL46_SHIFT (0U) -#define XBARA_SEL23_SEL46(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL23_SEL46_SHIFT)) & XBARA_SEL23_SEL46_MASK) - -#define XBARA_SEL23_SEL47_MASK (0x7F00U) -#define XBARA_SEL23_SEL47_SHIFT (8U) -#define XBARA_SEL23_SEL47(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL23_SEL47_SHIFT)) & XBARA_SEL23_SEL47_MASK) -/*! @} */ - -/*! @name SEL24 - Crossbar A Select Register 24 */ -/*! @{ */ - -#define XBARA_SEL24_SEL48_MASK (0x7FU) -#define XBARA_SEL24_SEL48_SHIFT (0U) -#define XBARA_SEL24_SEL48(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL24_SEL48_SHIFT)) & XBARA_SEL24_SEL48_MASK) - -#define XBARA_SEL24_SEL49_MASK (0x7F00U) -#define XBARA_SEL24_SEL49_SHIFT (8U) -#define XBARA_SEL24_SEL49(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL24_SEL49_SHIFT)) & XBARA_SEL24_SEL49_MASK) -/*! @} */ - -/*! @name SEL25 - Crossbar A Select Register 25 */ -/*! @{ */ - -#define XBARA_SEL25_SEL50_MASK (0x7FU) -#define XBARA_SEL25_SEL50_SHIFT (0U) -#define XBARA_SEL25_SEL50(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL25_SEL50_SHIFT)) & XBARA_SEL25_SEL50_MASK) - -#define XBARA_SEL25_SEL51_MASK (0x7F00U) -#define XBARA_SEL25_SEL51_SHIFT (8U) -#define XBARA_SEL25_SEL51(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL25_SEL51_SHIFT)) & XBARA_SEL25_SEL51_MASK) -/*! @} */ - -/*! @name SEL26 - Crossbar A Select Register 26 */ -/*! @{ */ - -#define XBARA_SEL26_SEL52_MASK (0x7FU) -#define XBARA_SEL26_SEL52_SHIFT (0U) -#define XBARA_SEL26_SEL52(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL26_SEL52_SHIFT)) & XBARA_SEL26_SEL52_MASK) - -#define XBARA_SEL26_SEL53_MASK (0x7F00U) -#define XBARA_SEL26_SEL53_SHIFT (8U) -#define XBARA_SEL26_SEL53(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL26_SEL53_SHIFT)) & XBARA_SEL26_SEL53_MASK) -/*! @} */ - -/*! @name SEL27 - Crossbar A Select Register 27 */ -/*! @{ */ - -#define XBARA_SEL27_SEL54_MASK (0x7FU) -#define XBARA_SEL27_SEL54_SHIFT (0U) -#define XBARA_SEL27_SEL54(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL27_SEL54_SHIFT)) & XBARA_SEL27_SEL54_MASK) - -#define XBARA_SEL27_SEL55_MASK (0x7F00U) -#define XBARA_SEL27_SEL55_SHIFT (8U) -#define XBARA_SEL27_SEL55(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL27_SEL55_SHIFT)) & XBARA_SEL27_SEL55_MASK) -/*! @} */ - -/*! @name SEL28 - Crossbar A Select Register 28 */ -/*! @{ */ - -#define XBARA_SEL28_SEL56_MASK (0x7FU) -#define XBARA_SEL28_SEL56_SHIFT (0U) -#define XBARA_SEL28_SEL56(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL28_SEL56_SHIFT)) & XBARA_SEL28_SEL56_MASK) - -#define XBARA_SEL28_SEL57_MASK (0x7F00U) -#define XBARA_SEL28_SEL57_SHIFT (8U) -#define XBARA_SEL28_SEL57(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL28_SEL57_SHIFT)) & XBARA_SEL28_SEL57_MASK) -/*! @} */ - -/*! @name SEL29 - Crossbar A Select Register 29 */ -/*! @{ */ - -#define XBARA_SEL29_SEL58_MASK (0x7FU) -#define XBARA_SEL29_SEL58_SHIFT (0U) -#define XBARA_SEL29_SEL58(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL29_SEL58_SHIFT)) & XBARA_SEL29_SEL58_MASK) - -#define XBARA_SEL29_SEL59_MASK (0x7F00U) -#define XBARA_SEL29_SEL59_SHIFT (8U) -#define XBARA_SEL29_SEL59(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL29_SEL59_SHIFT)) & XBARA_SEL29_SEL59_MASK) -/*! @} */ - -/*! @name SEL30 - Crossbar A Select Register 30 */ -/*! @{ */ - -#define XBARA_SEL30_SEL60_MASK (0x7FU) -#define XBARA_SEL30_SEL60_SHIFT (0U) -#define XBARA_SEL30_SEL60(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL30_SEL60_SHIFT)) & XBARA_SEL30_SEL60_MASK) - -#define XBARA_SEL30_SEL61_MASK (0x7F00U) -#define XBARA_SEL30_SEL61_SHIFT (8U) -#define XBARA_SEL30_SEL61(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL30_SEL61_SHIFT)) & XBARA_SEL30_SEL61_MASK) -/*! @} */ - -/*! @name SEL31 - Crossbar A Select Register 31 */ -/*! @{ */ - -#define XBARA_SEL31_SEL62_MASK (0x7FU) -#define XBARA_SEL31_SEL62_SHIFT (0U) -#define XBARA_SEL31_SEL62(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL31_SEL62_SHIFT)) & XBARA_SEL31_SEL62_MASK) - -#define XBARA_SEL31_SEL63_MASK (0x7F00U) -#define XBARA_SEL31_SEL63_SHIFT (8U) -#define XBARA_SEL31_SEL63(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL31_SEL63_SHIFT)) & XBARA_SEL31_SEL63_MASK) -/*! @} */ - -/*! @name SEL32 - Crossbar A Select Register 32 */ -/*! @{ */ - -#define XBARA_SEL32_SEL64_MASK (0x7FU) -#define XBARA_SEL32_SEL64_SHIFT (0U) -#define XBARA_SEL32_SEL64(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL32_SEL64_SHIFT)) & XBARA_SEL32_SEL64_MASK) - -#define XBARA_SEL32_SEL65_MASK (0x7F00U) -#define XBARA_SEL32_SEL65_SHIFT (8U) -#define XBARA_SEL32_SEL65(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL32_SEL65_SHIFT)) & XBARA_SEL32_SEL65_MASK) -/*! @} */ - -/*! @name SEL33 - Crossbar A Select Register 33 */ -/*! @{ */ - -#define XBARA_SEL33_SEL66_MASK (0x7FU) -#define XBARA_SEL33_SEL66_SHIFT (0U) -#define XBARA_SEL33_SEL66(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL33_SEL66_SHIFT)) & XBARA_SEL33_SEL66_MASK) - -#define XBARA_SEL33_SEL67_MASK (0x7F00U) -#define XBARA_SEL33_SEL67_SHIFT (8U) -#define XBARA_SEL33_SEL67(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL33_SEL67_SHIFT)) & XBARA_SEL33_SEL67_MASK) -/*! @} */ - -/*! @name SEL34 - Crossbar A Select Register 34 */ -/*! @{ */ - -#define XBARA_SEL34_SEL68_MASK (0x7FU) -#define XBARA_SEL34_SEL68_SHIFT (0U) -#define XBARA_SEL34_SEL68(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL34_SEL68_SHIFT)) & XBARA_SEL34_SEL68_MASK) - -#define XBARA_SEL34_SEL69_MASK (0x7F00U) -#define XBARA_SEL34_SEL69_SHIFT (8U) -#define XBARA_SEL34_SEL69(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL34_SEL69_SHIFT)) & XBARA_SEL34_SEL69_MASK) -/*! @} */ - -/*! @name SEL35 - Crossbar A Select Register 35 */ -/*! @{ */ - -#define XBARA_SEL35_SEL70_MASK (0x7FU) -#define XBARA_SEL35_SEL70_SHIFT (0U) -#define XBARA_SEL35_SEL70(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL35_SEL70_SHIFT)) & XBARA_SEL35_SEL70_MASK) - -#define XBARA_SEL35_SEL71_MASK (0x7F00U) -#define XBARA_SEL35_SEL71_SHIFT (8U) -#define XBARA_SEL35_SEL71(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL35_SEL71_SHIFT)) & XBARA_SEL35_SEL71_MASK) -/*! @} */ - -/*! @name SEL36 - Crossbar A Select Register 36 */ -/*! @{ */ - -#define XBARA_SEL36_SEL72_MASK (0x7FU) -#define XBARA_SEL36_SEL72_SHIFT (0U) -#define XBARA_SEL36_SEL72(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL36_SEL72_SHIFT)) & XBARA_SEL36_SEL72_MASK) - -#define XBARA_SEL36_SEL73_MASK (0x7F00U) -#define XBARA_SEL36_SEL73_SHIFT (8U) -#define XBARA_SEL36_SEL73(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL36_SEL73_SHIFT)) & XBARA_SEL36_SEL73_MASK) -/*! @} */ - -/*! @name SEL37 - Crossbar A Select Register 37 */ -/*! @{ */ - -#define XBARA_SEL37_SEL74_MASK (0x7FU) -#define XBARA_SEL37_SEL74_SHIFT (0U) -#define XBARA_SEL37_SEL74(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL37_SEL74_SHIFT)) & XBARA_SEL37_SEL74_MASK) - -#define XBARA_SEL37_SEL75_MASK (0x7F00U) -#define XBARA_SEL37_SEL75_SHIFT (8U) -#define XBARA_SEL37_SEL75(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL37_SEL75_SHIFT)) & XBARA_SEL37_SEL75_MASK) -/*! @} */ - -/*! @name SEL38 - Crossbar A Select Register 38 */ -/*! @{ */ - -#define XBARA_SEL38_SEL76_MASK (0x7FU) -#define XBARA_SEL38_SEL76_SHIFT (0U) -#define XBARA_SEL38_SEL76(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL38_SEL76_SHIFT)) & XBARA_SEL38_SEL76_MASK) - -#define XBARA_SEL38_SEL77_MASK (0x7F00U) -#define XBARA_SEL38_SEL77_SHIFT (8U) -#define XBARA_SEL38_SEL77(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL38_SEL77_SHIFT)) & XBARA_SEL38_SEL77_MASK) -/*! @} */ - -/*! @name SEL39 - Crossbar A Select Register 39 */ -/*! @{ */ - -#define XBARA_SEL39_SEL78_MASK (0x7FU) -#define XBARA_SEL39_SEL78_SHIFT (0U) -#define XBARA_SEL39_SEL78(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL39_SEL78_SHIFT)) & XBARA_SEL39_SEL78_MASK) - -#define XBARA_SEL39_SEL79_MASK (0x7F00U) -#define XBARA_SEL39_SEL79_SHIFT (8U) -#define XBARA_SEL39_SEL79(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL39_SEL79_SHIFT)) & XBARA_SEL39_SEL79_MASK) -/*! @} */ - -/*! @name SEL40 - Crossbar A Select Register 40 */ -/*! @{ */ - -#define XBARA_SEL40_SEL80_MASK (0x7FU) -#define XBARA_SEL40_SEL80_SHIFT (0U) -#define XBARA_SEL40_SEL80(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL40_SEL80_SHIFT)) & XBARA_SEL40_SEL80_MASK) - -#define XBARA_SEL40_SEL81_MASK (0x7F00U) -#define XBARA_SEL40_SEL81_SHIFT (8U) -#define XBARA_SEL40_SEL81(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL40_SEL81_SHIFT)) & XBARA_SEL40_SEL81_MASK) -/*! @} */ - -/*! @name SEL41 - Crossbar A Select Register 41 */ -/*! @{ */ - -#define XBARA_SEL41_SEL82_MASK (0x7FU) -#define XBARA_SEL41_SEL82_SHIFT (0U) -#define XBARA_SEL41_SEL82(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL41_SEL82_SHIFT)) & XBARA_SEL41_SEL82_MASK) - -#define XBARA_SEL41_SEL83_MASK (0x7F00U) -#define XBARA_SEL41_SEL83_SHIFT (8U) -#define XBARA_SEL41_SEL83(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL41_SEL83_SHIFT)) & XBARA_SEL41_SEL83_MASK) -/*! @} */ - -/*! @name SEL42 - Crossbar A Select Register 42 */ -/*! @{ */ - -#define XBARA_SEL42_SEL84_MASK (0x7FU) -#define XBARA_SEL42_SEL84_SHIFT (0U) -#define XBARA_SEL42_SEL84(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL42_SEL84_SHIFT)) & XBARA_SEL42_SEL84_MASK) - -#define XBARA_SEL42_SEL85_MASK (0x7F00U) -#define XBARA_SEL42_SEL85_SHIFT (8U) -#define XBARA_SEL42_SEL85(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL42_SEL85_SHIFT)) & XBARA_SEL42_SEL85_MASK) -/*! @} */ - -/*! @name SEL43 - Crossbar A Select Register 43 */ -/*! @{ */ - -#define XBARA_SEL43_SEL86_MASK (0x7FU) -#define XBARA_SEL43_SEL86_SHIFT (0U) -#define XBARA_SEL43_SEL86(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL43_SEL86_SHIFT)) & XBARA_SEL43_SEL86_MASK) - -#define XBARA_SEL43_SEL87_MASK (0x7F00U) -#define XBARA_SEL43_SEL87_SHIFT (8U) -#define XBARA_SEL43_SEL87(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL43_SEL87_SHIFT)) & XBARA_SEL43_SEL87_MASK) -/*! @} */ - -/*! @name SEL44 - Crossbar A Select Register 44 */ -/*! @{ */ - -#define XBARA_SEL44_SEL88_MASK (0x7FU) -#define XBARA_SEL44_SEL88_SHIFT (0U) -#define XBARA_SEL44_SEL88(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL44_SEL88_SHIFT)) & XBARA_SEL44_SEL88_MASK) - -#define XBARA_SEL44_SEL89_MASK (0x7F00U) -#define XBARA_SEL44_SEL89_SHIFT (8U) -#define XBARA_SEL44_SEL89(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL44_SEL89_SHIFT)) & XBARA_SEL44_SEL89_MASK) -/*! @} */ - -/*! @name SEL45 - Crossbar A Select Register 45 */ -/*! @{ */ - -#define XBARA_SEL45_SEL90_MASK (0x7FU) -#define XBARA_SEL45_SEL90_SHIFT (0U) -#define XBARA_SEL45_SEL90(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL45_SEL90_SHIFT)) & XBARA_SEL45_SEL90_MASK) - -#define XBARA_SEL45_SEL91_MASK (0x7F00U) -#define XBARA_SEL45_SEL91_SHIFT (8U) -#define XBARA_SEL45_SEL91(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL45_SEL91_SHIFT)) & XBARA_SEL45_SEL91_MASK) -/*! @} */ - -/*! @name SEL46 - Crossbar A Select Register 46 */ -/*! @{ */ - -#define XBARA_SEL46_SEL92_MASK (0x7FU) -#define XBARA_SEL46_SEL92_SHIFT (0U) -#define XBARA_SEL46_SEL92(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL46_SEL92_SHIFT)) & XBARA_SEL46_SEL92_MASK) - -#define XBARA_SEL46_SEL93_MASK (0x7F00U) -#define XBARA_SEL46_SEL93_SHIFT (8U) -#define XBARA_SEL46_SEL93(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL46_SEL93_SHIFT)) & XBARA_SEL46_SEL93_MASK) -/*! @} */ - -/*! @name SEL47 - Crossbar A Select Register 47 */ -/*! @{ */ - -#define XBARA_SEL47_SEL94_MASK (0x7FU) -#define XBARA_SEL47_SEL94_SHIFT (0U) -#define XBARA_SEL47_SEL94(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL47_SEL94_SHIFT)) & XBARA_SEL47_SEL94_MASK) - -#define XBARA_SEL47_SEL95_MASK (0x7F00U) -#define XBARA_SEL47_SEL95_SHIFT (8U) -#define XBARA_SEL47_SEL95(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL47_SEL95_SHIFT)) & XBARA_SEL47_SEL95_MASK) -/*! @} */ - -/*! @name SEL48 - Crossbar A Select Register 48 */ -/*! @{ */ - -#define XBARA_SEL48_SEL96_MASK (0x7FU) -#define XBARA_SEL48_SEL96_SHIFT (0U) -#define XBARA_SEL48_SEL96(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL48_SEL96_SHIFT)) & XBARA_SEL48_SEL96_MASK) - -#define XBARA_SEL48_SEL97_MASK (0x7F00U) -#define XBARA_SEL48_SEL97_SHIFT (8U) -#define XBARA_SEL48_SEL97(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL48_SEL97_SHIFT)) & XBARA_SEL48_SEL97_MASK) -/*! @} */ - -/*! @name SEL49 - Crossbar A Select Register 49 */ -/*! @{ */ - -#define XBARA_SEL49_SEL98_MASK (0x7FU) -#define XBARA_SEL49_SEL98_SHIFT (0U) -#define XBARA_SEL49_SEL98(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL49_SEL98_SHIFT)) & XBARA_SEL49_SEL98_MASK) - -#define XBARA_SEL49_SEL99_MASK (0x7F00U) -#define XBARA_SEL49_SEL99_SHIFT (8U) -#define XBARA_SEL49_SEL99(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL49_SEL99_SHIFT)) & XBARA_SEL49_SEL99_MASK) -/*! @} */ - -/*! @name SEL50 - Crossbar A Select Register 50 */ -/*! @{ */ - -#define XBARA_SEL50_SEL100_MASK (0x7FU) -#define XBARA_SEL50_SEL100_SHIFT (0U) -#define XBARA_SEL50_SEL100(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL50_SEL100_SHIFT)) & XBARA_SEL50_SEL100_MASK) - -#define XBARA_SEL50_SEL101_MASK (0x7F00U) -#define XBARA_SEL50_SEL101_SHIFT (8U) -#define XBARA_SEL50_SEL101(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL50_SEL101_SHIFT)) & XBARA_SEL50_SEL101_MASK) -/*! @} */ - -/*! @name SEL51 - Crossbar A Select Register 51 */ -/*! @{ */ - -#define XBARA_SEL51_SEL102_MASK (0x7FU) -#define XBARA_SEL51_SEL102_SHIFT (0U) -#define XBARA_SEL51_SEL102(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL51_SEL102_SHIFT)) & XBARA_SEL51_SEL102_MASK) - -#define XBARA_SEL51_SEL103_MASK (0x7F00U) -#define XBARA_SEL51_SEL103_SHIFT (8U) -#define XBARA_SEL51_SEL103(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL51_SEL103_SHIFT)) & XBARA_SEL51_SEL103_MASK) -/*! @} */ - -/*! @name SEL52 - Crossbar A Select Register 52 */ -/*! @{ */ - -#define XBARA_SEL52_SEL104_MASK (0x7FU) -#define XBARA_SEL52_SEL104_SHIFT (0U) -#define XBARA_SEL52_SEL104(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL52_SEL104_SHIFT)) & XBARA_SEL52_SEL104_MASK) - -#define XBARA_SEL52_SEL105_MASK (0x7F00U) -#define XBARA_SEL52_SEL105_SHIFT (8U) -#define XBARA_SEL52_SEL105(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL52_SEL105_SHIFT)) & XBARA_SEL52_SEL105_MASK) -/*! @} */ - -/*! @name SEL53 - Crossbar A Select Register 53 */ -/*! @{ */ - -#define XBARA_SEL53_SEL106_MASK (0x7FU) -#define XBARA_SEL53_SEL106_SHIFT (0U) -#define XBARA_SEL53_SEL106(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL53_SEL106_SHIFT)) & XBARA_SEL53_SEL106_MASK) - -#define XBARA_SEL53_SEL107_MASK (0x7F00U) -#define XBARA_SEL53_SEL107_SHIFT (8U) -#define XBARA_SEL53_SEL107(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL53_SEL107_SHIFT)) & XBARA_SEL53_SEL107_MASK) -/*! @} */ - -/*! @name SEL54 - Crossbar A Select Register 54 */ -/*! @{ */ - -#define XBARA_SEL54_SEL108_MASK (0x7FU) -#define XBARA_SEL54_SEL108_SHIFT (0U) -#define XBARA_SEL54_SEL108(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL54_SEL108_SHIFT)) & XBARA_SEL54_SEL108_MASK) - -#define XBARA_SEL54_SEL109_MASK (0x7F00U) -#define XBARA_SEL54_SEL109_SHIFT (8U) -#define XBARA_SEL54_SEL109(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL54_SEL109_SHIFT)) & XBARA_SEL54_SEL109_MASK) -/*! @} */ - -/*! @name SEL55 - Crossbar A Select Register 55 */ -/*! @{ */ - -#define XBARA_SEL55_SEL110_MASK (0x7FU) -#define XBARA_SEL55_SEL110_SHIFT (0U) -#define XBARA_SEL55_SEL110(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL55_SEL110_SHIFT)) & XBARA_SEL55_SEL110_MASK) - -#define XBARA_SEL55_SEL111_MASK (0x7F00U) -#define XBARA_SEL55_SEL111_SHIFT (8U) -#define XBARA_SEL55_SEL111(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL55_SEL111_SHIFT)) & XBARA_SEL55_SEL111_MASK) -/*! @} */ - -/*! @name SEL56 - Crossbar A Select Register 56 */ -/*! @{ */ - -#define XBARA_SEL56_SEL112_MASK (0x7FU) -#define XBARA_SEL56_SEL112_SHIFT (0U) -#define XBARA_SEL56_SEL112(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL56_SEL112_SHIFT)) & XBARA_SEL56_SEL112_MASK) - -#define XBARA_SEL56_SEL113_MASK (0x7F00U) -#define XBARA_SEL56_SEL113_SHIFT (8U) -#define XBARA_SEL56_SEL113(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL56_SEL113_SHIFT)) & XBARA_SEL56_SEL113_MASK) -/*! @} */ - -/*! @name SEL57 - Crossbar A Select Register 57 */ -/*! @{ */ - -#define XBARA_SEL57_SEL114_MASK (0x7FU) -#define XBARA_SEL57_SEL114_SHIFT (0U) -#define XBARA_SEL57_SEL114(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL57_SEL114_SHIFT)) & XBARA_SEL57_SEL114_MASK) - -#define XBARA_SEL57_SEL115_MASK (0x7F00U) -#define XBARA_SEL57_SEL115_SHIFT (8U) -#define XBARA_SEL57_SEL115(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL57_SEL115_SHIFT)) & XBARA_SEL57_SEL115_MASK) -/*! @} */ - -/*! @name SEL58 - Crossbar A Select Register 58 */ -/*! @{ */ - -#define XBARA_SEL58_SEL116_MASK (0x7FU) -#define XBARA_SEL58_SEL116_SHIFT (0U) -#define XBARA_SEL58_SEL116(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL58_SEL116_SHIFT)) & XBARA_SEL58_SEL116_MASK) - -#define XBARA_SEL58_SEL117_MASK (0x7F00U) -#define XBARA_SEL58_SEL117_SHIFT (8U) -#define XBARA_SEL58_SEL117(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL58_SEL117_SHIFT)) & XBARA_SEL58_SEL117_MASK) -/*! @} */ - -/*! @name SEL59 - Crossbar A Select Register 59 */ -/*! @{ */ - -#define XBARA_SEL59_SEL118_MASK (0x7FU) -#define XBARA_SEL59_SEL118_SHIFT (0U) -#define XBARA_SEL59_SEL118(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL59_SEL118_SHIFT)) & XBARA_SEL59_SEL118_MASK) - -#define XBARA_SEL59_SEL119_MASK (0x7F00U) -#define XBARA_SEL59_SEL119_SHIFT (8U) -#define XBARA_SEL59_SEL119(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL59_SEL119_SHIFT)) & XBARA_SEL59_SEL119_MASK) -/*! @} */ - -/*! @name SEL60 - Crossbar A Select Register 60 */ -/*! @{ */ - -#define XBARA_SEL60_SEL120_MASK (0x7FU) -#define XBARA_SEL60_SEL120_SHIFT (0U) -#define XBARA_SEL60_SEL120(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL60_SEL120_SHIFT)) & XBARA_SEL60_SEL120_MASK) - -#define XBARA_SEL60_SEL121_MASK (0x7F00U) -#define XBARA_SEL60_SEL121_SHIFT (8U) -#define XBARA_SEL60_SEL121(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL60_SEL121_SHIFT)) & XBARA_SEL60_SEL121_MASK) -/*! @} */ - -/*! @name SEL61 - Crossbar A Select Register 61 */ -/*! @{ */ - -#define XBARA_SEL61_SEL122_MASK (0x7FU) -#define XBARA_SEL61_SEL122_SHIFT (0U) -#define XBARA_SEL61_SEL122(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL61_SEL122_SHIFT)) & XBARA_SEL61_SEL122_MASK) - -#define XBARA_SEL61_SEL123_MASK (0x7F00U) -#define XBARA_SEL61_SEL123_SHIFT (8U) -#define XBARA_SEL61_SEL123(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL61_SEL123_SHIFT)) & XBARA_SEL61_SEL123_MASK) -/*! @} */ - -/*! @name SEL62 - Crossbar A Select Register 62 */ -/*! @{ */ - -#define XBARA_SEL62_SEL124_MASK (0x7FU) -#define XBARA_SEL62_SEL124_SHIFT (0U) -#define XBARA_SEL62_SEL124(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL62_SEL124_SHIFT)) & XBARA_SEL62_SEL124_MASK) - -#define XBARA_SEL62_SEL125_MASK (0x7F00U) -#define XBARA_SEL62_SEL125_SHIFT (8U) -#define XBARA_SEL62_SEL125(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL62_SEL125_SHIFT)) & XBARA_SEL62_SEL125_MASK) -/*! @} */ - -/*! @name SEL63 - Crossbar A Select Register 63 */ -/*! @{ */ - -#define XBARA_SEL63_SEL126_MASK (0x7FU) -#define XBARA_SEL63_SEL126_SHIFT (0U) -#define XBARA_SEL63_SEL126(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL63_SEL126_SHIFT)) & XBARA_SEL63_SEL126_MASK) - -#define XBARA_SEL63_SEL127_MASK (0x7F00U) -#define XBARA_SEL63_SEL127_SHIFT (8U) -#define XBARA_SEL63_SEL127(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL63_SEL127_SHIFT)) & XBARA_SEL63_SEL127_MASK) -/*! @} */ - -/*! @name SEL64 - Crossbar A Select Register 64 */ -/*! @{ */ - -#define XBARA_SEL64_SEL128_MASK (0x7FU) -#define XBARA_SEL64_SEL128_SHIFT (0U) -#define XBARA_SEL64_SEL128(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL64_SEL128_SHIFT)) & XBARA_SEL64_SEL128_MASK) - -#define XBARA_SEL64_SEL129_MASK (0x7F00U) -#define XBARA_SEL64_SEL129_SHIFT (8U) -#define XBARA_SEL64_SEL129(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL64_SEL129_SHIFT)) & XBARA_SEL64_SEL129_MASK) -/*! @} */ - -/*! @name SEL65 - Crossbar A Select Register 65 */ -/*! @{ */ - -#define XBARA_SEL65_SEL130_MASK (0x7FU) -#define XBARA_SEL65_SEL130_SHIFT (0U) -#define XBARA_SEL65_SEL130(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL65_SEL130_SHIFT)) & XBARA_SEL65_SEL130_MASK) - -#define XBARA_SEL65_SEL131_MASK (0x7F00U) -#define XBARA_SEL65_SEL131_SHIFT (8U) -#define XBARA_SEL65_SEL131(x) (((uint16_t)(((uint16_t)(x)) << XBARA_SEL65_SEL131_SHIFT)) & XBARA_SEL65_SEL131_MASK) -/*! @} */ - -/*! @name CTRL0 - Crossbar A Control Register 0 */ -/*! @{ */ - -#define XBARA_CTRL0_DEN0_MASK (0x1U) -#define XBARA_CTRL0_DEN0_SHIFT (0U) -/*! DEN0 - DMA Enable for XBAR_OUT0 - * 0b0..DMA disabled - * 0b1..DMA enabled - */ -#define XBARA_CTRL0_DEN0(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_DEN0_SHIFT)) & XBARA_CTRL0_DEN0_MASK) - -#define XBARA_CTRL0_IEN0_MASK (0x2U) -#define XBARA_CTRL0_IEN0_SHIFT (1U) -/*! IEN0 - Interrupt Enable for XBAR_OUT0 - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define XBARA_CTRL0_IEN0(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_IEN0_SHIFT)) & XBARA_CTRL0_IEN0_MASK) - -#define XBARA_CTRL0_EDGE0_MASK (0xCU) -#define XBARA_CTRL0_EDGE0_SHIFT (2U) -/*! EDGE0 - Active edge for edge detection on XBAR_OUT0 - * 0b00..STS0 never asserts - * 0b01..STS0 asserts on rising edges of XBAR_OUT0 - * 0b10..STS0 asserts on falling edges of XBAR_OUT0 - * 0b11..STS0 asserts on rising and falling edges of XBAR_OUT0 - */ -#define XBARA_CTRL0_EDGE0(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_EDGE0_SHIFT)) & XBARA_CTRL0_EDGE0_MASK) - -#define XBARA_CTRL0_STS0_MASK (0x10U) -#define XBARA_CTRL0_STS0_SHIFT (4U) -/*! STS0 - Edge detection status for XBAR_OUT0 - * 0b0..Active edge not yet detected on XBAR_OUT0 - * 0b1..Active edge detected on XBAR_OUT0 - */ -#define XBARA_CTRL0_STS0(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_STS0_SHIFT)) & XBARA_CTRL0_STS0_MASK) - -#define XBARA_CTRL0_DEN1_MASK (0x100U) -#define XBARA_CTRL0_DEN1_SHIFT (8U) -/*! DEN1 - DMA Enable for XBAR_OUT1 - * 0b0..DMA disabled - * 0b1..DMA enabled - */ -#define XBARA_CTRL0_DEN1(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_DEN1_SHIFT)) & XBARA_CTRL0_DEN1_MASK) - -#define XBARA_CTRL0_IEN1_MASK (0x200U) -#define XBARA_CTRL0_IEN1_SHIFT (9U) -/*! IEN1 - Interrupt Enable for XBAR_OUT1 - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define XBARA_CTRL0_IEN1(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_IEN1_SHIFT)) & XBARA_CTRL0_IEN1_MASK) - -#define XBARA_CTRL0_EDGE1_MASK (0xC00U) -#define XBARA_CTRL0_EDGE1_SHIFT (10U) -/*! EDGE1 - Active edge for edge detection on XBAR_OUT1 - * 0b00..STS1 never asserts - * 0b01..STS1 asserts on rising edges of XBAR_OUT1 - * 0b10..STS1 asserts on falling edges of XBAR_OUT1 - * 0b11..STS1 asserts on rising and falling edges of XBAR_OUT1 - */ -#define XBARA_CTRL0_EDGE1(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_EDGE1_SHIFT)) & XBARA_CTRL0_EDGE1_MASK) - -#define XBARA_CTRL0_STS1_MASK (0x1000U) -#define XBARA_CTRL0_STS1_SHIFT (12U) -/*! STS1 - Edge detection status for XBAR_OUT1 - * 0b0..Active edge not yet detected on XBAR_OUT1 - * 0b1..Active edge detected on XBAR_OUT1 - */ -#define XBARA_CTRL0_STS1(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL0_STS1_SHIFT)) & XBARA_CTRL0_STS1_MASK) -/*! @} */ - -/*! @name CTRL1 - Crossbar A Control Register 1 */ -/*! @{ */ - -#define XBARA_CTRL1_DEN2_MASK (0x1U) -#define XBARA_CTRL1_DEN2_SHIFT (0U) -/*! DEN2 - DMA Enable for XBAR_OUT2 - * 0b0..DMA disabled - * 0b1..DMA enabled - */ -#define XBARA_CTRL1_DEN2(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_DEN2_SHIFT)) & XBARA_CTRL1_DEN2_MASK) - -#define XBARA_CTRL1_IEN2_MASK (0x2U) -#define XBARA_CTRL1_IEN2_SHIFT (1U) -/*! IEN2 - Interrupt Enable for XBAR_OUT2 - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define XBARA_CTRL1_IEN2(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_IEN2_SHIFT)) & XBARA_CTRL1_IEN2_MASK) - -#define XBARA_CTRL1_EDGE2_MASK (0xCU) -#define XBARA_CTRL1_EDGE2_SHIFT (2U) -/*! EDGE2 - Active edge for edge detection on XBAR_OUT2 - * 0b00..STS2 never asserts - * 0b01..STS2 asserts on rising edges of XBAR_OUT2 - * 0b10..STS2 asserts on falling edges of XBAR_OUT2 - * 0b11..STS2 asserts on rising and falling edges of XBAR_OUT2 - */ -#define XBARA_CTRL1_EDGE2(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_EDGE2_SHIFT)) & XBARA_CTRL1_EDGE2_MASK) - -#define XBARA_CTRL1_STS2_MASK (0x10U) -#define XBARA_CTRL1_STS2_SHIFT (4U) -/*! STS2 - Edge detection status for XBAR_OUT2 - * 0b0..Active edge not yet detected on XBAR_OUT2 - * 0b1..Active edge detected on XBAR_OUT2 - */ -#define XBARA_CTRL1_STS2(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_STS2_SHIFT)) & XBARA_CTRL1_STS2_MASK) - -#define XBARA_CTRL1_DEN3_MASK (0x100U) -#define XBARA_CTRL1_DEN3_SHIFT (8U) -/*! DEN3 - DMA Enable for XBAR_OUT3 - * 0b0..DMA disabled - * 0b1..DMA enabled - */ -#define XBARA_CTRL1_DEN3(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_DEN3_SHIFT)) & XBARA_CTRL1_DEN3_MASK) - -#define XBARA_CTRL1_IEN3_MASK (0x200U) -#define XBARA_CTRL1_IEN3_SHIFT (9U) -/*! IEN3 - Interrupt Enable for XBAR_OUT3 - * 0b0..Interrupt disabled - * 0b1..Interrupt enabled - */ -#define XBARA_CTRL1_IEN3(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_IEN3_SHIFT)) & XBARA_CTRL1_IEN3_MASK) - -#define XBARA_CTRL1_EDGE3_MASK (0xC00U) -#define XBARA_CTRL1_EDGE3_SHIFT (10U) -/*! EDGE3 - Active edge for edge detection on XBAR_OUT3 - * 0b00..STS3 never asserts - * 0b01..STS3 asserts on rising edges of XBAR_OUT3 - * 0b10..STS3 asserts on falling edges of XBAR_OUT3 - * 0b11..STS3 asserts on rising and falling edges of XBAR_OUT3 - */ -#define XBARA_CTRL1_EDGE3(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_EDGE3_SHIFT)) & XBARA_CTRL1_EDGE3_MASK) - -#define XBARA_CTRL1_STS3_MASK (0x1000U) -#define XBARA_CTRL1_STS3_SHIFT (12U) -/*! STS3 - Edge detection status for XBAR_OUT3 - * 0b0..Active edge not yet detected on XBAR_OUT3 - * 0b1..Active edge detected on XBAR_OUT3 - */ -#define XBARA_CTRL1_STS3(x) (((uint16_t)(((uint16_t)(x)) << XBARA_CTRL1_STS3_SHIFT)) & XBARA_CTRL1_STS3_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group XBARA_Register_Masks */ - - -/* XBARA - Peripheral instance base addresses */ -/** Peripheral XBARA1 base address */ -#define XBARA1_BASE (0x403BC000u) -/** Peripheral XBARA1 base pointer */ -#define XBARA1 ((XBARA_Type *)XBARA1_BASE) -/** Array initializer of XBARA peripheral base addresses */ -#define XBARA_BASE_ADDRS { 0u, XBARA1_BASE } -/** Array initializer of XBARA peripheral base pointers */ -#define XBARA_BASE_PTRS { (XBARA_Type *)0u, XBARA1 } - -/*! - * @} - */ /* end of group XBARA_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- XBARB Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XBARB_Peripheral_Access_Layer XBARB Peripheral Access Layer - * @{ - */ - -/** XBARB - Register Layout Typedef */ -typedef struct { - __IO uint16_t SEL0; /**< Crossbar B Select Register 0, offset: 0x0 */ - __IO uint16_t SEL1; /**< Crossbar B Select Register 1, offset: 0x2 */ - __IO uint16_t SEL2; /**< Crossbar B Select Register 2, offset: 0x4 */ - __IO uint16_t SEL3; /**< Crossbar B Select Register 3, offset: 0x6 */ - __IO uint16_t SEL4; /**< Crossbar B Select Register 4, offset: 0x8 */ - __IO uint16_t SEL5; /**< Crossbar B Select Register 5, offset: 0xA */ - __IO uint16_t SEL6; /**< Crossbar B Select Register 6, offset: 0xC */ - __IO uint16_t SEL7; /**< Crossbar B Select Register 7, offset: 0xE */ -} XBARB_Type; - -/* ---------------------------------------------------------------------------- - -- XBARB Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XBARB_Register_Masks XBARB Register Masks - * @{ - */ - -/*! @name SEL0 - Crossbar B Select Register 0 */ -/*! @{ */ - -#define XBARB_SEL0_SEL0_MASK (0x3FU) -#define XBARB_SEL0_SEL0_SHIFT (0U) -#define XBARB_SEL0_SEL0(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL0_SEL0_SHIFT)) & XBARB_SEL0_SEL0_MASK) - -#define XBARB_SEL0_SEL1_MASK (0x3F00U) -#define XBARB_SEL0_SEL1_SHIFT (8U) -#define XBARB_SEL0_SEL1(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL0_SEL1_SHIFT)) & XBARB_SEL0_SEL1_MASK) -/*! @} */ - -/*! @name SEL1 - Crossbar B Select Register 1 */ -/*! @{ */ - -#define XBARB_SEL1_SEL2_MASK (0x3FU) -#define XBARB_SEL1_SEL2_SHIFT (0U) -#define XBARB_SEL1_SEL2(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL1_SEL2_SHIFT)) & XBARB_SEL1_SEL2_MASK) - -#define XBARB_SEL1_SEL3_MASK (0x3F00U) -#define XBARB_SEL1_SEL3_SHIFT (8U) -#define XBARB_SEL1_SEL3(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL1_SEL3_SHIFT)) & XBARB_SEL1_SEL3_MASK) -/*! @} */ - -/*! @name SEL2 - Crossbar B Select Register 2 */ -/*! @{ */ - -#define XBARB_SEL2_SEL4_MASK (0x3FU) -#define XBARB_SEL2_SEL4_SHIFT (0U) -#define XBARB_SEL2_SEL4(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL2_SEL4_SHIFT)) & XBARB_SEL2_SEL4_MASK) - -#define XBARB_SEL2_SEL5_MASK (0x3F00U) -#define XBARB_SEL2_SEL5_SHIFT (8U) -#define XBARB_SEL2_SEL5(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL2_SEL5_SHIFT)) & XBARB_SEL2_SEL5_MASK) -/*! @} */ - -/*! @name SEL3 - Crossbar B Select Register 3 */ -/*! @{ */ - -#define XBARB_SEL3_SEL6_MASK (0x3FU) -#define XBARB_SEL3_SEL6_SHIFT (0U) -#define XBARB_SEL3_SEL6(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL3_SEL6_SHIFT)) & XBARB_SEL3_SEL6_MASK) - -#define XBARB_SEL3_SEL7_MASK (0x3F00U) -#define XBARB_SEL3_SEL7_SHIFT (8U) -#define XBARB_SEL3_SEL7(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL3_SEL7_SHIFT)) & XBARB_SEL3_SEL7_MASK) -/*! @} */ - -/*! @name SEL4 - Crossbar B Select Register 4 */ -/*! @{ */ - -#define XBARB_SEL4_SEL8_MASK (0x3FU) -#define XBARB_SEL4_SEL8_SHIFT (0U) -#define XBARB_SEL4_SEL8(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL4_SEL8_SHIFT)) & XBARB_SEL4_SEL8_MASK) - -#define XBARB_SEL4_SEL9_MASK (0x3F00U) -#define XBARB_SEL4_SEL9_SHIFT (8U) -#define XBARB_SEL4_SEL9(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL4_SEL9_SHIFT)) & XBARB_SEL4_SEL9_MASK) -/*! @} */ - -/*! @name SEL5 - Crossbar B Select Register 5 */ -/*! @{ */ - -#define XBARB_SEL5_SEL10_MASK (0x3FU) -#define XBARB_SEL5_SEL10_SHIFT (0U) -#define XBARB_SEL5_SEL10(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL5_SEL10_SHIFT)) & XBARB_SEL5_SEL10_MASK) - -#define XBARB_SEL5_SEL11_MASK (0x3F00U) -#define XBARB_SEL5_SEL11_SHIFT (8U) -#define XBARB_SEL5_SEL11(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL5_SEL11_SHIFT)) & XBARB_SEL5_SEL11_MASK) -/*! @} */ - -/*! @name SEL6 - Crossbar B Select Register 6 */ -/*! @{ */ - -#define XBARB_SEL6_SEL12_MASK (0x3FU) -#define XBARB_SEL6_SEL12_SHIFT (0U) -#define XBARB_SEL6_SEL12(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL6_SEL12_SHIFT)) & XBARB_SEL6_SEL12_MASK) - -#define XBARB_SEL6_SEL13_MASK (0x3F00U) -#define XBARB_SEL6_SEL13_SHIFT (8U) -#define XBARB_SEL6_SEL13(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL6_SEL13_SHIFT)) & XBARB_SEL6_SEL13_MASK) -/*! @} */ - -/*! @name SEL7 - Crossbar B Select Register 7 */ -/*! @{ */ - -#define XBARB_SEL7_SEL14_MASK (0x3FU) -#define XBARB_SEL7_SEL14_SHIFT (0U) -#define XBARB_SEL7_SEL14(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL7_SEL14_SHIFT)) & XBARB_SEL7_SEL14_MASK) - -#define XBARB_SEL7_SEL15_MASK (0x3F00U) -#define XBARB_SEL7_SEL15_SHIFT (8U) -#define XBARB_SEL7_SEL15(x) (((uint16_t)(((uint16_t)(x)) << XBARB_SEL7_SEL15_SHIFT)) & XBARB_SEL7_SEL15_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group XBARB_Register_Masks */ - - -/* XBARB - Peripheral instance base addresses */ -/** Peripheral XBARB2 base address */ -#define XBARB2_BASE (0x403C0000u) -/** Peripheral XBARB2 base pointer */ -#define XBARB2 ((XBARB_Type *)XBARB2_BASE) -/** Peripheral XBARB3 base address */ -#define XBARB3_BASE (0x403C4000u) -/** Peripheral XBARB3 base pointer */ -#define XBARB3 ((XBARB_Type *)XBARB3_BASE) -/** Array initializer of XBARB peripheral base addresses */ -#define XBARB_BASE_ADDRS { 0u, 0u, XBARB2_BASE, XBARB3_BASE } -/** Array initializer of XBARB peripheral base pointers */ -#define XBARB_BASE_PTRS { (XBARB_Type *)0u, (XBARB_Type *)0u, XBARB2, XBARB3 } - -/*! - * @} - */ /* end of group XBARB_Peripheral_Access_Layer */ - - -/* ---------------------------------------------------------------------------- - -- XTALOSC24M Peripheral Access Layer - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XTALOSC24M_Peripheral_Access_Layer XTALOSC24M Peripheral Access Layer - * @{ - */ - -/** XTALOSC24M - Register Layout Typedef */ -typedef struct { - uint8_t RESERVED_0[336]; - __IO uint32_t MISC0; /**< Miscellaneous Register 0, offset: 0x150 */ - __IO uint32_t MISC0_SET; /**< Miscellaneous Register 0, offset: 0x154 */ - __IO uint32_t MISC0_CLR; /**< Miscellaneous Register 0, offset: 0x158 */ - __IO uint32_t MISC0_TOG; /**< Miscellaneous Register 0, offset: 0x15C */ - uint8_t RESERVED_1[272]; - __IO uint32_t LOWPWR_CTRL; /**< XTAL OSC (LP) Control Register, offset: 0x270 */ - __IO uint32_t LOWPWR_CTRL_SET; /**< XTAL OSC (LP) Control Register, offset: 0x274 */ - __IO uint32_t LOWPWR_CTRL_CLR; /**< XTAL OSC (LP) Control Register, offset: 0x278 */ - __IO uint32_t LOWPWR_CTRL_TOG; /**< XTAL OSC (LP) Control Register, offset: 0x27C */ - uint8_t RESERVED_2[32]; - __IO uint32_t OSC_CONFIG0; /**< XTAL OSC Configuration 0 Register, offset: 0x2A0 */ - __IO uint32_t OSC_CONFIG0_SET; /**< XTAL OSC Configuration 0 Register, offset: 0x2A4 */ - __IO uint32_t OSC_CONFIG0_CLR; /**< XTAL OSC Configuration 0 Register, offset: 0x2A8 */ - __IO uint32_t OSC_CONFIG0_TOG; /**< XTAL OSC Configuration 0 Register, offset: 0x2AC */ - __IO uint32_t OSC_CONFIG1; /**< XTAL OSC Configuration 1 Register, offset: 0x2B0 */ - __IO uint32_t OSC_CONFIG1_SET; /**< XTAL OSC Configuration 1 Register, offset: 0x2B4 */ - __IO uint32_t OSC_CONFIG1_CLR; /**< XTAL OSC Configuration 1 Register, offset: 0x2B8 */ - __IO uint32_t OSC_CONFIG1_TOG; /**< XTAL OSC Configuration 1 Register, offset: 0x2BC */ - __IO uint32_t OSC_CONFIG2; /**< XTAL OSC Configuration 2 Register, offset: 0x2C0 */ - __IO uint32_t OSC_CONFIG2_SET; /**< XTAL OSC Configuration 2 Register, offset: 0x2C4 */ - __IO uint32_t OSC_CONFIG2_CLR; /**< XTAL OSC Configuration 2 Register, offset: 0x2C8 */ - __IO uint32_t OSC_CONFIG2_TOG; /**< XTAL OSC Configuration 2 Register, offset: 0x2CC */ -} XTALOSC24M_Type; - -/* ---------------------------------------------------------------------------- - -- XTALOSC24M Register Masks - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup XTALOSC24M_Register_Masks XTALOSC24M Register Masks - * @{ - */ - -/*! @name MISC0 - Miscellaneous Register 0 */ -/*! @{ */ - -#define XTALOSC24M_MISC0_REFTOP_PWD_MASK (0x1U) -#define XTALOSC24M_MISC0_REFTOP_PWD_SHIFT (0U) -#define XTALOSC24M_MISC0_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_REFTOP_PWD_SHIFT)) & XTALOSC24M_MISC0_REFTOP_PWD_MASK) - -#define XTALOSC24M_MISC0_REFTOP_SELFBIASOFF_MASK (0x8U) -#define XTALOSC24M_MISC0_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define XTALOSC24M_MISC0_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_REFTOP_SELFBIASOFF_SHIFT)) & XTALOSC24M_MISC0_REFTOP_SELFBIASOFF_MASK) - -#define XTALOSC24M_MISC0_REFTOP_VBGADJ_MASK (0x70U) -#define XTALOSC24M_MISC0_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define XTALOSC24M_MISC0_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_REFTOP_VBGADJ_SHIFT)) & XTALOSC24M_MISC0_REFTOP_VBGADJ_MASK) - -#define XTALOSC24M_MISC0_REFTOP_VBGUP_MASK (0x80U) -#define XTALOSC24M_MISC0_REFTOP_VBGUP_SHIFT (7U) -#define XTALOSC24M_MISC0_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_REFTOP_VBGUP_SHIFT)) & XTALOSC24M_MISC0_REFTOP_VBGUP_MASK) - -#define XTALOSC24M_MISC0_STOP_MODE_CONFIG_MASK (0xC00U) -#define XTALOSC24M_MISC0_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define XTALOSC24M_MISC0_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_STOP_MODE_CONFIG_SHIFT)) & XTALOSC24M_MISC0_STOP_MODE_CONFIG_MASK) - -#define XTALOSC24M_MISC0_DISCON_HIGH_SNVS_MASK (0x1000U) -#define XTALOSC24M_MISC0_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define XTALOSC24M_MISC0_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_DISCON_HIGH_SNVS_SHIFT)) & XTALOSC24M_MISC0_DISCON_HIGH_SNVS_MASK) - -#define XTALOSC24M_MISC0_OSC_I_MASK (0x6000U) -#define XTALOSC24M_MISC0_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define XTALOSC24M_MISC0_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_OSC_I_SHIFT)) & XTALOSC24M_MISC0_OSC_I_MASK) - -#define XTALOSC24M_MISC0_OSC_XTALOK_MASK (0x8000U) -#define XTALOSC24M_MISC0_OSC_XTALOK_SHIFT (15U) -#define XTALOSC24M_MISC0_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_OSC_XTALOK_SHIFT)) & XTALOSC24M_MISC0_OSC_XTALOK_MASK) - -#define XTALOSC24M_MISC0_OSC_XTALOK_EN_MASK (0x10000U) -#define XTALOSC24M_MISC0_OSC_XTALOK_EN_SHIFT (16U) -#define XTALOSC24M_MISC0_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_OSC_XTALOK_EN_SHIFT)) & XTALOSC24M_MISC0_OSC_XTALOK_EN_MASK) - -#define XTALOSC24M_MISC0_CLKGATE_CTRL_MASK (0x2000000U) -#define XTALOSC24M_MISC0_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define XTALOSC24M_MISC0_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLKGATE_CTRL_SHIFT)) & XTALOSC24M_MISC0_CLKGATE_CTRL_MASK) - -#define XTALOSC24M_MISC0_CLKGATE_DELAY_MASK (0x1C000000U) -#define XTALOSC24M_MISC0_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define XTALOSC24M_MISC0_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLKGATE_DELAY_SHIFT)) & XTALOSC24M_MISC0_CLKGATE_DELAY_MASK) - -#define XTALOSC24M_MISC0_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define XTALOSC24M_MISC0_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define XTALOSC24M_MISC0_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_RTC_XTAL_SOURCE_SHIFT)) & XTALOSC24M_MISC0_RTC_XTAL_SOURCE_MASK) - -#define XTALOSC24M_MISC0_XTAL_24M_PWD_MASK (0x40000000U) -#define XTALOSC24M_MISC0_XTAL_24M_PWD_SHIFT (30U) -#define XTALOSC24M_MISC0_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_XTAL_24M_PWD_SHIFT)) & XTALOSC24M_MISC0_XTAL_24M_PWD_MASK) - -#define XTALOSC24M_MISC0_VID_PLL_PREDIV_MASK (0x80000000U) -#define XTALOSC24M_MISC0_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define XTALOSC24M_MISC0_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_VID_PLL_PREDIV_SHIFT)) & XTALOSC24M_MISC0_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_SET - Miscellaneous Register 0 */ -/*! @{ */ - -#define XTALOSC24M_MISC0_SET_REFTOP_PWD_MASK (0x1U) -#define XTALOSC24M_MISC0_SET_REFTOP_PWD_SHIFT (0U) -#define XTALOSC24M_MISC0_SET_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_REFTOP_PWD_SHIFT)) & XTALOSC24M_MISC0_SET_REFTOP_PWD_MASK) - -#define XTALOSC24M_MISC0_SET_REFTOP_SELFBIASOFF_MASK (0x8U) -#define XTALOSC24M_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define XTALOSC24M_MISC0_SET_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_REFTOP_SELFBIASOFF_SHIFT)) & XTALOSC24M_MISC0_SET_REFTOP_SELFBIASOFF_MASK) - -#define XTALOSC24M_MISC0_SET_REFTOP_VBGADJ_MASK (0x70U) -#define XTALOSC24M_MISC0_SET_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define XTALOSC24M_MISC0_SET_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_REFTOP_VBGADJ_SHIFT)) & XTALOSC24M_MISC0_SET_REFTOP_VBGADJ_MASK) - -#define XTALOSC24M_MISC0_SET_REFTOP_VBGUP_MASK (0x80U) -#define XTALOSC24M_MISC0_SET_REFTOP_VBGUP_SHIFT (7U) -#define XTALOSC24M_MISC0_SET_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_REFTOP_VBGUP_SHIFT)) & XTALOSC24M_MISC0_SET_REFTOP_VBGUP_MASK) - -#define XTALOSC24M_MISC0_SET_STOP_MODE_CONFIG_MASK (0xC00U) -#define XTALOSC24M_MISC0_SET_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define XTALOSC24M_MISC0_SET_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_STOP_MODE_CONFIG_SHIFT)) & XTALOSC24M_MISC0_SET_STOP_MODE_CONFIG_MASK) - -#define XTALOSC24M_MISC0_SET_DISCON_HIGH_SNVS_MASK (0x1000U) -#define XTALOSC24M_MISC0_SET_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define XTALOSC24M_MISC0_SET_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_DISCON_HIGH_SNVS_SHIFT)) & XTALOSC24M_MISC0_SET_DISCON_HIGH_SNVS_MASK) - -#define XTALOSC24M_MISC0_SET_OSC_I_MASK (0x6000U) -#define XTALOSC24M_MISC0_SET_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define XTALOSC24M_MISC0_SET_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_OSC_I_SHIFT)) & XTALOSC24M_MISC0_SET_OSC_I_MASK) - -#define XTALOSC24M_MISC0_SET_OSC_XTALOK_MASK (0x8000U) -#define XTALOSC24M_MISC0_SET_OSC_XTALOK_SHIFT (15U) -#define XTALOSC24M_MISC0_SET_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_OSC_XTALOK_SHIFT)) & XTALOSC24M_MISC0_SET_OSC_XTALOK_MASK) - -#define XTALOSC24M_MISC0_SET_OSC_XTALOK_EN_MASK (0x10000U) -#define XTALOSC24M_MISC0_SET_OSC_XTALOK_EN_SHIFT (16U) -#define XTALOSC24M_MISC0_SET_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_OSC_XTALOK_EN_SHIFT)) & XTALOSC24M_MISC0_SET_OSC_XTALOK_EN_MASK) - -#define XTALOSC24M_MISC0_SET_CLKGATE_CTRL_MASK (0x2000000U) -#define XTALOSC24M_MISC0_SET_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define XTALOSC24M_MISC0_SET_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_CLKGATE_CTRL_SHIFT)) & XTALOSC24M_MISC0_SET_CLKGATE_CTRL_MASK) - -#define XTALOSC24M_MISC0_SET_CLKGATE_DELAY_MASK (0x1C000000U) -#define XTALOSC24M_MISC0_SET_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define XTALOSC24M_MISC0_SET_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_CLKGATE_DELAY_SHIFT)) & XTALOSC24M_MISC0_SET_CLKGATE_DELAY_MASK) - -#define XTALOSC24M_MISC0_SET_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define XTALOSC24M_MISC0_SET_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define XTALOSC24M_MISC0_SET_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_RTC_XTAL_SOURCE_SHIFT)) & XTALOSC24M_MISC0_SET_RTC_XTAL_SOURCE_MASK) - -#define XTALOSC24M_MISC0_SET_XTAL_24M_PWD_MASK (0x40000000U) -#define XTALOSC24M_MISC0_SET_XTAL_24M_PWD_SHIFT (30U) -#define XTALOSC24M_MISC0_SET_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_XTAL_24M_PWD_SHIFT)) & XTALOSC24M_MISC0_SET_XTAL_24M_PWD_MASK) - -#define XTALOSC24M_MISC0_SET_VID_PLL_PREDIV_MASK (0x80000000U) -#define XTALOSC24M_MISC0_SET_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define XTALOSC24M_MISC0_SET_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_SET_VID_PLL_PREDIV_SHIFT)) & XTALOSC24M_MISC0_SET_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_CLR - Miscellaneous Register 0 */ -/*! @{ */ - -#define XTALOSC24M_MISC0_CLR_REFTOP_PWD_MASK (0x1U) -#define XTALOSC24M_MISC0_CLR_REFTOP_PWD_SHIFT (0U) -#define XTALOSC24M_MISC0_CLR_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_REFTOP_PWD_SHIFT)) & XTALOSC24M_MISC0_CLR_REFTOP_PWD_MASK) - -#define XTALOSC24M_MISC0_CLR_REFTOP_SELFBIASOFF_MASK (0x8U) -#define XTALOSC24M_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define XTALOSC24M_MISC0_CLR_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_REFTOP_SELFBIASOFF_SHIFT)) & XTALOSC24M_MISC0_CLR_REFTOP_SELFBIASOFF_MASK) - -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGADJ_MASK (0x70U) -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_REFTOP_VBGADJ_SHIFT)) & XTALOSC24M_MISC0_CLR_REFTOP_VBGADJ_MASK) - -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGUP_MASK (0x80U) -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGUP_SHIFT (7U) -#define XTALOSC24M_MISC0_CLR_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_REFTOP_VBGUP_SHIFT)) & XTALOSC24M_MISC0_CLR_REFTOP_VBGUP_MASK) - -#define XTALOSC24M_MISC0_CLR_STOP_MODE_CONFIG_MASK (0xC00U) -#define XTALOSC24M_MISC0_CLR_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define XTALOSC24M_MISC0_CLR_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_STOP_MODE_CONFIG_SHIFT)) & XTALOSC24M_MISC0_CLR_STOP_MODE_CONFIG_MASK) - -#define XTALOSC24M_MISC0_CLR_DISCON_HIGH_SNVS_MASK (0x1000U) -#define XTALOSC24M_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define XTALOSC24M_MISC0_CLR_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_DISCON_HIGH_SNVS_SHIFT)) & XTALOSC24M_MISC0_CLR_DISCON_HIGH_SNVS_MASK) - -#define XTALOSC24M_MISC0_CLR_OSC_I_MASK (0x6000U) -#define XTALOSC24M_MISC0_CLR_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define XTALOSC24M_MISC0_CLR_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_OSC_I_SHIFT)) & XTALOSC24M_MISC0_CLR_OSC_I_MASK) - -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK_MASK (0x8000U) -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK_SHIFT (15U) -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_OSC_XTALOK_SHIFT)) & XTALOSC24M_MISC0_CLR_OSC_XTALOK_MASK) - -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK_EN_MASK (0x10000U) -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK_EN_SHIFT (16U) -#define XTALOSC24M_MISC0_CLR_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_OSC_XTALOK_EN_SHIFT)) & XTALOSC24M_MISC0_CLR_OSC_XTALOK_EN_MASK) - -#define XTALOSC24M_MISC0_CLR_CLKGATE_CTRL_MASK (0x2000000U) -#define XTALOSC24M_MISC0_CLR_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define XTALOSC24M_MISC0_CLR_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_CLKGATE_CTRL_SHIFT)) & XTALOSC24M_MISC0_CLR_CLKGATE_CTRL_MASK) - -#define XTALOSC24M_MISC0_CLR_CLKGATE_DELAY_MASK (0x1C000000U) -#define XTALOSC24M_MISC0_CLR_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define XTALOSC24M_MISC0_CLR_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_CLKGATE_DELAY_SHIFT)) & XTALOSC24M_MISC0_CLR_CLKGATE_DELAY_MASK) - -#define XTALOSC24M_MISC0_CLR_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define XTALOSC24M_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define XTALOSC24M_MISC0_CLR_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_RTC_XTAL_SOURCE_SHIFT)) & XTALOSC24M_MISC0_CLR_RTC_XTAL_SOURCE_MASK) - -#define XTALOSC24M_MISC0_CLR_XTAL_24M_PWD_MASK (0x40000000U) -#define XTALOSC24M_MISC0_CLR_XTAL_24M_PWD_SHIFT (30U) -#define XTALOSC24M_MISC0_CLR_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_XTAL_24M_PWD_SHIFT)) & XTALOSC24M_MISC0_CLR_XTAL_24M_PWD_MASK) - -#define XTALOSC24M_MISC0_CLR_VID_PLL_PREDIV_MASK (0x80000000U) -#define XTALOSC24M_MISC0_CLR_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define XTALOSC24M_MISC0_CLR_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_CLR_VID_PLL_PREDIV_SHIFT)) & XTALOSC24M_MISC0_CLR_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name MISC0_TOG - Miscellaneous Register 0 */ -/*! @{ */ - -#define XTALOSC24M_MISC0_TOG_REFTOP_PWD_MASK (0x1U) -#define XTALOSC24M_MISC0_TOG_REFTOP_PWD_SHIFT (0U) -#define XTALOSC24M_MISC0_TOG_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_REFTOP_PWD_SHIFT)) & XTALOSC24M_MISC0_TOG_REFTOP_PWD_MASK) - -#define XTALOSC24M_MISC0_TOG_REFTOP_SELFBIASOFF_MASK (0x8U) -#define XTALOSC24M_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT (3U) -/*! REFTOP_SELFBIASOFF - * 0b0..Uses coarse bias currents for startup - * 0b1..Uses bandgap-based bias currents for best performance. - */ -#define XTALOSC24M_MISC0_TOG_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_REFTOP_SELFBIASOFF_SHIFT)) & XTALOSC24M_MISC0_TOG_REFTOP_SELFBIASOFF_MASK) - -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGADJ_MASK (0x70U) -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGADJ_SHIFT (4U) -/*! REFTOP_VBGADJ - * 0b000..Nominal VBG - * 0b001..VBG+0.78% - * 0b010..VBG+1.56% - * 0b011..VBG+2.34% - * 0b100..VBG-0.78% - * 0b101..VBG-1.56% - * 0b110..VBG-2.34% - * 0b111..VBG-3.12% - */ -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_REFTOP_VBGADJ_SHIFT)) & XTALOSC24M_MISC0_TOG_REFTOP_VBGADJ_MASK) - -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGUP_MASK (0x80U) -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGUP_SHIFT (7U) -#define XTALOSC24M_MISC0_TOG_REFTOP_VBGUP(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_REFTOP_VBGUP_SHIFT)) & XTALOSC24M_MISC0_TOG_REFTOP_VBGUP_MASK) - -#define XTALOSC24M_MISC0_TOG_STOP_MODE_CONFIG_MASK (0xC00U) -#define XTALOSC24M_MISC0_TOG_STOP_MODE_CONFIG_SHIFT (10U) -/*! STOP_MODE_CONFIG - * 0b00..All analog except rtc powered down on stop mode assertion. XtalOsc=on, RCOsc=off; - * 0b01..Certain analog functions such as certain regulators left up. XtalOsc=on, RCOsc=off; - * 0b10..XtalOsc=off, RCOsc=on, Old BG=on, New BG=off. - * 0b11..XtalOsc=off, RCOsc=on, Old BG=off, New BG=on. - */ -#define XTALOSC24M_MISC0_TOG_STOP_MODE_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_STOP_MODE_CONFIG_SHIFT)) & XTALOSC24M_MISC0_TOG_STOP_MODE_CONFIG_MASK) - -#define XTALOSC24M_MISC0_TOG_DISCON_HIGH_SNVS_MASK (0x1000U) -#define XTALOSC24M_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT (12U) -/*! DISCON_HIGH_SNVS - * 0b0..Turn on the switch - * 0b1..Turn off the switch - */ -#define XTALOSC24M_MISC0_TOG_DISCON_HIGH_SNVS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_DISCON_HIGH_SNVS_SHIFT)) & XTALOSC24M_MISC0_TOG_DISCON_HIGH_SNVS_MASK) - -#define XTALOSC24M_MISC0_TOG_OSC_I_MASK (0x6000U) -#define XTALOSC24M_MISC0_TOG_OSC_I_SHIFT (13U) -/*! OSC_I - * 0b00..Nominal - * 0b01..Decrease current by 12.5% - * 0b10..Decrease current by 25.0% - * 0b11..Decrease current by 37.5% - */ -#define XTALOSC24M_MISC0_TOG_OSC_I(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_OSC_I_SHIFT)) & XTALOSC24M_MISC0_TOG_OSC_I_MASK) - -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK_MASK (0x8000U) -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK_SHIFT (15U) -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_OSC_XTALOK_SHIFT)) & XTALOSC24M_MISC0_TOG_OSC_XTALOK_MASK) - -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK_EN_MASK (0x10000U) -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK_EN_SHIFT (16U) -#define XTALOSC24M_MISC0_TOG_OSC_XTALOK_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_OSC_XTALOK_EN_SHIFT)) & XTALOSC24M_MISC0_TOG_OSC_XTALOK_EN_MASK) - -#define XTALOSC24M_MISC0_TOG_CLKGATE_CTRL_MASK (0x2000000U) -#define XTALOSC24M_MISC0_TOG_CLKGATE_CTRL_SHIFT (25U) -/*! CLKGATE_CTRL - * 0b0..Allow the logic to automatically gate the clock when the XTAL is powered down. - * 0b1..Prevent the logic from ever gating off the clock. - */ -#define XTALOSC24M_MISC0_TOG_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_CLKGATE_CTRL_SHIFT)) & XTALOSC24M_MISC0_TOG_CLKGATE_CTRL_MASK) - -#define XTALOSC24M_MISC0_TOG_CLKGATE_DELAY_MASK (0x1C000000U) -#define XTALOSC24M_MISC0_TOG_CLKGATE_DELAY_SHIFT (26U) -/*! CLKGATE_DELAY - * 0b000..0.5ms - * 0b001..1.0ms - * 0b010..2.0ms - * 0b011..3.0ms - * 0b100..4.0ms - * 0b101..5.0ms - * 0b110..6.0ms - * 0b111..7.0ms - */ -#define XTALOSC24M_MISC0_TOG_CLKGATE_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_CLKGATE_DELAY_SHIFT)) & XTALOSC24M_MISC0_TOG_CLKGATE_DELAY_MASK) - -#define XTALOSC24M_MISC0_TOG_RTC_XTAL_SOURCE_MASK (0x20000000U) -#define XTALOSC24M_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT (29U) -/*! RTC_XTAL_SOURCE - * 0b0..Internal ring oscillator - * 0b1..RTC_XTAL - */ -#define XTALOSC24M_MISC0_TOG_RTC_XTAL_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_RTC_XTAL_SOURCE_SHIFT)) & XTALOSC24M_MISC0_TOG_RTC_XTAL_SOURCE_MASK) - -#define XTALOSC24M_MISC0_TOG_XTAL_24M_PWD_MASK (0x40000000U) -#define XTALOSC24M_MISC0_TOG_XTAL_24M_PWD_SHIFT (30U) -#define XTALOSC24M_MISC0_TOG_XTAL_24M_PWD(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_XTAL_24M_PWD_SHIFT)) & XTALOSC24M_MISC0_TOG_XTAL_24M_PWD_MASK) - -#define XTALOSC24M_MISC0_TOG_VID_PLL_PREDIV_MASK (0x80000000U) -#define XTALOSC24M_MISC0_TOG_VID_PLL_PREDIV_SHIFT (31U) -/*! VID_PLL_PREDIV - * 0b0..Divide by 1 - * 0b1..Divide by 2 - */ -#define XTALOSC24M_MISC0_TOG_VID_PLL_PREDIV(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_MISC0_TOG_VID_PLL_PREDIV_SHIFT)) & XTALOSC24M_MISC0_TOG_VID_PLL_PREDIV_MASK) -/*! @} */ - -/*! @name LOWPWR_CTRL - XTAL OSC (LP) Control Register */ -/*! @{ */ - -#define XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_MASK (0x1U) -#define XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_SHIFT (0U) -/*! RC_OSC_EN - * 0b0..Use XTAL OSC to source the 24MHz clock - * 0b1..Use RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_OSC_SEL_MASK (0x10U) -#define XTALOSC24M_LOWPWR_CTRL_OSC_SEL_SHIFT (4U) -/*! OSC_SEL - * 0b0..XTAL OSC - * 0b1..RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_OSC_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_OSC_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_OSC_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_LPBG_SEL_MASK (0x20U) -#define XTALOSC24M_LOWPWR_CTRL_LPBG_SEL_SHIFT (5U) -/*! LPBG_SEL - * 0b0..Normal power bandgap - * 0b1..Low power bandgap - */ -#define XTALOSC24M_LOWPWR_CTRL_LPBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_LPBG_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_LPBG_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_LPBG_TEST_MASK (0x40U) -#define XTALOSC24M_LOWPWR_CTRL_LPBG_TEST_SHIFT (6U) -#define XTALOSC24M_LOWPWR_CTRL_LPBG_TEST(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_LPBG_TEST_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_LPBG_TEST_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_REFTOP_IBIAS_OFF_MASK (0x80U) -#define XTALOSC24M_LOWPWR_CTRL_REFTOP_IBIAS_OFF_SHIFT (7U) -#define XTALOSC24M_LOWPWR_CTRL_REFTOP_IBIAS_OFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_REFTOP_IBIAS_OFF_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_REFTOP_IBIAS_OFF_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_L1_PWRGATE_MASK (0x100U) -#define XTALOSC24M_LOWPWR_CTRL_L1_PWRGATE_SHIFT (8U) -#define XTALOSC24M_LOWPWR_CTRL_L1_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_L1_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_L1_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_L2_PWRGATE_MASK (0x200U) -#define XTALOSC24M_LOWPWR_CTRL_L2_PWRGATE_SHIFT (9U) -#define XTALOSC24M_LOWPWR_CTRL_L2_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_L2_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_L2_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CPU_PWRGATE_MASK (0x400U) -#define XTALOSC24M_LOWPWR_CTRL_CPU_PWRGATE_SHIFT (10U) -#define XTALOSC24M_LOWPWR_CTRL_CPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CPU_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_DISPLAY_PWRGATE_MASK (0x800U) -#define XTALOSC24M_LOWPWR_CTRL_DISPLAY_PWRGATE_SHIFT (11U) -#define XTALOSC24M_LOWPWR_CTRL_DISPLAY_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_DISPLAY_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_DISPLAY_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_RCOSC_CG_OVERRIDE_MASK (0x2000U) -#define XTALOSC24M_LOWPWR_CTRL_RCOSC_CG_OVERRIDE_SHIFT (13U) -#define XTALOSC24M_LOWPWR_CTRL_RCOSC_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_RCOSC_CG_OVERRIDE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_RCOSC_CG_OVERRIDE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_DELAY_MASK (0xC000U) -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_DELAY_SHIFT (14U) -/*! XTALOSC_PWRUP_DELAY - * 0b00..0.25ms - * 0b01..0.5ms - * 0b10..1ms - * 0b11..2ms - */ -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_DELAY_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_DELAY_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT_MASK (0x10000U) -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT_SHIFT (16U) -/*! XTALOSC_PWRUP_STAT - * 0b0..Not stable - * 0b1..Stable and ready to use - */ -#define XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_MIX_PWRGATE_MASK (0x20000U) -#define XTALOSC24M_LOWPWR_CTRL_MIX_PWRGATE_SHIFT (17U) -#define XTALOSC24M_LOWPWR_CTRL_MIX_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_MIX_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_MIX_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_GPU_PWRGATE_MASK (0x40000U) -#define XTALOSC24M_LOWPWR_CTRL_GPU_PWRGATE_SHIFT (18U) -#define XTALOSC24M_LOWPWR_CTRL_GPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_GPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_GPU_PWRGATE_MASK) -/*! @} */ - -/*! @name LOWPWR_CTRL_SET - XTAL OSC (LP) Control Register */ -/*! @{ */ - -#define XTALOSC24M_LOWPWR_CTRL_SET_RC_OSC_EN_MASK (0x1U) -#define XTALOSC24M_LOWPWR_CTRL_SET_RC_OSC_EN_SHIFT (0U) -/*! RC_OSC_EN - * 0b0..Use XTAL OSC to source the 24MHz clock - * 0b1..Use RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_SET_RC_OSC_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_RC_OSC_EN_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_RC_OSC_EN_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL_MASK (0x10U) -#define XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL_SHIFT (4U) -/*! OSC_SEL - * 0b0..XTAL OSC - * 0b1..RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_SEL_MASK (0x20U) -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_SEL_SHIFT (5U) -/*! LPBG_SEL - * 0b0..Normal power bandgap - * 0b1..Low power bandgap - */ -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_LPBG_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_LPBG_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_TEST_MASK (0x40U) -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_TEST_SHIFT (6U) -#define XTALOSC24M_LOWPWR_CTRL_SET_LPBG_TEST(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_LPBG_TEST_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_LPBG_TEST_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_REFTOP_IBIAS_OFF_MASK (0x80U) -#define XTALOSC24M_LOWPWR_CTRL_SET_REFTOP_IBIAS_OFF_SHIFT (7U) -#define XTALOSC24M_LOWPWR_CTRL_SET_REFTOP_IBIAS_OFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_REFTOP_IBIAS_OFF_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_REFTOP_IBIAS_OFF_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_L1_PWRGATE_MASK (0x100U) -#define XTALOSC24M_LOWPWR_CTRL_SET_L1_PWRGATE_SHIFT (8U) -#define XTALOSC24M_LOWPWR_CTRL_SET_L1_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_L1_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_L1_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_L2_PWRGATE_MASK (0x200U) -#define XTALOSC24M_LOWPWR_CTRL_SET_L2_PWRGATE_SHIFT (9U) -#define XTALOSC24M_LOWPWR_CTRL_SET_L2_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_L2_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_L2_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_CPU_PWRGATE_MASK (0x400U) -#define XTALOSC24M_LOWPWR_CTRL_SET_CPU_PWRGATE_SHIFT (10U) -#define XTALOSC24M_LOWPWR_CTRL_SET_CPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_CPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_CPU_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_DISPLAY_PWRGATE_MASK (0x800U) -#define XTALOSC24M_LOWPWR_CTRL_SET_DISPLAY_PWRGATE_SHIFT (11U) -#define XTALOSC24M_LOWPWR_CTRL_SET_DISPLAY_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_DISPLAY_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_DISPLAY_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_RCOSC_CG_OVERRIDE_MASK (0x2000U) -#define XTALOSC24M_LOWPWR_CTRL_SET_RCOSC_CG_OVERRIDE_SHIFT (13U) -#define XTALOSC24M_LOWPWR_CTRL_SET_RCOSC_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_RCOSC_CG_OVERRIDE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_RCOSC_CG_OVERRIDE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_DELAY_MASK (0xC000U) -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_DELAY_SHIFT (14U) -/*! XTALOSC_PWRUP_DELAY - * 0b00..0.25ms - * 0b01..0.5ms - * 0b10..1ms - * 0b11..2ms - */ -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_DELAY_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_DELAY_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_STAT_MASK (0x10000U) -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_STAT_SHIFT (16U) -/*! XTALOSC_PWRUP_STAT - * 0b0..Not stable - * 0b1..Stable and ready to use - */ -#define XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_STAT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_STAT_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_XTALOSC_PWRUP_STAT_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_MIX_PWRGATE_MASK (0x20000U) -#define XTALOSC24M_LOWPWR_CTRL_SET_MIX_PWRGATE_SHIFT (17U) -#define XTALOSC24M_LOWPWR_CTRL_SET_MIX_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_MIX_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_MIX_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_SET_GPU_PWRGATE_MASK (0x40000U) -#define XTALOSC24M_LOWPWR_CTRL_SET_GPU_PWRGATE_SHIFT (18U) -#define XTALOSC24M_LOWPWR_CTRL_SET_GPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_SET_GPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_SET_GPU_PWRGATE_MASK) -/*! @} */ - -/*! @name LOWPWR_CTRL_CLR - XTAL OSC (LP) Control Register */ -/*! @{ */ - -#define XTALOSC24M_LOWPWR_CTRL_CLR_RC_OSC_EN_MASK (0x1U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_RC_OSC_EN_SHIFT (0U) -/*! RC_OSC_EN - * 0b0..Use XTAL OSC to source the 24MHz clock - * 0b1..Use RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_CLR_RC_OSC_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_RC_OSC_EN_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_RC_OSC_EN_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL_MASK (0x10U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL_SHIFT (4U) -/*! OSC_SEL - * 0b0..XTAL OSC - * 0b1..RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_SEL_MASK (0x20U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_SEL_SHIFT (5U) -/*! LPBG_SEL - * 0b0..Normal power bandgap - * 0b1..Low power bandgap - */ -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_TEST_MASK (0x40U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_TEST_SHIFT (6U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_TEST(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_TEST_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_LPBG_TEST_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_REFTOP_IBIAS_OFF_MASK (0x80U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_REFTOP_IBIAS_OFF_SHIFT (7U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_REFTOP_IBIAS_OFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_REFTOP_IBIAS_OFF_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_REFTOP_IBIAS_OFF_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_L1_PWRGATE_MASK (0x100U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_L1_PWRGATE_SHIFT (8U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_L1_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_L1_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_L1_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_L2_PWRGATE_MASK (0x200U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_L2_PWRGATE_SHIFT (9U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_L2_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_L2_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_L2_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_CPU_PWRGATE_MASK (0x400U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_CPU_PWRGATE_SHIFT (10U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_CPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_CPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_CPU_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_DISPLAY_PWRGATE_MASK (0x800U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_DISPLAY_PWRGATE_SHIFT (11U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_DISPLAY_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_DISPLAY_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_DISPLAY_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_RCOSC_CG_OVERRIDE_MASK (0x2000U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_RCOSC_CG_OVERRIDE_SHIFT (13U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_RCOSC_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_RCOSC_CG_OVERRIDE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_RCOSC_CG_OVERRIDE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_DELAY_MASK (0xC000U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_DELAY_SHIFT (14U) -/*! XTALOSC_PWRUP_DELAY - * 0b00..0.25ms - * 0b01..0.5ms - * 0b10..1ms - * 0b11..2ms - */ -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_DELAY_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_DELAY_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_STAT_MASK (0x10000U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_STAT_SHIFT (16U) -/*! XTALOSC_PWRUP_STAT - * 0b0..Not stable - * 0b1..Stable and ready to use - */ -#define XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_STAT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_STAT_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_XTALOSC_PWRUP_STAT_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_MIX_PWRGATE_MASK (0x20000U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_MIX_PWRGATE_SHIFT (17U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_MIX_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_MIX_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_MIX_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_CLR_GPU_PWRGATE_MASK (0x40000U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_GPU_PWRGATE_SHIFT (18U) -#define XTALOSC24M_LOWPWR_CTRL_CLR_GPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_CLR_GPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_CLR_GPU_PWRGATE_MASK) -/*! @} */ - -/*! @name LOWPWR_CTRL_TOG - XTAL OSC (LP) Control Register */ -/*! @{ */ - -#define XTALOSC24M_LOWPWR_CTRL_TOG_RC_OSC_EN_MASK (0x1U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_RC_OSC_EN_SHIFT (0U) -/*! RC_OSC_EN - * 0b0..Use XTAL OSC to source the 24MHz clock - * 0b1..Use RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_TOG_RC_OSC_EN(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_RC_OSC_EN_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_RC_OSC_EN_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_OSC_SEL_MASK (0x10U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_OSC_SEL_SHIFT (4U) -/*! OSC_SEL - * 0b0..XTAL OSC - * 0b1..RC OSC - */ -#define XTALOSC24M_LOWPWR_CTRL_TOG_OSC_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_OSC_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_OSC_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_SEL_MASK (0x20U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_SEL_SHIFT (5U) -/*! LPBG_SEL - * 0b0..Normal power bandgap - * 0b1..Low power bandgap - */ -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_SEL_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_SEL_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_TEST_MASK (0x40U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_TEST_SHIFT (6U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_TEST(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_TEST_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_LPBG_TEST_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_REFTOP_IBIAS_OFF_MASK (0x80U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_REFTOP_IBIAS_OFF_SHIFT (7U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_REFTOP_IBIAS_OFF(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_REFTOP_IBIAS_OFF_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_REFTOP_IBIAS_OFF_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_L1_PWRGATE_MASK (0x100U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_L1_PWRGATE_SHIFT (8U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_L1_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_L1_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_L1_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_L2_PWRGATE_MASK (0x200U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_L2_PWRGATE_SHIFT (9U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_L2_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_L2_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_L2_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_CPU_PWRGATE_MASK (0x400U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_CPU_PWRGATE_SHIFT (10U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_CPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_CPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_CPU_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_DISPLAY_PWRGATE_MASK (0x800U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_DISPLAY_PWRGATE_SHIFT (11U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_DISPLAY_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_DISPLAY_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_DISPLAY_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_RCOSC_CG_OVERRIDE_MASK (0x2000U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_RCOSC_CG_OVERRIDE_SHIFT (13U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_RCOSC_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_RCOSC_CG_OVERRIDE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_RCOSC_CG_OVERRIDE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_DELAY_MASK (0xC000U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_DELAY_SHIFT (14U) -/*! XTALOSC_PWRUP_DELAY - * 0b00..0.25ms - * 0b01..0.5ms - * 0b10..1ms - * 0b11..2ms - */ -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_DELAY(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_DELAY_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_DELAY_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_STAT_MASK (0x10000U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_STAT_SHIFT (16U) -/*! XTALOSC_PWRUP_STAT - * 0b0..Not stable - * 0b1..Stable and ready to use - */ -#define XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_STAT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_STAT_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_XTALOSC_PWRUP_STAT_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_MIX_PWRGATE_MASK (0x20000U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_MIX_PWRGATE_SHIFT (17U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_MIX_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_MIX_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_MIX_PWRGATE_MASK) - -#define XTALOSC24M_LOWPWR_CTRL_TOG_GPU_PWRGATE_MASK (0x40000U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_GPU_PWRGATE_SHIFT (18U) -#define XTALOSC24M_LOWPWR_CTRL_TOG_GPU_PWRGATE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_LOWPWR_CTRL_TOG_GPU_PWRGATE_SHIFT)) & XTALOSC24M_LOWPWR_CTRL_TOG_GPU_PWRGATE_MASK) -/*! @} */ - -/*! @name OSC_CONFIG0 - XTAL OSC Configuration 0 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG0_START_MASK (0x1U) -#define XTALOSC24M_OSC_CONFIG0_START_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG0_START(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_START_SHIFT)) & XTALOSC24M_OSC_CONFIG0_START_MASK) - -#define XTALOSC24M_OSC_CONFIG0_ENABLE_MASK (0x2U) -#define XTALOSC24M_OSC_CONFIG0_ENABLE_SHIFT (1U) -#define XTALOSC24M_OSC_CONFIG0_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_ENABLE_SHIFT)) & XTALOSC24M_OSC_CONFIG0_ENABLE_MASK) - -#define XTALOSC24M_OSC_CONFIG0_BYPASS_MASK (0x4U) -#define XTALOSC24M_OSC_CONFIG0_BYPASS_SHIFT (2U) -#define XTALOSC24M_OSC_CONFIG0_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_BYPASS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_BYPASS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_INVERT_MASK (0x8U) -#define XTALOSC24M_OSC_CONFIG0_INVERT_SHIFT (3U) -#define XTALOSC24M_OSC_CONFIG0_INVERT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_INVERT_SHIFT)) & XTALOSC24M_OSC_CONFIG0_INVERT_MASK) - -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_MASK (0xFF0U) -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_SHIFT (4U) -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_SHIFT)) & XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_MASK) - -#define XTALOSC24M_OSC_CONFIG0_HYST_PLUS_MASK (0xF000U) -#define XTALOSC24M_OSC_CONFIG0_HYST_PLUS_SHIFT (12U) -#define XTALOSC24M_OSC_CONFIG0_HYST_PLUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_HYST_PLUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_HYST_PLUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_HYST_MINUS_MASK (0xF0000U) -#define XTALOSC24M_OSC_CONFIG0_HYST_MINUS_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG0_HYST_MINUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_HYST_MINUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_HYST_MINUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR_MASK (0xFF000000U) -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR_SHIFT (24U) -#define XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG0_SET - XTAL OSC Configuration 0 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG0_SET_START_MASK (0x1U) -#define XTALOSC24M_OSC_CONFIG0_SET_START_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG0_SET_START(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_START_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_START_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_ENABLE_MASK (0x2U) -#define XTALOSC24M_OSC_CONFIG0_SET_ENABLE_SHIFT (1U) -#define XTALOSC24M_OSC_CONFIG0_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_ENABLE_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_ENABLE_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_BYPASS_MASK (0x4U) -#define XTALOSC24M_OSC_CONFIG0_SET_BYPASS_SHIFT (2U) -#define XTALOSC24M_OSC_CONFIG0_SET_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_BYPASS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_BYPASS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_INVERT_MASK (0x8U) -#define XTALOSC24M_OSC_CONFIG0_SET_INVERT_SHIFT (3U) -#define XTALOSC24M_OSC_CONFIG0_SET_INVERT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_INVERT_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_INVERT_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_MASK (0xFF0U) -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_SHIFT (4U) -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_PLUS_MASK (0xF000U) -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_PLUS_SHIFT (12U) -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_PLUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_HYST_PLUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_HYST_PLUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS_MASK (0xF0000U) -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_CUR_MASK (0xFF000000U) -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_CUR_SHIFT (24U) -#define XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG0_SET_RC_OSC_PROG_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG0_CLR - XTAL OSC Configuration 0 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG0_CLR_START_MASK (0x1U) -#define XTALOSC24M_OSC_CONFIG0_CLR_START_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG0_CLR_START(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_START_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_START_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_ENABLE_MASK (0x2U) -#define XTALOSC24M_OSC_CONFIG0_CLR_ENABLE_SHIFT (1U) -#define XTALOSC24M_OSC_CONFIG0_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_ENABLE_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_ENABLE_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_BYPASS_MASK (0x4U) -#define XTALOSC24M_OSC_CONFIG0_CLR_BYPASS_SHIFT (2U) -#define XTALOSC24M_OSC_CONFIG0_CLR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_BYPASS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_BYPASS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_INVERT_MASK (0x8U) -#define XTALOSC24M_OSC_CONFIG0_CLR_INVERT_SHIFT (3U) -#define XTALOSC24M_OSC_CONFIG0_CLR_INVERT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_INVERT_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_INVERT_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_MASK (0xFF0U) -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_SHIFT (4U) -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_PLUS_MASK (0xF000U) -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_PLUS_SHIFT (12U) -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_PLUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_HYST_PLUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_HYST_PLUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_MINUS_MASK (0xF0000U) -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_MINUS_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG0_CLR_HYST_MINUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_HYST_MINUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_HYST_MINUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_CUR_MASK (0xFF000000U) -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_CUR_SHIFT (24U) -#define XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG0_CLR_RC_OSC_PROG_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG0_TOG - XTAL OSC Configuration 0 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG0_TOG_START_MASK (0x1U) -#define XTALOSC24M_OSC_CONFIG0_TOG_START_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG0_TOG_START(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_START_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_START_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_ENABLE_MASK (0x2U) -#define XTALOSC24M_OSC_CONFIG0_TOG_ENABLE_SHIFT (1U) -#define XTALOSC24M_OSC_CONFIG0_TOG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_ENABLE_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_ENABLE_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_BYPASS_MASK (0x4U) -#define XTALOSC24M_OSC_CONFIG0_TOG_BYPASS_SHIFT (2U) -#define XTALOSC24M_OSC_CONFIG0_TOG_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_BYPASS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_BYPASS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_INVERT_MASK (0x8U) -#define XTALOSC24M_OSC_CONFIG0_TOG_INVERT_SHIFT (3U) -#define XTALOSC24M_OSC_CONFIG0_TOG_INVERT(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_INVERT_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_INVERT_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_MASK (0xFF0U) -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_SHIFT (4U) -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_PLUS_MASK (0xF000U) -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_PLUS_SHIFT (12U) -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_PLUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_HYST_PLUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_HYST_PLUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_MINUS_MASK (0xF0000U) -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_MINUS_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG0_TOG_HYST_MINUS(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_HYST_MINUS_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_HYST_MINUS_MASK) - -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_CUR_MASK (0xFF000000U) -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_CUR_SHIFT (24U) -#define XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG0_TOG_RC_OSC_PROG_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG1 - XTAL OSC Configuration 1 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR_MASK (0xFFF00000U) -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR_SHIFT (20U) -#define XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG1_SET - XTAL OSC Configuration 1 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_CUR_MASK (0xFFF00000U) -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_CUR_SHIFT (20U) -#define XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG1_SET_COUNT_RC_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG1_CLR - XTAL OSC Configuration 1 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_CUR_MASK (0xFFF00000U) -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_CUR_SHIFT (20U) -#define XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG1_CLR_COUNT_RC_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG1_TOG - XTAL OSC Configuration 1 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_CUR_MASK (0xFFF00000U) -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_CUR_SHIFT (20U) -#define XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_CUR(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_CUR_SHIFT)) & XTALOSC24M_OSC_CONFIG1_TOG_COUNT_RC_CUR_MASK) -/*! @} */ - -/*! @name OSC_CONFIG2 - XTAL OSC Configuration 2 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG2_COUNT_1M_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG2_COUNT_1M_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG2_COUNT_1M_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_COUNT_1M_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG2_COUNT_1M_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK (0x10000U) -#define XTALOSC24M_OSC_CONFIG2_ENABLE_1M_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG2_ENABLE_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_ENABLE_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK (0x20000U) -#define XTALOSC24M_OSC_CONFIG2_MUX_1M_SHIFT (17U) -#define XTALOSC24M_OSC_CONFIG2_MUX_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_MUX_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_CLK_1M_ERR_FL_MASK (0x80000000U) -#define XTALOSC24M_OSC_CONFIG2_CLK_1M_ERR_FL_SHIFT (31U) -#define XTALOSC24M_OSC_CONFIG2_CLK_1M_ERR_FL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_CLK_1M_ERR_FL_SHIFT)) & XTALOSC24M_OSC_CONFIG2_CLK_1M_ERR_FL_MASK) -/*! @} */ - -/*! @name OSC_CONFIG2_SET - XTAL OSC Configuration 2 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG2_SET_COUNT_1M_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG2_SET_COUNT_1M_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG2_SET_COUNT_1M_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_SET_COUNT_1M_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG2_SET_COUNT_1M_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG2_SET_ENABLE_1M_MASK (0x10000U) -#define XTALOSC24M_OSC_CONFIG2_SET_ENABLE_1M_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG2_SET_ENABLE_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_SET_ENABLE_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_SET_ENABLE_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_SET_MUX_1M_MASK (0x20000U) -#define XTALOSC24M_OSC_CONFIG2_SET_MUX_1M_SHIFT (17U) -#define XTALOSC24M_OSC_CONFIG2_SET_MUX_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_SET_MUX_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_SET_MUX_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_SET_CLK_1M_ERR_FL_MASK (0x80000000U) -#define XTALOSC24M_OSC_CONFIG2_SET_CLK_1M_ERR_FL_SHIFT (31U) -#define XTALOSC24M_OSC_CONFIG2_SET_CLK_1M_ERR_FL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_SET_CLK_1M_ERR_FL_SHIFT)) & XTALOSC24M_OSC_CONFIG2_SET_CLK_1M_ERR_FL_MASK) -/*! @} */ - -/*! @name OSC_CONFIG2_CLR - XTAL OSC Configuration 2 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG2_CLR_COUNT_1M_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG2_CLR_COUNT_1M_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG2_CLR_COUNT_1M_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_CLR_COUNT_1M_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG2_CLR_COUNT_1M_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG2_CLR_ENABLE_1M_MASK (0x10000U) -#define XTALOSC24M_OSC_CONFIG2_CLR_ENABLE_1M_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG2_CLR_ENABLE_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_CLR_ENABLE_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_CLR_ENABLE_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_CLR_MUX_1M_MASK (0x20000U) -#define XTALOSC24M_OSC_CONFIG2_CLR_MUX_1M_SHIFT (17U) -#define XTALOSC24M_OSC_CONFIG2_CLR_MUX_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_CLR_MUX_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_CLR_MUX_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_CLR_CLK_1M_ERR_FL_MASK (0x80000000U) -#define XTALOSC24M_OSC_CONFIG2_CLR_CLK_1M_ERR_FL_SHIFT (31U) -#define XTALOSC24M_OSC_CONFIG2_CLR_CLK_1M_ERR_FL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_CLR_CLK_1M_ERR_FL_SHIFT)) & XTALOSC24M_OSC_CONFIG2_CLR_CLK_1M_ERR_FL_MASK) -/*! @} */ - -/*! @name OSC_CONFIG2_TOG - XTAL OSC Configuration 2 Register */ -/*! @{ */ - -#define XTALOSC24M_OSC_CONFIG2_TOG_COUNT_1M_TRG_MASK (0xFFFU) -#define XTALOSC24M_OSC_CONFIG2_TOG_COUNT_1M_TRG_SHIFT (0U) -#define XTALOSC24M_OSC_CONFIG2_TOG_COUNT_1M_TRG(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_TOG_COUNT_1M_TRG_SHIFT)) & XTALOSC24M_OSC_CONFIG2_TOG_COUNT_1M_TRG_MASK) - -#define XTALOSC24M_OSC_CONFIG2_TOG_ENABLE_1M_MASK (0x10000U) -#define XTALOSC24M_OSC_CONFIG2_TOG_ENABLE_1M_SHIFT (16U) -#define XTALOSC24M_OSC_CONFIG2_TOG_ENABLE_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_TOG_ENABLE_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_TOG_ENABLE_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_TOG_MUX_1M_MASK (0x20000U) -#define XTALOSC24M_OSC_CONFIG2_TOG_MUX_1M_SHIFT (17U) -#define XTALOSC24M_OSC_CONFIG2_TOG_MUX_1M(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_TOG_MUX_1M_SHIFT)) & XTALOSC24M_OSC_CONFIG2_TOG_MUX_1M_MASK) - -#define XTALOSC24M_OSC_CONFIG2_TOG_CLK_1M_ERR_FL_MASK (0x80000000U) -#define XTALOSC24M_OSC_CONFIG2_TOG_CLK_1M_ERR_FL_SHIFT (31U) -#define XTALOSC24M_OSC_CONFIG2_TOG_CLK_1M_ERR_FL(x) (((uint32_t)(((uint32_t)(x)) << XTALOSC24M_OSC_CONFIG2_TOG_CLK_1M_ERR_FL_SHIFT)) & XTALOSC24M_OSC_CONFIG2_TOG_CLK_1M_ERR_FL_MASK) -/*! @} */ - - -/*! - * @} - */ /* end of group XTALOSC24M_Register_Masks */ - - -/* XTALOSC24M - Peripheral instance base addresses */ -/** Peripheral XTALOSC24M base address */ -#define XTALOSC24M_BASE (0x400D8000u) -/** Peripheral XTALOSC24M base pointer */ -#define XTALOSC24M ((XTALOSC24M_Type *)XTALOSC24M_BASE) -/** Array initializer of XTALOSC24M peripheral base addresses */ -#define XTALOSC24M_BASE_ADDRS { XTALOSC24M_BASE } -/** Array initializer of XTALOSC24M peripheral base pointers */ -#define XTALOSC24M_BASE_PTRS { XTALOSC24M } - -/*! - * @} - */ /* end of group XTALOSC24M_Peripheral_Access_Layer */ - - -/* -** End of section using anonymous unions -*/ - -#if defined(__ARMCC_VERSION) - #if (__ARMCC_VERSION >= 6010050) - #pragma clang diagnostic pop - #else - #pragma pop - #endif -#elif defined(__CWCC__) - #pragma pop -#elif defined(__GNUC__) - /* leave anonymous unions enabled */ -#elif defined(__IAR_SYSTEMS_ICC__) - #pragma language=default -#else - #error Not supported compiler type -#endif - -/*! - * @} - */ /* end of group Peripheral_access_layer */ - - -/* ---------------------------------------------------------------------------- - -- Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup Bit_Field_Generic_Macros Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). - * @{ - */ - -#if defined(__ARMCC_VERSION) - #if (__ARMCC_VERSION >= 6010050) - #pragma clang system_header - #endif -#elif defined(__IAR_SYSTEMS_ICC__) - #pragma system_include -#endif - -/** - * @brief Mask and left-shift a bit field value for use in a register bit range. - * @param field Name of the register bit field. - * @param value Value of the bit field. - * @return Masked and shifted value. - */ -#define NXP_VAL2FLD(field, value) (((value) << (field ## _SHIFT)) & (field ## _MASK)) -/** - * @brief Mask and right-shift a register value to extract a bit field value. - * @param field Name of the register bit field. - * @param value Value of the register. - * @return Masked and shifted bit field value. - */ -#define NXP_FLD2VAL(field, value) (((value) & (field ## _MASK)) >> (field ## _SHIFT)) - -/*! - * @} - */ /* end of group Bit_Field_Generic_Macros */ - - -/* ---------------------------------------------------------------------------- - -- SDK Compatibility - ---------------------------------------------------------------------------- */ - -/*! - * @addtogroup SDK_Compatibility_Symbols SDK Compatibility - * @{ - */ - -/* No SDK compatibility issues. */ - -/*! - * @} - */ /* end of group SDK_Compatibility_Symbols */ - - -#endif /* _MIMXRT1052_H_ */ - diff --git a/devices/MIMXRT1052/MIMXRT1052_features.h b/devices/MIMXRT1052/MIMXRT1052_features.h deleted file mode 100644 index d2071d7..0000000 --- a/devices/MIMXRT1052/MIMXRT1052_features.h +++ /dev/null @@ -1,744 +0,0 @@ -/* -** ################################################################### -** Version: rev. 1.1, 2018-11-16 -** Build: b210427 -** -** Abstract: -** Chip specific module features. -** -** 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. 0.1 (2017-01-10) -** Initial version. -** - rev. 1.0 (2018-09-21) -** Update interrupt vector table and dma request source. -** Update register BEE_ADDR_OFFSET1's bitfield name to ADDR_OFFSET1. -** Split GPIO_COMBINED_IRQS to GPIO_COMBINED_LOW_IRQS and GPIO_COMBINED_HIGH_IRQS. -** - rev. 1.1 (2018-11-16) -** Update feature files to align with IMXRT1050RM Rev.1. -** -** ################################################################### -*/ - -#ifndef _MIMXRT1052_FEATURES_H_ -#define _MIMXRT1052_FEATURES_H_ - -/* SOC module features */ - -/* @brief ADC availability on the SoC. */ -#define FSL_FEATURE_SOC_ADC_COUNT (2) -/* @brief AIPSTZ availability on the SoC. */ -#define FSL_FEATURE_SOC_AIPSTZ_COUNT (4) -/* @brief AOI availability on the SoC. */ -#define FSL_FEATURE_SOC_AOI_COUNT (2) -/* @brief CCM availability on the SoC. */ -#define FSL_FEATURE_SOC_CCM_COUNT (1) -/* @brief CCM_ANALOG availability on the SoC. */ -#define FSL_FEATURE_SOC_CCM_ANALOG_COUNT (1) -/* @brief CMP availability on the SoC. */ -#define FSL_FEATURE_SOC_CMP_COUNT (4) -/* @brief CSI availability on the SoC. */ -#define FSL_FEATURE_SOC_CSI_COUNT (1) -/* @brief DCDC availability on the SoC. */ -#define FSL_FEATURE_SOC_DCDC_COUNT (1) -/* @brief DCP availability on the SoC. */ -#define FSL_FEATURE_SOC_DCP_COUNT (1) -/* @brief DMAMUX availability on the SoC. */ -#define FSL_FEATURE_SOC_DMAMUX_COUNT (1) -/* @brief EDMA availability on the SoC. */ -#define FSL_FEATURE_SOC_EDMA_COUNT (1) -/* @brief ENC availability on the SoC. */ -#define FSL_FEATURE_SOC_ENC_COUNT (4) -/* @brief ENET availability on the SoC. */ -#define FSL_FEATURE_SOC_ENET_COUNT (1) -/* @brief EWM availability on the SoC. */ -#define FSL_FEATURE_SOC_EWM_COUNT (1) -/* @brief FLEXCAN availability on the SoC. */ -#define FSL_FEATURE_SOC_FLEXCAN_COUNT (2) -/* @brief FLEXIO availability on the SoC. */ -#define FSL_FEATURE_SOC_FLEXIO_COUNT (2) -/* @brief FLEXRAM availability on the SoC. */ -#define FSL_FEATURE_SOC_FLEXRAM_COUNT (1) -/* @brief FLEXSPI availability on the SoC. */ -#define FSL_FEATURE_SOC_FLEXSPI_COUNT (1) -/* @brief GPC availability on the SoC. */ -#define FSL_FEATURE_SOC_GPC_COUNT (1) -/* @brief GPT availability on the SoC. */ -#define FSL_FEATURE_SOC_GPT_COUNT (2) -/* @brief I2S availability on the SoC. */ -#define FSL_FEATURE_SOC_I2S_COUNT (3) -/* @brief IGPIO availability on the SoC. */ -#define FSL_FEATURE_SOC_IGPIO_COUNT (5) -/* @brief IOMUXC availability on the SoC. */ -#define FSL_FEATURE_SOC_IOMUXC_COUNT (1) -/* @brief IOMUXC_GPR availability on the SoC. */ -#define FSL_FEATURE_SOC_IOMUXC_GPR_COUNT (1) -/* @brief IOMUXC_SNVS availability on the SoC. */ -#define FSL_FEATURE_SOC_IOMUXC_SNVS_COUNT (1) -/* @brief KPP availability on the SoC. */ -#define FSL_FEATURE_SOC_KPP_COUNT (1) -/* @brief LCDIF availability on the SoC. */ -#define FSL_FEATURE_SOC_LCDIF_COUNT (1) -/* @brief LPI2C availability on the SoC. */ -#define FSL_FEATURE_SOC_LPI2C_COUNT (4) -/* @brief LPSPI availability on the SoC. */ -#define FSL_FEATURE_SOC_LPSPI_COUNT (4) -/* @brief LPUART availability on the SoC. */ -#define FSL_FEATURE_SOC_LPUART_COUNT (8) -/* @brief OCOTP availability on the SoC. */ -#define FSL_FEATURE_SOC_OCOTP_COUNT (1) -/* @brief PIT availability on the SoC. */ -#define FSL_FEATURE_SOC_PIT_COUNT (1) -/* @brief PMU availability on the SoC. */ -#define FSL_FEATURE_SOC_PMU_COUNT (1) -/* @brief PWM availability on the SoC. */ -#define FSL_FEATURE_SOC_PWM_COUNT (4) -/* @brief PXP availability on the SoC. */ -#define FSL_FEATURE_SOC_PXP_COUNT (1) -/* @brief ROMC availability on the SoC. */ -#define FSL_FEATURE_SOC_ROMC_COUNT (1) -/* @brief SEMC availability on the SoC. */ -#define FSL_FEATURE_SOC_SEMC_COUNT (1) -/* @brief SNVS availability on the SoC. */ -#define FSL_FEATURE_SOC_SNVS_COUNT (1) -/* @brief SPDIF availability on the SoC. */ -#define FSL_FEATURE_SOC_SPDIF_COUNT (1) -/* @brief SRC availability on the SoC. */ -#define FSL_FEATURE_SOC_SRC_COUNT (1) -/* @brief TEMPMON availability on the SoC. */ -#define FSL_FEATURE_SOC_TEMPMON_COUNT (1) -/* @brief TMR availability on the SoC. */ -#define FSL_FEATURE_SOC_TMR_COUNT (4) -/* @brief TRNG availability on the SoC. */ -#define FSL_FEATURE_SOC_TRNG_COUNT (1) -/* @brief TSC availability on the SoC. */ -#define FSL_FEATURE_SOC_TSC_COUNT (1) -/* @brief USBHS availability on the SoC. */ -#define FSL_FEATURE_SOC_USBHS_COUNT (2) -/* @brief USBNC availability on the SoC. */ -#define FSL_FEATURE_SOC_USBNC_COUNT (2) -/* @brief USBPHY availability on the SoC. */ -#define FSL_FEATURE_SOC_USBPHY_COUNT (2) -/* @brief USB_ANALOG availability on the SoC. */ -#define FSL_FEATURE_SOC_USB_ANALOG_COUNT (1) -/* @brief USDHC availability on the SoC. */ -#define FSL_FEATURE_SOC_USDHC_COUNT (2) -/* @brief WDOG availability on the SoC. */ -#define FSL_FEATURE_SOC_WDOG_COUNT (2) -/* @brief XBARA availability on the SoC. */ -#define FSL_FEATURE_SOC_XBARA_COUNT (1) -/* @brief XBARB availability on the SoC. */ -#define FSL_FEATURE_SOC_XBARB_COUNT (2) -/* @brief XTALOSC24M availability on the SoC. */ -#define FSL_FEATURE_SOC_XTALOSC24M_COUNT (1) -/* @brief ROM API Availability */ -#define FSL_FEATURE_BOOT_ROM_HAS_ROMAPI (1) - -/* ADC module features */ - -/* @brief Remove Hardware Trigger feature. */ -#define FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE (0) -/* @brief Remove ALT Clock selection feature. */ -#define FSL_FEATURE_ADC_SUPPORT_ALTCLK_REMOVE (1) -/* @brief Conversion control count (related to number of registers HCn and Rn). */ -#define FSL_FEATURE_ADC_CONVERSION_CONTROL_COUNT (8) - -/* ADC_ETC module features */ - -/* @brief Has DMA model control(bit field CTRL[DMA_MODE_SEL]). */ -#define FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL (1) -/* @brief Has TRIGm_CHAIN_a_b IEn_EN. */ -#define FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN (0) -/* @brief Has no TSC0 trigger related bitfields (bit field CTRL[EXT0_TRIG_ENABLE], CTRL[EXT0_TRIG_PRIORITY]). */ -#define FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG (0) -/* @brief Has no TSC1 trigger related bitfields (bit field CTRL[EXT1_TRIG_ENABLE], CTRL[EXT1_TRIG_PRIORITY]). */ -#define FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG (0) - -/* AOI module features */ - -/* @brief Maximum value of input mux. */ -#define FSL_FEATURE_AOI_MODULE_INPUTS (4) -/* @brief Number of events related to number of registers AOIx_BFCRT01n/AOIx_BFCRT23n. */ -#define FSL_FEATURE_AOI_EVENT_COUNT (4) - -/* FLEXCAN module features */ - -/* @brief Message buffer size */ -#define FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(x) (64) -/* @brief Has doze mode support (register bit field MCR[DOZE]). */ -#define FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT (0) -/* @brief Insatnce has doze mode support (register bit field MCR[DOZE]). */ -#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(x) (0) -/* @brief Has a glitch filter on the receive pin (register bit field MCR[WAKSRC]). */ -#define FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER (1) -/* @brief Has extended interrupt mask and flag register (register IMASK2, IFLAG2). */ -#define FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER (1) -/* @brief Instance has extended bit timing register (register CBT). */ -#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_EXTENDED_TIMING_REGISTERn(x) (0) -/* @brief Has a receive FIFO DMA feature (register bit field MCR[DMA]). */ -#define FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA (0) -/* @brief Instance has a receive FIFO DMA feature (register bit field MCR[DMA]). */ -#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_RX_FIFO_DMAn(x) (0) -/* @brief Remove CAN Engine Clock Source Selection from unsupported part. */ -#define FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE (1) -/* @brief Instance remove CAN Engine Clock Source Selection from unsupported part. */ -#define FSL_FEATURE_FLEXCAN_INSTANCE_SUPPORT_ENGINE_CLK_SEL_REMOVEn(x) (1) -/* @brief Is affected by errata with ID 5641 (Module does not transmit a message that is enabled to be transmitted at a specific moment during the arbitration process). */ -#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641 (0) -/* @brief Is affected by errata with ID 5829 (FlexCAN: FlexCAN does not transmit a message that is enabled to be transmitted in a specific moment during the arbitration process). */ -#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829 (1) -/* @brief Is affected by errata with ID 6032 (FlexCAN: A frame with wrong ID or payload is transmitted into the CAN bus when the Message Buffer under transmission is either aborted or deactivated while the CAN bus is in the Bus Idle state). */ -#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032 (1) -/* @brief Is affected by errata with ID 9595 (FlexCAN: Corrupt frame possible if the Freeze Mode or the Low-Power Mode are entered during a Bus-Off state). */ -#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595 (1) -/* @brief Has CAN with Flexible Data rate (CAN FD) protocol. */ -#define FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE (0) -/* @brief CAN instance support Flexible Data rate (CAN FD) protocol. */ -#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(x) (0) -/* @brief Has extra MB interrupt or common one. */ -#define FSL_FEATURE_FLEXCAN_HAS_EXTRA_MB_INT (1) -/* @brief Has memory error control (register MECR). */ -#define FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL (0) - -/* CCM module features */ - -/* @brief Is affected by errata with ID 50235 (Incorrect clock setting for CAN affects by LPUART clock gate). */ -#define FSL_FEATURE_CCM_HAS_ERRATA_50235 (1) - -/* CMP module features */ - -/* @brief Has Trigger mode in CMP (register bit field CR1[TRIGM]). */ -#define FSL_FEATURE_CMP_HAS_TRIGGER_MODE (0) -/* @brief Has Window mode in CMP (register bit field CR1[WE]). */ -#define FSL_FEATURE_CMP_HAS_WINDOW_MODE (1) -/* @brief Has External sample supported in CMP (register bit field CR1[SE]). */ -#define FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT (1) -/* @brief Has DMA support in CMP (register bit field SCR[DMAEN]). */ -#define FSL_FEATURE_CMP_HAS_DMA (1) -/* @brief Has Pass Through mode in CMP (register bit field MUXCR[PSTM]). */ -#define FSL_FEATURE_CMP_HAS_PASS_THROUGH_MODE (0) -/* @brief Has DAC Test function in CMP (register DACTEST). */ -#define FSL_FEATURE_CMP_HAS_DAC_TEST (0) -/* @brief Has COUTA out of window is zero enable. */ -#define FSL_FEATURE_CMP_HAS_COWZ_BIT_FIELD (0) -/* @brief Use 16 bit registers. */ -#define FSL_FEATURE_CMP_USE_16BIT_REG (0) - -/* DCDC module features */ - -/* @brief Has CTRL register (register CTRL0/1). */ -#define FSL_FEATURE_DCDC_HAS_CTRL_REG (0) -/* @brief DCDC VDD output count. */ -#define FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT (1) -/* @brief Has no current alert function (register bit field REG0[CURRENT_ALERT_RESET]). */ -#define FSL_FEATURE_DCDC_HAS_NO_CURRENT_ALERT_FUNC (0) -/* @brief Has switching converter differential mode (register bit field REG1[LOOPCTRL_EN_DF_HYST]). */ -#define FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE (0) -/* @brief Has register bit field REG0[REG_DCDC_IN_DET]. */ -#define FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET (0) -/* @brief Has no register bit field REG0[EN_LP_OVERLOAD_SNS]. */ -#define FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS (0) -/* @brief Has register bit field REG3[REG_FBK_SEL]). */ -#define FSL_FEATURE_DCDC_HAS_REG3_FBK_SEL (0) - -/* EDMA module features */ - -/* @brief Number of DMA channels (related to number of registers TCD, DCHPRI, bit fields ERQ[ERQn], EEI[EEIn], INT[INTn], ERR[ERRn], HRS[HRSn] and bit field widths ES[ERRCHN], CEEI[CEEI], SEEI[SEEI], CERQ[CERQ], SERQ[SERQ], CDNE[CDNE], SSRT[SSRT], CERR[CERR], CINT[CINT], TCDn_CITER_ELINKYES[LINKCH], TCDn_CSR[MAJORLINKCH], TCDn_BITER_ELINKYES[LINKCH]). (Valid only for eDMA modules.) */ -#define FSL_FEATURE_EDMA_MODULE_CHANNEL (32) -/* @brief Total number of DMA channels on all modules. */ -#define FSL_FEATURE_EDMA_DMAMUX_CHANNELS (32) -/* @brief Number of DMA channel groups (register bit fields CR[ERGA], CR[GRPnPRI], ES[GPE], DCHPRIn[GRPPRI]). (Valid only for eDMA modules.) */ -#define FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT (1) -/* @brief Has DMA_Error interrupt vector. */ -#define FSL_FEATURE_EDMA_HAS_ERROR_IRQ (1) -/* @brief Number of DMA channels with asynchronous request capability (register EARS). (Valid only for eDMA modules.) */ -#define FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT (32) -/* @brief Channel IRQ entry shared offset. */ -#define FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET (16) -/* @brief If 8 bytes transfer supported. */ -#define FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER (1) -/* @brief If 16 bytes transfer supported. */ -#define FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER (0) -/* @brief If 32 bytes transfer supported. */ -#define FSL_FEATURE_EDMA_SUPPORT_32_BYTES_TRANSFER (1) - -/* DMAMUX module features */ - -/* @brief Number of DMA channels (related to number of register CHCFGn). */ -#define FSL_FEATURE_DMAMUX_MODULE_CHANNEL (32) -/* @brief Total number of DMA channels on all modules. */ -#define FSL_FEATURE_DMAMUX_DMAMUX_CHANNELS (32) -/* @brief Has the periodic trigger capability for the triggered DMA channel (register bit CHCFG0[TRIG]). */ -#define FSL_FEATURE_DMAMUX_HAS_TRIG (1) -/* @brief Has DMA Channel Always ON function (register bit CHCFG0[A_ON]). */ -#define FSL_FEATURE_DMAMUX_HAS_A_ON (1) -/* @brief Register CHCFGn width. */ -#define FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH (32) - -/* ENET module features */ - -/* @brief Support Interrupt Coalesce */ -#define FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE (1) -/* @brief Queue Size. */ -#define FSL_FEATURE_ENET_QUEUE (1) -/* @brief Has AVB Support. */ -#define FSL_FEATURE_ENET_HAS_AVB (0) -/* @brief Has Timer Pulse Width control. */ -#define FSL_FEATURE_ENET_HAS_TIMER_PWCONTROL (1) -/* @brief Has Extend MDIO Support. */ -#define FSL_FEATURE_ENET_HAS_EXTEND_MDIO (1) -/* @brief Has Additional 1588 Timer Channel Interrupt. */ -#define FSL_FEATURE_ENET_HAS_ADD_1588_TIMER_CHN_INT (0) -/* @brief Support Interrupt Coalesce for each instance */ -#define FSL_FEATURE_ENET_INSTANCE_HAS_INTERRUPT_COALESCEn(x) (1) -/* @brief Queue Size for each instance. */ -#define FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) (1) -/* @brief Has AVB Support for each instance. */ -#define FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(x) (0) -/* @brief Has Timer Pulse Width control for each instance. */ -#define FSL_FEATURE_ENET_INSTANCE_HAS_TIMER_PWCONTROLn(x) (1) -/* @brief Has Extend MDIO Support for each instance. */ -#define FSL_FEATURE_ENET_INSTANCE_HAS_EXTEND_MDIOn(x) (1) -/* @brief Has Additional 1588 Timer Channel Interrupt for each instance. */ -#define FSL_FEATURE_ENET_INSTANCE_HAS_ADD_1588_TIMER_CHN_INTn(x) (0) -/* @brief Has threshold for the number of frames in the receive FIFO (register bit field RSEM[STAT_SECTION_EMPTY]). */ -#define FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD (1) -/* @brief Has trasfer clock delay (register bit field ECR[TXC_DLY]). */ -#define FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY (0) -/* @brief Has receive clock delay (register bit field ECR[RXC_DLY]). */ -#define FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY (0) -/* @brief PTP Timestamp CAPTURE bit always returns 0 when the capture is not over. */ -#define FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID (0) - -/* EWM module features */ - -/* @brief Has clock select (register CLKCTRL). */ -#define FSL_FEATURE_EWM_HAS_CLOCK_SELECT (1) -/* @brief Has clock prescaler (register CLKPRESCALER). */ -#define FSL_FEATURE_EWM_HAS_PRESCALER (1) - -/* FLEXIO module features */ - -/* @brief Has Shifter Status Register (FLEXIO_SHIFTSTAT) */ -#define FSL_FEATURE_FLEXIO_HAS_SHIFTER_STATUS (1) -/* @brief Has Pin Data Input Register (FLEXIO_PIN) */ -#define FSL_FEATURE_FLEXIO_HAS_PIN_STATUS (1) -/* @brief Has Shifter Buffer N Nibble Byte Swapped Register (FLEXIO_SHIFTBUFNBSn) */ -#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP (1) -/* @brief Has Shifter Buffer N Half Word Swapped Register (FLEXIO_SHIFTBUFHWSn) */ -#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP (1) -/* @brief Has Shifter Buffer N Nibble Swapped Register (FLEXIO_SHIFTBUFNISn) */ -#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP (1) -/* @brief Supports Shifter State Mode (FLEXIO_SHIFTCTLn[SMOD]) */ -#define FSL_FEATURE_FLEXIO_HAS_STATE_MODE (1) -/* @brief Supports Shifter Logic Mode (FLEXIO_SHIFTCTLn[SMOD]) */ -#define FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE (1) -/* @brief Supports paralle width (FLEXIO_SHIFTCFGn[PWIDTH]) */ -#define FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH (1) -/* @brief Reset value of the FLEXIO_VERID register */ -#define FSL_FEATURE_FLEXIO_VERID_RESET_VALUE (0x1010001) -/* @brief Reset value of the FLEXIO_PARAM register */ -#define FSL_FEATURE_FLEXIO_PARAM_RESET_VALUE (0x2200404) -/* @brief Flexio DMA request base channel */ -#define FSL_FEATURE_FLEXIO_DMA_REQUEST_BASE_CHANNEL (0) - -/* FLEXRAM module features */ - -/* @brief Bank size */ -#define FSL_FEATURE_FLEXRAM_INTERNAL_RAM_BANK_SIZE (32768) -/* @brief Total Bank numbers */ -#define FSL_FEATURE_FLEXRAM_INTERNAL_RAM_TOTAL_BANK_NUMBERS (16) -/* @brief Has FLEXRAM_MAGIC_ADDR. */ -#define FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR (0) -/* @brief If FLEXRAM has ECC function. */ -#define FSL_FEATURE_FLEXRAM_HAS_ECC (0) - -/* FLEXSPI module features */ - -/* @brief FlexSPI AHB buffer count */ -#define FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNTn(x) (4) -/* @brief FlexSPI has no data learn. */ -#define FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN (1) -/* @brief There is AHBBUSERROREN bit in INTEN register. */ -#define FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN (0) -/* @brief There is CLRAHBTX_RXBUF bit in AHBCR register. */ -#define FSL_FEATURE_FLEXSPI_HAS_AHBCR_CLRAHBTX_RXBUF (0) - -/* GPC module features */ - -/* @brief Has DVFS0 Change Request. */ -#define FSL_FEATURE_GPC_HAS_CNTR_DVFS0CR (0) -/* @brief Has GPC interrupt/event masking. */ -#define FSL_FEATURE_GPC_HAS_CNTR_GPCIRQM (0) -/* @brief Has L2 cache power control. */ -#define FSL_FEATURE_GPC_HAS_CNTR_L2PGE (0) -/* @brief Has FLEXRAM PDRAM0(bank1-7) power control. */ -#define FSL_FEATURE_GPC_HAS_CNTR_PDRAM0PGE (1) -/* @brief Has VADC power control. */ -#define FSL_FEATURE_GPC_HAS_CNTR_VADC (0) -/* @brief Has Display power control. */ -#define FSL_FEATURE_GPC_HAS_CNTR_DISPLAY (0) -/* @brief Supports IRQ 0-31. */ -#define FSL_FEATURE_GPC_HAS_IRQ_0_31 (1) - -/* IGPIO module features */ - -/* @brief Has data register set DR_SET. */ -#define FSL_FEATURE_IGPIO_HAS_DR_SET (1) -/* @brief Has data register clear DR_CLEAR. */ -#define FSL_FEATURE_IGPIO_HAS_DR_CLEAR (1) -/* @brief Has data register toggle DR_TOGGLE. */ -#define FSL_FEATURE_IGPIO_HAS_DR_TOGGLE (1) - -/* LCDIF module features */ - -/* @brief LCDIF does not support alpha support. */ -#define FSL_FEATURE_LCDIF_HAS_NO_AS (1) -/* @brief LCDIF does not support output reset pin to LCD panel. */ -#define FSL_FEATURE_LCDIF_HAS_NO_RESET_PIN (1) -/* @brief LCDIF supports LUT. */ -#define FSL_FEATURE_LCDIF_HAS_LUT (1) - -/* LPI2C module features */ - -/* @brief Has separate DMA RX and TX requests. */ -#define FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(x) (0) -/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ -#define FSL_FEATURE_LPI2C_FIFO_SIZEn(x) (4) - -/* LPSPI module features */ - -/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ -#define FSL_FEATURE_LPSPI_FIFO_SIZEn(x) (16) -/* @brief Has separate DMA RX and TX requests. */ -#define FSL_FEATURE_LPSPI_HAS_SEPARATE_DMA_RX_TX_REQn(x) (1) - -/* LPUART module features */ - -/* @brief Has receive FIFO overflow detection (bit field CFIFO[RXOFE]). */ -#define FSL_FEATURE_LPUART_HAS_IRQ_EXTENDED_FUNCTIONS (0) -/* @brief Has low power features (can be enabled in wait mode via register bit C1[DOZEEN] or CTRL[DOZEEN] if the registers are 32-bit wide). */ -#define FSL_FEATURE_LPUART_HAS_LOW_POWER_UART_SUPPORT (1) -/* @brief Has extended data register ED (or extra flags in the DATA register if the registers are 32-bit wide). */ -#define FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) -/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ -#define FSL_FEATURE_LPUART_HAS_FIFO (1) -/* @brief Has 32-bit register MODIR */ -#define FSL_FEATURE_LPUART_HAS_MODIR (1) -/* @brief Hardware flow control (RTS, CTS) is supported. */ -#define FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT (1) -/* @brief Infrared (modulation) is supported. */ -#define FSL_FEATURE_LPUART_HAS_IR_SUPPORT (1) -/* @brief 2 bits long stop bit is available. */ -#define FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT (1) -/* @brief If 10-bit mode is supported. */ -#define FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT (1) -/* @brief If 7-bit mode is supported. */ -#define FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT (1) -/* @brief Baud rate fine adjustment is available. */ -#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_FINE_ADJUST_SUPPORT (0) -/* @brief Baud rate oversampling is available (has bit fields C4[OSR], C5[BOTHEDGE], C5[RESYNCDIS] or BAUD[OSR], BAUD[BOTHEDGE], BAUD[RESYNCDIS] if the registers are 32-bit wide). */ -#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) -/* @brief Baud rate oversampling is available. */ -#define FSL_FEATURE_LPUART_HAS_RX_RESYNC_SUPPORT (1) -/* @brief Baud rate oversampling is available. */ -#define FSL_FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) -/* @brief Peripheral type. */ -#define FSL_FEATURE_LPUART_IS_SCI (1) -/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ -#define FSL_FEATURE_LPUART_FIFO_SIZEn(x) (4) -/* @brief Supports two match addresses to filter incoming frames. */ -#define FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) -/* @brief Has transmitter/receiver DMA enable bits C5[TDMAE]/C5[RDMAE] (or BAUD[TDMAE]/BAUD[RDMAE] if the registers are 32-bit wide). */ -#define FSL_FEATURE_LPUART_HAS_DMA_ENABLE (1) -/* @brief Has transmitter/receiver DMA select bits C4[TDMAS]/C4[RDMAS], resp. C5[TDMAS]/C5[RDMAS] if IS_SCI = 0. */ -#define FSL_FEATURE_LPUART_HAS_DMA_SELECT (0) -/* @brief Data character bit order selection is supported (bit field S2[MSBF] or STAT[MSBF] if the registers are 32-bit wide). */ -#define FSL_FEATURE_LPUART_HAS_BIT_ORDER_SELECT (1) -/* @brief Has smart card (ISO7816 protocol) support and no improved smart card support. */ -#define FSL_FEATURE_LPUART_HAS_SMART_CARD_SUPPORT (0) -/* @brief Has improved smart card (ISO7816 protocol) support. */ -#define FSL_FEATURE_LPUART_HAS_IMPROVED_SMART_CARD_SUPPORT (0) -/* @brief Has local operation network (CEA709.1-B protocol) support. */ -#define FSL_FEATURE_LPUART_HAS_LOCAL_OPERATION_NETWORK_SUPPORT (0) -/* @brief Has 32-bit registers (BAUD, STAT, CTRL, DATA, MATCH, MODIR) instead of 8-bit (BDH, BDL, C1, S1, D, etc.). */ -#define FSL_FEATURE_LPUART_HAS_32BIT_REGISTERS (1) -/* @brief Lin break detect available (has bit BAUD[LBKDIE]). */ -#define FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT (1) -/* @brief UART stops in Wait mode available (has bit C1[UARTSWAI]). */ -#define FSL_FEATURE_LPUART_HAS_WAIT_MODE_OPERATION (0) -/* @brief Has separate DMA RX and TX requests. */ -#define FSL_FEATURE_LPUART_HAS_SEPARATE_DMA_RX_TX_REQn(x) (1) -/* @brief Has separate RX and TX interrupts. */ -#define FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ (0) -/* @brief Has LPAURT_PARAM. */ -#define FSL_FEATURE_LPUART_HAS_PARAM (1) -/* @brief Has LPUART_VERID. */ -#define FSL_FEATURE_LPUART_HAS_VERID (1) -/* @brief Has LPUART_GLOBAL. */ -#define FSL_FEATURE_LPUART_HAS_GLOBAL (1) -/* @brief Has LPUART_PINCFG. */ -#define FSL_FEATURE_LPUART_HAS_PINCFG (1) - -/* interrupt module features */ - -/* @brief Lowest interrupt request number. */ -#define FSL_FEATURE_INTERRUPT_IRQ_MIN (-14) -/* @brief Highest interrupt request number. */ -#define FSL_FEATURE_INTERRUPT_IRQ_MAX (151) - -/* OCOTP module features */ - -/* @brief Has timing control, (register TIMING). */ -#define FSL_FEATURE_OCOTP_HAS_TIMING_CTRL (1) -/* @brief Support lock eFuse word write lock, (CTRL[WORDLOCK]). */ -#define FSL_FEATURE_OCOTP_HAS_WORDLOCK (0) - -/* PIT module features */ - -/* @brief Number of channels (related to number of registers LDVALn, CVALn, TCTRLn, TFLGn). */ -#define FSL_FEATURE_PIT_TIMER_COUNT (4) -/* @brief Has lifetime timer (related to existence of registers LTMR64L and LTMR64H). */ -#define FSL_FEATURE_PIT_HAS_LIFETIME_TIMER (1) -/* @brief Has chain mode (related to existence of register bit field TCTRLn[CHN]). */ -#define FSL_FEATURE_PIT_HAS_CHAIN_MODE (1) -/* @brief Has shared interrupt handler (has not individual interrupt handler for each channel). */ -#define FSL_FEATURE_PIT_HAS_SHARED_IRQ_HANDLER (1) -/* @brief Has timer enable control. */ -#define FSL_FEATURE_PIT_HAS_MDIS (1) - -/* PMU module features */ - -/* @brief PMU supports lower power control. */ -#define FSL_FEATURE_PMU_HAS_LOWPWR_CTRL (0) - -/* PWM module features */ - -/* @brief If (e)FlexPWM has module A channels (outputs). */ -#define FSL_FEATURE_PWM_HAS_CHANNELA (1) -/* @brief If (e)FlexPWM has module B channels (outputs). */ -#define FSL_FEATURE_PWM_HAS_CHANNELB (1) -/* @brief If (e)FlexPWM has module X channels (outputs). */ -#define FSL_FEATURE_PWM_HAS_CHANNELX (1) -/* @brief If (e)FlexPWM has fractional feature. */ -#define FSL_FEATURE_PWM_HAS_FRACTIONAL (1) -/* @brief If (e)FlexPWM has mux trigger source select bit field. */ -#define FSL_FEATURE_PWM_HAS_MUX_TRIGGER_SOURCE_SEL (1) -/* @brief Number of submodules in each (e)FlexPWM module. */ -#define FSL_FEATURE_PWM_SUBMODULE_COUNT (4U) -/* @brief Number of fault channel in each (e)FlexPWM module. */ -#define FSL_FEATURE_PWM_FAULT_CH_COUNT (1) - -/* PXP module features */ - -/* @brief PXP module has dither engine. */ -#define FSL_FEATURE_PXP_HAS_DITHER (0) -/* @brief PXP module supports repeat run */ -#define FSL_FEATURE_PXP_HAS_EN_REPEAT (1) -/* @brief PXP doesn't have CSC */ -#define FSL_FEATURE_PXP_HAS_NO_CSC2 (1) -/* @brief PXP doesn't have LUT */ -#define FSL_FEATURE_PXP_HAS_NO_LUT (1) - -/* RTWDOG module features */ - -/* @brief Watchdog is available. */ -#define FSL_FEATURE_RTWDOG_HAS_WATCHDOG (1) -/* @brief RTWDOG_CNT can be 32-bit written. */ -#define FSL_FEATURE_RTWDOG_HAS_32BIT_ACCESS (1) - -/* SAI module features */ - -/* @brief Receive/transmit FIFO size in item count (register bit fields TCSR[FRDE], TCSR[FRIE], TCSR[FRF], TCR1[TFW], RCSR[FRDE], RCSR[FRIE], RCSR[FRF], RCR1[RFW], registers TFRn, RFRn). */ -#define FSL_FEATURE_SAI_FIFO_COUNT (32) -/* @brief Receive/transmit channel number (register bit fields TCR3[TCE], RCR3[RCE], registers TDRn and RDRn). */ -#define FSL_FEATURE_SAI_CHANNEL_COUNTn(x) \ - (((x) == SAI1) ? (4) : \ - (((x) == SAI2) ? (1) : \ - (((x) == SAI3) ? (1) : (-1)))) -/* @brief Maximum words per frame (register bit fields TCR3[WDFL], TCR4[FRSZ], TMR[TWM], RCR3[WDFL], RCR4[FRSZ], RMR[RWM]). */ -#define FSL_FEATURE_SAI_MAX_WORDS_PER_FRAME (32) -/* @brief Has support of combining multiple data channel FIFOs into single channel FIFO (register bit fields TCR3[CFR], TCR4[FCOMB], TFR0[WCP], TFR1[WCP], RCR3[CFR], RCR4[FCOMB], RFR0[RCP], RFR1[RCP]). */ -#define FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE (1) -/* @brief Has packing of 8-bit and 16-bit data into each 32-bit FIFO word (register bit fields TCR4[FPACK], RCR4[FPACK]). */ -#define FSL_FEATURE_SAI_HAS_FIFO_PACKING (1) -/* @brief Configures when the SAI will continue transmitting after a FIFO error has been detected (register bit fields TCR4[FCONT], RCR4[FCONT]). */ -#define FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR (1) -/* @brief Configures if the frame sync is generated internally, a frame sync is only generated when the FIFO warning flag is clear or continuously (register bit fields TCR4[ONDEM], RCR4[ONDEM]). */ -#define FSL_FEATURE_SAI_HAS_ON_DEMAND_MODE (1) -/* @brief Simplified bit clock source and asynchronous/synchronous mode selection (register bit fields TCR2[CLKMODE], RCR2[CLKMODE]), in comparison with the exclusively implemented TCR2[SYNC,BCS,BCI,MSEL], RCR2[SYNC,BCS,BCI,MSEL]. */ -#define FSL_FEATURE_SAI_HAS_CLOCKING_MODE (0) -/* @brief Has register for configuration of the MCLK divide ratio (register bit fields MDR[FRACT], MDR[DIVIDE]). */ -#define FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER (0) -/* @brief Interrupt source number */ -#define FSL_FEATURE_SAI_INT_SOURCE_NUM (2) -/* @brief Has register of MCR. */ -#define FSL_FEATURE_SAI_HAS_MCR (0) -/* @brief Has bit field MICS of the MCR register. */ -#define FSL_FEATURE_SAI_HAS_NO_MCR_MICS (1) -/* @brief Has register of MDR */ -#define FSL_FEATURE_SAI_HAS_MDR (0) -/* @brief Has support the BCLK bypass mode when BCLK = MCLK. */ -#define FSL_FEATURE_SAI_HAS_BCLK_BYPASS (0) -/* @brief Has DIV bit fields of MCR register (register bit fields MCR[DIV]. */ -#define FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV (0) -/* @brief Support Channel Mode (register bit fields TCR4[CHMOD]). */ -#define FSL_FEATURE_SAI_HAS_CHANNEL_MODE (1) - -/* SEMC module features */ - -/* @brief Has WDH time in NOR controller (register bit field NORCR2[WDH]). */ -#define FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME (1) -/* @brief Has WDS time in NOR controller (register bit field NORCR2[WDS]). */ -#define FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME (1) -/* @brief SRAM count SEMC can support (register BRx). */ -#define FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT (1) -/* @brief If SEMC support delay chain control (register DCCR). */ -#define FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL (0) -/* @brief Has read hold time feature (register bit field SRAMCR6[RDH]). */ -#define FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME (0) -/* @brief Width of SDRAMCR0[PS] bitfields. */ -#define FSL_FEATURE_SEMC_SUPPORT_SDRAM_PS_BITWIDTH (1) -/* @brief If SEMC has errata 050577. */ -#define FSL_FEATURE_SEMC_ERRATA_050577 (1) -/* @brief If sdram support column address 8 bit (register bit field SRAMCR0[CLO8]). */ -#define FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT (0) -/* @brief If SEMC has register DBICR2 (register DBICR2). */ -#define FSL_FEATURE_SEMC_HAS_DBICR2 (0) - -/* SNVS module features */ - -/* @brief Has Secure Real Time Counter Enabled and Valid (bit field LPCR[SRTC_ENV]). */ -#define FSL_FEATURE_SNVS_HAS_SRTC (1) -/* @brief Has Passive Tamper Filter (regitser LPTGFCR). */ -#define FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER (0) -/* @brief Has Active Tampers (regitser LPATCTLR, LPATCLKR, LPATRCnR). */ -#define FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS (0) -/* @brief Number of TAMPER. */ -#define FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER (1) - -/* SRC module features */ - -/* @brief There is MASK_WDOG3_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_MASK_WDOG3_RST (1) -/* @brief There is MIX_RST_STRCH bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH (0) -/* @brief There is DBG_RST_MSK_PG bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_DBG_RST_MSK_PG (1) -/* @brief There is WDOG3_RST_OPTN bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN (0) -/* @brief There is CORES_DBG_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_CORES_DBG_RST (0) -/* @brief There is MTSR bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_MTSR (0) -/* @brief There is CORE0_DBG_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_CORE0_DBG_RST (1) -/* @brief There is CORE0_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_CORE0_RST (1) -/* @brief There is LOCKUP_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_LOCKUP_RST (0) -/* @brief There is SWRC bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_SWRC (0) -/* @brief There is EIM_RST bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_EIM_RST (0) -/* @brief There is LUEN bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_SCR_LUEN (0) -/* @brief There is no WRBC bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_NO_SCR_WRBC (1) -/* @brief There is no WRE bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_NO_SCR_WRE (1) -/* @brief There is SISR register. */ -#define FSL_FEATURE_SRC_HAS_SISR (0) -/* @brief There is RESET_OUT bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_RESET_OUT (0) -/* @brief There is WDOG3_RST_B bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_WDOG3_RST_B (1) -/* @brief There is JTAG_SW_RST bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_JTAG_SW_RST (1) -/* @brief There is SW bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_SW (0) -/* @brief There is IPP_USER_RESET_B bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_IPP_USER_RESET_B (1) -/* @brief There is SNVS bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_SNVS (0) -/* @brief There is CSU_RESET_B bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_CSU_RESET_B (1) -/* @brief There is LOCKUP bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_LOCKUP (0) -/* @brief There is LOCKUP_SYSRESETREQ bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_LOCKUP_SYSRESETREQ (1) -/* @brief There is POR bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_POR (0) -/* @brief There is IPP_RESET_B bit in SRSR register. */ -#define FSL_FEATURE_SRC_HAS_SRSR_IPP_RESET_B (1) -/* @brief There is no WBI bit in SCR register. */ -#define FSL_FEATURE_SRC_HAS_NO_SRSR_WBI (1) - -/* SCB module features */ - -/* @brief L1 ICACHE line size in byte. */ -#define FSL_FEATURE_L1ICACHE_LINESIZE_BYTE (32) -/* @brief L1 DCACHE line size in byte. */ -#define FSL_FEATURE_L1DCACHE_LINESIZE_BYTE (32) - -/* TRNG module features */ - -/* @brief TRNG has no TRNG_ACC bitfield. */ -#define FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC (1) - -/* USBHS module features */ - -/* @brief EHCI module instance count */ -#define FSL_FEATURE_USBHS_EHCI_COUNT (2) -/* @brief Number of endpoints supported */ -#define FSL_FEATURE_USBHS_ENDPT_COUNT (8) - -/* USBPHY module features */ - -/* @brief USBPHY contain DCD analog module */ -#define FSL_FEATURE_USBPHY_HAS_DCD_ANALOG (0) -/* @brief USBPHY has register TRIM_OVERRIDE_EN */ -#define FSL_FEATURE_USBPHY_HAS_TRIM_OVERRIDE_EN (0) -/* @brief USBPHY is 28FDSOI */ -#define FSL_FEATURE_USBPHY_28FDSOI (0) - -/* USDHC module features */ - -/* @brief Has external DMA support (VEND_SPEC[EXT_DMA_EN]) */ -#define FSL_FEATURE_USDHC_HAS_EXT_DMA (0) -/* @brief Has HS400 mode (MIX_CTRL[HS400_MODE]) */ -#define FSL_FEATURE_USDHC_HAS_HS400_MODE (0) -/* @brief Has SDR50 support (HOST_CTRL_CAP[SDR50_SUPPORT]) */ -#define FSL_FEATURE_USDHC_HAS_SDR50_MODE (1) -/* @brief Has SDR104 support (HOST_CTRL_CAP[SDR104_SUPPORT]) */ -#define FSL_FEATURE_USDHC_HAS_SDR104_MODE (1) -/* @brief USDHC has reset control */ -#define FSL_FEATURE_USDHC_HAS_RESET (0) -/* @brief USDHC has no bitfield WTMK_LVL[WR_BRST_LEN] and WTMK_LVL[RD_BRST_LEN] */ -#define FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN (0) -/* @brief If USDHC instance support 8 bit width */ -#define FSL_FEATURE_USDHC_INSTANCE_SUPPORT_8_BIT_WIDTHn(x) \ - (((x) == USDHC1) ? (0) : \ - (((x) == USDHC2) ? (1) : (-1))) -/* @brief If USDHC instance support HS400 mode */ -#define FSL_FEATURE_USDHC_INSTANCE_SUPPORT_HS400_MODEn(x) (0) -/* @brief If USDHC instance support 1v8 signal */ -#define FSL_FEATURE_USDHC_INSTANCE_SUPPORT_1V8_SIGNALn(x) (1) -/* @brief Has no retuning time counter (HOST_CTRL_CAP[TIME_COUNT_RETURNING]) */ -#define FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_NO_RETUNING_TIME_COUNTER (0) - -/* XBARA module features */ - -/* @brief Number of interrupt requests. */ -#define FSL_FEATURE_XBARA_INTERRUPT_COUNT (4) - -#endif /* _MIMXRT1052_FEATURES_H_ */ - diff --git a/devices/MIMXRT1052/drivers/fsl_adc.c b/devices/MIMXRT1052/drivers/fsl_adc.c deleted file mode 100644 index 909a6f3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_adc.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_adc.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.adc_12b1msps_sar" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for ADC module. - * - * @param base ADC peripheral base address - */ -static uint32_t ADC_GetInstance(ADC_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to ADC bases for each instance. */ -static ADC_Type *const s_adcBases[] = ADC_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to ADC clocks for each instance. */ -static const clock_ip_name_t s_adcClocks[] = ADC_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t ADC_GetInstance(ADC_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_adcBases); instance++) - { - if (s_adcBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_adcBases)); - - return instance; -} - -/*! - * brief Initialize the ADC module. - * - * param base ADC peripheral base address. - * param config Pointer to "adc_config_t" structure. - */ -void ADC_Init(ADC_Type *base, const adc_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock. */ - CLOCK_EnableClock(s_adcClocks[ADC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - /* ADCx_CFG */ - tmp32 = base->CFG & (ADC_CFG_AVGS_MASK | ADC_CFG_ADTRG_MASK); /* Reserve AVGS and ADTRG bits. */ - tmp32 |= ADC_CFG_REFSEL(config->referenceVoltageSource) | ADC_CFG_ADSTS(config->samplePeriodMode) | - ADC_CFG_ADICLK(config->clockSource) | ADC_CFG_ADIV(config->clockDriver) | ADC_CFG_MODE(config->resolution); - if (config->enableOverWrite) - { - tmp32 |= ADC_CFG_OVWREN_MASK; - } - if (config->enableLongSample) - { - tmp32 |= ADC_CFG_ADLSMP_MASK; - } - if (config->enableLowPower) - { - tmp32 |= ADC_CFG_ADLPC_MASK; - } - if (config->enableHighSpeed) - { - tmp32 |= ADC_CFG_ADHSC_MASK; - } - base->CFG = tmp32; - - /* ADCx_GC */ - tmp32 = base->GC & ~(ADC_GC_ADCO_MASK | ADC_GC_ADACKEN_MASK); - if (config->enableContinuousConversion) - { - tmp32 |= ADC_GC_ADCO_MASK; - } - if (config->enableAsynchronousClockOutput) - { - tmp32 |= ADC_GC_ADACKEN_MASK; - } - base->GC = tmp32; -} - -/*! - * brief De-initializes the ADC module. - * - * param base ADC peripheral base address. - */ -void ADC_Deinit(ADC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the clock. */ - CLOCK_DisableClock(s_adcClocks[ADC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets an available pre-defined settings for the converter's configuration. - * - * This function initializes the converter configuration structure with available settings. The default values are: - * code - * config->enableAsynchronousClockOutput = true; - * config->enableOverWrite = false; - * config->enableContinuousConversion = false; - * config->enableHighSpeed = false; - * config->enableLowPower = false; - * config->enableLongSample = false; - * config->referenceVoltageSource = kADC_ReferenceVoltageSourceAlt0; - * config->samplePeriodMode = kADC_SamplePeriod2or12Clocks; - * config->clockSource = kADC_ClockSourceAD; - * config->clockDriver = kADC_ClockDriver1; - * config->resolution = kADC_Resolution12Bit; - * endcode - * param base ADC peripheral base address. - * param config Pointer to the configuration structure. - */ -void ADC_GetDefaultConfig(adc_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableAsynchronousClockOutput = true; - config->enableOverWrite = false; - config->enableContinuousConversion = false; - config->enableHighSpeed = false; - config->enableLowPower = false; - config->enableLongSample = false; - config->referenceVoltageSource = kADC_ReferenceVoltageSourceAlt0; - config->samplePeriodMode = kADC_SamplePeriod2or12Clocks; - config->clockSource = kADC_ClockSourceAD; - config->clockDriver = kADC_ClockDriver1; - config->resolution = kADC_Resolution12Bit; -} - -/*! - * brief Configures the conversion channel. - * - * This operation triggers the conversion when in software trigger mode. When in hardware trigger mode, this API - * configures the channel while the external trigger source helps to trigger the conversion. - * - * Note that the "Channel Group" has a detailed description. - * To allow sequential conversions of the ADC to be triggered by internal peripherals, the ADC has more than one - * group of status and control registers, one for each conversion. The channel group parameter indicates which group of - * registers are used, for example channel group 0 is for Group A registers and channel group 1 is for Group B - * registers. The - * channel groups are used in a "ping-pong" approach to control the ADC operation. At any point, only one of - * the channel groups is actively controlling ADC conversions. The channel group 0 is used for both software and - * hardware - * trigger modes. Channel groups 1 and greater indicate potentially multiple channel group registers for - * use only in hardware trigger mode. See the chip configuration information in the appropriate MCU reference manual - * about the - * number of SC1n registers (channel groups) specific to this device. None of the channel groups 1 or greater are used - * for software trigger operation. Therefore, writing to these channel groups does not initiate a new conversion. - * Updating the channel group 0 while a different channel group is actively controlling a conversion is allowed and - * vice versa. Writing any of the channel group registers while that specific channel group is actively controlling a - * conversion aborts the current conversion. - * - * param base ADC peripheral base address. - * param channelGroup Channel group index. - * param config Pointer to the "adc_channel_config_t" structure for the conversion channel. - */ -void ADC_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc_channel_config_t *config) -{ - assert(NULL != config); - assert(channelGroup < (uint32_t)FSL_FEATURE_ADC_CONVERSION_CONTROL_COUNT); - - uint32_t tmp32; - - tmp32 = ADC_HC_ADCH(config->channelNumber); - if (config->enableInterruptOnConversionCompleted) - { - tmp32 |= ADC_HC_AIEN_MASK; - } - base->HC[channelGroup] = tmp32; -} - -/* - *To complete calibration, the user must follow the below procedure: - * 1. Configure ADC_CFG with actual operating values for maximum accuracy. - * 2. Configure the ADC_GC values along with CAL bit. - * 3. Check the status of CALF bit in ADC_GS and the CAL bit in ADC_GC. - * 4. When CAL bit becomes '0' then check the CALF status and COCO[0] bit status. - */ -/*! - * brief Automates the hardware calibration. - * - * This auto calibration helps to adjust the plus/minus side gain automatically. - * Execute the calibration before using the converter. Note that the software trigger should be used - * during calibration. - * - * param base ADC peripheral base address. - * - * return Execution status. - * retval kStatus_Success Calibration is done successfully. - * retval kStatus_Fail Calibration has failed. - */ -status_t ADC_DoAutoCalibration(ADC_Type *base) -{ - status_t status = kStatus_Success; -#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) - bool bHWTrigger = false; - - /* The calibration would be failed when in hardwar mode. - * Remember the hardware trigger state here and restore it later if the hardware trigger is enabled.*/ - if (0U != (ADC_CFG_ADTRG_MASK & base->CFG)) - { - bHWTrigger = true; - ADC_EnableHardwareTrigger(base, false); - } -#endif - - /* Clear the CALF and launch the calibration. */ - base->GS = ADC_GS_CALF_MASK; /* Clear the CALF. */ - base->GC |= ADC_GC_CAL_MASK; /* Launch the calibration. */ - - /* Check the status of CALF bit in ADC_GS and the CAL bit in ADC_GC. */ - while (0U != (base->GC & ADC_GC_CAL_MASK)) - { - /* Check the CALF when the calibration is active. */ - if (0U != (ADC_GetStatusFlags(base) & (uint32_t)kADC_CalibrationFailedFlag)) - { - status = kStatus_Fail; - break; - } - } - - /* When CAL bit becomes '0' then check the CALF status and COCO[0] bit status. */ - if (0U == ADC_GetChannelStatusFlags(base, 0U)) /* Check the COCO[0] bit status. */ - { - status = kStatus_Fail; - } - if (0U != (ADC_GetStatusFlags(base) & (uint32_t)kADC_CalibrationFailedFlag)) /* Check the CALF status. */ - { - status = kStatus_Fail; - } - - /* Clear conversion done flag. */ - (void)ADC_GetChannelConversionValue(base, 0U); - -#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) - /* Restore original trigger mode. */ - if (true == bHWTrigger) - { - ADC_EnableHardwareTrigger(base, true); - } -#endif - - return status; -} - -/*! - * brief Set user defined offset. - * - * param base ADC peripheral base address. - * param config Pointer to "adc_offest_config_t" structure. - */ -void ADC_SetOffsetConfig(ADC_Type *base, const adc_offest_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - - tmp32 = ADC_OFS_OFS(config->offsetValue); - if (config->enableSigned) - { - tmp32 |= ADC_OFS_SIGN_MASK; - } - base->OFS = tmp32; -} - -/*! - * brief Configures the hardware compare mode. - * - * The hardware compare mode provides a way to process the conversion result automatically by using hardware. Only the - * result - * in the compare range is available. To compare the range, see "adc_hardware_compare_mode_t" or the appopriate - * reference - * manual for more information. - * - * param base ADC peripheral base address. - * param Pointer to "adc_hardware_compare_config_t" structure. - * - */ -void ADC_SetHardwareCompareConfig(ADC_Type *base, const adc_hardware_compare_config_t *config) -{ - uint32_t tmp32; - - tmp32 = base->GC & ~(ADC_GC_ACFE_MASK | ADC_GC_ACFGT_MASK | ADC_GC_ACREN_MASK); - if (NULL == config) /* Pass "NULL" to disable the feature. */ - { - base->GC = tmp32; - return; - } - /* Enable the feature. */ - tmp32 |= ADC_GC_ACFE_MASK; - - /* Select the hardware compare working mode. */ - switch (config->hardwareCompareMode) - { - case kADC_HardwareCompareMode0: - break; - case kADC_HardwareCompareMode1: - tmp32 |= ADC_GC_ACFGT_MASK; - break; - case kADC_HardwareCompareMode2: - tmp32 |= ADC_GC_ACREN_MASK; - break; - case kADC_HardwareCompareMode3: - tmp32 |= ADC_GC_ACFGT_MASK | ADC_GC_ACREN_MASK; - break; - default: - assert(false); - break; - } - base->GC = tmp32; - - /* Load the compare values. */ - tmp32 = ADC_CV_CV1(config->value1) | ADC_CV_CV2(config->value2); - base->CV = tmp32; -} - -/*! - * brief Configures the hardware average mode. - * - * The hardware average mode provides a way to process the conversion result automatically by using hardware. The - * multiple - * conversion results are accumulated and averaged internally making them easier to read. - * - * param base ADC peripheral base address. - * param mode Setting the hardware average mode. See "adc_hardware_average_mode_t". - */ -void ADC_SetHardwareAverageConfig(ADC_Type *base, adc_hardware_average_mode_t mode) -{ - uint32_t tmp32; - - if (mode == kADC_HardwareAverageDiasable) - { - base->GC &= ~ADC_GC_AVGE_MASK; - } - else - { - tmp32 = base->CFG & ~ADC_CFG_AVGS_MASK; - tmp32 |= ADC_CFG_AVGS(mode); - base->CFG = tmp32; - base->GC |= ADC_GC_AVGE_MASK; /* Enable the hardware compare. */ - } -} - -/*! - * brief Clears the converter's status falgs. - * - * param base ADC peripheral base address. - * param mask Mask value for the cleared flags. See "adc_status_flags_t". - */ -void ADC_ClearStatusFlags(ADC_Type *base, uint32_t mask) -{ - uint32_t tmp32 = 0; - - if (0U != (mask & (uint32_t)kADC_CalibrationFailedFlag)) - { - tmp32 |= ADC_GS_CALF_MASK; - } - if (0U != (mask & (uint32_t)kADC_ConversionActiveFlag)) - { - tmp32 |= ADC_GS_ADACT_MASK; - } - base->GS = tmp32; -} diff --git a/devices/MIMXRT1052/drivers/fsl_adc.h b/devices/MIMXRT1052/drivers/fsl_adc.h deleted file mode 100644 index c033ba6..0000000 --- a/devices/MIMXRT1052/drivers/fsl_adc.h +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_ADC_H_ -#define _FSL_ADC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup adc_12b1msps_sar - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/*! @brief ADC driver version */ -#define FSL_ADC_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) /*!< Version 2.0.4. */ - -/*! - * @brief Converter's status flags. - */ -typedef enum _adc_status_flags -{ - kADC_ConversionActiveFlag = ADC_GS_ADACT_MASK, /*!< Conversion is active,not support w1c. */ - kADC_CalibrationFailedFlag = ADC_GS_CALF_MASK, /*!< Calibration is failed,support w1c. */ - kADC_AsynchronousWakeupInterruptFlag = - ADC_GS_AWKST_MASK, /*!< Asynchronous wakeup interrupt occurred, support w1c. */ -} adc_status_flags_t; - -/*! - * @brief Reference voltage source. - */ -typedef enum _adc_reference_voltage_source -{ - kADC_ReferenceVoltageSourceAlt0 = 0U, /*!< For external pins pair of VrefH and VrefL. */ -} adc_reference_voltage_source_t; - -/*! - * @brief Sample time duration. - */ -typedef enum _adc_sample_period_mode -{ - /* This group of enumeration is for internal use which is related to register setting. */ - kADC_SamplePeriod2or12Clocks = 0U, /*!< Long sample 12 clocks or short sample 2 clocks. */ - kADC_SamplePeriod4or16Clocks = 1U, /*!< Long sample 16 clocks or short sample 4 clocks. */ - kADC_SamplePeriod6or20Clocks = 2U, /*!< Long sample 20 clocks or short sample 6 clocks. */ - kADC_SamplePeriod8or24Clocks = 3U, /*!< Long sample 24 clocks or short sample 8 clocks. */ - /* This group of enumeration is for a public user. */ - /* For long sample mode. */ - kADC_SamplePeriodLong12Clcoks = kADC_SamplePeriod2or12Clocks, /*!< Long sample 12 clocks. */ - kADC_SamplePeriodLong16Clcoks = kADC_SamplePeriod4or16Clocks, /*!< Long sample 16 clocks. */ - kADC_SamplePeriodLong20Clcoks = kADC_SamplePeriod6or20Clocks, /*!< Long sample 20 clocks. */ - kADC_SamplePeriodLong24Clcoks = kADC_SamplePeriod8or24Clocks, /*!< Long sample 24 clocks. */ - /* For short sample mode. */ - kADC_SamplePeriodShort2Clocks = kADC_SamplePeriod2or12Clocks, /*!< Short sample 2 clocks. */ - kADC_SamplePeriodShort4Clocks = kADC_SamplePeriod4or16Clocks, /*!< Short sample 4 clocks. */ - kADC_SamplePeriodShort6Clocks = kADC_SamplePeriod6or20Clocks, /*!< Short sample 6 clocks. */ - kADC_SamplePeriodShort8Clocks = kADC_SamplePeriod8or24Clocks, /*!< Short sample 8 clocks. */ -} adc_sample_period_mode_t; - -/*! - * @brief Clock source. - */ -typedef enum _adc_clock_source -{ - kADC_ClockSourceIPG = 0U, /*!< Select IPG clock to generate ADCK. */ - kADC_ClockSourceIPGDiv2 = 1U, /*!< Select IPG clock divided by 2 to generate ADCK. */ -#if !(defined(FSL_FEATURE_ADC_SUPPORT_ALTCLK_REMOVE) && FSL_FEATURE_ADC_SUPPORT_ALTCLK_REMOVE) - kADC_ClockSourceALT = 2U, /*!< Select alternate clock to generate ADCK. */ -#endif - kADC_ClockSourceAD = 3U, /*!< Select Asynchronous clock to generate ADCK. */ -} adc_clock_source_t; - -/*! - * @brief Clock divider for the converter. - */ -typedef enum _adc_clock_drvier -{ - kADC_ClockDriver1 = 0U, /*!< For divider 1 from the input clock to the module. */ - kADC_ClockDriver2 = 1U, /*!< For divider 2 from the input clock to the module. */ - kADC_ClockDriver4 = 2U, /*!< For divider 4 from the input clock to the module. */ - kADC_ClockDriver8 = 3U, /*!< For divider 8 from the input clock to the module. */ -} adc_clock_driver_t; - -/*! - * @brief Converter's resolution. - */ -typedef enum _adc_resolution -{ - kADC_Resolution8Bit = 0U, /*!< Single End 8-bit resolution. */ - kADC_Resolution10Bit = 1U, /*!< Single End 10-bit resolution. */ - kADC_Resolution12Bit = 2U, /*!< Single End 12-bit resolution. */ -} adc_resolution_t; - -/*! - * @brief Converter hardware compare mode. - */ -typedef enum _adc_hardware_compare_mode -{ - kADC_HardwareCompareMode0 = 0U, /*!< Compare true if the result is less than the value1. */ - kADC_HardwareCompareMode1 = 1U, /*!< Compare true if the result is greater than or equal to value1. */ - kADC_HardwareCompareMode2 = 2U, /*!< Value1 <= Value2, compare true if the result is less than value1 Or - the result is Greater than value2. - Value1 > Value2, compare true if the result is less than value1 And the - result is greater than value2*/ - kADC_HardwareCompareMode3 = 3U, /*!< Value1 <= Value2, compare true if the result is greater than or equal - to value1 And the result is less than or equal to value2. - Value1 > Value2, compare true if the result is greater than or equal to - value1 Or the result is less than or equal to value2. */ -} adc_hardware_compare_mode_t; - -/*! - * @brief Converter hardware average mode. - */ -typedef enum _adc_hardware_average_mode -{ - kADC_HardwareAverageCount4 = 0U, /*!< For hardware average with 4 samples. */ - kADC_HardwareAverageCount8 = 1U, /*!< For hardware average with 8 samples. */ - kADC_HardwareAverageCount16 = 2U, /*!< For hardware average with 16 samples. */ - kADC_HardwareAverageCount32 = 3U, /*!< For hardware average with 32 samples. */ - kADC_HardwareAverageDiasable = 4U, /*!< Disable the hardware average function. */ -} adc_hardware_average_mode_t; - -/*! - * @brief Converter configuration. - */ -typedef struct _adc_config -{ - bool enableOverWrite; /*!< Enable the overwriting. */ - bool enableContinuousConversion; /*!< Enable the continuous conversion mode. */ - bool enableHighSpeed; /*!< Enable the high-speed mode. */ - bool enableLowPower; /*!< Enable the low power mode. */ - bool enableLongSample; /*!< Enable the long sample mode. */ - bool enableAsynchronousClockOutput; /*!< Enable the asynchronous clock output. */ - adc_reference_voltage_source_t referenceVoltageSource; /*!< Select the reference voltage source. */ - adc_sample_period_mode_t samplePeriodMode; /*!< Select the sample period in long sample mode or short mode. */ - adc_clock_source_t clockSource; /*!< Select the input clock source to generate the internal clock ADCK. */ - adc_clock_driver_t clockDriver; /*!< Select the divide ratio used by the ADC to generate the internal clock ADCK. */ - adc_resolution_t resolution; /*!< Select the ADC resolution mode. */ -} adc_config_t; - -/*! - * @brief Converter Offset configuration. - */ -typedef struct _adc_offest_config -{ - bool enableSigned; /*!< if false,The offset value is added with the raw result. - if true,The offset value is subtracted from the raw converted value. */ - uint32_t offsetValue; /*!< User configurable offset value(0-4095). */ -} adc_offest_config_t; - -/*! - * @brief ADC hardware compare configuration. - * - * In kADC_HardwareCompareMode0, compare true if the result is less than the value1. - * In kADC_HardwareCompareMode1, compare true if the result is greater than or equal to value1. - * In kADC_HardwareCompareMode2, Value1 <= Value2, compare true if the result is less than value1 Or the result is - * Greater than value2. - * Value1 > Value2, compare true if the result is less than value1 And the result is - * Greater than value2. - * In kADC_HardwareCompareMode3, Value1 <= Value2, compare true if the result is greater than or equal to value1 And the - * result is less than or equal to value2. - * Value1 > Value2, compare true if the result is greater than or equal to value1 Or the - * result is less than or equal to value2. - */ -typedef struct _adc_hardware_compare_config -{ - adc_hardware_compare_mode_t hardwareCompareMode; /*!< Select the hardware compare mode. - See "adc_hardware_compare_mode_t". */ - uint16_t value1; /*!< Setting value1(0-4095) for hardware compare mode. */ - uint16_t value2; /*!< Setting value2(0-4095) for hardware compare mode. */ -} adc_hardware_compare_config_t; - -/*! - * @brief ADC channel conversion configuration. - */ -typedef struct _adc_channel_config -{ - uint32_t channelNumber; /*!< Setting the conversion channel number. The available range is 0-31. - See channel connection information for each chip in Reference - Manual document. */ - bool enableInterruptOnConversionCompleted; /*!< Generate an interrupt request once the conversion is completed. */ -} adc_channel_config_t; -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization - * @{ - */ - -/*! - * @brief Initialize the ADC module. - * - * @param base ADC peripheral base address. - * @param config Pointer to "adc_config_t" structure. - */ -void ADC_Init(ADC_Type *base, const adc_config_t *config); - -/*! - * @brief De-initializes the ADC module. - * - * @param base ADC peripheral base address. - */ -void ADC_Deinit(ADC_Type *base); - -/*! - * @brief Gets an available pre-defined settings for the converter's configuration. - * - * This function initializes the converter configuration structure with available settings. The default values are: - * @code - * config->enableAsynchronousClockOutput = true; - * config->enableOverWrite = false; - * config->enableContinuousConversion = false; - * config->enableHighSpeed = false; - * config->enableLowPower = false; - * config->enableLongSample = false; - * config->referenceVoltageSource = kADC_ReferenceVoltageSourceAlt0; - * config->samplePeriodMode = kADC_SamplePeriod2or12Clocks; - * config->clockSource = kADC_ClockSourceAD; - * config->clockDriver = kADC_ClockDriver1; - * config->resolution = kADC_Resolution12Bit; - * @endcode - * @param config Pointer to the configuration structure. - */ -void ADC_GetDefaultConfig(adc_config_t *config); - -/*! - * @brief Configures the conversion channel. - * - * This operation triggers the conversion when in software trigger mode. When in hardware trigger mode, this API - * configures the channel while the external trigger source helps to trigger the conversion. - * - * Note that the "Channel Group" has a detailed description. - * To allow sequential conversions of the ADC to be triggered by internal peripherals, the ADC has more than one - * group of status and control registers, one for each conversion. The channel group parameter indicates which group of - * registers are used, for example channel group 0 is for Group A registers and channel group 1 is for Group B - * registers. The - * channel groups are used in a "ping-pong" approach to control the ADC operation. At any point, only one of - * the channel groups is actively controlling ADC conversions. The channel group 0 is used for both software and - * hardware - * trigger modes. Channel groups 1 and greater indicate potentially multiple channel group registers for - * use only in hardware trigger mode. See the chip configuration information in the appropriate MCU reference manual - * about the - * number of SC1n registers (channel groups) specific to this device. None of the channel groups 1 or greater are used - * for software trigger operation. Therefore, writing to these channel groups does not initiate a new conversion. - * Updating the channel group 0 while a different channel group is actively controlling a conversion is allowed and - * vice versa. Writing any of the channel group registers while that specific channel group is actively controlling a - * conversion aborts the current conversion. - * - * @param base ADC peripheral base address. - * @param channelGroup Channel group index. - * @param config Pointer to the "adc_channel_config_t" structure for the conversion channel. - */ -void ADC_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc_channel_config_t *config); - -/*! - * @brief Gets the conversion value. - * - * @param base ADC peripheral base address. - * @param channelGroup Channel group index. - * - * @return Conversion value. - */ -static inline uint32_t ADC_GetChannelConversionValue(ADC_Type *base, uint32_t channelGroup) -{ - assert(channelGroup < (uint32_t)FSL_FEATURE_ADC_CONVERSION_CONTROL_COUNT); - - return base->R[channelGroup]; -} - -/*! - * @brief Gets the status flags of channel. - * - * A conversion is completed when the result of the conversion is transferred into the data - * result registers. (provided the compare function & hardware averaging is disabled), this is - * indicated by the setting of COCOn. If hardware averaging is enabled, COCOn sets only, - * if the last of the selected number of conversions is complete. If the compare function is - * enabled, COCOn sets and conversion result data is transferred only if the compare - * condition is true. If both hardware averaging and compare functions are enabled, then - * COCOn sets only if the last of the selected number of conversions is complete and the - * compare condition is true. - * - * @param base ADC peripheral base address. - * @param channelGroup Channel group index. - * - * @return Status flags of channel.return 0 means COCO flag is 0,return 1 means COCOflag is 1. - */ -static inline uint32_t ADC_GetChannelStatusFlags(ADC_Type *base, uint32_t channelGroup) -{ - assert(channelGroup < (uint32_t)FSL_FEATURE_ADC_CONVERSION_CONTROL_COUNT); - - /* If flag is set,return 1,otherwise, return 0. */ - return (((base->HS) & (1UL << channelGroup)) >> channelGroup); -} - -/*! - * @brief Automates the hardware calibration. - * - * This auto calibration helps to adjust the plus/minus side gain automatically. - * Execute the calibration before using the converter. Note that the software trigger should be used - * during calibration. - * - * @param base ADC peripheral base address. - * - * @return Execution status. - * @retval kStatus_Success Calibration is done successfully. - * @retval kStatus_Fail Calibration has failed. - */ -status_t ADC_DoAutoCalibration(ADC_Type *base); - -/*! - * @brief Set user defined offset. - * - * @param base ADC peripheral base address. - * @param config Pointer to "adc_offest_config_t" structure. - */ -void ADC_SetOffsetConfig(ADC_Type *base, const adc_offest_config_t *config); - -/*! - * @brief Enables generating the DMA trigger when the conversion is complete. - * - * @param base ADC peripheral base address. - * @param enable Switcher of the DMA feature. "true" means enabled, "false" means not enabled. - */ -static inline void ADC_EnableDMA(ADC_Type *base, bool enable) -{ - if (enable) - { - base->GC |= ADC_GC_DMAEN_MASK; - } - else - { - base->GC &= ~ADC_GC_DMAEN_MASK; - } -} - -/*! - * @brief Enables the hardware trigger mode. - * - * @param base ADC peripheral base address. - * @param enable Switcher of the trigger mode. "true" means hardware tirgger mode,"false" means software mode. - */ -#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) -static inline void ADC_EnableHardwareTrigger(ADC_Type *base, bool enable) -{ - if (enable) - { - base->CFG |= ADC_CFG_ADTRG_MASK; - } - else - { - base->CFG &= ~ADC_CFG_ADTRG_MASK; - } -} -#endif - -/*! - * @brief Configures the hardware compare mode. - * - * The hardware compare mode provides a way to process the conversion result automatically by using hardware. Only the - * result - * in the compare range is available. To compare the range, see "adc_hardware_compare_mode_t" or the appopriate - * reference - * manual for more information. - * - * @param base ADC peripheral base address. - * @param config Pointer to "adc_hardware_compare_config_t" structure. - * - */ -void ADC_SetHardwareCompareConfig(ADC_Type *base, const adc_hardware_compare_config_t *config); - -/*! - * @brief Configures the hardware average mode. - * - * The hardware average mode provides a way to process the conversion result automatically by using hardware. The - * multiple - * conversion results are accumulated and averaged internally making them easier to read. - * - * @param base ADC peripheral base address. - * @param mode Setting the hardware average mode. See "adc_hardware_average_mode_t". - */ -void ADC_SetHardwareAverageConfig(ADC_Type *base, adc_hardware_average_mode_t mode); - -/*! - * @brief Gets the converter's status flags. - * - * @param base ADC peripheral base address. - * - * @return Flags' mask if indicated flags are asserted. See "adc_status_flags_t". - */ -static inline uint32_t ADC_GetStatusFlags(ADC_Type *base) -{ - return base->GS; -} - -/*! - * @brief Clears the converter's status falgs. - * - * @param base ADC peripheral base address. - * @param mask Mask value for the cleared flags. See "adc_status_flags_t". - */ -void ADC_ClearStatusFlags(ADC_Type *base, uint32_t mask); - -/*! - *@} - */ - -#if defined(__cplusplus) -} -#endif - -/*! - *@} - */ - -#endif /* _FSL_ADC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_adc_etc.c b/devices/MIMXRT1052/drivers/fsl_adc_etc.c deleted file mode 100644 index 24daeed..0000000 --- a/devices/MIMXRT1052/drivers/fsl_adc_etc.c +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_adc_etc.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.adc_etc" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -#if defined(ADC_ETC_CLOCKS) -/*! - * @brief Get instance number for ADC_ETC module. - * - * @param base ADC_ETC peripheral base address - */ -static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to ADC_ETC bases for each instance. */ -static ADC_ETC_Type *const s_adcetcBases[] = ADC_ETC_BASE_PTRS; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to ADC_ETC clocks for each instance. */ -static const clock_ip_name_t s_adcetcClocks[] = ADC_ETC_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base) -{ - uint32_t instance = 0U; - uint32_t adcetcArrayCount = (sizeof(s_adcetcBases) / sizeof(s_adcetcBases[0])); - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < adcetcArrayCount; instance++) - { - if (s_adcetcBases[instance] == base) - { - break; - } - } - - assert(instance < adcetcArrayCount); - - return instance; -} -#endif /* ADC_ETC_CLOCKS */ - -/*! - * brief Initialize the ADC_ETC module. - * - * param base ADC_ETC peripheral base address. - * param config Pointer to "adc_etc_config_t" structure. - */ -void ADC_ETC_Init(ADC_ETC_Type *base, const adc_etc_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32 = 0U; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -#if defined(ADC_ETC_CLOCKS) - /* Open clock gate. */ - CLOCK_EnableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]); -#endif /* ADC_ETC_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Disable software reset. */ - ADC_ETC_DoSoftwareReset(base, false); - - /* Set ADC_ETC_CTRL register. */ - tmp32 = -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - ADC_ETC_CTRL_EXT0_TRIG_PRIORITY(config->TSC0triggerPriority) | -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - ADC_ETC_CTRL_EXT1_TRIG_PRIORITY(config->TSC1triggerPriority) | -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - ADC_ETC_CTRL_PRE_DIVIDER(config->clockPreDivider) | ADC_ETC_CTRL_TRIG_ENABLE(config->XBARtriggerMask) -#if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL - | ADC_ETC_CTRL_DMA_MODE_SEL(config->dmaMode) -#endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/ - ; - -#if (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) || \ - (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) - if (config->enableTSCBypass) - { - tmp32 |= ADC_ETC_CTRL_TSC_BYPASS_MASK; - } -#endif -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - if (config->enableTSC0Trigger) - { - tmp32 |= ADC_ETC_CTRL_EXT0_TRIG_ENABLE_MASK; - } -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - if (config->enableTSC1Trigger) - { - tmp32 |= ADC_ETC_CTRL_EXT1_TRIG_ENABLE_MASK; - } -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - base->CTRL = tmp32; -} - -/*! - * brief De-Initialize the ADC_ETC module. - * - * param base ADC_ETC peripheral base address. - */ -void ADC_ETC_Deinit(ADC_ETC_Type *base) -{ - /* Do software reset to clear all logical. */ - ADC_ETC_DoSoftwareReset(base, true); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -#if defined(ADC_ETC_CLOCKS) - /* Close clock gate. */ - CLOCK_DisableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]); -#endif /* ADC_ETC_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets an available pre-defined settings for the ADC_ETC's configuration. - * This function initializes the ADC_ETC's configuration structure with available settings. The default values are: - * code - * config->enableTSCBypass = true; - * config->enableTSC0Trigger = false; - * config->enableTSC1Trigger = false; - * config->TSC0triggerPriority = 0U; - * config->TSC1triggerPriority = 0U; - * config->clockPreDivider = 0U; - * config->XBARtriggerMask = 0U; - * endCode - * - * param config Pointer to "adc_etc_config_t" structure. - */ -void ADC_ETC_GetDefaultConfig(adc_etc_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - -#if (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) || \ - (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) - config->enableTSCBypass = true; -#endif - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - config->enableTSC0Trigger = false; -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - config->enableTSC1Trigger = false; -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - -#if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL - config->dmaMode = kADC_ETC_TrigDMAWithLatchedSignal; -#endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - config->TSC0triggerPriority = 0U; -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - config->TSC1triggerPriority = 0U; -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - config->clockPreDivider = 0U; - config->XBARtriggerMask = 0U; -} - -/*! - * brief Set the external XBAR trigger configuration. - * - * param base ADC_ETC peripheral base address. - * param triggerGroup Trigger group index. - * param config Pointer to "adc_etc_trigger_config_t" structure. - */ -void ADC_ETC_SetTriggerConfig(ADC_ETC_Type *base, uint32_t triggerGroup, const adc_etc_trigger_config_t *config) -{ - assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT); - assert(ADC_ETC_TRIGn_COUNTER_COUNT > triggerGroup); - - uint32_t tmp32 = 0U; - - /* Set ADC_ETC_TRGn_CTRL register. */ - tmp32 = ADC_ETC_TRIGn_CTRL_TRIG_CHAIN(config->triggerChainLength) | - ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY(config->triggerPriority); - if (config->enableSyncMode) - { - tmp32 |= ADC_ETC_TRIGn_CTRL_SYNC_MODE_MASK; - } - if (config->enableSWTriggerMode) - { - tmp32 |= ADC_ETC_TRIGn_CTRL_TRIG_MODE_MASK; - } - base->TRIG[triggerGroup].TRIGn_CTRL = tmp32; - - /* Set ADC_ETC_TRGn_COUNTER register. */ - tmp32 = ADC_ETC_TRIGn_COUNTER_INIT_DELAY(config->initialDelay) | - ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL(config->sampleIntervalDelay); - base->TRIG[triggerGroup].TRIGn_COUNTER = tmp32; -} - -/*! - * brief Set the external XBAR trigger chain configuration. - * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means Trigger0 source's chain1 would be - * configurated. - * - * param base ADC_ETC peripheral base address. - * param triggerGroup Trigger group index. Available number is 0~7. - * param chainGroup Trigger chain group index. Available number is 0~7. - * param config Pointer to "adc_etc_trigger_chain_config_t" structure. - */ -void ADC_ETC_SetTriggerChainConfig(ADC_ETC_Type *base, - uint32_t triggerGroup, - uint32_t chainGroup, - const adc_etc_trigger_chain_config_t *config) -{ - assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT); - - uint32_t tmp32 = 0U; - uint32_t tmpReg = 0U; - uint8_t mRemainder = (uint8_t)(chainGroup % 2U); - - /* Set ADC_ETC_TRIGn_CHAINm register. */ - tmp32 = ADC_ETC_TRIGn_CHAIN_1_0_HWTS0(config->ADCHCRegisterSelect) | - ADC_ETC_TRIGn_CHAIN_1_0_CSEL0(config->ADCChannelSelect) | - ADC_ETC_TRIGn_CHAIN_1_0_IE0(config->InterruptEnable); - if (true == config->enableB2BMode) - { - tmp32 |= ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK; - } -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - if (true == config->enableIrq) - { - tmp32 |= ADC_ETC_TRIGn_CHAIN_1_0_IE0_EN_MASK; - } -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ - switch (chainGroup / 2U) - { - case 0U: /* Configurate trigger chain0 and chain 1. */ - tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_1_0; - if (mRemainder == 0U) /* Chain 0. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_MASK | - ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE0_MASK); - tmpReg |= tmp32; - } - else /* Chain 1. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_MASK | - ADC_ETC_TRIGn_CHAIN_1_0_B2B1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE1_MASK); - tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_SHIFT); - } - base->TRIG[triggerGroup].TRIGn_CHAIN_1_0 = tmpReg; - break; - case 1U: /* Configurate trigger chain2 and chain 3. */ - tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_3_2; - if (mRemainder == 0U) /* Chain 2. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_MASK | - ADC_ETC_TRIGn_CHAIN_3_2_B2B2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE2_MASK); - tmpReg |= tmp32; - } - else /* Chain 3. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_MASK | - ADC_ETC_TRIGn_CHAIN_3_2_B2B3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE3_MASK); - tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_SHIFT); - } - base->TRIG[triggerGroup].TRIGn_CHAIN_3_2 = tmpReg; - break; - case 2U: /* Configurate trigger chain4 and chain 5. */ - tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_5_4; - if (mRemainder == 0U) /* Chain 4. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_MASK | - ADC_ETC_TRIGn_CHAIN_5_4_B2B4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE4_MASK); - tmpReg |= tmp32; - } - else /* Chain 5. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_MASK | - ADC_ETC_TRIGn_CHAIN_5_4_B2B5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE5_MASK); - tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_SHIFT); - } - base->TRIG[triggerGroup].TRIGn_CHAIN_5_4 = tmpReg; - break; - case 3U: /* Configurate trigger chain6 and chain 7. */ - tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_7_6; - if (mRemainder == 0U) /* Chain 6. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_MASK | - ADC_ETC_TRIGn_CHAIN_7_6_B2B6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE6_MASK); - tmpReg |= tmp32; - } - else /* Chain 7. */ - { - tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_MASK | - ADC_ETC_TRIGn_CHAIN_7_6_B2B7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE7_MASK); - tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_SHIFT); - } - base->TRIG[triggerGroup].TRIGn_CHAIN_7_6 = tmpReg; - break; - default: - assert(false); - break; - } -} - -/*! - * brief Gets the interrupt status flags of external XBAR and TSC triggers. - * - * param base ADC_ETC peripheral base address. - * param sourceIndex trigger source index. - * - * return Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask". - */ -uint32_t ADC_ETC_GetInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex) -{ - uint32_t tmp32 = 0U; - - if (((base->DONE0_1_IRQ) & ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << (uint32_t)sourceIndex)) != 0U) - { - tmp32 |= (uint32_t)kADC_ETC_Done0StatusFlagMask; /* Customized DONE0 status flags mask, which is defined in - fsl_adc_etc.h file. */ - } - if (((base->DONE0_1_IRQ) & ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << (uint32_t)sourceIndex)) != 0U) - { - tmp32 |= (uint32_t)kADC_ETC_Done1StatusFlagMask; /* Customized DONE1 status flags mask, which is defined in - fsl_adc_etc.h file. */ - } - if (((base->DONE2_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK << (uint32_t)sourceIndex)) != 0U) - { - tmp32 |= (uint32_t)kADC_ETC_Done2StatusFlagMask; /* Customized DONE2 status flags mask, which is defined in - fsl_adc_etc.h file. */ - } -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - if (((base->DONE2_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE3_MASK << (uint32_t)sourceIndex)) != 0U) - { - tmp32 |= (uint32_t)kADC_ETC_Done3StatusFlagMask; /* Customized DONE3 status flags mask, which is defined in - fsl_adc_etc.h file. */ - } -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ - if (((base->DONE2_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK << (uint32_t)sourceIndex)) != 0U) - { - tmp32 |= (uint32_t)kADC_ETC_ErrorStatusFlagMask; /* Customized ERROR status flags mask, which is defined in - fsl_adc_etc.h file. */ - } - return tmp32; -} - -/*! - * brief Clears the ADC_ETC's interrupt status falgs. - * - * param base ADC_ETC peripheral base address. - * param sourceIndex trigger source index. - * param mask Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask". - */ -void ADC_ETC_ClearInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex, uint32_t mask) -{ - if (0U != (mask & (uint32_t)kADC_ETC_Done0StatusFlagMask)) /* Write 1 to clear DONE0 status flags. */ - { - base->DONE0_1_IRQ = ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << (uint32_t)sourceIndex); - } - if (0U != (mask & (uint32_t)kADC_ETC_Done1StatusFlagMask)) /* Write 1 to clear DONE1 status flags. */ - { - base->DONE0_1_IRQ = ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << (uint32_t)sourceIndex); - } - if (0U != (mask & (uint32_t)kADC_ETC_Done2StatusFlagMask)) /* Write 1 to clear DONE2 status flags. */ - { - base->DONE2_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK << (uint32_t)sourceIndex); - } -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - if (0U != (mask & (uint32_t)kADC_ETC_Done3StatusFlagMask)) /* Write 1 to clear DONE3 status flags. */ - { - base->DONE2_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE3_MASK << (uint32_t)sourceIndex); - } -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ - if (0U != (mask & (uint32_t)kADC_ETC_ErrorStatusFlagMask)) /* Write 1 to clear ERROR status flags. */ - { - base->DONE2_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK << (uint32_t)sourceIndex); - } -} - -/*! - * brief Get ADC conversion result from external XBAR sources. - * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means the API would - * return Trigger0 source's chain1 conversion result. - * - * param base ADC_ETC peripheral base address. - * param triggerGroup Trigger group index. Available number is 0~7. - * param chainGroup Trigger chain group index. Available number is 0~7. - * return ADC conversion result value. - */ -uint32_t ADC_ETC_GetADCConversionValue(ADC_ETC_Type *base, uint32_t triggerGroup, uint32_t chainGroup) -{ - assert(triggerGroup < ADC_ETC_TRIGn_RESULT_1_0_COUNT); - - uint32_t mADCResult; - uint8_t mRemainder = (uint8_t)(chainGroup % 2U); - - switch (chainGroup / 2U) - { - case 0U: - if (0U == mRemainder) - { - mADCResult = ADC_ETC_TRIGn_RESULT_1_0_DATA0_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_1_0); - } - else - { - mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_1_0) >> ADC_ETC_TRIGn_RESULT_1_0_DATA1_SHIFT; - } - break; - case 1U: - if (0U == mRemainder) - { - mADCResult = ADC_ETC_TRIGn_RESULT_3_2_DATA2_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_3_2); - } - else - { - mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_3_2) >> ADC_ETC_TRIGn_RESULT_3_2_DATA3_SHIFT; - } - break; - case 2U: - if (0U == mRemainder) - { - mADCResult = ADC_ETC_TRIGn_RESULT_5_4_DATA4_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_5_4); - } - else - { - mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_5_4) >> ADC_ETC_TRIGn_RESULT_5_4_DATA5_SHIFT; - } - break; - case 3U: - if (0U == mRemainder) - { - mADCResult = ADC_ETC_TRIGn_RESULT_7_6_DATA6_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_7_6); - } - else - { - mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_7_6) >> ADC_ETC_TRIGn_RESULT_7_6_DATA7_SHIFT; - } - break; - default: - mADCResult = 0U; - assert(false); - break; - } - return mADCResult; -} diff --git a/devices/MIMXRT1052/drivers/fsl_adc_etc.h b/devices/MIMXRT1052/drivers/fsl_adc_etc.h deleted file mode 100644 index 2a9092a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_adc_etc.h +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_ADC_ETC_H_ -#define _FSL_ADC_ETC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup adc_etc - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/*! @brief ADC_ETC driver version */ -#define FSL_ADC_ETC_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) /*!< Version 2.2.0. */ -/*! @brief The mask of status flags cleared by writing 1. */ -#define ADC_ETC_DMA_CTRL_TRGn_REQ_MASK 0xFF0000U - -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN -#if defined(ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE2_MASK) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE2_MASK -#define DONE2_ERR_IRQ DONE2_3_ERR_IRQ -#endif /* ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE2_MASK */ - -#if defined(ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE3_MASK) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE3_MASK ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE3_MASK -#endif /* ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE3_MASK */ - -#if defined(ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_ERR_MASK) -#define ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_ERR_MASK -#endif /* ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_ERR_MASK */ - -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ - -/*! - * @brief ADC_ETC customized status flags mask. - */ -enum _adc_etc_status_flag_mask -{ - kADC_ETC_Done0StatusFlagMask = 1U << 0U, - kADC_ETC_Done1StatusFlagMask = 1U << 1U, - kADC_ETC_Done2StatusFlagMask = 1U << 2U, -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - kADC_ETC_Done3StatusFlagMask = 1U << 3U, - kADC_ETC_ErrorStatusFlagMask = 1U << 4U, -#else - kADC_ETC_ErrorStatusFlagMask = 1U << 3U, -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ -}; - -/*! - * @brief External triggers sources. - */ -typedef enum _adc_etc_external_trigger_source -{ - /* External XBAR sources. Support HW or SW mode. */ - kADC_ETC_Trg0TriggerSource = 0U, /* External XBAR trigger0 source. */ - kADC_ETC_Trg1TriggerSource = 1U, /* External XBAR trigger1 source. */ - kADC_ETC_Trg2TriggerSource = 2U, /* External XBAR trigger2 source. */ - kADC_ETC_Trg3TriggerSource = 3U, /* External XBAR trigger3 source. */ - kADC_ETC_Trg4TriggerSource = 4U, /* External XBAR trigger4 source. */ - kADC_ETC_Trg5TriggerSource = 5U, /* External XBAR trigger5 source. */ - kADC_ETC_Trg6TriggerSource = 6U, /* External XBAR trigger6 source. */ - kADC_ETC_Trg7TriggerSource = 7U, /* External XBAR trigger7 source. */ - /* External TSC sources. Only support HW mode. */ - kADC_ETC_TSC0TriggerSource = 8U, /* External TSC trigger0 source. */ - kADC_ETC_TSC1TriggerSource = 9U, /* External TSC trigger1 source. */ -} adc_etc_external_trigger_source_t; - -/*! - * @brief Interrupt enable/disable mask. - */ -typedef enum _adc_etc_interrupt_enable -{ -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - kADC_ETC_Done0InterruptEnable = 0U, /* Enable the DONE0 interrupt when ADC conversions complete. */ - kADC_ETC_Done1InterruptEnable = 1U, /* Enable the DONE1 interrupt when ADC conversions complete. */ - kADC_ETC_Done2InterruptEnable = 2U, /* Enable the DONE2 interrupt when ADC conversions complete. */ - kADC_ETC_Done3InterruptEnable = 3U, /* Enable the DONE3 interrupt when ADC conversions complete. */ -#else - kADC_ETC_InterruptDisable = 0U, /* Disable the ADC_ETC interrupt. */ - kADC_ETC_Done0InterruptEnable = 1U, /* Enable the DONE0 interrupt when ADC conversions complete. */ - kADC_ETC_Done1InterruptEnable = 2U, /* Enable the DONE1 interrupt when ADC conversions complete. */ - kADC_ETC_Done2InterruptEnable = 3U, /* Enable the DONE2 interrupt when ADC conversions complete. */ -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ -} adc_etc_interrupt_enable_t; - -#if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL -/*! - * @brief DMA mode selection. - */ -typedef enum _adc_etc_dma_mode_selection -{ - kADC_ETC_TrigDMAWithLatchedSignal = - 0U, /* Trig DMA_REQ with latched signal, REQ will be cleared when ACK and source request cleared. */ - kADC_ETC_TrigDMAWithPulsedSignal = 1U, /* Trig DMA_REQ with pulsed signal, REQ will be cleared by ACK only. */ -} adc_etc_dma_mode_selection_t; -#endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/ - -/*! - * @brief ADC_ETC configuration. - */ -typedef struct _adc_etc_config -{ -#if ((!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) || \ - (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG))) - bool enableTSCBypass; /* If bypass TSC, TSC would trigger ADC directly. - Otherwise TSC would trigger ADC through ADC_ETC. */ -#endif - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - bool enableTSC0Trigger; /* Enable external TSC0 trigger. It is valid when enableTSCBypass = false. */ -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG) - bool enableTSC1Trigger; /* Enable external TSC1 trigger. It is valid when enableTSCBypass = false.*/ -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG */ - -#if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL - adc_etc_dma_mode_selection_t dmaMode; /* Select the ADC_ETC DMA mode. */ -#endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) - uint32_t TSC0triggerPriority; /* External TSC0 trigger priority, 7 is highest, 0 is lowest. */ -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */ - -#if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG) - uint32_t TSC1triggerPriority; /* External TSC1 trigger priority, 7 is highest, 0 is lowest. */ -#endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC1_TRIG */ - uint32_t clockPreDivider; /* Pre-divider for trig delay and interval. Available range is 0-255. - Clock would be divided by (clockPreDivider+1). */ - uint32_t XBARtriggerMask; /* Enable the corresponding trigger source. Available range is trigger0:0x01 to - trigger7:0x80 - For example, XBARtriggerMask = 0x7U, which means trigger0, trigger1 and trigger2 is - enabled. */ -} adc_etc_config_t; - -/*! - * @brief ADC_ETC trigger chain configuration. - */ -typedef struct _adc_etc_trigger_chain_config -{ - bool enableB2BMode; /* Enable ADC_ETC BackToBack mode. when not enabled B2B mode, - wait until interval delay is reached. */ - uint32_t ADCHCRegisterSelect; /* Select relevant ADC_HCx register to trigger. 1U : HC0, 2U: HC1, 4U: HC2 ... */ - uint32_t ADCChannelSelect; /* Select ADC sample channel. */ - adc_etc_interrupt_enable_t InterruptEnable; /* Enable/disable Interrupt. */ -#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN - bool enableIrq; /* Enable IRQ for selected interrupt enable choice in "InterruptEnable" */ -#endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */ -} adc_etc_trigger_chain_config_t; - -/*! - * @brief ADC_ETC trigger configuration. - */ -typedef struct _adc_etc_trigger_config -{ - bool enableSyncMode; /* Enable the sync Mode, In SyncMode ADC1 and ADC2 are controlled by the same trigger source. - In AsyncMode ADC1 and ADC2 are controlled by separate trigger source. */ - bool enableSWTriggerMode; /* Enable the sofware trigger mode. */ - uint32_t triggerChainLength; /* TRIG chain length to the ADC. 0: Trig length is 1. ... 7: Trig length is 8. */ - uint32_t triggerPriority; /* External trigger priority, 7 is highest, 0 is lowest. */ - uint32_t sampleIntervalDelay; /* Set sampling interval delay. */ - uint32_t initialDelay; /* Set trigger initial delay. */ -} adc_etc_trigger_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization - * @{ - */ - -/*! - * @brief Initialize the ADC_ETC module. - * - * @param base ADC_ETC peripheral base address. - * @param config Pointer to "adc_etc_config_t" structure. - */ -void ADC_ETC_Init(ADC_ETC_Type *base, const adc_etc_config_t *config); - -/*! - * @brief De-Initialize the ADC_ETC module. - * - * @param base ADC_ETC peripheral base address. - */ -void ADC_ETC_Deinit(ADC_ETC_Type *base); - -/*! - * @brief Gets an available pre-defined settings for the ADC_ETC's configuration. - * This function initializes the ADC_ETC's configuration structure with available settings. The default values are: - * @code - * config->enableTSCBypass = true; - * config->enableTSC0Trigger = false; - * config->enableTSC1Trigger = false; - * config->TSC0triggerPriority = 0U; - * config->TSC1triggerPriority = 0U; - * config->clockPreDivider = 0U; - * config->XBARtriggerMask = 0U; - * @endcode - * - * @param config Pointer to "adc_etc_config_t" structure. - */ -void ADC_ETC_GetDefaultConfig(adc_etc_config_t *config); - -/*! - * @brief Set the external XBAR trigger configuration. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. - * @param config Pointer to "adc_etc_trigger_config_t" structure. - */ -void ADC_ETC_SetTriggerConfig(ADC_ETC_Type *base, uint32_t triggerGroup, const adc_etc_trigger_config_t *config); - -/*! - * @brief Set the external XBAR trigger chain configuration. - * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means Trigger0 source's chain1 would be - * configurated. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. Available number is 0~7. - * @param chainGroup Trigger chain group index. Available number is 0~7. - * @param config Pointer to "adc_etc_trigger_chain_config_t" structure. - */ -void ADC_ETC_SetTriggerChainConfig(ADC_ETC_Type *base, - uint32_t triggerGroup, - uint32_t chainGroup, - const adc_etc_trigger_chain_config_t *config); - -/*! - * @brief Gets the interrupt status flags of external XBAR and TSC triggers. - * - * @param base ADC_ETC peripheral base address. - * @param sourceIndex trigger source index. - * - * @return Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask". - */ -uint32_t ADC_ETC_GetInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex); - -/*! - * @brief Clears the ADC_ETC's interrupt status falgs. - * - * @param base ADC_ETC peripheral base address. - * @param sourceIndex trigger source index. - * @param mask Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask". - */ -void ADC_ETC_ClearInterruptStatusFlags(ADC_ETC_Type *base, - adc_etc_external_trigger_source_t sourceIndex, - uint32_t mask); - -/*! - * @brief Enable the DMA corresponding to each trigger source. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. Available number is 0~7. - */ -static inline void ADC_ETC_EnableDMA(ADC_ETC_Type *base, uint32_t triggerGroup) -{ - /* Avoid clearing status flags at the same time. */ - base->DMA_CTRL = (base->DMA_CTRL | ((uint32_t)ADC_ETC_DMA_CTRL_TRIG0_ENABLE_MASK << (uint32_t)triggerGroup)) & - ~ADC_ETC_DMA_CTRL_TRGn_REQ_MASK; -} - -/*! - * @brief Disable the DMA corresponding to each trigger sources. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. Available number is 0~7. - */ -static inline void ADC_ETC_DisableDMA(ADC_ETC_Type *base, uint32_t triggerGroup) -{ - /* Avoid clearing status flags at the same time. */ - base->DMA_CTRL = (base->DMA_CTRL & ~((uint32_t)ADC_ETC_DMA_CTRL_TRIG0_ENABLE_MASK << (uint32_t)triggerGroup)) & - ~ADC_ETC_DMA_CTRL_TRGn_REQ_MASK; -} - -/*! - * @brief Get the DMA request status falgs. Only external XBAR sources support DMA request. - * - * @param base ADC_ETC peripheral base address. - * @return Mask of external XBAR tirgger's DMA request asserted flags. Available range is trigger0:0x01 to - * trigger7:0x80. - */ -static inline uint32_t ADC_ETC_GetDMAStatusFlags(ADC_ETC_Type *base) -{ - return (((base->DMA_CTRL) & ADC_ETC_DMA_CTRL_TRGn_REQ_MASK) >> ADC_ETC_DMA_CTRL_TRIG0_REQ_SHIFT); -} - -/*! - * @brief Clear the DMA request status falgs. Only external XBAR sources support DMA request. - * - * @param base ADC_ETC peripheral base address. - * @param mask Mask of external XBAR tirgger's DMA request asserted flags. Available range is trigger0:0x01 to - * trigger7:0x80. - */ -static inline void ADC_ETC_ClearDMAStatusFlags(ADC_ETC_Type *base, uint32_t mask) -{ - base->DMA_CTRL = ((base->DMA_CTRL) & ~ADC_ETC_DMA_CTRL_TRGn_REQ_MASK) | (mask << ADC_ETC_DMA_CTRL_TRIG0_REQ_SHIFT); -} - -/*! - * @brief When enable, all logical will be reset. - * - * @param base ADC_ETC peripheral base address. - * @param enable Enable/Disable the software reset. - */ -static inline void ADC_ETC_DoSoftwareReset(ADC_ETC_Type *base, bool enable) -{ - if (enable) - { - base->CTRL |= ADC_ETC_CTRL_SOFTRST_MASK; - } - else - { - base->CTRL &= ~ADC_ETC_CTRL_SOFTRST_MASK; - } -} - -/*! - * @brief Do software trigger corresponding to each XBAR trigger sources. - * Each XBAR trigger sources can be configured as HW or SW trigger mode. In hardware trigger mode, - * trigger source is from XBAR. In software mode, trigger source is from software tigger. TSC trigger sources - * can only work in hardware trigger mode. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. Available number is 0~7. - */ -static inline void ADC_ETC_DoSoftwareTrigger(ADC_ETC_Type *base, uint32_t triggerGroup) -{ - assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT); - - base->TRIG[triggerGroup].TRIGn_CTRL |= ADC_ETC_TRIGn_CTRL_SW_TRIG_MASK; -} - -/*! - * @brief Get ADC conversion result from external XBAR sources. - * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means the API would - * return Trigger0 source's chain1 conversion result. - * - * @param base ADC_ETC peripheral base address. - * @param triggerGroup Trigger group index. Available number is 0~7. - * @param chainGroup Trigger chain group index. Available number is 0~7. - * @return ADC conversion result value. - */ -uint32_t ADC_ETC_GetADCConversionValue(ADC_ETC_Type *base, uint32_t triggerGroup, uint32_t chainGroup); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/* @} */ - -#endif /* _FSL_ADC_ETC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_aipstz.c b/devices/MIMXRT1052/drivers/fsl_aipstz.c deleted file mode 100644 index 077b4e0..0000000 --- a/devices/MIMXRT1052/drivers/fsl_aipstz.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_aipstz.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.aipstz" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * brief Configure the privilege level for master. - * - * param base AIPSTZ peripheral base pointer - * param master Masters for AIPSTZ. - * param privilegeConfig Configuration is ORed from aipstz_master_privilege_level_t. - */ -void AIPSTZ_SetMasterPriviledgeLevel(AIPSTZ_Type *base, aipstz_master_t master, uint32_t privilegeConfig) -{ - uint32_t mask = ((uint32_t)master >> 8U) - 1U; - uint32_t shift = (uint32_t)master & 0xFFU; - base->MPR = (base->MPR & (~(mask << shift))) | (privilegeConfig << shift); -} - -/*! - * brief Configure the access for peripheral. - * - * param base AIPSTZ peripheral base pointer - * param master Peripheral for AIPSTZ. - * param accessControl Configuration is ORed from aipstz_peripheral_access_control_t. - */ -void AIPSTZ_SetPeripheralAccessControl(AIPSTZ_Type *base, aipstz_peripheral_t peripheral, uint32_t accessControl) -{ - volatile uint32_t *reg = (uint32_t *)((uint32_t)base + ((uint32_t)peripheral >> 16U)); - uint32_t mask = (((uint32_t)peripheral & 0xFF00U) >> 8U) - 1U; - uint32_t shift = (uint32_t)peripheral & 0xFFU; - - *reg = (*reg & (~(mask << shift))) | ((accessControl & mask) << shift); -} diff --git a/devices/MIMXRT1052/drivers/fsl_aipstz.h b/devices/MIMXRT1052/drivers/fsl_aipstz.h deleted file mode 100644 index a1639f9..0000000 --- a/devices/MIMXRT1052/drivers/fsl_aipstz.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_AIPSTZ_H_ -#define _FSL_AIPSTZ_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup aipstz - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_AIPSTZ_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) /*!< Version 2.0.1 */ -/*@}*/ - -/*! @brief List of AIPSTZ privilege configuration.*/ -typedef enum _aipstz_master_privilege_level -{ - kAIPSTZ_MasterBufferedWriteEnable = (1U << 3), /*!< Write accesses from this master are allowed to be buffered. */ - kAIPSTZ_MasterTrustedForReadEnable = (1U << 2), /*!< This master is trusted for read accesses. */ - kAIPSTZ_MasterTrustedForWriteEnable = (1U << 1), /*!< This master is trusted for write accesses. */ - kAIPSTZ_MasterForceUserModeEnable = 1U /*!< Accesses from this master are forced to user-mode. */ -} aipstz_master_privilege_level_t; - -/*! @brief List of AIPSTZ masters. Organized by width for the 8-15 bits and shift for lower 8 bits.*/ -typedef enum _aipstz_master -{ - kAIPSTZ_Master0 = (0x400U | 28U), - kAIPSTZ_Master1 = (0x400U | 24U), - kAIPSTZ_Master2 = (0x400U | 20U), - kAIPSTZ_Master3 = (0x400U | 16U), - kAIPSTZ_Master5 = (0x400U | 8U) -} aipstz_master_t; - -/*! @brief List of AIPSTZ peripheral access control configuration.*/ -typedef enum _aipstz_peripheral_access_control -{ - kAIPSTZ_PeripheralAllowUntrustedMaster = 1U, - kAIPSTZ_PeripheralWriteProtected = (1U << 1), - kAIPSTZ_PeripheralRequireSupervisor = (1U << 2), - kAIPSTZ_PeripheralAllowBufferedWrite = (1U << 3) -} aipstz_peripheral_access_control_t; - -/*! @brief List of AIPSTZ peripherals. Organized by register offset for higher 32 bits, width for the 8-15 bits and - * shift for lower 8 bits.*/ -typedef enum _aipstz_peripheral -{ - kAIPSTZ_Peripheral0 = ((0x40 << 16) | (4 << 8) | 28), - kAIPSTZ_Peripheral1 = ((0x40 << 16) | (4 << 8) | 24), - kAIPSTZ_Peripheral2 = ((0x40 << 16) | (4 << 8) | 20), - kAIPSTZ_Peripheral3 = ((0x40 << 16) | (4 << 8) | 16), - kAIPSTZ_Peripheral4 = ((0x40 << 16) | (4 << 8) | 12), - kAIPSTZ_Peripheral5 = ((0x40 << 16) | (4 << 8) | 8), - kAIPSTZ_Peripheral6 = ((0x40 << 16) | (4 << 8) | 4), - kAIPSTZ_Peripheral7 = ((0x40 << 16) | (4 << 8) | 0), - kAIPSTZ_Peripheral8 = ((0x44 << 16) | (4 << 8) | 28), - kAIPSTZ_Peripheral9 = ((0x44 << 16) | (4 << 8) | 24), - kAIPSTZ_Peripheral10 = ((0x44 << 16) | (4 << 8) | 20), - kAIPSTZ_Peripheral11 = ((0x44 << 16) | (4 << 8) | 16), - kAIPSTZ_Peripheral12 = ((0x44 << 16) | (4 << 8) | 12), - kAIPSTZ_Peripheral13 = ((0x44 << 16) | (4 << 8) | 8), - kAIPSTZ_Peripheral14 = ((0x44 << 16) | (4 << 8) | 4), - kAIPSTZ_Peripheral15 = ((0x44 << 16) | (4 << 8) | 0), - kAIPSTZ_Peripheral16 = ((0x48 << 16) | (4 << 8) | 28), - kAIPSTZ_Peripheral17 = ((0x48 << 16) | (4 << 8) | 24), - kAIPSTZ_Peripheral18 = ((0x48 << 16) | (4 << 8) | 20), - kAIPSTZ_Peripheral19 = ((0x48 << 16) | (4 << 8) | 16), - kAIPSTZ_Peripheral20 = ((0x48 << 16) | (4 << 8) | 12), - kAIPSTZ_Peripheral21 = ((0x48 << 16) | (4 << 8) | 8), - kAIPSTZ_Peripheral22 = ((0x48 << 16) | (4 << 8) | 4), - kAIPSTZ_Peripheral23 = ((0x48 << 16) | (4 << 8) | 0), - kAIPSTZ_Peripheral24 = ((0x4C << 16) | (4 << 8) | 28), - kAIPSTZ_Peripheral25 = ((0x4C << 16) | (4 << 8) | 24), - kAIPSTZ_Peripheral26 = ((0x4C << 16) | (4 << 8) | 20), - kAIPSTZ_Peripheral27 = ((0x4C << 16) | (4 << 8) | 16), - kAIPSTZ_Peripheral28 = ((0x4C << 16) | (4 << 8) | 12), - kAIPSTZ_Peripheral29 = ((0x4C << 16) | (4 << 8) | 8), - kAIPSTZ_Peripheral30 = ((0x4C << 16) | (4 << 8) | 4), - kAIPSTZ_Peripheral31 = ((0x4C << 16) | (4 << 8) | 0), - kAIPSTZ_Peripheral32 = ((0x50 << 16) | (4 << 8) | 28), - kAIPSTZ_Peripheral33 = ((0x50 << 16) | (4 << 8) | 24) -} aipstz_peripheral_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Configure the privilege level for master. - * - * @param base AIPSTZ peripheral base pointer - * @param master Masters for AIPSTZ. - * @param privilegeConfig Configuration is ORed from @ref aipstz_master_privilege_level_t. - */ -void AIPSTZ_SetMasterPriviledgeLevel(AIPSTZ_Type *base, aipstz_master_t master, uint32_t privilegeConfig); - -/*! - * @brief Configure the access for peripheral. - * - * @param base AIPSTZ peripheral base pointer - * @param peripheral Peripheral for AIPSTZ. - * @param accessControl Configuration is ORed from @ref aipstz_peripheral_access_control_t. - */ -void AIPSTZ_SetPeripheralAccessControl(AIPSTZ_Type *base, aipstz_peripheral_t peripheral, uint32_t accessControl); - -/*! @}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_AIPSTZ_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_aoi.c b/devices/MIMXRT1052/drivers/fsl_aoi.c deleted file mode 100644 index a8f1f29..0000000 --- a/devices/MIMXRT1052/drivers/fsl_aoi.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#include "fsl_aoi.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.aoi" -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to aoi bases for each instance. */ -static AOI_Type *const s_aoiBases[] = AOI_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to aoi clocks for each instance. */ -static const clock_ip_name_t s_aoiClocks[] = AOI_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - /******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for AOI module. - * - * @param base AOI peripheral base address - * - * @return The AOI instance - */ -static uint32_t AOI_GetInstance(AOI_Type *base); -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t AOI_GetInstance(AOI_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_aoiBases); instance++) - { - if (s_aoiBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_aoiBases)); - - return instance; -} - -/*! - * brief Initializes an AOI instance for operation. - * - * This function un-gates the AOI clock. - * - * param base AOI peripheral address. - */ -void AOI_Init(AOI_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock gate from clock manager. */ - CLOCK_EnableClock(s_aoiClocks[AOI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Deinitializes an AOI instance for operation. - * - * This function shutdowns AOI module. - * - * param base AOI peripheral address. - */ -void AOI_Deinit(AOI_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the clock gate from clock manager */ - CLOCK_DisableClock(s_aoiClocks[AOI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets the Boolean evaluation associated. - * - * This function returns the Boolean evaluation associated. - * - * Example: - code - aoi_event_config_t demoEventLogicStruct; - - AOI_GetEventLogicConfig(AOI, kAOI_Event0, &demoEventLogicStruct); - endcode - * - * param base AOI peripheral address. - * param event Index of the event which will be set of type aoi_event_t. - * param config Selected input configuration . - */ -void AOI_GetEventLogicConfig(AOI_Type *base, aoi_event_t event, aoi_event_config_t *config) -{ - assert((uint32_t)event < (uint32_t)FSL_FEATURE_AOI_EVENT_COUNT); - assert(config != NULL); - - uint16_t value; - uint16_t temp; - /* Read BFCRT01 register at event index. */ - value = base->BFCRT[event].BFCRT01; - - temp = (value & AOI_BFCRT01_PT0_AC_MASK) >> AOI_BFCRT01_PT0_AC_SHIFT; - config->PT0AC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT0_BC_MASK) >> AOI_BFCRT01_PT0_BC_SHIFT; - config->PT0BC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT0_CC_MASK) >> AOI_BFCRT01_PT0_CC_SHIFT; - config->PT0CC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT0_DC_MASK) >> AOI_BFCRT01_PT0_DC_SHIFT; - config->PT0DC = (aoi_input_config_t)temp; - - temp = (value & AOI_BFCRT01_PT1_AC_MASK) >> AOI_BFCRT01_PT1_AC_SHIFT; - config->PT1AC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT1_BC_MASK) >> AOI_BFCRT01_PT1_BC_SHIFT; - config->PT1BC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT1_CC_MASK) >> AOI_BFCRT01_PT1_CC_SHIFT; - config->PT1CC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT01_PT1_DC_MASK) >> AOI_BFCRT01_PT1_DC_SHIFT; - config->PT1DC = (aoi_input_config_t)temp; - - /* Read BFCRT23 register at event index. */ - value = base->BFCRT[event].BFCRT23; - - temp = (value & AOI_BFCRT23_PT2_AC_MASK) >> AOI_BFCRT23_PT2_AC_SHIFT; - config->PT2AC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT2_BC_MASK) >> AOI_BFCRT23_PT2_BC_SHIFT; - config->PT2BC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT2_CC_MASK) >> AOI_BFCRT23_PT2_CC_SHIFT; - config->PT2CC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT2_DC_MASK) >> AOI_BFCRT23_PT2_DC_SHIFT; - config->PT2DC = (aoi_input_config_t)temp; - - temp = (value & AOI_BFCRT23_PT3_AC_MASK) >> AOI_BFCRT23_PT3_AC_SHIFT; - config->PT3AC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT3_BC_MASK) >> AOI_BFCRT23_PT3_BC_SHIFT; - config->PT3BC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT3_CC_MASK) >> AOI_BFCRT23_PT3_CC_SHIFT; - config->PT3CC = (aoi_input_config_t)temp; - temp = (value & AOI_BFCRT23_PT3_DC_MASK) >> AOI_BFCRT23_PT3_DC_SHIFT; - config->PT3DC = (aoi_input_config_t)temp; -} - -/*! - * brief Configures an AOI event. - * - * This function configures an AOI event according - * to the aoiEventConfig structure. This function configures all inputs (A, B, C, and D) - * of all product terms (0, 1, 2, and 3) of a desired event. - * - * Example: - code - aoi_event_config_t demoEventLogicStruct; - - demoEventLogicStruct.PT0AC = kAOI_InvInputSignal; - demoEventLogicStruct.PT0BC = kAOI_InputSignal; - demoEventLogicStruct.PT0CC = kAOI_LogicOne; - demoEventLogicStruct.PT0DC = kAOI_LogicOne; - - demoEventLogicStruct.PT1AC = kAOI_LogicZero; - demoEventLogicStruct.PT1BC = kAOI_LogicOne; - demoEventLogicStruct.PT1CC = kAOI_LogicOne; - demoEventLogicStruct.PT1DC = kAOI_LogicOne; - - demoEventLogicStruct.PT2AC = kAOI_LogicZero; - demoEventLogicStruct.PT2BC = kAOI_LogicOne; - demoEventLogicStruct.PT2CC = kAOI_LogicOne; - demoEventLogicStruct.PT2DC = kAOI_LogicOne; - - demoEventLogicStruct.PT3AC = kAOI_LogicZero; - demoEventLogicStruct.PT3BC = kAOI_LogicOne; - demoEventLogicStruct.PT3CC = kAOI_LogicOne; - demoEventLogicStruct.PT3DC = kAOI_LogicOne; - - AOI_SetEventLogicConfig(AOI, kAOI_Event0, demoEventLogicStruct); - endcode - * - * param base AOI peripheral address. - * param event Event which will be configured of type aoi_event_t. - * param eventConfig Pointer to type aoi_event_config_t structure. The user is responsible for - * filling out the members of this structure and passing the pointer to this function. - */ -void AOI_SetEventLogicConfig(AOI_Type *base, aoi_event_t event, const aoi_event_config_t *eventConfig) -{ - assert(eventConfig != NULL); - assert((uint32_t)event < (uint32_t)FSL_FEATURE_AOI_EVENT_COUNT); - - uint16_t value; - /* Calculate value to configure product term 0, 1 */ - value = AOI_BFCRT01_PT0_AC(eventConfig->PT0AC) | AOI_BFCRT01_PT0_BC(eventConfig->PT0BC) | - AOI_BFCRT01_PT0_CC(eventConfig->PT0CC) | AOI_BFCRT01_PT0_DC(eventConfig->PT0DC) | - AOI_BFCRT01_PT1_AC(eventConfig->PT1AC) | AOI_BFCRT01_PT1_BC(eventConfig->PT1BC) | - AOI_BFCRT01_PT1_CC(eventConfig->PT1CC) | AOI_BFCRT01_PT1_DC(eventConfig->PT1DC); - /* Write value to register */ - base->BFCRT[event].BFCRT01 = value; - - /* Reset and calculate value to configure product term 2, 3 */ - value = AOI_BFCRT23_PT2_AC(eventConfig->PT2AC) | AOI_BFCRT23_PT2_BC(eventConfig->PT2BC) | - AOI_BFCRT23_PT2_CC(eventConfig->PT2CC) | AOI_BFCRT23_PT2_DC(eventConfig->PT2DC) | - AOI_BFCRT23_PT3_AC(eventConfig->PT3AC) | AOI_BFCRT23_PT3_BC(eventConfig->PT3BC) | - AOI_BFCRT23_PT3_CC(eventConfig->PT3CC) | AOI_BFCRT23_PT3_DC(eventConfig->PT3DC); - /* Write value to register */ - base->BFCRT[event].BFCRT23 = value; -} diff --git a/devices/MIMXRT1052/drivers/fsl_aoi.h b/devices/MIMXRT1052/drivers/fsl_aoi.h deleted file mode 100644 index 6d905b9..0000000 --- a/devices/MIMXRT1052/drivers/fsl_aoi.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_AOI_H_ -#define _FSL_AOI_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup aoi - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -#ifndef AOI -#define AOI AOI0 /*!< AOI peripheral address */ -#endif - -/*! @name Driver version */ -/*@{*/ -#define FSL_AOI_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) /*!< Version 2.0.1. */ -/*@}*/ - -/*! - * @brief AOI input configurations. - * - * The selection item represents the Boolean evaluations. - */ -typedef enum _aoi_input_config -{ - kAOI_LogicZero = 0x0U, /*!< Forces the input to logical zero. */ - kAOI_InputSignal = 0x1U, /*!< Passes the input signal. */ - kAOI_InvInputSignal = 0x2U, /*!< Inverts the input signal. */ - kAOI_LogicOne = 0x3U /*!< Forces the input to logical one. */ -} aoi_input_config_t; - -/*! - * @brief AOI event indexes, where an event is the collection of the four product - * terms (0, 1, 2, and 3) and the four signal inputs (A, B, C, and D). - */ -typedef enum _aoi_event -{ - kAOI_Event0 = 0x0U, /*!< Event 0 index */ - kAOI_Event1 = 0x1U, /*!< Event 1 index */ - kAOI_Event2 = 0x2U, /*!< Event 2 index */ - kAOI_Event3 = 0x3U /*!< Event 3 index */ -} aoi_event_t; - -/*! - * @brief AOI event configuration structure - * - * Defines structure _aoi_event_config and use the AOI_SetEventLogicConfig() function to make - * whole event configuration. - */ -typedef struct _aoi_event_config -{ - aoi_input_config_t PT0AC; /*!< Product term 0 input A */ - aoi_input_config_t PT0BC; /*!< Product term 0 input B */ - aoi_input_config_t PT0CC; /*!< Product term 0 input C */ - aoi_input_config_t PT0DC; /*!< Product term 0 input D */ - aoi_input_config_t PT1AC; /*!< Product term 1 input A */ - aoi_input_config_t PT1BC; /*!< Product term 1 input B */ - aoi_input_config_t PT1CC; /*!< Product term 1 input C */ - aoi_input_config_t PT1DC; /*!< Product term 1 input D */ - aoi_input_config_t PT2AC; /*!< Product term 2 input A */ - aoi_input_config_t PT2BC; /*!< Product term 2 input B */ - aoi_input_config_t PT2CC; /*!< Product term 2 input C */ - aoi_input_config_t PT2DC; /*!< Product term 2 input D */ - aoi_input_config_t PT3AC; /*!< Product term 3 input A */ - aoi_input_config_t PT3BC; /*!< Product term 3 input B */ - aoi_input_config_t PT3CC; /*!< Product term 3 input C */ - aoi_input_config_t PT3DC; /*!< Product term 3 input D */ -} aoi_event_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus*/ - -/*! - * @name AOI Initialization - * @{ - */ - -/*! - * @brief Initializes an AOI instance for operation. - * - * This function un-gates the AOI clock. - * - * @param base AOI peripheral address. - */ -void AOI_Init(AOI_Type *base); - -/*! - * @brief Deinitializes an AOI instance for operation. - * - * This function shutdowns AOI module. - * - * @param base AOI peripheral address. - */ -void AOI_Deinit(AOI_Type *base); - -/*@}*/ - -/*! - * @name AOI Get Set Operation - * @{ - */ - -/*! - * @brief Gets the Boolean evaluation associated. - * - * This function returns the Boolean evaluation associated. - * - * Example: - @code - aoi_event_config_t demoEventLogicStruct; - - AOI_GetEventLogicConfig(AOI, kAOI_Event0, &demoEventLogicStruct); - @endcode - * - * @param base AOI peripheral address. - * @param event Index of the event which will be set of type aoi_event_t. - * @param config Selected input configuration . - */ -void AOI_GetEventLogicConfig(AOI_Type *base, aoi_event_t event, aoi_event_config_t *config); - -/*! - * @brief Configures an AOI event. - * - * This function configures an AOI event according - * to the aoiEventConfig structure. This function configures all inputs (A, B, C, and D) - * of all product terms (0, 1, 2, and 3) of a desired event. - * - * Example: - @code - aoi_event_config_t demoEventLogicStruct; - - demoEventLogicStruct.PT0AC = kAOI_InvInputSignal; - demoEventLogicStruct.PT0BC = kAOI_InputSignal; - demoEventLogicStruct.PT0CC = kAOI_LogicOne; - demoEventLogicStruct.PT0DC = kAOI_LogicOne; - - demoEventLogicStruct.PT1AC = kAOI_LogicZero; - demoEventLogicStruct.PT1BC = kAOI_LogicOne; - demoEventLogicStruct.PT1CC = kAOI_LogicOne; - demoEventLogicStruct.PT1DC = kAOI_LogicOne; - - demoEventLogicStruct.PT2AC = kAOI_LogicZero; - demoEventLogicStruct.PT2BC = kAOI_LogicOne; - demoEventLogicStruct.PT2CC = kAOI_LogicOne; - demoEventLogicStruct.PT2DC = kAOI_LogicOne; - - demoEventLogicStruct.PT3AC = kAOI_LogicZero; - demoEventLogicStruct.PT3BC = kAOI_LogicOne; - demoEventLogicStruct.PT3CC = kAOI_LogicOne; - demoEventLogicStruct.PT3DC = kAOI_LogicOne; - - AOI_SetEventLogicConfig(AOI, kAOI_Event0, demoEventLogicStruct); - @endcode - * - * @param base AOI peripheral address. - * @param event Event which will be configured of type aoi_event_t. - * @param eventConfig Pointer to type aoi_event_config_t structure. The user is responsible for - * filling out the members of this structure and passing the pointer to this function. - */ -void AOI_SetEventLogicConfig(AOI_Type *base, aoi_event_t event, const aoi_event_config_t *eventConfig); - -#if defined(__cplusplus) -} -#endif /* __cplusplus*/ - -/*@}*/ - -/*!* @} */ - -#endif /* _FSL_AOI_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_bee.c b/devices/MIMXRT1052/drivers/fsl_bee.c deleted file mode 100644 index d4ffdac..0000000 --- a/devices/MIMXRT1052/drivers/fsl_bee.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright 2017, 2019 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_bee.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.bee" -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ - -static void aligned_memcpy(void *dst, const void *src, size_t size) -{ - register uint32_t *to32 = (uint32_t *)(uint32_t *)dst; - register const uint32_t *from32 = (const uint32_t *)(const uint32_t *)src; - - while (size >= sizeof(uint32_t)) - { - *to32 = *from32; - size -= sizeof(uint32_t); - to32++; - from32++; - } -} - -/*! - * brief Resets BEE module to factory default values. - * - * This function performs hardware reset of BEE module. Attributes and keys from software for both regions are cleared. - * - * param base BEE peripheral address. - */ -void BEE_Init(BEE_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_EnableClock(kCLOCK_Bee); -#endif - - base->CTRL = BEE_CTRL_CTRL_SFTRST_N_MASK | BEE_CTRL_CTRL_CLK_EN_MASK; -} - -/*! - * brief Resets BEE module, clears keys for both regions and disables clock to the BEE. - * - * This function performs hardware reset of BEE module and disables clocks. Attributes and keys from software for both - * regions are cleared. - * - * param base BEE peripheral address. - */ -void BEE_Deinit(BEE_Type *base) -{ - base->CTRL &= - ~(BEE_CTRL_BEE_ENABLE_MASK | BEE_CTRL_CTRL_SFTRST_N_MASK | BEE_CTRL_CTRL_CLK_EN_MASK | BEE_CTRL_KEY_VALID_MASK); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(kCLOCK_Bee); -#endif -} - -/*! - * brief Loads default values to the BEE region configuration structure. - * - * Loads default values to the BEE region configuration structure. The default values are as follows: - * code - * config->region0Mode = kBEE_AesCtrMode; - * config->region1Mode = kBEE_AesCtrMode; - * config->region0AddrOffset = 0U; - * config->region1AddrOffset = 0U; - * config->region0SecLevel = kBEE_SecurityLevel3; - * config->region1SecLevel = kBEE_SecurityLevel3; - * config->region1Bot = 0U; - * config->region1Top = 0U; - * config->accessPermission = kBEE_AccessProtDisabled; - * config->endianSwapEn = kBEE_EndianSwapEnabled; - * endcode - * - * param config Configuration structure for BEE peripheral. - */ -void BEE_GetDefaultConfig(bee_region_config_t *config) -{ - assert(config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->region0Mode = kBEE_AesCtrMode; - config->region1Mode = kBEE_AesCtrMode; - config->region0AddrOffset = 0U; - config->region1AddrOffset = 0U; - config->region0SecLevel = kBEE_SecurityLevel3; - config->region1SecLevel = kBEE_SecurityLevel3; - config->region1Bot = 0U; - config->region1Top = 0U; - config->accessPermission = kBEE_AccessProtDisabled; - config->endianSwapEn = kBEE_EndianSwapEnabled; -} - -/*! - * brief Sets BEE configuration. - * - * This function sets BEE peripheral and BEE region settings accorging to given configuration structure. - * - * param base BEE peripheral address. - * param config Configuration structure for BEE. - */ -void BEE_SetConfig(BEE_Type *base, const bee_region_config_t *config) -{ - uint32_t beeCtrlVal; - bool reenable = false; - - /* Wait until BEE is in idle state */ - while (0U == (BEE_GetStatusFlags(base) & (uint32_t)kBEE_IdleFlag)) - { - } - - /* Disable BEE before region configuration in case it is enabled. */ - if ((base->CTRL & BEE_CTRL_BEE_ENABLE_MASK) != 0U) - { - BEE_Disable(base); - reenable = true; - } - - /* Preserve CTRL bit values that are not set by this function */ - beeCtrlVal = base->CTRL & 0xFFFF0037U; - - /* Set variable according to configuration */ - beeCtrlVal |= BEE_CTRL_AC_PROT_EN(config->accessPermission) | BEE_CTRL_LITTLE_ENDIAN(config->endianSwapEn) | - BEE_CTRL_SECURITY_LEVEL_R0(config->region0SecLevel) | BEE_CTRL_CTRL_AES_MODE_R0(config->region0Mode) | - BEE_CTRL_SECURITY_LEVEL_R1(config->region1SecLevel) | BEE_CTRL_CTRL_AES_MODE_R1(config->region1Mode); - - /* Load values to registers */ - base->CTRL = beeCtrlVal; - base->ADDR_OFFSET0 = config->region0AddrOffset; - base->ADDR_OFFSET1 = config->region1AddrOffset; - base->REGION1_BOT = config->region1Bot; - base->REGION1_TOP = config->region1Top; - - /* Reenable BEE if it was enabled before. */ - if (reenable) - { - BEE_Enable(base); - } -} - -/*! - * brief Loads the AES key for selected region into BEE key registers. - * - * This function loads given AES key to BEE register for the given region. - * The key must be 32-bit aligned and stored in little-endian format. - * - * Please note, that eFuse BEE_KEYx_SEL must be set accordingly to be able to load and use key loaded in BEE registers. - * Otherwise, key cannot loaded and BEE will use key from OTPMK or SW_GP2. - * - * param base BEE peripheral address. - * param region Selection of the BEE region to be configured. - * param key AES key (in little-endian format). - * param keySize Size of AES key. - */ -status_t BEE_SetRegionKey(BEE_Type *base, bee_region_t region, const uint8_t *key, size_t keySize) -{ - bool redisable = false; - - /* Key must be 32-bit aligned */ - if ((0U != ((uintptr_t)key & 0x3u)) || (keySize != 16U)) - { - return kStatus_InvalidArgument; - } - - /* Wait until BEE is in idle state */ - while (0U == (BEE_GetStatusFlags(base) & (uint32_t)kBEE_IdleFlag)) - { - } - - /* Clear KEY_VALID bit before new key is loaded */ - base->CTRL &= ~BEE_CTRL_KEY_VALID_MASK; - - /* Write key registers, key is stored in little-endian format in memory */ - aligned_memcpy((uint32_t *)(uint32_t)&base->AES_KEY0_W0, key, keySize); - - /* Enable BEE before key configuration. */ - if (0U == (base->CTRL & BEE_CTRL_BEE_ENABLE_MASK)) - { - BEE_Enable(base); - redisable = true; - } - - if (region == kBEE_Region0) - { - base->CTRL &= ~BEE_CTRL_KEY_REGION_SEL_MASK; - } - - else if (region == kBEE_Region1) - { - base->CTRL |= BEE_CTRL_KEY_REGION_SEL_MASK; - } - - else - { - return kStatus_InvalidArgument; - } - - /* Set KEY_VALID bit to trigger key loading */ - base->CTRL |= BEE_CTRL_KEY_VALID_MASK; - /* Wait until key is ready */ - while (0U == (base->CTRL & BEE_CTRL_KEY_VALID_MASK)) - { - } - - /* Redisable BEE if it was disabled before this function call. */ - if (redisable) - { - BEE_Disable(base); - } - - return kStatus_Success; -} - -/*! - * brief Loads the nonce for selected region into BEE nonce registers. - * - * This function loads given nonce(only AES CTR mode) to BEE register for the given region. - * The nonce must be 32-bit aligned and stored in little-endian format. - * - * param base BEE peripheral address. - * param region Selection of the BEE region to be configured. - * param nonce AES nonce (in little-endian format). - * param nonceSize Size of AES nonce. - */ -status_t BEE_SetRegionNonce(BEE_Type *base, bee_region_t region, const uint8_t *nonce, size_t nonceSize) -{ - /* Nonce must be 32-bit aligned */ - if ((0U != ((uintptr_t)nonce & 0x3u)) || (nonceSize != 16U)) - { - return kStatus_InvalidArgument; - } - - /* Wait until BEE is in idle state */ - while (0U == (BEE_GetStatusFlags(base) & (uint32_t)kBEE_IdleFlag)) - { - } - - /* Write nonce registers, nonce is stored in little-endian format in memory */ - if (region == kBEE_Region0) - { - aligned_memcpy((uint32_t *)(uint32_t)&base->CTR_NONCE0_W0, nonce, nonceSize); - } - - else if (region == kBEE_Region1) - { - aligned_memcpy((uint32_t *)(uint32_t)&base->CTR_NONCE1_W0, nonce, nonceSize); - } - - else - { - return kStatus_InvalidArgument; - } - - return kStatus_Success; -} - -/*! - * brief Gets the BEE status flags. - * - * This function returns status of BEE peripheral. - * - * param base BEE peripheral address. - * - * return The status flags. This is the logical OR of members of the - * enumeration ::bee_status_flags_t - */ -uint32_t BEE_GetStatusFlags(BEE_Type *base) -{ - return base->STATUS; -} - -/*! - * brief Clears the BEE status flags. - * - * param base BEE peripheral base address. - * param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::bee_status_flags_t - */ -void BEE_ClearStatusFlags(BEE_Type *base, uint32_t mask) -{ - /* w1c */ - base->STATUS |= mask; -} diff --git a/devices/MIMXRT1052/drivers/fsl_bee.h b/devices/MIMXRT1052/drivers/fsl_bee.h deleted file mode 100644 index 201177a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_bee.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2017, 2019 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_BEE_H_ -#define _FSL_BEE_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup bee - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief BEE driver version. Version 2.0.2. - * - * Current version: 2.0.2 - * - * Change log: - * - * - 2.0.2 - * - Bug Fixes - * - Fixed MISRA issue. - * - * - 2.0.1 - * - Bug Fixes - * - Fixed bug in key user key loading sequence. BEE must be enabled during loading of user key. - * - Fixed typos in comments. - * - New Features - * - Added configuration setting for endian swap, access permission and region security level. - * - Improvements - * - Setting of AES nonce was moved from BEE_SetRegionKey() into separate BEE_SetRegionNonce() function. - * - Changed handling of region settings. Both regions are configured simultaneously by BEE_SetConfig() function. - * Configuration of FAC start and end address using IOMUXC_GPRs was moved to application. - * - Default value for region address offset was changed to 0. - * - * - 2.0.0 - * - Initial version - */ -#define FSL_BEE_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) -/*@}*/ - -/*! @brief BEE aes mode. */ -typedef enum _bee_aes_mode -{ - kBEE_AesEcbMode = 0U, /*!< AES ECB Mode */ - kBEE_AesCtrMode = 1U /*!< AES CTR Mode */ -} bee_aes_mode_t; - -/*! @brief BEE region. */ -typedef enum _bee_region -{ - kBEE_Region0 = 0U, /*!< BEE region 0 */ - kBEE_Region1 = 1U /*!< BEE region 1 */ -} bee_region_t; - -/*! @brief BEE ac prot enable. */ -typedef enum _bee_ac_prot_enable -{ - kBEE_AccessProtDisabled = 0U, /*!< BEE access permission control disabled */ - kBEE_AccessProtEnabled = 1U /*!< BEE access permission control enabled */ -} bee_ac_prot_enable; - -/*! @brief BEE endian swap enable. */ -typedef enum _bee_endian_swap_enable -{ - kBEE_EndianSwapDisabled = 1U, /*!< BEE endian swap disabled */ - kBEE_EndianSwapEnabled = 0U /*!< BEE endian swap enabled */ -} bee_endian_swap_enable; - -/*! @brief BEE security level. */ -typedef enum _bee_security_level -{ - kBEE_SecurityLevel0 = 0U, /*!< BEE security level 0 */ - kBEE_SecurityLevel1 = 1U, /*!< BEE security level 1 */ - kBEE_SecurityLevel2 = 2U, /*!< BEE security level 2 */ - kBEE_SecurityLevel3 = 3U /*!< BEE security level 3 */ -} bee_security_level; - -/*! @brief BEE status flags. */ -typedef enum _bee_status_flags -{ - kBEE_DisableAbortFlag = 1U, /*!< Disable abort flag. */ - kBEE_Reg0ReadSecViolation = 2U, /*!< Region-0 read channel security violation */ - kBEE_ReadIllegalAccess = 4U, /*!< Read channel illegal access detected */ - kBEE_Reg1ReadSecViolation = 8U, /*!< Region-1 read channel security violation */ - kBEE_Reg0AccessViolation = 16U, /*!< Protected region-0 access violation */ - kBEE_Reg1AccessViolation = 32U, /*!< Protected region-1 access violation */ - kBEE_IdleFlag = BEE_STATUS_BEE_IDLE_MASK /*!< Idle flag */ -} bee_status_flags_t; - -/*! @brief BEE region configuration structure. */ -typedef struct _bee_region_config -{ - bee_aes_mode_t region0Mode; /*!< AES mode used for encryption/decryption for region 0 */ - bee_aes_mode_t region1Mode; /*!< AES mode used for encryption/decryption for region 1 */ - uint32_t region0AddrOffset; /*!< Region 0 address offset */ - uint32_t region1AddrOffset; /*!< Region 1 address offset */ - bee_security_level region0SecLevel; /*!< Region 0 security level */ - bee_security_level region1SecLevel; /*!< Region 1 security level */ - uint32_t region1Bot; /*!< Region 1 bottom address */ - uint32_t region1Top; /*!< Region 1 top address */ - bee_ac_prot_enable accessPermission; /*!< Access permission control enable/disable */ - bee_endian_swap_enable endianSwapEn; /*!< Endian swap enable/disable */ -} bee_region_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Resets BEE module to factory default values. - * - * This function performs hardware reset of BEE module. Attributes and keys from software for both regions are cleared. - * - * @param base BEE peripheral address. - */ -void BEE_Init(BEE_Type *base); - -/*! - * @brief Resets BEE module, clears keys for both regions and disables clock to the BEE. - * - * This function performs hardware reset of BEE module and disables clocks. Attributes and keys from software for both - * regions are cleared. - * - * @param base BEE peripheral address. - */ -void BEE_Deinit(BEE_Type *base); - -/*! - * @brief Enables BEE decryption. - * - * This function enables decryption using BEE. - * - * @param base BEE peripheral address. - */ -static inline void BEE_Enable(BEE_Type *base) -{ - base->CTRL |= BEE_CTRL_BEE_ENABLE_MASK; -} - -/*! - * @brief Disables BEE decryption. - * - * This function disables decryption using BEE. - * - * @param base BEE peripheral address. - */ -static inline void BEE_Disable(BEE_Type *base) -{ - base->CTRL &= ~BEE_CTRL_BEE_ENABLE_MASK; -} - -/*! - * @brief Loads default values to the BEE region configuration structure. - * - * Loads default values to the BEE region configuration structure. The default values are as follows: - * @code - * config->region0Mode = kBEE_AesCtrMode; - * config->region1Mode = kBEE_AesCtrMode; - * config->region0AddrOffset = 0U; - * config->region1AddrOffset = 0U; - * config->region0SecLevel = kBEE_SecurityLevel3; - * config->region1SecLevel = kBEE_SecurityLevel3; - * config->region1Bot = 0U; - * config->region1Top = 0U; - * config->accessPermission = kBEE_AccessProtDisabled; - * config->endianSwapEn = kBEE_EndianSwapEnabled; - * @endcode - * - * @param config Configuration structure for BEE peripheral. - */ -void BEE_GetDefaultConfig(bee_region_config_t *config); - -/*! - * @brief Sets BEE configuration. - * - * This function sets BEE peripheral and BEE region settings accorging to given configuration structure. - * - * @param base BEE peripheral address. - * @param config Configuration structure for BEE. - */ -void BEE_SetConfig(BEE_Type *base, const bee_region_config_t *config); - -/*! - * @brief Loads the AES key for selected region into BEE key registers. - * - * This function loads given AES key to BEE register for the given region. - * The key must be 32-bit aligned and stored in little-endian format. - * - * Please note, that eFuse BEE_KEYx_SEL must be set accordingly to be able to load and use key loaded in BEE registers. - * Otherwise, key cannot loaded and BEE will use key from OTPMK or SW_GP2. - * - * @param base BEE peripheral address. - * @param region Selection of the BEE region to be configured. - * @param key AES key (in little-endian format). - * @param keySize Size of AES key. - */ -status_t BEE_SetRegionKey(BEE_Type *base, bee_region_t region, const uint8_t *key, size_t keySize); - -/*! - * @brief Loads the nonce for selected region into BEE nonce registers. - * - * This function loads given nonce(only AES CTR mode) to BEE register for the given region. - * The nonce must be 32-bit aligned and stored in little-endian format. - * - * @param base BEE peripheral address. - * @param region Selection of the BEE region to be configured. - * @param nonce AES nonce (in little-endian format). - * @param nonceSize Size of AES nonce. - */ -status_t BEE_SetRegionNonce(BEE_Type *base, bee_region_t region, const uint8_t *nonce, size_t nonceSize); - -/*! - * @brief Gets the BEE status flags. - * - * This function returns status of BEE peripheral. - * - * @param base BEE peripheral address. - * - * @return The status flags. This is the logical OR of members of the - * enumeration ::bee_status_flags_t - */ -uint32_t BEE_GetStatusFlags(BEE_Type *base); - -/*! - * @brief Clears the BEE status flags. - * - * @param base BEE peripheral base address. - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::bee_status_flags_t - */ -void BEE_ClearStatusFlags(BEE_Type *base, uint32_t mask); - -#if defined(__cplusplus) -} -#endif - -/*@}*/ - -#endif /* _FSL_BEE_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_cache.c b/devices/MIMXRT1052/drivers/fsl_cache.c deleted file mode 100644 index 721a3fb..0000000 --- a/devices/MIMXRT1052/drivers/fsl_cache.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_cache.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.cache_armv7_m7" -#endif - -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#define L2CACHE_OPERATION_TIMEOUT 0xFFFFFU -#define L2CACHE_8WAYS_MASK 0xFFU -#define L2CACHE_16WAYS_MASK 0xFFFFU -#define L2CACHE_SMALLWAYS_NUM 8U -#define L2CACHE_1KBCOVERTOB 1024U -#define L2CACHE_SAMLLWAYS_SIZE 16U -#define L2CACHE_LOCKDOWN_REGNUM 8 /*!< Lock down register numbers.*/ - /******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Set for all ways and waiting for the operation finished. - * This is provided for all the background operations. - * - * @param auxCtlReg The auxiliary control register. - * @param regAddr The register address to be operated. - */ -static void L2CACHE_SetAndWaitBackGroundOperate(uint32_t auxCtlReg, uint32_t regAddr); - -/*! - * @brief Invalidates the Level 2 cache line by physical address. - * This function invalidates a cache line by physcial address. - * - * @param address The physical addderss of the cache. - * The format of the address shall be : - * bit 31 ~ bit n+1 | bitn ~ bit5 | bit4 ~ bit0 - * Tag | index | 0 - * Note: the physical address shall be aligned to the line size - 32B (256 bit). - * so keep the last 5 bits (bit 4 ~ bit 0) of the physical address always be zero. - * If the input address is not aligned, it will be changed to 32-byte aligned address. - * The n is varies according to the index width. - * @return The actual 32-byte aligned physical address be operated. - */ -static uint32_t L2CACHE_InvalidateLineByAddr(uint32_t address); - -/*! - * @brief Cleans the Level 2 cache line based on the physical address. - * This function cleans a cache line based on a physcial address. - * - * @param address The physical addderss of the cache. - * The format of the address shall be : - * bit 31 ~ bit n+1 | bitn ~ bit5 | bit4 ~ bit0 - * Tag | index | 0 - * Note: the physical address shall be aligned to the line size - 32B (256 bit). - * so keep the last 5 bits (bit 4 ~ bit 0) of the physical address always be zero. - * If the input address is not aligned, it will be changed to 32-byte aligned address. - * The n is varies according to the index width. - * @return The actual 32-byte aligned physical address be operated. - */ -static uint32_t L2CACHE_CleanLineByAddr(uint32_t address); - -/*! - * @brief Cleans and invalidates the Level 2 cache line based on the physical address. - * This function cleans and invalidates a cache line based on a physcial address. - * - * @param address The physical addderss of the cache. - * The format of the address shall be : - * bit 31 ~ bit n+1 | bitn ~ bit5 | bit4 ~ bit0 - * Tag | index | 0 - * Note: the physical address shall be aligned to the line size - 32B (256 bit). - * so keep the last 5 bits (bit 4 ~ bit 0) of the physical address always be zero. - * If the input address is not aligned, it will be changed to 32-byte aligned address. - * The n is varies according to the index width. - * @return The actual 32-byte aligned physical address be operated. - */ -static uint32_t L2CACHE_CleanInvalidateLineByAddr(uint32_t address); - -/*! - * @brief Gets the number of the Level 2 cache and the way size. - * This function cleans and invalidates a cache line based on a physcial address. - * - * @param num_ways The number of the cache way. - * @param size_way The way size. - */ -static void L2CACHE_GetWayNumSize(uint32_t *num_ways, uint32_t *size_way); -/******************************************************************************* - * Code - ******************************************************************************/ -static void L2CACHE_SetAndWaitBackGroundOperate(uint32_t auxCtlReg, uint32_t regAddr) -{ - uint16_t mask = L2CACHE_8WAYS_MASK; - uint32_t timeout = L2CACHE_OPERATION_TIMEOUT; - - /* Check the ways used at first. */ - if (auxCtlReg & L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_MASK) - { - mask = L2CACHE_16WAYS_MASK; - } - - /* Set the opeartion for all ways/entries of the cache. */ - *(uint32_t *)regAddr = mask; - /* Waiting for until the operation is complete. */ - while ((*(volatile uint32_t *)regAddr & mask) && timeout) - { - __ASM("nop"); - timeout--; - } -} - -static uint32_t L2CACHE_InvalidateLineByAddr(uint32_t address) -{ - /* Align the address first. */ - address &= ~(uint32_t)(FSL_FEATURE_L2CACHE_LINESIZE_BYTE - 1); - /* Invalidate the cache line by physical address. */ - L2CACHEC->REG7_INV_PA = address; - - return address; -} - -static uint32_t L2CACHE_CleanLineByAddr(uint32_t address) -{ - /* Align the address first. */ - address &= ~(uint32_t)(FSL_FEATURE_L2CACHE_LINESIZE_BYTE - 1); - /* Invalidate the cache line by physical address. */ - L2CACHEC->REG7_CLEAN_PA = address; - - return address; -} - -static uint32_t L2CACHE_CleanInvalidateLineByAddr(uint32_t address) -{ - /* Align the address first. */ - address &= ~(uint32_t)(FSL_FEATURE_L2CACHE_LINESIZE_BYTE - 1); - /* Clean and invalidate the cache line by physical address. */ - L2CACHEC->REG7_CLEAN_INV_PA = address; - - return address; -} - -static void L2CACHE_GetWayNumSize(uint32_t *num_ways, uint32_t *size_way) -{ - assert(num_ways); - assert(size_way); - - uint32_t number = (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_MASK) >> - L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_SHIFT; - uint32_t size = (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_WAYSIZE_MASK) >> - L2CACHEC_REG1_AUX_CONTROL_WAYSIZE_SHIFT; - - *num_ways = (number + 1) * L2CACHE_SMALLWAYS_NUM; - if (!size) - { - /* 0 internally mapped to the same size as 1 - 16KB.*/ - size += 1; - } - *size_way = (1 << (size - 1)) * L2CACHE_SAMLLWAYS_SIZE * L2CACHE_1KBCOVERTOB; -} - -/*! - * brief Initializes the level 2 cache controller module. - * - * param config Pointer to configuration structure. See "l2cache_config_t". - */ -void L2CACHE_Init(l2cache_config_t *config) -{ - assert(config); - - uint16_t waysNum = 0xFFU; /* Default use the 8-way mask. */ - uint8_t count; - uint32_t auxReg = 0; - - /*The aux register must be configured when the cachec is disabled - * So disable first if the cache controller is enabled. - */ - if (L2CACHEC->REG1_CONTROL & L2CACHEC_REG1_CONTROL_CE_MASK) - { - L2CACHE_Disable(); - } - - /* Unlock all entries. */ - if (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_MASK) - { - waysNum = 0xFFFFU; - } - - for (count = 0; count < L2CACHE_LOCKDOWN_REGNUM; count++) - { - L2CACHE_LockdownByWayEnable(count, waysNum, false); - } - - /* Set the ways and way-size etc. */ - auxReg = L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY(config->wayNum) | - L2CACHEC_REG1_AUX_CONTROL_WAYSIZE(config->waySize) | L2CACHEC_REG1_AUX_CONTROL_CRP(config->repacePolicy) | - L2CACHEC_REG1_AUX_CONTROL_IPE(config->istrPrefetchEnable) | - L2CACHEC_REG1_AUX_CONTROL_DPE(config->dataPrefetchEnable) | - L2CACHEC_REG1_AUX_CONTROL_NLE(config->nsLockdownEnable) | - L2CACHEC_REG1_AUX_CONTROL_FWA(config->writeAlloc) | L2CACHEC_REG1_AUX_CONTROL_HPSDRE(config->writeAlloc); - L2CACHEC->REG1_AUX_CONTROL = auxReg; - - /* Set the tag/data ram latency. */ - if (config->lateConfig) - { - uint32_t data = 0; - /* Tag latency. */ - data = L2CACHEC_REG1_TAG_RAM_CONTROL_SL(config->lateConfig->tagSetupLate) | - L2CACHEC_REG1_TAG_RAM_CONTROL_SL(config->lateConfig->tagSetupLate) | - L2CACHEC_REG1_TAG_RAM_CONTROL_RAL(config->lateConfig->tagReadLate) | - L2CACHEC_REG1_TAG_RAM_CONTROL_WAL(config->lateConfig->dataWriteLate); - L2CACHEC->REG1_TAG_RAM_CONTROL = data; - /* Data latency. */ - data = L2CACHEC_REG1_DATA_RAM_CONTROL_SL(config->lateConfig->dataSetupLate) | - L2CACHEC_REG1_DATA_RAM_CONTROL_SL(config->lateConfig->dataSetupLate) | - L2CACHEC_REG1_DATA_RAM_CONTROL_RAL(config->lateConfig->dataReadLate) | - L2CACHEC_REG1_DATA_RAM_CONTROL_WAL(config->lateConfig->dataWriteLate); - L2CACHEC->REG1_DATA_RAM_CONTROL = data; - } -} - -/*! - * brief Gets an available default settings for the cache controller. - * - * This function initializes the cache controller configuration structure with default settings. - * The default values are: - * code - * config->waysNum = kL2CACHE_8ways; - * config->waySize = kL2CACHE_32KbSize; - * config->repacePolicy = kL2CACHE_Roundrobin; - * config->lateConfig = NULL; - * config->istrPrefetchEnable = false; - * config->dataPrefetchEnable = false; - * config->nsLockdownEnable = false; - * config->writeAlloc = kL2CACHE_UseAwcache; - * endcode - * param config Pointer to the configuration structure. - */ -void L2CACHE_GetDefaultConfig(l2cache_config_t *config) -{ - assert(config); - - /* Initializes the configure structure to zero. */ - memset(config, 0, sizeof(*config)); - - uint32_t number = (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_MASK) >> - L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_SHIFT; - uint32_t size = (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_WAYSIZE_MASK) >> - L2CACHEC_REG1_AUX_CONTROL_WAYSIZE_SHIFT; - - /* Get the default value */ - config->wayNum = (l2cache_way_num_t)number; - config->waySize = (l2cache_way_size)size; - config->repacePolicy = kL2CACHE_Roundrobin; - config->lateConfig = NULL; - config->istrPrefetchEnable = false; - config->dataPrefetchEnable = false; - config->nsLockdownEnable = false; - config->writeAlloc = kL2CACHE_UseAwcache; -} - -/*! - * brief Enables the level 2 cache controller. - * This function enables the cache controller. Must be written using a secure access. - * If write with a Non-secure access will cause a DECERR response. - * - */ -void L2CACHE_Enable(void) -{ - /* Invalidate first. */ - L2CACHE_Invalidate(); - /* Enable the level 2 cache controller. */ - L2CACHEC->REG1_CONTROL = L2CACHEC_REG1_CONTROL_CE_MASK; -} - -/*! - * brief Disables the level 2 cache controller. - * This function disables the cache controller. Must be written using a secure access. - * If write with a Non-secure access will cause a DECERR response. - * - */ -void L2CACHE_Disable(void) -{ - /* First CleanInvalidate all enties in the cache. */ - L2CACHE_CleanInvalidate(); - /* Disable the level 2 cache controller. */ - L2CACHEC->REG1_CONTROL &= ~L2CACHEC_REG1_CONTROL_CE_MASK; - /* DSB - data sync barrier.*/ - __DSB(); -} - -/*! - * brief Invalidates the Level 2 cache. - * This function invalidates all entries in cache. - * - */ -void L2CACHE_Invalidate(void) -{ - /* Invalidate all entries in cache. */ - L2CACHE_SetAndWaitBackGroundOperate(L2CACHEC->REG1_AUX_CONTROL, (uint32_t)&L2CACHEC->REG7_INV_WAY); - /* Cache sync. */ - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Cleans the level 2 cache controller. - * This function cleans all entries in the level 2 cache controller. - * - */ -void L2CACHE_Clean(void) -{ - /* Clean all entries of the cache. */ - L2CACHE_SetAndWaitBackGroundOperate(L2CACHEC->REG1_AUX_CONTROL, (uint32_t)&L2CACHEC->REG7_CLEAN_WAY); - /* Cache sync. */ - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Cleans and invalidates the level 2 cache controller. - * This function cleans and invalidates all entries in the level 2 cache controller. - * - */ -void L2CACHE_CleanInvalidate(void) -{ - /* Clean all entries of the cache. */ - L2CACHE_SetAndWaitBackGroundOperate(L2CACHEC->REG1_AUX_CONTROL, (uint32_t)&L2CACHEC->REG7_CLEAN_INV_WAY); - /* Cache sync. */ - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Invalidates the Level 2 cache lines in the range of two physical addresses. - * This function invalidates all cache lines between two physical addresses. - * - * param address The start address of the memory to be invalidated. - * param size_byte The memory size. - * note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_InvalidateByRange(uint32_t address, uint32_t size_byte) -{ - uint32_t endAddr = address + size_byte; - - /* Invalidate addresses in the range. */ - while (address < endAddr) - { - address = L2CACHE_InvalidateLineByAddr(address); - /* Update the size. */ - address += FSL_FEATURE_L2CACHE_LINESIZE_BYTE; - } - - /* Cache sync. */ - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Cleans the Level 2 cache lines in the range of two physical addresses. - * This function cleans all cache lines between two physical addresses. - * - * param address The start address of the memory to be cleaned. - * param size_byte The memory size. - * note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_CleanByRange(uint32_t address, uint32_t size_byte) -{ - uint32_t num_ways = 0; - uint32_t size_way = 0; - uint32_t endAddr = address + size_byte; - - /* Get the number and size of the cache way. */ - L2CACHE_GetWayNumSize(&num_ways, &size_way); - - /* Check if the clean size is over the cache size. */ - if ((endAddr - address) > num_ways * size_way) - { - L2CACHE_Clean(); - return; - } - - /* Clean addresses in the range. */ - while ((address & ~(uint32_t)(FSL_FEATURE_L2CACHE_LINESIZE_BYTE - 1)) < endAddr) - { - /* Clean the address in the range. */ - address = L2CACHE_CleanLineByAddr(address); - address += FSL_FEATURE_L2CACHE_LINESIZE_BYTE; - } - - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Cleans and invalidates the Level 2 cache lines in the range of two physical addresses. - * This function cleans and invalidates all cache lines between two physical addresses. - * - * param address The start address of the memory to be cleaned and invalidated. - * param size_byte The memory size. - * note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte) -{ - uint32_t num_ways = 0; - uint32_t size_way = 0; - uint32_t endAddr = address + size_byte; - - /* Get the number and size of the cache way. */ - L2CACHE_GetWayNumSize(&num_ways, &size_way); - - /* Check if the clean size is over the cache size. */ - if ((endAddr - address) > num_ways * size_way) - { - L2CACHE_CleanInvalidate(); - return; - } - - /* Clean addresses in the range. */ - while ((address & ~(uint32_t)(FSL_FEATURE_L2CACHE_LINESIZE_BYTE - 1)) < endAddr) - { - /* Clean the address in the range. */ - address = L2CACHE_CleanInvalidateLineByAddr(address); - address += FSL_FEATURE_L2CACHE_LINESIZE_BYTE; - } - - L2CACHEC->REG7_CACHE_SYNC = 0; -} - -/*! - * brief Enables or disables to lock down the data and instruction by way. - * This function locks down the cached instruction/data by way and prevent the adresses from - * being allocated and prevent dara from being evicted out of the level 2 cache. - * But the normal cache maintenance operations that invalidate, clean or clean - * and validate cache contents affect the locked-down cache lines as normal. - * - * param masterId The master id, range from 0 ~ 7. - * param mask The ways to be enabled or disabled to lockdown. - * each bit in value is related to each way of the cache. for example: - * value: bit 0 ------ way 0. - * value: bit 1 ------ way 1. - * -------------------------- - * value: bit 15 ------ way 15. - * Note: please make sure the value setting is align with your supported ways. - * param enable True enable the lockdown, false to disable the lockdown. - */ -void L2CACHE_LockdownByWayEnable(uint32_t masterId, uint32_t mask, bool enable) -{ - uint8_t num_ways = (L2CACHEC->REG1_AUX_CONTROL & L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_MASK) >> - L2CACHEC_REG1_AUX_CONTROL_ASSOCIATIVITY_SHIFT; - num_ways = (num_ways + 1) * L2CACHE_SMALLWAYS_NUM; - - assert(mask < (1U << num_ways)); - assert(masterId < L2CACHE_LOCKDOWN_REGNUM); - - uint32_t dataReg = L2CACHEC->LOCKDOWN[masterId].REG9_D_LOCKDOWN; - uint32_t istrReg = L2CACHEC->LOCKDOWN[masterId].REG9_I_LOCKDOWN; - - if (enable) - { - /* Data lockdown. */ - L2CACHEC->LOCKDOWN[masterId].REG9_D_LOCKDOWN = dataReg | mask; - /* Instruction lockdown. */ - L2CACHEC->LOCKDOWN[masterId].REG9_I_LOCKDOWN = istrReg | mask; - } - else - { - /* Data lockdown. */ - L2CACHEC->LOCKDOWN[masterId].REG9_D_LOCKDOWN = dataReg & ~mask; - /* Instruction lockdown. */ - L2CACHEC->LOCKDOWN[masterId].REG9_I_LOCKDOWN = istrReg & ~mask; - } -} -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ - -/*! - * brief Invalidate cortex-m7 L1 instruction cache by range. - * - * param address The start address of the memory to be invalidated. - * param size_byte The memory size. - * note The start address and size_byte should be 32-byte(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L1 I-cache line size if - * startAddr is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L1CACHE_InvalidateICacheByRange(uint32_t address, uint32_t size_byte) -{ -#if (__DCACHE_PRESENT == 1U) - uint32_t addr = address & ~((uint32_t)FSL_FEATURE_L1ICACHE_LINESIZE_BYTE - 1U); - uint32_t align_len = address - addr; - int32_t size = (int32_t)size_byte + (int32_t)align_len; - - __DSB(); - while (size > 0) - { - SCB->ICIMVAU = addr; - addr += (uint32_t)FSL_FEATURE_L1ICACHE_LINESIZE_BYTE; - size -= (int32_t)FSL_FEATURE_L1ICACHE_LINESIZE_BYTE; - } - __DSB(); - __ISB(); -#endif -} - -/*! - * brief Invalidates all instruction caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * param address The physical address. - * param size_byte size of the memory to be invalidated. - * note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void ICACHE_InvalidateByRange(uint32_t address, uint32_t size_byte) -{ -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#if defined(FSL_SDK_DISBLE_L2CACHE_PRESENT) && !FSL_SDK_DISBLE_L2CACHE_PRESENT - L2CACHE_InvalidateByRange(address, size_byte); -#endif /* !FSL_SDK_DISBLE_L2CACHE_PRESENT */ -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ - - L1CACHE_InvalidateICacheByRange(address, size_byte); -} - -/*! - * brief Invalidates all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * param address The physical address. - * param size_byte size of the memory to be invalidated. - * note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_InvalidateByRange(uint32_t address, uint32_t size_byte) -{ -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#if defined(FSL_SDK_DISBLE_L2CACHE_PRESENT) && !FSL_SDK_DISBLE_L2CACHE_PRESENT - L2CACHE_InvalidateByRange(address, size_byte); -#endif /* !FSL_SDK_DISBLE_L2CACHE_PRESENT */ -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ - L1CACHE_InvalidateDCacheByRange(address, size_byte); -} - -/*! - * brief Cleans all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * param address The physical address. - * param size_byte size of the memory to be cleaned. - * note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_CleanByRange(uint32_t address, uint32_t size_byte) -{ - L1CACHE_CleanDCacheByRange(address, size_byte); -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#if defined(FSL_SDK_DISBLE_L2CACHE_PRESENT) && !FSL_SDK_DISBLE_L2CACHE_PRESENT - L2CACHE_CleanByRange(address, size_byte); -#endif /* !FSL_SDK_DISBLE_L2CACHE_PRESENT */ -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ -} - -/*! - * brief Cleans and Invalidates all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * param address The physical address. - * param size_byte size of the memory to be cleaned and invalidated. - * note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte) -{ - L1CACHE_CleanInvalidateDCacheByRange(address, size_byte); -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#if defined(FSL_SDK_DISBLE_L2CACHE_PRESENT) && !FSL_SDK_DISBLE_L2CACHE_PRESENT - L2CACHE_CleanInvalidateByRange(address, size_byte); -#endif /* !FSL_SDK_DISBLE_L2CACHE_PRESENT */ -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ -} diff --git a/devices/MIMXRT1052/drivers/fsl_cache.h b/devices/MIMXRT1052/drivers/fsl_cache.h deleted file mode 100644 index 9708edd..0000000 --- a/devices/MIMXRT1052/drivers/fsl_cache.h +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_CACHE_H_ -#define _FSL_CACHE_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup cache_armv7_m7 - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief cache driver version 2.0.4. */ -#define FSL_CACHE_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) -/*@}*/ - -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -#ifndef FSL_SDK_DISBLE_L2CACHE_PRESENT -#define FSL_SDK_DISBLE_L2CACHE_PRESENT 0 -#endif -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ -/******************************************************************************* - * Definitions - ******************************************************************************/ -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT - -/*! @brief Number of level 2 cache controller ways. */ -typedef enum _l2cache_way_num -{ - kL2CACHE_8ways = 0, /*!< 8 ways. */ -#if defined(FSL_FEATURE_L2CACHE_SUPPORT_16_WAY_ASSOCIATIVITY) && FSL_FEATURE_L2CACHE_SUPPORT_16_WAY_ASSOCIATIVITY - kL2CACHE_16ways /*!< 16 ways. */ -#endif /* FSL_FEATURE_L2CACHE_SUPPORT_16_WAY_ASSOCIATIVITY */ -} l2cache_way_num_t; - -/*! @brief Level 2 cache controller way size. */ -typedef enum _l2cache_way_size -{ - kL2CACHE_16KBSize = 1, /*!< 16 KB way size. */ - kL2CACHE_32KBSize = 2, /*!< 32 KB way size. */ - kL2CACHE_64KBSize = 3, /*!< 64 KB way size. */ - kL2CACHE_128KBSize = 4, /*!< 128 KB way size. */ - kL2CACHE_256KBSize = 5, /*!< 256 KB way size. */ - kL2CACHE_512KBSize = 6 /*!< 512 KB way size. */ -} l2cache_way_size; - -/*! @brief Level 2 cache controller replacement policy. */ -typedef enum _l2cache_replacement -{ - kL2CACHE_Pseudorandom = 0U, /*!< Peseudo-random replacement policy using an lfsr. */ - kL2CACHE_Roundrobin /*!< Round-robin replacemnt policy. */ -} l2cache_replacement_t; - -/*! @brief Level 2 cache controller force write allocate options. */ -typedef enum _l2cache_writealloc -{ - kL2CACHE_UseAwcache = 0, /*!< Use AWCAHE attribute for the write allocate. */ - kL2CACHE_NoWriteallocate, /*!< Force no write allocate. */ - kL2CACHE_forceWriteallocate /*!< Force write allocate when write misses. */ -} l2cache_writealloc_t; - -/*! @brief Level 2 cache controller tag/data ram latency. */ -typedef enum _l2cache_latency -{ - kL2CACHE_1CycleLate = 0, /*!< 1 cycle of latency. */ - kL2CACHE_2CycleLate, /*!< 2 cycle of latency. */ - kL2CACHE_3CycleLate, /*!< 3 cycle of latency. */ - kL2CACHE_4CycleLate, /*!< 4 cycle of latency. */ - kL2CACHE_5CycleLate, /*!< 5 cycle of latency. */ - kL2CACHE_6CycleLate, /*!< 6 cycle of latency. */ - kL2CACHE_7CycleLate, /*!< 7 cycle of latency. */ - kL2CACHE_8CycleLate /*!< 8 cycle of latency. */ -} l2cache_latency_t; - -/*! @brief Level 2 cache controller tag/data ram latency configure structure. */ -typedef struct _l2cache_latency_config -{ - l2cache_latency_t tagWriteLate; /*!< Tag write latency. */ - l2cache_latency_t tagReadLate; /*!< Tag Read latency. */ - l2cache_latency_t tagSetupLate; /*!< Tag setup latency. */ - l2cache_latency_t dataWriteLate; /*!< Data write latency. */ - l2cache_latency_t dataReadLate; /*!< Data Read latency. */ - l2cache_latency_t dataSetupLate; /*!< Data setup latency. */ -} L2cache_latency_config_t; - -/*! @brief Level 2 cache controller configure structure. */ -typedef struct _l2cache_config -{ - /* ------------------------ l2 cachec basic settings ---------------------------- */ - l2cache_way_num_t wayNum; /*!< The number of ways. */ - l2cache_way_size waySize; /*!< The way size = Cache Ram size / wayNum. */ - l2cache_replacement_t repacePolicy; /*!< Replacemnet policy. */ - /* ------------------------ tag/data ram latency settings ----------------------- */ - L2cache_latency_config_t *lateConfig; /*!< Tag/data latency configure. Set NUll if not required. */ - /* ------------------------ Prefetch enable settings ---------------------------- */ - bool istrPrefetchEnable; /*!< Instruction prefetch enable. */ - bool dataPrefetchEnable; /*!< Data prefetch enable. */ - /* ------------------------ Non-secure access settings -------------------------- */ - bool nsLockdownEnable; /*!< None-secure lockdown enable. */ - /* ------------------------ other settings -------------------------------------- */ - l2cache_writealloc_t writeAlloc; /*!< Write allcoate force option. */ -} l2cache_config_t; -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Control for cortex-m7 L1 cache - *@{ - */ - -/*! - * @brief Enables cortex-m7 L1 instruction cache. - * - */ -static inline void L1CACHE_EnableICache(void) -{ - SCB_EnableICache(); -} - -/*! - * @brief Disables cortex-m7 L1 instruction cache. - * - */ -static inline void L1CACHE_DisableICache(void) -{ - SCB_DisableICache(); -} - -/*! - * @brief Invalidate cortex-m7 L1 instruction cache. - * - */ -static inline void L1CACHE_InvalidateICache(void) -{ - SCB_InvalidateICache(); -} - -/*! - * @brief Invalidate cortex-m7 L1 instruction cache by range. - * - * @param address The start address of the memory to be invalidated. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L1 I-cache line size if - * startAddr is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L1CACHE_InvalidateICacheByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Enables cortex-m7 L1 data cache. - * - */ -static inline void L1CACHE_EnableDCache(void) -{ - SCB_EnableDCache(); -} - -/*! - * @brief Disables cortex-m7 L1 data cache. - * - */ -static inline void L1CACHE_DisableDCache(void) -{ - SCB_DisableDCache(); -} - -/*! - * @brief Invalidates cortex-m7 L1 data cache. - * - */ -static inline void L1CACHE_InvalidateDCache(void) -{ - SCB_InvalidateDCache(); -} - -/*! - * @brief Cleans cortex-m7 L1 data cache. - * - */ -static inline void L1CACHE_CleanDCache(void) -{ - SCB_CleanDCache(); -} - -/*! - * @brief Cleans and Invalidates cortex-m7 L1 data cache. - * - */ -static inline void L1CACHE_CleanInvalidateDCache(void) -{ - SCB_CleanInvalidateDCache(); -} - -/*! - * @brief Invalidates cortex-m7 L1 data cache by range. - * - * @param address The start address of the memory to be invalidated. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L1 D-cache line size if - * startAddr is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -static inline void L1CACHE_InvalidateDCacheByRange(uint32_t address, uint32_t size_byte) -{ - SCB_InvalidateDCache_by_Addr((uint32_t *)address, (int32_t)size_byte); -} - -/*! - * @brief Cleans cortex-m7 L1 data cache by range. - * - * @param address The start address of the memory to be cleaned. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L1 D-cache line size if - * startAddr is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -static inline void L1CACHE_CleanDCacheByRange(uint32_t address, uint32_t size_byte) -{ - SCB_CleanDCache_by_Addr((uint32_t *)address, (int32_t)size_byte); -} - -/*! - * @brief Cleans and Invalidates cortex-m7 L1 data cache by range. - * - * @param address The start address of the memory to be clean and invalidated. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L1 D-cache line size if - * startAddr is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -static inline void L1CACHE_CleanInvalidateDCacheByRange(uint32_t address, uint32_t size_byte) -{ - SCB_CleanInvalidateDCache_by_Addr((uint32_t *)address, (int32_t)size_byte); -} -/*@}*/ - -#if defined(FSL_FEATURE_SOC_L2CACHEC_COUNT) && FSL_FEATURE_SOC_L2CACHEC_COUNT -/*! - * @name Control for L2 pl310 cache - *@{ - */ - -/*! - * @brief Initializes the level 2 cache controller module. - * - * @param config Pointer to configuration structure. See "l2cache_config_t". - */ -void L2CACHE_Init(l2cache_config_t *config); - -/*! - * @brief Gets an available default settings for the cache controller. - * - * This function initializes the cache controller configuration structure with default settings. - * The default values are: - * @code - * config->waysNum = kL2CACHE_8ways; - * config->waySize = kL2CACHE_32KbSize; - * config->repacePolicy = kL2CACHE_Roundrobin; - * config->lateConfig = NULL; - * config->istrPrefetchEnable = false; - * config->dataPrefetchEnable = false; - * config->nsLockdownEnable = false; - * config->writeAlloc = kL2CACHE_UseAwcache; - * @endcode - * @param config Pointer to the configuration structure. - */ -void L2CACHE_GetDefaultConfig(l2cache_config_t *config); - -/*! - * @brief Enables the level 2 cache controller. - * This function enables the cache controller. Must be written using a secure access. - * If write with a Non-secure access will cause a DECERR response. - * - */ -void L2CACHE_Enable(void); - -/*! - * @brief Disables the level 2 cache controller. - * This function disables the cache controller. Must be written using a secure access. - * If write with a Non-secure access will cause a DECERR response. - * - */ -void L2CACHE_Disable(void); - -/*! - * @brief Invalidates the Level 2 cache. - * This function invalidates all entries in cache. - * - */ -void L2CACHE_Invalidate(void); - -/*! - * @brief Invalidates the Level 2 cache lines in the range of two physical addresses. - * This function invalidates all cache lines between two physical addresses. - * - * @param address The start address of the memory to be invalidated. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_InvalidateByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Cleans the level 2 cache controller. - * This function cleans all entries in the level 2 cache controller. - * - */ -void L2CACHE_Clean(void); - -/*! - * @brief Cleans the Level 2 cache lines in the range of two physical addresses. - * This function cleans all cache lines between two physical addresses. - * - * @param address The start address of the memory to be cleaned. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_CleanByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Cleans and invalidates the level 2 cache controller. - * This function cleans and invalidates all entries in the level 2 cache controller. - * - */ -void L2CACHE_CleanInvalidate(void); - -/*! - * @brief Cleans and invalidates the Level 2 cache lines in the range of two physical addresses. - * This function cleans and invalidates all cache lines between two physical addresses. - * - * @param address The start address of the memory to be cleaned and invalidated. - * @param size_byte The memory size. - * @note The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. - * The startAddr here will be forced to align to L2 line size if startAddr - * is not aligned. For the size_byte, application should make sure the - * alignment or make sure the right operation order if the size_byte is not aligned. - */ -void L2CACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Enables or disables to lock down the data and instruction by way. - * This function locks down the cached instruction/data by way and prevent the adresses from - * being allocated and prevent dara from being evicted out of the level 2 cache. - * But the normal cache maintenance operations that invalidate, clean or clean - * and validate cache contents affect the locked-down cache lines as normal. - * - * @param masterId The master id, range from 0 ~ 7. - * @param mask The ways to be enabled or disabled to lockdown. - * each bit in value is related to each way of the cache. for example: - * value: bit 0 ------ way 0. - * value: bit 1 ------ way 1. - * -------------------------- - * value: bit 15 ------ way 15. - * Note: please make sure the value setting is align with your supported ways. - * @param enable True enable the lockdown, false to disable the lockdown. - */ -void L2CACHE_LockdownByWayEnable(uint32_t masterId, uint32_t mask, bool enable); - -/*@}*/ -#endif /* FSL_FEATURE_SOC_L2CACHEC_COUNT */ - -/*! - * @name Unified Cache Control for all caches (cortex-m7 L1 cache + l2 pl310) - * Mainly used for many drivers for easy cache operation. - *@{ - */ - -/*! - * @brief Invalidates all instruction caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * @param address The physical address. - * @param size_byte size of the memory to be invalidated. - * @note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void ICACHE_InvalidateByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Invalidates all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * @param address The physical address. - * @param size_byte size of the memory to be invalidated. - * @note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_InvalidateByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Cleans all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * @param address The physical address. - * @param size_byte size of the memory to be cleaned. - * @note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_CleanByRange(uint32_t address, uint32_t size_byte); - -/*! - * @brief Cleans and Invalidates all data caches by range. - * - * Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte. - * - * @param address The physical address. - * @param size_byte size of the memory to be cleaned and invalidated. - * @note address and size should be aligned to cache line size - * 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced - * to align to the cache line size if startAddr is not aligned. For the size_byte, application should - * make sure the alignment or make sure the right operation order if the size_byte is not aligned. - */ -void DCACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_CACHE_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_clock.c b/devices/MIMXRT1052/drivers/fsl_clock.c deleted file mode 100644 index dbb00d5..0000000 --- a/devices/MIMXRT1052/drivers/fsl_clock.c +++ /dev/null @@ -1,1535 +0,0 @@ -/* - * Copyright 2017 - 2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_clock.h" -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.clock" -#endif -/******************************************************************************* - * Definitions - ******************************************************************************/ -/* To make full use of CM7 hardware FPU, use double instead of uint64_t in clock driver to -achieve better performance, it is depend on the IDE Floating point settings, if double precision is selected -in IDE, clock_64b_t will switch to double type automatically. only support IAR and MDK here */ -#if __FPU_USED - -#if (defined(__ICCARM__)) - -#if (__ARMVFP__ >= __ARMFPV5__) && \ - (__ARM_FP == 0xE) /*0xe implies support for half, single and double precision operations*/ -typedef double clock_64b_t; -#else -typedef uint64_t clock_64b_t; -#endif - -#elif (defined(__GNUC__)) - -#if (__ARM_FP == 0xE) /*0xe implies support for half, single and double precision operations*/ -typedef double clock_64b_t; -#else -typedef uint64_t clock_64b_t; -#endif - -#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) - -#if defined __TARGET_FPU_FPV5_D16 -typedef double clock_64b_t; -#else -typedef uint64_t clock_64b_t; -#endif - -#else -typedef uint64_t clock_64b_t; -#endif - -#else -typedef uint64_t clock_64b_t; -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* External XTAL (OSC) clock frequency. */ -volatile uint32_t g_xtalFreq; -/* External RTC XTAL clock frequency. */ -volatile uint32_t g_rtcXtalFreq; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get the periph clock frequency. - * - * @return Periph clock frequency in Hz. - */ -static uint32_t CLOCK_GetPeriphClkFreq(void); - -/*! - * @brief Get the frequency of PLL USB1 software clock. - * - * @return The frequency of PLL USB1 software clock. - */ -static uint32_t CLOCK_GetPllUsb1SWFreq(void); - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t CLOCK_GetPeriphClkFreq(void) -{ - uint32_t freq; - - /* Periph_clk2_clk ---> Periph_clk */ - if ((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK_SEL_MASK) != 0U) - { - switch (CCM->CBCMR & CCM_CBCMR_PERIPH_CLK2_SEL_MASK) - { - /* Pll3_sw_clk ---> Periph_clk2_clk ---> Periph_clk */ - case CCM_CBCMR_PERIPH_CLK2_SEL(0U): - freq = CLOCK_GetPllFreq(kCLOCK_PllUsb1); - break; - - /* Osc_clk ---> Periph_clk2_clk ---> Periph_clk */ - case CCM_CBCMR_PERIPH_CLK2_SEL(1U): - freq = CLOCK_GetOscFreq(); - break; - - case CCM_CBCMR_PERIPH_CLK2_SEL(2U): - freq = CLOCK_GetPllFreq(kCLOCK_PllSys); - break; - - case CCM_CBCMR_PERIPH_CLK2_SEL(3U): - default: - freq = 0U; - break; - } - - freq /= (((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) >> CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT) + 1U); - } - /* Pre_Periph_clk ---> Periph_clk */ - else - { - switch (CCM->CBCMR & CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK) - { - /* PLL2 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(0U): - freq = CLOCK_GetPllFreq(kCLOCK_PllSys); - break; - - /* PLL2 PFD2 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(1U): - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd2); - break; - - /* PLL2 PFD0 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(2U): - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd0); - break; - - /* PLL1 divided(/2) ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(3U): - freq = CLOCK_GetPllFreq(kCLOCK_PllArm) / - (((CCM->CACRR & CCM_CACRR_ARM_PODF_MASK) >> CCM_CACRR_ARM_PODF_SHIFT) + 1U); - break; - - default: - freq = 0U; - break; - } - } - - return freq; -} - -static uint32_t CLOCK_GetPllUsb1SWFreq(void) -{ - uint32_t freq; - - switch ((CCM->CCSR & CCM_CCSR_PLL3_SW_CLK_SEL_MASK) >> CCM_CCSR_PLL3_SW_CLK_SEL_SHIFT) - { - case 0: - { - freq = CLOCK_GetPllFreq(kCLOCK_PllUsb1); - break; - } - case 1: - { - freq = 24000000UL; - break; - } - default: - freq = 0UL; - break; - } - - return freq; -} - -/*! - * brief Initialize the external 24MHz clock. - * - * This function supports two modes: - * 1. Use external crystal oscillator. - * 2. Bypass the external crystal oscillator, using input source clock directly. - * - * After this function, please call ref CLOCK_SetXtal0Freq to inform clock driver - * the external clock frequency. - * - * param bypassXtalOsc Pass in true to bypass the external crystal oscillator. - * note This device does not support bypass external crystal oscillator, so - * the input parameter should always be false. - */ -void CLOCK_InitExternalClk(bool bypassXtalOsc) -{ - /* This device does not support bypass XTAL OSC. */ - assert(!bypassXtalOsc); - - CCM_ANALOG->MISC0_CLR = CCM_ANALOG_MISC0_XTAL_24M_PWD_MASK; /* Power up */ - while ((XTALOSC24M->LOWPWR_CTRL & XTALOSC24M_LOWPWR_CTRL_XTALOSC_PWRUP_STAT_MASK) == 0U) - { - } - CCM_ANALOG->MISC0_SET = CCM_ANALOG_MISC0_OSC_XTALOK_EN_MASK; /* detect freq */ - while ((CCM_ANALOG->MISC0 & CCM_ANALOG_MISC0_OSC_XTALOK_MASK) == 0UL) - { - } - CCM_ANALOG->MISC0_CLR = CCM_ANALOG_MISC0_OSC_XTALOK_EN_MASK; -} - -/*! - * brief Deinitialize the external 24MHz clock. - * - * This function disables the external 24MHz clock. - * - * After this function, please call ref CLOCK_SetXtal0Freq to set external clock - * frequency to 0. - */ -void CLOCK_DeinitExternalClk(void) -{ - CCM_ANALOG->MISC0_SET = CCM_ANALOG_MISC0_XTAL_24M_PWD_MASK; /* Power down */ -} - -/*! - * brief Switch the OSC. - * - * This function switches the OSC source for SoC. - * - * param osc OSC source to switch to. - */ -void CLOCK_SwitchOsc(clock_osc_t osc) -{ - if (osc == kCLOCK_RcOsc) - { - XTALOSC24M->LOWPWR_CTRL_SET = XTALOSC24M_LOWPWR_CTRL_SET_OSC_SEL_MASK; - } - else - { - XTALOSC24M->LOWPWR_CTRL_CLR = XTALOSC24M_LOWPWR_CTRL_CLR_OSC_SEL_MASK; - } -} - -/*! - * brief Initialize the RC oscillator 24MHz clock. - */ -void CLOCK_InitRcOsc24M(void) -{ - XTALOSC24M->LOWPWR_CTRL |= XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_MASK; -} - -/*! - * brief Power down the RCOSC 24M clock. - */ -void CLOCK_DeinitRcOsc24M(void) -{ - XTALOSC24M->LOWPWR_CTRL &= ~XTALOSC24M_LOWPWR_CTRL_RC_OSC_EN_MASK; -} - -/*! - * brief Gets the AHB clock frequency. - * - * return The AHB clock frequency value in hertz. - */ -uint32_t CLOCK_GetAhbFreq(void) -{ - return CLOCK_GetPeriphClkFreq() / (((CCM->CBCDR & CCM_CBCDR_AHB_PODF_MASK) >> CCM_CBCDR_AHB_PODF_SHIFT) + 1U); -} - -/*! - * brief Gets the SEMC clock frequency. - * - * return The SEMC clock frequency value in hertz. - */ -uint32_t CLOCK_GetSemcFreq(void) -{ - uint32_t freq; - - /* SEMC alternative clock ---> SEMC Clock */ - if ((CCM->CBCDR & CCM_CBCDR_SEMC_CLK_SEL_MASK) != 0U) - { - /* PLL3 PFD1 ---> SEMC alternative clock ---> SEMC Clock */ - if ((CCM->CBCDR & CCM_CBCDR_SEMC_ALT_CLK_SEL_MASK) != 0U) - { - freq = CLOCK_GetUsb1PfdFreq(kCLOCK_Pfd1); - } - /* PLL2 PFD2 ---> SEMC alternative clock ---> SEMC Clock */ - else - { - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd2); - } - } - /* Periph_clk ---> SEMC Clock */ - else - { - freq = CLOCK_GetPeriphClkFreq(); - } - - freq /= (((CCM->CBCDR & CCM_CBCDR_SEMC_PODF_MASK) >> CCM_CBCDR_SEMC_PODF_SHIFT) + 1U); - - return freq; -} - -/*! - * brief Gets the IPG clock frequency. - * - * return The IPG clock frequency value in hertz. - */ -uint32_t CLOCK_GetIpgFreq(void) -{ - return CLOCK_GetAhbFreq() / (((CCM->CBCDR & CCM_CBCDR_IPG_PODF_MASK) >> CCM_CBCDR_IPG_PODF_SHIFT) + 1U); -} - -/*! - * brief Gets the PER clock frequency. - * - * return The PER clock frequency value in hertz. - */ -uint32_t CLOCK_GetPerClkFreq(void) -{ - uint32_t freq; - - /* Osc_clk ---> PER Clock*/ - if ((CCM->CSCMR1 & CCM_CSCMR1_PERCLK_CLK_SEL_MASK) != 0U) - { - freq = CLOCK_GetOscFreq(); - } - /* Periph_clk ---> AHB Clock ---> IPG Clock ---> PER Clock */ - else - { - freq = CLOCK_GetIpgFreq(); - } - - freq /= (((CCM->CSCMR1 & CCM_CSCMR1_PERCLK_PODF_MASK) >> CCM_CSCMR1_PERCLK_PODF_SHIFT) + 1U); - - return freq; -} - -/*! - * brief Gets the clock frequency for a specific clock name. - * - * This function checks the current clock configurations and then calculates - * the clock frequency for a specific clock name defined in clock_name_t. - * - * param clockName Clock names defined in clock_name_t - * return Clock frequency value in hertz - */ -uint32_t CLOCK_GetFreq(clock_name_t name) -{ - uint32_t freq; - - switch (name) - { - case kCLOCK_CpuClk: - case kCLOCK_AhbClk: - freq = CLOCK_GetAhbFreq(); - break; - - case kCLOCK_SemcClk: - freq = CLOCK_GetSemcFreq(); - break; - - case kCLOCK_IpgClk: - freq = CLOCK_GetIpgFreq(); - break; - - case kCLOCK_PerClk: - freq = CLOCK_GetPerClkFreq(); - break; - - case kCLOCK_OscClk: - freq = CLOCK_GetOscFreq(); - break; - case kCLOCK_RtcClk: - freq = CLOCK_GetRtcFreq(); - break; - case kCLOCK_ArmPllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllArm); - break; - case kCLOCK_Usb1PllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllUsb1); - break; - case kCLOCK_Usb1PllPfd0Clk: - freq = CLOCK_GetUsb1PfdFreq(kCLOCK_Pfd0); - break; - case kCLOCK_Usb1PllPfd1Clk: - freq = CLOCK_GetUsb1PfdFreq(kCLOCK_Pfd1); - break; - case kCLOCK_Usb1PllPfd2Clk: - freq = CLOCK_GetUsb1PfdFreq(kCLOCK_Pfd2); - break; - case kCLOCK_Usb1PllPfd3Clk: - freq = CLOCK_GetUsb1PfdFreq(kCLOCK_Pfd3); - break; - case kCLOCK_Usb1SwClk: - freq = CLOCK_GetPllUsb1SWFreq(); - break; - case kCLOCK_Usb1Sw120MClk: - freq = CLOCK_GetPllUsb1SWFreq() / 4UL; - break; - case kCLOCK_Usb1Sw60MClk: - freq = CLOCK_GetPllUsb1SWFreq() / 8UL; - break; - case kCLOCK_Usb1Sw80MClk: - freq = CLOCK_GetPllUsb1SWFreq() / 6UL; - break; - case kCLOCK_Usb2PllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllUsb2); - break; - case kCLOCK_SysPllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllSys); - break; - case kCLOCK_SysPllPfd0Clk: - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd0); - break; - case kCLOCK_SysPllPfd1Clk: - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd1); - break; - case kCLOCK_SysPllPfd2Clk: - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd2); - break; - case kCLOCK_SysPllPfd3Clk: - freq = CLOCK_GetSysPfdFreq(kCLOCK_Pfd3); - break; - case kCLOCK_EnetPll0Clk: - freq = CLOCK_GetPllFreq(kCLOCK_PllEnet); - break; - case kCLOCK_EnetPll1Clk: - freq = CLOCK_GetPllFreq(kCLOCK_PllEnet25M); - break; - case kCLOCK_AudioPllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllAudio); - break; - case kCLOCK_VideoPllClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllVideo); - break; - default: - freq = 0U; - break; - } - - return freq; -} - -/*! - * brief Gets the frequency of selected clock root. - * - * param clockRoot The clock root used to get the frequency, please refer to @ref clock_root_t. - * return The frequency of selected clock root. - */ -uint32_t CLOCK_GetClockRootFreq(clock_root_t clockRoot) -{ - static const clock_name_t clockRootSourceArray[][6] = CLOCK_ROOT_SOUCE; - static const clock_mux_t clockRootMuxTupleArray[] = CLOCK_ROOT_MUX_TUPLE; - static const clock_div_t clockRootDivTupleArray[][2] = CLOCK_ROOT_DIV_TUPLE; - uint32_t freq = 0UL; - clock_mux_t clockRootMuxTuple = clockRootMuxTupleArray[(uint8_t)clockRoot]; - clock_div_t clockRootPreDivTuple = clockRootDivTupleArray[(uint8_t)clockRoot][0]; - clock_div_t clockRootPostDivTuple = clockRootDivTupleArray[(uint8_t)clockRoot][1]; - uint32_t clockRootMuxValue = (CCM_TUPLE_REG(CCM, clockRootMuxTuple) & CCM_TUPLE_MASK(clockRootMuxTuple)) >> - CCM_TUPLE_SHIFT(clockRootMuxTuple); - clock_name_t clockSourceName; - - clockSourceName = clockRootSourceArray[(uint8_t)clockRoot][clockRootMuxValue]; - - assert(clockSourceName != kCLOCK_NoneName); - - freq = CLOCK_GetFreq(clockSourceName); - - if (clockRootPreDivTuple != kCLOCK_NonePreDiv) - { - freq /= ((CCM_TUPLE_REG(CCM, clockRootPreDivTuple) & CCM_TUPLE_MASK(clockRootPreDivTuple)) >> - CCM_TUPLE_SHIFT(clockRootPreDivTuple)) + - 1UL; - } - - freq /= ((CCM_TUPLE_REG(CCM, clockRootPostDivTuple) & CCM_TUPLE_MASK(clockRootPostDivTuple)) >> - CCM_TUPLE_SHIFT(clockRootPostDivTuple)) + - 1UL; - - return freq; -} - -/*! brief Enable USB HS clock. - * - * This function only enables the access to USB HS prepheral, upper layer - * should first call the ref CLOCK_EnableUsbhs0PhyPllClock to enable the PHY - * clock to use USB HS. - * - * param src USB HS does not care about the clock source, here must be ref kCLOCK_UsbSrcUnused. - * param freq USB HS does not care about the clock source, so this parameter is ignored. - * retval true The clock is set successfully. - * retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs0Clock(clock_usb_src_t src, uint32_t freq) -{ - uint32_t i; - CCM->CCGR6 |= CCM_CCGR6_CG0_MASK; - USB1->USBCMD |= USBHS_USBCMD_RST_MASK; - - /* Add a delay between RST and RS so make sure there is a DP pullup sequence*/ - for (i = 0; i < 400000U; i++) - { - __ASM("nop"); - } - PMU->REG_3P0 = (PMU->REG_3P0 & (~PMU_REG_3P0_OUTPUT_TRG_MASK)) | - (PMU_REG_3P0_OUTPUT_TRG(0x17) | PMU_REG_3P0_ENABLE_LINREG_MASK); - return true; -} - -/*! brief Enable USB HS clock. - * - * This function only enables the access to USB HS prepheral, upper layer - * should first call the ref CLOCK_EnableUsbhs0PhyPllClock to enable the PHY - * clock to use USB HS. - * - * param src USB HS does not care about the clock source, here must be ref kCLOCK_UsbSrcUnused. - * param freq USB HS does not care about the clock source, so this parameter is ignored. - * retval true The clock is set successfully. - * retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs1Clock(clock_usb_src_t src, uint32_t freq) -{ - uint32_t i = 0; - CCM->CCGR6 |= CCM_CCGR6_CG0_MASK; - USB2->USBCMD |= USBHS_USBCMD_RST_MASK; - - /* Add a delay between RST and RS so make sure there is a DP pullup sequence*/ - for (i = 0; i < 400000U; i++) - { - __ASM("nop"); - } - PMU->REG_3P0 = (PMU->REG_3P0 & (~PMU_REG_3P0_OUTPUT_TRG_MASK)) | - (PMU_REG_3P0_OUTPUT_TRG(0x17) | PMU_REG_3P0_ENABLE_LINREG_MASK); - return true; -} - -/*! brief Enable USB HS PHY PLL clock. - * - * This function enables the internal 480MHz USB PHY PLL clock. - * - * param src USB HS PHY PLL clock source. - * param freq The frequency specified by src. - * retval true The clock is set successfully. - * retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs0PhyPllClock(clock_usb_phy_src_t src, uint32_t freq) -{ - static const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U}; - if ((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_ENABLE_MASK) != 0U) - { - CCM_ANALOG->PLL_USB1 |= CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK; - } - else - { - CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll); - } - USBPHY1->CTRL &= ~USBPHY_CTRL_SFTRST_MASK; /* release PHY from reset */ - USBPHY1->CTRL &= ~USBPHY_CTRL_CLKGATE_MASK; - - USBPHY1->PWD = 0; - USBPHY1->CTRL |= USBPHY_CTRL_ENAUTOCLR_PHY_PWD_MASK | USBPHY_CTRL_ENAUTOCLR_CLKGATE_MASK | - USBPHY_CTRL_ENUTMILEVEL2_MASK | USBPHY_CTRL_ENUTMILEVEL3_MASK; - return true; -} - -/*! brief Disable USB HS PHY PLL clock. - * - * This function disables USB HS PHY PLL clock. - */ -void CLOCK_DisableUsbhs0PhyPllClock(void) -{ - CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK; - USBPHY1->CTRL |= USBPHY_CTRL_CLKGATE_MASK; /* Set to 1U to gate clocks */ -} - -/*! - * brief Initialize the ARM PLL. - * - * This function initialize the ARM PLL with specific settings - * - * param config configuration to set to PLL. - */ -void CLOCK_InitArmPll(const clock_arm_pll_config_t *config) -{ - /* Bypass PLL first */ - CCM_ANALOG->PLL_ARM = (CCM_ANALOG->PLL_ARM & (~CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_ARM_BYPASS_MASK | CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_ARM = - (CCM_ANALOG->PLL_ARM & (~(CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK | CCM_ANALOG_PLL_ARM_POWERDOWN_MASK))) | - CCM_ANALOG_PLL_ARM_ENABLE_MASK | CCM_ANALOG_PLL_ARM_DIV_SELECT(config->loopDivider); - - while ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_ARM &= ~CCM_ANALOG_PLL_ARM_BYPASS_MASK; -} - -/*! - * brief De-initialize the ARM PLL. - */ -void CLOCK_DeinitArmPll(void) -{ - CCM_ANALOG->PLL_ARM = CCM_ANALOG_PLL_ARM_POWERDOWN_MASK; -} - -/*! - * brief Initialize the System PLL. - * - * This function initializes the System PLL with specific settings - * - * param config Configuration to set to PLL. - */ -void CLOCK_InitSysPll(const clock_sys_pll_config_t *config) -{ - /* Bypass PLL first */ - CCM_ANALOG->PLL_SYS = (CCM_ANALOG->PLL_SYS & (~CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_SYS_BYPASS_MASK | CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_SYS = - (CCM_ANALOG->PLL_SYS & (~(CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK | CCM_ANALOG_PLL_SYS_POWERDOWN_MASK))) | - CCM_ANALOG_PLL_SYS_ENABLE_MASK | CCM_ANALOG_PLL_SYS_DIV_SELECT(config->loopDivider); - - /* Initialize the fractional mode */ - CCM_ANALOG->PLL_SYS_NUM = CCM_ANALOG_PLL_SYS_NUM_A(config->numerator); - CCM_ANALOG->PLL_SYS_DENOM = CCM_ANALOG_PLL_SYS_DENOM_B(config->denominator); - - /* Initialize the spread spectrum mode */ - CCM_ANALOG->PLL_SYS_SS = CCM_ANALOG_PLL_SYS_SS_STEP(config->ss_step) | - CCM_ANALOG_PLL_SYS_SS_ENABLE(config->ss_enable) | - CCM_ANALOG_PLL_SYS_SS_STOP(config->ss_stop); - - while ((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_BYPASS_MASK; -} - -/*! - * brief De-initialize the System PLL. - */ -void CLOCK_DeinitSysPll(void) -{ - CCM_ANALOG->PLL_SYS = CCM_ANALOG_PLL_SYS_POWERDOWN_MASK; -} - -/*! - * brief Initialize the USB1 PLL. - * - * This function initializes the USB1 PLL with specific settings - * - * param config Configuration to set to PLL. - */ -void CLOCK_InitUsb1Pll(const clock_usb_pll_config_t *config) -{ - /* Bypass PLL first */ - CCM_ANALOG->PLL_USB1 = (CCM_ANALOG->PLL_USB1 & (~CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_USB1_BYPASS_MASK | CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_USB1 = (CCM_ANALOG->PLL_USB1 & (~CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK)) | - CCM_ANALOG_PLL_USB1_ENABLE_MASK | CCM_ANALOG_PLL_USB1_POWER_MASK | - CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK | CCM_ANALOG_PLL_USB1_DIV_SELECT(config->loopDivider); - - while ((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_BYPASS_MASK; -} - -/*! - * brief Deinitialize the USB1 PLL. - */ -void CLOCK_DeinitUsb1Pll(void) -{ - CCM_ANALOG->PLL_USB1 = 0U; -} - -/*! - * brief Initialize the USB2 PLL. - * - * This function initializes the USB2 PLL with specific settings - * - * param config Configuration to set to PLL. - */ -void CLOCK_InitUsb2Pll(const clock_usb_pll_config_t *config) -{ - /* Bypass PLL first */ - CCM_ANALOG->PLL_USB2 = (CCM_ANALOG->PLL_USB2 & (~CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_USB2_BYPASS_MASK | CCM_ANALOG_PLL_USB2_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_USB2 = (CCM_ANALOG->PLL_USB2 & (~CCM_ANALOG_PLL_USB2_DIV_SELECT_MASK)) | - CCM_ANALOG_PLL_USB2_ENABLE_MASK | CCM_ANALOG_PLL_USB2_POWER_MASK | - CCM_ANALOG_PLL_USB2_EN_USB_CLKS_MASK | CCM_ANALOG_PLL_USB2_DIV_SELECT(config->loopDivider); - - while ((CCM_ANALOG->PLL_USB2 & CCM_ANALOG_PLL_USB2_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_USB2 &= ~CCM_ANALOG_PLL_USB2_BYPASS_MASK; -} - -/*! - * brief Deinitialize the USB2 PLL. - */ -void CLOCK_DeinitUsb2Pll(void) -{ - CCM_ANALOG->PLL_USB2 = 0U; -} - -/*! - * brief Initializes the Audio PLL. - * - * This function initializes the Audio PLL with specific settings - * - * param config Configuration to set to PLL. - */ -void CLOCK_InitAudioPll(const clock_audio_pll_config_t *config) -{ - uint32_t pllAudio; - uint32_t misc2 = 0; - - /* Bypass PLL first */ - CCM_ANALOG->PLL_AUDIO = (CCM_ANALOG->PLL_AUDIO & (~CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_AUDIO_BYPASS_MASK | CCM_ANALOG_PLL_AUDIO_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_AUDIO_NUM = CCM_ANALOG_PLL_AUDIO_NUM_A(config->numerator); - CCM_ANALOG->PLL_AUDIO_DENOM = CCM_ANALOG_PLL_AUDIO_DENOM_B(config->denominator); - - /* - * Set post divider: - * - * ------------------------------------------------------------------------ - * | config->postDivider | PLL_AUDIO[POST_DIV_SELECT] | MISC2[AUDIO_DIV] | - * ------------------------------------------------------------------------ - * | 1 | 2 | 0 | - * ------------------------------------------------------------------------ - * | 2 | 1 | 0 | - * ------------------------------------------------------------------------ - * | 4 | 2 | 3 | - * ------------------------------------------------------------------------ - * | 8 | 1 | 3 | - * ------------------------------------------------------------------------ - * | 16 | 0 | 3 | - * ------------------------------------------------------------------------ - */ - pllAudio = - (CCM_ANALOG->PLL_AUDIO & (~(CCM_ANALOG_PLL_AUDIO_DIV_SELECT_MASK | CCM_ANALOG_PLL_AUDIO_POWERDOWN_MASK))) | - CCM_ANALOG_PLL_AUDIO_ENABLE_MASK | CCM_ANALOG_PLL_AUDIO_DIV_SELECT(config->loopDivider); - - switch (config->postDivider) - { - case 16: - pllAudio |= CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(0); - misc2 = CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK | CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK; - break; - - case 8: - pllAudio |= CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(1); - misc2 = CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK | CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK; - break; - - case 4: - pllAudio |= CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(2); - misc2 = CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK | CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK; - break; - - case 2: - pllAudio |= CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(1); - break; - - default: - pllAudio |= CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(2); - break; - } - - CCM_ANALOG->MISC2 = - (CCM_ANALOG->MISC2 & ~(CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK | CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK)) | misc2; - - CCM_ANALOG->PLL_AUDIO = pllAudio; - - while ((CCM_ANALOG->PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_AUDIO &= ~CCM_ANALOG_PLL_AUDIO_BYPASS_MASK; -} - -/*! - * brief De-initialize the Audio PLL. - */ -void CLOCK_DeinitAudioPll(void) -{ - CCM_ANALOG->PLL_AUDIO = (uint32_t)CCM_ANALOG_PLL_AUDIO_POWERDOWN_MASK; -} - -/*! - * brief Initialize the video PLL. - * - * This function configures the Video PLL with specific settings - * - * param config configuration to set to PLL. - */ -void CLOCK_InitVideoPll(const clock_video_pll_config_t *config) -{ - uint32_t pllVideo; - uint32_t misc2 = 0; - - /* Bypass PLL first */ - CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(config->src); - - CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(config->numerator); - CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(config->denominator); - - /* - * Set post divider: - * - * ------------------------------------------------------------------------ - * | config->postDivider | PLL_VIDEO[POST_DIV_SELECT] | MISC2[VIDEO_DIV] | - * ------------------------------------------------------------------------ - * | 1 | 2 | 0 | - * ------------------------------------------------------------------------ - * | 2 | 1 | 0 | - * ------------------------------------------------------------------------ - * | 4 | 2 | 3 | - * ------------------------------------------------------------------------ - * | 8 | 1 | 3 | - * ------------------------------------------------------------------------ - * | 16 | 0 | 3 | - * ------------------------------------------------------------------------ - */ - pllVideo = - (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) | - CCM_ANALOG_PLL_VIDEO_ENABLE_MASK | CCM_ANALOG_PLL_VIDEO_DIV_SELECT(config->loopDivider); - - switch (config->postDivider) - { - case 16: - pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(0); - misc2 = CCM_ANALOG_MISC2_VIDEO_DIV(3); - break; - - case 8: - pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1); - misc2 = CCM_ANALOG_MISC2_VIDEO_DIV(3); - break; - - case 4: - pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(2); - misc2 = CCM_ANALOG_MISC2_VIDEO_DIV(3); - break; - - case 2: - pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1); - break; - - default: - pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(2); - break; - } - - CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & ~CCM_ANALOG_MISC2_VIDEO_DIV_MASK) | misc2; - - CCM_ANALOG->PLL_VIDEO = pllVideo; - - while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_BYPASS_MASK; -} - -/*! - * brief De-initialize the Video PLL. - */ -void CLOCK_DeinitVideoPll(void) -{ - CCM_ANALOG->PLL_VIDEO = CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK; -} - -/*! - * brief Initialize the ENET PLL. - * - * This function initializes the ENET PLL with specific settings. - * - * param config Configuration to set to PLL. - */ -void CLOCK_InitEnetPll(const clock_enet_pll_config_t *config) -{ - uint32_t enet_pll = CCM_ANALOG_PLL_ENET_DIV_SELECT(config->loopDivider); - - CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_MASK)) | - CCM_ANALOG_PLL_ENET_BYPASS_MASK | CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC(config->src); - - if (config->enableClkOutput) - { - enet_pll |= CCM_ANALOG_PLL_ENET_ENABLE_MASK; - } - - if (config->enableClkOutput25M) - { - enet_pll |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK; - } - - CCM_ANALOG->PLL_ENET = - (CCM_ANALOG->PLL_ENET & (~(CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK | CCM_ANALOG_PLL_ENET_POWERDOWN_MASK))) | - enet_pll; - - /* Wait for stable */ - while ((CCM_ANALOG->PLL_ENET & CCM_ANALOG_PLL_ENET_LOCK_MASK) == 0UL) - { - } - - /* Disable Bypass */ - CCM_ANALOG->PLL_ENET &= ~CCM_ANALOG_PLL_ENET_BYPASS_MASK; -} - -/*! - * brief Deinitialize the ENET PLL. - * - * This function disables the ENET PLL. - */ -void CLOCK_DeinitEnetPll(void) -{ - CCM_ANALOG->PLL_ENET = CCM_ANALOG_PLL_ENET_POWERDOWN_MASK; -} - -/*! - * brief Get current PLL output frequency. - * - * This function get current output frequency of specific PLL - * - * param pll pll name to get frequency. - * return The PLL output frequency in hertz. - */ -uint32_t CLOCK_GetPllFreq(clock_pll_t pll) -{ - uint32_t freq; - uint32_t divSelect; - clock_64b_t freqTmp; - - static const uint32_t enetRefClkFreq[] = { - 25000000U, /* 25M */ - 50000000U, /* 50M */ - 100000000U, /* 100M */ - 125000000U /* 125M */ - }; - - /* check if PLL is enabled */ - if (!CLOCK_IsPllEnabled(CCM_ANALOG, pll)) - { - return 0U; - } - - /* get pll reference clock */ - freq = CLOCK_GetPllBypassRefClk(CCM_ANALOG, pll); - - /* check if pll is bypassed */ - if (CLOCK_IsPllBypassed(CCM_ANALOG, pll)) - { - return freq; - } - - switch (pll) - { - case kCLOCK_PllArm: - freq = ((freq * ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) >> - CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT)) >> - 1U); - break; - case kCLOCK_PllSys: - /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */ - freqTmp = ((clock_64b_t)freq * ((clock_64b_t)(CCM_ANALOG->PLL_SYS_NUM))); - freqTmp /= ((clock_64b_t)(CCM_ANALOG->PLL_SYS_DENOM)); - - if ((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK) != 0U) - { - freq *= 22U; - } - else - { - freq *= 20U; - } - - freq += (uint32_t)freqTmp; - break; - - case kCLOCK_PllUsb1: - freq = (freq * (((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK) != 0UL) ? 22U : 20U)); - break; - - case kCLOCK_PllAudio: - /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */ - divSelect = - (CCM_ANALOG->PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_DIV_SELECT_MASK) >> CCM_ANALOG_PLL_AUDIO_DIV_SELECT_SHIFT; - - freqTmp = ((clock_64b_t)freq * ((clock_64b_t)(CCM_ANALOG->PLL_AUDIO_NUM))); - freqTmp /= ((clock_64b_t)(CCM_ANALOG->PLL_AUDIO_DENOM)); - - freq = freq * divSelect + (uint32_t)freqTmp; - - /* AUDIO PLL output = PLL output frequency / POSTDIV. */ - - /* - * Post divider: - * - * PLL_AUDIO[POST_DIV_SELECT]: - * 0x00: 4 - * 0x01: 2 - * 0x02: 1 - * - * MISC2[AUDO_DIV]: - * 0x00: 1 - * 0x01: 2 - * 0x02: 1 - * 0x03: 4 - */ - switch (CCM_ANALOG->PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT_MASK) - { - case CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(0U): - freq = freq >> 2U; - break; - - case CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(1U): - freq = freq >> 1U; - break; - - case CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(2U): - freq = freq >> 0U; - break; - - default: - assert(false); - break; - } - - switch (CCM_ANALOG->MISC2 & (CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK | CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK)) - { - case CCM_ANALOG_MISC2_AUDIO_DIV_MSB(1) | CCM_ANALOG_MISC2_AUDIO_DIV_LSB(1): - freq >>= 2U; - break; - - case CCM_ANALOG_MISC2_AUDIO_DIV_MSB(0) | CCM_ANALOG_MISC2_AUDIO_DIV_LSB(1): - freq >>= 1U; - break; - - case CCM_ANALOG_MISC2_AUDIO_DIV_MSB(0) | CCM_ANALOG_MISC2_AUDIO_DIV_LSB(0): - case CCM_ANALOG_MISC2_AUDIO_DIV_MSB(1) | CCM_ANALOG_MISC2_AUDIO_DIV_LSB(0): - freq >>= 0U; - break; - - default: - assert(false); - break; - } - break; - - case kCLOCK_PllVideo: - /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */ - divSelect = - (CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK) >> CCM_ANALOG_PLL_VIDEO_DIV_SELECT_SHIFT; - - freqTmp = ((clock_64b_t)freq * ((clock_64b_t)(CCM_ANALOG->PLL_VIDEO_NUM))); - freqTmp /= ((clock_64b_t)(CCM_ANALOG->PLL_VIDEO_DENOM)); - freq = freq * divSelect + (uint32_t)freqTmp; - - /* VIDEO PLL output = PLL output frequency / POSTDIV. */ - - /* - * Post divider: - * - * PLL_VIDEO[POST_DIV_SELECT]: - * 0x00: 4 - * 0x01: 2 - * 0x02: 1 - * - * MISC2[VIDEO_DIV]: - * 0x00: 1 - * 0x01: 2 - * 0x02: 1 - * 0x03: 4 - */ - switch (CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT_MASK) - { - case CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(0U): - freq = freq >> 2U; - break; - - case CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1U): - freq = freq >> 1U; - break; - - case CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(2U): - freq = freq >> 0U; - break; - - default: - assert(false); - break; - } - - switch (CCM_ANALOG->MISC2 & CCM_ANALOG_MISC2_VIDEO_DIV_MASK) - { - case CCM_ANALOG_MISC2_VIDEO_DIV(3U): - freq >>= 2U; - break; - - case CCM_ANALOG_MISC2_VIDEO_DIV(1U): - freq >>= 1U; - break; - - case CCM_ANALOG_MISC2_VIDEO_DIV(0U): - case CCM_ANALOG_MISC2_VIDEO_DIV(2U): - freq >>= 0U; - break; - - default: - assert(false); - break; - } - break; - case kCLOCK_PllEnet: - divSelect = - (CCM_ANALOG->PLL_ENET & CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK) >> CCM_ANALOG_PLL_ENET_DIV_SELECT_SHIFT; - freq = enetRefClkFreq[divSelect]; - break; - - case kCLOCK_PllEnet25M: - /* ref_enetpll1 if fixed at 25MHz. */ - freq = 25000000UL; - break; - - case kCLOCK_PllUsb2: - freq = (freq * (((CCM_ANALOG->PLL_USB2 & CCM_ANALOG_PLL_USB2_DIV_SELECT_MASK) != 0U) ? 22U : 20U)); - break; - default: - freq = 0U; - break; - } - - return freq; -} - -/*! - * brief Initialize the System PLL PFD. - * - * This function initializes the System PLL PFD. During new value setting, - * the clock output is disabled to prevent glitch. - * - * param pfd Which PFD clock to enable. - * param pfdFrac The PFD FRAC value. - * note It is recommended that PFD settings are kept between 12-35. - */ -void CLOCK_InitSysPfd(clock_pfd_t pfd, uint8_t pfdFrac) -{ - uint32_t pfdIndex = (uint32_t)pfd; - uint32_t pfd528; - - pfd528 = CCM_ANALOG->PFD_528 & - ~(((uint32_t)((uint32_t)CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK | CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) - << (8UL * pfdIndex))); - - /* Disable the clock output first. */ - CCM_ANALOG->PFD_528 = pfd528 | ((uint32_t)CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK << (8UL * pfdIndex)); - - /* Set the new value and enable output. */ - CCM_ANALOG->PFD_528 = pfd528 | (CCM_ANALOG_PFD_528_PFD0_FRAC(pfdFrac) << (8UL * pfdIndex)); -} - -/*! - * brief De-initialize the System PLL PFD. - * - * This function disables the System PLL PFD. - * - * param pfd Which PFD clock to disable. - */ -void CLOCK_DeinitSysPfd(clock_pfd_t pfd) -{ - CCM_ANALOG->PFD_528 |= (uint32_t)CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK << (8U * (uint8_t)pfd); -} - -/*! - * brief Check if Sys PFD is enabled - * - * param pfd PFD control name - * return PFD bypass status. - * - true: power on. - * - false: power off. - */ -bool CLOCK_IsSysPfdEnabled(clock_pfd_t pfd) -{ - return ((CCM_ANALOG->PFD_528 & (uint32_t)CCM_ANALOG_PFD_528_PFD0_CLKGATE_MASK << (8UL * (uint8_t)pfd)) == 0U); -} - -/*! - * brief Initialize the USB1 PLL PFD. - * - * This function initializes the USB1 PLL PFD. During new value setting, - * the clock output is disabled to prevent glitch. - * - * param pfd Which PFD clock to enable. - * param pfdFrac The PFD FRAC value. - * note It is recommended that PFD settings are kept between 12-35. - */ -void CLOCK_InitUsb1Pfd(clock_pfd_t pfd, uint8_t pfdFrac) -{ - uint32_t pfdIndex = (uint32_t)pfd; - uint32_t pfd480; - - pfd480 = CCM_ANALOG->PFD_480 & - ~(((uint32_t)((uint32_t)CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK | CCM_ANALOG_PFD_480_PFD0_FRAC_MASK) - << (8UL * pfdIndex))); - - /* Disable the clock output first. */ - CCM_ANALOG->PFD_480 = pfd480 | ((uint32_t)CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK << (8UL * pfdIndex)); - - /* Set the new value and enable output. */ - CCM_ANALOG->PFD_480 = pfd480 | (CCM_ANALOG_PFD_480_PFD0_FRAC(pfdFrac) << (8UL * pfdIndex)); -} - -/*! - * brief De-initialize the USB1 PLL PFD. - * - * This function disables the USB1 PLL PFD. - * - * param pfd Which PFD clock to disable. - */ -void CLOCK_DeinitUsb1Pfd(clock_pfd_t pfd) -{ - CCM_ANALOG->PFD_480 |= (uint32_t)CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK << (8UL * (uint8_t)pfd); -} - -/*! - * brief Check if Usb1 PFD is enabled - * - * param pfd PFD control name. - * return PFD bypass status. - * - true: power on. - * - false: power off. - */ -bool CLOCK_IsUsb1PfdEnabled(clock_pfd_t pfd) -{ - return ((CCM_ANALOG->PFD_480 & (uint32_t)CCM_ANALOG_PFD_480_PFD0_CLKGATE_MASK << (8UL * (uint8_t)pfd)) == 0U); -} - -/*! - * brief Get current System PLL PFD output frequency. - * - * This function get current output frequency of specific System PLL PFD - * - * param pfd pfd name to get frequency. - * return The PFD output frequency in hertz. - */ -uint32_t CLOCK_GetSysPfdFreq(clock_pfd_t pfd) -{ - uint32_t freq = CLOCK_GetPllFreq(kCLOCK_PllSys); - - switch (pfd) - { - case kCLOCK_Pfd0: - freq /= ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD0_FRAC_SHIFT); - break; - - case kCLOCK_Pfd1: - freq /= ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD1_FRAC_SHIFT); - break; - - case kCLOCK_Pfd2: - freq /= ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT); - break; - - case kCLOCK_Pfd3: - freq /= ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD3_FRAC_SHIFT); - break; - - default: - freq = 0U; - break; - } - freq *= 18U; - - return freq; -} - -/*! - * brief Get current USB1 PLL PFD output frequency. - * - * This function get current output frequency of specific USB1 PLL PFD - * - * param pfd pfd name to get frequency. - * return The PFD output frequency in hertz. - */ -uint32_t CLOCK_GetUsb1PfdFreq(clock_pfd_t pfd) -{ - uint32_t freq = CLOCK_GetPllFreq(kCLOCK_PllUsb1); - - switch (pfd) - { - case kCLOCK_Pfd0: - freq /= ((CCM_ANALOG->PFD_480 & CCM_ANALOG_PFD_480_PFD0_FRAC_MASK) >> CCM_ANALOG_PFD_480_PFD0_FRAC_SHIFT); - break; - - case kCLOCK_Pfd1: - freq /= ((CCM_ANALOG->PFD_480 & CCM_ANALOG_PFD_480_PFD1_FRAC_MASK) >> CCM_ANALOG_PFD_480_PFD1_FRAC_SHIFT); - break; - - case kCLOCK_Pfd2: - freq /= ((CCM_ANALOG->PFD_480 & CCM_ANALOG_PFD_480_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_480_PFD2_FRAC_SHIFT); - break; - - case kCLOCK_Pfd3: - freq /= ((CCM_ANALOG->PFD_480 & CCM_ANALOG_PFD_480_PFD3_FRAC_MASK) >> CCM_ANALOG_PFD_480_PFD3_FRAC_SHIFT); - break; - - default: - freq = 0U; - break; - } - freq *= 18U; - - return freq; -} - -/*! brief Enable USB HS PHY PLL clock. - * - * This function enables the internal 480MHz USB PHY PLL clock. - * - * param src USB HS PHY PLL clock source. - * param freq The frequency specified by src. - * retval true The clock is set successfully. - * retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs1PhyPllClock(clock_usb_phy_src_t src, uint32_t freq) -{ - static const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U}; - CLOCK_InitUsb2Pll(&g_ccmConfigUsbPll); - USBPHY2->CTRL &= ~USBPHY_CTRL_SFTRST_MASK; /* release PHY from reset */ - USBPHY2->CTRL &= ~USBPHY_CTRL_CLKGATE_MASK; - - USBPHY2->PWD = 0; - USBPHY2->CTRL |= USBPHY_CTRL_ENAUTOCLR_PHY_PWD_MASK | USBPHY_CTRL_ENAUTOCLR_CLKGATE_MASK | - USBPHY_CTRL_ENUTMILEVEL2_MASK | USBPHY_CTRL_ENUTMILEVEL3_MASK; - - return true; -} - -/*! brief Disable USB HS PHY PLL clock. - * - * This function disables USB HS PHY PLL clock. - */ -void CLOCK_DisableUsbhs1PhyPllClock(void) -{ - CCM_ANALOG->PLL_USB2 &= ~CCM_ANALOG_PLL_USB2_EN_USB_CLKS_MASK; - USBPHY2->CTRL |= USBPHY_CTRL_CLKGATE_MASK; /* Set to 1U to gate clocks */ -} - -/*! - * brief Set the clock source and the divider of the clock output1. - * - * param selection The clock source to be output, please refer to clock_output1_selection_t. - * param divider The divider of the output clock signal, please refer to clock_output_divider_t. - */ -void CLOCK_SetClockOutput1(clock_output1_selection_t selection, clock_output_divider_t divider) -{ - uint32_t tmp32; - - tmp32 = CCM->CCOSR; - if (selection == kCLOCK_DisableClockOutput1) - { - tmp32 &= ~CCM_CCOSR_CLKO1_EN_MASK; - } - else - { - tmp32 |= CCM_CCOSR_CLKO1_EN_MASK; - tmp32 &= ~(CCM_CCOSR_CLKO1_SEL_MASK | CCM_CCOSR_CLKO1_DIV_MASK); - tmp32 |= CCM_CCOSR_CLKO1_SEL(selection) | CCM_CCOSR_CLKO1_DIV(divider); - } - CCM->CCOSR = tmp32; -} - -/*! - * brief Set the clock source and the divider of the clock output2. - * - * param selection The clock source to be output, please refer to clock_output2_selection_t. - * param divider The divider of the output clock signal, please refer to clock_output_divider_t. - */ -void CLOCK_SetClockOutput2(clock_output2_selection_t selection, clock_output_divider_t divider) -{ - uint32_t tmp32; - - tmp32 = CCM->CCOSR; - if (selection == kCLOCK_DisableClockOutput2) - { - tmp32 &= CCM_CCOSR_CLKO2_EN_MASK; - } - else - { - tmp32 |= CCM_CCOSR_CLKO2_EN_MASK; - tmp32 &= ~(CCM_CCOSR_CLKO2_SEL_MASK | CCM_CCOSR_CLKO2_DIV_MASK); - tmp32 |= CCM_CCOSR_CLKO2_SEL(selection) | CCM_CCOSR_CLKO2_DIV(divider); - } - - CCM->CCOSR = tmp32; -} - -/*! - * brief Get the frequency of clock output1 clock signal. - * - * return The frequency of clock output1 clock signal. - */ -uint32_t CLOCK_GetClockOutCLKO1Freq(void) -{ - uint32_t freq = 0U; - uint32_t tmp32; - - tmp32 = CCM->CCOSR; - - if ((tmp32 & CCM_CCOSR_CLKO1_EN_MASK) != 0UL) - { - switch ((tmp32 & CCM_CCOSR_CLKO1_SEL_MASK) >> CCM_CCOSR_CLKO1_SEL_SHIFT) - { - case (uint32_t)kCLOCK_OutputPllUsb1: - freq = CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 2U; - break; - case (uint32_t)kCLOCK_OutputPllSys: - freq = CLOCK_GetPllFreq(kCLOCK_PllSys) / 2U; - break; - case (uint32_t)kCLOCK_OutputPllVideo: - freq = CLOCK_GetPllFreq(kCLOCK_PllVideo) / 2U; - break; - case (uint32_t)kCLOCK_OutputSemcClk: - freq = CLOCK_GetSemcFreq(); - break; - case (uint32_t)kCLOCK_OutputLcdifPixClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_LcdifClkRoot); - break; - case (uint32_t)kCLOCK_OutputAhbClk: - freq = CLOCK_GetAhbFreq(); - break; - case (uint32_t)kCLOCK_OutputIpgClk: - freq = CLOCK_GetIpgFreq(); - break; - case (uint32_t)kCLOCK_OutputPerClk: - freq = CLOCK_GetPerClkFreq(); - break; - case (uint32_t)kCLOCK_OutputCkilSyncClk: - freq = CLOCK_GetRtcFreq(); - break; - case (uint32_t)kCLOCK_OutputPll4MainClk: - freq = CLOCK_GetPllFreq(kCLOCK_PllAudio); - break; - default: - /* This branch should never be hit. */ - break; - } - - freq /= (((tmp32 & CCM_CCOSR_CLKO1_DIV_MASK) >> CCM_CCOSR_CLKO1_DIV_SHIFT) + 1U); - } - else - { - freq = 0UL; - } - - return freq; -} - -/*! - * brief Get the frequency of clock output2 clock signal. - * - * return The frequency of clock output2 clock signal. - */ -uint32_t CLOCK_GetClockOutClkO2Freq(void) -{ - uint32_t freq = 0U; - uint32_t tmp32; - - tmp32 = CCM->CCOSR; - - if ((tmp32 & CCM_CCOSR_CLKO2_EN_MASK) != 0UL) - { - switch ((tmp32 & CCM_CCOSR_CLKO2_SEL_MASK) >> CCM_CCOSR_CLKO2_SEL_SHIFT) - { - case (uint32_t)kCLOCK_OutputUsdhc1Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Usdhc1ClkRoot); - break; - case (uint32_t)kCLOCK_OutputLpi2cClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Lpi2cClkRoot); - break; - case (uint32_t)kCLOCK_OutputCsiClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_CsiClkRoot); - break; - case (uint32_t)kCLOCK_OutputOscClk: - freq = CLOCK_GetOscFreq(); - break; - case (uint32_t)kCLOCK_OutputUsdhc2Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Usdhc2ClkRoot); - break; - case (uint32_t)kCLOCK_OutputSai1Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Sai1ClkRoot); - break; - case (uint32_t)kCLOCK_OutputSai2Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Sai2ClkRoot); - break; - case (uint32_t)kCLOCK_OutputSai3Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_Sai3ClkRoot); - break; - case (uint32_t)kCLOCK_OutputCanClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_CanClkRoot); - break; - case (uint32_t)kCLOCK_OutputFlexspiClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_FlexspiClkRoot); - break; - case (uint32_t)kCLOCK_OutputUartClk: - freq = CLOCK_GetClockRootFreq(kCLOCK_UartClkRoot); - break; - case (uint32_t)kCLOCK_OutputSpdif0Clk: - freq = CLOCK_GetClockRootFreq(kCLOCK_SpdifClkRoot); - break; - default: - /* This branch should never be hit. */ - break; - } - - freq /= (((tmp32 & CCM_CCOSR_CLKO2_DIV_MASK) >> CCM_CCOSR_CLKO2_DIV_SHIFT) + 1U); - } - else - { - freq = 0UL; - } - - return freq; -} diff --git a/devices/MIMXRT1052/drivers/fsl_clock.h b/devices/MIMXRT1052/drivers/fsl_clock.h deleted file mode 100644 index 27595c7..0000000 --- a/devices/MIMXRT1052/drivers/fsl_clock.h +++ /dev/null @@ -1,1759 +0,0 @@ -/* - * Copyright 2017 - 2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_CLOCK_H_ -#define _FSL_CLOCK_H_ - -#include "fsl_common.h" - -/*! @addtogroup clock */ -/*! @{ */ - -/*! @file */ - -/******************************************************************************* - * Configurations - ******************************************************************************/ - -/*! @brief Configure whether driver controls clock - * - * When set to 0, peripheral drivers will enable clock in initialize function - * and disable clock in de-initialize function. When set to 1, peripheral - * driver will not control the clock, application could control the clock out of - * the driver. - * - * @note All drivers share this feature switcher. If it is set to 1, application - * should handle clock enable and disable for all drivers. - */ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)) -#define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0 -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief CLOCK driver version 2.5.0. */ -#define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) - -/* Definition for delay API in clock driver, users can redefine it to the real application. */ -#ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY -#define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (600000000UL) -#endif - -/* analog pll definition */ -#define CCM_ANALOG_PLL_BYPASS_SHIFT (16U) -#define CCM_ANALOG_PLL_BYPASS_CLK_SRC_MASK (0xC000U) -#define CCM_ANALOG_PLL_BYPASS_CLK_SRC_SHIFT (14U) - -/*@}*/ - -/*! - * @brief CCM registers offset. - */ -#define CCSR_OFFSET 0x0C -#define CBCDR_OFFSET 0x14 -#define CBCMR_OFFSET 0x18 -#define CSCMR1_OFFSET 0x1C -#define CSCMR2_OFFSET 0x20 -#define CSCDR1_OFFSET 0x24 -#define CDCDR_OFFSET 0x30 -#define CSCDR2_OFFSET 0x38 -#define CSCDR3_OFFSET 0x3C -#define CACRR_OFFSET 0x10 -#define CS1CDR_OFFSET 0x28 -#define CS2CDR_OFFSET 0x2C - -/*! - * @brief CCM Analog registers offset. - */ -#define PLL_ARM_OFFSET 0x00 -#define PLL_SYS_OFFSET 0x30 -#define PLL_USB1_OFFSET 0x10 -#define PLL_AUDIO_OFFSET 0x70 -#define PLL_VIDEO_OFFSET 0xA0 -#define PLL_ENET_OFFSET 0xE0 -#define PLL_USB2_OFFSET 0x20 - -#define CCM_TUPLE(reg, shift, mask, busyShift) \ - (int)(((reg)&0xFFU) | ((shift) << 8U) | ((((mask) >> (shift)) & 0x1FFFU) << 13U) | ((busyShift) << 26U)) -#define CCM_TUPLE_REG(base, tuple) (*((volatile uint32_t *)(((uint32_t)(base)) + ((uint32_t)(tuple)&0xFFU)))) -#define CCM_TUPLE_SHIFT(tuple) ((((uint32_t)tuple) >> 8U) & 0x1FU) -#define CCM_TUPLE_MASK(tuple) \ - ((uint32_t)((((uint32_t)(tuple) >> 13U) & 0x1FFFU) << (((((uint32_t)tuple) >> 8U) & 0x1FU)))) -#define CCM_TUPLE_BUSY_SHIFT(tuple) ((((uint32_t)tuple) >> 26U) & 0x3FU) - -#define CCM_NO_BUSY_WAIT (0x20U) - -/*! - * @brief CCM ANALOG tuple macros to map corresponding registers and bit fields. - */ -#define CCM_ANALOG_TUPLE(reg, shift) ((((reg)&0xFFFU) << 16U) | (shift)) -#define CCM_ANALOG_TUPLE_SHIFT(tuple) (((uint32_t)tuple) & 0x1FU) -#define CCM_ANALOG_TUPLE_REG_OFF(base, tuple, off) \ - (*((volatile uint32_t *)((uint32_t)(base) + (((uint32_t)(tuple) >> 16U) & 0xFFFU) + (off)))) -#define CCM_ANALOG_TUPLE_REG(base, tuple) CCM_ANALOG_TUPLE_REG_OFF(base, tuple, 0U) - -/* Definition for ERRATA 50235 check */ -#if (defined(FSL_FEATURE_CCM_HAS_ERRATA_50235) && FSL_FEATURE_CCM_HAS_ERRATA_50235) -#define CAN_CLOCK_CHECK_NO_AFFECTS \ - ((CCM_CSCMR2_CAN_CLK_SEL(2U) != (CCM->CSCMR2 & CCM_CSCMR2_CAN_CLK_SEL_MASK)) || \ - (CCM_CCGR5_CG12(0) != (CCM->CCGR5 & CCM_CCGR5_CG12_MASK))) -#endif /* FSL_FEATURE_CCM_HAS_ERRATA_50235 */ - -/*! - * @brief clock1PN frequency. - */ -#define CLKPN_FREQ 0U - -/*! @brief External XTAL (24M OSC/SYSOSC) clock frequency. - * - * The XTAL (24M OSC/SYSOSC) clock frequency in Hz, when the clock is setup, use the - * function CLOCK_SetXtalFreq to set the value in to clock driver. For example, - * if XTAL is 24MHz, - * @code - * CLOCK_InitExternalClk(false); - * CLOCK_SetXtalFreq(240000000); - * @endcode - */ -extern volatile uint32_t g_xtalFreq; - -/*! @brief External RTC XTAL (32K OSC) clock frequency. - * - * The RTC XTAL (32K OSC) clock frequency in Hz, when the clock is setup, use the - * function CLOCK_SetRtcXtalFreq to set the value in to clock driver. - */ -extern volatile uint32_t g_rtcXtalFreq; - -/* For compatible with other platforms */ -#define CLOCK_SetXtal0Freq CLOCK_SetXtalFreq -#define CLOCK_SetXtal32Freq CLOCK_SetRtcXtalFreq - -/*! @brief Clock ip name array for ADC. */ -#define ADC_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Adc1, kCLOCK_Adc2 \ - } - -/*! @brief Clock ip name array for AOI. */ -#define AOI_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Aoi1, kCLOCK_Aoi2 \ - } - -/*! @brief Clock ip name array for BEE. */ -#define BEE_CLOCKS \ - { \ - kCLOCK_Bee \ - } - -/*! @brief Clock ip name array for CMP. */ -#define CMP_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Acmp1, kCLOCK_Acmp2, kCLOCK_Acmp3, kCLOCK_Acmp4 \ - } - -/*! @brief Clock ip name array for CSI. */ -#define CSI_CLOCKS \ - { \ - kCLOCK_Csi \ - } - -/*! @brief Clock ip name array for DCDC. */ -#define DCDC_CLOCKS \ - { \ - kCLOCK_Dcdc \ - } - -/*! @brief Clock ip name array for DCP. */ -#define DCP_CLOCKS \ - { \ - kCLOCK_Dcp \ - } - -/*! @brief Clock ip name array for DMAMUX_CLOCKS. */ -#define DMAMUX_CLOCKS \ - { \ - kCLOCK_Dma \ - } - -/*! @brief Clock ip name array for DMA. */ -#define EDMA_CLOCKS \ - { \ - kCLOCK_Dma \ - } - -/*! @brief Clock ip name array for ENC. */ -#define ENC_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Enc1, kCLOCK_Enc2, kCLOCK_Enc3, kCLOCK_Enc4 \ - } - -/*! @brief Clock ip name array for ENET. */ -#define ENET_CLOCKS \ - { \ - kCLOCK_Enet \ - } - -/*! @brief Clock ip name array for EWM. */ -#define EWM_CLOCKS \ - { \ - kCLOCK_Ewm0 \ - } - -/*! @brief Clock ip name array for FLEXCAN. */ -#define FLEXCAN_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Can1, kCLOCK_Can2 \ - } - -/*! @brief Clock ip name array for FLEXCAN Peripheral clock. */ -#define FLEXCAN_PERIPH_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Can1S, kCLOCK_Can2S \ - } - -/*! @brief Clock ip name array for FLEXIO. */ -#define FLEXIO_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Flexio1, kCLOCK_Flexio2 \ - } - -/*! @brief Clock ip name array for FLEXRAM. */ -#define FLEXRAM_CLOCKS \ - { \ - kCLOCK_FlexRam \ - } - -/*! @brief Clock ip name array for FLEXSPI. */ -#define FLEXSPI_CLOCKS \ - { \ - kCLOCK_FlexSpi \ - } - -/*! @brief Clock ip name array for FLEXSPI EXSC. */ -#define FLEXSPI_EXSC_CLOCKS \ - { \ - kCLOCK_FlexSpiExsc \ - } - -/*! @brief Clock ip name array for GPIO. */ -#define GPIO_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Gpio1, kCLOCK_Gpio2, kCLOCK_Gpio3, kCLOCK_Gpio4, kCLOCK_Gpio5 \ - } - -/*! @brief Clock ip name array for GPT. */ -#define GPT_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Gpt1, kCLOCK_Gpt2 \ - } - -/*! @brief Clock ip name array for KPP. */ -#define KPP_CLOCKS \ - { \ - kCLOCK_Kpp \ - } - -/*! @brief Clock ip name array for LCDIF. */ -#define LCDIF_CLOCKS \ - { \ - kCLOCK_Lcd \ - } - -/*! @brief Clock ip name array for LCDIF PIXEL. */ -#define LCDIF_PERIPH_CLOCKS \ - { \ - kCLOCK_LcdPixel \ - } - -/*! @brief Clock ip name array for LPI2C. */ -#define LPI2C_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Lpi2c1, kCLOCK_Lpi2c2, kCLOCK_Lpi2c3, kCLOCK_Lpi2c4 \ - } - -/*! @brief Clock ip name array for LPSPI. */ -#define LPSPI_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Lpspi1, kCLOCK_Lpspi2, kCLOCK_Lpspi3, kCLOCK_Lpspi4 \ - } - -/*! @brief Clock ip name array for LPUART. */ -#define LPUART_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Lpuart1, kCLOCK_Lpuart2, kCLOCK_Lpuart3, kCLOCK_Lpuart4, kCLOCK_Lpuart5, \ - kCLOCK_Lpuart6, kCLOCK_Lpuart7, kCLOCK_Lpuart8 \ - } - -/*! @brief Clock ip name array for MQS. */ -#define MQS_CLOCKS \ - { \ - kCLOCK_Mqs \ - } - -/*! @brief Clock ip name array for OCRAM EXSC. */ -#define OCRAM_EXSC_CLOCKS \ - { \ - kCLOCK_OcramExsc \ - } - -/*! @brief Clock ip name array for PIT. */ -#define PIT_CLOCKS \ - { \ - kCLOCK_Pit \ - } - -/*! @brief Clock ip name array for PWM. */ -#define PWM_CLOCKS \ - { \ - {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid}, \ - {kCLOCK_Pwm1, kCLOCK_Pwm1, kCLOCK_Pwm1, kCLOCK_Pwm1}, \ - {kCLOCK_Pwm2, kCLOCK_Pwm2, kCLOCK_Pwm2, kCLOCK_Pwm2}, \ - {kCLOCK_Pwm3, kCLOCK_Pwm3, kCLOCK_Pwm3, kCLOCK_Pwm3}, \ - { \ - kCLOCK_Pwm4, kCLOCK_Pwm4, kCLOCK_Pwm4, kCLOCK_Pwm4 \ - } \ - } - -/*! @brief Clock ip name array for PXP. */ -#define PXP_CLOCKS \ - { \ - kCLOCK_Pxp \ - } - -/*! @brief Clock ip name array for RTWDOG. */ -#define RTWDOG_CLOCKS \ - { \ - kCLOCK_Wdog3 \ - } - -/*! @brief Clock ip name array for SAI. */ -#define SAI_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Sai1, kCLOCK_Sai2, kCLOCK_Sai3 \ - } - -/*! @brief Clock ip name array for SEMC. */ -#define SEMC_CLOCKS \ - { \ - kCLOCK_Semc \ - } - -/*! @brief Clock ip name array for SEMC EXSC. */ -#define SEMC_EXSC_CLOCKS \ - { \ - kCLOCK_SemcExsc \ - } - -/*! @brief Clock ip name array for QTIMER. */ -#define TMR_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Timer1, kCLOCK_Timer2, kCLOCK_Timer3, kCLOCK_Timer4 \ - } - -/*! @brief Clock ip name array for TRNG. */ -#define TRNG_CLOCKS \ - { \ - kCLOCK_Trng \ - } - -/*! @brief Clock ip name array for TSC. */ -#define TSC_CLOCKS \ - { \ - kCLOCK_Tsc \ - } - -/*! @brief Clock ip name array for WDOG. */ -#define WDOG_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Wdog1, kCLOCK_Wdog2 \ - } - -/*! @brief Clock ip name array for USDHC. */ -#define USDHC_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Usdhc1, kCLOCK_Usdhc2 \ - } - -/*! @brief Clock ip name array for SPDIF. */ -#define SPDIF_CLOCKS \ - { \ - kCLOCK_Spdif \ - } - -/*! @brief Clock ip name array for XBARA. */ -#define XBARA_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_Xbar1 \ - } - -/*! @brief Clock ip name array for XBARB. */ -#define XBARB_CLOCKS \ - { \ - kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_Xbar2, kCLOCK_Xbar3 \ - } - -#define CLOCK_SOURCE_NONE (0xFFU) - -#define CLOCK_ROOT_SOUCE \ - { \ - {kCLOCK_SysPllPfd2Clk, kCLOCK_SysPllPfd0Clk, kCLOCK_NoneName, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* USDHC1 Clock Root. */ \ - {kCLOCK_SysPllPfd2Clk, kCLOCK_SysPllPfd0Clk, kCLOCK_NoneName, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* USDHC2 Clock Root. */ \ - {kCLOCK_SemcClk, kCLOCK_Usb1SwClk, kCLOCK_SysPllPfd2Clk, \ - kCLOCK_Usb1PllPfd0Clk, kCLOCK_NoneName, kCLOCK_NoneName}, /* FLEXSPI Clock Root. */ \ - {kCLOCK_OscClk, kCLOCK_SysPllPfd2Clk, kCLOCK_Usb1Sw120MClk, \ - kCLOCK_Usb1PllPfd1Clk, kCLOCK_NoneName, kCLOCK_NoneName}, /* CSI Clock Root. */ \ - {kCLOCK_Usb1PllPfd1Clk, kCLOCK_Usb1PllPfd0Clk, kCLOCK_SysPllClk, \ - kCLOCK_SysPllPfd2Clk, kCLOCK_NoneName, kCLOCK_NoneName}, /* LPSPI Clock Root. */ \ - {kCLOCK_SysPllClk, kCLOCK_SysPllPfd2Clk, kCLOCK_SysPllPfd0Clk, \ - kCLOCK_SysPllPfd1Clk, kCLOCK_NoneName, kCLOCK_NoneName}, /* TRACE Clock Root */ \ - {kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, kCLOCK_AudioPllClk, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* SAI1 Clock Root */ \ - {kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, kCLOCK_AudioPllClk, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* SAI2 Clock Root */ \ - {kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, kCLOCK_AudioPllClk, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* SAI3 Clock Root */ \ - {kCLOCK_Usb1Sw60MClk, kCLOCK_OscClk, kCLOCK_NoneName, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* LPI2C Clock Root */ \ - {kCLOCK_Usb1Sw60MClk, kCLOCK_OscClk, kCLOCK_Usb1Sw80MClk, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* CAN Clock Root. */ \ - {kCLOCK_Usb1Sw80MClk, kCLOCK_OscClk, kCLOCK_NoneName, \ - kCLOCK_NoneName, kCLOCK_NoneName, kCLOCK_NoneName}, /* UART Clock Root */ \ - {kCLOCK_SysPllClk, kCLOCK_Usb1PllPfd3Clk, kCLOCK_VideoPllClk, \ - kCLOCK_SysPllPfd0Clk, kCLOCK_SysPllPfd1Clk, kCLOCK_Usb1PllPfd1Clk}, /* LCDIF Clock Root */ \ - {kCLOCK_AudioPllClk, kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, \ - kCLOCK_Usb1SwClk, kCLOCK_NoneName, kCLOCK_NoneName}, /* SPDIF0 Clock Root */ \ - {kCLOCK_AudioPllClk, kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, \ - kCLOCK_Usb1SwClk, kCLOCK_NoneName, kCLOCK_NoneName}, /* FLEXIO1 Clock Root */ \ - {kCLOCK_AudioPllClk, kCLOCK_Usb1PllPfd2Clk, kCLOCK_VideoPllClk, \ - kCLOCK_Usb1PllClk, kCLOCK_NoneName, kCLOCK_NoneName}, /* FLEXIO2 Clock ROOT */ \ - } - -#define CLOCK_ROOT_MUX_TUPLE \ - { \ - kCLOCK_Usdhc1Mux, kCLOCK_Usdhc2Mux, kCLOCK_FlexspiMux, kCLOCK_CsiMux, kCLOCK_LpspiMux, kCLOCK_TraceMux, \ - kCLOCK_Sai1Mux, kCLOCK_Sai2Mux, kCLOCK_Sai3Mux, kCLOCK_Lpi2cMux, kCLOCK_CanMux, kCLOCK_UartMux, \ - kCLOCK_LcdifPreMux, kCLOCK_SpdifMux, kCLOCK_Flexio1Mux, kCLOCK_Flexio2Mux, \ - } - -#define CLOCK_ROOT_NONE_PRE_DIV 0UL - -#define CLOCK_ROOT_DIV_TUPLE \ - { \ - {kCLOCK_NonePreDiv, kCLOCK_Usdhc1Div}, {kCLOCK_NonePreDiv, kCLOCK_Usdhc2Div}, \ - {kCLOCK_NonePreDiv, kCLOCK_FlexspiDiv}, {kCLOCK_NonePreDiv, kCLOCK_CsiDiv}, \ - {kCLOCK_NonePreDiv, kCLOCK_LpspiDiv}, {kCLOCK_NonePreDiv, kCLOCK_TraceDiv}, \ - {kCLOCK_Sai1PreDiv, kCLOCK_Sai1Div}, {kCLOCK_Sai2PreDiv, kCLOCK_Sai2Div}, \ - {kCLOCK_Sai3PreDiv, kCLOCK_Sai3Div}, {kCLOCK_NonePreDiv, kCLOCK_Lpi2cDiv}, \ - {kCLOCK_NonePreDiv, kCLOCK_CanDiv}, {kCLOCK_NonePreDiv, kCLOCK_UartDiv}, \ - {kCLOCK_LcdifPreDiv, kCLOCK_LcdifDiv}, {kCLOCK_Spdif0PreDiv, kCLOCK_Spdif0Div}, \ - {kCLOCK_Flexio1PreDiv, kCLOCK_Flexio1Div}, {kCLOCK_Flexio2PreDiv, kCLOCK_Flexio2Div}, \ - } - -/*! @brief Clock name used to get clock frequency. */ -typedef enum _clock_name -{ - kCLOCK_CpuClk = 0x0U, /*!< CPU clock */ - kCLOCK_AhbClk = 0x1U, /*!< AHB clock */ - kCLOCK_SemcClk = 0x2U, /*!< SEMC clock */ - kCLOCK_IpgClk = 0x3U, /*!< IPG clock */ - kCLOCK_PerClk = 0x4U, /*!< PER clock */ - - kCLOCK_OscClk = 0x5U, /*!< OSC clock selected by PMU_LOWPWR_CTRL[OSC_SEL]. */ - kCLOCK_RtcClk = 0x6U, /*!< RTC clock. (RTCCLK) */ - - kCLOCK_ArmPllClk = 0x7U, /*!< ARMPLLCLK. */ - - kCLOCK_Usb1PllClk = 0x8U, /*!< USB1PLLCLK. */ - kCLOCK_Usb1PllPfd0Clk = 0x9U, /*!< USB1PLLPDF0CLK. */ - kCLOCK_Usb1PllPfd1Clk = 0xAU, /*!< USB1PLLPFD1CLK. */ - kCLOCK_Usb1PllPfd2Clk = 0xBU, /*!< USB1PLLPFD2CLK. */ - kCLOCK_Usb1PllPfd3Clk = 0xCU, /*!< USB1PLLPFD3CLK. */ - kCLOCK_Usb1SwClk = 0x17U, /*!< USB1PLLSWCLK */ - kCLOCK_Usb1Sw120MClk = 0x18U, /*!< USB1PLLSw120MCLK */ - kCLOCK_Usb1Sw60MClk = 0x19U, /*!< USB1PLLSw60MCLK */ - kCLOCK_Usb1Sw80MClk = 0x1AU, /*!< USB1PLLSw80MCLK */ - - kCLOCK_Usb2PllClk = 0xDU, /*!< USB2PLLCLK. */ - - kCLOCK_SysPllClk = 0xEU, /*!< SYSPLLCLK. */ - kCLOCK_SysPllPfd0Clk = 0xFU, /*!< SYSPLLPDF0CLK. */ - kCLOCK_SysPllPfd1Clk = 0x10U, /*!< SYSPLLPFD1CLK. */ - kCLOCK_SysPllPfd2Clk = 0x11U, /*!< SYSPLLPFD2CLK. */ - kCLOCK_SysPllPfd3Clk = 0x12U, /*!< SYSPLLPFD3CLK. */ - - kCLOCK_EnetPll0Clk = 0x13U, /*!< Enet PLLCLK ref_enetpll0. */ - kCLOCK_EnetPll1Clk = 0x14U, /*!< Enet PLLCLK ref_enetpll1. */ - - kCLOCK_AudioPllClk = 0x15U, /*!< Audio PLLCLK. */ - kCLOCK_VideoPllClk = 0x16U, /*!< Video PLLCLK. */ - kCLOCK_NoneName = CLOCK_SOURCE_NONE, /*!< None Clock Name. */ -} clock_name_t; - -#define kCLOCK_CoreSysClk kCLOCK_CpuClk /*!< For compatible with other platforms without CCM. */ -#define CLOCK_GetCoreSysClkFreq CLOCK_GetCpuClkFreq /*!< For compatible with other platforms without CCM. */ - -/*! - * @brief CCM CCGR gate control for each module independently. - */ -typedef enum _clock_ip_name -{ - kCLOCK_IpInvalid = -1, - - /* CCM CCGR0 */ - kCLOCK_Aips_tz1 = (0U << 8U) | CCM_CCGR0_CG0_SHIFT, /*!< CCGR0, CG0 */ - kCLOCK_Aips_tz2 = (0U << 8U) | CCM_CCGR0_CG1_SHIFT, /*!< CCGR0, CG1 */ - kCLOCK_Mqs = (0U << 8U) | CCM_CCGR0_CG2_SHIFT, /*!< CCGR0, CG2 */ - kCLOCK_FlexSpiExsc = (0U << 8U) | CCM_CCGR0_CG3_SHIFT, /*!< CCGR0, CG3 */ - kCLOCK_Sim_M_Main = (0U << 8U) | CCM_CCGR0_CG4_SHIFT, /*!< CCGR0, CG4 */ - kCLOCK_Dcp = (0U << 8U) | CCM_CCGR0_CG5_SHIFT, /*!< CCGR0, CG5 */ - kCLOCK_Lpuart3 = (0U << 8U) | CCM_CCGR0_CG6_SHIFT, /*!< CCGR0, CG6 */ - kCLOCK_Can1 = (0U << 8U) | CCM_CCGR0_CG7_SHIFT, /*!< CCGR0, CG7 */ - kCLOCK_Can1S = (0U << 8U) | CCM_CCGR0_CG8_SHIFT, /*!< CCGR0, CG8 */ - kCLOCK_Can2 = (0U << 8U) | CCM_CCGR0_CG9_SHIFT, /*!< CCGR0, CG9 */ - kCLOCK_Can2S = (0U << 8U) | CCM_CCGR0_CG10_SHIFT, /*!< CCGR0, CG10 */ - kCLOCK_Trace = (0U << 8U) | CCM_CCGR0_CG11_SHIFT, /*!< CCGR0, CG11 */ - kCLOCK_Gpt2 = (0U << 8U) | CCM_CCGR0_CG12_SHIFT, /*!< CCGR0, CG12 */ - kCLOCK_Gpt2S = (0U << 8U) | CCM_CCGR0_CG13_SHIFT, /*!< CCGR0, CG13 */ - kCLOCK_Lpuart2 = (0U << 8U) | CCM_CCGR0_CG14_SHIFT, /*!< CCGR0, CG14 */ - kCLOCK_Gpio2 = (0U << 8U) | CCM_CCGR0_CG15_SHIFT, /*!< CCGR0, CG15 */ - - /* CCM CCGR1 */ - kCLOCK_Lpspi1 = (1U << 8U) | CCM_CCGR1_CG0_SHIFT, /*!< CCGR1, CG0 */ - kCLOCK_Lpspi2 = (1U << 8U) | CCM_CCGR1_CG1_SHIFT, /*!< CCGR1, CG1 */ - kCLOCK_Lpspi3 = (1U << 8U) | CCM_CCGR1_CG2_SHIFT, /*!< CCGR1, CG2 */ - kCLOCK_Lpspi4 = (1U << 8U) | CCM_CCGR1_CG3_SHIFT, /*!< CCGR1, CG3 */ - kCLOCK_Adc2 = (1U << 8U) | CCM_CCGR1_CG4_SHIFT, /*!< CCGR1, CG4 */ - kCLOCK_Enet = (1U << 8U) | CCM_CCGR1_CG5_SHIFT, /*!< CCGR1, CG5 */ - kCLOCK_Pit = (1U << 8U) | CCM_CCGR1_CG6_SHIFT, /*!< CCGR1, CG6 */ - kCLOCK_Aoi2 = (1U << 8U) | CCM_CCGR1_CG7_SHIFT, /*!< CCGR1, CG7 */ - kCLOCK_Adc1 = (1U << 8U) | CCM_CCGR1_CG8_SHIFT, /*!< CCGR1, CG8 */ - kCLOCK_SemcExsc = (1U << 8U) | CCM_CCGR1_CG9_SHIFT, /*!< CCGR1, CG9 */ - kCLOCK_Gpt1 = (1U << 8U) | CCM_CCGR1_CG10_SHIFT, /*!< CCGR1, CG10 */ - kCLOCK_Gpt1S = (1U << 8U) | CCM_CCGR1_CG11_SHIFT, /*!< CCGR1, CG11 */ - kCLOCK_Lpuart4 = (1U << 8U) | CCM_CCGR1_CG12_SHIFT, /*!< CCGR1, CG12 */ - kCLOCK_Gpio1 = (1U << 8U) | CCM_CCGR1_CG13_SHIFT, /*!< CCGR1, CG13 */ - kCLOCK_Csu = (1U << 8U) | CCM_CCGR1_CG14_SHIFT, /*!< CCGR1, CG14 */ - kCLOCK_Gpio5 = (1U << 8U) | CCM_CCGR1_CG15_SHIFT, /*!< CCGR1, CG15 */ - - /* CCM CCGR2 */ - kCLOCK_OcramExsc = (2U << 8U) | CCM_CCGR2_CG0_SHIFT, /*!< CCGR2, CG0 */ - kCLOCK_Csi = (2U << 8U) | CCM_CCGR2_CG1_SHIFT, /*!< CCGR2, CG1 */ - kCLOCK_IomuxcSnvs = (2U << 8U) | CCM_CCGR2_CG2_SHIFT, /*!< CCGR2, CG2 */ - kCLOCK_Lpi2c1 = (2U << 8U) | CCM_CCGR2_CG3_SHIFT, /*!< CCGR2, CG3 */ - kCLOCK_Lpi2c2 = (2U << 8U) | CCM_CCGR2_CG4_SHIFT, /*!< CCGR2, CG4 */ - kCLOCK_Lpi2c3 = (2U << 8U) | CCM_CCGR2_CG5_SHIFT, /*!< CCGR2, CG5 */ - kCLOCK_Ocotp = (2U << 8U) | CCM_CCGR2_CG6_SHIFT, /*!< CCGR2, CG6 */ - kCLOCK_Xbar3 = (2U << 8U) | CCM_CCGR2_CG7_SHIFT, /*!< CCGR2, CG7 */ - kCLOCK_Ipmux1 = (2U << 8U) | CCM_CCGR2_CG8_SHIFT, /*!< CCGR2, CG8 */ - kCLOCK_Ipmux2 = (2U << 8U) | CCM_CCGR2_CG9_SHIFT, /*!< CCGR2, CG9 */ - kCLOCK_Ipmux3 = (2U << 8U) | CCM_CCGR2_CG10_SHIFT, /*!< CCGR2, CG10 */ - kCLOCK_Xbar1 = (2U << 8U) | CCM_CCGR2_CG11_SHIFT, /*!< CCGR2, CG11 */ - kCLOCK_Xbar2 = (2U << 8U) | CCM_CCGR2_CG12_SHIFT, /*!< CCGR2, CG12 */ - kCLOCK_Gpio3 = (2U << 8U) | CCM_CCGR2_CG13_SHIFT, /*!< CCGR2, CG13 */ - kCLOCK_Lcd = (2U << 8U) | CCM_CCGR2_CG14_SHIFT, /*!< CCGR2, CG14 */ - kCLOCK_Pxp = (2U << 8U) | CCM_CCGR2_CG15_SHIFT, /*!< CCGR2, CG15 */ - - /* CCM CCGR3 */ - kCLOCK_Flexio2 = (3U << 8U) | CCM_CCGR3_CG0_SHIFT, /*!< CCGR3, CG0 */ - kCLOCK_Lpuart5 = (3U << 8U) | CCM_CCGR3_CG1_SHIFT, /*!< CCGR3, CG1 */ - kCLOCK_Semc = (3U << 8U) | CCM_CCGR3_CG2_SHIFT, /*!< CCGR3, CG2 */ - kCLOCK_Lpuart6 = (3U << 8U) | CCM_CCGR3_CG3_SHIFT, /*!< CCGR3, CG3 */ - kCLOCK_Aoi1 = (3U << 8U) | CCM_CCGR3_CG4_SHIFT, /*!< CCGR3, CG4 */ - kCLOCK_LcdPixel = (3U << 8U) | CCM_CCGR3_CG5_SHIFT, /*!< CCGR3, CG5 */ - kCLOCK_Gpio4 = (3U << 8U) | CCM_CCGR3_CG6_SHIFT, /*!< CCGR3, CG6 */ - kCLOCK_Ewm0 = (3U << 8U) | CCM_CCGR3_CG7_SHIFT, /*!< CCGR3, CG7 */ - kCLOCK_Wdog1 = (3U << 8U) | CCM_CCGR3_CG8_SHIFT, /*!< CCGR3, CG8 */ - kCLOCK_FlexRam = (3U << 8U) | CCM_CCGR3_CG9_SHIFT, /*!< CCGR3, CG9 */ - kCLOCK_Acmp1 = (3U << 8U) | CCM_CCGR3_CG10_SHIFT, /*!< CCGR3, CG10 */ - kCLOCK_Acmp2 = (3U << 8U) | CCM_CCGR3_CG11_SHIFT, /*!< CCGR3, CG11 */ - kCLOCK_Acmp3 = (3U << 8U) | CCM_CCGR3_CG12_SHIFT, /*!< CCGR3, CG12 */ - kCLOCK_Acmp4 = (3U << 8U) | CCM_CCGR3_CG13_SHIFT, /*!< CCGR3, CG13 */ - kCLOCK_Ocram = (3U << 8U) | CCM_CCGR3_CG14_SHIFT, /*!< CCGR3, CG14 */ - kCLOCK_IomuxcSnvsGpr = (3U << 8U) | CCM_CCGR3_CG15_SHIFT, /*!< CCGR3, CG15 */ - - /* CCM CCGR4 */ - kCLOCK_Iomuxc = (4U << 8U) | CCM_CCGR4_CG1_SHIFT, /*!< CCGR4, CG1 */ - kCLOCK_IomuxcGpr = (4U << 8U) | CCM_CCGR4_CG2_SHIFT, /*!< CCGR4, CG2 */ - kCLOCK_Bee = (4U << 8U) | CCM_CCGR4_CG3_SHIFT, /*!< CCGR4, CG3 */ - kCLOCK_SimM7 = (4U << 8U) | CCM_CCGR4_CG4_SHIFT, /*!< CCGR4, CG4 */ - kCLOCK_Tsc = (4U << 8U) | CCM_CCGR4_CG5_SHIFT, /*!< CCGR4, CG5 */ - kCLOCK_SimM = (4U << 8U) | CCM_CCGR4_CG6_SHIFT, /*!< CCGR4, CG6 */ - kCLOCK_SimEms = (4U << 8U) | CCM_CCGR4_CG7_SHIFT, /*!< CCGR4, CG7 */ - kCLOCK_Pwm1 = (4U << 8U) | CCM_CCGR4_CG8_SHIFT, /*!< CCGR4, CG8 */ - kCLOCK_Pwm2 = (4U << 8U) | CCM_CCGR4_CG9_SHIFT, /*!< CCGR4, CG9 */ - kCLOCK_Pwm3 = (4U << 8U) | CCM_CCGR4_CG10_SHIFT, /*!< CCGR4, CG10 */ - kCLOCK_Pwm4 = (4U << 8U) | CCM_CCGR4_CG11_SHIFT, /*!< CCGR4, CG11 */ - kCLOCK_Enc1 = (4U << 8U) | CCM_CCGR4_CG12_SHIFT, /*!< CCGR4, CG12 */ - kCLOCK_Enc2 = (4U << 8U) | CCM_CCGR4_CG13_SHIFT, /*!< CCGR4, CG13 */ - kCLOCK_Enc3 = (4U << 8U) | CCM_CCGR4_CG14_SHIFT, /*!< CCGR4, CG14 */ - kCLOCK_Enc4 = (4U << 8U) | CCM_CCGR4_CG15_SHIFT, /*!< CCGR4, CG15 */ - - /* CCM CCGR5 */ - kCLOCK_Rom = (5U << 8U) | CCM_CCGR5_CG0_SHIFT, /*!< CCGR5, CG0 */ - kCLOCK_Flexio1 = (5U << 8U) | CCM_CCGR5_CG1_SHIFT, /*!< CCGR5, CG1 */ - kCLOCK_Wdog3 = (5U << 8U) | CCM_CCGR5_CG2_SHIFT, /*!< CCGR5, CG2 */ - kCLOCK_Dma = (5U << 8U) | CCM_CCGR5_CG3_SHIFT, /*!< CCGR5, CG3 */ - kCLOCK_Kpp = (5U << 8U) | CCM_CCGR5_CG4_SHIFT, /*!< CCGR5, CG4 */ - kCLOCK_Wdog2 = (5U << 8U) | CCM_CCGR5_CG5_SHIFT, /*!< CCGR5, CG5 */ - kCLOCK_Aips_tz4 = (5U << 8U) | CCM_CCGR5_CG6_SHIFT, /*!< CCGR5, CG6 */ - kCLOCK_Spdif = (5U << 8U) | CCM_CCGR5_CG7_SHIFT, /*!< CCGR5, CG7 */ - kCLOCK_SimMain = (5U << 8U) | CCM_CCGR5_CG8_SHIFT, /*!< CCGR5, CG8 */ - kCLOCK_Sai1 = (5U << 8U) | CCM_CCGR5_CG9_SHIFT, /*!< CCGR5, CG9 */ - kCLOCK_Sai2 = (5U << 8U) | CCM_CCGR5_CG10_SHIFT, /*!< CCGR5, CG10 */ - kCLOCK_Sai3 = (5U << 8U) | CCM_CCGR5_CG11_SHIFT, /*!< CCGR5, CG11 */ - kCLOCK_Lpuart1 = (5U << 8U) | CCM_CCGR5_CG12_SHIFT, /*!< CCGR5, CG12 */ - kCLOCK_Lpuart7 = (5U << 8U) | CCM_CCGR5_CG13_SHIFT, /*!< CCGR5, CG13 */ - kCLOCK_SnvsHp = (5U << 8U) | CCM_CCGR5_CG14_SHIFT, /*!< CCGR5, CG14 */ - kCLOCK_SnvsLp = (5U << 8U) | CCM_CCGR5_CG15_SHIFT, /*!< CCGR5, CG15 */ - - /* CCM CCGR6 */ - kCLOCK_UsbOh3 = (6U << 8U) | CCM_CCGR6_CG0_SHIFT, /*!< CCGR6, CG0 */ - kCLOCK_Usdhc1 = (6U << 8U) | CCM_CCGR6_CG1_SHIFT, /*!< CCGR6, CG1 */ - kCLOCK_Usdhc2 = (6U << 8U) | CCM_CCGR6_CG2_SHIFT, /*!< CCGR6, CG2 */ - kCLOCK_Dcdc = (6U << 8U) | CCM_CCGR6_CG3_SHIFT, /*!< CCGR6, CG3 */ - kCLOCK_Ipmux4 = (6U << 8U) | CCM_CCGR6_CG4_SHIFT, /*!< CCGR6, CG4 */ - kCLOCK_FlexSpi = (6U << 8U) | CCM_CCGR6_CG5_SHIFT, /*!< CCGR6, CG5 */ - kCLOCK_Trng = (6U << 8U) | CCM_CCGR6_CG6_SHIFT, /*!< CCGR6, CG6 */ - kCLOCK_Lpuart8 = (6U << 8U) | CCM_CCGR6_CG7_SHIFT, /*!< CCGR6, CG7 */ - kCLOCK_Timer4 = (6U << 8U) | CCM_CCGR6_CG8_SHIFT, /*!< CCGR6, CG8 */ - kCLOCK_Aips_tz3 = (6U << 8U) | CCM_CCGR6_CG9_SHIFT, /*!< CCGR6, CG9 */ - kCLOCK_SimPer = (6U << 8U) | CCM_CCGR6_CG10_SHIFT, /*!< CCGR6, CG10 */ - kCLOCK_Anadig = (6U << 8U) | CCM_CCGR6_CG11_SHIFT, /*!< CCGR6, CG11 */ - kCLOCK_Lpi2c4 = (6U << 8U) | CCM_CCGR6_CG12_SHIFT, /*!< CCGR6, CG12 */ - kCLOCK_Timer1 = (6U << 8U) | CCM_CCGR6_CG13_SHIFT, /*!< CCGR6, CG13 */ - kCLOCK_Timer2 = (6U << 8U) | CCM_CCGR6_CG14_SHIFT, /*!< CCGR6, CG14 */ - kCLOCK_Timer3 = (6U << 8U) | CCM_CCGR6_CG15_SHIFT, /*!< CCGR6, CG15 */ - -} clock_ip_name_t; - -/*! @brief OSC 24M sorce select */ -typedef enum _clock_osc -{ - kCLOCK_RcOsc = 0U, /*!< On chip OSC. */ - kCLOCK_XtalOsc = 1U, /*!< 24M Xtal OSC */ -} clock_osc_t; - -/*! @brief Clock gate value */ -typedef enum _clock_gate_value -{ - kCLOCK_ClockNotNeeded = 0U, /*!< Clock is off during all modes. */ - kCLOCK_ClockNeededRun = 1U, /*!< Clock is on in run mode, but off in WAIT and STOP modes */ - kCLOCK_ClockNeededRunWait = 3U, /*!< Clock is on during all modes, except STOP mode */ -} clock_gate_value_t; - -/*! @brief System clock mode */ -typedef enum _clock_mode_t -{ - kCLOCK_ModeRun = 0U, /*!< Remain in run mode. */ - kCLOCK_ModeWait = 1U, /*!< Transfer to wait mode. */ - kCLOCK_ModeStop = 2U, /*!< Transfer to stop mode. */ -} clock_mode_t; - -/*! - * @brief MUX control names for clock mux setting. - * - * These constants define the mux control names for clock mux setting.\n - * - 0:7: REG offset to CCM_BASE in bytes. - * - 8:15: Root clock setting bit field shift. - * - 16:31: Root clock setting bit field width. - */ -typedef enum _clock_mux -{ - kCLOCK_Pll3SwMux = CCM_TUPLE(CCSR_OFFSET, - CCM_CCSR_PLL3_SW_CLK_SEL_SHIFT, - CCM_CCSR_PLL3_SW_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< pll3_sw_clk mux name */ - - kCLOCK_PeriphMux = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_PERIPH_CLK_SEL_SHIFT, - CCM_CBCDR_PERIPH_CLK_SEL_MASK, - CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_SHIFT), /*!< periph mux name */ - kCLOCK_SemcAltMux = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_SEMC_ALT_CLK_SEL_SHIFT, - CCM_CBCDR_SEMC_ALT_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< semc mux name */ - kCLOCK_SemcMux = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_SEMC_CLK_SEL_SHIFT, - CCM_CBCDR_SEMC_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< semc mux name */ - - kCLOCK_PrePeriphMux = CCM_TUPLE(CBCMR_OFFSET, - CCM_CBCMR_PRE_PERIPH_CLK_SEL_SHIFT, - CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< pre-periph mux name */ - kCLOCK_TraceMux = CCM_TUPLE(CBCMR_OFFSET, - CCM_CBCMR_TRACE_CLK_SEL_SHIFT, - CCM_CBCMR_TRACE_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< trace mux name */ - kCLOCK_PeriphClk2Mux = CCM_TUPLE(CBCMR_OFFSET, - CCM_CBCMR_PERIPH_CLK2_SEL_SHIFT, - CCM_CBCMR_PERIPH_CLK2_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< periph clock2 mux name */ - kCLOCK_LpspiMux = CCM_TUPLE(CBCMR_OFFSET, - CCM_CBCMR_LPSPI_CLK_SEL_SHIFT, - CCM_CBCMR_LPSPI_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< lpspi mux name */ - - kCLOCK_FlexspiMux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_FLEXSPI_CLK_SEL_SHIFT, - CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< flexspi mux name */ - kCLOCK_Usdhc2Mux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_USDHC2_CLK_SEL_SHIFT, - CCM_CSCMR1_USDHC2_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< usdhc2 mux name */ - kCLOCK_Usdhc1Mux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_USDHC1_CLK_SEL_SHIFT, - CCM_CSCMR1_USDHC1_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< usdhc1 mux name */ - kCLOCK_Sai3Mux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_SAI3_CLK_SEL_SHIFT, - CCM_CSCMR1_SAI3_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< sai3 mux name */ - kCLOCK_Sai2Mux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_SAI2_CLK_SEL_SHIFT, - CCM_CSCMR1_SAI2_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< sai2 mux name */ - kCLOCK_Sai1Mux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_SAI1_CLK_SEL_SHIFT, - CCM_CSCMR1_SAI1_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< sai1 mux name */ - kCLOCK_PerclkMux = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_PERCLK_CLK_SEL_SHIFT, - CCM_CSCMR1_PERCLK_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< perclk mux name */ - - kCLOCK_Flexio2Mux = CCM_TUPLE(CSCMR2_OFFSET, - CCM_CSCMR2_FLEXIO2_CLK_SEL_SHIFT, - CCM_CSCMR2_FLEXIO2_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< flexio2 mux name */ - kCLOCK_CanMux = CCM_TUPLE(CSCMR2_OFFSET, - CCM_CSCMR2_CAN_CLK_SEL_SHIFT, - CCM_CSCMR2_CAN_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< can mux name */ - - kCLOCK_UartMux = CCM_TUPLE(CSCDR1_OFFSET, - CCM_CSCDR1_UART_CLK_SEL_SHIFT, - CCM_CSCDR1_UART_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< uart mux name */ - - kCLOCK_SpdifMux = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_SPDIF0_CLK_SEL_SHIFT, - CCM_CDCDR_SPDIF0_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< spdif mux name */ - kCLOCK_Flexio1Mux = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_FLEXIO1_CLK_SEL_SHIFT, - CCM_CDCDR_FLEXIO1_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< flexio1 mux name */ - - kCLOCK_Lpi2cMux = CCM_TUPLE(CSCDR2_OFFSET, - CCM_CSCDR2_LPI2C_CLK_SEL_SHIFT, - CCM_CSCDR2_LPI2C_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< lpi2c mux name */ - kCLOCK_LcdifPreMux = CCM_TUPLE(CSCDR2_OFFSET, - CCM_CSCDR2_LCDIF_PRE_CLK_SEL_SHIFT, - CCM_CSCDR2_LCDIF_PRE_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< lcdif pre mux name */ - - kCLOCK_CsiMux = CCM_TUPLE(CSCDR3_OFFSET, - CCM_CSCDR3_CSI_CLK_SEL_SHIFT, - CCM_CSCDR3_CSI_CLK_SEL_MASK, - CCM_NO_BUSY_WAIT), /*!< csi mux name */ -} clock_mux_t; - -/*! - * @brief DIV control names for clock div setting. - * - * These constants define div control names for clock div setting.\n - * - 0:7: REG offset to CCM_BASE in bytes. - * - 8:15: Root clock setting bit field shift. - * - 16:31: Root clock setting bit field width. - */ -typedef enum _clock_div -{ - kCLOCK_ArmDiv = CCM_TUPLE(CACRR_OFFSET, - CCM_CACRR_ARM_PODF_SHIFT, - CCM_CACRR_ARM_PODF_MASK, - CCM_CDHIPR_ARM_PODF_BUSY_SHIFT), /*!< core div name */ - - kCLOCK_PeriphClk2Div = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT, - CCM_CBCDR_PERIPH_CLK2_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< periph clock2 div name */ - kCLOCK_SemcDiv = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_SEMC_PODF_SHIFT, - CCM_CBCDR_SEMC_PODF_MASK, - CCM_CDHIPR_SEMC_PODF_BUSY_SHIFT), /*!< semc div name */ - kCLOCK_AhbDiv = CCM_TUPLE(CBCDR_OFFSET, - CCM_CBCDR_AHB_PODF_SHIFT, - CCM_CBCDR_AHB_PODF_MASK, - CCM_CDHIPR_AHB_PODF_BUSY_SHIFT), /*!< ahb div name */ - kCLOCK_IpgDiv = CCM_TUPLE( - CBCDR_OFFSET, CCM_CBCDR_IPG_PODF_SHIFT, CCM_CBCDR_IPG_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< ipg div name */ - - kCLOCK_LpspiDiv = CCM_TUPLE( - CBCMR_OFFSET, CCM_CBCMR_LPSPI_PODF_SHIFT, CCM_CBCMR_LPSPI_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< lpspi div name */ - kCLOCK_LcdifDiv = CCM_TUPLE( - CBCMR_OFFSET, CCM_CBCMR_LCDIF_PODF_SHIFT, CCM_CBCMR_LCDIF_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< lcdif div name */ - - kCLOCK_FlexspiDiv = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_FLEXSPI_PODF_SHIFT, - CCM_CSCMR1_FLEXSPI_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< flexspi div name */ - kCLOCK_PerclkDiv = CCM_TUPLE(CSCMR1_OFFSET, - CCM_CSCMR1_PERCLK_PODF_SHIFT, - CCM_CSCMR1_PERCLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< perclk div name */ - - kCLOCK_CanDiv = CCM_TUPLE(CSCMR2_OFFSET, - CCM_CSCMR2_CAN_CLK_PODF_SHIFT, - CCM_CSCMR2_CAN_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< can div name */ - - kCLOCK_TraceDiv = CCM_TUPLE(CSCDR1_OFFSET, - CCM_CSCDR1_TRACE_PODF_SHIFT, - CCM_CSCDR1_TRACE_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< trace div name */ - kCLOCK_Usdhc2Div = CCM_TUPLE(CSCDR1_OFFSET, - CCM_CSCDR1_USDHC2_PODF_SHIFT, - CCM_CSCDR1_USDHC2_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< usdhc2 div name */ - kCLOCK_Usdhc1Div = CCM_TUPLE(CSCDR1_OFFSET, - CCM_CSCDR1_USDHC1_PODF_SHIFT, - CCM_CSCDR1_USDHC1_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< usdhc1 div name */ - kCLOCK_UartDiv = CCM_TUPLE(CSCDR1_OFFSET, - CCM_CSCDR1_UART_CLK_PODF_SHIFT, - CCM_CSCDR1_UART_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< uart div name */ - - kCLOCK_Flexio2Div = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_FLEXIO2_CLK_PODF_SHIFT, - CCM_CS1CDR_FLEXIO2_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< flexio2 pre div name */ - kCLOCK_Sai3PreDiv = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_SAI3_CLK_PRED_SHIFT, - CCM_CS1CDR_SAI3_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< sai3 pre div name */ - kCLOCK_Sai3Div = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_SAI3_CLK_PODF_SHIFT, - CCM_CS1CDR_SAI3_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< sai3 div name */ - kCLOCK_Flexio2PreDiv = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_FLEXIO2_CLK_PRED_SHIFT, - CCM_CS1CDR_FLEXIO2_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< sai3 pre div name */ - kCLOCK_Sai1PreDiv = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_SAI1_CLK_PRED_SHIFT, - CCM_CS1CDR_SAI1_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< sai1 pre div name */ - kCLOCK_Sai1Div = CCM_TUPLE(CS1CDR_OFFSET, - CCM_CS1CDR_SAI1_CLK_PODF_SHIFT, - CCM_CS1CDR_SAI1_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< sai1 div name */ - - kCLOCK_Sai2PreDiv = CCM_TUPLE(CS2CDR_OFFSET, - CCM_CS2CDR_SAI2_CLK_PRED_SHIFT, - CCM_CS2CDR_SAI2_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< sai2 pre div name */ - kCLOCK_Sai2Div = CCM_TUPLE(CS2CDR_OFFSET, - CCM_CS2CDR_SAI2_CLK_PODF_SHIFT, - CCM_CS2CDR_SAI2_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< sai2 div name */ - - kCLOCK_Spdif0PreDiv = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_SPDIF0_CLK_PRED_SHIFT, - CCM_CDCDR_SPDIF0_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< spdif pre div name */ - kCLOCK_Spdif0Div = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_SPDIF0_CLK_PODF_SHIFT, - CCM_CDCDR_SPDIF0_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< spdif div name */ - kCLOCK_Flexio1PreDiv = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_FLEXIO1_CLK_PRED_SHIFT, - CCM_CDCDR_FLEXIO1_CLK_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< flexio1 pre div name */ - kCLOCK_Flexio1Div = CCM_TUPLE(CDCDR_OFFSET, - CCM_CDCDR_FLEXIO1_CLK_PODF_SHIFT, - CCM_CDCDR_FLEXIO1_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< flexio1 div name */ - - kCLOCK_Lpi2cDiv = CCM_TUPLE(CSCDR2_OFFSET, - CCM_CSCDR2_LPI2C_CLK_PODF_SHIFT, - CCM_CSCDR2_LPI2C_CLK_PODF_MASK, - CCM_NO_BUSY_WAIT), /*!< lpi2c div name */ - kCLOCK_LcdifPreDiv = CCM_TUPLE(CSCDR2_OFFSET, - CCM_CSCDR2_LCDIF_PRED_SHIFT, - CCM_CSCDR2_LCDIF_PRED_MASK, - CCM_NO_BUSY_WAIT), /*!< lcdif pre div name */ - - kCLOCK_CsiDiv = CCM_TUPLE( - CSCDR3_OFFSET, CCM_CSCDR3_CSI_PODF_SHIFT, CCM_CSCDR3_CSI_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< csi div name */ - - kCLOCK_NonePreDiv = CLOCK_ROOT_NONE_PRE_DIV, /*!< None Pre div. */ -} clock_div_t; - -/*! @brief USB clock source definition. */ -typedef enum _clock_usb_src -{ - kCLOCK_Usb480M = 0, /*!< Use 480M. */ - kCLOCK_UsbSrcUnused = (int)0xFFFFFFFFU, /*!< Used when the function does not - care the clock source. */ -} clock_usb_src_t; - -/*! @brief Source of the USB HS PHY. */ -typedef enum _clock_usb_phy_src -{ - kCLOCK_Usbphy480M = 0, /*!< Use 480M. */ -} clock_usb_phy_src_t; - -/*!@brief PLL clock source, bypass cloco source also */ -enum _clock_pll_clk_src -{ - kCLOCK_PllClkSrc24M = 0U, /*!< Pll clock source 24M */ - kCLOCK_PllSrcClkPN = 1U, /*!< Pll clock source CLK1_P and CLK1_N */ -}; - -/*! @brief PLL configuration for ARM */ -typedef struct _clock_arm_pll_config -{ - uint32_t loopDivider; /*!< PLL loop divider. Valid range for divider value: 54-108. Fout=Fin*loopDivider/2. */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ -} clock_arm_pll_config_t; - -/*! @brief PLL configuration for USB */ -typedef struct _clock_usb_pll_config -{ - uint8_t loopDivider; /*!< PLL loop divider. - 0 - Fout=Fref*20; - 1 - Fout=Fref*22 */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ - -} clock_usb_pll_config_t; - -/*! @brief PLL configuration for System */ -typedef struct _clock_sys_pll_config -{ - uint8_t loopDivider; /*!< PLL loop divider. Intended to be 1 (528M). - 0 - Fout=Fref*20; - 1 - Fout=Fref*22 */ - uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/ - uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ - uint16_t ss_stop; /*!< Stop value to get frequency change. */ - uint8_t ss_enable; /*!< Enable spread spectrum modulation */ - uint16_t ss_step; /*!< Step value to get frequency change step. */ - -} clock_sys_pll_config_t; - -/*! @brief PLL configuration for AUDIO and VIDEO */ -typedef struct _clock_audio_pll_config -{ - uint8_t loopDivider; /*!< PLL loop divider. Valid range for DIV_SELECT divider value: 27~54. */ - uint8_t postDivider; /*!< Divider after the PLL, should only be 1, 2, 4, 8, 16. */ - uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/ - uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ -} clock_audio_pll_config_t; - -/*! @brief PLL configuration for AUDIO and VIDEO */ -typedef struct _clock_video_pll_config -{ - uint8_t loopDivider; /*!< PLL loop divider. Valid range for DIV_SELECT divider value: 27~54. */ - uint8_t postDivider; /*!< Divider after the PLL, should only be 1, 2, 4, 8, 16. */ - uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/ - uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ - -} clock_video_pll_config_t; - -/*! @brief PLL configuration for ENET */ -typedef struct _clock_enet_pll_config -{ - bool enableClkOutput; /*!< Power on and enable PLL clock output for ENET0 (ref_enetpll0). */ - - bool enableClkOutput25M; /*!< Power on and enable PLL clock output for ENET1 (ref_enetpll1). */ - uint8_t loopDivider; /*!< Controls the frequency of the ENET0 reference clock. - b00 25MHz - b01 50MHz - b10 100MHz (not 50% duty cycle) - b11 125MHz */ - uint8_t src; /*!< Pll clock source, reference _clock_pll_clk_src */ - -} clock_enet_pll_config_t; - -/*! @brief PLL name */ -typedef enum _clock_pll -{ - kCLOCK_PllArm = CCM_ANALOG_TUPLE(PLL_ARM_OFFSET, CCM_ANALOG_PLL_ARM_ENABLE_SHIFT), /*!< PLL ARM */ - kCLOCK_PllSys = CCM_ANALOG_TUPLE(PLL_SYS_OFFSET, CCM_ANALOG_PLL_SYS_ENABLE_SHIFT), /*!< PLL SYS */ - kCLOCK_PllUsb1 = CCM_ANALOG_TUPLE(PLL_USB1_OFFSET, CCM_ANALOG_PLL_USB1_ENABLE_SHIFT), /*!< PLL USB1 */ - kCLOCK_PllAudio = CCM_ANALOG_TUPLE(PLL_AUDIO_OFFSET, CCM_ANALOG_PLL_AUDIO_ENABLE_SHIFT), /*!< PLL Audio */ - kCLOCK_PllVideo = CCM_ANALOG_TUPLE(PLL_VIDEO_OFFSET, CCM_ANALOG_PLL_VIDEO_ENABLE_SHIFT), /*!< PLL Video */ - - kCLOCK_PllEnet = CCM_ANALOG_TUPLE(PLL_ENET_OFFSET, CCM_ANALOG_PLL_ENET_ENABLE_SHIFT), /*!< PLL Enet0 */ - - kCLOCK_PllEnet25M = CCM_ANALOG_TUPLE(PLL_ENET_OFFSET, CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_SHIFT), /*!< PLL Enet1 */ - - kCLOCK_PllUsb2 = CCM_ANALOG_TUPLE(PLL_USB2_OFFSET, CCM_ANALOG_PLL_USB2_ENABLE_SHIFT), /*!< PLL USB2 */ - -} clock_pll_t; - -/*! @brief PLL PFD name */ -typedef enum _clock_pfd -{ - kCLOCK_Pfd0 = 0U, /*!< PLL PFD0 */ - kCLOCK_Pfd1 = 1U, /*!< PLL PFD1 */ - kCLOCK_Pfd2 = 2U, /*!< PLL PFD2 */ - kCLOCK_Pfd3 = 3U, /*!< PLL PFD3 */ -} clock_pfd_t; - -/*! - * @brief The enumerater of clock output1's clock source, such as USB1 PLL, SYS PLL and so on. - */ -typedef enum _clock_output1_selection -{ - kCLOCK_OutputPllUsb1 = 0U, /*!< Selects USB1 PLL clock(Divided by 2) output. */ - kCLOCK_OutputPllSys = 1U, /*!< Selects SYS PLL clock(Divided by 2) output. */ - kCLOCK_OutputPllVideo = 3U, /*!< Selects Video PLL clock(Divided by 2) output. */ - kCLOCK_OutputSemcClk = 5U, /*!< Selects semc clock root output. */ - kCLOCK_OutputLcdifPixClk = 0xAU, /*!< Selects Lcdif pix clock root output. */ - kCLOCK_OutputAhbClk = 0xBU, /*!< Selects AHB clock root output. */ - kCLOCK_OutputIpgClk = 0xCU, /*!< Selects IPG clock root output. */ - kCLOCK_OutputPerClk = 0xDU, /*!< Selects PERCLK clock root output. */ - kCLOCK_OutputCkilSyncClk = 0xEU, /*!< Selects Ckil clock root output. */ - kCLOCK_OutputPll4MainClk = 0xFU, /*!< Selects PLL4 main clock output. */ - kCLOCK_DisableClockOutput1 = 0x10U, /*!< Disables CLKO1. */ -} clock_output1_selection_t; - -/*! - * @brief The enumerater of clock output2's clock source, such as USDHC1 clock root, LPI2C clock root and so on. - * - */ -typedef enum _clock_output2_selection -{ - kCLOCK_OutputUsdhc1Clk = 3U, /*!< Selects USDHC1 clock root output. */ - kCLOCK_OutputLpi2cClk = 6U, /*!< Selects LPI2C clock root output. */ - kCLOCK_OutputCsiClk = 0xBU, /*!< Selects CSI clock root output. */ - kCLOCK_OutputOscClk = 0xEU, /*!< Selects OSC output. */ - kCLOCK_OutputUsdhc2Clk = 0x11U, /*!< Selects USDHC2 clock root output. */ - kCLOCK_OutputSai1Clk = 0x12U, /*!< Selects SAI1 clock root output. */ - kCLOCK_OutputSai2Clk = 0x13U, /*!< Selects SAI2 clock root output. */ - kCLOCK_OutputSai3Clk = 0x14U, /*!< Selects SAI3 clock root output. */ - kCLOCK_OutputCanClk = 0x17U, /*!< Selects CAN clock root output. */ - kCLOCK_OutputFlexspiClk = 0x1BU, /*!< Selects FLEXSPI clock root output. */ - kCLOCK_OutputUartClk = 0x1CU, /*!< Selects UART clock root output. */ - kCLOCK_OutputSpdif0Clk = 0x1DU, /*!< Selects SPDIF0 clock root output. */ - kCLOCK_DisableClockOutput2 = 0x1FU, /*!< Disables CLKO2. */ -} clock_output2_selection_t; - -/*! - * @brief The enumerator of clock output's divider. - */ -typedef enum _clock_output_divider -{ - kCLOCK_DivideBy1 = 0U, /*!< Output clock divided by 1. */ - kCLOCK_DivideBy2, /*!< Output clock divided by 2. */ - kCLOCK_DivideBy3, /*!< Output clock divided by 3. */ - kCLOCK_DivideBy4, /*!< Output clock divided by 4. */ - kCLOCK_DivideBy5, /*!< Output clock divided by 5. */ - kCLOCK_DivideBy6, /*!< Output clock divided by 6. */ - kCLOCK_DivideBy7, /*!< Output clock divided by 7. */ - kCLOCK_DivideBy8, /*!< Output clock divided by 8. */ -} clock_output_divider_t; - -/*! - * @brief The enumerator of clock root. - */ -typedef enum _clock_root -{ - kCLOCK_Usdhc1ClkRoot = 0U, /*!< USDHC1 clock root. */ - kCLOCK_Usdhc2ClkRoot, /*!< USDHC2 clock root. */ - kCLOCK_FlexspiClkRoot, /*!< FLEXSPI clock root. */ - kCLOCK_CsiClkRoot, /*!< CSI clock root. */ - kCLOCK_LpspiClkRoot, /*!< LPSPI clock root. */ - kCLOCK_TraceClkRoot, /*!< Trace clock root. */ - kCLOCK_Sai1ClkRoot, /*!< SAI1 clock root. */ - kCLOCK_Sai2ClkRoot, /*!< SAI2 clock root. */ - kCLOCK_Sai3ClkRoot, /*!< SAI3 clock root. */ - kCLOCK_Lpi2cClkRoot, /*!< LPI2C clock root. */ - kCLOCK_CanClkRoot, /*!< CAN clock root. */ - kCLOCK_UartClkRoot, /*!< UART clock root. */ - kCLOCK_LcdifClkRoot, /*!< LCD clock root. */ - kCLOCK_SpdifClkRoot, /*!< SPDIF clock root. */ - kCLOCK_Flexio1ClkRoot, /*!< FLEXIO1 clock root. */ - kCLOCK_Flexio2ClkRoot, /*!< FLEXIO2 clock root. */ -} clock_root_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @brief Set CCM MUX node to certain value. - * - * @param mux Which mux node to set, see \ref clock_mux_t. - * @param value Clock mux value to set, different mux has different value range. - */ -static inline void CLOCK_SetMux(clock_mux_t mux, uint32_t value) -{ - uint32_t busyShift; - - busyShift = (uint32_t)CCM_TUPLE_BUSY_SHIFT(mux); - CCM_TUPLE_REG(CCM, mux) = (CCM_TUPLE_REG(CCM, mux) & (~CCM_TUPLE_MASK(mux))) | - (((uint32_t)((value) << CCM_TUPLE_SHIFT(mux))) & CCM_TUPLE_MASK(mux)); - - assert(busyShift <= CCM_NO_BUSY_WAIT); - - /* Clock switch need Handshake? */ - if (CCM_NO_BUSY_WAIT != busyShift) - { - /* Wait until CCM internal handshake finish. */ - while ((CCM->CDHIPR & ((1UL << busyShift))) != 0UL) - { - } - } -} - -/*! - * @brief Get CCM MUX value. - * - * @param mux Which mux node to get, see \ref clock_mux_t. - * @return Clock mux value. - */ -static inline uint32_t CLOCK_GetMux(clock_mux_t mux) -{ - return (((uint32_t)(CCM_TUPLE_REG(CCM, mux) & CCM_TUPLE_MASK(mux))) >> CCM_TUPLE_SHIFT(mux)); -} - -/*! - * @brief Set CCM DIV node to certain value. - * - * @param divider Which div node to set, see \ref clock_div_t. - * @param value Clock div value to set, different divider has different value range. - * Divided clock frequency = Undivided clock frequency / (value + 1). - */ -static inline void CLOCK_SetDiv(clock_div_t divider, uint32_t value) -{ - uint32_t busyShift; - - busyShift = CCM_TUPLE_BUSY_SHIFT(divider); - CCM_TUPLE_REG(CCM, divider) = (CCM_TUPLE_REG(CCM, divider) & (~CCM_TUPLE_MASK(divider))) | - (((uint32_t)((value) << CCM_TUPLE_SHIFT(divider))) & CCM_TUPLE_MASK(divider)); - - assert(busyShift <= CCM_NO_BUSY_WAIT); - - /* Clock switch need Handshake? */ - if (CCM_NO_BUSY_WAIT != busyShift) - { - /* Wait until CCM internal handshake finish. */ - while ((CCM->CDHIPR & ((uint32_t)(1UL << busyShift))) != 0UL) - { - } - } -} - -/*! - * @brief Get CCM DIV node value. - * - * @param divider Which div node to get, see \ref clock_div_t. - */ -static inline uint32_t CLOCK_GetDiv(clock_div_t divider) -{ - return ((uint32_t)(CCM_TUPLE_REG(CCM, divider) & CCM_TUPLE_MASK(divider)) >> CCM_TUPLE_SHIFT(divider)); -} - -/*! - * @brief Control the clock gate for specific IP. - * - * @param name Which clock to enable, see \ref clock_ip_name_t. - * @param value Clock gate value to set, see \ref clock_gate_value_t. - */ -static inline void CLOCK_ControlGate(clock_ip_name_t name, clock_gate_value_t value) -{ - uint32_t index = ((uint32_t)name) >> 8U; - uint32_t shift = ((uint32_t)name) & 0x1FU; - volatile uint32_t *reg; - - assert(index <= 6UL); - - reg = (volatile uint32_t *)(&(((volatile uint32_t *)&CCM->CCGR0)[index])); - SDK_ATOMIC_LOCAL_CLEAR_AND_SET(reg, (3UL << shift), (((uint32_t)value) << shift)); -} - -/*! - * @brief Enable the clock for specific IP. - * - * @param name Which clock to enable, see \ref clock_ip_name_t. - */ -static inline void CLOCK_EnableClock(clock_ip_name_t name) -{ - CLOCK_ControlGate(name, kCLOCK_ClockNeededRunWait); -} - -/*! - * @brief Disable the clock for specific IP. - * - * @param name Which clock to disable, see \ref clock_ip_name_t. - */ -static inline void CLOCK_DisableClock(clock_ip_name_t name) -{ - CLOCK_ControlGate(name, kCLOCK_ClockNotNeeded); -} - -/*! - * @brief Setting the low power mode that system will enter on next assertion of dsm_request signal. - * - * @param mode Which mode to enter, see \ref clock_mode_t. - */ -static inline void CLOCK_SetMode(clock_mode_t mode) -{ - CCM->CLPCR = (CCM->CLPCR & ~CCM_CLPCR_LPM_MASK) | CCM_CLPCR_LPM((uint32_t)mode); -} - -/*! - * @brief Gets the OSC clock frequency. - * - * This function will return the external XTAL OSC frequency if it is selected as the source of OSC, - * otherwise internal 24MHz RC OSC frequency will be returned. - * - * @return Clock frequency; If the clock is invalid, returns 0. - */ -static inline uint32_t CLOCK_GetOscFreq(void) -{ - return ((XTALOSC24M->LOWPWR_CTRL & XTALOSC24M_LOWPWR_CTRL_OSC_SEL_MASK) != 0UL) ? 24000000UL : g_xtalFreq; -} - -/*! - * @brief Gets the AHB clock frequency. - * - * @return The AHB clock frequency value in hertz. - */ -uint32_t CLOCK_GetAhbFreq(void); - -/*! - * @brief Gets the SEMC clock frequency. - * - * @return The SEMC clock frequency value in hertz. - */ -uint32_t CLOCK_GetSemcFreq(void); - -/*! - * @brief Gets the IPG clock frequency. - * - * @return The IPG clock frequency value in hertz. - */ -uint32_t CLOCK_GetIpgFreq(void); - -/*! - * @brief Gets the PER clock frequency. - * - * @return The PER clock frequency value in hertz. - */ -uint32_t CLOCK_GetPerClkFreq(void); - -/*! - * @brief Gets the clock frequency for a specific clock name. - * - * This function checks the current clock configurations and then calculates - * the clock frequency for a specific clock name defined in clock_name_t. - * - * @param name Clock names defined in clock_name_t - * @return Clock frequency value in hertz - */ -uint32_t CLOCK_GetFreq(clock_name_t name); - -/*! - * @brief Get the CCM CPU/core/system frequency. - * - * @return Clock frequency; If the clock is invalid, returns 0. - */ -static inline uint32_t CLOCK_GetCpuClkFreq(void) -{ - return CLOCK_GetFreq(kCLOCK_CpuClk); -} - -/*! - * @brief Gets the frequency of selected clock root. - * - * @param clockRoot The clock root used to get the frequency, please refer to @ref clock_root_t. - * @return The frequency of selected clock root. - */ -uint32_t CLOCK_GetClockRootFreq(clock_root_t clockRoot); - -/*! - * @name OSC operations - * @{ - */ - -/*! - * @brief Initialize the external 24MHz clock. - * - * This function supports two modes: - * 1. Use external crystal oscillator. - * 2. Bypass the external crystal oscillator, using input source clock directly. - * - * After this function, please call CLOCK_SetXtal0Freq to inform clock driver - * the external clock frequency. - * - * @param bypassXtalOsc Pass in true to bypass the external crystal oscillator. - * @note This device does not support bypass external crystal oscillator, so - * the input parameter should always be false. - */ -void CLOCK_InitExternalClk(bool bypassXtalOsc); - -/*! - * @brief Deinitialize the external 24MHz clock. - * - * This function disables the external 24MHz clock. - * - * After this function, please call CLOCK_SetXtal0Freq to set external clock - * frequency to 0. - */ -void CLOCK_DeinitExternalClk(void); - -/*! - * @brief Switch the OSC. - * - * This function switches the OSC source for SoC. - * - * @param osc OSC source to switch to. - */ -void CLOCK_SwitchOsc(clock_osc_t osc); - -/*! - * @brief Gets the RTC clock frequency. - * - * @return Clock frequency; If the clock is invalid, returns 0. - */ -static inline uint32_t CLOCK_GetRtcFreq(void) -{ - return 32768U; -} - -/*! - * @brief Set the XTAL (24M OSC) frequency based on board setting. - * - * @param freq The XTAL input clock frequency in Hz. - */ -static inline void CLOCK_SetXtalFreq(uint32_t freq) -{ - g_xtalFreq = freq; -} - -/*! - * @brief Set the RTC XTAL (32K OSC) frequency based on board setting. - * - * @param freq The RTC XTAL input clock frequency in Hz. - */ -static inline void CLOCK_SetRtcXtalFreq(uint32_t freq) -{ - g_rtcXtalFreq = freq; -} - -/*! - * @brief Initialize the RC oscillator 24MHz clock. - */ -void CLOCK_InitRcOsc24M(void); - -/*! - * @brief Power down the RCOSC 24M clock. - */ -void CLOCK_DeinitRcOsc24M(void); -/* @} */ - -/*! @brief Enable USB HS clock. - * - * This function only enables the access to USB HS prepheral, upper layer - * should first call the CLOCK_EnableUsbhs0PhyPllClock to enable the PHY - * clock to use USB HS. - * - * @param src USB HS does not care about the clock source, here must be @ref kCLOCK_UsbSrcUnused. - * @param freq USB HS does not care about the clock source, so this parameter is ignored. - * @retval true The clock is set successfully. - * @retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs0Clock(clock_usb_src_t src, uint32_t freq); - -/*! @brief Enable USB HS clock. - * - * This function only enables the access to USB HS prepheral, upper layer - * should first call the CLOCK_EnableUsbhs0PhyPllClock to enable the PHY - * clock to use USB HS. - * - * @param src USB HS does not care about the clock source, here must be @ref kCLOCK_UsbSrcUnused. - * @param freq USB HS does not care about the clock source, so this parameter is ignored. - * @retval true The clock is set successfully. - * @retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs1Clock(clock_usb_src_t src, uint32_t freq); - -/* @} */ - -/*! - * @name PLL/PFD operations - * @{ - */ -/*! - * @brief PLL bypass setting - * - * @param base CCM_ANALOG base pointer. - * @param pll PLL control name (see @ref ccm_analog_pll_control_t enumeration) - * @param bypass Bypass the PLL. - * - true: Bypass the PLL. - * - false:Not bypass the PLL. - */ -static inline void CLOCK_SetPllBypass(CCM_ANALOG_Type *base, clock_pll_t pll, bool bypass) -{ - if (bypass) - { - CCM_ANALOG_TUPLE_REG_OFF(base, pll, 4U) = 1UL << CCM_ANALOG_PLL_BYPASS_SHIFT; - } - else - { - CCM_ANALOG_TUPLE_REG_OFF(base, pll, 8U) = 1UL << CCM_ANALOG_PLL_BYPASS_SHIFT; - } -} - -/*! - * @brief Check if PLL is bypassed - * - * @param base CCM_ANALOG base pointer. - * @param pll PLL control name (see @ref ccm_analog_pll_control_t enumeration) - * @return PLL bypass status. - * - true: The PLL is bypassed. - * - false: The PLL is not bypassed. - */ -static inline bool CLOCK_IsPllBypassed(CCM_ANALOG_Type *base, clock_pll_t pll) -{ - return (bool)(CCM_ANALOG_TUPLE_REG(base, pll) & (1UL << CCM_ANALOG_PLL_BYPASS_SHIFT)); -} - -/*! - * @brief Check if PLL is enabled - * - * @param base CCM_ANALOG base pointer. - * @param pll PLL control name (see @ref ccm_analog_pll_control_t enumeration) - * @return PLL bypass status. - * - true: The PLL is enabled. - * - false: The PLL is not enabled. - */ -static inline bool CLOCK_IsPllEnabled(CCM_ANALOG_Type *base, clock_pll_t pll) -{ - return ((CCM_ANALOG_TUPLE_REG(base, pll) & (1UL << CCM_ANALOG_TUPLE_SHIFT(pll))) != 0U); -} - -/*! - * @brief PLL bypass clock source setting. - * Note: change the bypass clock source also change the pll reference clock source. - * - * @param base CCM_ANALOG base pointer. - * @param pll PLL control name (see @ref ccm_analog_pll_control_t enumeration) - * @param src Bypass clock source, reference _clock_pll_bypass_clk_src. - */ -static inline void CLOCK_SetPllBypassRefClkSrc(CCM_ANALOG_Type *base, clock_pll_t pll, uint32_t src) -{ - CCM_ANALOG_TUPLE_REG(base, pll) |= (CCM_ANALOG_TUPLE_REG(base, pll) & (~CCM_ANALOG_PLL_BYPASS_CLK_SRC_MASK)) | src; -} - -/*! - * @brief Get PLL bypass clock value, it is PLL reference clock actually. - * If CLOCK1_P,CLOCK1_N is choose as the pll bypass clock source, please implement the CLKPN_FREQ define, otherwise 0 - * will be returned. - * @param base CCM_ANALOG base pointer. - * @param pll PLL control name (see @ref ccm_analog_pll_control_t enumeration) - * @retval bypass reference clock frequency value. - */ -static inline uint32_t CLOCK_GetPllBypassRefClk(CCM_ANALOG_Type *base, clock_pll_t pll) -{ - return (((CCM_ANALOG_TUPLE_REG(base, pll) & CCM_ANALOG_PLL_BYPASS_CLK_SRC_MASK) >> - CCM_ANALOG_PLL_BYPASS_CLK_SRC_SHIFT) == (uint32_t)kCLOCK_PllClkSrc24M) ? - CLOCK_GetOscFreq() : - CLKPN_FREQ; -} - -/*! - * @brief Initialize the ARM PLL. - * - * This function initialize the ARM PLL with specific settings - * - * @param config configuration to set to PLL. - */ -void CLOCK_InitArmPll(const clock_arm_pll_config_t *config); - -/*! - * @brief De-initialize the ARM PLL. - */ -void CLOCK_DeinitArmPll(void); - -/*! - * @brief Initialize the System PLL. - * - * This function initializes the System PLL with specific settings - * - * @param config Configuration to set to PLL. - */ -void CLOCK_InitSysPll(const clock_sys_pll_config_t *config); - -/*! - * @brief De-initialize the System PLL. - */ -void CLOCK_DeinitSysPll(void); - -/*! - * @brief Initialize the USB1 PLL. - * - * This function initializes the USB1 PLL with specific settings - * - * @param config Configuration to set to PLL. - */ -void CLOCK_InitUsb1Pll(const clock_usb_pll_config_t *config); - -/*! - * @brief Deinitialize the USB1 PLL. - */ -void CLOCK_DeinitUsb1Pll(void); - -/*! - * @brief Initialize the USB2 PLL. - * - * This function initializes the USB2 PLL with specific settings - * - * @param config Configuration to set to PLL. - */ -void CLOCK_InitUsb2Pll(const clock_usb_pll_config_t *config); - -/*! - * @brief Deinitialize the USB2 PLL. - */ -void CLOCK_DeinitUsb2Pll(void); - -/*! - * @brief Initializes the Audio PLL. - * - * This function initializes the Audio PLL with specific settings - * - * @param config Configuration to set to PLL. - */ -void CLOCK_InitAudioPll(const clock_audio_pll_config_t *config); - -/*! - * @brief De-initialize the Audio PLL. - */ -void CLOCK_DeinitAudioPll(void); - -/*! - * @brief Initialize the video PLL. - * - * This function configures the Video PLL with specific settings - * - * @param config configuration to set to PLL. - */ -void CLOCK_InitVideoPll(const clock_video_pll_config_t *config); - -/*! - * @brief De-initialize the Video PLL. - */ -void CLOCK_DeinitVideoPll(void); -/*! - * @brief Initialize the ENET PLL. - * - * This function initializes the ENET PLL with specific settings. - * - * @param config Configuration to set to PLL. - */ -void CLOCK_InitEnetPll(const clock_enet_pll_config_t *config); - -/*! - * @brief Deinitialize the ENET PLL. - * - * This function disables the ENET PLL. - */ -void CLOCK_DeinitEnetPll(void); - -/*! - * @brief Get current PLL output frequency. - * - * This function get current output frequency of specific PLL - * - * @param pll pll name to get frequency. - * @return The PLL output frequency in hertz. - */ -uint32_t CLOCK_GetPllFreq(clock_pll_t pll); - -/*! - * @brief Initialize the System PLL PFD. - * - * This function initializes the System PLL PFD. During new value setting, - * the clock output is disabled to prevent glitch. - * - * @param pfd Which PFD clock to enable. - * @param pfdFrac The PFD FRAC value. - * @note It is recommended that PFD settings are kept between 12-35. - */ -void CLOCK_InitSysPfd(clock_pfd_t pfd, uint8_t pfdFrac); - -/*! - * @brief De-initialize the System PLL PFD. - * - * This function disables the System PLL PFD. - * - * @param pfd Which PFD clock to disable. - */ -void CLOCK_DeinitSysPfd(clock_pfd_t pfd); - -/*! - * @brief Check if Sys PFD is enabled - * - * @param pfd PFD control name - * @return PFD bypass status. - * - true: power on. - * - false: power off. - */ -bool CLOCK_IsSysPfdEnabled(clock_pfd_t pfd); - -/*! - * @brief Initialize the USB1 PLL PFD. - * - * This function initializes the USB1 PLL PFD. During new value setting, - * the clock output is disabled to prevent glitch. - * - * @param pfd Which PFD clock to enable. - * @param pfdFrac The PFD FRAC value. - * @note It is recommended that PFD settings are kept between 12-35. - */ -void CLOCK_InitUsb1Pfd(clock_pfd_t pfd, uint8_t pfdFrac); - -/*! - * @brief De-initialize the USB1 PLL PFD. - * - * This function disables the USB1 PLL PFD. - * - * @param pfd Which PFD clock to disable. - */ -void CLOCK_DeinitUsb1Pfd(clock_pfd_t pfd); - -/*! - * @brief Check if Usb1 PFD is enabled - * - * @param pfd PFD control name. - * @return PFD bypass status. - * - true: power on. - * - false: power off. - */ -bool CLOCK_IsUsb1PfdEnabled(clock_pfd_t pfd); - -/*! - * @brief Get current System PLL PFD output frequency. - * - * This function get current output frequency of specific System PLL PFD - * - * @param pfd pfd name to get frequency. - * @return The PFD output frequency in hertz. - */ -uint32_t CLOCK_GetSysPfdFreq(clock_pfd_t pfd); - -/*! - * @brief Get current USB1 PLL PFD output frequency. - * - * This function get current output frequency of specific USB1 PLL PFD - * - * @param pfd pfd name to get frequency. - * @return The PFD output frequency in hertz. - */ -uint32_t CLOCK_GetUsb1PfdFreq(clock_pfd_t pfd); - -/*! @brief Enable USB HS PHY PLL clock. - * - * This function enables the internal 480MHz USB PHY PLL clock. - * - * @param src USB HS PHY PLL clock source. - * @param freq The frequency specified by src. - * @retval true The clock is set successfully. - * @retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs0PhyPllClock(clock_usb_phy_src_t src, uint32_t freq); - -/*! @brief Disable USB HS PHY PLL clock. - * - * This function disables USB HS PHY PLL clock. - */ -void CLOCK_DisableUsbhs0PhyPllClock(void); - -/*! @brief Enable USB HS PHY PLL clock. - * - * This function enables the internal 480MHz USB PHY PLL clock. - * - * @param src USB HS PHY PLL clock source. - * @param freq The frequency specified by src. - * @retval true The clock is set successfully. - * @retval false The clock source is invalid to get proper USB HS clock. - */ -bool CLOCK_EnableUsbhs1PhyPllClock(clock_usb_phy_src_t src, uint32_t freq); - -/*! @brief Disable USB HS PHY PLL clock. - * - * This function disables USB HS PHY PLL clock. - */ -void CLOCK_DisableUsbhs1PhyPllClock(void); - -/* @} */ - -/*! - * @name Clock Output Inferfaces - * @{ - */ - -/*! - * @brief Set the clock source and the divider of the clock output1. - * - * @param selection The clock source to be output, please refer to @ref clock_output1_selection_t. - * @param divider The divider of the output clock signal, please refer to @ref clock_output_divider_t. - */ -void CLOCK_SetClockOutput1(clock_output1_selection_t selection, clock_output_divider_t divider); - -/*! - * @brief Set the clock source and the divider of the clock output2. - * - * @param selection The clock source to be output, please refer to @ref clock_output2_selection_t. - * @param divider The divider of the output clock signal, please refer to @ref clock_output_divider_t. - */ -void CLOCK_SetClockOutput2(clock_output2_selection_t selection, clock_output_divider_t divider); - -/*! - * @brief Get the frequency of clock output1 clock signal. - * - * @return The frequency of clock output1 clock signal. - */ -uint32_t CLOCK_GetClockOutCLKO1Freq(void); - -/*! - * @brief Get the frequency of clock output2 clock signal. - * - * @return The frequency of clock output2 clock signal. - */ -uint32_t CLOCK_GetClockOutClkO2Freq(void); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @} */ - -#endif /* _FSL_CLOCK_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_cmp.c b/devices/MIMXRT1052/drivers/fsl_cmp.c deleted file mode 100644 index 8f6bed6..0000000 --- a/devices/MIMXRT1052/drivers/fsl_cmp.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_cmp.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.cmp" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for CMP module. - * - * @param base CMP peripheral base address - */ -static uint32_t CMP_GetInstance(CMP_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to CMP bases for each instance. */ -static CMP_Type *const s_cmpBases[] = CMP_BASE_PTRS; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to CMP clocks for each instance. */ -static const clock_ip_name_t s_cmpClocks[] = CMP_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Codes - ******************************************************************************/ -static uint32_t CMP_GetInstance(CMP_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_cmpBases); instance++) - { - if (s_cmpBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_cmpBases)); - - return instance; -} - -/*! - * brief Initializes the CMP. - * - * This function initializes the CMP module. The operations included are as follows. - * - Enabling the clock for CMP module. - * - Configuring the comparator. - * - Enabling the CMP module. - * Note that for some devices, multiple CMP instances share the same clock gate. In this case, to enable the clock for - * any instance enables all CMPs. See the appropriate MCU reference manual for the clock assignment of the CMP. - * - * param base CMP peripheral base address. - * param config Pointer to the configuration structure. - */ -void CMP_Init(CMP_Type *base, const cmp_config_t *config) -{ - assert(NULL != config); - - uint8_t tmp8; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock. */ - CLOCK_EnableClock(s_cmpClocks[CMP_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Configure. */ - CMP_Enable(base, false); /* Disable the CMP module during configuring. */ - /* CMPx_CR1. */ - tmp8 = (uint8_t)(base->CR1 & ~(CMP_CR1_PMODE_MASK | CMP_CR1_INV_MASK | CMP_CR1_COS_MASK | CMP_CR1_OPE_MASK)); - if (true == config->enableHighSpeed) - { - tmp8 |= CMP_CR1_PMODE_MASK; - } - if (true == config->enableInvertOutput) - { - tmp8 |= CMP_CR1_INV_MASK; - } - if (true == config->useUnfilteredOutput) - { - tmp8 |= CMP_CR1_COS_MASK; - } - if (true == config->enablePinOut) - { - tmp8 |= CMP_CR1_OPE_MASK; - } -#if defined(FSL_FEATURE_CMP_HAS_TRIGGER_MODE) && FSL_FEATURE_CMP_HAS_TRIGGER_MODE - if (true == config->enableTriggerMode) - { - tmp8 |= CMP_CR1_TRIGM_MASK; - } - else - { - tmp8 &= ~(uint8_t)CMP_CR1_TRIGM_MASK; - } -#endif /* FSL_FEATURE_CMP_HAS_TRIGGER_MODE */ - base->CR1 = tmp8; - - /* CMPx_CR0. */ - tmp8 = base->CR0 & ~(uint8_t)CMP_CR0_HYSTCTR_MASK; - tmp8 |= CMP_CR0_HYSTCTR(config->hysteresisMode); - base->CR0 = tmp8; - - CMP_Enable(base, config->enableCmp); /* Enable the CMP module after configured or not. */ -} - -/*! - * brief De-initializes the CMP module. - * - * This function de-initializes the CMP module. The operations included are as follows. - * - Disabling the CMP module. - * - Disabling the clock for CMP module. - * - * This function disables the clock for the CMP. - * Note that for some devices, multiple CMP instances share the same clock gate. In this case, before disabling the - * clock for the CMP, ensure that all the CMP instances are not used. - * - * param base CMP peripheral base address. - */ -void CMP_Deinit(CMP_Type *base) -{ - /* Disable the CMP module. */ - CMP_Enable(base, false); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the clock. */ - CLOCK_DisableClock(s_cmpClocks[CMP_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Initializes the CMP user configuration structure. - * - * This function initializes the user configuration structure to these default values. - * code - * config->enableCmp = true; - * config->hysteresisMode = kCMP_HysteresisLevel0; - * config->enableHighSpeed = false; - * config->enableInvertOutput = false; - * config->useUnfilteredOutput = false; - * config->enablePinOut = false; - * config->enableTriggerMode = false; - * endcode - * param config Pointer to the configuration structure. - */ -void CMP_GetDefaultConfig(cmp_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableCmp = true; /* Enable the CMP module after initialization. */ - config->hysteresisMode = kCMP_HysteresisLevel0; - config->enableHighSpeed = false; - config->enableInvertOutput = false; - config->useUnfilteredOutput = false; - config->enablePinOut = false; -#if defined(FSL_FEATURE_CMP_HAS_TRIGGER_MODE) && FSL_FEATURE_CMP_HAS_TRIGGER_MODE - config->enableTriggerMode = false; -#endif /* FSL_FEATURE_CMP_HAS_TRIGGER_MODE */ -} - -/*! - * brief Sets the input channels for the comparator. - * - * This function sets the input channels for the comparator. - * Note that two input channels cannot be set the same way in the application. When the user selects the same input - * from the analog mux to the positive and negative port, the comparator is disabled automatically. - * - * param base CMP peripheral base address. - * param positiveChannel Positive side input channel number. Available range is 0-7. - * param negativeChannel Negative side input channel number. Available range is 0-7. - */ -void CMP_SetInputChannels(CMP_Type *base, uint8_t positiveChannel, uint8_t negativeChannel) -{ - uint8_t tmp8 = base->MUXCR; - - tmp8 &= ~(uint8_t)(CMP_MUXCR_PSEL_MASK | CMP_MUXCR_MSEL_MASK); - tmp8 |= CMP_MUXCR_PSEL(positiveChannel) | CMP_MUXCR_MSEL(negativeChannel); - base->MUXCR = tmp8; -} - -#if defined(FSL_FEATURE_CMP_HAS_DMA) && FSL_FEATURE_CMP_HAS_DMA -/*! - * brief Enables/disables the DMA request for rising/falling events. - * - * This function enables/disables the DMA request for rising/falling events. Either event triggers the generation of - * the DMA request from CMP if the DMA feature is enabled. Both events are ignored for generating the DMA request from - * the CMP - * if the DMA is disabled. - * - * param base CMP peripheral base address. - * param enable Enables or disables the feature. - */ -void CMP_EnableDMA(CMP_Type *base, bool enable) -{ - uint8_t tmp8 = (uint8_t)(base->SCR & ~(CMP_SCR_CFR_MASK | CMP_SCR_CFF_MASK)); /* To avoid change the w1c bits. */ - - if (enable) - { - tmp8 |= CMP_SCR_DMAEN_MASK; - } - else - { - tmp8 &= ~(uint8_t)CMP_SCR_DMAEN_MASK; - } - base->SCR = tmp8; -} -#endif /* FSL_FEATURE_CMP_HAS_DMA */ - -/*! - * brief Configures the filter. - * - * param base CMP peripheral base address. - * param config Pointer to the configuration structure. - */ -void CMP_SetFilterConfig(CMP_Type *base, const cmp_filter_config_t *config) -{ - assert(NULL != config); - - uint8_t tmp8; - -#if defined(FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT) && FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT - /* Choose the clock source for sampling. */ - if (config->enableSample) - { - base->CR1 |= CMP_CR1_SE_MASK; /* Choose the external SAMPLE clock. */ - } - else - { - base->CR1 &= (uint8_t)(~CMP_CR1_SE_MASK); /* Choose the internal divided bus clock. */ - } -#endif /* FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT */ - /* Set the filter count. */ - tmp8 = (uint8_t)(base->CR0 & ~CMP_CR0_FILTER_CNT_MASK); - tmp8 |= CMP_CR0_FILTER_CNT(config->filterCount); - base->CR0 = tmp8; - /* Set the filter period. It is used as the divider to bus clock. */ - base->FPR = CMP_FPR_FILT_PER(config->filterPeriod); -} - -/*! - * brief Configures the internal DAC. - * - * param base CMP peripheral base address. - * param config Pointer to the configuration structure. "NULL" disables the feature. - */ -void CMP_SetDACConfig(CMP_Type *base, const cmp_dac_config_t *config) -{ - uint8_t tmp8 = 0U; - - if (NULL == config) - { - /* Passing "NULL" as input parameter means no available configuration. So the DAC feature is disabled.*/ - base->DACCR = 0U; - return; - } - /* CMPx_DACCR. */ - tmp8 |= CMP_DACCR_DACEN_MASK; /* Enable the internal DAC. */ - if (kCMP_VrefSourceVin2 == config->referenceVoltageSource) - { - tmp8 |= CMP_DACCR_VRSEL_MASK; - } - tmp8 |= CMP_DACCR_VOSEL(config->DACValue); - - base->DACCR = tmp8; -} - -/*! - * brief Enables the interrupts. - * - * param base CMP peripheral base address. - * param mask Mask value for interrupts. See "_cmp_interrupt_enable". - */ -void CMP_EnableInterrupts(CMP_Type *base, uint32_t mask) -{ - uint8_t tmp8 = (uint8_t)(base->SCR & ~(CMP_SCR_CFR_MASK | CMP_SCR_CFF_MASK)); /* To avoid change the w1c bits. */ - - if (0U != ((uint32_t)kCMP_OutputRisingInterruptEnable & mask)) - { - tmp8 |= CMP_SCR_IER_MASK; - } - if (0U != ((uint32_t)kCMP_OutputFallingInterruptEnable & mask)) - { - tmp8 |= CMP_SCR_IEF_MASK; - } - base->SCR = tmp8; -} - -/*! - * brief Disables the interrupts. - * - * param base CMP peripheral base address. - * param mask Mask value for interrupts. See "_cmp_interrupt_enable". - */ -void CMP_DisableInterrupts(CMP_Type *base, uint32_t mask) -{ - uint8_t tmp8 = (uint8_t)(base->SCR & ~(CMP_SCR_CFR_MASK | CMP_SCR_CFF_MASK)); /* To avoid change the w1c bits. */ - - if (0U != ((uint32_t)kCMP_OutputRisingInterruptEnable & mask)) - { - tmp8 &= ~(uint8_t)CMP_SCR_IER_MASK; - } - if (0U != ((uint32_t)kCMP_OutputFallingInterruptEnable & mask)) - { - tmp8 &= ~(uint8_t)CMP_SCR_IEF_MASK; - } - base->SCR = tmp8; -} - -/*! - * brief Gets the status flags. - * - * param base CMP peripheral base address. - * - * return Mask value for the asserted flags. See "_cmp_status_flags". - */ -uint32_t CMP_GetStatusFlags(CMP_Type *base) -{ - uint32_t ret32 = 0U; - - if (0U != (CMP_SCR_CFR_MASK & base->SCR)) - { - ret32 |= (uint32_t)kCMP_OutputRisingEventFlag; - } - if (0U != (CMP_SCR_CFF_MASK & base->SCR)) - { - ret32 |= (uint32_t)kCMP_OutputFallingEventFlag; - } - if (0U != (CMP_SCR_COUT_MASK & base->SCR)) - { - ret32 |= (uint32_t)kCMP_OutputAssertEventFlag; - } - return ret32; -} - -/*! - * brief Clears the status flags. - * - * param base CMP peripheral base address. - * param mask Mask value for the flags. See "_cmp_status_flags". - */ -void CMP_ClearStatusFlags(CMP_Type *base, uint32_t mask) -{ - uint8_t tmp8 = (uint8_t)(base->SCR & ~(CMP_SCR_CFR_MASK | CMP_SCR_CFF_MASK)); /* To avoid change the w1c bits. */ - - if (0U != ((uint32_t)kCMP_OutputRisingEventFlag & mask)) - { - tmp8 |= CMP_SCR_CFR_MASK; - } - if (0U != ((uint32_t)kCMP_OutputFallingEventFlag & mask)) - { - tmp8 |= CMP_SCR_CFF_MASK; - } - base->SCR = tmp8; -} diff --git a/devices/MIMXRT1052/drivers/fsl_cmp.h b/devices/MIMXRT1052/drivers/fsl_cmp.h deleted file mode 100644 index 4b5b7bf..0000000 --- a/devices/MIMXRT1052/drivers/fsl_cmp.h +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_CMP_H_ -#define _FSL_CMP_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup cmp - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief CMP driver version 2.0.2. */ -#define FSL_CMP_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) -/*@}*/ - -/*! - * @brief Interrupt enable/disable mask. - */ -enum _cmp_interrupt_enable -{ - kCMP_OutputRisingInterruptEnable = CMP_SCR_IER_MASK, /*!< Comparator interrupt enable rising. */ - kCMP_OutputFallingInterruptEnable = CMP_SCR_IEF_MASK, /*!< Comparator interrupt enable falling. */ -}; - -/*! - * @brief Status flags' mask. - */ -enum _cmp_status_flags -{ - kCMP_OutputRisingEventFlag = CMP_SCR_CFR_MASK, /*!< Rising-edge on the comparison output has occurred. */ - kCMP_OutputFallingEventFlag = CMP_SCR_CFF_MASK, /*!< Falling-edge on the comparison output has occurred. */ - kCMP_OutputAssertEventFlag = CMP_SCR_COUT_MASK, /*!< Return the current value of the analog comparator output. */ -}; - -/*! - * @brief CMP Hysteresis mode. - */ -typedef enum _cmp_hysteresis_mode -{ - kCMP_HysteresisLevel0 = 0U, /*!< Hysteresis level 0. */ - kCMP_HysteresisLevel1 = 1U, /*!< Hysteresis level 1. */ - kCMP_HysteresisLevel2 = 2U, /*!< Hysteresis level 2. */ - kCMP_HysteresisLevel3 = 3U, /*!< Hysteresis level 3. */ -} cmp_hysteresis_mode_t; - -/*! - * @brief CMP Voltage Reference source. - */ -typedef enum _cmp_reference_voltage_source -{ - kCMP_VrefSourceVin1 = 0U, /*!< Vin1 is selected as a resistor ladder network supply reference Vin. */ - kCMP_VrefSourceVin2 = 1U, /*!< Vin2 is selected as a resistor ladder network supply reference Vin. */ -} cmp_reference_voltage_source_t; - -/*! - * @brief Configures the comparator. - */ -typedef struct _cmp_config -{ - bool enableCmp; /*!< Enable the CMP module. */ - cmp_hysteresis_mode_t hysteresisMode; /*!< CMP Hysteresis mode. */ - bool enableHighSpeed; /*!< Enable High-speed (HS) comparison mode. */ - bool enableInvertOutput; /*!< Enable the inverted comparator output. */ - bool useUnfilteredOutput; /*!< Set the compare output(COUT) to equal COUTA(true) or COUT(false). */ - bool enablePinOut; /*!< The comparator output is available on the associated pin. */ -#if defined(FSL_FEATURE_CMP_HAS_TRIGGER_MODE) && FSL_FEATURE_CMP_HAS_TRIGGER_MODE - bool enableTriggerMode; /*!< Enable the trigger mode. */ -#endif /* FSL_FEATURE_CMP_HAS_TRIGGER_MODE */ -} cmp_config_t; - -/*! - * @brief Configures the filter. - */ -typedef struct _cmp_filter_config -{ -#if defined(FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT) && FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT - bool enableSample; /*!< Using the external SAMPLE as a sampling clock input or using a divided bus clock. */ -#endif /* FSL_FEATURE_CMP_HAS_EXTERNAL_SAMPLE_SUPPORT */ - uint8_t filterCount; /*!< Filter Sample Count. Available range is 1-7; 0 disables the filter.*/ - uint8_t filterPeriod; /*!< Filter Sample Period. The divider to the bus clock. Available range is 0-255. */ -} cmp_filter_config_t; - -/*! - * @brief Configures the internal DAC. - */ -typedef struct _cmp_dac_config -{ - cmp_reference_voltage_source_t referenceVoltageSource; /*!< Supply voltage reference source. */ - uint8_t DACValue; /*!< Value for the DAC Output Voltage. Available range is 0-63.*/ -} cmp_dac_config_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -/*! - * @name Initialization - * @{ - */ - -/*! - * @brief Initializes the CMP. - * - * This function initializes the CMP module. The operations included are as follows. - * - Enabling the clock for CMP module. - * - Configuring the comparator. - * - Enabling the CMP module. - * Note that for some devices, multiple CMP instances share the same clock gate. In this case, to enable the clock for - * any instance enables all CMPs. See the appropriate MCU reference manual for the clock assignment of the CMP. - * - * @param base CMP peripheral base address. - * @param config Pointer to the configuration structure. - */ -void CMP_Init(CMP_Type *base, const cmp_config_t *config); - -/*! - * @brief De-initializes the CMP module. - * - * This function de-initializes the CMP module. The operations included are as follows. - * - Disabling the CMP module. - * - Disabling the clock for CMP module. - * - * This function disables the clock for the CMP. - * Note that for some devices, multiple CMP instances share the same clock gate. In this case, before disabling the - * clock for the CMP, ensure that all the CMP instances are not used. - * - * @param base CMP peripheral base address. - */ -void CMP_Deinit(CMP_Type *base); - -/*! - * @brief Enables/disables the CMP module. - * - * @param base CMP peripheral base address. - * @param enable Enables or disables the module. - */ -static inline void CMP_Enable(CMP_Type *base, bool enable) -{ - if (enable) - { - base->CR1 |= CMP_CR1_EN_MASK; - } - else - { - base->CR1 &= ~(uint8_t)CMP_CR1_EN_MASK; - } -} - -/*! - * @brief Initializes the CMP user configuration structure. - * - * This function initializes the user configuration structure to these default values. - * @code - * config->enableCmp = true; - * config->hysteresisMode = kCMP_HysteresisLevel0; - * config->enableHighSpeed = false; - * config->enableInvertOutput = false; - * config->useUnfilteredOutput = false; - * config->enablePinOut = false; - * config->enableTriggerMode = false; - * @endcode - * @param config Pointer to the configuration structure. - */ -void CMP_GetDefaultConfig(cmp_config_t *config); - -/*! - * @brief Sets the input channels for the comparator. - * - * This function sets the input channels for the comparator. - * Note that two input channels cannot be set the same way in the application. When the user selects the same input - * from the analog mux to the positive and negative port, the comparator is disabled automatically. - * - * @param base CMP peripheral base address. - * @param positiveChannel Positive side input channel number. Available range is 0-7. - * @param negativeChannel Negative side input channel number. Available range is 0-7. - */ -void CMP_SetInputChannels(CMP_Type *base, uint8_t positiveChannel, uint8_t negativeChannel); - -/* @} */ - -/*! - * @name Advanced Features - * @{ - */ - -#if defined(FSL_FEATURE_CMP_HAS_DMA) && FSL_FEATURE_CMP_HAS_DMA -/*! - * @brief Enables/disables the DMA request for rising/falling events. - * - * This function enables/disables the DMA request for rising/falling events. Either event triggers the generation of - * the DMA request from CMP if the DMA feature is enabled. Both events are ignored for generating the DMA request from - * the CMP - * if the DMA is disabled. - * - * @param base CMP peripheral base address. - * @param enable Enables or disables the feature. - */ -void CMP_EnableDMA(CMP_Type *base, bool enable); -#endif /* FSL_FEATURE_CMP_HAS_DMA */ - -#if defined(FSL_FEATURE_CMP_HAS_WINDOW_MODE) && FSL_FEATURE_CMP_HAS_WINDOW_MODE -/*! - * @brief Enables/disables the window mode. - * - * @param base CMP peripheral base address. - * @param enable Enables or disables the feature. - */ -static inline void CMP_EnableWindowMode(CMP_Type *base, bool enable) -{ - if (enable) - { - base->CR1 |= CMP_CR1_WE_MASK; - } - else - { - base->CR1 &= (uint8_t)(~CMP_CR1_WE_MASK); - } -} -#endif /* FSL_FEATURE_CMP_HAS_WINDOW_MODE */ - -#if defined(FSL_FEATURE_CMP_HAS_PASS_THROUGH_MODE) && FSL_FEATURE_CMP_HAS_PASS_THROUGH_MODE -/*! - * @brief Enables/disables the pass through mode. - * - * @param base CMP peripheral base address. - * @param enable Enables or disables the feature. - */ -static inline void CMP_EnablePassThroughMode(CMP_Type *base, bool enable) -{ - if (enable) - { - base->MUXCR |= CMP_MUXCR_PSTM_MASK; - } - else - { - base->MUXCR &= (uint8_t)(~CMP_MUXCR_PSTM_MASK); - } -} -#endif /* FSL_FEATURE_CMP_HAS_PASS_THROUGH_MODE */ - -/*! - * @brief Configures the filter. - * - * @param base CMP peripheral base address. - * @param config Pointer to the configuration structure. - */ -void CMP_SetFilterConfig(CMP_Type *base, const cmp_filter_config_t *config); - -/*! - * @brief Configures the internal DAC. - * - * @param base CMP peripheral base address. - * @param config Pointer to the configuration structure. "NULL" disables the feature. - */ -void CMP_SetDACConfig(CMP_Type *base, const cmp_dac_config_t *config); - -/*! - * @brief Enables the interrupts. - * - * @param base CMP peripheral base address. - * @param mask Mask value for interrupts. See "_cmp_interrupt_enable". - */ -void CMP_EnableInterrupts(CMP_Type *base, uint32_t mask); - -/*! - * @brief Disables the interrupts. - * - * @param base CMP peripheral base address. - * @param mask Mask value for interrupts. See "_cmp_interrupt_enable". - */ -void CMP_DisableInterrupts(CMP_Type *base, uint32_t mask); - -/* @} */ - -/*! - * @name Results - * @{ - */ - -/*! - * @brief Gets the status flags. - * - * @param base CMP peripheral base address. - * - * @return Mask value for the asserted flags. See "_cmp_status_flags". - */ -uint32_t CMP_GetStatusFlags(CMP_Type *base); - -/*! - * @brief Clears the status flags. - * - * @param base CMP peripheral base address. - * @param mask Mask value for the flags. See "_cmp_status_flags". - */ -void CMP_ClearStatusFlags(CMP_Type *base, uint32_t mask); - -/* @} */ -#if defined(__cplusplus) -} -#endif -/*! - * @} - */ -#endif /* _FSL_CMP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_common.c b/devices/MIMXRT1052/drivers/fsl_common.c deleted file mode 100644 index 8b17fc3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_common.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_common.h" - -#define SDK_MEM_MAGIC_NUMBER 12345U - -typedef struct _mem_align_control_block -{ - uint16_t identifier; /*!< Identifier for the memory control block. */ - uint16_t offset; /*!< offset from aligned address to real address */ -} mem_align_cb_t; - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.common" -#endif - -void *SDK_Malloc(size_t size, size_t alignbytes) -{ - mem_align_cb_t *p_cb = NULL; - uint32_t alignedsize; - - /* Check overflow. */ - alignedsize = SDK_SIZEALIGN(size, alignbytes); - if (alignedsize < size) - { - return NULL; - } - - if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t)) - { - return NULL; - } - - alignedsize += alignbytes + sizeof(mem_align_cb_t); - - union - { - void *pointer_value; - uint32_t unsigned_value; - } p_align_addr, p_addr; - - p_addr.pointer_value = malloc(alignedsize); - - if (p_addr.pointer_value == NULL) - { - return NULL; - } - - p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes); - - p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U); - p_cb->identifier = SDK_MEM_MAGIC_NUMBER; - p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value); - - return p_align_addr.pointer_value; -} - -void SDK_Free(void *ptr) -{ - union - { - void *pointer_value; - uint32_t unsigned_value; - } p_free; - p_free.pointer_value = ptr; - mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U); - - if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER) - { - return; - } - - p_free.unsigned_value = p_free.unsigned_value - p_cb->offset; - - free(p_free.pointer_value); -} diff --git a/devices/MIMXRT1052/drivers/fsl_common.h b/devices/MIMXRT1052/drivers/fsl_common.h deleted file mode 100644 index cc4f04c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_common.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_COMMON_H_ -#define _FSL_COMMON_H_ - -#include -#include -#include -#include -#include - -#if defined(__ICCARM__) || (defined(__CC_ARM) || defined(__ARMCC_VERSION)) || defined(__GNUC__) -#include -#endif - -#include "fsl_device_registers.h" - -/*! - * @addtogroup ksdk_common - * @{ - */ - -/******************************************************************************* - * Configurations - ******************************************************************************/ - -/*! @brief Macro to use the default weak IRQ handler in drivers. */ -#ifndef FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ -#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ 1 -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @brief Construct a status code value from a group and code number. */ -#define MAKE_STATUS(group, code) ((((group)*100) + (code))) - -/*! @brief Construct the version number for drivers. */ -#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix)) - -/*! @name Driver version */ -/*@{*/ -/*! @brief common driver version. */ -#define FSL_COMMON_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) -/*@}*/ - -/* Debug console type definition. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U /*!< Debug console based on UART. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART 2U /*!< Debug console based on LPUART. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI 3U /*!< Debug console based on LPSCI. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC 4U /*!< Debug console based on USBCDC. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM 5U /*!< Debug console based on FLEXCOMM. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_IUART 6U /*!< Debug console based on i.MX UART. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART 7U /*!< Debug console based on LPC_VUSART. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART 8U /*!< Debug console based on LPC_USART. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_SWO 9U /*!< Debug console based on SWO. */ -#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI 10U /*!< Debug console based on QSCI. */ - -/*! @brief Status group numbers. */ -enum _status_groups -{ - kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */ - kStatusGroup_FLASH = 1, /*!< Group number for FLASH status codes. */ - kStatusGroup_LPSPI = 4, /*!< Group number for LPSPI status codes. */ - kStatusGroup_FLEXIO_SPI = 5, /*!< Group number for FLEXIO SPI status codes. */ - kStatusGroup_DSPI = 6, /*!< Group number for DSPI status codes. */ - kStatusGroup_FLEXIO_UART = 7, /*!< Group number for FLEXIO UART status codes. */ - kStatusGroup_FLEXIO_I2C = 8, /*!< Group number for FLEXIO I2C status codes. */ - kStatusGroup_LPI2C = 9, /*!< Group number for LPI2C status codes. */ - kStatusGroup_UART = 10, /*!< Group number for UART status codes. */ - kStatusGroup_I2C = 11, /*!< Group number for UART status codes. */ - kStatusGroup_LPSCI = 12, /*!< Group number for LPSCI status codes. */ - kStatusGroup_LPUART = 13, /*!< Group number for LPUART status codes. */ - kStatusGroup_SPI = 14, /*!< Group number for SPI status code.*/ - kStatusGroup_XRDC = 15, /*!< Group number for XRDC status code.*/ - kStatusGroup_SEMA42 = 16, /*!< Group number for SEMA42 status code.*/ - kStatusGroup_SDHC = 17, /*!< Group number for SDHC status code */ - kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */ - kStatusGroup_SAI = 19, /*!< Group number for SAI status code */ - kStatusGroup_MCG = 20, /*!< Group number for MCG status codes. */ - kStatusGroup_SCG = 21, /*!< Group number for SCG status codes. */ - kStatusGroup_SDSPI = 22, /*!< Group number for SDSPI status codes. */ - kStatusGroup_FLEXIO_I2S = 23, /*!< Group number for FLEXIO I2S status codes */ - kStatusGroup_FLEXIO_MCULCD = 24, /*!< Group number for FLEXIO LCD status codes */ - kStatusGroup_FLASHIAP = 25, /*!< Group number for FLASHIAP status codes */ - kStatusGroup_FLEXCOMM_I2C = 26, /*!< Group number for FLEXCOMM I2C status codes */ - kStatusGroup_I2S = 27, /*!< Group number for I2S status codes */ - kStatusGroup_IUART = 28, /*!< Group number for IUART status codes */ - kStatusGroup_CSI = 29, /*!< Group number for CSI status codes */ - kStatusGroup_MIPI_DSI = 30, /*!< Group number for MIPI DSI status codes */ - kStatusGroup_SDRAMC = 35, /*!< Group number for SDRAMC status codes. */ - kStatusGroup_POWER = 39, /*!< Group number for POWER status codes. */ - kStatusGroup_ENET = 40, /*!< Group number for ENET status codes. */ - kStatusGroup_PHY = 41, /*!< Group number for PHY status codes. */ - kStatusGroup_TRGMUX = 42, /*!< Group number for TRGMUX status codes. */ - kStatusGroup_SMARTCARD = 43, /*!< Group number for SMARTCARD status codes. */ - kStatusGroup_LMEM = 44, /*!< Group number for LMEM status codes. */ - kStatusGroup_QSPI = 45, /*!< Group number for QSPI status codes. */ - kStatusGroup_DMA = 50, /*!< Group number for DMA status codes. */ - kStatusGroup_EDMA = 51, /*!< Group number for EDMA status codes. */ - kStatusGroup_DMAMGR = 52, /*!< Group number for DMAMGR status codes. */ - kStatusGroup_FLEXCAN = 53, /*!< Group number for FlexCAN status codes. */ - kStatusGroup_LTC = 54, /*!< Group number for LTC status codes. */ - kStatusGroup_FLEXIO_CAMERA = 55, /*!< Group number for FLEXIO CAMERA status codes. */ - kStatusGroup_LPC_SPI = 56, /*!< Group number for LPC_SPI status codes. */ - kStatusGroup_LPC_USART = 57, /*!< Group number for LPC_USART status codes. */ - kStatusGroup_DMIC = 58, /*!< Group number for DMIC status codes. */ - kStatusGroup_SDIF = 59, /*!< Group number for SDIF status codes.*/ - kStatusGroup_SPIFI = 60, /*!< Group number for SPIFI status codes. */ - kStatusGroup_OTP = 61, /*!< Group number for OTP status codes. */ - kStatusGroup_MCAN = 62, /*!< Group number for MCAN status codes. */ - kStatusGroup_CAAM = 63, /*!< Group number for CAAM status codes. */ - kStatusGroup_ECSPI = 64, /*!< Group number for ECSPI status codes. */ - kStatusGroup_USDHC = 65, /*!< Group number for USDHC status codes.*/ - kStatusGroup_LPC_I2C = 66, /*!< Group number for LPC_I2C status codes.*/ - kStatusGroup_DCP = 67, /*!< Group number for DCP status codes.*/ - kStatusGroup_MSCAN = 68, /*!< Group number for MSCAN status codes.*/ - kStatusGroup_ESAI = 69, /*!< Group number for ESAI status codes. */ - kStatusGroup_FLEXSPI = 70, /*!< Group number for FLEXSPI status codes. */ - kStatusGroup_MMDC = 71, /*!< Group number for MMDC status codes. */ - kStatusGroup_PDM = 72, /*!< Group number for MIC status codes. */ - kStatusGroup_SDMA = 73, /*!< Group number for SDMA status codes. */ - kStatusGroup_ICS = 74, /*!< Group number for ICS status codes. */ - kStatusGroup_SPDIF = 75, /*!< Group number for SPDIF status codes. */ - kStatusGroup_LPC_MINISPI = 76, /*!< Group number for LPC_MINISPI status codes. */ - kStatusGroup_HASHCRYPT = 77, /*!< Group number for Hashcrypt status codes */ - kStatusGroup_LPC_SPI_SSP = 78, /*!< Group number for LPC_SPI_SSP status codes. */ - kStatusGroup_I3C = 79, /*!< Group number for I3C status codes */ - kStatusGroup_LPC_I2C_1 = 97, /*!< Group number for LPC_I2C_1 status codes. */ - kStatusGroup_NOTIFIER = 98, /*!< Group number for NOTIFIER status codes. */ - kStatusGroup_DebugConsole = 99, /*!< Group number for debug console status codes. */ - kStatusGroup_SEMC = 100, /*!< Group number for SEMC status codes. */ - kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */ - kStatusGroup_IAP = 102, /*!< Group number for IAP status codes */ - kStatusGroup_SFA = 103, /*!< Group number for SFA status codes*/ - kStatusGroup_SPC = 104, /*!< Group number for SPC status codes. */ - kStatusGroup_PUF = 105, /*!< Group number for PUF status codes. */ - kStatusGroup_TOUCH_PANEL = 106, /*!< Group number for touch panel status codes */ - - kStatusGroup_HAL_GPIO = 121, /*!< Group number for HAL GPIO status codes. */ - kStatusGroup_HAL_UART = 122, /*!< Group number for HAL UART status codes. */ - kStatusGroup_HAL_TIMER = 123, /*!< Group number for HAL TIMER status codes. */ - kStatusGroup_HAL_SPI = 124, /*!< Group number for HAL SPI status codes. */ - kStatusGroup_HAL_I2C = 125, /*!< Group number for HAL I2C status codes. */ - kStatusGroup_HAL_FLASH = 126, /*!< Group number for HAL FLASH status codes. */ - kStatusGroup_HAL_PWM = 127, /*!< Group number for HAL PWM status codes. */ - kStatusGroup_HAL_RNG = 128, /*!< Group number for HAL RNG status codes. */ - kStatusGroup_TIMERMANAGER = 135, /*!< Group number for TiMER MANAGER status codes. */ - kStatusGroup_SERIALMANAGER = 136, /*!< Group number for SERIAL MANAGER status codes. */ - kStatusGroup_LED = 137, /*!< Group number for LED status codes. */ - kStatusGroup_BUTTON = 138, /*!< Group number for BUTTON status codes. */ - kStatusGroup_EXTERN_EEPROM = 139, /*!< Group number for EXTERN EEPROM status codes. */ - kStatusGroup_SHELL = 140, /*!< Group number for SHELL status codes. */ - kStatusGroup_MEM_MANAGER = 141, /*!< Group number for MEM MANAGER status codes. */ - kStatusGroup_LIST = 142, /*!< Group number for List status codes. */ - kStatusGroup_OSA = 143, /*!< Group number for OSA status codes. */ - kStatusGroup_COMMON_TASK = 144, /*!< Group number for Common task status codes. */ - kStatusGroup_MSG = 145, /*!< Group number for messaging status codes. */ - kStatusGroup_SDK_OCOTP = 146, /*!< Group number for OCOTP status codes. */ - kStatusGroup_SDK_FLEXSPINOR = 147, /*!< Group number for FLEXSPINOR status codes.*/ - kStatusGroup_CODEC = 148, /*!< Group number for codec status codes. */ - kStatusGroup_ASRC = 149, /*!< Group number for codec status ASRC. */ - kStatusGroup_OTFAD = 150, /*!< Group number for codec status codes. */ - kStatusGroup_SDIOSLV = 151, /*!< Group number for SDIOSLV status codes. */ - kStatusGroup_MECC = 152, /*!< Group number for MECC status codes. */ - kStatusGroup_ENET_QOS = 153, /*!< Group number for ENET_QOS status codes. */ - kStatusGroup_LOG = 154, /*!< Group number for LOG status codes. */ - kStatusGroup_I3CBUS = 155, /*!< Group number for I3CBUS status codes. */ - kStatusGroup_QSCI = 156, /*!< Group number for QSCI status codes. */ - kStatusGroup_SNT = 157, /*!< Group number for SNT status codes. */ -}; - -/*! \public - * @brief Generic status return codes. - */ -enum -{ - kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< Generic status for Success. */ - kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1), /*!< Generic status for Fail. */ - kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< Generic status for read only failure. */ - kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3), /*!< Generic status for out of range access. */ - kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< Generic status for invalid argument check. */ - kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5), /*!< Generic status for timeout. */ - kStatus_NoTransferInProgress = MAKE_STATUS(kStatusGroup_Generic, 6), /*!< Generic status for no transfer in progress. */ - kStatus_Busy = MAKE_STATUS(kStatusGroup_Generic, 7), /*!< Generic status for module is busy. */ -}; - -/*! @brief Type used for all status and error return values. */ -typedef int32_t status_t; - -/*! - * @name Min/max macros - * @{ - */ -#if !defined(MIN) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -#if !defined(MAX) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif -/* @} */ - -/*! @brief Computes the number of elements in an array. */ -#if !defined(ARRAY_SIZE) -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -#endif - -/*! @name UINT16_MAX/UINT32_MAX value */ -/* @{ */ -#if !defined(UINT16_MAX) -#define UINT16_MAX ((uint16_t)-1) -#endif - -#if !defined(UINT32_MAX) -#define UINT32_MAX ((uint32_t)-1) -#endif -/* @} */ - -/*! @name Suppress fallthrough warning macro */ -/* For switch case code block, if case section ends without "break;" statement, there wil be - fallthrough warning with compiler flag -Wextra or -Wimplicit-fallthrough=n when using armgcc. - To suppress this warning, "SUPPRESS_FALL_THROUGH_WARNING();" need to be added at the end of each - case section which misses "break;"statement. - */ -/* @{ */ -#if defined(__GNUC__) && !defined(__ARMCC_VERSION) -#define SUPPRESS_FALL_THROUGH_WARNING() __attribute__ ((fallthrough)) -#else -#define SUPPRESS_FALL_THROUGH_WARNING() -#endif -/* @} */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Allocate memory with given alignment and aligned size. - * - * This is provided to support the dynamically allocated memory - * used in cache-able region. - * @param size The length required to malloc. - * @param alignbytes The alignment size. - * @retval The allocated memory. - */ -void *SDK_Malloc(size_t size, size_t alignbytes); - -/*! - * @brief Free memory. - * - * @param ptr The memory to be release. - */ -void SDK_Free(void *ptr); - -/*! -* @brief Delay at least for some time. -* 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. -* -* @param delayTime_us Delay time in unit of microsecond. -* @param coreClock_Hz Core clock frequency with Hz. -*/ -void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz); - -#if defined(__cplusplus) -} -#endif - -/*! @} */ - -#if (defined(__DSC__) && defined(__CW__)) -#include "fsl_common_dsc.h" -#elif defined(__XCC__) -#include "fsl_common_dsp.h" -#else -#include "fsl_common_arm.h" -#endif - -#endif /* _FSL_COMMON_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_common_arm.c b/devices/MIMXRT1052/drivers/fsl_common_arm.c deleted file mode 100644 index e77a265..0000000 --- a/devices/MIMXRT1052/drivers/fsl_common_arm.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_common.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.common_arm" -#endif - -#ifndef __GIC_PRIO_BITS -#if defined(ENABLE_RAM_VECTOR_TABLE) -uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) -{ -#ifdef __VECTOR_TABLE -#undef __VECTOR_TABLE -#endif - -/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ -#if defined(__CC_ARM) || defined(__ARMCC_VERSION) - extern uint32_t Image$$VECTOR_ROM$$Base[]; - extern uint32_t Image$$VECTOR_RAM$$Base[]; - extern uint32_t Image$$RW_m_data$$Base[]; - -#define __VECTOR_TABLE Image$$VECTOR_ROM$$Base -#define __VECTOR_RAM Image$$VECTOR_RAM$$Base -#define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$RW_m_data$$Base - (uint32_t)Image$$VECTOR_RAM$$Base)) -#elif defined(__ICCARM__) - extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; - extern uint32_t __VECTOR_TABLE[]; - extern uint32_t __VECTOR_RAM[]; -#elif defined(__GNUC__) - extern uint32_t __VECTOR_TABLE[]; - extern uint32_t __VECTOR_RAM[]; - extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[]; - uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); -#endif /* defined(__CC_ARM) || defined(__ARMCC_VERSION) */ - uint32_t n; - uint32_t ret; - uint32_t irqMaskValue; - - irqMaskValue = DisableGlobalIRQ(); - if (SCB->VTOR != (uint32_t)__VECTOR_RAM) - { - /* Copy the vector table from ROM to RAM */ - for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++) - { - __VECTOR_RAM[n] = __VECTOR_TABLE[n]; - } - /* Point the VTOR to the position of vector table */ - SCB->VTOR = (uint32_t)__VECTOR_RAM; - } - - ret = __VECTOR_RAM[(int32_t)irq + 16]; - /* make sure the __VECTOR_RAM is noncachable */ - __VECTOR_RAM[(int32_t)irq + 16] = irqHandler; - - EnableGlobalIRQ(irqMaskValue); - - return ret; -} -#endif /* ENABLE_RAM_VECTOR_TABLE. */ -#endif /* __GIC_PRIO_BITS. */ - -#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) - -/* - * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value, - * powerlib should be used instead of these functions. - */ -#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0)) - -/* - * When the SYSCON STARTER registers are discontinuous, these functions are - * implemented in fsl_power.c. - */ -#if !(defined(FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) && FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) - -void EnableDeepSleepIRQ(IRQn_Type interrupt) -{ - uint32_t intNumber = (uint32_t)interrupt; - - uint32_t index = 0; - - while (intNumber >= 32u) - { - index++; - intNumber -= 32u; - } - - SYSCON->STARTERSET[index] = 1UL << intNumber; - (void)EnableIRQ(interrupt); /* also enable interrupt at NVIC */ -} - -void DisableDeepSleepIRQ(IRQn_Type interrupt) -{ - uint32_t intNumber = (uint32_t)interrupt; - - (void)DisableIRQ(interrupt); /* also disable interrupt at NVIC */ - uint32_t index = 0; - - while (intNumber >= 32u) - { - index++; - intNumber -= 32u; - } - - SYSCON->STARTERCLR[index] = 1UL << intNumber; -} -#endif /* FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS */ -#endif /* FSL_FEATURE_POWERLIB_EXTEND */ -#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */ - -#if defined(SDK_DELAY_USE_DWT) && defined(DWT) -/* Use WDT. */ -static void enableCpuCycleCounter(void) -{ - /* Make sure the DWT trace fucntion is enabled. */ - if (CoreDebug_DEMCR_TRCENA_Msk != (CoreDebug_DEMCR_TRCENA_Msk & CoreDebug->DEMCR)) - { - CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; - } - - /* CYCCNT not supported on this device. */ - assert(DWT_CTRL_NOCYCCNT_Msk != (DWT->CTRL & DWT_CTRL_NOCYCCNT_Msk)); - - /* Read CYCCNT directly if CYCCENT has already been enabled, otherwise enable CYCCENT first. */ - if (DWT_CTRL_CYCCNTENA_Msk != (DWT_CTRL_CYCCNTENA_Msk & DWT->CTRL)) - { - DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; - } -} - -static uint32_t getCpuCycleCount(void) -{ - return DWT->CYCCNT; -} -#else /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */ -/* Use software loop. */ -#if defined(__CC_ARM) /* This macro is arm v5 specific */ -/* clang-format off */ -__ASM static void DelayLoop(uint32_t count) -{ -loop - SUBS R0, R0, #1 - CMP R0, #0 - BNE loop - BX LR -} -/* clang-format on */ -#elif defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__) -/* Cortex-M0 has a smaller instruction set, SUBS isn't supported in thumb-16 mode reported from __GNUC__ compiler, - * use SUB and CMP here for compatibility */ -static void DelayLoop(uint32_t count) -{ - __ASM volatile(" MOV R0, %0" : : "r"(count)); - __ASM volatile( - "loop: \n" -#if defined(__GNUC__) && !defined(__ARMCC_VERSION) - " SUB R0, R0, #1 \n" -#else - " SUBS R0, R0, #1 \n" -#endif - " CMP R0, #0 \n" - - " BNE loop \n" - : - : - : "r0"); -} -#endif /* defined(__CC_ARM) */ -#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */ - -/*! - * @brief Delay at least for some time. - * Please note that, if not uses DWT, this API will use while loop for delay, different run-time environments have - * effect on the delay time. If precise delay is needed, please enable DWT delay. The two parmeters delayTime_us and - * coreClock_Hz have limitation. For example, in the platform with 1GHz coreClock_Hz, the delayTime_us only supports - * up to 4294967 in current code. If long time delay is needed, please implement a new delay function. - * - * @param delayTime_us Delay time in unit of microsecond. - * @param coreClock_Hz Core clock frequency with Hz. - */ -void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz) -{ - uint64_t count; - - if (delayTime_us > 0U) - { - count = USEC_TO_COUNT(delayTime_us, coreClock_Hz); - - assert(count <= UINT32_MAX); - -#if defined(SDK_DELAY_USE_DWT) && defined(DWT) /* Use DWT for better accuracy */ - - enableCpuCycleCounter(); - /* Calculate the count ticks. */ - count += getCpuCycleCount(); - - if (count > UINT32_MAX) - { - count -= UINT32_MAX; - /* Wait for cyccnt overflow. */ - while (count < getCpuCycleCount()) - { - } - } - - /* Wait for cyccnt reach count value. */ - while (count > getCpuCycleCount()) - { - } -#else - /* Divide value may be different in various environment to ensure delay is precise. - * Every loop count includes three instructions, due to Cortex-M7 sometimes executes - * two instructions in one period, through test here set divide 1.5. Other M cores use - * divide 4. By the way, divide 1.5 or 4 could let the count lose precision, but it does - * not matter because other instructions outside while loop is enough to fill the time. - */ -#if (__CORTEX_M == 7) - count = count / 3U * 2U; -#else - count = count / 4U; -#endif - DelayLoop((uint32_t)count); -#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */ - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_common_arm.h b/devices/MIMXRT1052/drivers/fsl_common_arm.h deleted file mode 100644 index 8b28aa8..0000000 --- a/devices/MIMXRT1052/drivers/fsl_common_arm.h +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_COMMON_ARM_H_ -#define _FSL_COMMON_ARM_H_ - -/* - * For CMSIS pack RTE. - * CMSIS pack RTE generates "RTC_Components.h" which contains the statements - * of the related element for all selected software components. - */ -#ifdef _RTE_ -#include "RTE_Components.h" -#endif - -/*! - * @addtogroup ksdk_common - * @{ - */ - -/*! @name Atomic modification - * - * These macros are used for atomic access, such as read-modify-write - * to the peripheral registers. - * - * - SDK_ATOMIC_LOCAL_ADD - * - SDK_ATOMIC_LOCAL_SET - * - SDK_ATOMIC_LOCAL_CLEAR - * - SDK_ATOMIC_LOCAL_TOGGLE - * - SDK_ATOMIC_LOCAL_CLEAR_AND_SET - * - * Take SDK_ATOMIC_LOCAL_CLEAR_AND_SET as an example: the parameter @c addr - * means the address of the peripheral register or variable you want to modify - * atomically, the parameter @c clearBits is the bits to clear, the parameter - * @c setBits it the bits to set. - * For example, to set a 32-bit register bit1:bit0 to 0b10, use like this: - * - * @code - volatile uint32_t * reg = (volatile uint32_t *)REG_ADDR; - - SDK_ATOMIC_LOCAL_CLEAR_AND_SET(reg, 0x03, 0x02); - @endcode - * - * In this example, the register bit1:bit0 are cleared and bit1 is set, as a result, - * register bit1:bit0 = 0b10. - * - * @note For the platforms don't support exclusive load and store, these macros - * disable the global interrupt to pretect the modification. - * - * @note These macros only guarantee the local processor atomic operations. For - * the multi-processor devices, use hardware semaphore such as SEMA42 to - * guarantee exclusive access if necessary. - * - * @{ - */ - -/* clang-format off */ -#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))) -/* clang-format on */ - -/* If the LDREX and STREX are supported, use them. */ -#define _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, val, ops) \ - do \ - { \ - (val) = __LDREXB(addr); \ - (ops); \ - } while (0UL != __STREXB((val), (addr))) - -#define _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, val, ops) \ - do \ - { \ - (val) = __LDREXH(addr); \ - (ops); \ - } while (0UL != __STREXH((val), (addr))) - -#define _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, val, ops) \ - do \ - { \ - (val) = __LDREXW(addr); \ - (ops); \ - } while (0UL != __STREXW((val), (addr))) - -static inline void _SDK_AtomicLocalAdd1Byte(volatile uint8_t *addr, uint8_t val) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val += val); -} - -static inline void _SDK_AtomicLocalAdd2Byte(volatile uint16_t *addr, uint16_t val) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val += val); -} - -static inline void _SDK_AtomicLocalAdd4Byte(volatile uint32_t *addr, uint32_t val) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val += val); -} - -static inline void _SDK_AtomicLocalSub1Byte(volatile uint8_t *addr, uint8_t val) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val -= val); -} - -static inline void _SDK_AtomicLocalSub2Byte(volatile uint16_t *addr, uint16_t val) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val -= val); -} - -static inline void _SDK_AtomicLocalSub4Byte(volatile uint32_t *addr, uint32_t val) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val -= val); -} - -static inline void _SDK_AtomicLocalSet1Byte(volatile uint8_t *addr, uint8_t bits) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val |= bits); -} - -static inline void _SDK_AtomicLocalSet2Byte(volatile uint16_t *addr, uint16_t bits) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val |= bits); -} - -static inline void _SDK_AtomicLocalSet4Byte(volatile uint32_t *addr, uint32_t bits) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val |= bits); -} - -static inline void _SDK_AtomicLocalClear1Byte(volatile uint8_t *addr, uint8_t bits) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val &= ~bits); -} - -static inline void _SDK_AtomicLocalClear2Byte(volatile uint16_t *addr, uint16_t bits) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val &= ~bits); -} - -static inline void _SDK_AtomicLocalClear4Byte(volatile uint32_t *addr, uint32_t bits) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val &= ~bits); -} - -static inline void _SDK_AtomicLocalToggle1Byte(volatile uint8_t *addr, uint8_t bits) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val ^= bits); -} - -static inline void _SDK_AtomicLocalToggle2Byte(volatile uint16_t *addr, uint16_t bits) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val ^= bits); -} - -static inline void _SDK_AtomicLocalToggle4Byte(volatile uint32_t *addr, uint32_t bits) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val ^= bits); -} - -static inline void _SDK_AtomicLocalClearAndSet1Byte(volatile uint8_t *addr, uint8_t clearBits, uint8_t setBits) -{ - uint8_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); -} - -static inline void _SDK_AtomicLocalClearAndSet2Byte(volatile uint16_t *addr, uint16_t clearBits, uint16_t setBits) -{ - uint16_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); -} - -static inline void _SDK_AtomicLocalClearAndSet4Byte(volatile uint32_t *addr, uint32_t clearBits, uint32_t setBits) -{ - uint32_t s_val; - - _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); -} - -#define SDK_ATOMIC_LOCAL_ADD(addr, val) \ - ((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd1Byte((volatile uint8_t*)(volatile void*)(addr), (val)) : \ - ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd2Byte((volatile uint16_t*)(volatile void*)(addr), (val)) : \ - _SDK_AtomicLocalAdd4Byte((volatile uint32_t *)(volatile void*)(addr), (val)))) - -#define SDK_ATOMIC_LOCAL_SET(addr, bits) \ - ((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \ - ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \ - _SDK_AtomicLocalSet4Byte((volatile uint32_t *)(volatile void*)(addr), (bits)))) - -#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \ - ((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalClear1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \ - ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalClear2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \ - _SDK_AtomicLocalClear4Byte((volatile uint32_t *)(volatile void*)(addr), (bits)))) - -#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \ - ((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalToggle1Byte((volatile uint8_t*)(volatile void*)(addr), (bits)) : \ - ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalToggle2Byte((volatile uint16_t*)(volatile void*)(addr), (bits)) : \ - _SDK_AtomicLocalToggle4Byte((volatile uint32_t *)(volatile void*)(addr), (bits)))) - -#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \ - ((1UL == sizeof(*(addr))) ? _SDK_AtomicLocalClearAndSet1Byte((volatile uint8_t*)(volatile void*)(addr), (clearBits), (setBits)) : \ - ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalClearAndSet2Byte((volatile uint16_t*)(volatile void*)(addr), (clearBits), (setBits)) : \ - _SDK_AtomicLocalClearAndSet4Byte((volatile uint32_t *)(volatile void*)(addr), (clearBits), (setBits)))) -#else - -#define SDK_ATOMIC_LOCAL_ADD(addr, val) \ - do { \ - uint32_t s_atomicOldInt; \ - s_atomicOldInt = DisableGlobalIRQ(); \ - *(addr) += (val); \ - EnableGlobalIRQ(s_atomicOldInt); \ - } while (0) - -#define SDK_ATOMIC_LOCAL_SET(addr, bits) \ - do { \ - uint32_t s_atomicOldInt; \ - s_atomicOldInt = DisableGlobalIRQ(); \ - *(addr) |= (bits); \ - EnableGlobalIRQ(s_atomicOldInt); \ - } while (0) - -#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \ - do { \ - uint32_t s_atomicOldInt; \ - s_atomicOldInt = DisableGlobalIRQ(); \ - *(addr) &= ~(bits); \ - EnableGlobalIRQ(s_atomicOldInt); \ - } while (0) - -#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \ - do { \ - uint32_t s_atomicOldInt; \ - s_atomicOldInt = DisableGlobalIRQ(); \ - *(addr) ^= (bits); \ - EnableGlobalIRQ(s_atomicOldInt); \ - } while (0) - -#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \ - do { \ - uint32_t s_atomicOldInt; \ - s_atomicOldInt = DisableGlobalIRQ(); \ - *(addr) = (*(addr) & ~(clearBits)) | (setBits); \ - EnableGlobalIRQ(s_atomicOldInt); \ - } while (0) - -#endif -/* @} */ - -/*! @name Timer utilities */ -/* @{ */ -/*! Macro to convert a microsecond period to raw count value */ -#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U) -/*! Macro to convert a raw count value to microsecond */ -#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count) * 1000000U / (clockFreqInHz)) - -/*! Macro to convert a millisecond period to raw count value */ -#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)(ms) * (clockFreqInHz) / 1000U) -/*! Macro to convert a raw count value to millisecond */ -#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count) * 1000U / (clockFreqInHz)) -/* @} */ - -/*! @name ISR exit barrier - * @{ - * - * ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping - * exception return operation might vector to incorrect interrupt. - * For Cortex-M7, if core speed much faster than peripheral register write speed, - * the peripheral interrupt flags may be still set after exiting ISR, this results to - * the same error similar with errata 83869. - */ -#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U)) -#define SDK_ISR_EXIT_BARRIER __DSB() -#else -#define SDK_ISR_EXIT_BARRIER -#endif - -/* @} */ - -/*! @name Alignment variable definition macros */ -/* @{ */ -#if (defined(__ICCARM__)) -/* - * Workaround to disable MISRA C message suppress warnings for IAR compiler. - * http:/ /supp.iar.com/Support/?note=24725 - */ -_Pragma("diag_suppress=Pm120") -#define SDK_PRAGMA(x) _Pragma(#x) -_Pragma("diag_error=Pm120") -/*! Macro to define a variable with alignbytes alignment */ -#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var -#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) -/*! Macro to define a variable with alignbytes alignment */ -#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var -#elif defined(__GNUC__) -/*! Macro to define a variable with alignbytes alignment */ -#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes))) -#else -#error Toolchain not supported -#endif - -/*! Macro to define a variable with L1 d-cache line size alignment */ -#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) -#define SDK_L1DCACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) -#endif -/*! Macro to define a variable with L2 cache line size alignment */ -#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) -#define SDK_L2CACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L2CACHE_LINESIZE_BYTE) -#endif - -/*! Macro to change a value to a given size aligned value */ -#define SDK_SIZEALIGN(var, alignbytes) \ - ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U))) -/* @} */ - -/*! @name Non-cacheable region definition macros */ -/* For initialized non-zero non-cacheable variables, please using "AT_NONCACHEABLE_SECTION_INIT(var) ={xx};" or - * "AT_NONCACHEABLE_SECTION_ALIGN_INIT(var) ={xx};" in your projects to define them, for zero-inited non-cacheable variables, - * please using "AT_NONCACHEABLE_SECTION(var);" or "AT_NONCACHEABLE_SECTION_ALIGN(var);" to define them, these zero-inited variables - * will be initialized to zero in system startup. - */ -/* @{ */ - -#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE)) - -#if (defined(__ICCARM__)) -#define AT_NONCACHEABLE_SECTION(var) var @"NonCacheable" -#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable" -#define AT_NONCACHEABLE_SECTION_INIT(var) var @"NonCacheable.init" -#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable.init" - -#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) -#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var -#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ - __attribute__((section("NonCacheable.init"))) __attribute__((aligned(alignbytes))) var -#if(defined(__CC_ARM)) -#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"), zero_init)) var -#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ - __attribute__((section("NonCacheable"), zero_init)) __attribute__((aligned(alignbytes))) var -#else -#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(".bss.NonCacheable"))) var -#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ - __attribute__((section(".bss.NonCacheable"))) __attribute__((aligned(alignbytes))) var -#endif - -#elif(defined(__GNUC__)) -/* For GCC, when the non-cacheable section is required, please define "__STARTUP_INITIALIZE_NONCACHEDATA" - * in your projects to make sure the non-cacheable section variables will be initialized in system startup. - */ -#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var -#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ - __attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes))) -#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var -#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ - __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var __attribute__((aligned(alignbytes))) -#else -#error Toolchain not supported. -#endif - -#else - -#define AT_NONCACHEABLE_SECTION(var) var -#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_ALIGN(var, alignbytes) -#define AT_NONCACHEABLE_SECTION_INIT(var) var -#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_ALIGN(var, alignbytes) - -#endif - -/* @} */ - -/*! - * @name Time sensitive region - * @{ - */ -#if (defined(FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE) && FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE) - -#if (defined(__ICCARM__)) -#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess" -#define AT_QUICKACCESS_SECTION_DATA(func) func @"DataQuickAccess" -#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) -#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func -#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func -#elif(defined(__GNUC__)) -#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func -#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func -#else -#error Toolchain not supported. -#endif /* defined(__ICCARM__) */ - -#else /* __FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE */ - -#define AT_QUICKACCESS_SECTION_CODE(func) func -#define AT_QUICKACCESS_SECTION_DATA(func) func - -#endif /* __FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE */ -/* @} */ - -/*! @name Ram Function */ -#if (defined(__ICCARM__)) -#define RAMFUNCTION_SECTION_CODE(func) func @"RamFunction" -#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) -#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func -#elif(defined(__GNUC__)) -#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func -#else -#error Toolchain not supported. -#endif /* defined(__ICCARM__) */ -/* @} */ - -#if defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) -void DefaultISR(void); -#endif - -/* - * The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t - * defined in previous of this file. - */ -#include "fsl_clock.h" - -/* - * Chip level peripheral reset API, for MCUs that implement peripheral reset control external to a peripheral - */ -#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \ - (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0))) -#include "fsl_reset.h" -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus*/ - -/*! - * @brief Enable specific interrupt. - * - * Enable LEVEL1 interrupt. For some devices, there might be multiple interrupt - * levels. For example, there are NVIC and intmux. Here the interrupts connected - * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. - * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed - * to NVIC first then routed to core. - * - * This function only enables the LEVEL1 interrupts. The number of LEVEL1 interrupts - * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. - * - * @param interrupt The IRQ number. - * @retval kStatus_Success Interrupt enabled successfully - * @retval kStatus_Fail Failed to enable the interrupt - */ -static inline status_t EnableIRQ(IRQn_Type interrupt) -{ - status_t status = kStatus_Success; - - if (NotAvail_IRQn == interrupt) - { - status = kStatus_Fail; - } - -#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) - else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) - { - status = kStatus_Fail; - } -#endif - - else - { -#if defined(__GIC_PRIO_BITS) - GIC_EnableIRQ(interrupt); -#else - NVIC_EnableIRQ(interrupt); -#endif - } - - return status; -} - -/*! - * @brief Disable specific interrupt. - * - * Disable LEVEL1 interrupt. For some devices, there might be multiple interrupt - * levels. For example, there are NVIC and intmux. Here the interrupts connected - * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. - * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed - * to NVIC first then routed to core. - * - * This function only disables the LEVEL1 interrupts. The number of LEVEL1 interrupts - * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. - * - * @param interrupt The IRQ number. - * @retval kStatus_Success Interrupt disabled successfully - * @retval kStatus_Fail Failed to disable the interrupt - */ -static inline status_t DisableIRQ(IRQn_Type interrupt) -{ - status_t status = kStatus_Success; - - if (NotAvail_IRQn == interrupt) - { - status = kStatus_Fail; - } - -#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) - else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) - { - status = kStatus_Fail; - } -#endif - - else - { -#if defined(__GIC_PRIO_BITS) - GIC_DisableIRQ(interrupt); -#else - NVIC_DisableIRQ(interrupt); -#endif - } - - return status; -} - -/*! - * @brief Disable the global IRQ - * - * Disable the global interrupt and return the current primask register. User is required to provided the primask - * register for the EnableGlobalIRQ(). - * - * @return Current primask value. - */ -static inline uint32_t DisableGlobalIRQ(void) -{ -#if defined(CPSR_I_Msk) - uint32_t cpsr = __get_CPSR() & CPSR_I_Msk; - - __disable_irq(); - - return cpsr; -#else - uint32_t regPrimask = __get_PRIMASK(); - - __disable_irq(); - - return regPrimask; -#endif -} - -/*! - * @brief Enable the global IRQ - * - * Set the primask register with the provided primask value but not just enable the primask. The idea is for the - * convenience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to - * use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair. - * - * @param primask value of primask register to be restored. The primask value is supposed to be provided by the - * DisableGlobalIRQ(). - */ -static inline void EnableGlobalIRQ(uint32_t primask) -{ -#if defined(CPSR_I_Msk) - __set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask); -#else - __set_PRIMASK(primask); -#endif -} - -#if defined(ENABLE_RAM_VECTOR_TABLE) -/*! - * @brief install IRQ handler - * - * @param irq IRQ number - * @param irqHandler IRQ handler address - * @return The old IRQ handler address - */ -uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler); -#endif /* ENABLE_RAM_VECTOR_TABLE. */ - -#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) - -/* - * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value, - * powerlib should be used instead of these functions. - */ -#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0)) -/*! - * @brief Enable specific interrupt for wake-up from deep-sleep mode. - * - * Enable the interrupt for wake-up from deep sleep mode. - * Some interrupts are typically used in sleep mode only and will not occur during - * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable - * those clocks (significantly increasing power consumption in the reduced power mode), - * making these wake-ups possible. - * - * @note This function also enables the interrupt in the NVIC (EnableIRQ() is called internaly). - * - * @param interrupt The IRQ number. - */ -void EnableDeepSleepIRQ(IRQn_Type interrupt); - -/*! - * @brief Disable specific interrupt for wake-up from deep-sleep mode. - * - * Disable the interrupt for wake-up from deep sleep mode. - * Some interrupts are typically used in sleep mode only and will not occur during - * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable - * those clocks (significantly increasing power consumption in the reduced power mode), - * making these wake-ups possible. - * - * @note This function also disables the interrupt in the NVIC (DisableIRQ() is called internaly). - * - * @param interrupt The IRQ number. - */ -void DisableDeepSleepIRQ(IRQn_Type interrupt); -#endif /* FSL_FEATURE_POWERLIB_EXTEND */ -#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus*/ - -/*! @} */ - -#endif /* _FSL_COMMON_ARM_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_csi.c b/devices/MIMXRT1052/drivers/fsl_csi.c deleted file mode 100644 index 2d99901..0000000 --- a/devices/MIMXRT1052/drivers/fsl_csi.c +++ /dev/null @@ -1,1417 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_csi.h" -#if CSI_DRIVER_FRAG_MODE -#include "fsl_cache.h" -#endif - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#include "fsl_memory.h" -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/* Macro remap. */ -#if (!defined(CSI_CSICR3_TWO_8BIT_SENSOR_MASK) && defined(CSI_CR3_SENSOR_16BITS_MASK)) -#define CSI_CSICR3_TWO_8BIT_SENSOR_MASK CSI_CR3_SENSOR_16BITS_MASK -#endif - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.csi" -#endif - -/* Two frame buffer loaded to CSI register at most. */ -#define CSI_MAX_ACTIVE_FRAME_NUM 2U - -/* CSI driver only support RGB565 and YUV422 in fragment mode, 2 bytes per pixel. */ -#define CSI_FRAG_INPUT_BYTES_PER_PIXEL 2U - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#define CSI_ADDR_CPU_2_IP(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_Local2DMA)) -#define CSI_ADDR_IP_2_CPU(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_DMA2Local)) -#else -#define CSI_ADDR_CPU_2_IP(addr) (addr) -#define CSI_ADDR_IP_2_CPU(addr) (addr) -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - -/*! - * @brief Used for conversion between `void*` and `uint32_t`. - */ -typedef union pvoid_to_u32 -{ - void *pvoid; - uint32_t u32; -} pvoid_to_u32_t; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get the instance from the base address - * - * @param base CSI peripheral base address - * - * @return The CSI module instance - */ -static uint32_t CSI_GetInstance(CSI_Type *base); - -#if !CSI_DRIVER_FRAG_MODE -/*! - * @brief Get the delta value of two index in queue. - * - * @param startIdx Start index. - * @param endIdx End index. - * - * @return The delta between startIdx and endIdx in queue. - */ -static uint8_t CSI_TransferGetQueueDelta(uint8_t startIdx, uint8_t endIdx); - -/*! - * @brief Increase a index value in queue. - * - * This function increases the index value in the queue, if the index is out of - * the queue range, it is reset to 0. - * - * @param idx The index value to increase. - * - * @return The index value after increase. - */ -static uint8_t CSI_TransferIncreaseQueueIdx(uint8_t idx); - -/*! - * @brief Get the empty frame buffer count in queue. - * - * @param base CSI peripheral base address - * @param handle Pointer to CSI driver handle. - * - * @return Number of the empty frame buffer count in queue. - */ -static uint32_t CSI_TransferGetEmptyBufferCount(csi_handle_t *handle); - -/*! - * @brief Get the empty frame buffer. - * - * This function should only be called when frame buffer count larger than 0. - * - * @param handle Pointer to CSI driver handle. - * - * @return Empty buffer - */ -static uint32_t CSI_TransferGetEmptyBuffer(csi_handle_t *handle); - -/*! - * @brief Put the empty frame buffer. - * - * @param handle Pointer to CSI driver handle. - * @param buffer The empty buffer to put. - */ -static void CSI_TransferPutEmptyBuffer(csi_handle_t *handle, uint32_t buffer); - -/*! - * @brief Get the RX frame buffer address. - * - * @param base CSI peripheral base address. - * @param index Buffer index. - * @return Frame buffer address. - */ -static uint32_t CSI_GetRxBufferAddr(CSI_Type *base, uint8_t index); - -/* Typedef for interrupt handler. */ -typedef void (*csi_isr_t)(CSI_Type *base, csi_handle_t *handle); - -#else - -/* Typedef for interrupt handler to work in fragment mode. */ -typedef void (*csi_isr_t)(CSI_Type *base, csi_frag_handle_t *handle); -#endif /* CSI_DRIVER_FRAG_MODE */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to CSI bases for each instance. */ -static CSI_Type *const s_csiBases[] = CSI_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to CSI clocks for each CSI submodule. */ -static const clock_ip_name_t s_csiClocks[] = CSI_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/* Array for the CSI driver handle. */ -#if !CSI_DRIVER_FRAG_MODE -static csi_handle_t *s_csiHandle[ARRAY_SIZE(s_csiBases)]; -#else -static csi_frag_handle_t *s_csiHandle[ARRAY_SIZE(s_csiBases)]; -#endif - -/* Array of CSI IRQ number. */ -static const IRQn_Type s_csiIRQ[] = CSI_IRQS; - -/* CSI ISR for transactional APIs. */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -static csi_isr_t s_csiIsr = (csi_isr_t)DefaultISR; -#else -static csi_isr_t s_csiIsr; -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t CSI_GetInstance(CSI_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_csiBases); instance++) - { - if (s_csiBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_csiBases)); - - return instance; -} - -#if !CSI_DRIVER_FRAG_MODE -static uint8_t CSI_TransferGetQueueDelta(uint8_t startIdx, uint8_t endIdx) -{ - uint8_t ret; - - if (endIdx >= startIdx) - { - ret = endIdx - startIdx; - } - else - { - ret = (uint8_t)(endIdx + CSI_DRIVER_ACTUAL_QUEUE_SIZE - startIdx); - } - - return ret; -} - -static uint8_t CSI_TransferIncreaseQueueIdx(uint8_t idx) -{ - uint8_t ret; - - /* - * Here not use the method: - * ret = (idx+1) % CSI_DRIVER_ACTUAL_QUEUE_SIZE; - * - * Because the mod function might be slow. - */ - - ret = idx + 1U; - - if (ret >= CSI_DRIVER_ACTUAL_QUEUE_SIZE) - { - ret = 0U; - } - - return ret; -} - -static uint32_t CSI_TransferGetEmptyBufferCount(csi_handle_t *handle) -{ - return handle->emptyBufferCnt; -} - -static uint32_t CSI_TransferGetEmptyBuffer(csi_handle_t *handle) -{ - pvoid_to_u32_t buf; - - buf.pvoid = handle->emptyBuffer; - handle->emptyBufferCnt--; - handle->emptyBuffer = *(void **)(buf.pvoid); - - return buf.u32; -} - -static void CSI_TransferPutEmptyBuffer(csi_handle_t *handle, uint32_t buffer) -{ - pvoid_to_u32_t buf; - buf.u32 = buffer; - - *(void **)(buf.pvoid) = handle->emptyBuffer; - handle->emptyBuffer = buf.pvoid; - handle->emptyBufferCnt++; -} - -static uint32_t CSI_GetRxBufferAddr(CSI_Type *base, uint8_t index) -{ - uint32_t addr; - - if (index != 0U) - { - addr = CSI_REG_DMASA_FB2(base); - } - else - { - addr = CSI_REG_DMASA_FB1(base); - } - - return CSI_ADDR_IP_2_CPU(addr); -} - -#endif /* CSI_DRIVER_FRAG_MODE */ - -/*! - * brief Initialize the CSI. - * - * This function enables the CSI peripheral clock, and resets the CSI registers. - * - * param base CSI peripheral base address. - * param config Pointer to the configuration structure. - * - * retval kStatus_Success Initialize successfully. - * retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_Init(CSI_Type *base, const csi_config_t *config) -{ - assert(NULL != config); - uint32_t reg; - uint32_t imgWidth_Bytes; - uint8_t busCyclePerPixel; - - imgWidth_Bytes = (uint32_t)config->width * (uint32_t)config->bytesPerPixel; - - /* The image width and frame buffer pitch should be multiple of 8-bytes. */ - if ((0U != (imgWidth_Bytes & 0x07U)) || (0U != ((uint32_t)config->linePitch_Bytes & 0x07U))) - { - return kStatus_InvalidArgument; - } - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = CSI_GetInstance(base); - CLOCK_EnableClock(s_csiClocks[instance]); -#endif - - CSI_Reset(base); - - /* Configure CSICR1. CSICR1 has been reset to the default value, so could write it directly. */ - reg = ((uint32_t)config->workMode) | config->polarityFlags | CSI_CSICR1_FCC_MASK; - - if (config->useExtVsync) - { - reg |= CSI_CSICR1_EXT_VSYNC_MASK; - } - - CSI_REG_CR1(base) = reg; - - /* - * Generally, CSIIMAG_PARA[IMAGE_WIDTH] indicates how many data bus cycles per line. - * One special case is when receiving 24-bit pixels through 8-bit data bus. - * In this case, the CSIIMAG_PARA[IMAGE_WIDTH] should be set to the pixel number per line. - */ - if ((kCSI_DataBus8Bit == config->dataBus) && (2U == config->bytesPerPixel)) - { - busCyclePerPixel = 2U; - } - else - { - busCyclePerPixel = 1U; - } - - if (4U == config->bytesPerPixel) - { - CSI_REG_CR18(base) |= CSI_CSICR18_PARALLEL24_EN_MASK; - } - - if (kCSI_DataBus16Bit == config->dataBus) - { - CSI_REG_CR3(base) |= CSI_CSICR3_TWO_8BIT_SENSOR_MASK; - } - - /* Image parameter. */ - CSI_REG_IMAG_PARA(base) = - (((uint32_t)config->width * (uint32_t)busCyclePerPixel) << CSI_CSIIMAG_PARA_IMAGE_WIDTH_SHIFT) | - ((uint32_t)(config->height) << CSI_CSIIMAG_PARA_IMAGE_HEIGHT_SHIFT); - - /* The CSI frame buffer bus is 8-byte width. */ - CSI_REG_FBUF_PARA(base) = (uint32_t)((config->linePitch_Bytes - imgWidth_Bytes) / 8U) - << CSI_CSIFBUF_PARA_FBUF_STRIDE_SHIFT; - - /* Enable auto ECC. */ - CSI_REG_CR3(base) |= CSI_CSICR3_ECC_AUTO_EN_MASK; - - /* - * For better performance. - * The DMA burst size could be set to 16 * 8 byte, 8 * 8 byte, or 4 * 8 byte, - * choose the best burst size based on bytes per line. - */ - if (0U == (imgWidth_Bytes % (8U * 16U))) - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(3U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((2U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - else if (0U == (imgWidth_Bytes % (8U * 8U))) - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(2U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((1U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - else - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(1U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((0U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - - CSI_ReflashFifoDma(base, kCSI_RxFifo); - - return kStatus_Success; -} - -/*! - * brief De-initialize the CSI. - * - * This function disables the CSI peripheral clock. - * - * param base CSI peripheral base address. - */ -void CSI_Deinit(CSI_Type *base) -{ - /* Disable transfer first. */ - CSI_Stop(base); -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = CSI_GetInstance(base); - CLOCK_DisableClock(s_csiClocks[instance]); -#endif -} - -/*! - * brief Reset the CSI. - * - * This function resets the CSI peripheral registers to default status. - * - * param base CSI peripheral base address. - */ -void CSI_Reset(CSI_Type *base) -{ - uint32_t csisr; - - /* Disable transfer first. */ - CSI_Stop(base); - - /* Disable DMA request. */ - CSI_REG_CR3(base) = 0U; - - /* Reset the fame count. */ - CSI_REG_CR3(base) |= CSI_CSICR3_FRMCNT_RST_MASK; - while (0U != (CSI_REG_CR3(base) & CSI_CSICR3_FRMCNT_RST_MASK)) - { - } - - /* Clear the RX FIFO. */ - CSI_ClearFifo(base, kCSI_AllFifo); - - /* Reflash DMA. */ - CSI_ReflashFifoDma(base, kCSI_AllFifo); - - /* Clear the status. */ - csisr = CSI_REG_SR(base); - CSI_REG_SR(base) = csisr; - - /* Set the control registers to default value. */ - CSI_REG_CR1(base) = CSI_CSICR1_HSYNC_POL_MASK | CSI_CSICR1_EXT_VSYNC_MASK; - CSI_REG_CR2(base) = 0U; - CSI_REG_CR3(base) = 0U; -#if defined(CSI_CSICR18_CSI_LCDIF_BUFFER_LINES) - CSI_REG_CR18(base) = CSI_CSICR18_AHB_HPROT(0x0DU) | CSI_CSICR18_CSI_LCDIF_BUFFER_LINES(0x02U); -#else - CSI_REG_CR18(base) = CSI_CSICR18_AHB_HPROT(0x0DU); -#endif - CSI_REG_FBUF_PARA(base) = 0U; - CSI_REG_IMAG_PARA(base) = 0U; -} - -/*! - * brief Get the default configuration for to initialize the CSI. - * - * The default configuration value is: - * - * code - config->width = 320U; - config->height = 240U; - config->polarityFlags = kCSI_HsyncActiveHigh | kCSI_DataLatchOnRisingEdge; - config->bytesPerPixel = 2U; - config->linePitch_Bytes = 320U * 2U; - config->workMode = kCSI_GatedClockMode; - config->dataBus = kCSI_DataBus8Bit; - config->useExtVsync = true; - endcode - * - * param config Pointer to the CSI configuration. - */ -void CSI_GetDefaultConfig(csi_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->width = 320U; - config->height = 240U; - config->polarityFlags = (uint32_t)kCSI_HsyncActiveHigh | (uint32_t)kCSI_DataLatchOnRisingEdge; - config->bytesPerPixel = 2U; - config->linePitch_Bytes = 320U * 2U; - config->workMode = kCSI_GatedClockMode; - config->dataBus = kCSI_DataBus8Bit; - config->useExtVsync = true; -} - -/*! - * brief Set the RX frame buffer address. - * - * param base CSI peripheral base address. - * param index Buffer index. - * param addr Frame buffer address to set. - */ -void CSI_SetRxBufferAddr(CSI_Type *base, uint8_t index, uint32_t addr) -{ - addr = CSI_ADDR_CPU_2_IP(addr); - - if (0U != index) - { - CSI_REG_DMASA_FB2(base) = addr; - } - else - { - CSI_REG_DMASA_FB1(base) = addr; - } -} - -/*! - * brief Clear the CSI FIFO. - * - * This function clears the CSI FIFO. - * - * param base CSI peripheral base address. - * param fifo The FIFO to clear. - */ -void CSI_ClearFifo(CSI_Type *base, csi_fifo_t fifo) -{ - uint32_t cr1; - uint32_t mask = 0U; - - /* The FIFO could only be cleared when CSICR1[FCC] = 0, so first clear the FCC. */ - cr1 = CSI_REG_CR1(base); - CSI_REG_CR1(base) = (cr1 & ~CSI_CSICR1_FCC_MASK); - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_RxFifo)) - { - mask |= CSI_CSICR1_CLR_RXFIFO_MASK; - } - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_StatFifo)) - { - mask |= CSI_CSICR1_CLR_STATFIFO_MASK; - } - - CSI_REG_CR1(base) = (cr1 & ~CSI_CSICR1_FCC_MASK) | mask; - - /* Wait clear completed. */ - while (0U != (CSI_REG_CR1(base) & mask)) - { - } - - /* Recover the FCC. */ - CSI_REG_CR1(base) = cr1; -} - -/*! - * brief Reflash the CSI FIFO DMA. - * - * This function reflashes the CSI FIFO DMA. - * - * For RXFIFO, there are two frame buffers. When the CSI module started, it saves - * the frames to frame buffer 0 then frame buffer 1, the two buffers will be - * written by turns. After reflash DMA using this function, the CSI is reset to - * save frame to buffer 0. - * - * param base CSI peripheral base address. - * param fifo The FIFO DMA to reflash. - */ -void CSI_ReflashFifoDma(CSI_Type *base, csi_fifo_t fifo) -{ - uint32_t cr3 = 0U; - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_RxFifo)) - { - cr3 |= CSI_CSICR3_DMA_REFLASH_RFF_MASK; - } - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_StatFifo)) - { - cr3 |= CSI_CSICR3_DMA_REFLASH_SFF_MASK; - } - - CSI_REG_CR3(base) |= cr3; - - /* Wait clear completed. */ - while (0U != (CSI_REG_CR3(base) & cr3)) - { - } -} - -/*! - * brief Enable or disable the CSI FIFO DMA request. - * - * param base CSI peripheral base address. - * param fifo The FIFO DMA reques to enable or disable. - * param enable True to enable, false to disable. - */ -void CSI_EnableFifoDmaRequest(CSI_Type *base, csi_fifo_t fifo, bool enable) -{ - uint32_t cr3 = 0U; - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_RxFifo)) - { - cr3 |= CSI_CSICR3_DMA_REQ_EN_RFF_MASK; - } - - if (0U != ((uint32_t)fifo & (uint32_t)kCSI_StatFifo)) - { - cr3 |= CSI_CSICR3_DMA_REQ_EN_SFF_MASK; - } - - if (enable) - { - CSI_REG_CR3(base) |= cr3; - } - else - { - CSI_REG_CR3(base) &= ~cr3; - } -} - -/*! - * brief Enables CSI interrupt requests. - * - * param base CSI peripheral base address. - * param mask The interrupts to enable, pass in as OR'ed value of ref _csi_interrupt_enable. - */ -void CSI_EnableInterrupts(CSI_Type *base, uint32_t mask) -{ - CSI_REG_CR1(base) |= (mask & CSI_CSICR1_INT_EN_MASK); - CSI_REG_CR3(base) |= (mask & CSI_CSICR3_INT_EN_MASK); - CSI_REG_CR18(base) |= ((mask & CSI_CSICR18_INT_EN_MASK) >> 6U); -} - -/*! - * brief Disable CSI interrupt requests. - * - * param base CSI peripheral base address. - * param mask The interrupts to disable, pass in as OR'ed value of ref _csi_interrupt_enable. - */ -void CSI_DisableInterrupts(CSI_Type *base, uint32_t mask) -{ - CSI_REG_CR1(base) &= ~(mask & CSI_CSICR1_INT_EN_MASK); - CSI_REG_CR3(base) &= ~(mask & CSI_CSICR3_INT_EN_MASK); - CSI_REG_CR18(base) &= ~((mask & CSI_CSICR18_INT_EN_MASK) >> 6U); -} - -#if !CSI_DRIVER_FRAG_MODE -/*! - * brief Initializes the CSI handle. - * - * This function initializes CSI handle, it should be called before any other - * CSI transactional functions. - * - * param base CSI peripheral base address. - * param handle Pointer to the handle structure. - * param callback Callback function for CSI transfer. - * param userData Callback function parameter. - * - * retval kStatus_Success Handle created successfully. - */ -status_t CSI_TransferCreateHandle(CSI_Type *base, - csi_handle_t *handle, - csi_transfer_callback_t callback, - void *userData) -{ - assert(NULL != handle); - uint32_t instance; - - (void)memset(handle, 0, sizeof(*handle)); - - /* Set the callback and user data. */ - handle->callback = callback; - handle->userData = userData; - - /* Get instance from peripheral base address. */ - instance = CSI_GetInstance(base); - - /* Save the handle in global variables to support the double weak mechanism. */ - s_csiHandle[instance] = handle; - - s_csiIsr = CSI_TransferHandleIRQ; - - /* Enable interrupt. */ - (void)EnableIRQ(s_csiIRQ[instance]); - - return kStatus_Success; -} - -/*! - * brief Start the transfer using transactional functions. - * - * When the empty frame buffers have been submit to CSI driver using function - * ref CSI_TransferSubmitEmptyBuffer, user could call this function to start - * the transfer. The incoming frame will be saved to the empty frame buffer, - * and user could be optionally notified through callback function. - * - * param base CSI peripheral base address. - * param handle Pointer to the handle structure. - * - * retval kStatus_Success Started successfully. - * retval kStatus_CSI_NoEmptyBuffer Could not start because no empty frame buffer in queue. - */ -status_t CSI_TransferStart(CSI_Type *base, csi_handle_t *handle) -{ - assert(NULL != handle); - - uint32_t emptyBufferCount; - - emptyBufferCount = CSI_TransferGetEmptyBufferCount(handle); - - if (emptyBufferCount < 2U) - { - return kStatus_CSI_NoEmptyBuffer; - } - - /* - * Write to memory from first completed frame. - * DMA base addr switch at the edge of the first data of each frame, thus - * if one frame is broken, it could be reset at the next frame. - */ - CSI_REG_CR18(base) = (CSI_REG_CR18(base) & ~CSI_CSICR18_MASK_OPTION_MASK) | CSI_CSICR18_MASK_OPTION(0) | - CSI_CSICR18_BASEADDR_SWITCH_SEL_MASK | CSI_CSICR18_BASEADDR_SWITCH_EN_MASK; - - /* Load the frame buffer to CSI register, there are at least two empty buffers. */ - CSI_REG_DMASA_FB1(base) = CSI_ADDR_CPU_2_IP(CSI_TransferGetEmptyBuffer(handle)); - CSI_REG_DMASA_FB2(base) = CSI_ADDR_CPU_2_IP(CSI_TransferGetEmptyBuffer(handle)); - - handle->activeBufferNum = CSI_MAX_ACTIVE_FRAME_NUM; - - /* After reflash DMA, the CSI saves frame to frame buffer 0. */ - CSI_ReflashFifoDma(base, kCSI_RxFifo); - - handle->transferStarted = true; - - CSI_EnableInterrupts( - base, (uint32_t)kCSI_RxBuffer1DmaDoneInterruptEnable | (uint32_t)kCSI_RxBuffer0DmaDoneInterruptEnable); - - CSI_Start(base); - - return kStatus_Success; -} - -/*! - * brief Stop the transfer using transactional functions. - * - * The driver does not clean the full frame buffers in queue. In other words, after - * calling this function, user still could get the full frame buffers in queue - * using function ref CSI_TransferGetFullBuffer. - * - * param base CSI peripheral base address. - * param handle Pointer to the handle structure. - * - * retval kStatus_Success Stoped successfully. - */ -status_t CSI_TransferStop(CSI_Type *base, csi_handle_t *handle) -{ - assert(NULL != handle); - uint8_t activeBufferNum; - uint8_t bufIdx; - - CSI_Stop(base); - CSI_DisableInterrupts( - base, (uint32_t)kCSI_RxBuffer1DmaDoneInterruptEnable | (uint32_t)kCSI_RxBuffer0DmaDoneInterruptEnable); - - activeBufferNum = handle->activeBufferNum; - - handle->transferStarted = false; - handle->activeBufferNum = 0; - - /* - * Put active buffers to empty queue. - * - * If there is only one active frame buffers, then FB0 and FB1 use the same address, - * put FB0 to empty buffer queue is OK. - */ - for (bufIdx = 0; bufIdx < activeBufferNum; bufIdx++) - { - CSI_TransferPutEmptyBuffer(handle, CSI_GetRxBufferAddr(base, bufIdx)); - } - - return kStatus_Success; -} - -/*! - * brief Submit empty frame buffer to queue. - * - * This function could be called before ref CSI_TransferStart or after ref - * CSI_TransferStart. If there is no room in queue to store the empty frame - * buffer, this function returns error. - * - * param base CSI peripheral base address. - * param handle Pointer to the handle structure. - * param frameBuffer Empty frame buffer to submit. - * - * retval kStatus_Success Started successfully. - * retval kStatus_CSI_QueueFull Could not submit because there is no room in queue. - */ -status_t CSI_TransferSubmitEmptyBuffer(CSI_Type *base, csi_handle_t *handle, uint32_t frameBuffer) -{ - uint32_t csicr1; - - /* Disable the interrupt to protect the index information in handle. */ - csicr1 = CSI_REG_CR1(base); - - CSI_REG_CR1(base) = (csicr1 & ~(CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK | CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK)); - - /* Save the empty frame buffer address to queue. */ - CSI_TransferPutEmptyBuffer(handle, frameBuffer); - - CSI_REG_CR1(base) = csicr1; - - return kStatus_Success; -} - -/*! - * brief Get one full frame buffer from queue. - * - * After the transfer started using function ref CSI_TransferStart, the incoming - * frames will be saved to the empty frame buffers in queue. This function gets - * the full-filled frame buffer from the queue. If there is no full frame buffer - * in queue, this function returns error. - * - * param base CSI peripheral base address. - * param handle Pointer to the handle structure. - * param frameBuffer Full frame buffer. - * - * retval kStatus_Success Started successfully. - * retval kStatus_CSI_NoFullBuffer There is no full frame buffer in queue. - */ -status_t CSI_TransferGetFullBuffer(CSI_Type *base, csi_handle_t *handle, uint32_t *frameBuffer) -{ - uint32_t csicr1; - status_t status; - uint8_t queueReadIdx; - uint8_t queueWriteIdx; - - queueReadIdx = handle->queueReadIdx; - queueWriteIdx = handle->queueWriteIdx; - - /* No full frame buffer. */ - if (queueReadIdx == queueWriteIdx) - { - status = kStatus_CSI_NoFullBuffer; - } - else - { - /* Disable the interrupt to protect the index information in handle. */ - csicr1 = CSI_REG_CR1(base); - - CSI_REG_CR1(base) = (csicr1 & ~(CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK | CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK)); - - *frameBuffer = handle->frameBufferQueue[handle->queueReadIdx]; - - handle->queueReadIdx = CSI_TransferIncreaseQueueIdx(handle->queueReadIdx); - - CSI_REG_CR1(base) = csicr1; - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief CSI IRQ handle function. - * - * This function handles the CSI IRQ request to work with CSI driver transactional - * APIs. - * - * param base CSI peripheral base address. - * param handle CSI handle pointer. - */ -void CSI_TransferHandleIRQ(CSI_Type *base, csi_handle_t *handle) -{ - uint8_t queueWriteIdx; - uint8_t queueReadIdx; - uint8_t dmaDoneBufferIdx; - uint32_t frameBuffer; - uint32_t csisr = CSI_REG_SR(base); - - /* Clear the error flags. */ - CSI_REG_SR(base) = csisr; - - /* - * If both frame buffer 0 and frame buffer 1 flags assert, driver does not - * know which frame buffer ready just now, so skip them. - */ - if ((csisr & (CSI_CSISR_DMA_TSF_DONE_FB2_MASK | CSI_CSISR_DMA_TSF_DONE_FB1_MASK)) == - (CSI_CSISR_DMA_TSF_DONE_FB2_MASK | CSI_CSISR_DMA_TSF_DONE_FB1_MASK)) - { - ; /* Skip the frames. */ - } - else if (0U != (csisr & (CSI_CSISR_DMA_TSF_DONE_FB2_MASK | CSI_CSISR_DMA_TSF_DONE_FB1_MASK))) - { - if (0U != (csisr & CSI_CSISR_DMA_TSF_DONE_FB2_MASK)) - { - dmaDoneBufferIdx = 1; - } - else - { - dmaDoneBufferIdx = 0; - } - - if (handle->activeBufferNum == CSI_MAX_ACTIVE_FRAME_NUM) - { - queueWriteIdx = handle->queueWriteIdx; - queueReadIdx = handle->queueReadIdx; - - if (CSI_TransferGetQueueDelta(queueReadIdx, queueWriteIdx) < CSI_DRIVER_QUEUE_SIZE) - { - /* Put the full frame buffer to full buffer queue. */ - frameBuffer = CSI_GetRxBufferAddr(base, dmaDoneBufferIdx); - handle->frameBufferQueue[queueWriteIdx] = frameBuffer; - - handle->queueWriteIdx = CSI_TransferIncreaseQueueIdx(queueWriteIdx); - - handle->activeBufferNum--; - - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_CSI_FrameDone, handle->userData); - } - } - else - { - } - } - - /* - * User may submit new frame buffer in callback, so recheck activeBufferNum here, - * if there is only one active buffer in CSI device, the two buffer registers - * are both set to the frame buffer address. - */ - if (handle->activeBufferNum < CSI_MAX_ACTIVE_FRAME_NUM) - { - if (CSI_TransferGetEmptyBufferCount(handle) > 0U) - { - /* Get the empty frameBuffer, and submit to CSI device. */ - CSI_SetRxBufferAddr(base, dmaDoneBufferIdx, CSI_TransferGetEmptyBuffer(handle)); - handle->activeBufferNum++; - } - else - { - /* If there is only one active frame buffer, then the two CSI - * output buffer address are all set to this frame buffer. - */ - frameBuffer = CSI_GetRxBufferAddr(base, dmaDoneBufferIdx ^ 1U); - CSI_SetRxBufferAddr(base, dmaDoneBufferIdx, frameBuffer); - } - } - } - else - { - } -} - -#else /* CSI_DRIVER_FRAG_MODE */ - -#if defined(__CC_ARM) -__asm void CSI_ExtractYFromYUYV(void *datBase, const void *dmaBase, size_t count) -{ - /* clang-format off */ - push {r4-r7, lr} -10 - LDMIA R1!, {r3-r6} - bfi r7, r3, #0, #8 /* Y0 */ - bfi ip, r5, #0, #8 /* Y4 */ - lsr r3, r3, #16 - lsr r5, r5, #16 - bfi r7, r3, #8, #8 /* Y1 */ - bfi ip, r5, #8, #8 /* Y5 */ - bfi r7, r4, #16, #8 /* Y2 */ - bfi ip, r6, #16, #8 /* Y6 */ - lsr r4, r4, #16 - lsr r6, r6, #16 - bfi r7, r4, #24, #8 /* Y3 */ - bfi ip, r6, #24, #8 /* Y7 */ - STMIA r0!, {r7, ip} - subs r2, #8 - bne %b10 - pop {r4-r7, pc} - /* clang-format on */ -} - -__asm void CSI_ExtractYFromUYVY(void *datBase, const void *dmaBase, size_t count) -{ - /* clang-format off */ - push {r4-r7, lr} -10 - LDMIA R1!, {r3-r6} - lsr r3, r3, #8 - lsr r5, r5, #8 - bfi r7, r3, #0, #8 /* Y0 */ - bfi ip, r5, #0, #8 /* Y4 */ - lsr r3, r3, #16 - lsr r5, r5, #16 - bfi r7, r3, #8, #8 /* Y1 */ - bfi ip, r5, #8, #8 /* Y5 */ - lsr r4, r4, #8 - lsr r6, r6, #8 - bfi r7, r4, #16, #8 /* Y2 */ - bfi ip, r6, #16, #8 /* Y6 */ - lsr r4, r4, #16 - lsr r6, r6, #16 - bfi r7, r4, #24, #8 /* Y3 */ - bfi ip, r6, #24, #8 /* Y7 */ - STMIA r0!, {r7, ip} - subs r2, #8 - bne %b10 - pop {r4-r7, pc} - /* clang-format on */ -} - -#elif (defined(__GNUC__) || defined(__ICCARM__)) || defined(__ARMCC_VERSION) -#if defined(__ICCARM__) -#pragma diag_suppress = Pe940 -#endif -__attribute__((naked)) void CSI_ExtractYFromYUYV(void *datBase, const void *dmaBase, size_t count); -void CSI_ExtractYFromYUYV(void *datBase, const void *dmaBase, size_t count) -{ - /* clang-format off */ - __asm volatile( - " push {r1-r7, r12, lr} \n" - "loop0: \n" - " ldmia r1!, {r3-r6} \n" - " bfi r7, r3, #0, #8 \n" /* Y0 */ - " bfi r12, r5, #0, #8 \n" /* Y4 */ - " lsr r3, r3, #16 \n" - " lsr r5, r5, #16 \n" - " bfi r7, r3, #8, #8 \n" /* Y1 */ - " bfi r12, r5, #8, #8 \n" /* Y5 */ - " bfi r7, r4, #16, #8 \n" /* Y2 */ - " bfi r12, r6, #16, #8 \n" /* Y6 */ - " lsr r4, r4, #16 \n" - " lsr r6, r6, #16 \n" - " bfi r7, r4, #24, #8 \n" /* Y3 */ - " bfi r12, r6, #24, #8 \n" /* Y7 */ - " stmia r0!, {r7, r12} \n" - " subs r2, #8 \n" - " bne loop0 \n" - " pop {r1-r7, r12, pc} \n"); - /* clang-format on */ -} - -__attribute__((naked)) void CSI_ExtractYFromUYVY(void *datBase, const void *dmaBase, size_t count); -void CSI_ExtractYFromUYVY(void *datBase, const void *dmaBase, size_t count) -{ - /* clang-format off */ - __asm volatile( - " push {r1-r7, r12, lr} \n" - "loop1: \n" - " ldmia r1!, {r3-r6} \n" - " lsr r3, r3, #8 \n" - " lsr r5, r5, #8 \n" - " bfi r7, r3, #0, #8 \n" /* Y0 */ - " bfi r12, r5, #0, #8 \n" /* Y4 */ - " lsr r3, r3, #16 \n" - " lsr r5, r5, #16 \n" - " bfi r7, r3, #8, #8 \n" /* Y1 */ - " bfi r12, r5, #8, #8 \n" /* Y5 */ - " lsr r4, r4, #8 \n" - " lsr r6, r6, #8 \n" - " bfi r7, r4, #16, #8 \n" /* Y2 */ - " bfi r12, r6, #16, #8 \n" /* Y6 */ - " lsr r4, r4, #16 \n" - " lsr r6, r6, #16 \n" - " bfi r7, r4, #24, #8 \n" /* Y3 */ - " bfi r12, r6, #24, #8 \n" /* Y7 */ - " stmia r0!, {r7, r12} \n" - " subs r2, #8 \n" - " bne loop1 \n" - " pop {r1-r7, r12, pc} \n"); - /* clang-format on */ -} -#if defined(__ICCARM__) -#pragma diag_default = Pe940 -#endif -#else -#error Toolchain not supported. -#endif - -static void CSI_MemCopy(void *pDest, const void *pSrc, size_t cnt) -{ - (void)memcpy(pDest, pSrc, cnt); -} - -/*! - * brief Initialize the CSI to work in fragment mode. - * - * This function enables the CSI peripheral clock, and resets the CSI registers. - * - * param base CSI peripheral base address. - */ -void CSI_FragModeInit(CSI_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = CSI_GetInstance(base); - CLOCK_EnableClock(s_csiClocks[instance]); -#endif - - CSI_Reset(base); -} - -/*! - * brief De-initialize the CSI. - * - * This function disables the CSI peripheral clock. - * - * param base CSI peripheral base address. - */ -void CSI_FragModeDeinit(CSI_Type *base) -{ - CSI_Deinit(base); -} - -/*! - * brief Create handle for CSI work in fragment mode. - * - * param base CSI peripheral base address. - * param handle Pointer to the transactional handle. - * param config Pointer to the configuration structure. - * param callback Callback function for CSI transfer. - * param userData Callback function parameter. - * - * retval kStatus_Success Initialize successfully. - * retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_FragModeCreateHandle(CSI_Type *base, - csi_frag_handle_t *handle, - const csi_frag_config_t *config, - csi_frag_transfer_callback_t callback, - void *userData) -{ - assert(NULL != config); - uint32_t reg; - uint32_t instance; - uint32_t imgWidth_Bytes; - - if (config->dataBus != kCSI_DataBus8Bit) - { - return kStatus_InvalidArgument; - } - - imgWidth_Bytes = (uint32_t)config->width * CSI_FRAG_INPUT_BYTES_PER_PIXEL; - - /* The image buffer line width should be multiple of 8-bytes. */ - if ((imgWidth_Bytes & 0x07U) != 0U) - { - return kStatus_InvalidArgument; - } - - /* Camera frame height must be dividable by DMA buffer line. */ - if (config->height % config->dmaBufferLine != 0U) - { - return kStatus_InvalidArgument; - } - - (void)memset(handle, 0, sizeof(*handle)); - handle->callback = callback; - handle->userData = userData; - handle->height = config->height; - handle->width = config->width; - handle->maxLinePerFrag = config->dmaBufferLine; - handle->dmaBytePerLine = config->width * CSI_FRAG_INPUT_BYTES_PER_PIXEL; - handle->isDmaBufferCachable = config->isDmaBufferCachable; - - /* Get instance from peripheral base address. */ - instance = CSI_GetInstance(base); - /* Save the handle in global variables to support the double weak mechanism. */ - s_csiHandle[instance] = handle; - - s_csiIsr = CSI_FragModeTransferHandleIRQ; - - (void)EnableIRQ(s_csiIRQ[instance]); - - /* Configure CSICR1. CSICR1 has been reset to the default value, so could write it directly. */ - reg = ((uint32_t)config->workMode) | config->polarityFlags | CSI_CSICR1_FCC_MASK; - - if (config->useExtVsync) - { - reg |= CSI_CSICR1_EXT_VSYNC_MASK; - } - - CSI_REG_CR1(base) = reg; - - /* No stride. */ - CSI_REG_FBUF_PARA(base) = 0; - - /* Enable auto ECC. */ - CSI_REG_CR3(base) |= CSI_CSICR3_ECC_AUTO_EN_MASK; - - /* - * For better performance. - * The DMA burst size could be set to 16 * 8 byte, 8 * 8 byte, or 4 * 8 byte, - * choose the best burst size based on bytes per line. - */ - if (0U == (imgWidth_Bytes % (8U * 16U))) - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(3U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((2U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - else if (0U == (imgWidth_Bytes % (8U * 8U))) - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(2U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((1U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - else - { - CSI_REG_CR2(base) = CSI_CSICR2_DMA_BURST_TYPE_RFF(1U); - CSI_REG_CR3(base) = (CSI_REG_CR3(base) & ~CSI_CSICR3_RxFF_LEVEL_MASK) | ((0U << CSI_CSICR3_RxFF_LEVEL_SHIFT)); - } - - CSI_REG_DMASA_FB1(base) = CSI_ADDR_CPU_2_IP(config->dmaBufferAddr0); - CSI_REG_DMASA_FB2(base) = CSI_ADDR_CPU_2_IP(config->dmaBufferAddr1); - - if (handle->isDmaBufferCachable) - { - DCACHE_CleanInvalidateByRange( - config->dmaBufferAddr0, - (uint32_t)config->dmaBufferLine * (uint32_t)config->width * CSI_FRAG_INPUT_BYTES_PER_PIXEL); - DCACHE_CleanInvalidateByRange( - config->dmaBufferAddr1, - (uint32_t)config->dmaBufferLine * (uint32_t)config->width * CSI_FRAG_INPUT_BYTES_PER_PIXEL); - } - - return kStatus_Success; -} - -/*! - * brief Start to capture a image. - * - * param base CSI peripheral base address. - * param handle Pointer to the transactional handle. - * param config Pointer to the capture configuration. - * - * retval kStatus_Success Initialize successfully. - * retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_FragModeTransferCaptureImage(CSI_Type *base, - csi_frag_handle_t *handle, - const csi_frag_capture_config_t *config) -{ - assert(NULL != config); - - uint16_t windowWidth; - - /* - * If no special window setting, capture full frame. - * If capture window, then capture 1 one each fragment. - */ - if (config->window != NULL) - { - handle->windowULX = config->window->windowULX; - handle->windowULY = config->window->windowULY; - handle->windowLRX = config->window->windowLRX; - handle->windowLRY = config->window->windowLRY; - handle->linePerFrag = 1; - } - else - { - handle->windowULX = 0; - handle->windowULY = 0; - handle->windowLRX = handle->width - 1U; - handle->windowLRY = handle->height - 1U; - handle->linePerFrag = handle->maxLinePerFrag; - } - - windowWidth = handle->windowLRX - handle->windowULX + 1U; - - if (config->outputGrayScale) - { - /* When output format is gray, the window width must be multiple value of 8. */ - if (windowWidth % 8U != 0U) - { - return kStatus_InvalidArgument; - } - - handle->datBytePerLine = windowWidth; - if (handle->inputFormat == kCSI_FragInputYUYV) - { - handle->copyFunc = CSI_ExtractYFromYUYV; - } - else - { - handle->copyFunc = CSI_ExtractYFromUYVY; - } - } - else - { - handle->datBytePerLine = windowWidth * CSI_FRAG_INPUT_BYTES_PER_PIXEL; - handle->copyFunc = CSI_MemCopy; - } - - handle->dmaCurLine = 0; - handle->outputBuffer = (uint32_t)config->buffer; - handle->datCurWriteAddr = (uint32_t)config->buffer; - - /* Image parameter. */ - CSI_REG_IMAG_PARA(base) = - (((uint32_t)handle->width * CSI_FRAG_INPUT_BYTES_PER_PIXEL) << CSI_CSIIMAG_PARA_IMAGE_WIDTH_SHIFT) | - ((uint32_t)(handle->linePerFrag) << CSI_CSIIMAG_PARA_IMAGE_HEIGHT_SHIFT); - - /* - * Write to memory from first completed frame. - * DMA base addr switch at dma transfer done. - */ - CSI_REG_CR18(base) = (CSI_REG_CR18(base) & ~CSI_CSICR18_MASK_OPTION_MASK) | CSI_CSICR18_MASK_OPTION(0); - - CSI_EnableInterrupts(base, (uint32_t)kCSI_StartOfFrameInterruptEnable | - (uint32_t)kCSI_RxBuffer1DmaDoneInterruptEnable | - (uint32_t)kCSI_RxBuffer0DmaDoneInterruptEnable); - - return kStatus_Success; -} - -/*! - * brief Abort image capture. - * - * Abort image capture initialized by ref CSI_FragModeTransferCaptureImage. - * - * param base CSI peripheral base address. - * param handle Pointer to the transactional handle. - */ -void CSI_FragModeTransferAbortCaptureImage(CSI_Type *base, csi_frag_handle_t *handle) -{ - CSI_Stop(base); - CSI_DisableInterrupts(base, (uint32_t)kCSI_StartOfFrameInterruptEnable | - (uint32_t)kCSI_RxBuffer1DmaDoneInterruptEnable | - (uint32_t)kCSI_RxBuffer0DmaDoneInterruptEnable); -} - -/*! - * brief CSI IRQ handle function. - * - * This function handles the CSI IRQ request to work with CSI driver fragment mode - * APIs. - * - * param base CSI peripheral base address. - * param handle CSI handle pointer. - */ -void CSI_FragModeTransferHandleIRQ(CSI_Type *base, csi_frag_handle_t *handle) -{ - uint32_t csisr = CSI_REG_SR(base); - uint32_t dmaBufAddr; - uint16_t line; - pvoid_to_u32_t memSrc; - pvoid_to_u32_t memDest; - - /* Clear the error flags. */ - CSI_REG_SR(base) = csisr; - - /* Start of frame, clear the FIFO and start receiving. */ - if (0U != (csisr & (uint32_t)kCSI_StartOfFrameFlag)) - { - /* Reflash the DMA and enable RX DMA request. */ - CSI_REG_CR3(base) |= (CSI_CSICR3_DMA_REFLASH_RFF_MASK | CSI_CSICR3_DMA_REQ_EN_RFF_MASK); - CSI_Start(base); - handle->dmaCurLine = 0; - handle->datCurWriteAddr = handle->outputBuffer; - } - else if ((csisr & (CSI_CSISR_DMA_TSF_DONE_FB2_MASK | CSI_CSISR_DMA_TSF_DONE_FB1_MASK)) != 0U) - { - if ((csisr & CSI_CSISR_DMA_TSF_DONE_FB1_MASK) == CSI_CSISR_DMA_TSF_DONE_FB1_MASK) - { - dmaBufAddr = CSI_REG_DMASA_FB1(base); - } - else - { - dmaBufAddr = CSI_REG_DMASA_FB2(base); - } - - dmaBufAddr = CSI_ADDR_IP_2_CPU(dmaBufAddr); - - if (handle->isDmaBufferCachable) - { - DCACHE_InvalidateByRange(dmaBufAddr, (uint32_t)handle->dmaBytePerLine * (uint32_t)handle->linePerFrag); - } - - /* Copy from DMA buffer to user data buffer. */ - dmaBufAddr += ((uint32_t)handle->windowULX * CSI_FRAG_INPUT_BYTES_PER_PIXEL); - - for (line = 0; line < handle->linePerFrag; line++) - { - if (handle->dmaCurLine + line > handle->windowLRY) - { - /* out of window range */ - break; - } - else if (handle->dmaCurLine + line >= handle->windowULY) - { - memDest.u32 = handle->datCurWriteAddr; - memSrc.u32 = dmaBufAddr; - - handle->copyFunc(memDest.pvoid, memSrc.pvoid, handle->datBytePerLine); - handle->datCurWriteAddr += handle->datBytePerLine; - dmaBufAddr += handle->dmaBytePerLine; - } - else - { - ; /* For MISRA C-2012 Rule 15.7 */ - } - } - - handle->dmaCurLine += handle->linePerFrag; - - if (handle->dmaCurLine >= handle->height) - { - CSI_Stop(base); - CSI_DisableInterrupts(base, (uint32_t)kCSI_StartOfFrameInterruptEnable | - (uint32_t)kCSI_RxBuffer1DmaDoneInterruptEnable | - (uint32_t)kCSI_RxBuffer0DmaDoneInterruptEnable); - - /* Image captured. Stop the CSI. */ - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_CSI_FrameDone, handle->userData); - } - } - } - else - { - } -} -#endif /* CSI_DRIVER_FRAG_MODE */ - -#if defined(CSI) -void CSI_DriverIRQHandler(void); -void CSI_DriverIRQHandler(void) -{ - s_csiIsr(CSI, s_csiHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CSI0) -void CSI0_DriverIRQHandler(void); -void CSI0_DriverIRQHandler(void) -{ - s_csiIsr(CSI, s_csiHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_csi.h b/devices/MIMXRT1052/drivers/fsl_csi.h deleted file mode 100644 index d2a7982..0000000 --- a/devices/MIMXRT1052/drivers/fsl_csi.h +++ /dev/null @@ -1,746 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_CSI_H_ -#define _FSL_CSI_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup csi_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_CSI_DRIVER_VERSION (MAKE_VERSION(2, 1, 4)) -/*@}*/ - -#if (defined(FSL_FEATURE_CSI_NO_REG_PREFIX) && FSL_FEATURE_CSI_NO_REG_PREFIX) -#define CSI_REG_CR1(base) (base)->CR1 -#define CSI_REG_CR2(base) (base)->CR2 -#define CSI_REG_CR3(base) (base)->CR3 -#define CSI_REG_CR18(base) (base)->CR18 -#define CSI_REG_SR(base) (base)->SR -#define CSI_REG_DMASA_FB1(base) (base)->DMASA_FB1 -#define CSI_REG_DMASA_FB2(base) (base)->DMASA_FB2 -#define CSI_REG_IMAG_PARA(base) (base)->IMAG_PARA -#define CSI_REG_FBUF_PARA(base) (base)->FBUF_PARA -#else -#define CSI_REG_CR1(base) (base)->CSICR1 -#define CSI_REG_CR2(base) (base)->CSICR2 -#define CSI_REG_CR3(base) (base)->CSICR3 -#define CSI_REG_CR18(base) (base)->CSICR18 -#define CSI_REG_SR(base) (base)->CSISR -#define CSI_REG_DMASA_FB1(base) (base)->CSIDMASA_FB1 -#define CSI_REG_DMASA_FB2(base) (base)->CSIDMASA_FB2 -#define CSI_REG_IMAG_PARA(base) (base)->CSIIMAG_PARA -#define CSI_REG_FBUF_PARA(base) (base)->CSIFBUF_PARA -#endif - -/*! @brief Size of the frame buffer queue used in CSI transactional function. */ -#ifndef CSI_DRIVER_QUEUE_SIZE -#define CSI_DRIVER_QUEUE_SIZE 4U -#endif - -/*! @brief Enable fragment capture function or not. */ -#ifndef CSI_DRIVER_FRAG_MODE -#define CSI_DRIVER_FRAG_MODE 0U -#endif - -/* - * There is one empty room in queue, used to distinguish whether the queue - * is full or empty. When header equals tail, the queue is empty; when header - * equals tail + 1, the queue is full. - */ -#define CSI_DRIVER_ACTUAL_QUEUE_SIZE (CSI_DRIVER_QUEUE_SIZE + 1U) - -/* - * The queue max size is 254, so that the queue element index could use `uint8_t`. - */ -#if (CSI_DRIVER_ACTUAL_QUEUE_SIZE > 254) -#error Required queue size is too large -#endif - -/* - * The interrupt enable bits are in registers CSICR1[16:31], CSICR3[0:7], - * and CSICR18[2:9]. So merge them into an uint32_t value, place CSICR18 control - * bits to [8:15]. - */ -#define CSI_CSICR1_INT_EN_MASK 0xFFFF0000U -#define CSI_CSICR3_INT_EN_MASK 0x000000FFU -#define CSI_CSICR18_INT_EN_MASK 0x0000FF00U - -#if ((~CSI_CSICR1_INT_EN_MASK) & \ - (CSI_CSICR1_EOF_INT_EN_MASK | CSI_CSICR1_COF_INT_EN_MASK | CSI_CSICR1_SF_OR_INTEN_MASK | \ - CSI_CSICR1_RF_OR_INTEN_MASK | CSI_CSICR1_SFF_DMA_DONE_INTEN_MASK | CSI_CSICR1_STATFF_INTEN_MASK | \ - CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK | CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK | CSI_CSICR1_RXFF_INTEN_MASK | \ - CSI_CSICR1_SOF_INTEN_MASK)) -#error CSI_CSICR1_INT_EN_MASK could not cover all interrupt bits in CSICR1. -#endif - -#if ((~CSI_CSICR3_INT_EN_MASK) & (CSI_CSICR3_ECC_INT_EN_MASK | CSI_CSICR3_HRESP_ERR_EN_MASK)) -#error CSI_CSICR3_INT_EN_MASK could not cover all interrupt bits in CSICR3. -#endif - -#if ((~CSI_CSICR18_INT_EN_MASK) & ((CSI_CSICR18_FIELD0_DONE_IE_MASK | CSI_CSICR18_DMA_FIELD1_DONE_IE_MASK | \ - CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_MASK) \ - << 6U)) -#error CSI_CSICR18_INT_EN_MASK could not cover all interrupt bits in CSICR18. -#endif - -/*! @brief Error codes for the CSI driver. */ -enum -{ - kStatus_CSI_NoEmptyBuffer = MAKE_STATUS(kStatusGroup_CSI, 0), /*!< No empty frame buffer in queue to load to CSI. */ - kStatus_CSI_NoFullBuffer = MAKE_STATUS(kStatusGroup_CSI, 1), /*!< No full frame buffer in queue to read out. */ - kStatus_CSI_QueueFull = MAKE_STATUS(kStatusGroup_CSI, 2), /*!< Queue is full, no room to save new empty buffer. */ - kStatus_CSI_FrameDone = MAKE_STATUS(kStatusGroup_CSI, 3), /*!< New frame received and saved to queue. */ -}; - -/*! - * @brief CSI work mode. - * - * The CCIR656 interlace mode is not supported currently. - */ -typedef enum _csi_work_mode -{ - kCSI_GatedClockMode = CSI_CSICR1_GCLK_MODE(1U), /*!< HSYNC, VSYNC, and PIXCLK signals are used. */ - kCSI_NonGatedClockMode = 0U, /*!< VSYNC, and PIXCLK signals are used. */ - kCSI_CCIR656ProgressiveMode = CSI_CSICR1_CCIR_EN(1U), /*!< CCIR656 progressive mode. */ -} csi_work_mode_t; - -/*! - * @brief CSI data bus witdh. - */ -typedef enum _csi_data_bus -{ - kCSI_DataBus8Bit, /*!< 8-bit data bus. */ - kCSI_DataBus16Bit, /*!< 16-bit data bus. */ - kCSI_DataBus24Bit, /*!< 24-bit data bus. */ -} csi_data_bus_t; - -/*! @brief CSI signal polarity. */ -enum _csi_polarity_flags -{ - kCSI_HsyncActiveLow = 0U, /*!< HSYNC is active low. */ - kCSI_HsyncActiveHigh = CSI_CSICR1_HSYNC_POL_MASK, /*!< HSYNC is active high. */ - kCSI_DataLatchOnRisingEdge = CSI_CSICR1_REDGE_MASK, /*!< Pixel data latched at rising edge of pixel clock. */ - kCSI_DataLatchOnFallingEdge = 0U, /*!< Pixel data latched at falling edge of pixel clock. */ - kCSI_VsyncActiveHigh = 0U, /*!< VSYNC is active high. */ - kCSI_VsyncActiveLow = CSI_CSICR1_SOF_POL_MASK, /*!< VSYNC is active low. */ -}; - -/*! @brief Configuration to initialize the CSI module. */ -typedef struct _csi_config -{ - uint16_t width; /*!< Pixels of the input frame. */ - uint16_t height; /*!< Lines of the input frame. */ - uint32_t polarityFlags; /*!< Timing signal polarity flags, OR'ed value of @ref _csi_polarity_flags. */ - uint8_t bytesPerPixel; /*!< Bytes per pixel, valid values are: - - 2: Used for RGB565, YUV422, and so on. - - 4: Used for XRGB8888, XYUV444, and so on. - */ - uint16_t linePitch_Bytes; /*!< Frame buffer line pitch, must be 8-byte aligned. */ - csi_work_mode_t workMode; /*!< CSI work mode. */ - csi_data_bus_t dataBus; /*!< Data bus width. */ - bool useExtVsync; /*!< In CCIR656 progressive mode, set true to use external VSYNC signal, set false - to use internal VSYNC signal decoded from SOF. */ -} csi_config_t; - -/*! @brief The CSI FIFO, used for FIFO operation. */ -typedef enum _csi_fifo -{ - kCSI_RxFifo = (1U << 0U), /*!< RXFIFO. */ - kCSI_StatFifo = (1U << 1U), /*!< STAT FIFO. */ - kCSI_AllFifo = 0x01 | 0x02, /*!< Both RXFIFO and STAT FIFO. */ -} csi_fifo_t; - -/*! @brief CSI feature interrupt source. */ -enum _csi_interrupt_enable -{ - kCSI_EndOfFrameInterruptEnable = CSI_CSICR1_EOF_INT_EN_MASK, /*!< End of frame interrupt enable. */ - kCSI_ChangeOfFieldInterruptEnable = CSI_CSICR1_COF_INT_EN_MASK, /*!< Change of field interrupt enable. */ - kCSI_StatFifoOverrunInterruptEnable = CSI_CSICR1_SF_OR_INTEN_MASK, /*!< STAT FIFO overrun interrupt enable. */ - kCSI_RxFifoOverrunInterruptEnable = CSI_CSICR1_RF_OR_INTEN_MASK, /*!< RXFIFO overrun interrupt enable. */ - kCSI_StatFifoDmaDoneInterruptEnable = - CSI_CSICR1_SFF_DMA_DONE_INTEN_MASK, /*!< STAT FIFO DMA done interrupt enable. */ - kCSI_StatFifoFullInterruptEnable = CSI_CSICR1_STATFF_INTEN_MASK, /*!< STAT FIFO full interrupt enable. */ - kCSI_RxBuffer1DmaDoneInterruptEnable = - CSI_CSICR1_FB2_DMA_DONE_INTEN_MASK, /*!< RX frame buffer 1 DMA transfer done. */ - kCSI_RxBuffer0DmaDoneInterruptEnable = - CSI_CSICR1_FB1_DMA_DONE_INTEN_MASK, /*!< RX frame buffer 0 DMA transfer done. */ - kCSI_RxFifoFullInterruptEnable = CSI_CSICR1_RXFF_INTEN_MASK, /*!< RXFIFO full interrupt enable. */ - kCSI_StartOfFrameInterruptEnable = CSI_CSICR1_SOF_INTEN_MASK, /*!< Start of frame (SOF) interrupt enable. */ - - kCSI_EccErrorInterruptEnable = CSI_CSICR3_ECC_INT_EN_MASK, /*!< ECC error detection interrupt enable. */ - kCSI_AhbResErrorInterruptEnable = CSI_CSICR3_HRESP_ERR_EN_MASK, /*!< AHB response Error interrupt enable. */ - - kCSI_BaseAddrChangeErrorInterruptEnable = CSI_CSICR18_BASEADDR_CHANGE_ERROR_IE_MASK - << 6U, /*!< The DMA output buffer base address - changes before DMA completed. */ - kCSI_Field0DoneInterruptEnable = CSI_CSICR18_FIELD0_DONE_IE_MASK << 6U, /*!< Field 0 done interrupt enable. */ - kCSI_Field1DoneInterruptEnable = CSI_CSICR18_DMA_FIELD1_DONE_IE_MASK << 6U, /*!< Field 1 done interrupt enable. */ -}; - -/*! - * @brief CSI status flags. - * - * The following status register flags can be cleared: - * - kCSI_EccErrorFlag - * - kCSI_AhbResErrorFlag - * - kCSI_ChangeOfFieldFlag - * - kCSI_StartOfFrameFlag - * - kCSI_EndOfFrameFlag - * - kCSI_RxBuffer1DmaDoneFlag - * - kCSI_RxBuffer0DmaDoneFlag - * - kCSI_StatFifoDmaDoneFlag - * - kCSI_StatFifoOverrunFlag - * - kCSI_RxFifoOverrunFlag - * - kCSI_Field0DoneFlag - * - kCSI_Field1DoneFlag - * - kCSI_BaseAddrChangeErrorFlag - */ -enum _csi_flags -{ - kCSI_RxFifoDataReadyFlag = CSI_CSISR_DRDY_MASK, /*!< RXFIFO data ready. */ - kCSI_EccErrorFlag = CSI_CSISR_ECC_INT_MASK, /*!< ECC error detected. */ - kCSI_AhbResErrorFlag = CSI_CSISR_HRESP_ERR_INT_MASK, /*!< Hresponse (AHB bus response) Error. */ - kCSI_ChangeOfFieldFlag = CSI_CSISR_COF_INT_MASK, /*!< Change of field. */ - kCSI_Field0PresentFlag = CSI_CSISR_F1_INT_MASK, /*!< Field 0 present in CCIR mode. */ - kCSI_Field1PresentFlag = CSI_CSISR_F2_INT_MASK, /*!< Field 1 present in CCIR mode. */ - kCSI_StartOfFrameFlag = CSI_CSISR_SOF_INT_MASK, /*!< Start of frame (SOF) detected. */ - kCSI_EndOfFrameFlag = CSI_CSISR_EOF_INT_MASK, /*!< End of frame (EOF) detected. */ - kCSI_RxFifoFullFlag = CSI_CSISR_RxFF_INT_MASK, /*!< RXFIFO full (Number of data reaches trigger level). */ - kCSI_RxBuffer1DmaDoneFlag = CSI_CSISR_DMA_TSF_DONE_FB2_MASK, /*!< RX frame buffer 1 DMA transfer done. */ - kCSI_RxBuffer0DmaDoneFlag = CSI_CSISR_DMA_TSF_DONE_FB1_MASK, /*!< RX frame buffer 0 DMA transfer done. */ - kCSI_StatFifoFullFlag = CSI_CSISR_STATFF_INT_MASK, /*!< STAT FIFO full (Reach trigger level). */ - kCSI_StatFifoDmaDoneFlag = CSI_CSISR_DMA_TSF_DONE_SFF_MASK, /*!< STAT FIFO DMA transfer done. */ - kCSI_StatFifoOverrunFlag = CSI_CSISR_SF_OR_INT_MASK, /*!< STAT FIFO overrun. */ - kCSI_RxFifoOverrunFlag = CSI_CSISR_RF_OR_INT_MASK, /*!< RXFIFO overrun. */ - kCSI_Field0DoneFlag = CSI_CSISR_DMA_FIELD0_DONE_MASK, /*!< Field 0 transfer done. */ - kCSI_Field1DoneFlag = CSI_CSISR_DMA_FIELD1_DONE_MASK, /*!< Field 1 transfer done. */ - kCSI_BaseAddrChangeErrorFlag = CSI_CSISR_BASEADDR_CHHANGE_ERROR_MASK, /*!< The DMA output buffer base address - changes before DMA completed. */ -}; - -/* Forward declaration of the handle typedef. */ -typedef struct _csi_handle csi_handle_t; - -/*! - * @brief CSI transfer callback function. - * - * When a new frame is received and saved to the frame buffer queue, the callback - * is called and the pass the status @ref kStatus_CSI_FrameDone to upper layer. - */ -typedef void (*csi_transfer_callback_t)(CSI_Type *base, csi_handle_t *handle, status_t status, void *userData); - -/*! - * @brief CSI handle structure. - * - * Please see the user guide for the details of the CSI driver queue mechanism. - */ -struct _csi_handle -{ - uint32_t frameBufferQueue[CSI_DRIVER_ACTUAL_QUEUE_SIZE]; /*!< Frame buffer queue. */ - - volatile uint8_t queueWriteIdx; /*!< Pointer to save incoming item. */ - volatile uint8_t queueReadIdx; /*!< Pointer to read out the item. */ - void *volatile emptyBuffer; /*!< Pointer to maintain the empty frame buffers. */ - volatile uint8_t emptyBufferCnt; /*!< Empty frame buffers count. */ - - volatile uint8_t activeBufferNum; /*!< How many frame buffers are in progres currently. */ - - volatile bool transferStarted; /*!< User has called @ref CSI_TransferStart to start frame receiving. */ - - csi_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< CSI callback function parameter.*/ -}; - -#if CSI_DRIVER_FRAG_MODE - -/*! @brief Input pixel format when CSI works in fragment mode. */ -typedef enum _csi_frag_input_pixel_format -{ - kCSI_FragInputRGB565 = 0, /*!< Input pixel format is RGB565. */ - kCSI_FragInputYUYV, /*!< Input pixel format is YUV422 (Y-U-Y-V). */ - kCSI_FragInputUYVY, /*!< Input pixel format is YUV422 (U-Y-V-Y). */ -} csi_frag_input_pixel_format_t; - -/*! @brief Configuration for CSI module to work in fragment mode. */ -typedef struct _csi_frag_config -{ - uint16_t width; /*!< Pixels of the input frame. */ - uint16_t height; /*!< Lines of the input frame. */ - uint32_t polarityFlags; /*!< Timing signal polarity flags, OR'ed value of @ref _csi_polarity_flags. */ - csi_work_mode_t workMode; /*!< CSI work mode. */ - csi_data_bus_t dataBus; /*!< Data bus width. */ - bool useExtVsync; /*!< In CCIR656 progressive mode, set true to use external VSYNC signal, set false - to use internal VSYNC signal decoded from SOF. */ - csi_frag_input_pixel_format_t inputFormat; /*!< Input pixel format. */ - - uint32_t dmaBufferAddr0; /*!< Buffer 0 used for CSI DMA, must be double word aligned. */ - uint32_t dmaBufferAddr1; /*!< Buffer 1 used for CSI DMA, must be double word aligned. */ - uint16_t dmaBufferLine; /*!< Lines of each DMA buffer. The size of DMA buffer 0 and - buffer 1 must be the same. Camera frame height must be - dividable by this value. */ - bool isDmaBufferCachable; /*!< Is DMA buffer cachable or not. */ -} csi_frag_config_t; - -/* Forward declaration of the handle typedef. */ -typedef struct _csi_frag_handle csi_frag_handle_t; - -/*! - * @brief CSI fragment transfer callback function. - * - * When a new frame is received and saved to the frame buffer queue, the callback - * is called and the pass the status @ref kStatus_CSI_FrameDone to upper layer. - */ -typedef void (*csi_frag_transfer_callback_t)(CSI_Type *base, - csi_frag_handle_t *handle, - status_t status, - void *userData); - -/*! - * @brief Function to copy data from CSI DMA buffer to user buffer. - */ -typedef void (*csi_frag_copy_func_t)(void *pDest, const void *pSrc, size_t cnt); - -/*! @brief Handle for CSI module to work in fragment mode. */ -struct _csi_frag_handle -{ - uint16_t width; /*!< Pixels of the input frame. */ - uint16_t height; /*!< Lines of the input frame. */ - uint16_t maxLinePerFrag; /*!< Max line saved per fragment. */ - uint16_t linePerFrag; /*!< Actual line saved per fragment. */ - uint16_t dmaBytePerLine; /*!< How many bytes DMA transfered each line. */ - uint16_t datBytePerLine; /*!< How many bytes copied to user buffer each line. */ - uint16_t dmaCurLine; /*!< Current line index in whole frame. */ - uint16_t windowULX; /*!< X of windows upper left corner. */ - uint16_t windowULY; /*!< Y of windows upper left corner. */ - uint16_t windowLRX; /*!< X of windows lower right corner. */ - uint16_t windowLRY; /*!< Y of windows lower right corner. */ - uint32_t outputBuffer; /*!< Address of buffer to save the captured image. */ - uint32_t datCurWriteAddr; /*!< Current write address to the user buffer. */ - csi_frag_input_pixel_format_t inputFormat; /*!< Input pixel format. */ - - csi_frag_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< CSI callback function parameter.*/ - csi_frag_copy_func_t copyFunc; /*!< Function to copy data from CSI DMA buffer to user buffer. */ - bool isDmaBufferCachable; /*!< Is DMA buffer cachable or not. */ -}; - -/*! @brief Handle for CSI module to work in fragment mode. */ -typedef struct _csi_frag_window -{ - uint16_t windowULX; /*!< X of windows upper left corner. */ - uint16_t windowULY; /*!< Y of windows upper left corner. */ - uint16_t windowLRX; /*!< X of windows lower right corner. */ - uint16_t windowLRY; /*!< Y of windows lower right corner. */ -} csi_frag_window_t; - -/*! @brief Handle for CSI module to work in fragment mode. */ -typedef struct _csi_frag_capture_config -{ - bool outputGrayScale; /*!< Output gray scale image or not, could only enable when input format is YUV. */ - uint32_t buffer; /*!< Buffer to save the captured image. */ - csi_frag_window_t *window; /*!< Capture window. Capture full frame if set this to NULL. When output format is gray, - the window width must be multiple value of 8. */ -} csi_frag_capture_config_t; - -#endif /* CSI_DRIVER_FRAG_MODE */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initialize the CSI. - * - * This function enables the CSI peripheral clock, and resets the CSI registers. - * - * @param base CSI peripheral base address. - * @param config Pointer to the configuration structure. - * - * @retval kStatus_Success Initialize successfully. - * @retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_Init(CSI_Type *base, const csi_config_t *config); - -/*! - * @brief De-initialize the CSI. - * - * This function disables the CSI peripheral clock. - * - * @param base CSI peripheral base address. - */ -void CSI_Deinit(CSI_Type *base); - -/*! - * @brief Reset the CSI. - * - * This function resets the CSI peripheral registers to default status. - * - * @param base CSI peripheral base address. - */ -void CSI_Reset(CSI_Type *base); - -/*! - * @brief Get the default configuration for to initialize the CSI. - * - * The default configuration value is: - * - * @code - config->width = 320U; - config->height = 240U; - config->polarityFlags = kCSI_HsyncActiveHigh | kCSI_DataLatchOnRisingEdge; - config->bytesPerPixel = 2U; - config->linePitch_Bytes = 320U * 2U; - config->workMode = kCSI_GatedClockMode; - config->dataBus = kCSI_DataBus8Bit; - config->useExtVsync = true; - @endcode - * - * @param config Pointer to the CSI configuration. - */ -void CSI_GetDefaultConfig(csi_config_t *config); - -/* @} */ - -/*! - * @name Module operation - * @{ - */ - -/*! - * @brief Clear the CSI FIFO. - * - * This function clears the CSI FIFO. - * - * @param base CSI peripheral base address. - * @param fifo The FIFO to clear. - */ -void CSI_ClearFifo(CSI_Type *base, csi_fifo_t fifo); - -/*! - * @brief Reflash the CSI FIFO DMA. - * - * This function reflashes the CSI FIFO DMA. - * - * For RXFIFO, there are two frame buffers. When the CSI module started, it saves - * the frames to frame buffer 0 then frame buffer 1, the two buffers will be - * written by turns. After reflash DMA using this function, the CSI is reset to - * save frame to buffer 0. - * - * @param base CSI peripheral base address. - * @param fifo The FIFO DMA to reflash. - */ -void CSI_ReflashFifoDma(CSI_Type *base, csi_fifo_t fifo); - -/*! - * @brief Enable or disable the CSI FIFO DMA request. - * - * @param base CSI peripheral base address. - * @param fifo The FIFO DMA reques to enable or disable. - * @param enable True to enable, false to disable. - */ -void CSI_EnableFifoDmaRequest(CSI_Type *base, csi_fifo_t fifo, bool enable); - -/*! - * @brief Start to receive data. - * - * @param base CSI peripheral base address. - */ -static inline void CSI_Start(CSI_Type *base) -{ - CSI_EnableFifoDmaRequest(base, kCSI_RxFifo, true); - CSI_REG_CR18(base) |= CSI_CSICR18_CSI_ENABLE_MASK; -} - -/*! - * @brief Stop to receiving data. - * - * @param base CSI peripheral base address. - */ -static inline void CSI_Stop(CSI_Type *base) -{ - CSI_REG_CR18(base) &= ~CSI_CSICR18_CSI_ENABLE_MASK; - CSI_EnableFifoDmaRequest(base, kCSI_RxFifo, false); -} - -/*! - * @brief Set the RX frame buffer address. - * - * @param base CSI peripheral base address. - * @param index Buffer index. - * @param addr Frame buffer address to set. - */ -void CSI_SetRxBufferAddr(CSI_Type *base, uint8_t index, uint32_t addr); -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables CSI interrupt requests. - * - * @param base CSI peripheral base address. - * @param mask The interrupts to enable, pass in as OR'ed value of @ref _csi_interrupt_enable. - */ -void CSI_EnableInterrupts(CSI_Type *base, uint32_t mask); - -/*! - * @brief Disable CSI interrupt requests. - * - * @param base CSI peripheral base address. - * @param mask The interrupts to disable, pass in as OR'ed value of @ref _csi_interrupt_enable. - */ -void CSI_DisableInterrupts(CSI_Type *base, uint32_t mask); - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the CSI status flags. - * - * @param base CSI peripheral base address. - * @return status flag, it is OR'ed value of @ref _csi_flags. - */ -static inline uint32_t CSI_GetStatusFlags(CSI_Type *base) -{ - return CSI_REG_SR(base); -} - -/*! - * @brief Clears the CSI status flag. - * - * The flags to clear are passed in as OR'ed value of @ref _csi_flags. The following - * flags are cleared automatically by hardware: - * - * - @ref kCSI_RxFifoFullFlag, - * - @ref kCSI_StatFifoFullFlag, - * - @ref kCSI_Field0PresentFlag, - * - @ref kCSI_Field1PresentFlag, - * - @ref kCSI_RxFifoDataReadyFlag, - * - * @param base CSI peripheral base address. - * @param statusMask The status flags mask, OR'ed value of @ref _csi_flags. - */ -static inline void CSI_ClearStatusFlags(CSI_Type *base, uint32_t statusMask) -{ - CSI_REG_SR(base) = statusMask; -} -/* @} */ - -#if !CSI_DRIVER_FRAG_MODE -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the CSI handle. - * - * This function initializes CSI handle, it should be called before any other - * CSI transactional functions. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the handle structure. - * @param callback Callback function for CSI transfer. - * @param userData Callback function parameter. - * - * @retval kStatus_Success Handle created successfully. - */ -status_t CSI_TransferCreateHandle(CSI_Type *base, - csi_handle_t *handle, - csi_transfer_callback_t callback, - void *userData); - -/*! - * @brief Start the transfer using transactional functions. - * - * When the empty frame buffers have been submit to CSI driver using function - * @ref CSI_TransferSubmitEmptyBuffer, user could call this function to start - * the transfer. The incoming frame will be saved to the empty frame buffer, - * and user could be optionally notified through callback function. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the handle structure. - * - * @retval kStatus_Success Started successfully. - * @retval kStatus_CSI_NoEmptyBuffer Could not start because no empty frame buffer in queue. - */ -status_t CSI_TransferStart(CSI_Type *base, csi_handle_t *handle); - -/*! - * @brief Stop the transfer using transactional functions. - * - * The driver does not clean the full frame buffers in queue. In other words, after - * calling this function, user still could get the full frame buffers in queue - * using function @ref CSI_TransferGetFullBuffer. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the handle structure. - * - * @retval kStatus_Success Stoped successfully. - */ -status_t CSI_TransferStop(CSI_Type *base, csi_handle_t *handle); - -/*! - * @brief Submit empty frame buffer to queue. - * - * This function could be called before @ref CSI_TransferStart or after @ref - * CSI_TransferStart. If there is no room in queue to store the empty frame - * buffer, this function returns error. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the handle structure. - * @param frameBuffer Empty frame buffer to submit. - * - * @retval kStatus_Success Started successfully. - * @retval kStatus_CSI_QueueFull Could not submit because there is no room in queue. - */ -status_t CSI_TransferSubmitEmptyBuffer(CSI_Type *base, csi_handle_t *handle, uint32_t frameBuffer); - -/*! - * @brief Get one full frame buffer from queue. - * - * After the transfer started using function @ref CSI_TransferStart, the incoming - * frames will be saved to the empty frame buffers in queue. This function gets - * the full-filled frame buffer from the queue. If there is no full frame buffer - * in queue, this function returns error. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the handle structure. - * @param frameBuffer Full frame buffer. - * - * @retval kStatus_Success Started successfully. - * @retval kStatus_CSI_NoFullBuffer There is no full frame buffer in queue. - */ -status_t CSI_TransferGetFullBuffer(CSI_Type *base, csi_handle_t *handle, uint32_t *frameBuffer); - -/*! - * @brief CSI IRQ handle function. - * - * This function handles the CSI IRQ request to work with CSI driver transactional - * APIs. - * - * @param base CSI peripheral base address. - * @param handle CSI handle pointer. - */ -void CSI_TransferHandleIRQ(CSI_Type *base, csi_handle_t *handle); -/* @} */ - -#else - -/*! - * @name Fragment mode - * @{ - */ - -/*! - * @brief Initialize the CSI to work in fragment mode. - * - * This function enables the CSI peripheral clock, and resets the CSI registers. - * - * @param base CSI peripheral base address. - */ -void CSI_FragModeInit(CSI_Type *base); - -/*! - * @brief De-initialize the CSI. - * - * This function disables the CSI peripheral clock. - * - * @param base CSI peripheral base address. - */ -void CSI_FragModeDeinit(CSI_Type *base); - -/*! - * @brief Create handle for CSI work in fragment mode. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the transactional handle. - * @param config Pointer to the configuration structure. - * @param callback Callback function for CSI transfer. - * @param userData Callback function parameter. - * - * @retval kStatus_Success Initialize successfully. - * @retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_FragModeCreateHandle(CSI_Type *base, - csi_frag_handle_t *handle, - const csi_frag_config_t *config, - csi_frag_transfer_callback_t callback, - void *userData); - -/*! - * @brief Start to capture a image. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the transactional handle. - * @param config Pointer to the capture configuration. - * - * @retval kStatus_Success Initialize successfully. - * @retval kStatus_InvalidArgument Initialize failed because of invalid argument. - */ -status_t CSI_FragModeTransferCaptureImage(CSI_Type *base, - csi_frag_handle_t *handle, - const csi_frag_capture_config_t *config); - -/*! - * @brief Abort image capture. - * - * Abort image capture initialized by @ref CSI_FragModeTransferCaptureImage. - * - * @param base CSI peripheral base address. - * @param handle Pointer to the transactional handle. - */ -void CSI_FragModeTransferAbortCaptureImage(CSI_Type *base, csi_frag_handle_t *handle); - -/*! - * @brief CSI IRQ handle function. - * - * This function handles the CSI IRQ request to work with CSI driver fragment mode - * APIs. - * - * @param base CSI peripheral base address. - * @param handle CSI handle pointer. - */ -void CSI_FragModeTransferHandleIRQ(CSI_Type *base, csi_frag_handle_t *handle); - -/* @} */ - -#endif /* CSI_DRIVER_FRAG_MODE */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_CSI_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_dcdc.c b/devices/MIMXRT1052/drivers/fsl_dcdc.c deleted file mode 100644 index d212c53..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dcdc.c +++ /dev/null @@ -1,920 +0,0 @@ -/* - * Copyright 2017-2020, NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_dcdc.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.dcdc_1" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for DCDC module. - * - * @param base DCDC peripheral base address - */ -static uint32_t DCDC_GetInstance(DCDC_Type *base); - -#if (defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK) -/*! - * @brief Convert the byte array to word. - * - * @param ptrArray Pointer to the byte array. - * @return The converted result. - */ -static uint32_t DCDC_ConvertByteArrayToWord(uint8_t *ptrArray); -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to DCDC bases for each instance. */ -static DCDC_Type *const s_dcdcBases[] = DCDC_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to DCDC clocks for each instance. */ -static const clock_ip_name_t s_dcdcClocks[] = DCDC_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t DCDC_GetInstance(DCDC_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_dcdcBases); instance++) - { - if (s_dcdcBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_dcdcBases)); - - return instance; -} - -#if (defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK) -static uint32_t DCDC_ConvertByteArrayToWord(uint8_t *ptrArray) -{ - assert(ptrArray != NULL); - - uint32_t temp32 = 0UL; - uint8_t index; - - for (index = 0U; index < 4U; index++) - { - temp32 |= ptrArray[index] << ((index % 4U) * 8U); - } - - return temp32; -} -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * brief Enable the access to DCDC registers. - * - * param base DCDC peripheral base address. - * param config Pointer to the configuration structure. - */ -void DCDC_Init(DCDC_Type *base, dcdc_config_t *config) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock. */ - CLOCK_EnableClock(s_dcdcClocks[DCDC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - uint32_t tmp32 = base->CTRL0; - - tmp32 |= DCDC_CTRL0_CONTROL_MODE(config->controlMode) | DCDC_CTRL0_TRIM_HOLD(config->trimInputMode); - - if (config->enableDcdcTimeout) - { - tmp32 |= DCDC_CTRL0_ENABLE_DCDC_CNT_MASK; - } - if (config->enableSwitchingConverterOutput) - { - tmp32 |= DCDC_CTRL0_DIG_EN_MASK; - } - base->CTRL0 |= DCDC_CTRL0_ENABLE_MASK; - base->CTRL0 = tmp32; -} -#else -/*! - * brief Enable the access to DCDC registers. - * - * param base DCDC peripheral base address. - */ -void DCDC_Init(DCDC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock. */ - CLOCK_EnableClock(s_dcdcClocks[DCDC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REG */ - -/*! - * brief Disable the access to DCDC registers. - * - * param base DCDC peripheral base address. - */ -void DCDC_Deinit(DCDC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the clock. */ - CLOCK_DisableClock(s_dcdcClocks[DCDC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * brief Get the default setting for DCDC user configuration structure. - * - * This function initializes the user configuration structure to a default value. The default values are: - * code - * config->controlMode = kDCDC_StaticControl; - * config->trimInputMode = kDCDC_SampleTrimInput; - * config->enableDcdcTimeout = false; - * config->enableSwitchingConverterOutput = false; - * endcode - * - * param config Pointer to configuration structure. See to "dcdc_config_t" - */ -void DCDC_GetDefaultConfig(DCDC_Type *base, dcdc_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->controlMode = kDCDC_StaticControl; - config->trimInputMode = kDCDC_SampleTrimInput; - config->enableDcdcTimeout = false; - config->enableSwitchingConverterOutput = false; -} - -/*! - * @brief Make DCDC enter into low power modes. - * - * @param base DCDC peripheral base address. - * @param mode DCDC low power mode selection. See to "_dcdc_low_power_mode" - */ -void DCDC_EnterLowPowerMode(DCDC_Type *base, dcdc_low_power_mode_t mode) -{ - switch (mode) - { - case kDCDC_StandbyMode: - base->CTRL0 |= DCDC_CTRL0_STBY_EN_MASK; - break; - case kDCDC_LowPowerMode: - base->CTRL0 |= DCDC_CTRL0_LP_MODE_EN_MASK; - break; - case kDCDC_GpcStandbyLowPowerMode: - base->CTRL0 |= DCDC_CTRL0_STBY_LP_MODE_EN_MASK; - break; - default: - assert(false); - break; - } -} -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REG */ - -/*! - * brief Configure the DCDC clock source. - * - * param base DCDC peripheral base address. - * param clockSource Clock source for DCDC. See to "dcdc_clock_source_t". - */ -void DCDC_SetClockSource(DCDC_Type *base, dcdc_clock_source_t clockSource) -{ - uint32_t tmp32; - - /* Configure the DCDC_REG0 register. */ - tmp32 = base->REG0 & ~(DCDC_REG0_XTAL_24M_OK_MASK | DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_MASK | - DCDC_REG0_SEL_CLK_MASK | DCDC_REG0_PWD_OSC_INT_MASK); - switch (clockSource) - { - case kDCDC_ClockInternalOsc: - tmp32 |= DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_MASK; - break; - case kDCDC_ClockExternalOsc: - /* Choose the external clock and disable the internal clock. */ - tmp32 |= DCDC_REG0_DISABLE_AUTO_CLK_SWITCH_MASK | DCDC_REG0_SEL_CLK_MASK | DCDC_REG0_PWD_OSC_INT_MASK; - break; - case kDCDC_ClockAutoSwitch: - /* Set to switch from internal ring osc to xtal 24M if auto mode is enabled. */ - tmp32 |= DCDC_REG0_XTAL_24M_OK_MASK; - break; - default: - assert(false); - break; - } - base->REG0 = tmp32; -} - -/*! - * brief Get the default setting for detection configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * code - * config->enableXtalokDetection = false; - * config->powerDownOverVoltageDetection = true; - * config->powerDownLowVlotageDetection = false; - * config->powerDownOverCurrentDetection = true; - * config->powerDownPeakCurrentDetection = true; - * config->powerDownZeroCrossDetection = true; - * config->OverCurrentThreshold = kDCDC_OverCurrentThresholdAlt0; - * config->PeakCurrentThreshold = kDCDC_PeakCurrentThresholdAlt0; - * endcode - * - * param config Pointer to configuration structure. See to "dcdc_detection_config_t" - */ -void DCDC_GetDefaultDetectionConfig(dcdc_detection_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableXtalokDetection = false; -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) - config->powerDownOverVoltageVdd1P8Detection = true; - config->powerDownOverVoltageVdd1P0Detection = true; -#else - config->powerDownOverVoltageDetection = true; -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ - config->powerDownLowVlotageDetection = false; - config->powerDownOverCurrentDetection = true; - config->powerDownPeakCurrentDetection = true; - config->powerDownZeroCrossDetection = true; - config->OverCurrentThreshold = kDCDC_OverCurrentThresholdAlt0; - config->PeakCurrentThreshold = kDCDC_PeakCurrentThresholdAlt0; -} - -/*! - * breif Configure the DCDC detection. - * - * param base DCDC peripheral base address. - * param config Pointer to configuration structure. See to "dcdc_detection_config_t" - */ -void DCDC_SetDetectionConfig(DCDC_Type *base, const dcdc_detection_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - /* Configure the DCDC_REG0 register. */ - tmp32 = base->REG0 & ~(DCDC_REG0_XTALOK_DISABLE_MASK -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) - | DCDC_REG0_PWD_HIGH_VDD1P8_DET_MASK | DCDC_REG0_PWD_HIGH_VDD1P0_DET_MASK -#else - | DCDC_REG0_PWD_HIGH_VOLT_DET_MASK -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ -#if defined(FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET) && FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET - | DCDC_REG0_PWD_CMP_DCDC_IN_DET_MASK -#else - | DCDC_REG0_PWD_CMP_BATT_DET_MASK -#endif /* FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET */ - | DCDC_REG0_PWD_OVERCUR_DET_MASK | DCDC_REG0_PWD_CUR_SNS_CMP_MASK | DCDC_REG0_PWD_ZCD_MASK | - DCDC_REG0_CUR_SNS_THRSH_MASK | DCDC_REG0_OVERCUR_TRIG_ADJ_MASK); - - tmp32 |= DCDC_REG0_CUR_SNS_THRSH(config->PeakCurrentThreshold) | - DCDC_REG0_OVERCUR_TRIG_ADJ(config->OverCurrentThreshold); - if (false == config->enableXtalokDetection) - { - tmp32 |= DCDC_REG0_XTALOK_DISABLE_MASK; - } -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) - if (config->powerDownOverVoltageVdd1P8Detection) - { - tmp32 |= DCDC_REG0_PWD_HIGH_VDD1P8_DET_MASK; - } - if (config->powerDownOverVoltageVdd1P0Detection) - { - tmp32 |= DCDC_REG0_PWD_HIGH_VDD1P0_DET_MASK; - } -#else - if (config->powerDownOverVoltageDetection) - { - tmp32 |= DCDC_REG0_PWD_HIGH_VOLT_DET_MASK; - } -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ - if (config->powerDownLowVlotageDetection) - { -#if defined(FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET) && FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET - tmp32 |= DCDC_REG0_PWD_CMP_DCDC_IN_DET_MASK; -#else - tmp32 |= DCDC_REG0_PWD_CMP_BATT_DET_MASK; -#endif /* FSL_FEATURE_DCDC_HAS_REG0_DCDC_IN_DET */ - } - if (config->powerDownOverCurrentDetection) - { - tmp32 |= DCDC_REG0_PWD_OVERCUR_DET_MASK; - } - if (config->powerDownPeakCurrentDetection) - { - tmp32 |= DCDC_REG0_PWD_CUR_SNS_CMP_MASK; - } - if (config->powerDownZeroCrossDetection) - { - tmp32 |= DCDC_REG0_PWD_ZCD_MASK; - } - base->REG0 = tmp32; -} - -/*! - * brief Get the default setting for low power configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * code - * config->enableOverloadDetection = true; - * config->enableAdjustHystereticValue = false; - * config->countChargingTimePeriod = kDCDC_CountChargingTimePeriod8Cycle; - * config->countChargingTimeThreshold = kDCDC_CountChargingTimeThreshold32; - * endcode - * - * param config Pointer to configuration structure. See to "dcdc_low_power_config_t" - */ -void DCDC_GetDefaultLowPowerConfig(dcdc_low_power_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); -#if !(defined(FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) && FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) - config->enableOverloadDetection = true; -#endif /* FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS */ - config->enableAdjustHystereticValue = false; - config->countChargingTimePeriod = kDCDC_CountChargingTimePeriod8Cycle; - config->countChargingTimeThreshold = kDCDC_CountChargingTimeThreshold32; -} - -/*! - * brief Configure the DCDC low power. - * - * param base DCDC peripheral base address. - * param config Pointer to configuration structure. See to "dcdc_low_power_config_t". - */ -void DCDC_SetLowPowerConfig(DCDC_Type *base, const dcdc_low_power_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - /* Configure the DCDC_REG0 register. */ - tmp32 = base->REG0 & - ~(DCDC_REG0_LP_HIGH_HYS_MASK | DCDC_REG0_LP_OVERLOAD_FREQ_SEL_MASK | DCDC_REG0_LP_OVERLOAD_THRSH_MASK -#if !(defined(FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) && FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) - | DCDC_REG0_EN_LP_OVERLOAD_SNS_MASK -#endif /* FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS */ - ); - tmp32 |= DCDC_REG0_LP_OVERLOAD_FREQ_SEL(config->countChargingTimePeriod) | - DCDC_REG0_LP_OVERLOAD_THRSH(config->countChargingTimeThreshold); -#if !(defined(FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) && FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) - if (config->enableOverloadDetection) - { - tmp32 |= DCDC_REG0_EN_LP_OVERLOAD_SNS_MASK; - } -#endif /* FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS */ - if (config->enableAdjustHystereticValue) - { - tmp32 |= DCDC_REG0_LP_HIGH_HYS_MASK; - } - base->REG0 = tmp32; -} - -/*! - * brief Get DCDC status flags. - * - * param base peripheral base address. - * return Mask of asserted status flags. See to "_dcdc_status_flags_t". - */ -uint32_t DCDC_GetstatusFlags(DCDC_Type *base) -{ - uint32_t tmp32 = 0U; - - if (DCDC_REG0_STS_DC_OK_MASK == (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - tmp32 |= (uint32_t)kDCDC_LockedOKStatus; - } - - return tmp32; -} - -#if !(defined(FSL_FEATURE_DCDC_HAS_NO_CURRENT_ALERT_FUNC) && FSL_FEATURE_DCDC_HAS_NO_CURRENT_ALERT_FUNC) -/*! - * brief Reset current alert signal. Alert signal is generate by peak current detection. - * - * param base DCDC peripheral base address. - * param enable Switcher to reset signal. True means reset signal. False means don't reset signal. - */ -void DCDC_ResetCurrentAlertSignal(DCDC_Type *base, bool enable) -{ - if (enable) - { - base->REG0 |= DCDC_REG0_CURRENT_ALERT_RESET_MASK; - } - else - { - base->REG0 &= ~DCDC_REG0_CURRENT_ALERT_RESET_MASK; - } -} -#endif /* FSL_FEATURE_DCDC_HAS_NO_CURRENT_ALERT_FUNC */ - -/*! - * brief Get the default setting for loop control configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * code - * config->enableCommonHysteresis = false; - * config->enableCommonThresholdDetection = false; - * config->enableInvertHysteresisSign = false; - * config->enableRCThresholdDetection = false; - * config->enableRCScaleCircuit = 0U; - * config->complementFeedForwardStep = 0U; - * config->controlParameterMagnitude = 2U; - * config->integralProportionalRatio = 2U; - * endcode - * - * param config Pointer to configuration structure. See to "dcdc_loop_control_config_t" - */ -void DCDC_GetDefaultLoopControlConfig(dcdc_loop_control_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableCommonHysteresis = false; - config->enableCommonThresholdDetection = false; - config->enableInvertHysteresisSign = false; - config->enableRCThresholdDetection = false; - config->enableRCScaleCircuit = 0U; - config->complementFeedForwardStep = 0U; - config->controlParameterMagnitude = 2U; - config->integralProportionalRatio = 2U; -} - -/*! - * brief Configure the DCDC loop control. - * - * param base DCDC peripheral base address. - * param config Pointer to configuration structure. See to "dcdc_loop_control_config_t". - */ -void DCDC_SetLoopControlConfig(DCDC_Type *base, const dcdc_loop_control_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - - /* Configure the DCDC_REG1 register. */ -#if defined(FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE) && \ - FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE - tmp32 = base->REG1 & ~(DCDC_REG1_LOOPCTRL_EN_DF_HYST_MASK | DCDC_REG1_LOOPCTRL_EN_CM_HYST_MASK | - DCDC_REG1_LOOPCTRL_DF_HST_THRESH_MASK | DCDC_REG1_LOOPCTRL_CM_HST_THRESH_MASK); - if (config->enableCommonHysteresis) - { - tmp32 |= DCDC_REG1_LOOPCTRL_EN_CM_HYST_MASK; - } - if (config->enableCommonThresholdDetection) - { - tmp32 |= DCDC_REG1_LOOPCTRL_CM_HST_THRESH_MASK; - } - if (config->enableDifferentialHysteresis) - { - tmp32 |= DCDC_REG1_LOOPCTRL_EN_DF_HYST_MASK; - } - if (config->enableDifferentialThresholdDetection) - { - tmp32 |= DCDC_REG1_LOOPCTRL_DF_HST_THRESH_MASK; - } -#else - tmp32 = base->REG1 & ~(DCDC_REG1_LOOPCTRL_EN_HYST_MASK | DCDC_REG1_LOOPCTRL_HST_THRESH_MASK); - if (config->enableCommonHysteresis) - { - tmp32 |= DCDC_REG1_LOOPCTRL_EN_HYST_MASK; - } - if (config->enableCommonThresholdDetection) - { - tmp32 |= DCDC_REG1_LOOPCTRL_HST_THRESH_MASK; - } -#endif /* FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE */ - base->REG1 = tmp32; - - /* configure the DCDC_REG2 register. */ - tmp32 = base->REG2 & ~(DCDC_REG2_LOOPCTRL_HYST_SIGN_MASK | DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_MASK | - DCDC_REG2_LOOPCTRL_EN_RCSCALE_MASK | DCDC_REG2_LOOPCTRL_DC_FF_MASK | - DCDC_REG2_LOOPCTRL_DC_R_MASK | DCDC_REG2_LOOPCTRL_DC_C_MASK); - tmp32 |= DCDC_REG2_LOOPCTRL_DC_FF(config->complementFeedForwardStep) | - DCDC_REG2_LOOPCTRL_DC_R(config->controlParameterMagnitude) | - DCDC_REG2_LOOPCTRL_DC_C(config->integralProportionalRatio) | - DCDC_REG2_LOOPCTRL_EN_RCSCALE(config->enableRCScaleCircuit); - if (config->enableInvertHysteresisSign) - { - tmp32 |= DCDC_REG2_LOOPCTRL_HYST_SIGN_MASK; - } - if (config->enableRCThresholdDetection) - { - tmp32 |= DCDC_REG2_LOOPCTRL_RCSCALE_THRSH_MASK; - } - base->REG2 = tmp32; -} - -/*! - * brief Configure for the min power. - * - * param base DCDC peripheral base address. - * param config Pointer to configuration structure. See to "dcdc_min_power_config_t". - */ -void DCDC_SetMinPowerConfig(DCDC_Type *base, const dcdc_min_power_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - - tmp32 = base->REG3 & ~DCDC_REG3_MINPWR_DC_HALFCLK_MASK; - if (config->enableUseHalfFreqForContinuous) - { - tmp32 |= DCDC_REG3_MINPWR_DC_HALFCLK_MASK; - } - base->REG3 = tmp32; -} - -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) -/*! - * brief Adjust the target voltage of VDD_SOC in run mode and low power mode. - * Do not use this function. It has been superceded by DCDC_AdjustRunTargetVoltage - * and DCDC_AdjustLowPowerTargetVoltage. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - * param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustTargetVoltage(DCDC_Type *base, uint32_t VDDRun, uint32_t VDDStandby, dcdc_voltage_output_sel_t sel) -{ - uint32_t tmp32; - - if (sel == kDCDC_VoltageOutput1P8) - { - /* Unlock the step for the VDD 1P8. */ - base->REG3 &= ~DCDC_REG3_VDD1P8CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~(DCDC_CTRL1_VDD1P8CTRL_STBY_TRG_MASK | DCDC_CTRL1_VDD1P8CTRL_TRG_MASK); - - tmp32 |= DCDC_CTRL1_VDD1P8CTRL_STBY_TRG(VDDStandby) | DCDC_CTRL1_VDD1P8CTRL_TRG(VDDRun); - base->CTRL1 = tmp32; - } - else if (sel == kDCDC_VoltageOutput1P0) - { - /* Unlock the step for the VDD 1P0. */ - base->REG3 &= ~DCDC_REG3_VDD1P0CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~(DCDC_CTRL1_VDD1P0CTRL_STBY_TRG_MASK | DCDC_CTRL1_VDD1P0CTRL_TRG_MASK); - - tmp32 |= DCDC_CTRL1_VDD1P0CTRL_STBY_TRG(VDDStandby) | DCDC_CTRL1_VDD1P0CTRL_TRG(VDDRun); - base->CTRL1 = tmp32; - } - else - { - ; /* Intentional empty */ - } - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} - -/*! - * brief Adjust the target voltage of VDD_SOC in run mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustRunTargetVoltage(DCDC_Type *base, uint32_t VDDRun, dcdc_voltage_output_sel_t sel) -{ - uint32_t tmp32; - - if (sel == kDCDC_VoltageOutput1P8) - { - /* Unlock the step for the VDD 1P8. */ - base->REG3 &= ~DCDC_REG3_VDD1P8CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~DCDC_CTRL1_VDD1P8CTRL_TRG_MASK; - - tmp32 |= DCDC_CTRL1_VDD1P8CTRL_TRG(VDDRun); - base->CTRL1 = tmp32; - } - else if (sel == kDCDC_VoltageOutput1P0) - { - /* Unlock the step for the VDD 1P0. */ - base->REG3 &= ~DCDC_REG3_VDD1P0CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~DCDC_CTRL1_VDD1P0CTRL_TRG_MASK; - - tmp32 |= DCDC_CTRL1_VDD1P0CTRL_TRG(VDDRun); - base->CTRL1 = tmp32; - } - else - { - ; /* Intentional empty */ - } - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} - -/*! - * brief Adjust the target voltage of VDD_SOC in low power mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - * param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustLowPowerTargetVoltage(DCDC_Type *base, uint32_t VDDStandby, dcdc_voltage_output_sel_t sel) -{ - uint32_t tmp32; - - if (sel == kDCDC_VoltageOutput1P8) - { - /* Unlock the step for the VDD 1P8. */ - base->REG3 &= ~DCDC_REG3_VDD1P8CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~(DCDC_CTRL1_VDD1P8CTRL_STBY_TRG_MASK); - - tmp32 |= DCDC_CTRL1_VDD1P8CTRL_STBY_TRG(VDDStandby); - base->CTRL1 = tmp32; - } - else if (sel == kDCDC_VoltageOutput1P0) - { - /* Unlock the step for the VDD 1P0. */ - base->REG3 &= ~DCDC_REG3_VDD1P0CTRL_DISABLE_STEP_MASK; - - /* Configure the DCDC_CTRL1 register. */ - tmp32 = base->CTRL1 & ~(DCDC_CTRL1_VDD1P0CTRL_STBY_TRG_MASK); - - tmp32 |= DCDC_CTRL1_VDD1P0CTRL_STBY_TRG(VDDStandby); - base->CTRL1 = tmp32; - } - else - { - ; /* Intentional empty */ - } - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} -#else - -/*! - * brief Adjust the target voltage of VDD_SOC in run mode and low power mode. - * Do not use this function. It has been superceded by DCDC_AdjustRunTargetVoltage - * and DCDC_AdjustLowPowerTargetVoltage - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - */ -void DCDC_AdjustTargetVoltage(DCDC_Type *base, uint32_t VDDRun, uint32_t VDDStandby) -{ - uint32_t tmp32; - - /* Unlock the step for the output. */ - base->REG3 &= ~DCDC_REG3_DISABLE_STEP_MASK; - - /* Configure the DCDC_REG3 register. */ - tmp32 = base->REG3 & ~(DCDC_REG3_TARGET_LP_MASK | DCDC_REG3_TRG_MASK); - - tmp32 |= DCDC_REG3_TARGET_LP(VDDStandby) | DCDC_REG3_TRG(VDDRun); - base->REG3 = tmp32; - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} - -/*! - * brief Adjust the target voltage of VDD_SOC in run mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - */ -void DCDC_AdjustRunTargetVoltage(DCDC_Type *base, uint32_t VDDRun) -{ - uint32_t tmp32; - - /* Unlock the step for the output. */ - base->REG3 &= ~DCDC_REG3_DISABLE_STEP_MASK; - - /* Configure the DCDC_REG3 register. */ - tmp32 = base->REG3 & ~DCDC_REG3_TRG_MASK; - - tmp32 |= DCDC_REG3_TRG(VDDRun); - base->REG3 = tmp32; - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} - -/*! - * brief Adjust the target voltage of VDD_SOC in low power mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * param base DCDC peripheral base address. - * param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - */ -void DCDC_AdjustLowPowerTargetVoltage(DCDC_Type *base, uint32_t VDDStandby) -{ - uint32_t tmp32; - - /* Unlock the step for the output. */ - base->REG3 &= ~DCDC_REG3_DISABLE_STEP_MASK; - - /* Configure the DCDC_REG3 register. */ - tmp32 = base->REG3 & ~DCDC_REG3_TARGET_LP_MASK; - - tmp32 |= DCDC_REG3_TARGET_LP(VDDStandby); - base->REG3 = tmp32; - - /* DCDC_STS_DC_OK bit will be de-asserted after target register changes. After output voltage is set to new - * target value, DCDC_STS_DC_OK will be asserted. */ - while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & base->REG0)) - { - } -} -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2 */ - -/*! - * brief Configure the DCDC internal regulator. - * - * param base DCDC peripheral base address. - * param config Pointer to configuration structure. See to "dcdc_internal_regulator_config_t". - */ -void DCDC_SetInternalRegulatorConfig(DCDC_Type *base, const dcdc_internal_regulator_config_t *config) -{ - assert(NULL != config); - - uint32_t tmp32; - -#if (defined(FSL_FEATURE_DCDC_HAS_REG3_FBK_SEL) && FSL_FEATURE_DCDC_HAS_REG3_FBK_SEL) - tmp32 = base->REG3 & ~DCDC_REG3_REG_FBK_SEL_MASK; - tmp32 |= DCDC_REG3_REG_FBK_SEL(config->feedbackPoint); - base->REG3 = tmp32; - - tmp32 = base->REG1 & ~DCDC_REG1_REG_RLOAD_SW_MASK; -#else - /* Configure the DCDC_REG1 register. */ - tmp32 = base->REG1 & ~(DCDC_REG1_REG_FBK_SEL_MASK | DCDC_REG1_REG_RLOAD_SW_MASK); - tmp32 |= DCDC_REG1_REG_FBK_SEL(config->feedbackPoint); -#endif /* FSL_FEATURE_DCDC_HAS_REG3_FBK_SEL */ - - if (config->enableLoadResistor) - { - tmp32 |= DCDC_REG1_REG_RLOAD_SW_MASK; - } - base->REG1 = tmp32; -} - -#if (defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK) -/*! - * brief Init DCDC module when the control mode selected as setpoint mode. - * - * note The function should be invoked in the initial step to config the - * DCDC via setpoint control mode. - * - * param base DCDC peripheral base address. - * param config The pointer to the structure @ref dcdc_setpoint_config_t. - */ -void DCDC_SetPointInit(DCDC_Type *base, const dcdc_setpoint_config_t *config) -{ - assert(config != NULL); - - /* Enable DCDC Dig Logic. */ - base->REG5 = config->enableDigLogicMap; - - /* Set DCDC power mode. */ - base->REG6 = config->lowpowerMap; - base->REG7 = config->standbyMap; - base->REG7P = config->standbyLowpowerMap; - - /* Set target voltage of VDD1P8 in buck mode. */ - base->REG8 = DCDC_ConvertByteArrayToWord(config->buckVDD1P8TargetVoltage); - base->REG9 = DCDC_ConvertByteArrayToWord(config->buckVDD1P8TargetVoltage + 4U); - base->REG10 = DCDC_ConvertByteArrayToWord(config->buckVDD1P8TargetVoltage + 8U); - base->REG11 = DCDC_ConvertByteArrayToWord(config->buckVDD1P8TargetVoltage + 12U); - - /* Set target voltage of VDD1P0 in buck mode. */ - base->REG12 = DCDC_ConvertByteArrayToWord(config->buckVDD1P0TargetVoltage); - base->REG13 = DCDC_ConvertByteArrayToWord(config->buckVDD1P0TargetVoltage + 4U); - base->REG14 = DCDC_ConvertByteArrayToWord(config->buckVDD1P0TargetVoltage + 8U); - base->REG15 = DCDC_ConvertByteArrayToWord(config->buckVDD1P0TargetVoltage + 12U); - - /* Set target voltage of VDD1P8 in low power mode. */ - base->REG16 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P8TargetVoltage); - base->REG17 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P8TargetVoltage + 4U); - base->REG18 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P8TargetVoltage + 8U); - base->REG19 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P8TargetVoltage + 12U); - - /* Set target voltage of VDD1P0 in low power mode. */ - base->REG20 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P0TargetVoltage); - base->REG21 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P0TargetVoltage + 4U); - base->REG22 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P0TargetVoltage + 8U); - base->REG23 = DCDC_ConvertByteArrayToWord(config->standbyVDD1P0TargetVoltage + 12U); - - /* Enable DCDC module. */ - base->REG4 = config->enableDCDCMap; -} -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -/*! - * brief Boot DCDC into DCM(discontinous conduction mode). - * - * pwd_zcd=0x0; - * pwd_cmp_offset=0x0; - * dcdc_loopctrl_en_rcscale= 0x5; - * DCM_set_ctrl=1'b1; - * - * param base DCDC peripheral base address. - */ -void DCDC_BootIntoDCM(DCDC_Type *base) -{ - base->REG0 &= ~(DCDC_REG0_PWD_ZCD_MASK | DCDC_REG0_PWD_CMP_OFFSET_MASK); - base->REG2 = (~DCDC_REG2_LOOPCTRL_EN_RCSCALE_MASK & base->REG2) | DCDC_REG2_LOOPCTRL_EN_RCSCALE(0x5U) | - DCDC_REG2_DCM_SET_CTRL_MASK; -} - -/*! - * brief Boot DCDC into CCM(continous conduction mode). - * - * pwd_zcd=0x1; - * pwd_cmp_offset=0x0; - * dcdc_loopctrl_en_rcscale=0x3; - * - * param base DCDC peripheral base address. - */ -void DCDC_BootIntoCCM(DCDC_Type *base) -{ - base->REG0 = (~DCDC_REG0_PWD_CMP_OFFSET_MASK & base->REG0) | DCDC_REG0_PWD_ZCD_MASK; - base->REG2 = (~DCDC_REG2_LOOPCTRL_EN_RCSCALE_MASK & base->REG2) | DCDC_REG2_LOOPCTRL_EN_RCSCALE(0x3U); -} diff --git a/devices/MIMXRT1052/drivers/fsl_dcdc.h b/devices/MIMXRT1052/drivers/fsl_dcdc.h deleted file mode 100644 index 5808104..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dcdc.h +++ /dev/null @@ -1,760 +0,0 @@ -/* - * Copyright 2017-2020, NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef __FSL_DCDC_H__ -#define __FSL_DCDC_H__ - -#include "fsl_common.h" - -/*! - * @addtogroup dcdc - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/*! @brief DCDC driver version. */ -#define FSL_DCDC_DRIVER_VERSION (MAKE_VERSION(2, 2, 1)) /*!< Version 2.2.1. */ - -/*! - * @brief DCDC status flags. - */ -enum _dcdc_status_flags_t -{ - kDCDC_LockedOKStatus = (1U << 0U), /*!< Indicate DCDC status. 1'b1: DCDC already settled 1'b0: DCDC is settling. */ -}; - -/*! - * @brief The current bias of low power comparator. - */ -typedef enum _dcdc_comparator_current_bias -{ - kDCDC_ComparatorCurrentBias50nA = 0U, /*!< The current bias of low power comparator is 50nA. */ - kDCDC_ComparatorCurrentBias100nA = 1U, /*!< The current bias of low power comparator is 100nA. */ - kDCDC_ComparatorCurrentBias200nA = 2U, /*!< The current bias of low power comparator is 200nA. */ - kDCDC_ComparatorCurrentBias400nA = 3U, /*!< The current bias of low power comparator is 400nA. */ -} dcdc_comparator_current_bias_t; - -/*! - * @brief The threshold of over current detection. - */ -typedef enum _dcdc_over_current_threshold -{ - kDCDC_OverCurrentThresholdAlt0 = 0U, /*!< 1A in the run mode, 0.25A in the power save mode. */ - kDCDC_OverCurrentThresholdAlt1 = 1U, /*!< 2A in the run mode, 0.25A in the power save mode. */ - kDCDC_OverCurrentThresholdAlt2 = 2U, /*!< 1A in the run mode, 0.2A in the power save mode. */ - kDCDC_OverCurrentThresholdAlt3 = 3U, /*!< 2A in the run mode, 0.2A in the power save mode. */ -} dcdc_over_current_threshold_t; - -/*! - * @brief The threshold if peak current detection. - */ -typedef enum _dcdc_peak_current_threshold -{ - kDCDC_PeakCurrentThresholdAlt0 = 0U, /*!< 150mA peak current threshold. */ - kDCDC_PeakCurrentThresholdAlt1 = 1U, /*!< 250mA peak current threshold. */ - kDCDC_PeakCurrentThresholdAlt2 = 2U, /*!< 350mA peak current threshold. */ - kDCDC_PeakCurrentThresholdAlt3 = 3U, /*!< 450mA peak current threshold. */ - kDCDC_PeakCurrentThresholdAlt4 = 4U, /*!< 550mA peak current threshold. */ - kDCDC_PeakCurrentThresholdAlt5 = 5U, /*!< 650mA peak current threshold. */ -} dcdc_peak_current_threshold_t; - -/*! - * @brief The period of counting the charging times in power save mode. - */ -typedef enum _dcdc_count_charging_time_period -{ - kDCDC_CountChargingTimePeriod8Cycle = 0U, /*!< Eight 32k cycle. */ - kDCDC_CountChargingTimePeriod16Cycle = 1U, /*!< Sixteen 32k cycle. */ -} dcdc_count_charging_time_period_t; - -/*! - * @brief The threshold of the counting number of charging times - */ -typedef enum _dcdc_count_charging_time_threshold -{ - kDCDC_CountChargingTimeThreshold32 = 0U, /*!< 0x0: 32. */ - kDCDC_CountChargingTimeThreshold64 = 1U, /*!< 0x1: 64. */ - kDCDC_CountChargingTimeThreshold16 = 2U, /*!< 0x2: 16. */ - kDCDC_CountChargingTimeThreshold8 = 3U, /*!< 0x3: 8. */ -} dcdc_count_charging_time_threshold_t; - -/*! - * @brief Oscillator clock option. - */ -typedef enum _dcdc_clock_source -{ - kDCDC_ClockAutoSwitch = 0U, /*!< Automatic clock switch from internal oscillator to external clock. */ - kDCDC_ClockInternalOsc = 1U, /*!< Use internal oscillator. */ - kDCDC_ClockExternalOsc = 2U, /*!< Use external 24M crystal oscillator. */ -} dcdc_clock_source_t; - -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) -/*! - * @brief Voltage output option. - */ -typedef enum _dcdc_voltage_output_sel -{ - kDCDC_VoltageOutput1P8 = 0U, /*!< 1.8V output. */ - kDCDC_VoltageOutput1P0 = 1U, /*!< 1.0V output. */ -} dcdc_voltage_output_sel_t; -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * @brief DCDC low power modes. - */ -typedef enum _dcdc_low_power_mode -{ - kDCDC_StandbyMode = 0U, /*!< Standby mode. */ - kDCDC_LowPowerMode = 1U, /*!< Low power mode. */ - kDCDC_GpcStandbyLowPowerMode = 2U, /*!< low power mode for GPC standby request. */ -} dcdc_low_power_mode_t; - -/*! - * @brief DCDC control mode. - */ -typedef enum _dcdc_control_mode -{ - kDCDC_StaticControl = 0U, /*!< Static control. */ - kDCDC_SetPointControl = 1U, /*!< Controlled by GPC set points. */ -} dcdc_control_mode_t; - -/*! - * @brief DCDC trim input mode. - */ -typedef enum _dcdc_trim_input_mode -{ - kDCDC_SampleTrimInput = 0U, /*!< Sample trim input. */ - kDCDC_HoldTrimInput = 1U, /*!< Hold trim input. */ -} dcdc_trim_input_mode_t; - -#if defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK -/*! - * @brief System setpoints enumeration. - */ -enum _dcdc_setpoint_map -{ - kDCDC_SetPoint0 = 1UL << 0UL, /*!< Set point 0. */ - kDCDC_SetPoint1 = 1UL << 1UL, /*!< Set point 1. */ - kDCDC_SetPoint2 = 1UL << 2UL, /*!< Set point 2. */ - kDCDC_SetPoint3 = 1UL << 3UL, /*!< Set point 3. */ - kDCDC_SetPoint4 = 1UL << 4UL, /*!< Set point 4. */ - kDCDC_SetPoint5 = 1UL << 5UL, /*!< Set point 5. */ - kDCDC_SetPoint6 = 1UL << 6UL, /*!< Set point 6. */ - kDCDC_SetPoint7 = 1UL << 7UL, /*!< Set point 7. */ - kDCDC_SetPoint8 = 1UL << 8UL, /*!< Set point 8. */ - kDCDC_SetPoint9 = 1UL << 9UL, /*!< Set point 9. */ - kDCDC_SetPoint10 = 1UL << 10UL, /*!< Set point 10. */ - kDCDC_SetPoint11 = 1UL << 11UL, /*!< Set point 11. */ - kDCDC_SetPoint12 = 1UL << 12UL, /*!< Set point 12. */ - kDCDC_SetPoint13 = 1UL << 13UL, /*!< Set point 13. */ - kDCDC_SetPoint14 = 1UL << 14UL, /*!< Set point 14. */ - kDCDC_SetPoint15 = 1UL << 15UL /*!< Set point 15. */ -}; -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -/*! - * @brief Configuration for DCDC. - */ -typedef struct _dcdc_config -{ - dcdc_control_mode_t controlMode; /*!< DCDC control mode. */ - dcdc_trim_input_mode_t trimInputMode; /*!< Hold trim input. */ - bool enableDcdcTimeout; /*!< Enable internal count for DCDC_OK timeout. */ - bool enableSwitchingConverterOutput; /*!< Enable the VDDIO switching converter output.*/ -} dcdc_config_t; -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REGp */ - -/*! - * @brief Configuration for DCDC detection. - */ -typedef struct _dcdc_detection_config -{ - bool enableXtalokDetection; /*!< Enable xtalok detection circuit. */ -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) - bool powerDownOverVoltageVdd1P8Detection; /*!< Power down over-voltage detection comparator for VDD1P8. */ - bool powerDownOverVoltageVdd1P0Detection; /*!< Power down over-voltage detection comparator for VDD1P0. */ -#else - bool powerDownOverVoltageDetection; /*!< Power down over-voltage detection comparator. */ -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ - bool powerDownLowVlotageDetection; /*!< Power down low-voltage detection comparator. */ - bool powerDownOverCurrentDetection; /*!< Power down over-current detection. */ - bool powerDownPeakCurrentDetection; /*!< Power down peak-current detection. */ - bool powerDownZeroCrossDetection; /*!< Power down the zero cross detection function for discontinuous conductor - mode. */ - dcdc_over_current_threshold_t OverCurrentThreshold; /*!< The threshold of over current detection. */ - dcdc_peak_current_threshold_t PeakCurrentThreshold; /*!< The threshold of peak current detection. */ -} dcdc_detection_config_t; - -/*! - * @brief Configuration for the loop control. - */ -typedef struct _dcdc_loop_control_config -{ - bool enableCommonHysteresis; /*!< Enable hysteresis in switching converter common mode analog comparators. - This feature will improve transient supply ripple and efficiency. */ - bool enableCommonThresholdDetection; /*!< Increase the threshold detection for common mode analog comparator. */ -#if defined(FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE) && \ - FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE - bool enableDifferentialHysteresis; /*!< Enable hysteresis in switching converter differential mode analog - comparators. This feature will improve transient supply ripple and - efficiency. */ - bool enableDifferentialThresholdDetection; /*!< Increase the threshold detection for differential mode analog - comparators. */ -#endif /* FSL_FEATURE_DCDC_HAS_SWITCHING_CONVERTER_DIFFERENTIAL_MODE */ - bool enableInvertHysteresisSign; /*!< Invert the sign of the hysteresis in DC-DC analog comparators. */ - bool enableRCThresholdDetection; /*!< Increase the threshold detection for RC scale circuit. */ - uint32_t enableRCScaleCircuit; /*!< Available range is 0~7. Enable analog circuit of DC-DC converter to respond - faster under transient load conditions. */ - uint32_t complementFeedForwardStep; /*!< Available range is 0~7. Two's complement feed forward step in duty cycle in - the switching DC-DC converter. Each time this field makes a transition from - 0x0, the loop filter of the DC-DC converter is stepped once by a value - proportional to the change. This can be used to force a certain control loop - behavior, such as improving response under known heavy load transients. */ - uint32_t controlParameterMagnitude; /*!< Available range is 0~15. Magnitude of proportional control parameter in the - switching DC-DC converter control loop. */ - uint32_t integralProportionalRatio; /*!< Available range is 0~3.Ratio of integral control parameter to proportional - control parameter in the switching DC-DC converter, and can be used to - optimize efficiency and loop response. */ -} dcdc_loop_control_config_t; -/*! - * @brief Configuration for DCDC low power. - */ -typedef struct _dcdc_low_power_config -{ -#if !(defined(FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) && FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS) - bool enableOverloadDetection; /*!< Enable the overload detection in power save mode, if current is larger than the - overloading threshold (typical value is 50 mA), DCDC will switch to the run mode - automatically. */ -#endif /* FSL_FEATURE_DCDC_HAS_NO_REG0_EN_LP_OVERLOAD_SNS */ - bool enableAdjustHystereticValue; /*!< Adjust hysteretic value in low power from 12.5mV to 25mV. */ - dcdc_count_charging_time_period_t - countChargingTimePeriod; /*!< The period of counting the charging times in power save mode. */ - dcdc_count_charging_time_threshold_t - countChargingTimeThreshold; /*!< the threshold of the counting number of charging times during - the period that lp_overload_freq_sel sets in power save mode. */ -} dcdc_low_power_config_t; - -/*! - * @brief Configuration for DCDC internal regulator. - */ -typedef struct _dcdc_internal_regulator_config -{ - bool enableLoadResistor; /*!< control the load resistor of the internal regulator of DCDC, the load resistor is - connected as default "true", and need set to "false" to disconnect the load - resistor. */ - uint32_t feedbackPoint; /*!< Available range is 0~3. Select the feedback point of the internal regulator. */ -} dcdc_internal_regulator_config_t; - -/*! - * @brief Configuration for min power setting. - */ -typedef struct _dcdc_min_power_config -{ - bool enableUseHalfFreqForContinuous; /*!< Set DCDC clock to half frequency for the continuous mode. */ -} dcdc_min_power_config_t; - -#if defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK -/*! - * @brief DCDC configuration in set point mode. - */ -typedef struct _dcdc_setpoint_config -{ - uint32_t enableDCDCMap; /*!< The setpoint map that enable the DCDC module. Should be the OR'ed value of @ref - _dcdc_setpoint_map. */ - uint32_t enableDigLogicMap; /*!< The setpoint map that enable the DCDC dig logic. Should be the OR'ed value of @ref - _dcdc_setpoint_map. */ - uint32_t lowpowerMap; /*!< The setpoint map that enable the DCDC Low powermode. Should be the OR'ed value of @ref - _dcdc_setpoint_map. */ - uint32_t standbyMap; /*!< The setpoint map that enable the DCDC standby mode. Should be the OR'ed value of @ref - _dcdc_setpoint_map. */ - uint32_t standbyLowpowerMap; /*!< The setpoint map that enable the DCDC low power mode, when the related setpoint is - in standby mode. - @ref _dcdc_setpoint_map. */ - uint8_t *buckVDD1P8TargetVoltage; /*!< Point to the array that store the target voltage level of VDD1P8 in buck - mode. Note that the pointed array must have 16 elements. */ - uint8_t *buckVDD1P0TargetVoltage; /*!< Point to the array that store the target voltage level of VDD1P0 in buck - mode. Note that the pointed array must have 16 elements. */ - uint8_t *standbyVDD1P8TargetVoltage; /*!< Point to the array that store the target voltage level of VDD1P8 in - standby mode. Note that the pointed array must have 16 elements. */ - uint8_t *standbyVDD1P0TargetVoltage; /*!< Point to the array that store the target voltage level of VDD1P0 in - standby mode. Note that the pointed array must have 16 elements. */ -} dcdc_setpoint_config_t; - -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/******************************************************************************* - * API - ******************************************************************************/ -/*! - * @name Initialization and deinitialization - * @{ - */ - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * @brief Enable the access to DCDC registers. - * - * @param base DCDC peripheral base address. - * @param config Pointer to the configuration structure. - */ -void DCDC_Init(DCDC_Type *base, dcdc_config_t *config); -#else -/*! - * @brief Enable the access to DCDC registers. - * - * @param base DCDC peripheral base address. - */ -void DCDC_Init(DCDC_Type *base); -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REG */ - -/*! - * @brief Disable the access to DCDC registers. - * - * @param base DCDC peripheral base address. - */ -void DCDC_Deinit(DCDC_Type *base); - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * brief Get the default setting for DCDC user configuration structure. - * - * This function initializes the user configuration structure to a default value. The default values are: - * code - * config->controlMode = kDCDC_StaticControl; - * config->trimInputMode = kDCDC_SampleTrimInput; - * config->enableDcdcTimeout = false; - * config->enableSwitchingConverterOutput = false; - * endcode - * - * param config Pointer to configuration structure. See to "dcdc_config_t" - */ -void DCDC_GetDefaultConfig(DCDC_Type *base, dcdc_config_t *config); -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REGp */ - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Get DCDC status flags. - * - * @param base peripheral base address. - * @return Mask of asserted status flags. See to "_dcdc_status_flags_t". - */ -uint32_t DCDC_GetstatusFlags(DCDC_Type *base); - -/* @} */ - -/*! - * @name Misc control - * @{ - */ - -#if defined(FSL_FEATURE_DCDC_HAS_CTRL_REG) && FSL_FEATURE_DCDC_HAS_CTRL_REG -/*! - * @brief Make DCDC enter into low power modes. - * - * @param base DCDC peripheral base address. - * @param mode DCDC low power mode selection. See to "_dcdc_low_power_mode" - */ -void DCDC_EnterLowPowerMode(DCDC_Type *base, dcdc_low_power_mode_t mode); -#endif /* FSL_FEATURE_DCDC_HAS_CTRL_REG */ - -/*! - * @brief Enable the output range comparator. - * - * The output range comparator is disabled by default. - * - * @param base DCDC peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void DCDC_EnableOutputRangeComparator(DCDC_Type *base, bool enable) -{ - if (enable) - { - base->REG0 &= ~DCDC_REG0_PWD_CMP_OFFSET_MASK; - } - else - { - base->REG0 |= DCDC_REG0_PWD_CMP_OFFSET_MASK; - } -} - -/*! - * @brief Configure the DCDC clock source. - * - * @param base DCDC peripheral base address. - * @param clockSource Clock source for DCDC. See to "dcdc_clock_source_t". - */ -void DCDC_SetClockSource(DCDC_Type *base, dcdc_clock_source_t clockSource); - -/*! - * @brief Get the default setting for detection configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * @code - * config->enableXtalokDetection = false; - * config->powerDownOverVoltageDetection = true; - * config->powerDownLowVlotageDetection = false; - * config->powerDownOverCurrentDetection = true; - * config->powerDownPeakCurrentDetection = true; - * config->powerDownZeroCrossDetection = true; - * config->OverCurrentThreshold = kDCDC_OverCurrentThresholdAlt0; - * config->PeakCurrentThreshold = kDCDC_PeakCurrentThresholdAlt0; - * @endcode - * - * @param config Pointer to configuration structure. See to "dcdc_detection_config_t" - */ -void DCDC_GetDefaultDetectionConfig(dcdc_detection_config_t *config); - -/*! - * @brief Configure the DCDC detection. - * - * @param base DCDC peripheral base address. - * @param config Pointer to configuration structure. See to "dcdc_detection_config_t" - */ -void DCDC_SetDetectionConfig(DCDC_Type *base, const dcdc_detection_config_t *config); - -/*! - * @brief Get the default setting for low power configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * @code - * config->enableOverloadDetection = true; - * config->enableAdjustHystereticValue = false; - * config->countChargingTimePeriod = kDCDC_CountChargingTimePeriod8Cycle; - * config->countChargingTimeThreshold = kDCDC_CountChargingTimeThreshold32; - * @endcode - * - * @param config Pointer to configuration structure. See to "dcdc_low_power_config_t" - */ -void DCDC_GetDefaultLowPowerConfig(dcdc_low_power_config_t *config); - -/*! - * @brief Configure the DCDC low power. - * - * @param base DCDC peripheral base address. - * @param config Pointer to configuration structure. See to "dcdc_low_power_config_t". - */ -void DCDC_SetLowPowerConfig(DCDC_Type *base, const dcdc_low_power_config_t *config); - -/*! - * @brief Reset current alert signal. Alert signal is generate by peak current detection. - * - * @param base DCDC peripheral base address. - * @param enable Switcher to reset signal. True means reset signal. False means don't reset signal. - */ -void DCDC_ResetCurrentAlertSignal(DCDC_Type *base, bool enable); - -/*! - * @brief Set the bangap trim value to trim bandgap voltage. - * - * @param base DCDC peripheral base address. - * @param trimValue The bangap trim value. Available range is 0U-31U. - */ -static inline void DCDC_SetBandgapVoltageTrimValue(DCDC_Type *base, uint32_t trimValue) -{ - base->REG1 &= ~DCDC_REG1_VBG_TRIM_MASK; - base->REG1 |= DCDC_REG1_VBG_TRIM(trimValue); -} - -/*! - * @brief Get the default setting for loop control configuration. - * - * The default configuration are set according to responding registers' setting when powered on. - * They are: - * @code - * config->enableCommonHysteresis = false; - * config->enableCommonThresholdDetection = false; - * config->enableInvertHysteresisSign = false; - * config->enableRCThresholdDetection = false; - * config->enableRCScaleCircuit = 0U; - * config->complementFeedForwardStep = 0U; - * config->controlParameterMagnitude = 2U; - * config->integralProportionalRatio = 2U; - * @endcode - * - * @param config Pointer to configuration structure. See to "dcdc_loop_control_config_t" - */ -void DCDC_GetDefaultLoopControlConfig(dcdc_loop_control_config_t *config); - -/*! - * @brief Configure the DCDC loop control. - * - * @param base DCDC peripheral base address. - * @param config Pointer to configuration structure. See to "dcdc_loop_control_config_t". - */ -void DCDC_SetLoopControlConfig(DCDC_Type *base, const dcdc_loop_control_config_t *config); - -/*! - * @brief Configure for the min power. - * - * @param base DCDC peripheral base address. - * @param config Pointer to configuration structure. See to "dcdc_min_power_config_t". - */ -void DCDC_SetMinPowerConfig(DCDC_Type *base, const dcdc_min_power_config_t *config); - -/*! - * @brief Set the current bias of low power comparator. - * - * @param base DCDC peripheral base address. - * @param biasVaule The current bias of low power comparator. Refer to "dcdc_comparator_current_bias_t". - */ -static inline void DCDC_SetLPComparatorBiasValue(DCDC_Type *base, dcdc_comparator_current_bias_t biasVaule) -{ - base->REG1 &= ~DCDC_REG1_LP_CMP_ISRC_SEL_MASK; - base->REG1 |= DCDC_REG1_LP_CMP_ISRC_SEL(biasVaule); -} - -#if (defined(FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT) && (FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT == 2)) -/*! - * @brief Lock VDD 1P0 target voltage. - * - * @param base DCDC peripheral base address. - */ -static inline void DCDC_LockVdd1p0TargetVoltage(DCDC_Type *base) -{ - base->REG3 |= DCDC_REG3_VDD1P0CTRL_DISABLE_STEP_MASK; -} - -/*! - * @brief Lock VDD 1P8 target voltage. - * - * @param base DCDC peripheral base address. - */ -static inline void DCDC_LockVdd1p8TargetVoltage(DCDC_Type *base) -{ - base->REG3 |= DCDC_REG3_VDD1P8CTRL_DISABLE_STEP_MASK; -} - -/*! - * @brief Adjust the target voltage of VDD_SOC in run mode and low power mode. - * @deprecated Do not use this function. It has been superceded by @ref DCDC_AdjustRunTargetVoltage - * and @ref DCDC_AdjustLowPowerTargetVoltage - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * @param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - * @param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustTargetVoltage(DCDC_Type *base, uint32_t VDDRun, uint32_t VDDStandby, dcdc_voltage_output_sel_t sel); - -/*! - * @brief Adjust the target voltage of VDD_SOC in run mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * @param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustRunTargetVoltage(DCDC_Type *base, uint32_t VDDRun, dcdc_voltage_output_sel_t sel); - -/*! - * @brief Adjust the target voltage of VDD_SOC in low power mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - * @param sel sel DCDC target voltage output selection. See to "_dcdc_voltage_output_sel". - */ -void DCDC_AdjustLowPowerTargetVoltage(DCDC_Type *base, uint32_t VDDStandby, dcdc_voltage_output_sel_t sel); -#else - -/*! - * @brief Lock target voltage. - * - * @param base DCDC peripheral base address. - */ -static inline void DCDC_LockTargetVoltage(DCDC_Type *base) -{ - base->REG3 |= DCDC_REG3_DISABLE_STEP_MASK; -} - -/*! - * @brief Adjust the target voltage of VDD_SOC in run mode and low power mode. - * @deprecated Do not use this function. It has been superceded by @ref DCDC_AdjustRunTargetVoltage - * and @ref DCDC_AdjustLowPowerTargetVoltage - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - * @param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - */ -void DCDC_AdjustTargetVoltage(DCDC_Type *base, uint32_t VDDRun, uint32_t VDDStandby); - -/*! - * @brief Adjust the target voltage of VDD_SOC in run mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDRun Target value in run mode. 25 mV each step from 0x00 to 0x1F. 00 is for 0.8V, 0x1F is for 1.575V. - */ -void DCDC_AdjustRunTargetVoltage(DCDC_Type *base, uint32_t VDDRun); - -/*! - * @brief Adjust the target voltage of VDD_SOC in low power mode. - * - * This function is to adjust the target voltage of DCDC output. Change them and finally wait until the output is - * stabled. - * Set the target value of run mode the same as low power mode before entering power save mode, because DCDC will switch - * back to run mode if it detects the current loading is larger than about 50 mA(typical value). - * - * @param base DCDC peripheral base address. - * @param VDDStandby Target value in low power mode. 25 mV each step from 0x00 to 0x4. 00 is for 0.9V, 0x4 is for 1.0V. - */ -void DCDC_AdjustLowPowerTargetVoltage(DCDC_Type *base, uint32_t VDDStandby); -#endif /* FSL_FEATURE_DCDC_VDD_OUTPUT_COUNT */ - -/*! - * @brief Configure the DCDC internal regulator. - * - * @param base DCDC peripheral base address. - * @param config Pointer to configuration structure. See to "dcdc_internal_regulator_config_t". - */ -void DCDC_SetInternalRegulatorConfig(DCDC_Type *base, const dcdc_internal_regulator_config_t *config); - -/*! - * @brief Ajust delay to reduce ground noise. - * - * @param base DCDC peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void DCDC_EnableAdjustDelay(DCDC_Type *base, bool enable) -{ - if (enable) - { - base->REG3 |= DCDC_REG3_MISC_DELAY_TIMING_MASK; - } - else - { - base->REG3 &= ~DCDC_REG3_MISC_DELAY_TIMING_MASK; - } -} - -/*! - * @brief Enable/Disable to improve the transition from heavy load to light load. It is valid while zero - * cross detection is enabled. If ouput exceeds the threshold, DCDC would return CCM from DCM. - * - * @param base DCDC peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void DCDC_EnableImproveTransition(DCDC_Type *base, bool enable) -{ - if (enable) - { - base->REG2 |= DCDC_REG2_DCM_SET_CTRL_MASK; - } - else - { - base->REG2 &= ~DCDC_REG2_DCM_SET_CTRL_MASK; - } -} - -/* @} */ - -#if defined(DCDC_REG4_ENABLE_SP_MASK) && DCDC_REG4_ENABLE_SP_MASK -/*! - * @name Setpoint mode APIs - */ - -/*! - * @brief Init DCDC module when the control mode selected as setpoint mode. - * - * @note The function should be invoked in the initial step to config the - * DCDC via setpoint control mode. - * - * @param base DCDC peripheral base address. - * @param config The pointer to the structure @ref dcdc_setpoint_config_t. - */ -void DCDC_SetPointInit(DCDC_Type *base, const dcdc_setpoint_config_t *config); - -/*! - * @brief Disable DCDC module when the control mode selected as setpoint mode. - * - * @param base DCDC peripheral base address. - * @param setpointMap. The map of the setpoint to disable the DCDC module. - * Should be the OR'ed value of _dcdc_setpoint_map. - */ -static inline void DCDC_SetPointDeinit(DCDC_Type *base, uint32_t setpointMap) -{ - base->REG4 &= ~setpointMap; -} - -/* @} */ -#endif /* DCDC_REG4_ENABLE_SP_MASK */ - -/*! - * @name Application guideline - * @{ - */ - -/*! - * @brief Boot DCDC into DCM(discontinous conduction mode). - * - * pwd_zcd=0x0; - * pwd_cmp_offset=0x0; - * dcdc_loopctrl_en_rcscale= 0x5; - * DCM_set_ctrl=1'b1; - * - * @param base DCDC peripheral base address. - */ -void DCDC_BootIntoDCM(DCDC_Type *base); - -/*! - * @brief Boot DCDC into CCM(continous conduction mode). - * - * pwd_zcd=0x1; - * pwd_cmp_offset=0x0; - * dcdc_loopctrl_en_rcscale=0x3; - * - * @param base DCDC peripheral base address. - */ -void DCDC_BootIntoCCM(DCDC_Type *base); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/* @} */ - -#endif /* __FSL_DCDC_H__ */ diff --git a/devices/MIMXRT1052/drivers/fsl_dcp.c b/devices/MIMXRT1052/drivers/fsl_dcp.c deleted file mode 100644 index a0b82ba..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dcp.c +++ /dev/null @@ -1,1461 +0,0 @@ -/* - * Copyright 2017-2019 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_dcp.h" -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) -#include "fsl_cache.h" -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.dcp" -#endif - -/*! Compile time sizeof() check */ -#define BUILD_ASSURE(condition, msg) extern int msg[1 - 2 * (!(condition))] __attribute__((unused)) - -#define dcp_memcpy memcpy - -/*! Internal states of the HASH creation process */ -typedef enum _dcp_hash_algo_state -{ - kDCP_StateHashInit = 1u, /*!< Init state. */ - kDCP_StateHashUpdate, /*!< Update state. */ -} dcp_hash_algo_state_t; - -/*! multiple of 64-byte block represented as byte array of 32-bit words */ -typedef union _dcp_hash_block -{ - uint32_t w[DCP_HASH_BLOCK_SIZE / 4]; /*!< array of 32-bit words */ - uint8_t b[DCP_HASH_BLOCK_SIZE]; /*!< byte array */ -} dcp_hash_block_t; - -/*! internal dcp_hash context structure */ -typedef struct _dcp_hash_ctx_internal -{ - dcp_hash_block_t blk; /*!< memory buffer. only full blocks are written to DCP during hash updates */ - size_t blksz; /*!< number of valid bytes in memory buffer */ - dcp_hash_algo_t algo; /*!< selected algorithm from the set of supported algorithms */ - dcp_hash_algo_state_t state; /*!< finite machine state of the hash software process */ - uint32_t fullMessageSize; /*!< track message size */ - uint32_t ctrl0; /*!< HASH_INIT and HASH_TERM flags */ - uint32_t runningHash[9]; /*!< running hash. up to SHA-256 plus size, that is 36 bytes. */ - dcp_handle_t *handle; -} dcp_hash_ctx_internal_t; - -/*!< SHA-1/SHA-2 digest length in bytes */ -enum _dcp_hash_digest_len -{ - kDCP_OutLenSha1 = 20u, - kDCP_OutLenSha256 = 32u, - kDCP_OutLenCrc32 = 4u, -}; - -enum _dcp_work_packet_bit_definitions -{ - kDCP_CONTROL0_DECR_SEMAPHOR = 1u << 1, /* DECR_SEMAPHOR */ - kDCP_CONTROL0_ENABLE_HASH = 1u << 6, /* ENABLE_HASH */ - kDCP_CONTROL0_HASH_INIT = 1u << 12, /* HASH_INIT */ - kDCP_CONTROL0_HASH_TERM = 1u << 13, /* HASH_TERM */ - kDCP_CONTROL1_HASH_SELECT_SHA256 = 2u << 16, - kDCP_CONTROL1_HASH_SELECT_SHA1 = 0u << 16, - kDCP_CONTROL1_HASH_SELECT_CRC32 = 1u << 16, -}; - -/*! 64-byte block represented as byte array of 16 32-bit words */ -typedef union _dcp_sha_block -{ - uint32_t w[64 / 4]; /*!< array of 32-bit words */ - uint8_t b[64]; /*!< byte array */ -} dcp_sha_block_t; - -#if defined(DCP_HASH_CAVP_COMPATIBLE) -/* result of sha1 hash for message with zero size */ -static uint8_t s_nullSha1[] = {0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, - 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09}; -/* result of sha256 hash for message with zero size */ -static uint8_t s_nullSha256[] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, - 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, - 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; -#endif /* DCP_HASH_CAVP_COMPATIBLE */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -AT_NONCACHEABLE_SECTION_INIT(static dcp_context_t s_dcpContextSwitchingBuffer); - -/******************************************************************************* - * Code - ******************************************************************************/ - -static void dcp_reverse_and_copy(uint8_t *src, uint8_t *dest, size_t src_len) -{ - for (uint32_t i = 0; i < src_len; i++) - { - dest[i] = src[src_len - 1U - i]; - } -} - -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) -static inline uint32_t *DCP_FindCacheLine(uint8_t *dcpWorkExt) -{ - while (0U != ((uint32_t)dcpWorkExt & ((uint32_t)FSL_FEATURE_L1DCACHE_LINESIZE_BYTE - 1U))) - { - dcpWorkExt++; - } - return (uint32_t *)(uint32_t)dcpWorkExt; -} -#endif - -static status_t dcp_get_channel_status(DCP_Type *base, dcp_channel_t channel) -{ - uint32_t statReg = 0; - uint32_t semaReg = 0; - status_t status = kStatus_Fail; - - switch (channel) - { - case kDCP_Channel0: - statReg = base->CH0STAT; - semaReg = base->CH0SEMA; - break; - - case kDCP_Channel1: - statReg = base->CH1STAT; - semaReg = base->CH1SEMA; - break; - - case kDCP_Channel2: - statReg = base->CH2STAT; - semaReg = base->CH2SEMA; - break; - - case kDCP_Channel3: - statReg = base->CH3STAT; - semaReg = base->CH3SEMA; - break; - - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - - if (!((0U != (semaReg & DCP_CH0SEMA_VALUE_MASK)) || (0U != (statReg & DCP_CH0STAT_ERROR_CODE_MASK)))) - { - status = kStatus_Success; - } - - return status; -} - -static void dcp_clear_status(DCP_Type *base) -{ - volatile uint32_t *dcpStatClrPtr = (volatile uint32_t *)&base->STAT + 2u; - *dcpStatClrPtr = 0xFFu; - - while ((base->STAT & 0xffu) != 0U) - { - } -} - -static void dcp_clear_channel_status(DCP_Type *base, uint32_t mask) -{ - volatile uint32_t *chStatClrPtr; - - if (0U != (mask & (uint32_t)kDCP_Channel0)) - { - chStatClrPtr = &base->CH0STAT_CLR; - *chStatClrPtr = 0xFFu; - } - if (0U != (mask & (uint32_t)kDCP_Channel1)) - { - chStatClrPtr = &base->CH1STAT_CLR; - *chStatClrPtr = 0xFFu; - } - if (0U != (mask & (uint32_t)kDCP_Channel2)) - { - chStatClrPtr = &base->CH2STAT_CLR; - *chStatClrPtr = 0xFFu; - } - if (0U != (mask & (uint32_t)kDCP_Channel3)) - { - chStatClrPtr = &base->CH3STAT_CLR; - *chStatClrPtr = 0xFFu; - } -} - -static status_t dcp_aes_set_sram_based_key(DCP_Type *base, dcp_handle_t *handle, const uint8_t *key) -{ - base->KEY = DCP_KEY_INDEX(handle->keySlot) | DCP_KEY_SUBWORD(0); - /* move the key by 32-bit words */ - int i = 0; - size_t keySize = 16u; - while (keySize != 0U) - { - keySize -= sizeof(uint32_t); - base->KEYDATA = ((uint32_t *)(uintptr_t)key)[i]; - i++; - } - return kStatus_Success; -} - -/* Disable optimizations for GCC to prevent instruction reordering */ -#if defined(__GNUC__) -#pragma GCC push_options -#pragma GCC optimize("O0") -#endif -static status_t dcp_schedule_work(DCP_Type *base, dcp_handle_t *handle, dcp_work_packet_t *dcpPacket) -{ - status_t status; - - /* check if our channel is active */ - if ((base->STAT & (uint32_t)handle->channel) != (uint32_t)handle->channel) - { - /* disable global interrupt */ - uint32_t currPriMask = DisableGlobalIRQ(); - - /* re-check if our channel is still available */ - if ((base->STAT & (uint32_t)handle->channel) == 0U) - { - volatile uint32_t *cmdptr = NULL; - volatile uint32_t *chsema = NULL; - - switch (handle->channel) - { - case kDCP_Channel0: - cmdptr = &base->CH0CMDPTR; - chsema = &base->CH0SEMA; - break; - - case kDCP_Channel1: - cmdptr = &base->CH1CMDPTR; - chsema = &base->CH1SEMA; - break; - - case kDCP_Channel2: - cmdptr = &base->CH2CMDPTR; - chsema = &base->CH2SEMA; - break; - - case kDCP_Channel3: - cmdptr = &base->CH3CMDPTR; - chsema = &base->CH3SEMA; - break; - - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - - if ((NULL != cmdptr) && (NULL != chsema)) - { - /* set out packet to DCP CMDPTR */ - *cmdptr = (uint32_t)dcpPacket; - -#if defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - /* Clean DCACHE before sending DCP packet to engine */ - DCACHE_CleanByRange((uint32_t)dcpPacket, sizeof(dcp_work_packet_t)); -#endif - /* Make sure that all data memory accesses are completed before starting of the job */ - __DSB(); - __ISB(); - - /* set the channel semaphore to start the job */ - *chsema = 1u; - } - - status = kStatus_Success; - } - - else - { - status = (int32_t)kStatus_DCP_Again; - } - /* global interrupt enable */ - EnableGlobalIRQ(currPriMask); - } - - else - { - return (int32_t)kStatus_DCP_Again; - } - - return status; -} -#if defined(__GNUC__) -#pragma GCC pop_options -#endif - -/*! - * brief Set AES key to dcp_handle_t struct and optionally to DCP. - * - * Sets the AES key for encryption/decryption with the dcp_handle_t structure. - * The dcp_handle_t input argument specifies keySlot. - * If the keySlot is kDCP_OtpKey, the function will check the OTP_KEY_READY bit and will return it's ready to use - * status. - * For other keySlot selections, the function will copy and hold the key in dcp_handle_t struct. - * If the keySlot is one of the four DCP SRAM-based keys (one of kDCP_KeySlot0, kDCP_KeySlot1, kDCP_KeySlot2, - * kDCP_KeySlot3), - * this function will also load the supplied key to the specified keySlot in DCP. - * - * param base DCP peripheral base address. - * param handle Handle used for the request. - * param key 0-mod-4 aligned pointer to AES key. - * param keySize AES key size in bytes. Shall equal 16. - * return status from set key operation - */ -status_t DCP_AES_SetKey(DCP_Type *base, dcp_handle_t *handle, const uint8_t *key, size_t keySize) -{ - status_t status = kStatus_Fail; - - if ((kDCP_OtpKey == handle->keySlot) || (kDCP_OtpUniqueKey == handle->keySlot)) - { - /* for AES OTP and unique key, check and return read from fuses status */ - if ((base->STAT & DCP_STAT_OTP_KEY_READY_MASK) == DCP_STAT_OTP_KEY_READY_MASK) - { - status = kStatus_Success; - } - } - else - { - /* only work with aligned key[] */ - if ((0x3U & (uintptr_t)key) != 0U) - { - return kStatus_InvalidArgument; - } - - /* keySize must be 16. */ - if (keySize != 16U) - { - return kStatus_InvalidArgument; - } - - /* move the key by 32-bit words */ - int i = 0; - while (keySize != 0U) - { - keySize -= sizeof(uint32_t); - handle->keyWord[i] = ((uint32_t *)(uintptr_t)key)[i]; - i++; - } - - if (kDCP_PayloadKey != handle->keySlot) - { - /* move the key by 32-bit words to DCP SRAM-based key storage */ - status = dcp_aes_set_sram_based_key(base, handle, key); - } - else - { - /* for PAYLOAD_KEY, just return Ok status now */ - status = kStatus_Success; - } - } - - return status; -} - -/*! - * brief Encrypts AES on one or multiple 128-bit block(s). - * - * Encrypts AES. - * The source plaintext and destination ciphertext can overlap in system memory. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param plaintext Input plain text to encrypt - * param[out] ciphertext Output cipher text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * return Status from encrypt operation - */ -status_t DCP_AES_EncryptEcb( - DCP_Type *base, dcp_handle_t *handle, const uint8_t *plaintext, uint8_t *ciphertext, size_t size) -{ - status_t completionStatus = kStatus_Fail; - - /* Use extended DCACHE line size aligned structure */ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - dcp_work_packet_t *dcpWork; - uint8_t dcpWorkExt[sizeof(dcp_work_packet_t) + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE] = {0U}; - dcpWork = (dcp_work_packet_t *)(uint32_t)DCP_FindCacheLine(dcpWorkExt); -#else - dcp_work_packet_t dcpWorkPacket = {0}; - dcp_work_packet_t *dcpWork = &dcpWorkPacket; -#endif - - do - { - completionStatus = DCP_AES_EncryptEcbNonBlocking(base, handle, dcpWork, plaintext, ciphertext, size); - } while (completionStatus == (int32_t)kStatus_DCP_Again); - - if (completionStatus != kStatus_Success) - { - return completionStatus; - } - - return DCP_WaitForChannelComplete(base, handle); -} - -/*! - * brief Encrypts AES using the ECB block mode. - * - * Puts AES ECB encrypt work packet to DCP channel. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param[out] dcpPacket Memory for the DCP work packet. - * param plaintext Input plain text to encrypt. - * param[out] ciphertext Output cipher text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * return kStatus_Success The work packet has been scheduled at DCP channel. - * return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_EncryptEcbNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size) -{ - /* Size must be 16-byte multiple */ - if ((size < 16u) || (0U != (size % 16u))) - { - return kStatus_InvalidArgument; - } - - dcpPacket->control0 = - 0x122u | (handle->swapConfig & 0xFC0000u); /* CIPHER_ENCRYPT | ENABLE_CIPHER | DECR_SEMAPHORE */ - dcpPacket->sourceBufferAddress = (uint32_t)plaintext; - dcpPacket->destinationBufferAddress = (uint32_t)ciphertext; - dcpPacket->bufferSize = (uint32_t)size; - - if (handle->keySlot == kDCP_OtpKey) - { - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 = ((uint32_t)0xFFu << 8); /* KEY_SELECT = OTP_KEY */ - } - else if (handle->keySlot == kDCP_OtpUniqueKey) - { - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 = ((uint32_t)0xFEu << 8); /* KEY_SELECT = UNIQUE_KEY */ - } - else if (handle->keySlot == kDCP_PayloadKey) - { - /* ECB does not have IV, so we can point payload directly to keyWord[] stored in handle. */ - dcpPacket->payloadPointer = (uint32_t)&handle->keyWord[0]; - dcpPacket->control0 |= ((uint32_t)1u << 11); /* PAYLOAD_KEY */ - } - else - { - dcpPacket->control1 = ((uint32_t)handle->keySlot << 8); /* KEY_SELECT = keySlot */ - } - - return dcp_schedule_work(base, handle, dcpPacket); -} - -/*! - * brief Decrypts AES on one or multiple 128-bit block(s). - * - * Decrypts AES. - * The source ciphertext and destination plaintext can overlap in system memory. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param ciphertext Input plain text to encrypt - * param[out] plaintext Output cipher text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * return Status from decrypt operation - */ -status_t DCP_AES_DecryptEcb( - DCP_Type *base, dcp_handle_t *handle, const uint8_t *ciphertext, uint8_t *plaintext, size_t size) -{ - status_t completionStatus = kStatus_Fail; - - /* Use extended DCACHE line size aligned structure */ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - dcp_work_packet_t *dcpWork; - uint8_t dcpWorkExt[sizeof(dcp_work_packet_t) + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE] = {0U}; - dcpWork = (dcp_work_packet_t *)(uint32_t)DCP_FindCacheLine(dcpWorkExt); -#else - dcp_work_packet_t dcpWorkPacket = {0}; - dcp_work_packet_t *dcpWork = &dcpWorkPacket; -#endif - - do - { - completionStatus = DCP_AES_DecryptEcbNonBlocking(base, handle, dcpWork, ciphertext, plaintext, size); - } while (completionStatus == (int32_t)(kStatus_DCP_Again)); - - if (completionStatus != kStatus_Success) - { - return completionStatus; - } - - return DCP_WaitForChannelComplete(base, handle); -} - -/*! - * brief Decrypts AES using ECB block mode. - * - * Puts AES ECB decrypt dcpPacket to DCP input job ring. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param[out] dcpPacket Memory for the DCP work packet. - * param ciphertext Input cipher text to decrypt - * param[out] plaintext Output plain text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * return kStatus_Success The work packet has been scheduled at DCP channel. - * return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_DecryptEcbNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size) -{ - /* Size must be 16-byte multiple */ - if ((size < 16u) || (0U != (size % 16u))) - { - return kStatus_InvalidArgument; - } - - dcpPacket->control0 = 0x22u | (handle->swapConfig & 0xFC0000u); /* ENABLE_CIPHER | DECR_SEMAPHORE */ - dcpPacket->sourceBufferAddress = (uint32_t)ciphertext; - dcpPacket->destinationBufferAddress = (uint32_t)plaintext; - dcpPacket->bufferSize = (uint32_t)size; - - if (handle->keySlot == kDCP_OtpKey) - { - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 = ((uint32_t)0xFFu << 8); /* KEY_SELECT = OTP_KEY */ - } - else if (handle->keySlot == kDCP_OtpUniqueKey) - { - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 = ((uint32_t)0xFEu << 8); /* KEY_SELECT = UNIQUE_KEY */ - } - else if (handle->keySlot == kDCP_PayloadKey) - { - /* ECB does not have IV, so we can point payload directly to keyWord[] stored in handle. */ - dcpPacket->payloadPointer = (uint32_t)&handle->keyWord[0]; - dcpPacket->control0 |= ((uint32_t)1u << 11); /* PAYLOAD_KEY */ - } - else - { - dcpPacket->control1 = ((uint32_t)handle->keySlot << 8); /* KEY_SELECT = keySlot */ - } - - return dcp_schedule_work(base, handle, dcpPacket); -} - -/*! - * brief Encrypts AES using CBC block mode. - * - * Encrypts AES using CBC block mode. - * The source plaintext and destination ciphertext can overlap in system memory. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param plaintext Input plain text to encrypt - * param[out] ciphertext Output cipher text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * param iv Input initial vector to combine with the first input block. - * return Status from encrypt operation - */ -status_t DCP_AES_EncryptCbc(DCP_Type *base, - dcp_handle_t *handle, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size, - const uint8_t iv[16]) -{ - status_t completionStatus = kStatus_Fail; - - /* Use extended DCACHE line size aligned structure */ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - dcp_work_packet_t *dcpWork; - uint8_t dcpWorkExt[sizeof(dcp_work_packet_t) + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE] = {0U}; - dcpWork = (dcp_work_packet_t *)(uint32_t)DCP_FindCacheLine(dcpWorkExt); -#else - dcp_work_packet_t dcpWorkPacket = {0}; - dcp_work_packet_t *dcpWork = &dcpWorkPacket; -#endif - - do - { - completionStatus = DCP_AES_EncryptCbcNonBlocking(base, handle, dcpWork, plaintext, ciphertext, size, iv); - } while (completionStatus == (int32_t)kStatus_DCP_Again); - - if (completionStatus != kStatus_Success) - { - return completionStatus; - } - - return DCP_WaitForChannelComplete(base, handle); -} - -/*! - * brief Encrypts AES using CBC block mode. - * - * Puts AES CBC encrypt dcpPacket to DCP input job ring. - * - * param base DCP peripheral base address - * param handle Handle used for this request. Specifies jobRing. - * param[out] dcpPacket Memory for the DCP work packet. - * param plaintext Input plain text to encrypt - * param[out] ciphertext Output cipher text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * param iv Input initial vector to combine with the first input block. - * return kStatus_Success The work packet has been scheduled at DCP channel. - * return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_EncryptCbcNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size, - const uint8_t *iv) -{ - /* Size must be 16-byte multiple */ - if ((size < 16u) || (0U != (size % 16u))) - { - return kStatus_InvalidArgument; - } - - dcpPacket->control0 = - 0x322u | (handle->swapConfig & 0xFC0000u); /* CIPHER_INIT | CIPHER_ENCRYPT | ENABLE_CIPHER | DECR_SEMAPHORE */ - dcpPacket->control1 = 0x10u; /* CBC */ - dcpPacket->sourceBufferAddress = (uint32_t)plaintext; - dcpPacket->destinationBufferAddress = (uint32_t)ciphertext; - dcpPacket->bufferSize = (uint32_t)size; - - if (handle->keySlot == kDCP_OtpKey) - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 |= ((uint32_t)0xFFu << 8); /* KEY_SELECT = OTP_KEY */ - } - else if (handle->keySlot == kDCP_OtpUniqueKey) - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 |= ((uint32_t)0xFEu << 8); /* KEY_SELECT = UNIQUE_KEY */ - } - else if (handle->keySlot == kDCP_PayloadKey) - { - /* In this case payload must contain key & iv in one array. */ - /* Copy iv into handle right behind the keyWord[] so we can point payload to keyWord[]. */ - (void)dcp_memcpy(handle->iv, (const uint32_t *)(uintptr_t)iv, 16); - dcpPacket->payloadPointer = (uint32_t)&handle->keyWord[0]; - dcpPacket->control0 |= ((uint32_t)1u << 11); /* PAYLOAD_KEY */ - } - else - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control1 |= ((uint32_t)handle->keySlot << 8); /* KEY_SELECT = keySlot */ - } - - return dcp_schedule_work(base, handle, dcpPacket); -} - -/*! - * brief Decrypts AES using CBC block mode. - * - * Decrypts AES using CBC block mode. - * The source ciphertext and destination plaintext can overlap in system memory. - * - * param base DCP peripheral base address - * param handle Handle used for this request. - * param ciphertext Input cipher text to decrypt - * param[out] plaintext Output plain text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * param iv Input initial vector to combine with the first input block. - * return Status from decrypt operation - */ -status_t DCP_AES_DecryptCbc(DCP_Type *base, - dcp_handle_t *handle, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size, - const uint8_t iv[16]) -{ - status_t completionStatus = kStatus_Fail; - - /* Use extended DCACHE line size aligned structure */ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - dcp_work_packet_t *dcpWork; - uint8_t dcpWorkExt[sizeof(dcp_work_packet_t) + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE] = {0U}; - dcpWork = (dcp_work_packet_t *)(uint32_t)DCP_FindCacheLine(dcpWorkExt); -#else - dcp_work_packet_t dcpWorkPacket = {0}; - dcp_work_packet_t *dcpWork = &dcpWorkPacket; -#endif - - do - { - completionStatus = DCP_AES_DecryptCbcNonBlocking(base, handle, dcpWork, ciphertext, plaintext, size, iv); - } while (completionStatus == (int32_t)kStatus_DCP_Again); - - if (completionStatus != (int32_t)kStatus_Success) - { - return completionStatus; - } - - return DCP_WaitForChannelComplete(base, handle); -} - -/*! - * brief Decrypts AES using CBC block mode. - * - * Puts AES CBC decrypt dcpPacket to DCP input job ring. - * - * param base DCP peripheral base address - * param handle Handle used for this request. Specifies jobRing. - * param[out] dcpPacket Memory for the DCP work packet. - * param ciphertext Input cipher text to decrypt - * param[out] plaintext Output plain text - * param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * param iv Input initial vector to combine with the first input block. - * return kStatus_Success The work packet has been scheduled at DCP channel. - * return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_DecryptCbcNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size, - const uint8_t *iv) -{ - /* Size must be 16-byte multiple */ - if ((size < 16u) || (0U != (size % 16u))) - { - return kStatus_InvalidArgument; - } - - dcpPacket->control0 = 0x222u | (handle->swapConfig & 0xFC0000u); /* CIPHER_INIT | ENABLE_CIPHER | DECR_SEMAPHORE */ - dcpPacket->control1 = 0x10u; /* CBC */ - dcpPacket->sourceBufferAddress = (uint32_t)ciphertext; - dcpPacket->destinationBufferAddress = (uint32_t)plaintext; - dcpPacket->bufferSize = (uint32_t)size; - - if (handle->keySlot == kDCP_OtpKey) - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 |= ((uint32_t)0xFFu << 8); /* OTP_KEY */ - } - else if (handle->keySlot == kDCP_OtpUniqueKey) - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control0 |= ((uint32_t)1u << 10); /* OTP_KEY */ - dcpPacket->control1 |= ((uint32_t)0xFEu << 8); /* UNIQUE_KEY */ - } - else if (handle->keySlot == kDCP_PayloadKey) - { - /* in this case payload must contain KEY + IV together */ - /* copy iv into handle struct so we can point payload directly to keyWord[]. */ - (void)dcp_memcpy(handle->iv, (const uint32_t *)(uintptr_t)iv, 16); - dcpPacket->payloadPointer = (uint32_t)&handle->keyWord[0]; - dcpPacket->control0 |= ((uint32_t)1u << 11); /* PAYLOAD_KEY */ - } - else - { - dcpPacket->payloadPointer = (uint32_t)iv; - dcpPacket->control1 |= ((uint32_t)handle->keySlot << 8); /* KEY_SELECT */ - } - - return dcp_schedule_work(base, handle, dcpPacket); -} - -/*! - * brief Gets the default configuration structure. - * - * This function initializes the DCP configuration structure to a default value. The default - * values are as follows. - * dcpConfig->gatherResidualWrites = true; - * dcpConfig->enableContextCaching = true; - * dcpConfig->enableContextSwitching = true; - * dcpConfig->enableChannnel = kDCP_chEnableAll; - * dcpConfig->enableChannelInterrupt = kDCP_chIntDisable; - * - * param[out] config Pointer to configuration structure. - */ -void DCP_GetDefaultConfig(dcp_config_t *config) -{ - /* ENABLE_CONTEXT_CACHING is disabled by default as the DCP Hash driver uses - * dcp_hash_save_running_hash() and dcp_hash_restore_running_hash() to support - * Hash context switch (different messages interleaved) on the same channel. - */ - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - dcp_config_t userConfig = { - true, false, true, (uint8_t)kDCP_chEnableAll, (uint8_t)kDCP_chIntDisable, - }; - - *config = userConfig; -} - -/*! - * brief Enables clock to and enables DCP - * - * Enable DCP clock and configure DCP. - * - * param base DCP base address - * param config Pointer to configuration structure. - */ -void DCP_Init(DCP_Type *base, const dcp_config_t *config) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_EnableClock(kCLOCK_Dcp); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - base->CTRL = 0xF0800000u; /* reset value */ - base->CTRL = 0x30800000u; /* default value */ - - dcp_clear_status(base); - dcp_clear_channel_status( - base, (uint32_t)kDCP_Channel0 | (uint32_t)kDCP_Channel1 | (uint32_t)kDCP_Channel2 | (uint32_t)kDCP_Channel3); - - base->CTRL = DCP_CTRL_GATHER_RESIDUAL_WRITES(config->gatherResidualWrites) | - DCP_CTRL_ENABLE_CONTEXT_CACHING(config->enableContextCaching) | - DCP_CTRL_ENABLE_CONTEXT_SWITCHING(config->enableContextSwitching) | - DCP_CTRL_CHANNEL_INTERRUPT_ENABLE(config->enableChannelInterrupt); - - /* enable DCP channels */ - base->CHANNELCTRL = DCP_CHANNELCTRL_ENABLE_CHANNEL(config->enableChannel); - - /* use context switching buffer */ - base->CONTEXT = (uint32_t)&s_dcpContextSwitchingBuffer; -} - -/*! - * brief Disable DCP clock - * - * Reset DCP and Disable DCP clock. - * - * param base DCP base address - */ -void DCP_Deinit(DCP_Type *base) -{ - base->CTRL = 0xF0800000u; /* reset value */ - (void)memset(&s_dcpContextSwitchingBuffer, 0, sizeof(s_dcpContextSwitchingBuffer)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(kCLOCK_Dcp); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Poll and wait on DCP channel. - * - * Polls the specified DCP channel until current it completes activity. - * - * param base DCP peripheral base address. - * param handle Specifies DCP channel. - * return kStatus_Success When data processing completes without error. - * return kStatus_Fail When error occurs. - */ -status_t DCP_WaitForChannelComplete(DCP_Type *base, dcp_handle_t *handle) -{ - /* wait if our channel is still active */ - while ((base->STAT & (uint32_t)handle->channel) == (uint32_t)handle->channel) - { - } - - if (dcp_get_channel_status(base, handle->channel) != kStatus_Success) - { - dcp_clear_status(base); - dcp_clear_channel_status(base, (uint32_t)handle->channel); - return kStatus_Fail; - } - - dcp_clear_status(base); - return kStatus_Success; -} - -/*! - * @brief Check validity of algoritm. - * - * This function checks the validity of input argument. - * - * @param algo Tested algorithm value. - * @return kStatus_Success if valid, kStatus_InvalidArgument otherwise. - */ -static status_t dcp_hash_check_input_alg(dcp_hash_algo_t algo) -{ - if ((algo != kDCP_Sha256) && (algo != kDCP_Sha1) && (algo != kDCP_Crc32)) - { - return kStatus_InvalidArgument; - } - return kStatus_Success; -} - -/*! - * @brief Check validity of input arguments. - * - * This function checks the validity of input arguments. - * - * @param base DCP peripheral base address. - * @param ctx Memory buffer given by user application where the DCP_HASH_Init/DCP_HASH_Update/DCP_HASH_Finish store - * context. - * @param algo Tested algorithm value. - * @return kStatus_Success if valid, kStatus_InvalidArgument otherwise. - */ -static status_t dcp_hash_check_input_args(DCP_Type *base, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo) -{ - /* Check validity of input algorithm */ - if (kStatus_Success != dcp_hash_check_input_alg(algo)) - { - return kStatus_InvalidArgument; - } - - if ((NULL == ctx) || (NULL == base)) - { - return kStatus_InvalidArgument; - } - - return kStatus_Success; -} - -/*! - * @brief Check validity of internal software context. - * - * This function checks if the internal context structure looks correct. - * - * @param ctxInternal Internal context. - * @param message Input message address. - * @return kStatus_Success if valid, kStatus_InvalidArgument otherwise. - */ -static status_t dcp_hash_check_context(dcp_hash_ctx_internal_t *ctxInternal, const uint8_t *message) -{ - if ((NULL == message) || (NULL == ctxInternal) || (kStatus_Success != dcp_hash_check_input_alg(ctxInternal->algo))) - { - return kStatus_InvalidArgument; - } - - return kStatus_Success; -} - -/*! - * @brief Initialize the SHA engine for new hash. - * - * This function sets kDCP_CONTROL0_HASH_INIT for control0 in work packet to start a new hash. - * - * @param base SHA peripheral base address. - * @param ctxInternal Internal context. - */ -static status_t dcp_hash_engine_init(DCP_Type *base, dcp_hash_ctx_internal_t *ctxInternal) -{ - status_t status; - - status = kStatus_InvalidArgument; - - if ((kDCP_Sha256 == ctxInternal->algo) || (kDCP_Sha1 == ctxInternal->algo) || (kDCP_Crc32 == ctxInternal->algo)) - { - ctxInternal->ctrl0 = (uint32_t)kDCP_CONTROL0_HASH_INIT; - status = kStatus_Success; - } - - return status; -} - -static status_t dcp_hash_update_non_blocking( - DCP_Type *base, dcp_hash_ctx_internal_t *ctxInternal, dcp_work_packet_t *dcpPacket, const uint8_t *msg, size_t size) -{ - dcpPacket->control0 = ctxInternal->ctrl0 | (ctxInternal->handle->swapConfig & 0xFC0000u) | - (uint32_t)kDCP_CONTROL0_ENABLE_HASH | (uint32_t)kDCP_CONTROL0_DECR_SEMAPHOR; - if (ctxInternal->algo == kDCP_Sha256) - { - dcpPacket->control1 = (uint32_t)kDCP_CONTROL1_HASH_SELECT_SHA256; - } - else if (ctxInternal->algo == kDCP_Sha1) - { - dcpPacket->control1 = (uint32_t)kDCP_CONTROL1_HASH_SELECT_SHA1; - } - else if (ctxInternal->algo == kDCP_Crc32) - { - /* In CRC-32 case if size is zero, do not schedule other computing */ - if (size == 0U) - { -#if defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - /* Clear DCACHE memory before starting the engine */ - DCACHE_CleanByRange((uint32_t)ctxInternal, sizeof(dcp_hash_ctx_internal_t)); -#endif - /* Make sure that all data memory accesses are completed before starting of the job */ - __DSB(); - __ISB(); - return kStatus_Success; - } - dcpPacket->control1 = (uint32_t)kDCP_CONTROL1_HASH_SELECT_CRC32; - } - else - { - return kStatus_Fail; - } - dcpPacket->sourceBufferAddress = (uint32_t)msg; - dcpPacket->destinationBufferAddress = 0; - dcpPacket->bufferSize = size; - dcpPacket->payloadPointer = (uint32_t)ctxInternal->runningHash; - -#if defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - /* Clear DCACHE memory before starting the engine */ - DCACHE_CleanByRange((uint32_t)ctxInternal, sizeof(dcp_hash_ctx_internal_t)); -#endif - /* Make sure that all data memory accesses are completed before starting of the job */ - __DSB(); - __ISB(); - - return dcp_schedule_work(base, ctxInternal->handle, dcpPacket); -} - -static status_t dcp_hash_update(DCP_Type *base, dcp_hash_ctx_internal_t *ctxInternal, const uint8_t *msg, size_t size) -{ - status_t completionStatus = kStatus_Fail; - - /* Use extended DCACHE line size aligned structure */ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - dcp_work_packet_t *dcpWork; - uint8_t dcpWorkExt[sizeof(dcp_work_packet_t) + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE] = {0U}; - dcpWork = (dcp_work_packet_t *)(uint32_t)DCP_FindCacheLine(dcpWorkExt); -#else - dcp_work_packet_t dcpWorkPacket = {0}; - dcp_work_packet_t *dcpWork = &dcpWorkPacket; -#endif - - do - { - completionStatus = dcp_hash_update_non_blocking(base, ctxInternal, dcpWork, msg, size); - } while (completionStatus == (int32_t)kStatus_DCP_Again); - - completionStatus = DCP_WaitForChannelComplete(base, ctxInternal->handle); - - ctxInternal->ctrl0 = 0; /* clear kDCP_CONTROL0_HASH_INIT and kDCP_CONTROL0_HASH_TERM flags */ - return (completionStatus); -} - -/*! - * @brief Adds message to current hash. - * - * This function merges the message to fill the internal buffer, empties the internal buffer if - * it becomes full, then process all remaining message data. - * - * - * @param base DCP peripheral base address. - * @param ctxInternal Internal context. - * @param message Input message. - * @param messageSize Size of input message in bytes. - * @return kStatus_Success. - */ -static status_t dcp_hash_process_message_data(DCP_Type *base, - dcp_hash_ctx_internal_t *ctxInternal, - const uint8_t *message, - size_t messageSize) -{ - status_t status = kStatus_Fail; - - /* if there is partially filled internal buffer, fill it to full block */ - if (ctxInternal->blksz > 0U) - { - size_t toCopy = DCP_HASH_BLOCK_SIZE - ctxInternal->blksz; - (void)dcp_memcpy(&ctxInternal->blk.b[ctxInternal->blksz], message, toCopy); - message += toCopy; - messageSize -= toCopy; - - /* process full internal block */ - status = dcp_hash_update(base, ctxInternal, &ctxInternal->blk.b[0], DCP_HASH_BLOCK_SIZE); - if (kStatus_Success != status) - { - return status; - } - } - - /* process all full blocks in message[] */ - uint32_t fullBlocksSize = ((messageSize >> 6) << 6); /* (X / 64) * 64 */ - if (fullBlocksSize > 0U) - { - status = dcp_hash_update(base, ctxInternal, message, fullBlocksSize); - if (kStatus_Success != status) - { - return status; - } - message += fullBlocksSize; - messageSize -= fullBlocksSize; - } - - /* copy last incomplete message bytes into internal block */ - (void)dcp_memcpy(&ctxInternal->blk.b[0], message, messageSize); - ctxInternal->blksz = messageSize; - - return status; -} - -/*! - * @brief Finalize the running hash to make digest. - * - * This function empties the internal buffer, adds padding bits, and generates final digest. - * - * @param base SHA peripheral base address. - * @param ctxInternal Internal context. - * @return kStatus_Success. - */ -static status_t dcp_hash_finalize(DCP_Type *base, dcp_hash_ctx_internal_t *ctxInternal) -{ - status_t status; - - ctxInternal->ctrl0 |= (uint32_t)kDCP_CONTROL0_HASH_TERM; - status = dcp_hash_update(base, ctxInternal, &ctxInternal->blk.b[0], ctxInternal->blksz); - - return status; -} - -static void dcp_hash_save_running_hash(dcp_hash_ctx_internal_t *ctxInternal) -{ - uint32_t *srcAddr = NULL; - - switch (ctxInternal->handle->channel) - { - case kDCP_Channel0: - srcAddr = &s_dcpContextSwitchingBuffer.x[43]; - break; - - case kDCP_Channel1: - srcAddr = &s_dcpContextSwitchingBuffer.x[30]; - break; - - case kDCP_Channel2: - srcAddr = &s_dcpContextSwitchingBuffer.x[17]; - break; - - case kDCP_Channel3: - srcAddr = &s_dcpContextSwitchingBuffer.x[4]; - break; - - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - if (srcAddr != NULL) - { - DCACHE_InvalidateByRange((uint32_t)srcAddr, sizeof(ctxInternal->runningHash)); - (void)dcp_memcpy(ctxInternal->runningHash, srcAddr, sizeof(ctxInternal->runningHash)); - } -} - -static void dcp_hash_restore_running_hash(dcp_hash_ctx_internal_t *ctxInternal) -{ - uint32_t *destAddr = NULL; - - switch (ctxInternal->handle->channel) - { - case kDCP_Channel0: - destAddr = &s_dcpContextSwitchingBuffer.x[43]; - break; - - case kDCP_Channel1: - destAddr = &s_dcpContextSwitchingBuffer.x[30]; - break; - - case kDCP_Channel2: - destAddr = &s_dcpContextSwitchingBuffer.x[17]; - break; - - case kDCP_Channel3: - destAddr = &s_dcpContextSwitchingBuffer.x[4]; - break; - - default: - /* No valid channel */ - break; - } - if (destAddr != NULL) - { - (void)dcp_memcpy(destAddr, ctxInternal->runningHash, sizeof(ctxInternal->runningHash)); - } -} - -/*! - * brief Initialize HASH context - * - * This function initializes the HASH. - * - * param base DCP peripheral base address - * param handle Specifies the DCP channel used for hashing. - * param[out] ctx Output hash context - * param algo Underlaying algorithm to use for hash computation. - * return Status of initialization - */ -status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo) -{ - status_t status; - - dcp_hash_ctx_internal_t *ctxInternal; - /* Align structure on DCACHE line*/ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)((uint8_t *)ctx + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE); -#else - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)ctx; -#endif - - /* compile time check for the correct structure size */ - BUILD_ASSURE(sizeof(dcp_hash_ctx_t) >= sizeof(dcp_hash_ctx_internal_t), dcp_hash_ctx_t_size); - uint32_t i; - - status = dcp_hash_check_input_args(base, ctx, algo); - if (status != kStatus_Success) - { - return status; - } - - /* set algorithm in context struct for later use */ - ctxInternal->algo = algo; - ctxInternal->blksz = 0u; - - const uint32_t j = sizeof(ctxInternal->blk.w) / sizeof(ctxInternal->blk.w[0]); - for (i = 0; i < j; i++) - { - ctxInternal->blk.w[i] = 0u; - } - ctxInternal->state = kDCP_StateHashInit; - ctxInternal->fullMessageSize = 0; - ctxInternal->handle = handle; - return status; -} - -/*! - * brief Add data to current HASH - * - * Add data to current HASH. This can be called repeatedly with an arbitrary amount of data to be - * hashed. The functions blocks. If it returns kStatus_Success, the running hash - * has been updated (DCP has processed the input data), so the memory at ref input pointer - * can be released back to system. The DCP context buffer is updated with the running hash - * and with all necessary information to support possible context switch. - * - * param base DCP peripheral base address - * param[in,out] ctx HASH context - * param input Input data - * param inputSize Size of input data in bytes - * return Status of the hash update operation - */ -status_t DCP_HASH_Update(DCP_Type *base, dcp_hash_ctx_t *ctx, const uint8_t *input, size_t inputSize) -{ - bool isUpdateState; - status_t status; - dcp_hash_ctx_internal_t *ctxInternal; - size_t blockSize; - - /* Align structure on DCACHE line*/ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)((uint8_t *)ctx + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE); -#else - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)ctx; -#endif - - if (inputSize == 0U) - { - return kStatus_Success; - } - - status = dcp_hash_check_context(ctxInternal, input); - if (kStatus_Success != status) - { - return status; - } - - ctxInternal->fullMessageSize += inputSize; - blockSize = DCP_HASH_BLOCK_SIZE; - /* if we are still less than DCP_HASH_BLOCK_SIZE bytes, keep only in context */ - if ((ctxInternal->blksz + inputSize) <= blockSize) - { - (void)dcp_memcpy((&ctxInternal->blk.b[0]) + ctxInternal->blksz, input, inputSize); - ctxInternal->blksz += inputSize; - return status; - } - else - { - isUpdateState = ctxInternal->state == kDCP_StateHashUpdate; - if (!isUpdateState) - { - /* start NEW hash */ - status = dcp_hash_engine_init(base, ctxInternal); - if (status != kStatus_Success) - { - return status; - } - ctxInternal->state = kDCP_StateHashUpdate; - } - else - { - dcp_hash_restore_running_hash(ctxInternal); - } - } - - /* process input data */ - status = dcp_hash_process_message_data(base, ctxInternal, input, inputSize); - dcp_hash_save_running_hash(ctxInternal); - return status; -} - -/*! - * brief Finalize hashing - * - * Outputs the final hash (computed by DCP_HASH_Update()) and erases the context. - * - * param[in,out] ctx Input hash context - * param[out] output Output hash data - * param[in,out] outputSize Optional parameter (can be passed as NULL). On function entry, it specifies the size of - * output[] buffer. On function return, it stores the number of updated output bytes. - * return Status of the hash finish operation - */ -status_t DCP_HASH_Finish(DCP_Type *base, dcp_hash_ctx_t *ctx, uint8_t *output, size_t *outputSize) -{ - size_t algOutSize = 0; - status_t status; - dcp_hash_ctx_internal_t *ctxInternal; - - /* Align structure on DCACHE line*/ -#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) && defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)((uint8_t *)ctx + FSL_FEATURE_L1DCACHE_LINESIZE_BYTE); -#else - ctxInternal = (dcp_hash_ctx_internal_t *)(uint32_t)ctx; -#endif - - status = dcp_hash_check_context(ctxInternal, output); - - if (kStatus_Success != status) - { - return status; - } - - if (ctxInternal->state == kDCP_StateHashInit) - { - status = dcp_hash_engine_init(base, ctxInternal); - if (status != kStatus_Success) - { - return status; - } - } - else - { - dcp_hash_restore_running_hash(ctxInternal); - } - - size_t outSize = 0u; - - /* compute algorithm output length */ - switch (ctxInternal->algo) - { - case kDCP_Sha256: - outSize = (uint32_t)kDCP_OutLenSha256; - break; - case kDCP_Sha1: - outSize = (uint32_t)kDCP_OutLenSha1; - break; - case kDCP_Crc32: - outSize = (uint32_t)kDCP_OutLenCrc32; - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - algOutSize = outSize; - -#if defined(DCP_HASH_CAVP_COMPATIBLE) - if (ctxInternal->fullMessageSize == 0U) - { - switch (ctxInternal->algo) - { - case kDCP_Sha256: - (void)dcp_memcpy(&output[0], &s_nullSha256, 32); - break; - case kDCP_Sha1: - (void)dcp_memcpy(&output[0], &s_nullSha1, 20); - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - - return kStatus_Success; - } -#endif /* DCP_HASH_CAVP_COMPATIBLE */ - - /* flush message last incomplete block, if there is any, and add padding bits */ - status = dcp_hash_finalize(base, ctxInternal); - - if (outputSize != NULL) - { - if (algOutSize < *outputSize) - { - *outputSize = algOutSize; - } - else - { - algOutSize = *outputSize; - } - } - -#if defined(DCP_USE_DCACHE) && (DCP_USE_DCACHE == 1U) - DCACHE_InvalidateByRange((uint32_t)ctxInternal->runningHash, sizeof(ctxInternal->runningHash)); -#endif - /* Reverse and copy result to output[] */ - dcp_reverse_and_copy((uint8_t *)ctxInternal->runningHash, &output[0], algOutSize); - - (void)memset(ctx, 0, sizeof(dcp_hash_ctx_t)); - return status; -} - -/*! - * brief Create HASH on given data - * - * Perform the full SHA or CRC32 in one function call. The function is blocking. - * - * param base DCP peripheral base address - * param handle Handle used for the request. - * param algo Underlaying algorithm to use for hash computation. - * param input Input data - * param inputSize Size of input data in bytes - * param[out] output Output hash data - * param[out] outputSize Output parameter storing the size of the output hash in bytes - * return Status of the one call hash operation. - */ -status_t DCP_HASH(DCP_Type *base, - dcp_handle_t *handle, - dcp_hash_algo_t algo, - const uint8_t *input, - size_t inputSize, - uint8_t *output, - size_t *outputSize) -{ - dcp_hash_ctx_t hashCtx = {0}; - status_t status; - - status = DCP_HASH_Init(base, handle, &hashCtx, algo); - if (status != kStatus_Success) - { - return status; - } - - status = DCP_HASH_Update(base, &hashCtx, input, inputSize); - if (status != kStatus_Success) - { - return status; - } - - status = DCP_HASH_Finish(base, &hashCtx, output, outputSize); - - return status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_dcp.h b/devices/MIMXRT1052/drivers/fsl_dcp.h deleted file mode 100644 index b31944d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dcp.h +++ /dev/null @@ -1,580 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_DCP_H_ -#define _FSL_DCP_H_ - -#include "fsl_common.h" - -/******************************************************************************* - * Definitions - *******************************************************************************/ - -/*! - * @addtogroup dcp_driver - * @{ - */ -/*! @name Driver version */ -/*@{*/ -/*! @brief DCP driver version. Version 2.1.6. - * - * Current version: 2.1.6 - * - * Change log: - * - * - Version 2.1.6 - * - Bug Fix - * - MISRA C-2012 issue fix. - * - * - Version 2.1.5 - * - Improvements - * - Add support for DCACHE. - * - * - Version 2.1.4 - * - Bug Fix - * - Fix CRC-32 computation issue on the code's block boundary size. - * - * - Version 2.1.3 - * - Bug Fix - * - MISRA C-2012 issue fixed: rule 10.1, 10.3, 10.4, 11.9, 14.4, 16.4 and 17.7. - * - * - Version 2.1.2 - * - Fix sign-compare warning in dcp_reverse_and_copy. - * - * - Version 2.1.1 - * - Add DCP status clearing when channel operation is complete - * - * - 2.1.0 - * - Add byte/word swap feature for key, input and output data - * - * - Version 2.0.0 - * - Initial version - */ -#define FSL_DCP_DRIVER_VERSION (MAKE_VERSION(2, 1, 6)) -/*@}*/ - -/*! @brief DCP status return codes. */ -enum _dcp_status -{ - kStatus_DCP_Again = MAKE_STATUS(kStatusGroup_DCP, 0), /*!< Non-blocking function shall be called again. */ -}; - -/*! @brief DCP channel enable. - * - */ -typedef enum _dcp_ch_enable -{ - kDCP_chDisable = 0U, /*!< DCP channel disable */ - kDCP_ch0Enable = 1U, /*!< DCP channel 0 enable */ - kDCP_ch1Enable = 2U, /*!< DCP channel 1 enable */ - kDCP_ch2Enable = 4U, /*!< DCP channel 2 enable */ - kDCP_ch3Enable = 8U, /*!< DCP channel 3 enable */ - kDCP_chEnableAll = 15U, /*!< DCP channel enable all */ -} _dcp_ch_enable_t; - -/*! @brief DCP interrupt enable. - * - */ -typedef enum _dcp_ch_int_enable -{ - kDCP_chIntDisable = 0U, /*!< DCP interrupts disable */ - kDCP_ch0IntEnable = 1U, /*!< DCP channel 0 interrupt enable */ - kDCP_ch1IntEnable = 2U, /*!< DCP channel 1 interrupt enable */ - kDCP_ch2IntEnable = 4U, /*!< DCP channel 2 interrupt enable */ - kDCP_ch3IntEnable = 8U, /*!< DCP channel 3 interrupt enable */ -} _dcp_ch_int_enable_t; - -/*! @brief DCP channel selection. - * - */ -typedef enum _dcp_channel -{ - kDCP_Channel0 = (1u << 16), /*!< DCP channel 0. */ - kDCP_Channel1 = (1u << 17), /*!< DCP channel 1. */ - kDCP_Channel2 = (1u << 18), /*!< DCP channel 2. */ - kDCP_Channel3 = (1u << 19), /*!< DCP channel 3. */ -} dcp_channel_t; - -/*! @brief DCP key slot selection. - * - */ -typedef enum _dcp_key_slot -{ - kDCP_KeySlot0 = 0U, /*!< DCP key slot 0. */ - kDCP_KeySlot1 = 1U, /*!< DCP key slot 1. */ - kDCP_KeySlot2 = 2U, /*!< DCP key slot 2.*/ - kDCP_KeySlot3 = 3U, /*!< DCP key slot 3. */ - kDCP_OtpKey = 4U, /*!< DCP OTP key. */ - kDCP_OtpUniqueKey = 5U, /*!< DCP unique OTP key. */ - kDCP_PayloadKey = 6U, /*!< DCP payload key. */ -} dcp_key_slot_t; - -/*! @brief DCP key, input & output swap options - * - */ -typedef enum _dcp_swap -{ - kDCP_NoSwap = 0x0U, - kDCP_KeyByteSwap = 0x40000U, - kDCP_KeyWordSwap = 0x80000U, - kDCP_InputByteSwap = 0x100000U, - kDCP_InputWordSwap = 0x200000U, - kDCP_OutputByteSwap = 0x400000U, - kDCP_OutputWordSwap = 0x800000U, -} dcp_swap_t; - -/*! @brief DCP's work packet. */ -typedef struct _dcp_work_packet -{ - uint32_t nextCmdAddress; - uint32_t control0; - uint32_t control1; - uint32_t sourceBufferAddress; - uint32_t destinationBufferAddress; - uint32_t bufferSize; - uint32_t payloadPointer; - uint32_t status; -} dcp_work_packet_t; - -/*! @brief Specify DCP's key resource and DCP channel. */ -typedef struct _dcp_handle -{ - dcp_channel_t channel; /*!< Specify DCP channel. */ - dcp_key_slot_t keySlot; /*!< For operations with key (such as AES encryption/decryption), specify DCP key slot. */ - uint32_t swapConfig; /*!< For configuration of key, input, output byte/word swap options */ - uint32_t keyWord[4]; - uint32_t iv[4]; -} dcp_handle_t; - -/*! @brief DCP's context buffer, used by DCP for context switching between channels. */ -typedef struct _dcp_context -{ - uint32_t x[208 / sizeof(uint32_t)]; -} dcp_context_t; - -/*! @brief DCP's configuration structure. */ -typedef struct _dcp_config -{ - bool gatherResidualWrites; /*!< Enable the ragged writes to the unaligned buffers. */ - bool enableContextCaching; /*!< Enable the caching of contexts between the operations. */ - bool enableContextSwitching; /*!< Enable automatic context switching for the channels. */ - uint8_t enableChannel; /*!< DCP channel enable. */ - uint8_t enableChannelInterrupt; /*!< Per-channel interrupt enable. */ -} dcp_config_t; - -/*! @} */ - -#ifndef DCP_USE_DCACHE -#define DCP_USE_DCACHE 1 -#endif -/* 1 - driver supports DCACHE, 0 - drivers does not support DCACHE */ -/* When enable (DCP_USE_DCACHE = 1) Input/output buffers and hash ctx should be in */ -/* non-cached memory or handled properly (Clean & Invalidate DCACHE) */ - -/******************************************************************************* - * AES Definitions - *******************************************************************************/ - -/*! - * @addtogroup dcp_driver_aes - * @{ - */ - -/*! AES block size in bytes */ -#define DCP_AES_BLOCK_SIZE 16 - -/*! - *@} - */ /* end of dcp_driver_aes */ - -/******************************************************************************* - * HASH Definitions - ******************************************************************************/ -/*! - * @addtogroup dcp_driver_hash - * @{ - */ - -/* DCP cannot correctly compute hash for message with zero size. When enabled, driver bypases DCP and returns correct - * hash value. If you are sure, that the driver will never be called with zero sized message, you can disable this - * feature to reduce code size */ -#define DCP_HASH_CAVP_COMPATIBLE - -/*! @brief Supported cryptographic block cipher functions for HASH creation */ -typedef enum _dcp_hash_algo_t -{ - kDCP_Sha1, /*!< SHA_1 */ - kDCP_Sha256, /*!< SHA_256 */ - kDCP_Crc32, /*!< CRC_32 */ -} dcp_hash_algo_t; - -/*! @brief DCP HASH Context size. */ -#define DCP_SHA_BLOCK_SIZE 128U /*!< internal buffer block size */ -#define DCP_HASH_BLOCK_SIZE DCP_SHA_BLOCK_SIZE /*!< DCP hash block size */ - -/*! @brief DCP HASH Context size. */ -#define DCP_HASH_CTX_SIZE 64 - -/*! @brief Storage type used to save hash context. */ -typedef struct _dcp_hash_ctx_t -{ - uint32_t x[DCP_HASH_CTX_SIZE]; -} dcp_hash_ctx_t; - -/*! - *@} - */ /* end of dcp_driver_hash */ - -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @addtogroup dcp_driver - * @{ - */ - -/*! - * @brief Enables clock to and enables DCP - * - * Enable DCP clock and configure DCP. - * - * @param base DCP base address - * @param config Pointer to configuration structure. - */ -void DCP_Init(DCP_Type *base, const dcp_config_t *config); - -/*! - * @brief Disable DCP clock - * - * Reset DCP and Disable DCP clock. - * - * @param base DCP base address - */ -void DCP_Deinit(DCP_Type *base); - -/*! - * @brief Gets the default configuration structure. - * - * This function initializes the DCP configuration structure to a default value. The default - * values are as follows. - * dcpConfig->gatherResidualWrites = true; - * dcpConfig->enableContextCaching = true; - * dcpConfig->enableContextSwitching = true; - * dcpConfig->enableChannnel = kDCP_chEnableAll; - * dcpConfig->enableChannelInterrupt = kDCP_chIntDisable; - * - * @param[out] config Pointer to configuration structure. - */ -void DCP_GetDefaultConfig(dcp_config_t *config); - -/*! - * @brief Poll and wait on DCP channel. - * - * Polls the specified DCP channel until current it completes activity. - * - * @param base DCP peripheral base address. - * @param handle Specifies DCP channel. - * @return kStatus_Success When data processing completes without error. - * @return kStatus_Fail When error occurs. - */ -status_t DCP_WaitForChannelComplete(DCP_Type *base, dcp_handle_t *handle); - -/*! - *@} - */ /* end of dcp_driver */ - -/******************************************************************************* - * AES API - ******************************************************************************/ - -/*! - * @addtogroup dcp_driver_aes - * @{ - */ - -/*! - * @brief Set AES key to dcp_handle_t struct and optionally to DCP. - * - * Sets the AES key for encryption/decryption with the dcp_handle_t structure. - * The dcp_handle_t input argument specifies keySlot. - * If the keySlot is kDCP_OtpKey, the function will check the OTP_KEY_READY bit and will return it's ready to use - * status. - * For other keySlot selections, the function will copy and hold the key in dcp_handle_t struct. - * If the keySlot is one of the four DCP SRAM-based keys (one of kDCP_KeySlot0, kDCP_KeySlot1, kDCP_KeySlot2, - * kDCP_KeySlot3), - * this function will also load the supplied key to the specified keySlot in DCP. - * - * @param base DCP peripheral base address. - * @param handle Handle used for the request. - * @param key 0-mod-4 aligned pointer to AES key. - * @param keySize AES key size in bytes. Shall equal 16. - * @return status from set key operation - */ -status_t DCP_AES_SetKey(DCP_Type *base, dcp_handle_t *handle, const uint8_t *key, size_t keySize); - -/*! - * @brief Encrypts AES on one or multiple 128-bit block(s). - * - * Encrypts AES. - * The source plaintext and destination ciphertext can overlap in system memory. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param plaintext Input plain text to encrypt - * @param[out] ciphertext Output cipher text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @return Status from encrypt operation - */ -status_t DCP_AES_EncryptEcb( - DCP_Type *base, dcp_handle_t *handle, const uint8_t *plaintext, uint8_t *ciphertext, size_t size); - -/*! - * @brief Decrypts AES on one or multiple 128-bit block(s). - * - * Decrypts AES. - * The source ciphertext and destination plaintext can overlap in system memory. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param ciphertext Input plain text to encrypt - * @param[out] plaintext Output cipher text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @return Status from decrypt operation - */ -status_t DCP_AES_DecryptEcb( - DCP_Type *base, dcp_handle_t *handle, const uint8_t *ciphertext, uint8_t *plaintext, size_t size); - -/*! - * @brief Encrypts AES using CBC block mode. - * - * Encrypts AES using CBC block mode. - * The source plaintext and destination ciphertext can overlap in system memory. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param plaintext Input plain text to encrypt - * @param[out] ciphertext Output cipher text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @param iv Input initial vector to combine with the first input block. - * @return Status from encrypt operation - */ -status_t DCP_AES_EncryptCbc(DCP_Type *base, - dcp_handle_t *handle, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size, - const uint8_t iv[16]); - -/*! - * @brief Decrypts AES using CBC block mode. - * - * Decrypts AES using CBC block mode. - * The source ciphertext and destination plaintext can overlap in system memory. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param ciphertext Input cipher text to decrypt - * @param[out] plaintext Output plain text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @param iv Input initial vector to combine with the first input block. - * @return Status from decrypt operation - */ -status_t DCP_AES_DecryptCbc(DCP_Type *base, - dcp_handle_t *handle, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size, - const uint8_t iv[16]); - -/*! - *@} - */ /* end of dcp_driver_aes */ - -/*! - * @addtogroup dcp_nonblocking_driver_aes - * @{ - */ -/*! - * @brief Encrypts AES using the ECB block mode. - * - * Puts AES ECB encrypt work packet to DCP channel. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param[out] dcpPacket Memory for the DCP work packet. - * @param plaintext Input plain text to encrypt. - * @param[out] ciphertext Output cipher text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @return kStatus_Success The work packet has been scheduled at DCP channel. - * @return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_EncryptEcbNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size); - -/*! - * @brief Decrypts AES using ECB block mode. - * - * Puts AES ECB decrypt dcpPacket to DCP input job ring. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. - * @param[out] dcpPacket Memory for the DCP work packet. - * @param ciphertext Input cipher text to decrypt - * @param[out] plaintext Output plain text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @return kStatus_Success The work packet has been scheduled at DCP channel. - * @return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_DecryptEcbNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size); - -/*! - * @brief Encrypts AES using CBC block mode. - * - * Puts AES CBC encrypt dcpPacket to DCP input job ring. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. Specifies jobRing. - * @param[out] dcpPacket Memory for the DCP work packet. - * @param plaintext Input plain text to encrypt - * @param[out] ciphertext Output cipher text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @param iv Input initial vector to combine with the first input block. - * @return kStatus_Success The work packet has been scheduled at DCP channel. - * @return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_EncryptCbcNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *plaintext, - uint8_t *ciphertext, - size_t size, - const uint8_t *iv); - -/*! - * @brief Decrypts AES using CBC block mode. - * - * Puts AES CBC decrypt dcpPacket to DCP input job ring. - * - * @param base DCP peripheral base address - * @param handle Handle used for this request. Specifies jobRing. - * @param[out] dcpPacket Memory for the DCP work packet. - * @param ciphertext Input cipher text to decrypt - * @param[out] plaintext Output plain text - * @param size Size of input and output data in bytes. Must be multiple of 16 bytes. - * @param iv Input initial vector to combine with the first input block. - * @return kStatus_Success The work packet has been scheduled at DCP channel. - * @return kStatus_DCP_Again The DCP channel is busy processing previous request. - */ -status_t DCP_AES_DecryptCbcNonBlocking(DCP_Type *base, - dcp_handle_t *handle, - dcp_work_packet_t *dcpPacket, - const uint8_t *ciphertext, - uint8_t *plaintext, - size_t size, - const uint8_t *iv); - -/*! - *@} - */ /* end of dcp_nonblocking_driver_aes */ - -/******************************************************************************* - * HASH API - ******************************************************************************/ - -/*! - * @addtogroup dcp_driver_hash - * @{ - */ -/*! - * @brief Initialize HASH context - * - * This function initializes the HASH. - * - * @param base DCP peripheral base address - * @param handle Specifies the DCP channel used for hashing. - * @param[out] ctx Output hash context - * @param algo Underlaying algorithm to use for hash computation. - * @return Status of initialization - */ -status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo); - -/*! - * @brief Add data to current HASH - * - * Add data to current HASH. This can be called repeatedly with an arbitrary amount of data to be - * hashed. The functions blocks. If it returns kStatus_Success, the running hash - * has been updated (DCP has processed the input data), so the memory at the input pointer - * can be released back to system. The DCP context buffer is updated with the running hash - * and with all necessary information to support possible context switch. - * - * @param base DCP peripheral base address - * @param[in,out] ctx HASH context - * @param input Input data - * @param inputSize Size of input data in bytes - * @return Status of the hash update operation - */ -status_t DCP_HASH_Update(DCP_Type *base, dcp_hash_ctx_t *ctx, const uint8_t *input, size_t inputSize); - -/*! - * @brief Finalize hashing - * - * Outputs the final hash (computed by DCP_HASH_Update()) and erases the context. - * - * @param base DCP peripheral base address - * @param[in,out] ctx Input hash context - * @param[out] output Output hash data - * @param[in,out] outputSize Optional parameter (can be passed as NULL). On function entry, it specifies the size of - * output[] buffer. On function return, it stores the number of updated output bytes. - * @return Status of the hash finish operation - */ -status_t DCP_HASH_Finish(DCP_Type *base, dcp_hash_ctx_t *ctx, uint8_t *output, size_t *outputSize); - -/*! - * @brief Create HASH on given data - * - * Perform the full SHA or CRC32 in one function call. The function is blocking. - * - * @param base DCP peripheral base address - * @param handle Handle used for the request. - * @param algo Underlaying algorithm to use for hash computation. - * @param input Input data - * @param inputSize Size of input data in bytes - * @param[out] output Output hash data - * @param[out] outputSize Output parameter storing the size of the output hash in bytes - * @return Status of the one call hash operation. - */ -status_t DCP_HASH(DCP_Type *base, - dcp_handle_t *handle, - dcp_hash_algo_t algo, - const uint8_t *input, - size_t inputSize, - uint8_t *output, - size_t *outputSize); - -/*! - *@} - */ /* end of dcp_driver_hash */ - -#if defined(__cplusplus) -} -#endif - -#endif /* _FSL_DCP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_dmamux.c b/devices/MIMXRT1052/drivers/fsl_dmamux.c deleted file mode 100644 index 8bfbe6c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dmamux.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_dmamux.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.dmamux" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get instance number for DMAMUX. - * - * @param base DMAMUX peripheral base address. - */ -static uint32_t DMAMUX_GetInstance(DMAMUX_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Array to map DMAMUX instance number to base pointer. */ -static DMAMUX_Type *const s_dmamuxBases[] = DMAMUX_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Array to map DMAMUX instance number to clock name. */ -static const clock_ip_name_t s_dmamuxClockName[] = DMAMUX_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t DMAMUX_GetInstance(DMAMUX_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_dmamuxBases); instance++) - { - if (s_dmamuxBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_dmamuxBases)); - - return instance; -} - -/*! - * brief Initializes the DMAMUX peripheral. - * - * This function ungates the DMAMUX clock. - * - * param base DMAMUX peripheral base address. - * - */ -void DMAMUX_Init(DMAMUX_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_EnableClock(s_dmamuxClockName[DMAMUX_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Deinitializes the DMAMUX peripheral. - * - * This function gates the DMAMUX clock. - * - * param base DMAMUX peripheral base address. - */ -void DMAMUX_Deinit(DMAMUX_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(s_dmamuxClockName[DMAMUX_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} diff --git a/devices/MIMXRT1052/drivers/fsl_dmamux.h b/devices/MIMXRT1052/drivers/fsl_dmamux.h deleted file mode 100644 index 2f627c2..0000000 --- a/devices/MIMXRT1052/drivers/fsl_dmamux.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_DMAMUX_H_ -#define _FSL_DMAMUX_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup dmamux - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief DMAMUX driver version 2.0.5. */ -#define FSL_DMAMUX_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) -/*@}*/ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name DMAMUX Initialization and de-initialization - * @{ - */ - -/*! - * @brief Initializes the DMAMUX peripheral. - * - * This function ungates the DMAMUX clock. - * - * @param base DMAMUX peripheral base address. - * - */ -void DMAMUX_Init(DMAMUX_Type *base); - -/*! - * @brief Deinitializes the DMAMUX peripheral. - * - * This function gates the DMAMUX clock. - * - * @param base DMAMUX peripheral base address. - */ -void DMAMUX_Deinit(DMAMUX_Type *base); - -/* @} */ -/*! - * @name DMAMUX Channel Operation - * @{ - */ - -/*! - * @brief Enables the DMAMUX channel. - * - * This function enables the DMAMUX channel. - * - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - */ -static inline void DMAMUX_EnableChannel(DMAMUX_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->CHCFG[channel] |= DMAMUX_CHCFG_ENBL_MASK; -} - -/*! - * @brief Disables the DMAMUX channel. - * - * This function disables the DMAMUX channel. - * - * @note The user must disable the DMAMUX channel before configuring it. - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - */ -static inline void DMAMUX_DisableChannel(DMAMUX_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - -#if defined FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH && (FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH == 32U) - base->CHCFG[channel] &= ~DMAMUX_CHCFG_ENBL_MASK; -#else - base->CHCFG[channel] &= ~(uint8_t)DMAMUX_CHCFG_ENBL_MASK; -#endif -} - -/*! - * @brief Configures the DMAMUX channel source. - * - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - * @param source Channel source, which is used to trigger the DMA transfer. - */ -static inline void DMAMUX_SetSource(DMAMUX_Type *base, uint32_t channel, uint32_t source) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - -#if defined FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH && (FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH == 32U) - base->CHCFG[channel] = ((base->CHCFG[channel] & ~DMAMUX_CHCFG_SOURCE_MASK) | DMAMUX_CHCFG_SOURCE(source)); -#else - base->CHCFG[channel] = (uint8_t)((base->CHCFG[channel] & ~DMAMUX_CHCFG_SOURCE_MASK) | DMAMUX_CHCFG_SOURCE(source)); -#endif -} - -#if defined(FSL_FEATURE_DMAMUX_HAS_TRIG) && FSL_FEATURE_DMAMUX_HAS_TRIG > 0U -/*! - * @brief Enables the DMAMUX period trigger. - * - * This function enables the DMAMUX period trigger feature. - * - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - */ -static inline void DMAMUX_EnablePeriodTrigger(DMAMUX_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->CHCFG[channel] |= DMAMUX_CHCFG_TRIG_MASK; -} - -/*! - * @brief Disables the DMAMUX period trigger. - * - * This function disables the DMAMUX period trigger. - * - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - */ -static inline void DMAMUX_DisablePeriodTrigger(DMAMUX_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - -#if defined FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH && (FSL_FEATURE_DMAMUX_CHCFG_REGISTER_WIDTH == 32U) - base->CHCFG[channel] &= ~DMAMUX_CHCFG_TRIG_MASK; -#else - base->CHCFG[channel] &= ~(uint8_t)DMAMUX_CHCFG_TRIG_MASK; -#endif -} -#endif /* FSL_FEATURE_DMAMUX_HAS_TRIG */ - -#if (defined(FSL_FEATURE_DMAMUX_HAS_A_ON) && FSL_FEATURE_DMAMUX_HAS_A_ON) -/*! - * @brief Enables the DMA channel to be always ON. - * - * This function enables the DMAMUX channel always ON feature. - * - * @param base DMAMUX peripheral base address. - * @param channel DMAMUX channel number. - * @param enable Switcher of the always ON feature. "true" means enabled, "false" means disabled. - */ -static inline void DMAMUX_EnableAlwaysOn(DMAMUX_Type *base, uint32_t channel, bool enable) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - if (enable) - { - base->CHCFG[channel] |= DMAMUX_CHCFG_A_ON_MASK; - } - else - { - base->CHCFG[channel] &= ~DMAMUX_CHCFG_A_ON_MASK; - } -} -#endif /* FSL_FEATURE_DMAMUX_HAS_A_ON */ - -/* @} */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/* @} */ - -#endif /* _FSL_DMAMUX_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_edma.c b/devices/MIMXRT1052/drivers/fsl_edma.c deleted file mode 100644 index 5d6d4a4..0000000 --- a/devices/MIMXRT1052/drivers/fsl_edma.c +++ /dev/null @@ -1,2803 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.edma" -#endif - -#define EDMA_TRANSFER_ENABLED_MASK 0x80U - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get instance offset. - * - * @param instance EDMA peripheral instance number. - */ -static uint32_t EDMA_GetInstanceOffset(uint32_t instance); - -/*! - * @brief Map transfer width. - * - * @param width transfer width. - */ -static edma_transfer_size_t EDMA_TransferWidthMapping(uint32_t width); -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Array to map EDMA instance number to base pointer. */ -static DMA_Type *const s_edmaBases[] = DMA_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Array to map EDMA instance number to clock name. */ -static const clock_ip_name_t s_edmaClockName[] = EDMA_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Array to map EDMA instance number to IRQ number. */ -static const IRQn_Type s_edmaIRQNumber[][FSL_FEATURE_EDMA_MODULE_CHANNEL] = DMA_CHN_IRQS; - -/*! @brief Pointers to transfer handle for each EDMA channel. */ -static edma_handle_t *s_EDMAHandle[FSL_FEATURE_EDMA_MODULE_CHANNEL * FSL_FEATURE_SOC_EDMA_COUNT]; - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t EDMA_GetInstance(DMA_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_edmaBases); instance++) - { - if (s_edmaBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_edmaBases)); - - return instance; -} - -/*! - * brief Push content of TCD structure into hardware TCD register. - * - * param base EDMA peripheral base address. - * param channel EDMA channel number. - * param tcd Point to TCD structure. - */ -void EDMA_InstallTCD(DMA_Type *base, uint32_t channel, edma_tcd_t *tcd) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - /* Push tcd into hardware TCD register */ - base->TCD[channel].SADDR = tcd->SADDR; - base->TCD[channel].SOFF = tcd->SOFF; - base->TCD[channel].ATTR = tcd->ATTR; - base->TCD[channel].NBYTES_MLNO = tcd->NBYTES; - base->TCD[channel].SLAST = (int32_t)tcd->SLAST; - base->TCD[channel].DADDR = tcd->DADDR; - base->TCD[channel].DOFF = tcd->DOFF; - base->TCD[channel].CITER_ELINKNO = tcd->CITER; - base->TCD[channel].DLAST_SGA = (int32_t)tcd->DLAST_SGA; - /* Clear DONE bit first, otherwise ESG cannot be set */ - base->TCD[channel].CSR = 0; - base->TCD[channel].CSR = tcd->CSR; - base->TCD[channel].BITER_ELINKNO = tcd->BITER; -} - -/*! - * brief Initializes the eDMA peripheral. - * - * This function ungates the eDMA clock and configures the eDMA peripheral according - * to the configuration structure. - * - * param base eDMA peripheral base address. - * param config A pointer to the configuration structure, see "edma_config_t". - * note This function enables the minor loop map feature. - */ -void EDMA_Init(DMA_Type *base, const edma_config_t *config) -{ - assert(config != NULL); - - uint32_t tmpreg; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate EDMA peripheral clock */ - CLOCK_EnableClock(s_edmaClockName[EDMA_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* clear all the enabled request, status to make sure EDMA status is in normal condition */ - base->ERQ = 0U; - base->INT = 0xFFFFFFFFU; - base->ERR = 0xFFFFFFFFU; - /* Configure EDMA peripheral according to the configuration structure. */ - tmpreg = base->CR; - tmpreg &= ~(DMA_CR_ERCA_MASK | DMA_CR_HOE_MASK | DMA_CR_CLM_MASK | DMA_CR_EDBG_MASK); - tmpreg |= (DMA_CR_ERCA(config->enableRoundRobinArbitration) | DMA_CR_HOE(config->enableHaltOnError) | - DMA_CR_CLM(config->enableContinuousLinkMode) | DMA_CR_EDBG(config->enableDebugMode) | DMA_CR_EMLM(1U)); - base->CR = tmpreg; -} - -/*! - * brief Deinitializes the eDMA peripheral. - * - * This function gates the eDMA clock. - * - * param base eDMA peripheral base address. - */ -void EDMA_Deinit(DMA_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Gate EDMA peripheral clock */ - CLOCK_DisableClock(s_edmaClockName[EDMA_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets the eDMA default configuration structure. - * - * This function sets the configuration structure to default values. - * The default configuration is set to the following values. - * code - * config.enableContinuousLinkMode = false; - * config.enableHaltOnError = true; - * config.enableRoundRobinArbitration = false; - * config.enableDebugMode = false; - * endcode - * - * param config A pointer to the eDMA configuration structure. - */ -void EDMA_GetDefaultConfig(edma_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableRoundRobinArbitration = false; - config->enableHaltOnError = true; - config->enableContinuousLinkMode = false; - config->enableDebugMode = false; -} - -/*! - * brief Sets all TCD registers to default values. - * - * This function sets TCD registers for this channel to default values. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * note This function must not be called while the channel transfer is ongoing - * or it causes unpredictable results. - * note This function enables the auto stop request feature. - */ -void EDMA_ResetChannel(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - EDMA_TcdReset((edma_tcd_t *)(uint32_t)&base->TCD[channel]); -} - -/*! - * brief Configures the eDMA transfer attribute. - * - * This function configures the transfer attribute, including source address, destination address, - * transfer size, address offset, and so on. It also configures the scatter gather feature if the - * user supplies the TCD address. - * Example: - * code - * edma_transfer_t config; - * edma_tcd_t tcd; - * config.srcAddr = ..; - * config.destAddr = ..; - * ... - * EDMA_SetTransferConfig(DMA0, channel, &config, &stcd); - * endcode - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param config Pointer to eDMA transfer configuration structure. - * param nextTcd Point to TCD structure. It can be NULL if users - * do not want to enable scatter/gather feature. - * note If nextTcd is not NULL, it means scatter gather feature is enabled - * and DREQ bit is cleared in the previous transfer configuration, which - * is set in the eDMA_ResetChannel. - */ -void EDMA_SetTransferConfig(DMA_Type *base, uint32_t channel, const edma_transfer_config_t *config, edma_tcd_t *nextTcd) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - assert(config != NULL); - assert(((uint32_t)nextTcd & 0x1FU) == 0U); - - EDMA_TcdSetTransferConfig((edma_tcd_t *)(uint32_t)&base->TCD[channel], config, nextTcd); -} - -/*! - * brief Configures the eDMA minor offset feature. - * - * The minor offset means that the signed-extended value is added to the source address or destination - * address after each minor loop. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param config A pointer to the minor offset configuration structure. - */ -void EDMA_SetMinorOffsetConfig(DMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - assert(config != NULL); - - uint32_t tmpreg; - - tmpreg = base->TCD[channel].NBYTES_MLOFFYES; - tmpreg &= ~(DMA_NBYTES_MLOFFYES_SMLOE_MASK | DMA_NBYTES_MLOFFYES_DMLOE_MASK | DMA_NBYTES_MLOFFYES_MLOFF_MASK); - tmpreg |= - (DMA_NBYTES_MLOFFYES_SMLOE(config->enableSrcMinorOffset) | - DMA_NBYTES_MLOFFYES_DMLOE(config->enableDestMinorOffset) | DMA_NBYTES_MLOFFYES_MLOFF(config->minorOffset)); - base->TCD[channel].NBYTES_MLOFFYES = tmpreg; -} - -/*! - * brief Configures the eDMA channel TCD major offset feature. - * - * Adjustment value added to the source address at the completion of the major iteration count - * - * param base eDMA peripheral base address. - * param channel edma channel number. - * param sourceOffset source address offset. - * param destOffset destination address offset. - */ -void EDMA_SetMajorOffsetConfig(DMA_Type *base, uint32_t channel, int32_t sourceOffset, int32_t destOffset) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - base->TCD[channel].SLAST = sourceOffset; - base->TCD[channel].DLAST_SGA = destOffset; -} - -/*! - * brief Configures the eDMA channel preemption feature. - * - * This function configures the channel preemption attribute and the priority of the channel. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number - * param config A pointer to the channel preemption configuration structure. - */ -void EDMA_SetChannelPreemptionConfig(DMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - assert(config != NULL); - - bool tmpEnablePreemptAbility = config->enablePreemptAbility; - bool tmpEnableChannelPreemption = config->enableChannelPreemption; - uint8_t tmpChannelPriority = config->channelPriority; - volatile uint8_t *tmpReg = &base->DCHPRI3; - - ((volatile uint8_t *)tmpReg)[DMA_DCHPRI_INDEX(channel)] = - (DMA_DCHPRI0_DPA((true == tmpEnablePreemptAbility ? 0U : 1U)) | - DMA_DCHPRI0_ECP((true == tmpEnableChannelPreemption ? 1U : 0U)) | DMA_DCHPRI0_CHPRI(tmpChannelPriority)); -} - -/*! - * brief Sets the channel link for the eDMA transfer. - * - * This function configures either the minor link or the major link mode. The minor link means that the channel link is - * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is - * exhausted. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param type A channel link type, which can be one of the following: - * arg kEDMA_LinkNone - * arg kEDMA_MinorLink - * arg kEDMA_MajorLink - * param linkedChannel The linked channel number. - * note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. - */ -void EDMA_SetChannelLink(DMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - assert(linkedChannel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - EDMA_TcdSetChannelLink((edma_tcd_t *)(uint32_t)&base->TCD[channel], type, linkedChannel); -} - -/*! - * brief Sets the bandwidth for the eDMA transfer. - * - * Because the eDMA processes the minor loop, it continuously generates read/write sequences - * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of - * each read/write access to control the bus request bandwidth seen by the crossbar switch. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param bandWidth A bandwidth setting, which can be one of the following: - * arg kEDMABandwidthStallNone - * arg kEDMABandwidthStall4Cycle - * arg kEDMABandwidthStall8Cycle - */ -void EDMA_SetBandWidth(DMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - base->TCD[channel].CSR = (uint16_t)((base->TCD[channel].CSR & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth)); -} - -/*! - * brief Sets the source modulo and the destination modulo for the eDMA transfer. - * - * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) - * calculation is performed or the original register value. It provides the ability to implement a circular data - * queue easily. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param srcModulo A source modulo value. - * param destModulo A destination modulo value. - */ -void EDMA_SetModulo(DMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - uint16_t tmpreg; - - tmpreg = base->TCD[channel].ATTR & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); - base->TCD[channel].ATTR = tmpreg | DMA_ATTR_DMOD(destModulo) | DMA_ATTR_SMOD(srcModulo); -} - -/*! - * brief Enables the interrupt source for the eDMA transfer. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - /* Enable error interrupt */ - if (0U != (mask & (uint32_t)kEDMA_ErrorInterruptEnable)) - { - base->EEI |= ((uint32_t)0x1U << channel); - } - - /* Enable Major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) - { - base->TCD[channel].CSR |= DMA_CSR_INTMAJOR_MASK; - } - - /* Enable Half major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) - { - base->TCD[channel].CSR |= DMA_CSR_INTHALF_MASK; - } -} - -/*! - * brief Disables the interrupt source for the eDMA transfer. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param mask The mask of the interrupt source to be set. Use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_DisableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - /* Disable error interrupt */ - if (0U != (mask & (uint32_t)kEDMA_ErrorInterruptEnable)) - { - base->EEI &= (~((uint32_t)0x1U << channel)); - } - - /* Disable Major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) - { - base->TCD[channel].CSR &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK; - } - - /* Disable Half major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) - { - base->TCD[channel].CSR &= ~(uint16_t)DMA_CSR_INTHALF_MASK; - } -} - -/*! - * brief Sets all fields to default values for the TCD structure. - * - * This function sets all fields for this TCD structure to default value. - * - * param tcd Pointer to the TCD structure. - * note This function enables the auto stop request feature. - */ -void EDMA_TcdReset(edma_tcd_t *tcd) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - /* Reset channel TCD */ - tcd->SADDR = 0U; - tcd->SOFF = 0U; - tcd->ATTR = 0U; - tcd->NBYTES = 0U; - tcd->SLAST = 0U; - tcd->DADDR = 0U; - tcd->DOFF = 0U; - tcd->CITER = 0U; - tcd->DLAST_SGA = 0U; - /* Enable auto disable request feature */ - tcd->CSR = DMA_CSR_DREQ(true); - tcd->BITER = 0U; -} - -/*! - * brief Configures the eDMA TCD transfer attribute. - * - * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. - * The STCD is used in the scatter-gather mode. - * This function configures the TCD transfer attribute, including source address, destination address, - * transfer size, address offset, and so on. It also configures the scatter gather feature if the - * user supplies the next TCD address. - * Example: - * code - * edma_transfer_t config = { - * ... - * } - * edma_tcd_t tcd __aligned(32); - * edma_tcd_t nextTcd __aligned(32); - * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); - * endcode - * - * param tcd Pointer to the TCD structure. - * param config Pointer to eDMA transfer configuration structure. - * param nextTcd Pointer to the next TCD structure. It can be NULL if users - * do not want to enable scatter/gather feature. - * note TCD address should be 32 bytes aligned or it causes an eDMA error. - * note If the nextTcd is not NULL, the scatter gather feature is enabled - * and DREQ bit is cleared in the previous transfer configuration, which - * is set in the EDMA_TcdReset. - */ -void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - assert(config != NULL); - assert(((uint32_t)nextTcd & 0x1FU) == 0U); - assert((config->srcAddr % (1UL << (uint32_t)config->srcTransferSize)) == 0U); - assert((config->destAddr % (1UL << (uint32_t)config->destTransferSize)) == 0U); - - /* source address */ - tcd->SADDR = config->srcAddr; - /* destination address */ - tcd->DADDR = config->destAddr; - /* Source data and destination data transfer size */ - tcd->ATTR = DMA_ATTR_SSIZE(config->srcTransferSize) | DMA_ATTR_DSIZE(config->destTransferSize); - /* Source address signed offset */ - tcd->SOFF = (uint16_t)config->srcOffset; - /* Destination address signed offset */ - tcd->DOFF = (uint16_t)config->destOffset; - /* Minor byte transfer count */ - tcd->NBYTES = config->minorLoopBytes; - /* Current major iteration count */ - tcd->CITER = (uint16_t)config->majorLoopCounts; - /* Starting major iteration count */ - tcd->BITER = (uint16_t)config->majorLoopCounts; - /* Enable scatter/gather processing */ - if (nextTcd != NULL) - { - tcd->DLAST_SGA = (uint32_t)nextTcd; - /* - Before call EDMA_TcdSetTransferConfig or EDMA_SetTransferConfig, - user must call EDMA_TcdReset or EDMA_ResetChannel which will set - DREQ, so must use "|" or "&" rather than "=". - - Clear the DREQ bit because scatter gather has been enabled, so the - previous transfer is not the last transfer, and channel request should - be enabled at the next transfer(the next TCD). - */ - tcd->CSR = (tcd->CSR | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; - } -} - -/*! - * brief Configures the eDMA TCD minor offset feature. - * - * A minor offset is a signed-extended value added to the source address or a destination - * address after each minor loop. - * - * param tcd A point to the TCD structure. - * param config A pointer to the minor offset configuration structure. - */ -void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - uint32_t tmpreg; - - tmpreg = tcd->NBYTES & - ~(DMA_NBYTES_MLOFFYES_SMLOE_MASK | DMA_NBYTES_MLOFFYES_DMLOE_MASK | DMA_NBYTES_MLOFFYES_MLOFF_MASK); - tmpreg |= - (DMA_NBYTES_MLOFFYES_SMLOE(config->enableSrcMinorOffset) | - DMA_NBYTES_MLOFFYES_DMLOE(config->enableDestMinorOffset) | DMA_NBYTES_MLOFFYES_MLOFF(config->minorOffset)); - tcd->NBYTES = tmpreg; -} - -/*! - * brief Configures the eDMA TCD major offset feature. - * - * Adjustment value added to the source address at the completion of the major iteration count - * - * param tcd A point to the TCD structure. - * param sourceOffset source address offset. - * param destOffset destination address offset. - */ -void EDMA_TcdSetMajorOffsetConfig(edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - tcd->SLAST = (uint32_t)sourceOffset; - tcd->DLAST_SGA = (uint32_t)destOffset; -} - -/*! - * brief Sets the channel link for the eDMA TCD. - * - * This function configures either a minor link or a major link. The minor link means the channel link is - * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is - * exhausted. - * - * note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. - * param tcd Point to the TCD structure. - * param type Channel link type, it can be one of: - * arg kEDMA_LinkNone - * arg kEDMA_MinorLink - * arg kEDMA_MajorLink - * param linkedChannel The linked channel number. - */ -void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - assert(linkedChannel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - if (type == kEDMA_MinorLink) /* Minor link config */ - { - uint16_t tmpreg; - - /* Enable minor link */ - tcd->CITER |= DMA_CITER_ELINKYES_ELINK_MASK; - tcd->BITER |= DMA_BITER_ELINKYES_ELINK_MASK; - /* Set linked channel */ - tmpreg = tcd->CITER & (~(uint16_t)DMA_CITER_ELINKYES_LINKCH_MASK); - tmpreg |= DMA_CITER_ELINKYES_LINKCH(linkedChannel); - tcd->CITER = tmpreg; - tmpreg = tcd->BITER & (~(uint16_t)DMA_BITER_ELINKYES_LINKCH_MASK); - tmpreg |= DMA_BITER_ELINKYES_LINKCH(linkedChannel); - tcd->BITER = tmpreg; - } - else if (type == kEDMA_MajorLink) /* Major link config */ - { - uint16_t tmpreg; - - /* Enable major link */ - tcd->CSR |= DMA_CSR_MAJORELINK_MASK; - /* Set major linked channel */ - tmpreg = tcd->CSR & (~(uint16_t)DMA_CSR_MAJORLINKCH_MASK); - tcd->CSR = tmpreg | DMA_CSR_MAJORLINKCH(linkedChannel); - } - else /* Link none */ - { - tcd->CITER &= ~(uint16_t)DMA_CITER_ELINKYES_ELINK_MASK; - tcd->BITER &= ~(uint16_t)DMA_BITER_ELINKYES_ELINK_MASK; - tcd->CSR &= ~(uint16_t)DMA_CSR_MAJORELINK_MASK; - } -} - -/*! - * brief Sets the source modulo and the destination modulo for the eDMA TCD. - * - * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) - * calculation is performed or the original register value. It provides the ability to implement a circular data - * queue easily. - * - * param tcd A pointer to the TCD structure. - * param srcModulo A source modulo value. - * param destModulo A destination modulo value. - */ -void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - uint16_t tmpreg; - - tmpreg = tcd->ATTR & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); - tcd->ATTR = tmpreg | DMA_ATTR_DMOD(destModulo) | DMA_ATTR_SMOD(srcModulo); -} - -/*! - * brief Enables the interrupt source for the eDMA TCD. - * - * param tcd Point to the TCD structure. - * param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask) -{ - assert(tcd != NULL); - - /* Enable Major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) - { - tcd->CSR |= DMA_CSR_INTMAJOR_MASK; - } - - /* Enable Half major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) - { - tcd->CSR |= DMA_CSR_INTHALF_MASK; - } -} - -/*! - * brief Disables the interrupt source for the eDMA TCD. - * - * param tcd Point to the TCD structure. - * param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask) -{ - assert(tcd != NULL); - - /* Disable Major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) - { - tcd->CSR &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK; - } - - /* Disable Half major interrupt */ - if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) - { - tcd->CSR &= ~(uint16_t)DMA_CSR_INTHALF_MASK; - } -} - -/*! - * brief Gets the remaining major loop count from the eDMA current channel TCD. - * - * This function checks the TCD (Task Control Descriptor) status for a specified - * eDMA channel and returns the number of major loop count that has not finished. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * return Major loop count which has not been transferred yet for the current TCD. - * note 1. This function can only be used to get unfinished major loop count of transfer without - * the next TCD, or it might be inaccuracy. - * 2. The unfinished/remaining transfer bytes cannot be obtained directly from registers while - * the channel is running. - * Because to calculate the remaining bytes, the initial NBYTES configured in DMA_TCDn_NBYTES_MLNO - * register is needed while the eDMA IP does not support getting it while a channel is active. - * In another word, the NBYTES value reading is always the actual (decrementing) NBYTES value the dma_engine - * is working with while a channel is running. - * Consequently, to get the remaining transfer bytes, a software-saved initial value of NBYTES (for example - * copied before enabling the channel) is needed. The formula to calculate it is shown below: - * RemainingBytes = RemainingMajorLoopCount * NBYTES(initially configured) - */ -uint32_t EDMA_GetRemainingMajorLoopCount(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - uint32_t remainingCount = 0; - - if (0U != (DMA_CSR_DONE_MASK & base->TCD[channel].CSR)) - { - remainingCount = 0; - } - else - { - /* Calculate the unfinished bytes */ - if (0U != (base->TCD[channel].CITER_ELINKNO & DMA_CITER_ELINKNO_ELINK_MASK)) - { - remainingCount = (((uint32_t)base->TCD[channel].CITER_ELINKYES & DMA_CITER_ELINKYES_CITER_MASK) >> - DMA_CITER_ELINKYES_CITER_SHIFT); - } - else - { - remainingCount = (((uint32_t)base->TCD[channel].CITER_ELINKNO & DMA_CITER_ELINKNO_CITER_MASK) >> - DMA_CITER_ELINKNO_CITER_SHIFT); - } - } - - return remainingCount; -} - -/*! - * brief Gets the eDMA channel status flags. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * return The mask of channel status flags. Users need to use the - * _edma_channel_status_flags type to decode the return variables. - */ -uint32_t EDMA_GetChannelStatusFlags(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - uint32_t retval = 0; - - /* Get DONE bit flag */ - retval |= (((uint32_t)base->TCD[channel].CSR & DMA_CSR_DONE_MASK) >> DMA_CSR_DONE_SHIFT); - /* Get ERROR bit flag */ - retval |= ((((uint32_t)base->ERR >> channel) & 0x1U) << 1U); - /* Get INT bit flag */ - retval |= ((((uint32_t)base->INT >> channel) & 0x1U) << 2U); - - return retval; -} - -/*! - * brief Clears the eDMA channel status flags. - * - * param base eDMA peripheral base address. - * param channel eDMA channel number. - * param mask The mask of channel status to be cleared. Users need to use - * the defined _edma_channel_status_flags type. - */ -void EDMA_ClearChannelStatusFlags(DMA_Type *base, uint32_t channel, uint32_t mask) -{ - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - /* Clear DONE bit flag */ - if (0U != (mask & (uint32_t)kEDMA_DoneFlag)) - { - base->CDNE = (uint8_t)channel; - } - /* Clear ERROR bit flag */ - if (0U != (mask & (uint32_t)kEDMA_ErrorFlag)) - { - base->CERR = (uint8_t)channel; - } - /* Clear INT bit flag */ - if (0U != (mask & (uint32_t)kEDMA_InterruptFlag)) - { - base->CINT = (uint8_t)channel; - } -} - -static uint32_t EDMA_GetInstanceOffset(uint32_t instance) -{ - static uint8_t startInstanceNum; - -#if defined(DMA0) - startInstanceNum = (uint8_t)EDMA_GetInstance(DMA0); -#elif defined(DMA1) - startInstanceNum = (uint8_t)EDMA_GetInstance(DMA1); -#elif defined(DMA2) - startInstanceNum = (uint8_t)EDMA_GetInstance(DMA2); -#elif defined(DMA3) - startInstanceNum = (uint8_t)EDMA_GetInstance(DMA3); -#endif - - assert(startInstanceNum <= instance); - - return instance - startInstanceNum; -} - -/*! - * brief Creates the eDMA handle. - * - * This function is called if using the transactional API for eDMA. This function - * initializes the internal state of the eDMA handle. - * - * param handle eDMA handle pointer. The eDMA handle stores callback function and - * parameters. - * param base eDMA peripheral base address. - * param channel eDMA channel number. - */ -void EDMA_CreateHandle(edma_handle_t *handle, DMA_Type *base, uint32_t channel) -{ - assert(handle != NULL); - assert(channel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); - - uint32_t edmaInstance; - uint32_t channelIndex; - edma_tcd_t *tcdRegs; - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - handle->base = base; - handle->channel = (uint8_t)channel; - - /* Get the DMA instance number */ - edmaInstance = EDMA_GetInstance(base); - channelIndex = (EDMA_GetInstanceOffset(edmaInstance) * (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL) + channel; - s_EDMAHandle[channelIndex] = handle; - - /* Enable NVIC interrupt */ - (void)EnableIRQ(s_edmaIRQNumber[edmaInstance][channel]); - - /* - Reset TCD registers to zero. Unlike the EDMA_TcdReset(DREQ will be set), - CSR will be 0. Because in order to suit EDMA busy check mechanism in - EDMA_SubmitTransfer, CSR must be set 0. - */ - tcdRegs = (edma_tcd_t *)(uint32_t)&handle->base->TCD[handle->channel]; - tcdRegs->SADDR = 0; - tcdRegs->SOFF = 0; - tcdRegs->ATTR = 0; - tcdRegs->NBYTES = 0; - tcdRegs->SLAST = 0; - tcdRegs->DADDR = 0; - tcdRegs->DOFF = 0; - tcdRegs->CITER = 0; - tcdRegs->DLAST_SGA = 0; - tcdRegs->CSR = 0; - tcdRegs->BITER = 0; -} - -/*! - * brief Installs the TCDs memory pool into the eDMA handle. - * - * This function is called after the EDMA_CreateHandle to use scatter/gather feature. This function shall only be used - * while users need to use scatter gather mode. Scatter gather mode enables EDMA to load a new transfer control block - * (tcd) in hardware, and automatically reconfigure that DMA channel for a new transfer. - * Users need to prepare tcd memory and also configure tcds using interface EDMA_SubmitTransfer. - * - * param handle eDMA handle pointer. - * param tcdPool A memory pool to store TCDs. It must be 32 bytes aligned. - * param tcdSize The number of TCD slots. - */ -void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize) -{ - assert(handle != NULL); - assert(((uint32_t)tcdPool & 0x1FU) == 0U); - - /* Initialize tcd queue attribute. */ - /* header should initial as 1, since that it is used to point to the next TCD to be loaded into TCD memory, - * In EDMA driver IRQ handler, header will be used to calculate how many tcd has done, for example, - * If application submit 4 transfer request, A->B->C->D, - * when A finshed, the header is 0, C is the next TCD to be load, since B is already loaded, - * according to EDMA driver IRQ handler, tcdDone = C - A - header = 2 - header = 2, but actually only 1 TCD done, - * so the issue will be the wrong TCD done count will pass to application in first TCD interrupt. - * During first submit, the header should be assigned to 1, since 0 is current one and 1 is next TCD to be loaded, - * but software cannot know which submission is the first one, so assign 1 to header here. - */ - handle->header = 1; - handle->tcdUsed = 0; - handle->tcdSize = (int8_t)tcdSize; - handle->flags = 0; - handle->tcdPool = tcdPool; -} - -/*! - * brief Installs a callback function for the eDMA transfer. - * - * This callback is called in the eDMA IRQ handler. Use the callback to do something after - * the current major loop transfer completes. This function will be called every time one tcd finished transfer. - * - * param handle eDMA handle pointer. - * param callback eDMA callback function pointer. - * param userData A parameter for the callback function. - */ -void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData) -{ - assert(handle != NULL); - - handle->callback = callback; - handle->userData = userData; -} - -static edma_transfer_size_t EDMA_TransferWidthMapping(uint32_t width) -{ - edma_transfer_size_t transferSize = kEDMA_TransferSize1Bytes; - - /* map width to register value */ - switch (width) - { - /* width 8bit */ - case 1U: - transferSize = kEDMA_TransferSize1Bytes; - break; - /* width 16bit */ - case 2U: - transferSize = kEDMA_TransferSize2Bytes; - break; - /* width 32bit */ - case 4U: - transferSize = kEDMA_TransferSize4Bytes; - break; -#if (defined(FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) - /* width 64bit */ - case 8U: - transferSize = kEDMA_TransferSize8Bytes; - break; -#endif -#if (defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) - /* width 128bit */ - case 16U: - transferSize = kEDMA_TransferSize16Bytes; - break; -#endif - /* width 256bit */ - case 32U: - transferSize = kEDMA_TransferSize32Bytes; - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - assert(false); - break; - } - - return transferSize; -} - -/*! - * brief Prepares the eDMA transfer structure configurations. - * - * This function prepares the transfer configuration structure according to the user input. - * - * param config The user configuration structure of type edma_transfer_t. - * param srcAddr eDMA transfer source address. - * param srcWidth eDMA transfer source address width(bytes). - * param srcOffset source address offset. - * param destAddr eDMA transfer destination address. - * param destWidth eDMA transfer destination address width(bytes). - * param destOffset destination address offset. - * param bytesEachRequest eDMA transfer bytes per channel request. - * param transferBytes eDMA transfer bytes to be transferred. - * note The data address and the data width must be consistent. For example, if the SRC - * is 4 bytes, the source address must be 4 bytes aligned, or it results in - * source address error (SAE). - */ -void EDMA_PrepareTransferConfig(edma_transfer_config_t *config, - void *srcAddr, - uint32_t srcWidth, - int16_t srcOffset, - void *destAddr, - uint32_t destWidth, - int16_t destOffset, - uint32_t bytesEachRequest, - uint32_t transferBytes) -{ - assert(config != NULL); - assert(srcAddr != NULL); - assert(destAddr != NULL); - assert((srcWidth != 0U) && (srcWidth <= 32U) && ((srcWidth & (srcWidth - 1U)) == 0U)); - assert((destWidth != 0U) && (destWidth <= 32U) && ((destWidth & (destWidth - 1U)) == 0U)); - assert((transferBytes % bytesEachRequest) == 0U); - assert((((uint32_t)(uint32_t *)srcAddr) % srcWidth) == 0U); - assert((((uint32_t)(uint32_t *)destAddr) % destWidth) == 0U); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->destAddr = (uint32_t)(uint32_t *)destAddr; - config->srcAddr = (uint32_t)(uint32_t *)srcAddr; - config->minorLoopBytes = bytesEachRequest; - config->majorLoopCounts = transferBytes / bytesEachRequest; - config->srcTransferSize = EDMA_TransferWidthMapping(srcWidth); - config->destTransferSize = EDMA_TransferWidthMapping(destWidth); - config->destOffset = destOffset; - config->srcOffset = srcOffset; -} - -/*! - * brief Prepares the eDMA transfer structure. - * - * This function prepares the transfer configuration structure according to the user input. - * - * param config The user configuration structure of type edma_transfer_t. - * param srcAddr eDMA transfer source address. - * param srcWidth eDMA transfer source address width(bytes). - * param destAddr eDMA transfer destination address. - * param destWidth eDMA transfer destination address width(bytes). - * param bytesEachRequest eDMA transfer bytes per channel request. - * param transferBytes eDMA transfer bytes to be transferred. - * param type eDMA transfer type. - * note The data address and the data width must be consistent. For example, if the SRC - * is 4 bytes, the source address must be 4 bytes aligned, or it results in - * source address error (SAE). - */ -void EDMA_PrepareTransfer(edma_transfer_config_t *config, - void *srcAddr, - uint32_t srcWidth, - void *destAddr, - uint32_t destWidth, - uint32_t bytesEachRequest, - uint32_t transferBytes, - edma_transfer_type_t type) -{ - assert(config != NULL); - - int16_t srcOffset = 0, destOffset = 0; - - switch (type) - { - case kEDMA_MemoryToMemory: - destOffset = (int16_t)destWidth; - srcOffset = (int16_t)srcWidth; - break; - case kEDMA_MemoryToPeripheral: - destOffset = 0; - srcOffset = (int16_t)srcWidth; - break; - case kEDMA_PeripheralToMemory: - destOffset = (int16_t)destWidth; - srcOffset = 0; - break; - case kEDMA_PeripheralToPeripheral: - destOffset = 0; - srcOffset = 0; - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - assert(false); - break; - } - - EDMA_PrepareTransferConfig(config, srcAddr, srcWidth, srcOffset, destAddr, destWidth, destOffset, bytesEachRequest, - transferBytes); -} - -/*! - * brief Submits the eDMA transfer request. - * - * This function submits the eDMA transfer request according to the transfer configuration structure. - * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. - * The tcd pools is setup by call function EDMA_InstallTCDMemory before. - * - * param handle eDMA handle pointer. - * param config Pointer to eDMA transfer configuration structure. - * retval kStatus_EDMA_Success It means submit transfer request succeed. - * retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. - * retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. - */ -status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config) -{ - assert(handle != NULL); - assert(config != NULL); - - edma_tcd_t *tcdRegs = (edma_tcd_t *)(uint32_t)&handle->base->TCD[handle->channel]; - - if (handle->tcdPool == NULL) - { - /* - * Check if EDMA channel is busy: - * 1. if channel active bit is set, it implies that minor loop is executing, then channel is busy - * 2. if channel active bit is not set and BITER not equal to CITER, it implies that major loop is executing, - * then channel is busy - * - * There is one case can not be covered in below condition: - * When transfer request is submitted, but no request from peripheral, that is to say channel sevice doesn't - * begin, if application would like to submit another transfer , then the TCD will be overwritten, since the - * ACTIVE is 0 and BITER = CITER, for such case, it is a scatter gather(link TCD) case actually, so - * application should enabled TCD pool for dynamic scatter gather mode by calling EDMA_InstallTCDMemory. - */ - if (((handle->base->TCD[handle->channel].CSR & DMA_CSR_ACTIVE_MASK) != 0U) || - (((handle->base->TCD[handle->channel].CITER_ELINKNO & DMA_CITER_ELINKNO_CITER_MASK) != - (handle->base->TCD[handle->channel].BITER_ELINKNO & DMA_BITER_ELINKNO_BITER_MASK)))) - { - return kStatus_EDMA_Busy; - } - else - { - EDMA_SetTransferConfig(handle->base, handle->channel, config, NULL); - /* Enable auto disable request feature */ - handle->base->TCD[handle->channel].CSR |= DMA_CSR_DREQ_MASK; - /* Enable major interrupt */ - handle->base->TCD[handle->channel].CSR |= DMA_CSR_INTMAJOR_MASK; - - return kStatus_Success; - } - } - else /* Use the TCD queue. */ - { - uint32_t primask; - uint16_t csr; - int8_t currentTcd; - int8_t previousTcd; - int8_t nextTcd; - int8_t tmpTcdUsed; - int8_t tmpTcdSize; - - /* Check if tcd pool is full. */ - primask = DisableGlobalIRQ(); - tmpTcdUsed = handle->tcdUsed; - tmpTcdSize = handle->tcdSize; - if (tmpTcdUsed >= tmpTcdSize) - { - EnableGlobalIRQ(primask); - - return kStatus_EDMA_QueueFull; - } - currentTcd = handle->tail; - handle->tcdUsed++; - /* Calculate index of next TCD */ - nextTcd = currentTcd + 1; - if (nextTcd == handle->tcdSize) - { - nextTcd = 0; - } - /* Advance queue tail index */ - handle->tail = nextTcd; - EnableGlobalIRQ(primask); - /* Calculate index of previous TCD */ - previousTcd = currentTcd != 0 ? currentTcd - 1 : (handle->tcdSize - 1); - /* Configure current TCD block. */ - EDMA_TcdReset(&handle->tcdPool[currentTcd]); - EDMA_TcdSetTransferConfig(&handle->tcdPool[currentTcd], config, NULL); - /* Enable major interrupt */ - handle->tcdPool[currentTcd].CSR |= DMA_CSR_INTMAJOR_MASK; - /* Link current TCD with next TCD for identification of current TCD */ - handle->tcdPool[currentTcd].DLAST_SGA = (uint32_t)&handle->tcdPool[nextTcd]; - /* Chain from previous descriptor unless tcd pool size is 1(this descriptor is its own predecessor). */ - if (currentTcd != previousTcd) - { - /* Enable scatter/gather feature in the previous TCD block. */ - csr = handle->tcdPool[previousTcd].CSR | ((uint16_t)DMA_CSR_ESG_MASK); - csr &= ~((uint16_t)DMA_CSR_DREQ_MASK); - handle->tcdPool[previousTcd].CSR = csr; - /* - Check if the TCD block in the registers is the previous one (points to current TCD block). It - is used to check if the previous TCD linked has been loaded in TCD register. If so, it need to - link the TCD register in case link the current TCD with the dead chain when TCD loading occurs - before link the previous TCD block. - */ - if (tcdRegs->DLAST_SGA == (uint32_t)&handle->tcdPool[currentTcd]) - { - /* Clear the DREQ bits for the dynamic scatter gather */ - tcdRegs->CSR |= DMA_CSR_DREQ_MASK; - /* Enable scatter/gather also in the TCD registers. */ - csr = tcdRegs->CSR | DMA_CSR_ESG_MASK; - /* Must write the CSR register one-time, because the transfer maybe finished anytime. */ - tcdRegs->CSR = csr; - /* - It is very important to check the ESG bit! - Because this hardware design: if DONE bit is set, the ESG bit can not be set. So it can - be used to check if the dynamic TCD link operation is successful. If ESG bit is not set - and the DLAST_SGA is not the next TCD address(it means the dynamic TCD link succeed and - the current TCD block has been loaded into TCD registers), it means transfer finished - and TCD link operation fail, so must install TCD content into TCD registers and enable - transfer again. And if ESG is set, it means transfer has not finished, so TCD dynamic - link succeed. - */ - if (0U != (tcdRegs->CSR & DMA_CSR_ESG_MASK)) - { - tcdRegs->CSR &= ~(uint16_t)DMA_CSR_DREQ_MASK; - return kStatus_Success; - } - /* - Check whether the current TCD block is already loaded in the TCD registers. It is another - condition when ESG bit is not set: it means the dynamic TCD link succeed and the current - TCD block has been loaded into TCD registers. - */ - if (tcdRegs->DLAST_SGA == (uint32_t)&handle->tcdPool[nextTcd]) - { - return kStatus_Success; - } - /* - If go to this, means the previous transfer finished, and the DONE bit is set. - So shall configure TCD registers. - */ - } - else if (tcdRegs->DLAST_SGA != 0UL) - { - /* The current TCD block has been linked successfully. */ - return kStatus_Success; - } - else - { - /* - DLAST_SGA is 0 and it means the first submit transfer, so shall configure - TCD registers. - */ - } - } - /* There is no live chain, TCD block need to be installed in TCD registers. */ - EDMA_InstallTCD(handle->base, handle->channel, &handle->tcdPool[currentTcd]); - /* Enable channel request again. */ - if (0U != (handle->flags & EDMA_TRANSFER_ENABLED_MASK)) - { - handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); - } - - return kStatus_Success; - } -} - -/*! - * brief eDMA starts transfer. - * - * This function enables the channel request. Users can call this function after submitting the transfer request - * or before submitting the transfer request. - * - * param handle eDMA handle pointer. - */ -void EDMA_StartTransfer(edma_handle_t *handle) -{ - assert(handle != NULL); - uint32_t tmpCSR = 0; - - if (handle->tcdPool == NULL) - { - handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); - } - else /* Use the TCD queue. */ - { - uint32_t primask; - edma_tcd_t *tcdRegs = (edma_tcd_t *)(uint32_t)&handle->base->TCD[handle->channel]; - - handle->flags |= EDMA_TRANSFER_ENABLED_MASK; - - /* Check if there was at least one descriptor submitted since reset (TCD in registers is valid) */ - if (tcdRegs->DLAST_SGA != 0U) - { - primask = DisableGlobalIRQ(); - /* Check if channel request is actually disable. */ - if ((handle->base->ERQ & ((uint32_t)1U << handle->channel)) == 0U) - { - /* Check if transfer is paused. */ - tmpCSR = tcdRegs->CSR; - if ((0U == (tmpCSR & DMA_CSR_DONE_MASK)) || (0U != (tmpCSR & DMA_CSR_ESG_MASK))) - { - /* - Re-enable channel request must be as soon as possible, so must put it into - critical section to avoid task switching or interrupt service routine. - */ - handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); - } - } - EnableGlobalIRQ(primask); - } - } -} - -/*! - * brief eDMA stops transfer. - * - * This function disables the channel request to pause the transfer. Users can call EDMA_StartTransfer() - * again to resume the transfer. - * - * param handle eDMA handle pointer. - */ -void EDMA_StopTransfer(edma_handle_t *handle) -{ - assert(handle != NULL); - - handle->flags &= (~(uint8_t)EDMA_TRANSFER_ENABLED_MASK); - handle->base->CERQ = DMA_CERQ_CERQ(handle->channel); -} - -/*! - * brief eDMA aborts transfer. - * - * This function disables the channel request and clear transfer status bits. - * Users can submit another transfer after calling this API. - * - * param handle DMA handle pointer. - */ -void EDMA_AbortTransfer(edma_handle_t *handle) -{ - handle->base->CERQ = DMA_CERQ_CERQ(handle->channel); - /* - Clear CSR to release channel. Because if the given channel started transfer, - CSR will be not zero. Because if it is the last transfer, DREQ will be set. - If not, ESG will be set. - */ - handle->base->TCD[handle->channel].CSR = 0; - /* Cancel all next TCD transfer. */ - handle->base->TCD[handle->channel].DLAST_SGA = 0; - /* clear the CITER and BITER to make sure the TCD register in a correct state for next calling of - * EDMA_SubmitTransfer */ - handle->base->TCD[handle->channel].CITER_ELINKNO = 0; - handle->base->TCD[handle->channel].BITER_ELINKNO = 0; - - /* Handle the tcd */ - if (handle->tcdPool != NULL) - { - handle->header = 1; - handle->tail = 0; - handle->tcdUsed = 0; - } -} - -/*! - * brief eDMA IRQ handler for the current major loop transfer completion. - * - * This function clears the channel major interrupt flag and calls - * the callback function if it is not NULL. - * - * Note: - * For the case using TCD queue, when the major iteration count is exhausted, additional operations are performed. - * These include the final address adjustments and reloading of the BITER field into the CITER. - * Assertion of an optional interrupt request also occurs at this time, as does a possible fetch of a new TCD from - * memory using the scatter/gather address pointer included in the descriptor (if scatter/gather is enabled). - * - * For instance, when the time interrupt of TCD[0] happens, the TCD[1] has already been loaded into the eDMA engine. - * As sga and sga_index are calculated based on the DLAST_SGA bitfield lies in the TCD_CSR register, the sga_index - * in this case should be 2 (DLAST_SGA of TCD[1] stores the address of TCD[2]). Thus, the "tcdUsed" updated should be - * (tcdUsed - 2U) which indicates the number of TCDs can be loaded in the memory pool (because TCD[0] and TCD[1] have - * been loaded into the eDMA engine at this point already.). - * - * For the last two continuous ISRs in a scatter/gather process, they both load the last TCD (The last ISR does not - * load a new TCD) from the memory pool to the eDMA engine when major loop completes. - * Therefore, ensure that the header and tcdUsed updated are identical for them. - * tcdUsed are both 0 in this case as no TCD to be loaded. - * - * See the "eDMA basic data flow" in the eDMA Functional description section of the Reference Manual for - * further details. - * - * param handle eDMA handle pointer. - */ -void EDMA_HandleIRQ(edma_handle_t *handle) -{ - assert(handle != NULL); - - bool transfer_done; - - /* Clear EDMA interrupt flag */ - handle->base->CINT = handle->channel; - /* Check if transfer is already finished. */ - transfer_done = ((handle->base->TCD[handle->channel].CSR & DMA_CSR_DONE_MASK) != 0U); - - if (handle->tcdPool == NULL) - { - if (handle->callback != NULL) - { - (handle->callback)(handle, handle->userData, transfer_done, 0); - } - } - else /* Use the TCD queue. Please refer to the API descriptions in the eDMA header file for detailed information. */ - { - uint32_t sga = (uint32_t)handle->base->TCD[handle->channel].DLAST_SGA; - uint32_t sga_index; - int32_t tcds_done; - uint8_t new_header; - - /* Get the offset of the next transfer TCD blocks to be loaded into the eDMA engine. */ - sga -= (uint32_t)handle->tcdPool; - /* Get the index of the next transfer TCD blocks to be loaded into the eDMA engine. */ - sga_index = sga / sizeof(edma_tcd_t); - /* Adjust header positions. */ - if (transfer_done) - { - /* New header shall point to the next TCD to be loaded (current one is already finished) */ - new_header = (uint8_t)sga_index; - } - else - { - /* New header shall point to this descriptor currently loaded (not finished yet) */ - new_header = sga_index != 0U ? (uint8_t)sga_index - 1U : (uint8_t)handle->tcdSize - 1U; - } - /* Calculate the number of finished TCDs */ - if (new_header == (uint8_t)handle->header) - { - int8_t tmpTcdUsed = handle->tcdUsed; - int8_t tmpTcdSize = handle->tcdSize; - - if (tmpTcdUsed == tmpTcdSize) - { - tcds_done = handle->tcdUsed; - } - else - { - /* No TCD in the memory are going to be loaded or internal error occurs. */ - tcds_done = 0; - } - } - else - { - tcds_done = (int32_t)new_header - (int32_t)handle->header; - if (tcds_done < 0) - { - tcds_done += handle->tcdSize; - } - } - /* Advance header which points to the TCD to be loaded into the eDMA engine from memory. */ - handle->header = (int8_t)new_header; - /* Release TCD blocks. tcdUsed is the TCD number which can be used/loaded in the memory pool. */ - handle->tcdUsed -= (int8_t)tcds_done; - /* Invoke callback function. */ - if (NULL != handle->callback) - { - (handle->callback)(handle, handle->userData, transfer_done, tcds_done); - } - - /* - * 1.clear the DONE bit here is meaningful for below cases: - * A new TCD has been loaded to EDMA already: - * need to clear the DONE bit in the IRQ handler to avoid TCD in EDMA been overwritten - * if peripheral request isn't coming before next transfer request. - * 2. Don't clear DONE bit for below case, - * for the case that transfer request submitted in the privious edma callback, this is a case that doesn't - * need scatter gather, so keep DONE bit during the next transfer request submission will re-install the TCD and - * the DONE bit will be cleared together with TCD re-installation. - */ - if (transfer_done) - { - if ((handle->base->TCD[handle->channel].CSR & DMA_CSR_ESG_MASK) != 0U) - { - handle->base->CDNE = handle->channel; - } - } - } -} - -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET) && \ - (FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET == 4) -/* 8 channels (Shared): kl28 */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL == 8U) - -#if defined(DMA0) -void DMA0_04_DriverIRQHandler(void); -void DMA0_04_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_15_DriverIRQHandler(void); -void DMA0_15_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_26_DriverIRQHandler(void); -void DMA0_26_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_37_DriverIRQHandler(void); -void DMA0_37_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA1) - -#if defined(DMA0) -void DMA1_04_DriverIRQHandler(void); -void DMA1_04_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[8]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[12]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_15_DriverIRQHandler(void); -void DMA1_15_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[9]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[13]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_26_DriverIRQHandler(void); -void DMA1_26_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[10]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[14]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_37_DriverIRQHandler(void); -void DMA1_37_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[11]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[15]); - } - SDK_ISR_EXIT_BARRIER; -} - -#else -void DMA1_04_DriverIRQHandler(void); -void DMA1_04_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_15_DriverIRQHandler(void); -void DMA1_15_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_26_DriverIRQHandler(void); -void DMA1_26_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_37_DriverIRQHandler(void); -void DMA1_37_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif -#endif /* 8 channels (Shared) */ -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET */ - -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET) && \ - (FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET == 8) -/* 16 channels (Shared): K32H844P */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL == 16U) - -void DMA0_08_DriverIRQHandler(void); -void DMA0_08_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 8U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[8]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_19_DriverIRQHandler(void); -void DMA0_19_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 9U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[9]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_210_DriverIRQHandler(void); -void DMA0_210_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 10U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[10]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_311_DriverIRQHandler(void); -void DMA0_311_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 11U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[11]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_412_DriverIRQHandler(void); -void DMA0_412_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 12U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[12]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_513_DriverIRQHandler(void); -void DMA0_513_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 13U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[13]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_614_DriverIRQHandler(void); -void DMA0_614_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 14U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[14]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_715_DriverIRQHandler(void); -void DMA0_715_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 15U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[15]); - } - SDK_ISR_EXIT_BARRIER; -} - -#if defined(DMA1) -void DMA1_08_DriverIRQHandler(void); -void DMA1_08_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[16]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 8U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[24]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_19_DriverIRQHandler(void); -void DMA1_19_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[17]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 9U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[25]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_210_DriverIRQHandler(void); -void DMA1_210_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[18]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 10U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[26]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_311_DriverIRQHandler(void); -void DMA1_311_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[19]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 11U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[27]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_412_DriverIRQHandler(void); -void DMA1_412_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[20]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 12U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[28]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_513_DriverIRQHandler(void); -void DMA1_513_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[21]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 13U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[29]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_614_DriverIRQHandler(void); -void DMA1_614_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[22]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 14U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[30]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_715_DriverIRQHandler(void); -void DMA1_715_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[23]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 15U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[31]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif /* 16 channels (Shared) */ -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET */ - -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET) && \ - (FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET == 16) -/* 32 channels (Shared): k80 */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && FSL_FEATURE_EDMA_MODULE_CHANNEL == 32U -#if defined(DMA0) -void DMA0_DMA16_DriverIRQHandler(void); -void DMA0_DMA16_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 16U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[16]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_DMA17_DriverIRQHandler(void); -void DMA1_DMA17_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 17U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[17]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA2_DMA18_DriverIRQHandler(void); -void DMA2_DMA18_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 18U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[18]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA3_DMA19_DriverIRQHandler(void); -void DMA3_DMA19_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 19U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[19]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA4_DMA20_DriverIRQHandler(void); -void DMA4_DMA20_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 20U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[20]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA5_DMA21_DriverIRQHandler(void); -void DMA5_DMA21_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 21U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[21]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA6_DMA22_DriverIRQHandler(void); -void DMA6_DMA22_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 22U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[22]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA7_DMA23_DriverIRQHandler(void); -void DMA7_DMA23_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 23U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[23]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA8_DMA24_DriverIRQHandler(void); -void DMA8_DMA24_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 8U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[8]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 24U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[24]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA9_DMA25_DriverIRQHandler(void); -void DMA9_DMA25_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 9U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[9]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 25U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[25]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA10_DMA26_DriverIRQHandler(void); -void DMA10_DMA26_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 10U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[10]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 26U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[26]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA11_DMA27_DriverIRQHandler(void); -void DMA11_DMA27_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 11U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[11]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 27U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[27]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA12_DMA28_DriverIRQHandler(void); -void DMA12_DMA28_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 12U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[12]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 28U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[28]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA13_DMA29_DriverIRQHandler(void); -void DMA13_DMA29_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 13U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[13]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 29U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[29]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA14_DMA30_DriverIRQHandler(void); -void DMA14_DMA30_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 14U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[14]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 30U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[30]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA15_DMA31_DriverIRQHandler(void); -void DMA15_DMA31_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 15U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[15]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 31U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[31]); - } - SDK_ISR_EXIT_BARRIER; -} - -#else -void DMA0_DMA16_DriverIRQHandler(void); -void DMA0_DMA16_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 16U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[16]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_DMA17_DriverIRQHandler(void); -void DMA1_DMA17_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 17U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[17]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA2_DMA18_DriverIRQHandler(void); -void DMA2_DMA18_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 18U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[18]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA3_DMA19_DriverIRQHandler(void); -void DMA3_DMA19_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 19U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[19]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA4_DMA20_DriverIRQHandler(void); -void DMA4_DMA20_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 20U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[20]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA5_DMA21_DriverIRQHandler(void); -void DMA5_DMA21_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 21U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[21]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA6_DMA22_DriverIRQHandler(void); -void DMA6_DMA22_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 22U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[22]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA7_DMA23_DriverIRQHandler(void); -void DMA7_DMA23_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 23U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[23]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA8_DMA24_DriverIRQHandler(void); -void DMA8_DMA24_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 8U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[8]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 24U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[24]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA9_DMA25_DriverIRQHandler(void); -void DMA9_DMA25_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 9U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[9]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 25U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[25]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA10_DMA26_DriverIRQHandler(void); -void DMA10_DMA26_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 10U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[10]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 26U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[26]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA11_DMA27_DriverIRQHandler(void); -void DMA11_DMA27_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 11U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[11]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 27U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[27]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA12_DMA28_DriverIRQHandler(void); -void DMA12_DMA28_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 12U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[12]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 28U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[28]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA13_DMA29_DriverIRQHandler(void); -void DMA13_DMA29_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 13U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[13]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 29U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[29]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA14_DMA30_DriverIRQHandler(void); -void DMA14_DMA30_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 14U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[14]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 30U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[30]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA15_DMA31_DriverIRQHandler(void); -void DMA15_DMA31_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA1, 15U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[15]); - } - if ((EDMA_GetChannelStatusFlags(DMA1, 31U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[31]); - } - SDK_ISR_EXIT_BARRIER; -} - -#endif -#endif /* 32 channels (Shared) */ -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET */ - -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET) && \ - (FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET == 4) -/* 32 channels (Shared): MCIMX7U5_M4 */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL == 32U) - -void DMA0_0_4_DriverIRQHandler(void); -void DMA0_0_4_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 0U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[0]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 4U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[4]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_1_5_DriverIRQHandler(void); -void DMA0_1_5_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 1U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[1]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 5U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[5]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_2_6_DriverIRQHandler(void); -void DMA0_2_6_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 2U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[2]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 6U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[6]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_3_7_DriverIRQHandler(void); -void DMA0_3_7_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 3U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[3]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 7U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[7]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_8_12_DriverIRQHandler(void); -void DMA0_8_12_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 8U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[8]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 12U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[12]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_9_13_DriverIRQHandler(void); -void DMA0_9_13_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 9U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[9]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 13U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[13]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_10_14_DriverIRQHandler(void); -void DMA0_10_14_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 10U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[10]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 14U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[14]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_11_15_DriverIRQHandler(void); -void DMA0_11_15_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 11U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[11]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 15U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[15]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_16_20_DriverIRQHandler(void); -void DMA0_16_20_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 16U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[16]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 20U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[20]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_17_21_DriverIRQHandler(void); -void DMA0_17_21_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 17U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[17]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 21U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[21]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_18_22_DriverIRQHandler(void); -void DMA0_18_22_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 18U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[18]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 22U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[22]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_19_23_DriverIRQHandler(void); -void DMA0_19_23_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 19U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[19]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 23U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[23]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_24_28_DriverIRQHandler(void); -void DMA0_24_28_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 24U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[24]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 28U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[28]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_25_29_DriverIRQHandler(void); -void DMA0_25_29_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 25U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[25]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 29U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[29]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_26_30_DriverIRQHandler(void); -void DMA0_26_30_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 26U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[26]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 30U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[30]); - } - SDK_ISR_EXIT_BARRIER; -} - -void DMA0_27_31_DriverIRQHandler(void); -void DMA0_27_31_DriverIRQHandler(void) -{ - if ((EDMA_GetChannelStatusFlags(DMA0, 27U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[27]); - } - if ((EDMA_GetChannelStatusFlags(DMA0, 31U) & (uint32_t)kEDMA_InterruptFlag) != 0U) - { - EDMA_HandleIRQ(s_EDMAHandle[31]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* 32 channels (Shared): MCIMX7U5 */ -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET */ - -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET) && \ - (FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET == 0) -/* 4 channels (No Shared): kv10 */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL > 0) - -void DMA0_DriverIRQHandler(void); -void DMA0_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[0]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA1_DriverIRQHandler(void); -void DMA1_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[1]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA2_DriverIRQHandler(void); -void DMA2_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[2]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA3_DriverIRQHandler(void); -void DMA3_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[3]); - SDK_ISR_EXIT_BARRIER; -} - -/* 8 channels (No Shared) */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL > 4U) - -void DMA4_DriverIRQHandler(void); -void DMA4_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[4]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA5_DriverIRQHandler(void); -void DMA5_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[5]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA6_DriverIRQHandler(void); -void DMA6_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[6]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA7_DriverIRQHandler(void); -void DMA7_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[7]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL == 8 */ - -/* 16 channels (No Shared) */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL > 8U) - -void DMA8_DriverIRQHandler(void); -void DMA8_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[8]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA9_DriverIRQHandler(void); -void DMA9_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[9]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA10_DriverIRQHandler(void); -void DMA10_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[10]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA11_DriverIRQHandler(void); -void DMA11_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[11]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA12_DriverIRQHandler(void); -void DMA12_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[12]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA13_DriverIRQHandler(void); -void DMA13_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[13]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA14_DriverIRQHandler(void); -void DMA14_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[14]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA15_DriverIRQHandler(void); -void DMA15_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[15]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL == 16 */ - -/* 32 channels (No Shared) */ -#if defined(FSL_FEATURE_EDMA_MODULE_CHANNEL) && (FSL_FEATURE_EDMA_MODULE_CHANNEL > 16U) - -void DMA16_DriverIRQHandler(void); -void DMA16_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[16]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA17_DriverIRQHandler(void); -void DMA17_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[17]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA18_DriverIRQHandler(void); -void DMA18_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[18]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA19_DriverIRQHandler(void); -void DMA19_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[19]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA20_DriverIRQHandler(void); -void DMA20_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[20]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA21_DriverIRQHandler(void); -void DMA21_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[21]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA22_DriverIRQHandler(void); -void DMA22_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[22]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA23_DriverIRQHandler(void); -void DMA23_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[23]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA24_DriverIRQHandler(void); -void DMA24_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[24]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA25_DriverIRQHandler(void); -void DMA25_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[25]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA26_DriverIRQHandler(void); -void DMA26_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[26]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA27_DriverIRQHandler(void); -void DMA27_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[27]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA28_DriverIRQHandler(void); -void DMA28_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[28]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA29_DriverIRQHandler(void); -void DMA29_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[29]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA30_DriverIRQHandler(void); -void DMA30_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[30]); - SDK_ISR_EXIT_BARRIER; -} - -void DMA31_DriverIRQHandler(void); -void DMA31_DriverIRQHandler(void) -{ - EDMA_HandleIRQ(s_EDMAHandle[31]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL == 32 */ - -#endif /* 4/8/16/32 channels (No Shared) */ -#endif /* FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SHARED_OFFSET */ diff --git a/devices/MIMXRT1052/drivers/fsl_edma.h b/devices/MIMXRT1052/drivers/fsl_edma.h deleted file mode 100644 index 861ed7f..0000000 --- a/devices/MIMXRT1052/drivers/fsl_edma.h +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_EDMA_H_ -#define _FSL_EDMA_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup edma - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief eDMA driver version */ -#define FSL_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 2)) /*!< Version 2.4.2. */ -/*@}*/ - -/*! @brief Compute the offset unit from DCHPRI3 */ -#define DMA_DCHPRI_INDEX(channel) (((channel) & ~0x03U) | (3U - ((channel)&0x03U))) - -/*! @brief eDMA transfer configuration */ -typedef enum _edma_transfer_size -{ - kEDMA_TransferSize1Bytes = 0x0U, /*!< Source/Destination data transfer size is 1 byte every time */ - kEDMA_TransferSize2Bytes = 0x1U, /*!< Source/Destination data transfer size is 2 bytes every time */ - kEDMA_TransferSize4Bytes = 0x2U, /*!< Source/Destination data transfer size is 4 bytes every time */ - kEDMA_TransferSize8Bytes = 0x3U, /*!< Source/Destination data transfer size is 8 bytes every time */ - kEDMA_TransferSize16Bytes = 0x4U, /*!< Source/Destination data transfer size is 16 bytes every time */ - kEDMA_TransferSize32Bytes = 0x5U, /*!< Source/Destination data transfer size is 32 bytes every time */ -} edma_transfer_size_t; - -/*! @brief eDMA modulo configuration */ -typedef enum _edma_modulo -{ - kEDMA_ModuloDisable = 0x0U, /*!< Disable modulo */ - kEDMA_Modulo2bytes, /*!< Circular buffer size is 2 bytes. */ - kEDMA_Modulo4bytes, /*!< Circular buffer size is 4 bytes. */ - kEDMA_Modulo8bytes, /*!< Circular buffer size is 8 bytes. */ - kEDMA_Modulo16bytes, /*!< Circular buffer size is 16 bytes. */ - kEDMA_Modulo32bytes, /*!< Circular buffer size is 32 bytes. */ - kEDMA_Modulo64bytes, /*!< Circular buffer size is 64 bytes. */ - kEDMA_Modulo128bytes, /*!< Circular buffer size is 128 bytes. */ - kEDMA_Modulo256bytes, /*!< Circular buffer size is 256 bytes. */ - kEDMA_Modulo512bytes, /*!< Circular buffer size is 512 bytes. */ - kEDMA_Modulo1Kbytes, /*!< Circular buffer size is 1 K bytes. */ - kEDMA_Modulo2Kbytes, /*!< Circular buffer size is 2 K bytes. */ - kEDMA_Modulo4Kbytes, /*!< Circular buffer size is 4 K bytes. */ - kEDMA_Modulo8Kbytes, /*!< Circular buffer size is 8 K bytes. */ - kEDMA_Modulo16Kbytes, /*!< Circular buffer size is 16 K bytes. */ - kEDMA_Modulo32Kbytes, /*!< Circular buffer size is 32 K bytes. */ - kEDMA_Modulo64Kbytes, /*!< Circular buffer size is 64 K bytes. */ - kEDMA_Modulo128Kbytes, /*!< Circular buffer size is 128 K bytes. */ - kEDMA_Modulo256Kbytes, /*!< Circular buffer size is 256 K bytes. */ - kEDMA_Modulo512Kbytes, /*!< Circular buffer size is 512 K bytes. */ - kEDMA_Modulo1Mbytes, /*!< Circular buffer size is 1 M bytes. */ - kEDMA_Modulo2Mbytes, /*!< Circular buffer size is 2 M bytes. */ - kEDMA_Modulo4Mbytes, /*!< Circular buffer size is 4 M bytes. */ - kEDMA_Modulo8Mbytes, /*!< Circular buffer size is 8 M bytes. */ - kEDMA_Modulo16Mbytes, /*!< Circular buffer size is 16 M bytes. */ - kEDMA_Modulo32Mbytes, /*!< Circular buffer size is 32 M bytes. */ - kEDMA_Modulo64Mbytes, /*!< Circular buffer size is 64 M bytes. */ - kEDMA_Modulo128Mbytes, /*!< Circular buffer size is 128 M bytes. */ - kEDMA_Modulo256Mbytes, /*!< Circular buffer size is 256 M bytes. */ - kEDMA_Modulo512Mbytes, /*!< Circular buffer size is 512 M bytes. */ - kEDMA_Modulo1Gbytes, /*!< Circular buffer size is 1 G bytes. */ - kEDMA_Modulo2Gbytes, /*!< Circular buffer size is 2 G bytes. */ -} edma_modulo_t; - -/*! @brief Bandwidth control */ -typedef enum _edma_bandwidth -{ - kEDMA_BandwidthStallNone = 0x0U, /*!< No eDMA engine stalls. */ - kEDMA_BandwidthStall4Cycle = 0x2U, /*!< eDMA engine stalls for 4 cycles after each read/write. */ - kEDMA_BandwidthStall8Cycle = 0x3U, /*!< eDMA engine stalls for 8 cycles after each read/write. */ -} edma_bandwidth_t; - -/*! @brief Channel link type */ -typedef enum _edma_channel_link_type -{ - kEDMA_LinkNone = 0x0U, /*!< No channel link */ - kEDMA_MinorLink, /*!< Channel link after each minor loop */ - kEDMA_MajorLink, /*!< Channel link while major loop count exhausted */ -} edma_channel_link_type_t; - -/*!@brief _edma_channel_status_flags eDMA channel status flags. */ -enum -{ - kEDMA_DoneFlag = 0x1U, /*!< DONE flag, set while transfer finished, CITER value exhausted*/ - kEDMA_ErrorFlag = 0x2U, /*!< eDMA error flag, an error occurred in a transfer */ - kEDMA_InterruptFlag = 0x4U, /*!< eDMA interrupt flag, set while an interrupt occurred of this channel */ -}; - -/*! @brief _edma_error_status_flags eDMA channel error status flags. */ -enum -{ - kEDMA_DestinationBusErrorFlag = DMA_ES_DBE_MASK, /*!< Bus error on destination address */ - kEDMA_SourceBusErrorFlag = DMA_ES_SBE_MASK, /*!< Bus error on the source address */ - kEDMA_ScatterGatherErrorFlag = DMA_ES_SGE_MASK, /*!< Error on the Scatter/Gather address, not 32byte aligned. */ - kEDMA_NbytesErrorFlag = DMA_ES_NCE_MASK, /*!< NBYTES/CITER configuration error */ - kEDMA_DestinationOffsetErrorFlag = DMA_ES_DOE_MASK, /*!< Destination offset not aligned with destination size */ - kEDMA_DestinationAddressErrorFlag = DMA_ES_DAE_MASK, /*!< Destination address not aligned with destination size */ - kEDMA_SourceOffsetErrorFlag = DMA_ES_SOE_MASK, /*!< Source offset not aligned with source size */ - kEDMA_SourceAddressErrorFlag = DMA_ES_SAE_MASK, /*!< Source address not aligned with source size*/ - kEDMA_ErrorChannelFlag = DMA_ES_ERRCHN_MASK, /*!< Error channel number of the cancelled channel number */ - kEDMA_ChannelPriorityErrorFlag = DMA_ES_CPE_MASK, /*!< Channel priority is not unique. */ - kEDMA_TransferCanceledFlag = DMA_ES_ECX_MASK, /*!< Transfer cancelled */ -#if defined(FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT) && (FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT > 1) - kEDMA_GroupPriorityErrorFlag = DMA_ES_GPE_MASK, /*!< Group priority is not unique. */ -#endif - kEDMA_ValidFlag = (int)DMA_ES_VLD_MASK, /*!< No error occurred, this bit is 0. Otherwise, it is 1. */ -}; - -/*! @brief eDMA interrupt source */ -typedef enum _edma_interrupt_enable -{ - kEDMA_ErrorInterruptEnable = 0x1U, /*!< Enable interrupt while channel error occurs. */ - kEDMA_MajorInterruptEnable = DMA_CSR_INTMAJOR_MASK, /*!< Enable interrupt while major count exhausted. */ - kEDMA_HalfInterruptEnable = DMA_CSR_INTHALF_MASK, /*!< Enable interrupt while major count to half value. */ -} edma_interrupt_enable_t; - -/*! @brief eDMA transfer type */ -typedef enum _edma_transfer_type -{ - kEDMA_MemoryToMemory = 0x0U, /*!< Transfer from memory to memory */ - kEDMA_PeripheralToMemory, /*!< Transfer from peripheral to memory */ - kEDMA_MemoryToPeripheral, /*!< Transfer from memory to peripheral */ - kEDMA_PeripheralToPeripheral, /*!< Transfer from Peripheral to peripheral */ -} edma_transfer_type_t; - -/*! @brief _edma_transfer_status eDMA transfer status */ -enum -{ - kStatus_EDMA_QueueFull = MAKE_STATUS(kStatusGroup_EDMA, 0), /*!< TCD queue is full. */ - kStatus_EDMA_Busy = MAKE_STATUS(kStatusGroup_EDMA, 1), /*!< Channel is busy and can't handle the - transfer request. */ -}; - -/*! @brief eDMA global configuration structure.*/ -typedef struct _edma_config -{ - bool enableContinuousLinkMode; /*!< Enable (true) continuous link mode. Upon minor loop completion, the channel - activates again if that channel has a minor loop channel link enabled and - the link channel is itself. */ - bool enableHaltOnError; /*!< Enable (true) transfer halt on error. Any error causes the HALT bit to set. - Subsequently, all service requests are ignored until the HALT bit is cleared.*/ - bool enableRoundRobinArbitration; /*!< Enable (true) round robin channel arbitration method or fixed priority - arbitration is used for channel selection */ - bool enableDebugMode; /*!< Enable(true) eDMA debug mode. When in debug mode, the eDMA stalls the start of - a new channel. Executing channels are allowed to complete. */ -} edma_config_t; - -/*! - * @brief eDMA transfer configuration - * - * This structure configures the source/destination transfer attribute. - */ -typedef struct _edma_transfer_config -{ - uint32_t srcAddr; /*!< Source data address. */ - uint32_t destAddr; /*!< Destination data address. */ - edma_transfer_size_t srcTransferSize; /*!< Source data transfer size. */ - edma_transfer_size_t destTransferSize; /*!< Destination data transfer size. */ - int16_t srcOffset; /*!< Sign-extended offset applied to the current source address to - form the next-state value as each source read is completed. */ - int16_t destOffset; /*!< Sign-extended offset applied to the current destination address to - form the next-state value as each destination write is completed. */ - uint32_t minorLoopBytes; /*!< Bytes to transfer in a minor loop*/ - uint32_t majorLoopCounts; /*!< Major loop iteration count. */ -} edma_transfer_config_t; - -/*! @brief eDMA channel priority configuration */ -typedef struct _edma_channel_Preemption_config -{ - bool enableChannelPreemption; /*!< If true: a channel can be suspended by other channel with higher priority */ - bool enablePreemptAbility; /*!< If true: a channel can suspend other channel with low priority */ - uint8_t channelPriority; /*!< Channel priority */ -} edma_channel_Preemption_config_t; - -/*! @brief eDMA minor offset configuration */ -typedef struct _edma_minor_offset_config -{ - bool enableSrcMinorOffset; /*!< Enable(true) or Disable(false) source minor loop offset. */ - bool enableDestMinorOffset; /*!< Enable(true) or Disable(false) destination minor loop offset. */ - uint32_t minorOffset; /*!< Offset for a minor loop mapping. */ -} edma_minor_offset_config_t; - -/*! - * @brief eDMA TCD. - * - * This structure is same as TCD register which is described in reference manual, - * and is used to configure the scatter/gather feature as a next hardware TCD. - */ -typedef struct _edma_tcd -{ - __IO uint32_t SADDR; /*!< SADDR register, used to save source address */ - __IO uint16_t SOFF; /*!< SOFF register, save offset bytes every transfer */ - __IO uint16_t ATTR; /*!< ATTR register, source/destination transfer size and modulo */ - __IO uint32_t NBYTES; /*!< Nbytes register, minor loop length in bytes */ - __IO uint32_t SLAST; /*!< SLAST register */ - __IO uint32_t DADDR; /*!< DADDR register, used for destination address */ - __IO uint16_t DOFF; /*!< DOFF register, used for destination offset */ - __IO uint16_t CITER; /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/ - __IO uint32_t DLAST_SGA; /*!< DLASTSGA register, next tcd address used in scatter-gather mode */ - __IO uint16_t CSR; /*!< CSR register, for TCD control status */ - __IO uint16_t BITER; /*!< BITER register, begin minor loop count. */ -} edma_tcd_t; - -/*! @brief Callback for eDMA */ -struct _edma_handle; - -/*! @brief Define callback function for eDMA. - * - * This callback function is called in the EDMA interrupt handle. - * In normal mode, run into callback function means the transfer users need is done. - * In scatter gather mode, run into callback function means a transfer control block (tcd) is finished. Not - * all transfer finished, users can get the finished tcd numbers using interface EDMA_GetUnusedTCDNumber. - * - * @param handle EDMA handle pointer, users shall not touch the values inside. - * @param userData The callback user parameter pointer. Users can use this parameter to involve things users need to - * change in EDMA callback function. - * @param transferDone If the current loaded transfer done. In normal mode it means if all transfer done. In scatter - * gather mode, this parameter shows is the current transfer block in EDMA register is done. As the - * load of core is different, it will be different if the new tcd loaded into EDMA registers while - * this callback called. If true, it always means new tcd still not loaded into registers, while - * false means new tcd already loaded into registers. - * @param tcds How many tcds are done from the last callback. This parameter only used in scatter gather mode. It - * tells user how many tcds are finished between the last callback and this. - */ -typedef void (*edma_callback)(struct _edma_handle *handle, void *userData, bool transferDone, uint32_t tcds); - -/*! @brief eDMA transfer handle structure */ -typedef struct _edma_handle -{ - edma_callback callback; /*!< Callback function for major count exhausted. */ - void *userData; /*!< Callback function parameter. */ - DMA_Type *base; /*!< eDMA peripheral base address. */ - edma_tcd_t *tcdPool; /*!< Pointer to memory stored TCDs. */ - uint8_t channel; /*!< eDMA channel number. */ - volatile int8_t header; /*!< The first TCD index. Should point to the next TCD to be loaded into the eDMA engine. */ - volatile int8_t tail; /*!< The last TCD index. Should point to the next TCD to be stored into the memory pool. */ - volatile int8_t tcdUsed; /*!< The number of used TCD slots. Should reflect the number of TCDs can be used/loaded in - the memory. */ - volatile int8_t tcdSize; /*!< The total number of TCD slots in the queue. */ - uint8_t flags; /*!< The status of the current channel. */ -} edma_handle_t; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name eDMA initialization and de-initialization - * @{ - */ - -/*! - * @brief Initializes the eDMA peripheral. - * - * This function ungates the eDMA clock and configures the eDMA peripheral according - * to the configuration structure. - * - * @param base eDMA peripheral base address. - * @param config A pointer to the configuration structure, see "edma_config_t". - * @note This function enables the minor loop map feature. - */ -void EDMA_Init(DMA_Type *base, const edma_config_t *config); - -/*! - * @brief Deinitializes the eDMA peripheral. - * - * This function gates the eDMA clock. - * - * @param base eDMA peripheral base address. - */ -void EDMA_Deinit(DMA_Type *base); - -/*! - * @brief Push content of TCD structure into hardware TCD register. - * - * @param base EDMA peripheral base address. - * @param channel EDMA channel number. - * @param tcd Point to TCD structure. - */ -void EDMA_InstallTCD(DMA_Type *base, uint32_t channel, edma_tcd_t *tcd); - -/*! - * @brief Gets the eDMA default configuration structure. - * - * This function sets the configuration structure to default values. - * The default configuration is set to the following values. - * @code - * config.enableContinuousLinkMode = false; - * config.enableHaltOnError = true; - * config.enableRoundRobinArbitration = false; - * config.enableDebugMode = false; - * @endcode - * - * @param config A pointer to the eDMA configuration structure. - */ -void EDMA_GetDefaultConfig(edma_config_t *config); - -/*! - * @brief Enable/Disable continuous channel link mode. - * - * @note Do not use continuous link mode with a channel linking to itself if there is only one minor loop - * iteration per service request, for example, if the channel's NBYTES value is the same as either - * the source or destination size. The same data transfer profile can be achieved by simply - * increasing the NBYTES value, which provides more efficient, faster processing. - * - * @param base EDMA peripheral base address. - * @param enable true is enable, false is disable. - */ -static inline void EDMA_EnableContinuousChannelLinkMode(DMA_Type *base, bool enable) -{ - if (enable) - { - base->CR |= DMA_CR_CLM_MASK; - } - else - { - base->CR &= ~DMA_CR_CLM_MASK; - } -} - -/*! - * @brief Enable/Disable minor loop mapping. - * - * The TCDn.word2 is redefined to include individual enable fields, an offset field, and the - * NBYTES field. - * - * @param base EDMA peripheral base address. - * @param enable true is enable, false is disable. - */ -static inline void EDMA_EnableMinorLoopMapping(DMA_Type *base, bool enable) -{ - if (enable) - { - base->CR |= DMA_CR_EMLM_MASK; - } - else - { - base->CR &= ~DMA_CR_EMLM_MASK; - } -} - -/* @} */ -/*! - * @name eDMA Channel Operation - * @{ - */ - -/*! - * @brief Sets all TCD registers to default values. - * - * This function sets TCD registers for this channel to default values. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @note This function must not be called while the channel transfer is ongoing - * or it causes unpredictable results. - * @note This function enables the auto stop request feature. - */ -void EDMA_ResetChannel(DMA_Type *base, uint32_t channel); - -/*! - * @brief Configures the eDMA transfer attribute. - * - * This function configures the transfer attribute, including source address, destination address, - * transfer size, address offset, and so on. It also configures the scatter gather feature if the - * user supplies the TCD address. - * Example: - * @code - * edma_transfer_t config; - * edma_tcd_t tcd; - * config.srcAddr = ..; - * config.destAddr = ..; - * ... - * EDMA_SetTransferConfig(DMA0, channel, &config, &stcd); - * @endcode - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param config Pointer to eDMA transfer configuration structure. - * @param nextTcd Point to TCD structure. It can be NULL if users - * do not want to enable scatter/gather feature. - * @note If nextTcd is not NULL, it means scatter gather feature is enabled - * and DREQ bit is cleared in the previous transfer configuration, which - * is set in the eDMA_ResetChannel. - */ -void EDMA_SetTransferConfig(DMA_Type *base, - uint32_t channel, - const edma_transfer_config_t *config, - edma_tcd_t *nextTcd); - -/*! - * @brief Configures the eDMA minor offset feature. - * - * The minor offset means that the signed-extended value is added to the source address or destination - * address after each minor loop. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param config A pointer to the minor offset configuration structure. - */ -void EDMA_SetMinorOffsetConfig(DMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config); - -/*! - * @brief Configures the eDMA channel preemption feature. - * - * This function configures the channel preemption attribute and the priority of the channel. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number - * @param config A pointer to the channel preemption configuration structure. - */ -void EDMA_SetChannelPreemptionConfig(DMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config); - -/*! - * @brief Sets the channel link for the eDMA transfer. - * - * This function configures either the minor link or the major link mode. The minor link means that the channel link is - * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is - * exhausted. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param type A channel link type, which can be one of the following: - * @arg kEDMA_LinkNone - * @arg kEDMA_MinorLink - * @arg kEDMA_MajorLink - * @param linkedChannel The linked channel number. - * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. - */ -void EDMA_SetChannelLink(DMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel); - -/*! - * @brief Sets the bandwidth for the eDMA transfer. - * - * Because the eDMA processes the minor loop, it continuously generates read/write sequences - * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of - * each read/write access to control the bus request bandwidth seen by the crossbar switch. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param bandWidth A bandwidth setting, which can be one of the following: - * @arg kEDMABandwidthStallNone - * @arg kEDMABandwidthStall4Cycle - * @arg kEDMABandwidthStall8Cycle - */ -void EDMA_SetBandWidth(DMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth); - -/*! - * @brief Sets the source modulo and the destination modulo for the eDMA transfer. - * - * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) - * calculation is performed or the original register value. It provides the ability to implement a circular data - * queue easily. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param srcModulo A source modulo value. - * @param destModulo A destination modulo value. - */ -void EDMA_SetModulo(DMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo); - -#if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT -/*! - * @brief Enables an async request for the eDMA transfer. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param enable The command to enable (true) or disable (false). - */ -static inline void EDMA_EnableAsyncRequest(DMA_Type *base, uint32_t channel, bool enable) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->EARS &= ~((uint32_t)1U << channel); - base->EARS |= ((uint32_t)(true == enable ? 1U : 0U) << channel); -} -#endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */ - -/*! - * @brief Enables an auto stop request for the eDMA transfer. - * - * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param enable The command to enable (true) or disable (false). - */ -static inline void EDMA_EnableAutoStopRequest(DMA_Type *base, uint32_t channel, bool enable) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->TCD[channel].CSR = - (uint16_t)((base->TCD[channel].CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ((true == enable ? 1U : 0U))); -} - -/*! - * @brief Enables the interrupt source for the eDMA transfer. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask); - -/*! - * @brief Disables the interrupt source for the eDMA transfer. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param mask The mask of the interrupt source to be set. Use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_DisableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask); - -/*! - * @brief Configures the eDMA channel TCD major offset feature. - * - * Adjustment value added to the source address at the completion of the major iteration count - * - * @param base eDMA peripheral base address. - * @param channel edma channel number. - * @param sourceOffset source address offset will be applied to source address after major loop done. - * @param destOffset destination address offset will be applied to source address after major loop done. - */ -void EDMA_SetMajorOffsetConfig(DMA_Type *base, uint32_t channel, int32_t sourceOffset, int32_t destOffset); - -/* @} */ -/*! - * @name eDMA TCD Operation - * @{ - */ - -/*! - * @brief Sets all fields to default values for the TCD structure. - * - * This function sets all fields for this TCD structure to default value. - * - * @param tcd Pointer to the TCD structure. - * @note This function enables the auto stop request feature. - */ -void EDMA_TcdReset(edma_tcd_t *tcd); - -/*! - * @brief Configures the eDMA TCD transfer attribute. - * - * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. - * The STCD is used in the scatter-gather mode. - * This function configures the TCD transfer attribute, including source address, destination address, - * transfer size, address offset, and so on. It also configures the scatter gather feature if the - * user supplies the next TCD address. - * Example: - * @code - * edma_transfer_t config = { - * ... - * } - * edma_tcd_t tcd __aligned(32); - * edma_tcd_t nextTcd __aligned(32); - * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); - * @endcode - * - * @param tcd Pointer to the TCD structure. - * @param config Pointer to eDMA transfer configuration structure. - * @param nextTcd Pointer to the next TCD structure. It can be NULL if users - * do not want to enable scatter/gather feature. - * @note TCD address should be 32 bytes aligned or it causes an eDMA error. - * @note If the nextTcd is not NULL, the scatter gather feature is enabled - * and DREQ bit is cleared in the previous transfer configuration, which - * is set in the EDMA_TcdReset. - */ -void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd); - -/*! - * @brief Configures the eDMA TCD minor offset feature. - * - * A minor offset is a signed-extended value added to the source address or a destination - * address after each minor loop. - * - * @param tcd A point to the TCD structure. - * @param config A pointer to the minor offset configuration structure. - */ -void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config); - -/*! - * @brief Sets the channel link for the eDMA TCD. - * - * This function configures either a minor link or a major link. The minor link means the channel link is - * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is - * exhausted. - * - * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. - * @param tcd Point to the TCD structure. - * @param type Channel link type, it can be one of: - * @arg kEDMA_LinkNone - * @arg kEDMA_MinorLink - * @arg kEDMA_MajorLink - * @param linkedChannel The linked channel number. - */ -void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel); - -/*! - * @brief Sets the bandwidth for the eDMA TCD. - * - * Because the eDMA processes the minor loop, it continuously generates read/write sequences - * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of - * each read/write access to control the bus request bandwidth seen by the crossbar switch. - * @param tcd A pointer to the TCD structure. - * @param bandWidth A bandwidth setting, which can be one of the following: - * @arg kEDMABandwidthStallNone - * @arg kEDMABandwidthStall4Cycle - * @arg kEDMABandwidthStall8Cycle - */ -static inline void EDMA_TcdSetBandWidth(edma_tcd_t *tcd, edma_bandwidth_t bandWidth) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - tcd->CSR = (uint16_t)((tcd->CSR & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth)); -} - -/*! - * @brief Sets the source modulo and the destination modulo for the eDMA TCD. - * - * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) - * calculation is performed or the original register value. It provides the ability to implement a circular data - * queue easily. - * - * @param tcd A pointer to the TCD structure. - * @param srcModulo A source modulo value. - * @param destModulo A destination modulo value. - */ -void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo); - -/*! - * @brief Sets the auto stop request for the eDMA TCD. - * - * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request. - * - * @param tcd A pointer to the TCD structure. - * @param enable The command to enable (true) or disable (false). - */ -static inline void EDMA_TcdEnableAutoStopRequest(edma_tcd_t *tcd, bool enable) -{ - assert(tcd != NULL); - assert(((uint32_t)tcd & 0x1FU) == 0U); - - tcd->CSR = (uint16_t)((tcd->CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ((true == enable ? 1U : 0U))); -} - -/*! - * @brief Enables the interrupt source for the eDMA TCD. - * - * @param tcd Point to the TCD structure. - * @param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask); - -/*! - * @brief Disables the interrupt source for the eDMA TCD. - * - * @param tcd Point to the TCD structure. - * @param mask The mask of interrupt source to be set. Users need to use - * the defined edma_interrupt_enable_t type. - */ -void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask); - -/*! - * @brief Configures the eDMA TCD major offset feature. - * - * Adjustment value added to the source address at the completion of the major iteration count - * - * @param tcd A point to the TCD structure. - * @param sourceOffset source address offset wiil be applied to source address after major loop done. - * @param destOffset destination address offset will be applied to source address after major loop done. - */ -void EDMA_TcdSetMajorOffsetConfig(edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset); - -/*! @} */ -/*! - * @name eDMA Channel Transfer Operation - * @{ - */ - -/*! - * @brief Enables the eDMA hardware channel request. - * - * This function enables the hardware channel request. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - */ -static inline void EDMA_EnableChannelRequest(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->SERQ = DMA_SERQ_SERQ(channel); -} - -/*! - * @brief Disables the eDMA hardware channel request. - * - * This function disables the hardware channel request. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - */ -static inline void EDMA_DisableChannelRequest(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->CERQ = DMA_CERQ_CERQ(channel); -} - -/*! - * @brief Starts the eDMA transfer by using the software trigger. - * - * This function starts a minor loop transfer. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - */ -static inline void EDMA_TriggerChannelStart(DMA_Type *base, uint32_t channel) -{ - assert(channel < (uint32_t)FSL_FEATURE_DMAMUX_MODULE_CHANNEL); - - base->SSRT = DMA_SSRT_SSRT(channel); -} - -/*! @} */ -/*! - * @name eDMA Channel Status Operation - * @{ - */ - -/*! - * @brief Gets the remaining major loop count from the eDMA current channel TCD. - * - * This function checks the TCD (Task Control Descriptor) status for a specified - * eDMA channel and returns the number of major loop count that has not finished. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @return Major loop count which has not been transferred yet for the current TCD. - * @note 1. This function can only be used to get unfinished major loop count of transfer without - * the next TCD, or it might be inaccuracy. - * 2. The unfinished/remaining transfer bytes cannot be obtained directly from registers while - * the channel is running. - * Because to calculate the remaining bytes, the initial NBYTES configured in DMA_TCDn_NBYTES_MLNO - * register is needed while the eDMA IP does not support getting it while a channel is active. - * In another word, the NBYTES value reading is always the actual (decrementing) NBYTES value the dma_engine - * is working with while a channel is running. - * Consequently, to get the remaining transfer bytes, a software-saved initial value of NBYTES (for example - * copied before enabling the channel) is needed. The formula to calculate it is shown below: - * RemainingBytes = RemainingMajorLoopCount * NBYTES(initially configured) - */ -uint32_t EDMA_GetRemainingMajorLoopCount(DMA_Type *base, uint32_t channel); - -/*! - * @brief Gets the eDMA channel error status flags. - * - * @param base eDMA peripheral base address. - * @return The mask of error status flags. Users need to use the - * _edma_error_status_flags type to decode the return variables. - */ -static inline uint32_t EDMA_GetErrorStatusFlags(DMA_Type *base) -{ - return base->ES; -} - -/*! - * @brief Gets the eDMA channel status flags. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @return The mask of channel status flags. Users need to use the - * _edma_channel_status_flags type to decode the return variables. - */ -uint32_t EDMA_GetChannelStatusFlags(DMA_Type *base, uint32_t channel); - -/*! - * @brief Clears the eDMA channel status flags. - * - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - * @param mask The mask of channel status to be cleared. Users need to use - * the defined _edma_channel_status_flags type. - */ -void EDMA_ClearChannelStatusFlags(DMA_Type *base, uint32_t channel, uint32_t mask); - -/*! @} */ -/*! - * @name eDMA Transactional Operation - */ - -/*! - * @brief Creates the eDMA handle. - * - * This function is called if using the transactional API for eDMA. This function - * initializes the internal state of the eDMA handle. - * - * @param handle eDMA handle pointer. The eDMA handle stores callback function and - * parameters. - * @param base eDMA peripheral base address. - * @param channel eDMA channel number. - */ -void EDMA_CreateHandle(edma_handle_t *handle, DMA_Type *base, uint32_t channel); - -/*! - * @brief Installs the TCDs memory pool into the eDMA handle. - * - * This function is called after the EDMA_CreateHandle to use scatter/gather feature. This function shall only be used - * while users need to use scatter gather mode. Scatter gather mode enables EDMA to load a new transfer control block - * (tcd) in hardware, and automatically reconfigure that DMA channel for a new transfer. - * Users need to prepare tcd memory and also configure tcds using interface EDMA_SubmitTransfer. - * - * @param handle eDMA handle pointer. - * @param tcdPool A memory pool to store TCDs. It must be 32 bytes aligned. - * @param tcdSize The number of TCD slots. - */ -void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize); - -/*! - * @brief Installs a callback function for the eDMA transfer. - * - * This callback is called in the eDMA IRQ handler. Use the callback to do something after - * the current major loop transfer completes. This function will be called every time one tcd finished transfer. - * - * @param handle eDMA handle pointer. - * @param callback eDMA callback function pointer. - * @param userData A parameter for the callback function. - */ -void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData); - -/*! - * @brief Prepares the eDMA transfer structure configurations. - * - * This function prepares the transfer configuration structure according to the user input. - * - * @param config The user configuration structure of type edma_transfer_t. - * @param srcAddr eDMA transfer source address. - * @param srcWidth eDMA transfer source address width(bytes). - * @param srcOffset source address offset. - * @param destAddr eDMA transfer destination address. - * @param destWidth eDMA transfer destination address width(bytes). - * @param destOffset destination address offset. - * @param bytesEachRequest eDMA transfer bytes per channel request. - * @param transferBytes eDMA transfer bytes to be transferred. - * @note The data address and the data width must be consistent. For example, if the SRC - * is 4 bytes, the source address must be 4 bytes aligned, or it results in - * source address error (SAE). - */ -void EDMA_PrepareTransferConfig(edma_transfer_config_t *config, - void *srcAddr, - uint32_t srcWidth, - int16_t srcOffset, - void *destAddr, - uint32_t destWidth, - int16_t destOffset, - uint32_t bytesEachRequest, - uint32_t transferBytes); - -/*! - * @brief Prepares the eDMA transfer structure. - * - * This function prepares the transfer configuration structure according to the user input. - * - * @param config The user configuration structure of type edma_transfer_t. - * @param srcAddr eDMA transfer source address. - * @param srcWidth eDMA transfer source address width(bytes). - * @param destAddr eDMA transfer destination address. - * @param destWidth eDMA transfer destination address width(bytes). - * @param bytesEachRequest eDMA transfer bytes per channel request. - * @param transferBytes eDMA transfer bytes to be transferred. - * @param type eDMA transfer type. - * @note The data address and the data width must be consistent. For example, if the SRC - * is 4 bytes, the source address must be 4 bytes aligned, or it results in - * source address error (SAE). - */ -void EDMA_PrepareTransfer(edma_transfer_config_t *config, - void *srcAddr, - uint32_t srcWidth, - void *destAddr, - uint32_t destWidth, - uint32_t bytesEachRequest, - uint32_t transferBytes, - edma_transfer_type_t type); - -/*! - * @brief Submits the eDMA transfer request. - * - * This function submits the eDMA transfer request according to the transfer configuration structure. - * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. - * The tcd pools is setup by call function EDMA_InstallTCDMemory before. - * - * @param handle eDMA handle pointer. - * @param config Pointer to eDMA transfer configuration structure. - * @retval kStatus_EDMA_Success It means submit transfer request succeed. - * @retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. - * @retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. - */ -status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config); - -/*! - * @brief eDMA starts transfer. - * - * This function enables the channel request. Users can call this function after submitting the transfer request - * or before submitting the transfer request. - * - * @param handle eDMA handle pointer. - */ -void EDMA_StartTransfer(edma_handle_t *handle); - -/*! - * @brief eDMA stops transfer. - * - * This function disables the channel request to pause the transfer. Users can call EDMA_StartTransfer() - * again to resume the transfer. - * - * @param handle eDMA handle pointer. - */ -void EDMA_StopTransfer(edma_handle_t *handle); - -/*! - * @brief eDMA aborts transfer. - * - * This function disables the channel request and clear transfer status bits. - * Users can submit another transfer after calling this API. - * - * @param handle DMA handle pointer. - */ -void EDMA_AbortTransfer(edma_handle_t *handle); - -/*! - * @brief Get unused TCD slot number. - * - * This function gets current tcd index which is run. If the TCD pool pointer is NULL, it will return 0. - * - * @param handle DMA handle pointer. - * @return The unused tcd slot number. - */ -static inline uint32_t EDMA_GetUnusedTCDNumber(edma_handle_t *handle) -{ - int8_t tmpTcdSize = handle->tcdSize; - int8_t tmpTcdUsed = handle->tcdUsed; - return ((uint32_t)tmpTcdSize - (uint32_t)tmpTcdUsed); -} - -/*! - * @brief Get the next tcd address. - * - * This function gets the next tcd address. If this is last TCD, return 0. - * - * @param handle DMA handle pointer. - * @return The next TCD address. - */ -static inline uint32_t EDMA_GetNextTCDAddress(edma_handle_t *handle) -{ - return (uint32_t)(handle->base->TCD[handle->channel].DLAST_SGA); -} - -/*! - * @brief eDMA IRQ handler for the current major loop transfer completion. - * - * This function clears the channel major interrupt flag and calls - * the callback function if it is not NULL. - * - * Note: - * For the case using TCD queue, when the major iteration count is exhausted, additional operations are performed. - * These include the final address adjustments and reloading of the BITER field into the CITER. - * Assertion of an optional interrupt request also occurs at this time, as does a possible fetch of a new TCD from - * memory using the scatter/gather address pointer included in the descriptor (if scatter/gather is enabled). - * - * For instance, when the time interrupt of TCD[0] happens, the TCD[1] has already been loaded into the eDMA engine. - * As sga and sga_index are calculated based on the DLAST_SGA bitfield lies in the TCD_CSR register, the sga_index - * in this case should be 2 (DLAST_SGA of TCD[1] stores the address of TCD[2]). Thus, the "tcdUsed" updated should be - * (tcdUsed - 2U) which indicates the number of TCDs can be loaded in the memory pool (because TCD[0] and TCD[1] have - * been loaded into the eDMA engine at this point already.). - * - * For the last two continuous ISRs in a scatter/gather process, they both load the last TCD (The last ISR does not - * load a new TCD) from the memory pool to the eDMA engine when major loop completes. - * Therefore, ensure that the header and tcdUsed updated are identical for them. - * tcdUsed are both 0 in this case as no TCD to be loaded. - * - * See the "eDMA basic data flow" in the eDMA Functional description section of the Reference Manual for - * further details. - * - * @param handle eDMA handle pointer. - */ -void EDMA_HandleIRQ(edma_handle_t *handle); - -/* @} */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/* @} */ - -#endif /*_FSL_EDMA_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_elcdif.c b/devices/MIMXRT1052/drivers/fsl_elcdif.c deleted file mode 100644 index 39cb726..0000000 --- a/devices/MIMXRT1052/drivers/fsl_elcdif.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_elcdif.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.elcdif" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get instance number for ELCDIF module. - * - * @param base ELCDIF peripheral base address - */ -static uint32_t ELCDIF_GetInstance(LCDIF_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Pointers to ELCDIF bases for each instance. */ -static LCDIF_Type *const s_elcdifBases[] = LCDIF_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to eLCDIF apb_clk for each instance. */ -static const clock_ip_name_t s_elcdifApbClocks[] = LCDIF_CLOCKS; -#if defined(LCDIF_PERIPH_CLOCKS) -/*! @brief Pointers to eLCDIF pix_clk for each instance. */ -static const clock_ip_name_t s_elcdifPixClocks[] = LCDIF_PERIPH_CLOCKS; -#endif -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief The control register value to select different pixel format. */ -static const elcdif_pixel_format_reg_t s_pixelFormatReg[] = { - /* kELCDIF_PixelFormatRAW8 */ - {/* Register CTRL. */ - LCDIF_CTRL_WORD_LENGTH(1U), - /* Register CTRL1. */ - LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)}, - /* kELCDIF_PixelFormatRGB565 */ - {/* Register CTRL. */ - LCDIF_CTRL_WORD_LENGTH(0U), - /* Register CTRL1. */ - LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)}, - /* kELCDIF_PixelFormatRGB666 */ - {/* Register CTRL. */ - LCDIF_CTRL_WORD_LENGTH(3U) | LCDIF_CTRL_DATA_FORMAT_24_BIT(1U), - /* Register CTRL1. */ - LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x07U)}, - /* kELCDIF_PixelFormatXRGB8888 */ - {/* Register CTRL. 24-bit. */ - LCDIF_CTRL_WORD_LENGTH(3U), - /* Register CTRL1. */ - LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x07U)}, - /* kELCDIF_PixelFormatRGB888 */ - {/* Register CTRL. 24-bit. */ - LCDIF_CTRL_WORD_LENGTH(3U), - /* Register CTRL1. */ - LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)}, -}; - -/******************************************************************************* - * Codes - ******************************************************************************/ -static uint32_t ELCDIF_GetInstance(LCDIF_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_elcdifBases); instance++) - { - if (s_elcdifBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_elcdifBases)); - - return instance; -} - -/*! - * brief Initializes the eLCDIF to work in RGB mode (DOTCLK mode). - * - * This function ungates the eLCDIF clock and configures the eLCDIF peripheral according - * to the configuration structure. - * - * param base eLCDIF peripheral base address. - * param config Pointer to the configuration structure. - */ -void ELCDIF_RgbModeInit(LCDIF_Type *base, const elcdif_rgb_mode_config_t *config) -{ - assert(NULL != config); - assert((uint32_t)config->pixelFormat < ARRAY_SIZE(s_pixelFormatReg)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = ELCDIF_GetInstance(base); - /* Enable the clock. */ - (void)CLOCK_EnableClock(s_elcdifApbClocks[instance]); -#if defined(LCDIF_PERIPH_CLOCKS) - (void)CLOCK_EnableClock(s_elcdifPixClocks[instance]); -#endif -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Reset. */ - ELCDIF_Reset(base); - - base->CTRL = s_pixelFormatReg[(uint32_t)config->pixelFormat].regCtrl | (uint32_t)(config->dataBus) | - LCDIF_CTRL_DOTCLK_MODE_MASK | /* RGB mode. */ - LCDIF_CTRL_BYPASS_COUNT_MASK | /* Keep RUN bit set. */ - LCDIF_CTRL_MASTER_MASK; - - base->CTRL1 = s_pixelFormatReg[(uint32_t)config->pixelFormat].regCtrl1; - - base->CTRL2 = (base->CTRL2 & ~LCDIF_CTRL2_OUTSTANDING_REQS_MASK) | (LCDIF_CTRL2_OUTSTANDING_REQS(4)); - - base->TRANSFER_COUNT = ((uint32_t)config->panelHeight << LCDIF_TRANSFER_COUNT_V_COUNT_SHIFT) | - ((uint32_t)config->panelWidth << LCDIF_TRANSFER_COUNT_H_COUNT_SHIFT); - - base->VDCTRL0 = LCDIF_VDCTRL0_ENABLE_PRESENT_MASK | /* Data enable signal. */ - LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_MASK | /* VSYNC period in the unit of display clock. */ - LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_MASK | /* VSYNC pulse width in the unit of display clock. */ - (uint32_t)config->polarityFlags | (uint32_t)config->vsw; - - base->VDCTRL1 = - (uint32_t)config->vsw + (uint32_t)config->panelHeight + (uint32_t)config->vfp + (uint32_t)config->vbp; - base->VDCTRL2 = - ((uint32_t)config->hsw << LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_SHIFT) | - (((uint32_t)config->hfp + (uint32_t)config->hbp + (uint32_t)config->panelWidth + (uint32_t)config->hsw)) - << LCDIF_VDCTRL2_HSYNC_PERIOD_SHIFT; - - base->VDCTRL3 = (((uint32_t)config->hbp + config->hsw) << LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_SHIFT) | - (((uint32_t)config->vbp + config->vsw) << LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_SHIFT); - - base->VDCTRL4 = LCDIF_VDCTRL4_SYNC_SIGNALS_ON_MASK | - ((uint32_t)config->panelWidth << LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_SHIFT); - - base->CUR_BUF = ELCDIF_ADDR_CPU_2_IP(config->bufferAddr); - base->NEXT_BUF = ELCDIF_ADDR_CPU_2_IP(config->bufferAddr); -} - -/*! - * brief Gets the eLCDIF default configuration structure for RGB (DOTCLK) mode. - * - * This function sets the configuration structure to default values. - * The default configuration is set to the following values. - * code - config->panelWidth = 480U; - config->panelHeight = 272U; - config->hsw = 41; - config->hfp = 4; - config->hbp = 8; - config->vsw = 10; - config->vfp = 4; - config->vbp = 2; - config->polarityFlags = kELCDIF_VsyncActiveLow | - kELCDIF_HsyncActiveLow | - kELCDIF_DataEnableActiveLow | - kELCDIF_DriveDataOnFallingClkEdge; - config->bufferAddr = 0U; - config->pixelFormat = kELCDIF_PixelFormatRGB888; - config->dataBus = kELCDIF_DataBus24Bit; - code - * - * param config Pointer to the eLCDIF configuration structure. - */ -void ELCDIF_RgbModeGetDefaultConfig(elcdif_rgb_mode_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->panelWidth = 480U; - config->panelHeight = 272U; - config->hsw = 41; - config->hfp = 4; - config->hbp = 8; - config->vsw = 10; - config->vfp = 4; - config->vbp = 2; - config->polarityFlags = (uint32_t)kELCDIF_VsyncActiveLow | (uint32_t)kELCDIF_HsyncActiveLow | - (uint32_t)kELCDIF_DataEnableActiveLow | (uint32_t)kELCDIF_DriveDataOnFallingClkEdge; - config->bufferAddr = 0U; - config->pixelFormat = kELCDIF_PixelFormatRGB888; - config->dataBus = kELCDIF_DataBus24Bit; -} - -/*! - * brief Set the pixel format in RGB (DOTCLK) mode. - * - * param base eLCDIF peripheral base address. - * param pixelFormat The pixel format. - */ -void ELCDIF_RgbModeSetPixelFormat(LCDIF_Type *base, elcdif_pixel_format_t pixelFormat) -{ - assert((uint32_t)pixelFormat < ARRAY_SIZE(s_pixelFormatReg)); - - base->CTRL = (base->CTRL & ~(LCDIF_CTRL_WORD_LENGTH_MASK | LCDIF_CTRL_DATA_FORMAT_24_BIT_MASK | - LCDIF_CTRL_DATA_FORMAT_18_BIT_MASK | LCDIF_CTRL_DATA_FORMAT_16_BIT_MASK)) | - s_pixelFormatReg[(uint32_t)pixelFormat].regCtrl; - - base->CTRL1 = s_pixelFormatReg[(uint32_t)pixelFormat].regCtrl1; -} - -/*! - * brief Deinitializes the eLCDIF peripheral. - * - * param base eLCDIF peripheral base address. - */ -void ELCDIF_Deinit(LCDIF_Type *base) -{ - ELCDIF_Reset(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = ELCDIF_GetInstance(base); -/* Disable the clock. */ -#if defined(LCDIF_PERIPH_CLOCKS) - (void)CLOCK_DisableClock(s_elcdifPixClocks[instance]); -#endif - (void)CLOCK_DisableClock(s_elcdifApbClocks[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Stop display in RGB (DOTCLK) mode and wait until finished. - * - * param base eLCDIF peripheral base address. - */ -void ELCDIF_RgbModeStop(LCDIF_Type *base) -{ - base->CTRL_CLR = LCDIF_CTRL_DOTCLK_MODE_MASK; - - /* Wait for data transfer finished. */ - while (0U != (base->CTRL & LCDIF_CTRL_DOTCLK_MODE_MASK)) - { - } -} - -/*! - * brief Reset the eLCDIF peripheral. - * - * param base eLCDIF peripheral base address. - */ -void ELCDIF_Reset(LCDIF_Type *base) -{ - /* - * ELCDIF reset workflow: - * - * 1. Ungate clock. - * 2. Trigger the software reset. - * 3. The software reset finished when clk_gate bit is set. - * 4. Ungate the clock. - * 5. Release the reset. - */ - - /* Ungate clock. */ - base->CTRL_CLR = LCDIF_CTRL_CLKGATE_MASK; - - /* - * If already in reset state, release the reset. - * If not, trigger reset. - */ - if (0U == (base->CTRL & LCDIF_CTRL_SFTRST_MASK)) - { - /* Trigger reset. */ - base->CTRL_SET = LCDIF_CTRL_SFTRST_MASK; - - /* Reset is not finished until CLK_GATE is set. */ - while (0U == (base->CTRL & LCDIF_CTRL_CLKGATE_MASK)) - { - } - - /* Ungate the clock. */ - base->CTRL_CLR = LCDIF_CTRL_CLKGATE_MASK; - } - - /* Release the reset. */ - base->CTRL_CLR = LCDIF_CTRL_SFTRST_MASK; -} - -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) -/*! - * brief Set the configuration for alpha surface buffer. - * - * param base eLCDIF peripheral base address. - * param config Pointer to the configuration structure. - */ -void ELCDIF_SetAlphaSurfaceBufferConfig(LCDIF_Type *base, const elcdif_as_buffer_config_t *config) -{ - assert(NULL != config); - - base->AS_CTRL = (base->AS_CTRL & ~LCDIF_AS_CTRL_FORMAT_MASK) | LCDIF_AS_CTRL_FORMAT(config->pixelFormat); - base->AS_BUF = ELCDIF_ADDR_CPU_2_IP(config->bufferAddr); - base->AS_NEXT_BUF = ELCDIF_ADDR_CPU_2_IP(config->bufferAddr); -} - -/*! - * brief Set the alpha surface blending configuration. - * - * param base eLCDIF peripheral base address. - * param config Pointer to the configuration structure. - */ -void ELCDIF_SetAlphaSurfaceBlendConfig(LCDIF_Type *base, const elcdif_as_blend_config_t *config) -{ - assert(NULL != config); - uint32_t reg; - - reg = base->AS_CTRL; - reg &= ~(LCDIF_AS_CTRL_ALPHA_INVERT_MASK | LCDIF_AS_CTRL_ROP_MASK | LCDIF_AS_CTRL_ALPHA_MASK | - LCDIF_AS_CTRL_ALPHA_CTRL_MASK); - reg |= (LCDIF_AS_CTRL_ROP(config->ropMode) | LCDIF_AS_CTRL_ALPHA(config->alpha) | - LCDIF_AS_CTRL_ALPHA_CTRL(config->alphaMode)); - - if (config->invertAlpha) - { - reg |= LCDIF_AS_CTRL_ALPHA_INVERT_MASK; - } - - base->AS_CTRL = reg; -} -#endif /* FSL_FEATURE_LCDIF_HAS_NO_AS */ - -#if (defined(FSL_FEATURE_LCDIF_HAS_LUT) && FSL_FEATURE_LCDIF_HAS_LUT) -/*! - * brief Load the LUT value. - * - * This function loads the LUT value to the specific LUT memory, user can - * specify the start entry index. - * - * param base eLCDIF peripheral base address. - * param lut Which LUT to load. - * param startIndex The start index of the LUT entry to update. - * param lutData The LUT data to load. - * param count Count of p lutData. - * retval kStatus_Success Initialization success. - * retval kStatus_InvalidArgument Wrong argument. - */ -status_t ELCDIF_UpdateLut( - LCDIF_Type *base, elcdif_lut_t lut, uint16_t startIndex, const uint32_t *lutData, uint16_t count) -{ - volatile uint32_t *regLutAddr; - volatile uint32_t *regLutData; - uint32_t i; - status_t status; - - /* Only has 256 entries. */ - if (startIndex + count > ELCDIF_LUT_ENTRY_NUM) - { - status = kStatus_InvalidArgument; - } - else - { - if (kELCDIF_Lut0 == lut) - { - regLutAddr = &(base->LUT0_ADDR); - regLutData = &(base->LUT0_DATA); - } - else - { - regLutAddr = &(base->LUT1_ADDR); - regLutData = &(base->LUT1_DATA); - } - - *regLutAddr = startIndex; - - for (i = 0; i < count; i++) - { - *regLutData = lutData[i]; - } - - status = kStatus_Success; - } - - return status; -} -#endif /* FSL_FEATURE_LCDIF_HAS_LUT */ diff --git a/devices/MIMXRT1052/drivers/fsl_elcdif.h b/devices/MIMXRT1052/drivers/fsl_elcdif.h deleted file mode 100644 index a9d56a1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_elcdif.h +++ /dev/null @@ -1,765 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_ELCDIF_H_ -#define _FSL_ELCDIF_H_ - -#include "fsl_common.h" - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#include "fsl_memory.h" -#endif - -/*! - * @addtogroup elcdif - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief eLCDIF driver version */ -#define FSL_ELCDIF_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) -/*@}*/ - -/* All IRQ flags in CTRL1 register. */ -#define ELCDIF_CTRL1_IRQ_MASK \ - (LCDIF_CTRL1_BM_ERROR_IRQ_MASK | LCDIF_CTRL1_OVERFLOW_IRQ_MASK | LCDIF_CTRL1_UNDERFLOW_IRQ_MASK | \ - LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK | LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK) - -/* All IRQ enable control bits in CTRL1 register. */ -#define ELCDIF_CTRL1_IRQ_EN_MASK \ - (LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK | LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK | LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK | \ - LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK | LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK) - -/* All IRQ flags in AS_CTRL register. */ -#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK) -#define ELCDIF_AS_CTRL_IRQ_MASK (LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK) -#else -#define ELCDIF_AS_CTRL_IRQ_MASK 0U -#endif - -/* All IRQ enable control bits in AS_CTRL register. */ -#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK) -#define ELCDIF_AS_CTRL_IRQ_EN_MASK (LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK) -#else -#define ELCDIF_AS_CTRL_IRQ_EN_MASK 0U -#endif - -#if ((ELCDIF_CTRL1_IRQ_MASK & ELCDIF_AS_CTRL_IRQ_MASK) || (ELCDIF_AS_CTRL_IRQ_MASK & ELCDIF_AS_CTRL_IRQ_EN_MASK)) -#error Interrupt bits overlap, need to update the interrupt functions. -#endif - -#if defined(LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK) -#define FSL_FEATURE_LCDIF_HAS_PXP_HANDSHAKE 1 -#else -#define FSL_FEATURE_LCDIF_HAS_PXP_HANDSHAKE 0 -#endif - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#define ELCDIF_ADDR_CPU_2_IP(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_Local2DMA)) -#else -#define ELCDIF_ADDR_CPU_2_IP(addr) (addr) -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - -/* LUT memory entery number. */ -#define ELCDIF_LUT_ENTRY_NUM 256U - -/*! - * @brief eLCDIF signal polarity flags - */ -enum _elcdif_polarity_flags -{ - kELCDIF_VsyncActiveLow = 0U, /*!< VSYNC active low. */ - kELCDIF_VsyncActiveHigh = LCDIF_VDCTRL0_VSYNC_POL_MASK, /*!< VSYNC active high. */ - kELCDIF_HsyncActiveLow = 0U, /*!< HSYNC active low. */ - kELCDIF_HsyncActiveHigh = LCDIF_VDCTRL0_HSYNC_POL_MASK, /*!< HSYNC active high. */ - kELCDIF_DataEnableActiveLow = 0U, /*!< Data enable line active low. */ - kELCDIF_DataEnableActiveHigh = LCDIF_VDCTRL0_ENABLE_POL_MASK, /*!< Data enable line active high. */ - kELCDIF_DriveDataOnFallingClkEdge = 0U, /*!< Drive data on falling clock edge, capture data - on rising clock edge. */ - kELCDIF_DriveDataOnRisingClkEdge = LCDIF_VDCTRL0_DOTCLK_POL_MASK, /*!< Drive data on falling - clock edge, capture data - on rising clock edge. */ -}; - -/*! - * @brief The eLCDIF interrupts to enable. - */ -enum _elcdif_interrupt_enable -{ - kELCDIF_BusMasterErrorInterruptEnable = LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK, /*!< Bus master error interrupt. */ - kELCDIF_TxFifoOverflowInterruptEnable = LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK, /*!< TXFIFO overflow interrupt. */ - kELCDIF_TxFifoUnderflowInterruptEnable = LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK, /*!< TXFIFO underflow interrupt. */ - kELCDIF_CurFrameDoneInterruptEnable = - LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK, /*!< Interrupt when hardware enters vertical blanking state. */ - kELCDIF_VsyncEdgeInterruptEnable = - LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK, /*!< Interrupt when hardware encounters VSYNC edge. */ -#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK) - kELCDIF_SciSyncOnInterruptEnable = - LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK, /*!< Interrupt when eLCDIF lock with CSI input. */ -#endif -}; - -/*! - * @brief The eLCDIF interrupt status flags. - */ -enum _elcdif_interrupt_flags -{ - kELCDIF_BusMasterError = LCDIF_CTRL1_BM_ERROR_IRQ_MASK, /*!< Bus master error interrupt. */ - kELCDIF_TxFifoOverflow = LCDIF_CTRL1_OVERFLOW_IRQ_MASK, /*!< TXFIFO overflow interrupt. */ - kELCDIF_TxFifoUnderflow = LCDIF_CTRL1_UNDERFLOW_IRQ_MASK, /*!< TXFIFO underflow interrupt. */ - kELCDIF_CurFrameDone = - LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK, /*!< Interrupt when hardware enters vertical blanking state. */ - kELCDIF_VsyncEdge = LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK, /*!< Interrupt when hardware encounters VSYNC edge. */ -#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK) - kELCDIF_SciSyncOn = LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK, /*!< Interrupt when eLCDIF lock with CSI input. */ -#endif -}; - -/*! - * @brief eLCDIF status flags - */ -enum _elcdif_status_flags -{ - kELCDIF_LFifoFull = LCDIF_STAT_LFIFO_FULL_MASK, /*!< LFIFO full. */ - kELCDIF_LFifoEmpty = LCDIF_STAT_LFIFO_EMPTY_MASK, /*!< LFIFO empty. */ - kELCDIF_TxFifoFull = LCDIF_STAT_TXFIFO_FULL_MASK, /*!< TXFIFO full. */ - kELCDIF_TxFifoEmpty = LCDIF_STAT_TXFIFO_EMPTY_MASK, /*!< TXFIFO empty. */ -#if defined(LCDIF_STAT_BUSY_MASK) - kELCDIF_LcdControllerBusy = LCDIF_STAT_BUSY_MASK, /*!< The external LCD controller busy signal. */ -#endif -#if defined(LCDIF_STAT_DVI_CURRENT_FIELD_MASK) - kELCDIF_CurDviField2 = LCDIF_STAT_DVI_CURRENT_FIELD_MASK, /*!< Current DVI filed, if set, then current filed is 2, - otherwise current filed is 1. */ -#endif -}; - -/*! - * @brief The pixel format. - * - * This enumerator should be defined together with the array s_pixelFormatReg. - * To support new pixel format, enhance this enumerator and s_pixelFormatReg. - */ -typedef enum _elcdif_pixel_format -{ - kELCDIF_PixelFormatRAW8 = 0, /*!< RAW 8 bit, four data use 32 bits. */ - kELCDIF_PixelFormatRGB565 = 1, /*!< RGB565, two pixel use 32 bits. */ - kELCDIF_PixelFormatRGB666 = 2, /*!< RGB666 unpacked, one pixel uses 32 bits, high byte unused, - upper 2 bits of other bytes unused. */ - kELCDIF_PixelFormatXRGB8888 = 3, /*!< XRGB8888 unpacked, one pixel uses 32 bits, high byte unused. */ - kELCDIF_PixelFormatRGB888 = 4, /*!< RGB888 packed, one pixel uses 24 bits. */ -} elcdif_pixel_format_t; - -/*! @brief The LCD data bus type. */ -typedef enum _elcdif_lcd_data_bus -{ - kELCDIF_DataBus8Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(1), /*!< 8-bit data bus. */ - kELCDIF_DataBus16Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(0), /*!< 16-bit data bus, support RGB565. */ - kELCDIF_DataBus18Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(2), /*!< 18-bit data bus, support RGB666. */ - kELCDIF_DataBus24Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(3), /*!< 24-bit data bus, support RGB888. */ -} elcdif_lcd_data_bus_t; - -/*! - * @brief The register value when using different pixel format. - * - * These register bits control the pixel format: - * - CTRL[DATA_FORMAT_24_BIT] - * - CTRL[DATA_FORMAT_18_BIT] - * - CTRL[DATA_FORMAT_16_BIT] - * - CTRL[WORD_LENGTH] - * - CTRL1[BYTE_PACKING_FORMAT] - */ -typedef struct _elcdif_pixel_format_reg -{ - uint32_t regCtrl; /*!< Value of register CTRL. */ - uint32_t regCtrl1; /*!< Value of register CTRL1. */ -} elcdif_pixel_format_reg_t; - -/*! - * @brief eLCDIF configure structure for RGB mode (DOTCLK mode). - */ -typedef struct _elcdif_rgb_mode_config -{ - uint16_t panelWidth; /*!< Display panel width, pixels per line. */ - uint16_t panelHeight; /*!< Display panel height, how many lines per panel. */ - uint8_t hsw; /*!< HSYNC pulse width. */ - uint8_t hfp; /*!< Horizontal front porch. */ - uint8_t hbp; /*!< Horizontal back porch. */ - uint8_t vsw; /*!< VSYNC pulse width. */ - uint8_t vfp; /*!< Vrtical front porch. */ - uint8_t vbp; /*!< Vertical back porch. */ - uint32_t polarityFlags; /*!< OR'ed value of @ref _elcdif_polarity_flags, used to contol the signal polarity. */ - uint32_t bufferAddr; /*!< Frame buffer address. */ - elcdif_pixel_format_t pixelFormat; /*!< Pixel format. */ - elcdif_lcd_data_bus_t dataBus; /*!< LCD data bus. */ -} elcdif_rgb_mode_config_t; - -/*! - * @brief eLCDIF alpha surface pixel format. - */ -typedef enum _elcdif_as_pixel_format -{ - kELCDIF_AsPixelFormatARGB8888 = 0x0, /*!< 32-bit pixels with alpha. */ - kELCDIF_AsPixelFormatRGB888 = 0x4, /*!< 32-bit pixels without alpha (unpacked 24-bit format) */ - kELCDIF_AsPixelFormatARGB1555 = 0x8, /*!< 16-bit pixels with alpha. */ - kELCDIF_AsPixelFormatARGB4444 = 0x9, /*!< 16-bit pixels with alpha. */ - kELCDIF_AsPixelFormatRGB555 = 0xC, /*!< 16-bit pixels without alpha. */ - kELCDIF_AsPixelFormatRGB444 = 0xD, /*!< 16-bit pixels without alpha. */ - kELCDIF_AsPixelFormatRGB565 = 0xE, /*!< 16-bit pixels without alpha. */ -} elcdif_as_pixel_format_t; - -/*! - * @brief eLCDIF alpha surface buffer configuration. - */ -typedef struct _elcdif_as_buffer_config -{ - uint32_t bufferAddr; /*!< Buffer address. */ - elcdif_as_pixel_format_t pixelFormat; /*!< Pixel format. */ -} elcdif_as_buffer_config_t; - -/*! - * @brief eLCDIF alpha mode during blending. - */ -typedef enum _elcdif_alpha_mode -{ - kELCDIF_AlphaEmbedded, /*!< The alpha surface pixel alpha value will be used for blend. */ - kELCDIF_AlphaOverride, /*!< The user defined alpha value will be used for blend directly. */ - kELCDIF_AlphaMultiply, /*!< The alpha surface pixel alpha value scaled the user defined - alpha value will be used for blend, for example, pixel alpha set - set to 200, user defined alpha set to 100, then the reault alpha - is 200 * 100 / 255. */ - kELCDIF_AlphaRop /*!< Raster operation. */ -} elcdif_alpha_mode_t; - -/*! - * @brief eLCDIF ROP mode during blending. - * - * Explanation: - * - AS: Alpha surface - * - PS: Process surface - * - nAS: Alpha surface NOT value - * - nPS: Process surface NOT value - */ -typedef enum _elcdif_rop_mode -{ - kELCDIF_RopMaskAs = 0x0, /*!< AS AND PS. */ - kELCDIF_RopMaskNotAs = 0x1, /*!< nAS AND PS. */ - kELCDIF_RopMaskAsNot = 0x2, /*!< AS AND nPS. */ - kELCDIF_RopMergeAs = 0x3, /*!< AS OR PS. */ - kELCDIF_RopMergeNotAs = 0x4, /*!< nAS OR PS. */ - kELCDIF_RopMergeAsNot = 0x5, /*!< AS OR nPS. */ - kELCDIF_RopNotCopyAs = 0x6, /*!< nAS. */ - kELCDIF_RopNot = 0x7, /*!< nPS. */ - kELCDIF_RopNotMaskAs = 0x8, /*!< AS NAND PS. */ - kELCDIF_RopNotMergeAs = 0x9, /*!< AS NOR PS. */ - kELCDIF_RopXorAs = 0xA, /*!< AS XOR PS. */ - kELCDIF_RopNotXorAs = 0xB /*!< AS XNOR PS. */ -} elcdif_rop_mode_t; - -/*! - * @brief eLCDIF alpha surface blending configuration. - */ -typedef struct _elcdif_as_blend_config -{ - uint8_t alpha; /*!< User defined alpha value, only used when @ref alphaMode is @ref kELCDIF_AlphaOverride or @ref - kELCDIF_AlphaRop. */ - bool invertAlpha; /*!< Set true to invert the alpha. */ - elcdif_alpha_mode_t alphaMode; /*!< Alpha mode. */ - elcdif_rop_mode_t ropMode; /*!< ROP mode, only valid when @ref alphaMode is @ref kELCDIF_AlphaRop. */ -} elcdif_as_blend_config_t; - -/*! - * @brief eLCDIF LUT - * - * The Lookup Table (LUT) is used to expand the 8 bits pixel to 24 bits pixel - * before output to external displayer. - * - * There are two 256x24 bits LUT memory in LCDIF, the LSB of frame buffer address - * determins which memory to use. - */ -typedef enum _elcdif_lut -{ - kELCDIF_Lut0 = 0, /*!< LUT 0. */ - kELCDIF_Lut1, /*!< LUT 1. */ -} elcdif_lut_t; - -/******************************************************************************* - * APIs - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name eLCDIF initialization and de-initialization - * @{ - */ - -/*! - * @brief Initializes the eLCDIF to work in RGB mode (DOTCLK mode). - * - * This function ungates the eLCDIF clock and configures the eLCDIF peripheral according - * to the configuration structure. - * - * @param base eLCDIF peripheral base address. - * @param config Pointer to the configuration structure. - */ -void ELCDIF_RgbModeInit(LCDIF_Type *base, const elcdif_rgb_mode_config_t *config); - -/*! - * @brief Gets the eLCDIF default configuration structure for RGB (DOTCLK) mode. - * - * This function sets the configuration structure to default values. - * The default configuration is set to the following values. - * @code - config->panelWidth = 480U; - config->panelHeight = 272U; - config->hsw = 41; - config->hfp = 4; - config->hbp = 8; - config->vsw = 10; - config->vfp = 4; - config->vbp = 2; - config->polarityFlags = kELCDIF_VsyncActiveLow | - kELCDIF_HsyncActiveLow | - kELCDIF_DataEnableActiveLow | - kELCDIF_DriveDataOnFallingClkEdge; - config->bufferAddr = 0U; - config->pixelFormat = kELCDIF_PixelFormatRGB888; - config->dataBus = kELCDIF_DataBus24Bit; - @endcode - * - * @param config Pointer to the eLCDIF configuration structure. - */ -void ELCDIF_RgbModeGetDefaultConfig(elcdif_rgb_mode_config_t *config); - -/*! - * @brief Deinitializes the eLCDIF peripheral. - * - * @param base eLCDIF peripheral base address. - */ -void ELCDIF_Deinit(LCDIF_Type *base); - -/* @} */ - -/*! - * @name Module operation - * @{ - */ - -/*! - * @brief Set the pixel format in RGB (DOTCLK) mode. - * - * @param base eLCDIF peripheral base address. - * @param pixelFormat The pixel format. - */ -void ELCDIF_RgbModeSetPixelFormat(LCDIF_Type *base, elcdif_pixel_format_t pixelFormat); - -/*! - * @brief Start to display in RGB (DOTCLK) mode. - * - * @param base eLCDIF peripheral base address. - */ -static inline void ELCDIF_RgbModeStart(LCDIF_Type *base) -{ - base->CTRL_SET = LCDIF_CTRL_RUN_MASK | LCDIF_CTRL_DOTCLK_MODE_MASK; -} - -/*! - * @brief Stop display in RGB (DOTCLK) mode and wait until finished. - * - * @param base eLCDIF peripheral base address. - */ -void ELCDIF_RgbModeStop(LCDIF_Type *base); - -/*! - * @brief Set the next frame buffer address to display. - * - * @param base eLCDIF peripheral base address. - * @param bufferAddr The frame buffer address to set. - */ -static inline void ELCDIF_SetNextBufferAddr(LCDIF_Type *base, uint32_t bufferAddr) -{ - base->NEXT_BUF = ELCDIF_ADDR_CPU_2_IP(bufferAddr); -} - -/*! - * @brief Reset the eLCDIF peripheral. - * - * @param base eLCDIF peripheral base address. - */ -void ELCDIF_Reset(LCDIF_Type *base); - -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_RESET_PIN) && FSL_FEATURE_LCDIF_HAS_NO_RESET_PIN) -/*! - * @brief Pull up or down the reset pin for the externel LCD controller. - * - * @param base eLCDIF peripheral base address. - * @param pullUp True to pull up reset pin, false to pull down. - */ -static inline void ELCDIF_PullUpResetPin(LCDIF_Type *base, bool pullUp) -{ - if (pullUp) - { - base->CTRL1_SET = LCDIF_CTRL1_RESET_MASK; - } - else - { - base->CTRL1_CLR = LCDIF_CTRL1_RESET_MASK; - } -} -#endif - -#if defined(FSL_FEATURE_LCDIF_HAS_PXP_HANDSHAKE) && FSL_FEATURE_LCDIF_HAS_PXP_HANDSHAKE -/*! - * @brief Enable or disable the hand shake with PXP. - * - * @param base eLCDIF peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void ELCDIF_EnablePxpHandShake(LCDIF_Type *base, bool enable) -{ - if (enable) - { - base->CTRL_SET = LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK; - } - else - { - base->CTRL_CLR = LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK; - } -} -#endif - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Get the CRC value of the frame sent out. - * - * When a frame is sent complete (the interrupt @ref kELCDIF_CurFrameDone assert), this function - * can be used to get the CRC value of the frame sent. - * - * @param base eLCDIF peripheral base address. - * @return The CRC value. - * - * @note The CRC value is dependent on the LCD_DATABUS_WIDTH. - */ -static inline uint32_t ELCDIF_GetCrcValue(LCDIF_Type *base) -{ - return base->CRC_STAT; -} - -/*! - * @brief Get the bus master error virtual address. - * - * When bus master error occurs (the interrupt kELCDIF_BusMasterError assert), this function - * can get the virtual address at which the AXI master received an error - * response from the slave. - * - * @param base eLCDIF peripheral base address. - * @return The error virtual address. - */ -static inline uint32_t ELCDIF_GetBusMasterErrorAddr(LCDIF_Type *base) -{ - return base->BM_ERROR_STAT; -} - -/*! - * @brief Get the eLCDIF status. - * - * The status flags are returned as a mask value, application could check the - * corresponding bit. Example: - * - * @code - uint32_t statusFlags; - statusFlags = ELCDIF_GetStatus(LCDIF); - - if (kELCDIF_LFifoFull & statusFlags) - { - } - - if (kELCDIF_TxFifoEmpty & statusFlags) - { - } - @endcode - * - * @param base eLCDIF peripheral base address. - * @return The mask value of status flags, it is OR'ed value of @ref _elcdif_status_flags. - */ -static inline uint32_t ELCDIF_GetStatus(LCDIF_Type *base) -{ - return base->STAT & (LCDIF_STAT_LFIFO_FULL_MASK | LCDIF_STAT_LFIFO_EMPTY_MASK | LCDIF_STAT_TXFIFO_FULL_MASK | - LCDIF_STAT_TXFIFO_EMPTY_MASK -#if defined(LCDIF_STAT_BUSY_MASK) - | LCDIF_STAT_BUSY_MASK -#endif -#if defined(LCDIF_STAT_DVI_CURRENT_FIELD_MASK) - | LCDIF_STAT_DVI_CURRENT_FIELD_MASK -#endif - ); -} - -/*! - * @brief Get current count in Latency buffer (LFIFO). - * - * @param base eLCDIF peripheral base address. - * @return The LFIFO current count - */ -static inline uint32_t ELCDIF_GetLFifoCount(LCDIF_Type *base) -{ - return (base->STAT & LCDIF_STAT_LFIFO_COUNT_MASK) >> LCDIF_STAT_LFIFO_COUNT_SHIFT; -} - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables eLCDIF interrupt requests. - * - * @param base eLCDIF peripheral base address. - * @param mask interrupt source, OR'ed value of _elcdif_interrupt_enable. - */ -static inline void ELCDIF_EnableInterrupts(LCDIF_Type *base, uint32_t mask) -{ - base->CTRL1_SET = (mask & ELCDIF_CTRL1_IRQ_EN_MASK); -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) - base->AS_CTRL |= (mask & ELCDIF_AS_CTRL_IRQ_EN_MASK); -#endif -} - -/*! - * @brief Disables eLCDIF interrupt requests. - * - * @param base eLCDIF peripheral base address. - * @param mask interrupt source, OR'ed value of _elcdif_interrupt_enable. - */ -static inline void ELCDIF_DisableInterrupts(LCDIF_Type *base, uint32_t mask) -{ - base->CTRL1_CLR = (mask & ELCDIF_CTRL1_IRQ_EN_MASK); -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) - base->AS_CTRL &= ~(mask & ELCDIF_AS_CTRL_IRQ_EN_MASK); -#endif -} - -/*! - * @brief Get eLCDIF interrupt peding status. - * - * @param base eLCDIF peripheral base address. - * @return Interrupt pending status, OR'ed value of _elcdif_interrupt_flags. - */ -static inline uint32_t ELCDIF_GetInterruptStatus(LCDIF_Type *base) -{ - uint32_t flags; - - flags = (base->CTRL1 & ELCDIF_CTRL1_IRQ_MASK); -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) - flags |= (base->AS_CTRL & ELCDIF_AS_CTRL_IRQ_MASK); -#endif - - return flags; -} - -/*! - * @brief Clear eLCDIF interrupt peding status. - * - * @param base eLCDIF peripheral base address. - * @param mask of the flags to clear, OR'ed value of _elcdif_interrupt_flags. - */ -static inline void ELCDIF_ClearInterruptStatus(LCDIF_Type *base, uint32_t mask) -{ - base->CTRL1_CLR = (mask & ELCDIF_CTRL1_IRQ_MASK); -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) - base->AS_CTRL &= ~(mask & ELCDIF_AS_CTRL_IRQ_MASK); -#endif -} - -/* @} */ - -#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS) -/*! - * @name Alpha surface - * @{ - */ - -/*! - * @brief Set the configuration for alpha surface buffer. - * - * @param base eLCDIF peripheral base address. - * @param config Pointer to the configuration structure. - */ -void ELCDIF_SetAlphaSurfaceBufferConfig(LCDIF_Type *base, const elcdif_as_buffer_config_t *config); - -/*! - * @brief Set the alpha surface blending configuration. - * - * @param base eLCDIF peripheral base address. - * @param config Pointer to the configuration structure. - */ -void ELCDIF_SetAlphaSurfaceBlendConfig(LCDIF_Type *base, const elcdif_as_blend_config_t *config); - -/*! - * @brief Set the next alpha surface buffer address. - * - * @param base eLCDIF peripheral base address. - * @param bufferAddr Alpha surface buffer address. - */ -static inline void ELCDIF_SetNextAlphaSurfaceBufferAddr(LCDIF_Type *base, uint32_t bufferAddr) -{ - base->AS_NEXT_BUF = ELCDIF_ADDR_CPU_2_IP(bufferAddr); -} - -/*! - * @brief Set the overlay color key. - * - * If a pixel in the current overlay image with a color that falls in the range - * from the @p colorKeyLow to @p colorKeyHigh range, it will use the process surface - * pixel value for that location. - * - * @param base eLCDIF peripheral base address. - * @param colorKeyLow Color key low range. - * @param colorKeyHigh Color key high range. - * - * @note Colorkey operations are higher priority than alpha or ROP operations - */ -static inline void ELCDIF_SetOverlayColorKey(LCDIF_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh) -{ - base->AS_CLRKEYLOW = colorKeyLow; - base->AS_CLRKEYHIGH = colorKeyHigh; -} - -/*! - * @brief Enable or disable the color key. - * - * @param base eLCDIF peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void ELCDIF_EnableOverlayColorKey(LCDIF_Type *base, bool enable) -{ - if (enable) - { - base->AS_CTRL |= LCDIF_AS_CTRL_ENABLE_COLORKEY_MASK; - } - else - { - base->AS_CTRL &= ~LCDIF_AS_CTRL_ENABLE_COLORKEY_MASK; - } -} - -/*! - * @brief Enable or disable the alpha surface. - * - * @param base eLCDIF peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void ELCDIF_EnableAlphaSurface(LCDIF_Type *base, bool enable) -{ - if (enable) - { - base->AS_CTRL |= LCDIF_AS_CTRL_AS_ENABLE_MASK; - } - else - { - base->AS_CTRL &= ~LCDIF_AS_CTRL_AS_ENABLE_MASK; - } -} - -/*! - * @brief Enable or disable the process surface. - * - * Process surface is the normal frame buffer. The process surface content - * is controlled by ::ELCDIF_SetNextBufferAddr. - * - * @param base eLCDIF peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void ELCDIF_EnableProcessSurface(LCDIF_Type *base, bool enable) -{ - if (enable) - { - base->AS_CTRL &= ~LCDIF_AS_CTRL_PS_DISABLE_MASK; - } - else - { - base->AS_CTRL |= LCDIF_AS_CTRL_PS_DISABLE_MASK; - } -} - -/* @} */ -#endif /* FSL_FEATURE_LCDIF_HAS_NO_AS */ - -#if (defined(FSL_FEATURE_LCDIF_HAS_LUT) && FSL_FEATURE_LCDIF_HAS_LUT) -/*! - * @name LUT - * - * The Lookup Table (LUT) is used to expand the 8 bits pixel to 24 bits pixel - * before output to external displayer. - * - * There are two 256x24 bits LUT memory in LCDIF, the LSB of frame buffer address - * determins which memory to use. - * - * @{ - */ - -/*! - * @brief Enable or disable the LUT. - * - * @param base eLCDIF peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void ELCDIF_EnableLut(LCDIF_Type *base, bool enable) -{ - if (enable) - { - base->LUT_CTRL &= ~LCDIF_LUT_CTRL_LUT_BYPASS_MASK; - } - else - { - base->LUT_CTRL |= LCDIF_LUT_CTRL_LUT_BYPASS_MASK; - } -} - -/*! - * @brief Load the LUT value. - * - * This function loads the LUT value to the specific LUT memory, user can - * specify the start entry index. - * - * @param base eLCDIF peripheral base address. - * @param lut Which LUT to load. - * @param startIndex The start index of the LUT entry to update. - * @param lutData The LUT data to load. - * @param count Count of @p lutData. - * @retval kStatus_Success Initialization success. - * @retval kStatus_InvalidArgument Wrong argument. - */ -status_t ELCDIF_UpdateLut( - LCDIF_Type *base, elcdif_lut_t lut, uint16_t startIndex, const uint32_t *lutData, uint16_t count); - -/* @} */ -#endif /* FSL_FEATURE_LCDIF_HAS_LUT */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/* @} */ - -#endif /*_FSL_ELCDIF_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_enc.c b/devices/MIMXRT1052/drivers/fsl_enc.c deleted file mode 100644 index 8117df1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_enc.c +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_enc.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.enc" -#endif - -#define ENC_CTRL_W1C_FLAGS (ENC_CTRL_HIRQ_MASK | ENC_CTRL_XIRQ_MASK | ENC_CTRL_DIRQ_MASK | ENC_CTRL_CMPIRQ_MASK) -#define ENC_CTRL2_W1C_FLAGS (ENC_CTRL2_SABIRQ_MASK | ENC_CTRL2_ROIRQ_MASK | ENC_CTRL2_RUIRQ_MASK) - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for ENC module. - * - * @param base ENC peripheral base address - */ -static uint32_t ENC_GetInstance(ENC_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to ENC bases for each instance. */ -static ENC_Type *const s_encBases[] = ENC_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to ENC clocks for each instance. */ -static const clock_ip_name_t s_encClocks[] = ENC_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t ENC_GetInstance(ENC_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_encBases); instance++) - { - if (s_encBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_encBases)); - - return instance; -} - -/*! - * brief Initialization for the ENC module. - * - * This function is to make the initialization for the ENC module. It should be called firstly before any operation to - * the ENC with the operations like: - * - Enable the clock for ENC module. - * - Configure the ENC's working attributes. - * - * param base ENC peripheral base address. - * param config Pointer to configuration structure. See to "enc_config_t". - */ -void ENC_Init(ENC_Type *base, const enc_config_t *config) -{ - assert(NULL != config); - - uint16_t tmp16; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock. */ - CLOCK_EnableClock(s_encClocks[ENC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* ENC_CTRL. */ - tmp16 = base->CTRL & (uint16_t)(~(ENC_CTRL_W1C_FLAGS | ENC_CTRL_HIP_MASK | ENC_CTRL_HNE_MASK | ENC_CTRL_REV_MASK | - ENC_CTRL_PH1_MASK | ENC_CTRL_XIP_MASK | ENC_CTRL_XNE_MASK | ENC_CTRL_WDE_MASK)); - /* For HOME trigger. */ - if (kENC_HOMETriggerDisabled != config->HOMETriggerMode) - { - tmp16 |= ENC_CTRL_HIP_MASK; - if (kENC_HOMETriggerOnFallingEdge == config->HOMETriggerMode) - { - tmp16 |= ENC_CTRL_HNE_MASK; - } - } - /* For encoder work mode. */ - if (config->enableReverseDirection) - { - tmp16 |= ENC_CTRL_REV_MASK; - } - if (kENC_DecoderWorkAsSignalPhaseCountMode == config->decoderWorkMode) - { - tmp16 |= ENC_CTRL_PH1_MASK; - } - /* For INDEX trigger. */ - if (kENC_INDEXTriggerDisabled != config->INDEXTriggerMode) - { - tmp16 |= ENC_CTRL_XIP_MASK; - if (kENC_INDEXTriggerOnFallingEdge == config->INDEXTriggerMode) - { - tmp16 |= ENC_CTRL_XNE_MASK; - } - } - /* Watchdog. */ - if (config->enableWatchdog) - { - tmp16 |= ENC_CTRL_WDE_MASK; - base->WTR = config->watchdogTimeoutValue; /* WDOG can be only available when the feature is enabled. */ - } - base->CTRL = tmp16; - - /* ENC_FILT. */ - base->FILT = ENC_FILT_FILT_CNT(config->filterCount) | ENC_FILT_FILT_PER(config->filterSamplePeriod); - - /* ENC_CTRL2. */ - tmp16 = base->CTRL2 & (uint16_t)(~(ENC_CTRL2_W1C_FLAGS | ENC_CTRL2_OUTCTL_MASK | ENC_CTRL2_REVMOD_MASK | - ENC_CTRL2_MOD_MASK | ENC_CTRL2_UPDPOS_MASK | ENC_CTRL2_UPDHLD_MASK)); - if (kENC_POSMATCHOnReadingAnyPositionCounter == config->positionMatchMode) - { - tmp16 |= ENC_CTRL2_OUTCTL_MASK; - } - if (kENC_RevolutionCountOnRollOverModulus == config->revolutionCountCondition) - { - tmp16 |= ENC_CTRL2_REVMOD_MASK; - } - if (config->enableModuloCountMode) - { - tmp16 |= ENC_CTRL2_MOD_MASK; - /* Set modulus value. */ - base->UMOD = (uint16_t)(config->positionModulusValue >> 16U); /* Upper 16 bits. */ - base->LMOD = (uint16_t)(config->positionModulusValue); /* Lower 16 bits. */ - } - if (config->enableTRIGGERClearPositionCounter) - { - tmp16 |= ENC_CTRL2_UPDPOS_MASK; - } - if (config->enableTRIGGERClearHoldPositionCounter) - { - tmp16 |= ENC_CTRL2_UPDHLD_MASK; - } - base->CTRL2 = tmp16; - - /* ENC_UCOMP & ENC_LCOMP. */ - base->UCOMP = (uint16_t)(config->positionCompareValue >> 16U); /* Upper 16 bits. */ - base->LCOMP = (uint16_t)(config->positionCompareValue); /* Lower 16 bits. */ - - /* ENC_UINIT & ENC_LINIT. */ - base->UINIT = (uint16_t)(config->positionInitialValue >> 16U); /* Upper 16 bits. */ - base->LINIT = (uint16_t)(config->positionInitialValue); /* Lower 16 bits. */ -} - -/*! - * brief De-initialization for the ENC module. - * - * This function is to make the de-initialization for the ENC module. It could be called when ENC is no longer used with - * the operations like: - * - Disable the clock for ENC module. - * - * param base ENC peripheral base address. - */ -void ENC_Deinit(ENC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the clock. */ - CLOCK_DisableClock(s_encClocks[ENC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Get an available pre-defined settings for ENC's configuration. - * - * This function initializes the ENC configuration structure with an available settings, the default value are: - * code - * config->enableReverseDirection = false; - * config->decoderWorkMode = kENC_DecoderWorkAsNormalMode; - * config->HOMETriggerMode = kENC_HOMETriggerDisabled; - * config->INDEXTriggerMode = kENC_INDEXTriggerDisabled; - * config->enableTRIGGERClearPositionCounter = false; - * config->enableTRIGGERClearHoldPositionCounter = false; - * config->enableWatchdog = false; - * config->watchdogTimeoutValue = 0U; - * config->filterCount = 0U; - * config->filterSamplePeriod = 0U; - * config->positionMatchMode = kENC_POSMATCHOnPositionCounterEqualToComapreValue; - * config->positionCompareValue = 0xFFFFFFFFU; - * config->revolutionCountCondition = kENC_RevolutionCountOnINDEXPulse; - * config->enableModuloCountMode = false; - * config->positionModulusValue = 0U; - * config->positionInitialValue = 0U; - * endcode - * param config Pointer to a variable of configuration structure. See to "enc_config_t". - */ -void ENC_GetDefaultConfig(enc_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableReverseDirection = false; - config->decoderWorkMode = kENC_DecoderWorkAsNormalMode; - config->HOMETriggerMode = kENC_HOMETriggerDisabled; - config->INDEXTriggerMode = kENC_INDEXTriggerDisabled; - config->enableTRIGGERClearPositionCounter = false; - config->enableTRIGGERClearHoldPositionCounter = false; - config->enableWatchdog = false; - config->watchdogTimeoutValue = 0U; - config->filterCount = 0U; - config->filterSamplePeriod = 0U; - config->positionMatchMode = kENC_POSMATCHOnPositionCounterEqualToComapreValue; - config->positionCompareValue = 0xFFFFFFFFU; - config->revolutionCountCondition = kENC_RevolutionCountOnINDEXPulse; - config->enableModuloCountMode = false; - config->positionModulusValue = 0U; - config->positionInitialValue = 0U; -} - -/*! - * brief Load the initial position value to position counter. - * - * This function is to transfer the initial position value (UINIT and LINIT) contents to position counter (UPOS and - * LPOS), so that to provide the consistent operation the position counter registers. - * - * param base ENC peripheral base address. - */ -void ENC_DoSoftwareLoadInitialPositionValue(ENC_Type *base) -{ - uint16_t tmp16 = base->CTRL & (uint16_t)(~ENC_CTRL_W1C_FLAGS); - - tmp16 |= ENC_CTRL_SWIP_MASK; /* Write 1 to trigger the command for loading initial position value. */ - base->CTRL = tmp16; -} - -/*! - * brief Enable and configure the self test function. - * - * This function is to enable and configuration the self test function. It controls and sets the frequency of a - * quadrature signal generator. It provides a quadrature test signal to the inputs of the quadrature decoder module. - * It is a factory test feature; however, it may be useful to customers' software development and testing. - * - * param base ENC peripheral base address. - * param config Pointer to configuration structure. See to "enc_self_test_config_t". Pass "NULL" to disable. - */ -void ENC_SetSelfTestConfig(ENC_Type *base, const enc_self_test_config_t *config) -{ - uint16_t tmp16 = 0U; - - if (NULL == config) /* Pass "NULL" to disable the feature. */ - { - tmp16 = 0U; - } - else - { - tmp16 = ENC_TST_TEN_MASK | ENC_TST_TCE_MASK | ENC_TST_TEST_PERIOD(config->signalPeriod) | - ENC_TST_TEST_COUNT(config->signalCount); - if (kENC_SelfTestDirectionNegative == config->signalDirection) - { - tmp16 |= ENC_TST_QDN_MASK; - } - } - - base->TST = tmp16; -} - -/*! - * brief Enable watchdog for ENC module. - * - * param base ENC peripheral base address - * param enable Enables or disables the watchdog - */ -void ENC_EnableWatchdog(ENC_Type *base, bool enable) -{ - uint16_t tmp16 = base->CTRL & (uint16_t)(~(ENC_CTRL_W1C_FLAGS | ENC_CTRL_WDE_MASK)); - - if (enable) - { - tmp16 |= ENC_CTRL_WDE_MASK; - } - base->CTRL = tmp16; -} - -/*! - * brief Get the status flags. - * - * param base ENC peripheral base address. - * - * return Mask value of status flags. For available mask, see to "_enc_status_flags". - */ -uint32_t ENC_GetStatusFlags(ENC_Type *base) -{ - uint32_t ret32 = 0U; - - /* ENC_CTRL. */ - if (0U != (ENC_CTRL_HIRQ_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_HOMETransitionFlag; - } - if (0U != (ENC_CTRL_XIRQ_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_INDEXPulseFlag; - } - if (0U != (ENC_CTRL_DIRQ_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_WatchdogTimeoutFlag; - } - if (0U != (ENC_CTRL_CMPIRQ_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_PositionCompareFlag; - } - - /* ENC_CTRL2. */ - if (0U != (ENC_CTRL2_SABIRQ_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_SimultBothPhaseChangeFlag; - } - if (0U != (ENC_CTRL2_ROIRQ_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_PositionRollOverFlag; - } - if (0U != (ENC_CTRL2_RUIRQ_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_PositionRollUnderFlag; - } - if (0U != (ENC_CTRL2_DIR_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_LastCountDirectionFlag; - } - - return ret32; -} - -/*! - * brief Clear the status flags. - * - * param base ENC peripheral base address. - * param mask Mask value of status flags to be cleared. For available mask, see to "_enc_status_flags". - */ -void ENC_ClearStatusFlags(ENC_Type *base, uint32_t mask) -{ - uint32_t tmp16 = 0U; - - /* ENC_CTRL. */ - if (0U != ((uint32_t)kENC_HOMETransitionFlag & mask)) - { - tmp16 |= ENC_CTRL_HIRQ_MASK; - } - if (0U != ((uint32_t)kENC_INDEXPulseFlag & mask)) - { - tmp16 |= ENC_CTRL_XIRQ_MASK; - } - if (0U != ((uint32_t)kENC_WatchdogTimeoutFlag & mask)) - { - tmp16 |= ENC_CTRL_DIRQ_MASK; - } - if (0U != ((uint32_t)kENC_PositionCompareFlag & mask)) - { - tmp16 |= ENC_CTRL_CMPIRQ_MASK; - } - if (0U != tmp16) - { - base->CTRL = (uint16_t)(((uint32_t)base->CTRL & (~ENC_CTRL_W1C_FLAGS)) | tmp16); - } - - /* ENC_CTRL2. */ - tmp16 = 0U; - if (0U != ((uint32_t)kENC_SimultBothPhaseChangeFlag & mask)) - { - tmp16 |= ENC_CTRL2_SABIRQ_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollOverFlag & mask)) - { - tmp16 |= ENC_CTRL2_ROIRQ_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollUnderFlag & mask)) - { - tmp16 |= ENC_CTRL2_RUIRQ_MASK; - } - if (0U != tmp16) - { - base->CTRL2 = (uint16_t)(((uint32_t)base->CTRL2 & (~ENC_CTRL2_W1C_FLAGS)) | tmp16); - } -} - -/*! - * brief Enable the interrupts. - * - * param base ENC peripheral base address. - * param mask Mask value of interrupts to be enabled. For available mask, see to "_enc_interrupt_enable". - */ -void ENC_EnableInterrupts(ENC_Type *base, uint32_t mask) -{ - uint32_t tmp16 = 0U; - - /* ENC_CTRL. */ - if (0U != ((uint32_t)kENC_HOMETransitionInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_HIE_MASK; - } - if (0U != ((uint32_t)kENC_INDEXPulseInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_XIE_MASK; - } - if (0U != ((uint32_t)kENC_WatchdogTimeoutInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_DIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionCompareInerruptEnable & mask)) - { - tmp16 |= ENC_CTRL_CMPIE_MASK; - } - if (tmp16 != 0U) - { - base->CTRL = (uint16_t)(((uint32_t)base->CTRL & (~ENC_CTRL_W1C_FLAGS)) | tmp16); - } - /* ENC_CTRL2. */ - tmp16 = 0U; - if (0U != ((uint32_t)kENC_SimultBothPhaseChangeInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_SABIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollOverInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_ROIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollUnderInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_RUIE_MASK; - } - if (tmp16 != 0U) - { - base->CTRL2 = (uint16_t)(((uint32_t)base->CTRL2 & (~ENC_CTRL2_W1C_FLAGS)) | tmp16); - } -} - -/*! - * brief Disable the interrupts. - * - * param base ENC peripheral base address. - * param mask Mask value of interrupts to be disabled. For available mask, see to "_enc_interrupt_enable". - */ -void ENC_DisableInterrupts(ENC_Type *base, uint32_t mask) -{ - uint16_t tmp16 = 0U; - - /* ENC_CTRL. */ - if (0U != ((uint32_t)kENC_HOMETransitionInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_HIE_MASK; - } - if (0U != ((uint32_t)kENC_INDEXPulseInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_XIE_MASK; - } - if (0U != ((uint32_t)kENC_WatchdogTimeoutInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL_DIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionCompareInerruptEnable & mask)) - { - tmp16 |= ENC_CTRL_CMPIE_MASK; - } - if (0U != tmp16) - { - base->CTRL = (uint16_t)(base->CTRL & (uint16_t)(~ENC_CTRL_W1C_FLAGS)) & (uint16_t)(~tmp16); - } - /* ENC_CTRL2. */ - tmp16 = 0U; - if (0U != ((uint32_t)kENC_SimultBothPhaseChangeInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_SABIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollOverInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_ROIE_MASK; - } - if (0U != ((uint32_t)kENC_PositionRollUnderInterruptEnable & mask)) - { - tmp16 |= ENC_CTRL2_RUIE_MASK; - } - if (tmp16 != 0U) - { - base->CTRL2 = (uint16_t)(base->CTRL2 & (uint16_t)(~ENC_CTRL2_W1C_FLAGS)) & (uint16_t)(~tmp16); - } -} - -/*! - * brief Get the enabled interrupts' flags. - * - * param base ENC peripheral base address. - * - * return Mask value of enabled interrupts. - */ -uint32_t ENC_GetEnabledInterrupts(ENC_Type *base) -{ - uint32_t ret32 = 0U; - - /* ENC_CTRL. */ - if (0U != (ENC_CTRL_HIE_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_HOMETransitionInterruptEnable; - } - if (0U != (ENC_CTRL_XIE_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_INDEXPulseInterruptEnable; - } - if (0U != (ENC_CTRL_DIE_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_WatchdogTimeoutInterruptEnable; - } - if (0U != (ENC_CTRL_CMPIE_MASK & base->CTRL)) - { - ret32 |= (uint32_t)kENC_PositionCompareInerruptEnable; - } - /* ENC_CTRL2. */ - if (0U != (ENC_CTRL2_SABIE_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_SimultBothPhaseChangeInterruptEnable; - } - if (0U != (ENC_CTRL2_ROIE_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_PositionRollOverInterruptEnable; - } - if (0U != (ENC_CTRL2_RUIE_MASK & base->CTRL2)) - { - ret32 |= (uint32_t)kENC_PositionRollUnderInterruptEnable; - } - return ret32; -} - -/*! - * brief Set initial position value for ENC module. - * - * param base ENC peripheral base address - * param value Positive initial value - */ -void ENC_SetInitialPositionValue(ENC_Type *base, uint32_t value) -{ - base->UINIT = (uint16_t)(value >> 16U); /* Set upper 16 bits. */ - base->LINIT = (uint16_t)(value); /* Set lower 16 bits. */ -} - -/*! - * brief Get the current position counter's value. - * - * param base ENC peripheral base address. - * - * return Current position counter's value. - */ -uint32_t ENC_GetPositionValue(ENC_Type *base) -{ - uint32_t ret32; - - ret32 = base->UPOS; /* Get upper 16 bits and make a snapshot. */ - ret32 <<= 16U; - ret32 |= base->LPOSH; /* Get lower 16 bits from hold register. */ - - return ret32; -} - -/*! - * brief Get the hold position counter's value. - * - * When any of the counter registers is read, the contents of each counter register is written to the corresponding hold - * register. Taking a snapshot of the counters' values provides a consistent view of a system position and a velocity to - * be attained. - * - * param base ENC peripheral base address. - * - * return Hold position counter's value. - */ -uint32_t ENC_GetHoldPositionValue(ENC_Type *base) -{ - uint32_t ret32; - - ret32 = base->UPOSH; /* Get upper 16 bits and make a snapshot. */ - ret32 <<= 16U; - ret32 |= base->LPOSH; /* Get lower 16 bits from hold register. */ - - return ret32; -} diff --git a/devices/MIMXRT1052/drivers/fsl_enc.h b/devices/MIMXRT1052/drivers/fsl_enc.h deleted file mode 100644 index 07c4930..0000000 --- a/devices/MIMXRT1052/drivers/fsl_enc.h +++ /dev/null @@ -1,458 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_ENC_H_ -#define _FSL_ENC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup enc - * @{ - */ -/******************************************************************************* - * Definitions - ******************************************************************************/ -#define FSL_ENC_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) - -/*! - * @brief Interrupt enable/disable mask. - */ -enum _enc_interrupt_enable -{ - kENC_HOMETransitionInterruptEnable = (1U << 0U), /*!< HOME interrupt enable. */ - kENC_INDEXPulseInterruptEnable = (1U << 1U), /*!< INDEX pulse interrupt enable. */ - kENC_WatchdogTimeoutInterruptEnable = (1U << 2U), /*!< Watchdog timeout interrupt enable. */ - kENC_PositionCompareInerruptEnable = (1U << 3U), /*!< Position compare interrupt enable. */ - kENC_SimultBothPhaseChangeInterruptEnable = - (1U << 4U), /*!< Simultaneous PHASEA and PHASEB change interrupt enable. */ - kENC_PositionRollOverInterruptEnable = (1U << 5U), /*!< Roll-over interrupt enable. */ - kENC_PositionRollUnderInterruptEnable = (1U << 6U), /*!< Roll-under interrupt enable. */ -}; - -/*! - * @brief Status flag mask. - * - * These flags indicate the counter's events. - */ -enum _enc_status_flags -{ - kENC_HOMETransitionFlag = (1U << 0U), /*!< HOME signal transition interrupt request. */ - kENC_INDEXPulseFlag = (1U << 1U), /*!< INDEX Pulse Interrupt Request. */ - kENC_WatchdogTimeoutFlag = (1U << 2U), /*!< Watchdog timeout interrupt request. */ - kENC_PositionCompareFlag = (1U << 3U), /*!< Position compare interrupt request. */ - kENC_SimultBothPhaseChangeFlag = (1U << 4U), /*!< Simultaneous PHASEA and PHASEB change interrupt request. */ - kENC_PositionRollOverFlag = (1U << 5U), /*!< Roll-over interrupt request. */ - kENC_PositionRollUnderFlag = (1U << 6U), /*!< Roll-under interrupt request. */ - kENC_LastCountDirectionFlag = (1U << 7U), /*!< Last count was in the up direction, or the down direction. */ -}; - -/*! - * @brief Signal status flag mask. - * - * These flags indicate the counter's signal. - */ -enum _enc_signal_status_flags -{ - kENC_RawHOMEStatusFlag = ENC_IMR_HOME_MASK, /*!< Raw HOME input. */ - kENC_RawINDEXStatusFlag = ENC_IMR_INDEX_MASK, /*!< Raw INDEX input. */ - kENC_RawPHBStatusFlag = ENC_IMR_PHB_MASK, /*!< Raw PHASEB input. */ - kENC_RawPHAEXStatusFlag = ENC_IMR_PHA_MASK, /*!< Raw PHASEA input. */ - kENC_FilteredHOMEStatusFlag = ENC_IMR_FHOM_MASK, /*!< The filtered version of HOME input. */ - kENC_FilteredINDEXStatusFlag = ENC_IMR_FIND_MASK, /*!< The filtered version of INDEX input. */ - kENC_FilteredPHBStatusFlag = ENC_IMR_FPHB_MASK, /*!< The filtered version of PHASEB input. */ - kENC_FilteredPHAStatusFlag = ENC_IMR_FPHA_MASK, /*!< The filtered version of PHASEA input. */ -}; - -/*! - * @brief Define HOME signal's trigger mode. - * - * The ENC would count the trigger from HOME signal line. - */ -typedef enum _enc_home_trigger_mode -{ - kENC_HOMETriggerDisabled = 0U, /*!< HOME signal's trigger is disabled. */ - kENC_HOMETriggerOnRisingEdge, /*!< Use positive going edge-to-trigger initialization of position counters. */ - kENC_HOMETriggerOnFallingEdge, /*!< Use negative going edge-to-trigger initialization of position counters. */ -} enc_home_trigger_mode_t; - -/*! - * @brief Define INDEX signal's trigger mode. - * - * The ENC would count the trigger from INDEX signal line. - */ -typedef enum _enc_index_trigger_mode -{ - kENC_INDEXTriggerDisabled = 0U, /*!< INDEX signal's trigger is disabled. */ - kENC_INDEXTriggerOnRisingEdge, /*!< Use positive going edge-to-trigger initialization of position counters. */ - kENC_INDEXTriggerOnFallingEdge, /*!< Use negative going edge-to-trigger initialization of position counters. */ -} enc_index_trigger_mode_t; - -/*! - * @brief Define type for decoder work mode. - * - * The normal work mode uses the standard quadrature decoder with PHASEA and PHASEB. When in signal phase count mode, - * a positive transition of the PHASEA input generates a count signal while the PHASEB input and the reverse direction - * control the counter direction. If the reverse direction is not enabled, PHASEB = 0 means counting up and PHASEB = 1 - * means counting down. Otherwise, the direction is reversed. - */ -typedef enum _enc_decoder_work_mode -{ - kENC_DecoderWorkAsNormalMode = 0U, /*!< Use standard quadrature decoder with PHASEA and PHASEB. */ - kENC_DecoderWorkAsSignalPhaseCountMode, /*!< PHASEA input generates a count signal while PHASEB input control the - direction. */ -} enc_decoder_work_mode_t; - -/*! - * @brief Define type for the condition of POSMATCH pulses. - */ -typedef enum _enc_position_match_mode -{ - kENC_POSMATCHOnPositionCounterEqualToComapreValue = 0U, /*!< POSMATCH pulses when a match occurs between the - position counters (POS) and the compare value (COMP). */ - kENC_POSMATCHOnReadingAnyPositionCounter, /*!< POSMATCH pulses when any position counter register is read. */ -} enc_position_match_mode_t; - -/*! - * @brief Define type for determining how the revolution counter (REV) is incremented/decremented. - */ -typedef enum _enc_revolution_count_condition -{ - kENC_RevolutionCountOnINDEXPulse = 0U, /*!< Use INDEX pulse to increment/decrement revolution counter. */ - kENC_RevolutionCountOnRollOverModulus, /*!< Use modulus counting roll-over/under to increment/decrement revolution - counter. */ -} enc_revolution_count_condition_t; - -/*! - * @brief Define type for direction of self test generated signal. - */ -typedef enum _enc_self_test_direction -{ - kENC_SelfTestDirectionPositive = 0U, /*!< Self test generates the signal in positive direction. */ - kENC_SelfTestDirectionNegative, /*!< Self test generates the signal in negative direction. */ -} enc_self_test_direction_t; - -/*! - * @brief Define user configuration structure for ENC module. - */ -typedef struct _enc_config -{ - /* Basic counter. */ - bool enableReverseDirection; /*!< Enable reverse direction counting. */ - enc_decoder_work_mode_t decoderWorkMode; /*!< Enable signal phase count mode. */ - - /* Signal detection. */ - enc_home_trigger_mode_t HOMETriggerMode; /*!< Enable HOME to initialize position counters. */ - enc_index_trigger_mode_t INDEXTriggerMode; /*!< Enable INDEX to initialize position counters. */ - bool enableTRIGGERClearPositionCounter; /*!< Clear POSD, REV, UPOS and LPOS on rising edge of TRIGGER, or not. */ - bool enableTRIGGERClearHoldPositionCounter; /*!< Enable update of hold registers on rising edge of TRIGGER, or not. - */ - - /* Watchdog. */ - bool enableWatchdog; /*!< Enable the watchdog to detect if the target is moving or not. */ - uint16_t watchdogTimeoutValue; /*!< Watchdog timeout count value. It stores the timeout count for the quadrature - decoder module watchdog timer. This field is only available when - "enableWatchdog" = true. The available value is a 16-bit unsigned number.*/ - - /* Filter for PHASEA, PHASEB, INDEX and HOME. */ - uint16_t filterCount; /*!< Input Filter Sample Count. This value should be chosen to reduce the probability of - noisy samples causing an incorrect transition to be recognized. The value represent the - number of consecutive samples that must agree prior to the input filter accepting an - input transition. A value of 0x0 represents 3 samples. A value of 0x7 represents 10 - samples. The Available range is 0 - 7.*/ - uint16_t filterSamplePeriod; /*!< Input Filter Sample Period. This value should be set such that the sampling period - is larger than the period of the expected noise. This value represents the - sampling period (in IPBus clock cycles) of the decoder input signals. - The available range is 0 - 255. */ - - /* Position compare. */ - enc_position_match_mode_t positionMatchMode; /*!< The condition of POSMATCH pulses. */ - uint32_t positionCompareValue; /*!< Position compare value. The available value is a 32-bit number.*/ - - /* Modulus counting. */ - enc_revolution_count_condition_t revolutionCountCondition; /*!< Revolution Counter Modulus Enable. */ - bool enableModuloCountMode; /*!< Enable Modulo Counting. */ - uint32_t positionModulusValue; /*!< Position modulus value. This value would be available only when - "enableModuloCountMode" = true. The available value is a 32-bit number. */ - uint32_t positionInitialValue; /*!< Position initial value. The available value is a 32-bit number. */ -} enc_config_t; - -/*! - * @brief Define configuration structure for self test module. - * - * The self test module provides a quadrature test signal to the inputs of the quadrature decoder module. - * This is a factory test feature. It is also useful to customers' software development and testing. - */ -typedef struct _enc_self_test_config -{ - enc_self_test_direction_t signalDirection; /*!< Direction of self test generated signal. */ - uint16_t signalCount; /*!< Hold the number of quadrature advances to generate. The available range is 0 - 255.*/ - uint16_t signalPeriod; /*!< Hold the period of quadrature phase in IPBus clock cycles. - The available range is 0 - 31. */ -} enc_self_test_config_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -/*! - * @name Initialization and De-initialization - * @{ - */ - -/*! - * @brief Initialization for the ENC module. - * - * This function is to make the initialization for the ENC module. It should be called firstly before any operation to - * the ENC with the operations like: - * - Enable the clock for ENC module. - * - Configure the ENC's working attributes. - * - * @param base ENC peripheral base address. - * @param config Pointer to configuration structure. See to "enc_config_t". - */ -void ENC_Init(ENC_Type *base, const enc_config_t *config); - -/*! - * @brief De-initialization for the ENC module. - * - * This function is to make the de-initialization for the ENC module. It could be called when ENC is no longer used with - * the operations like: - * - Disable the clock for ENC module. - * - * @param base ENC peripheral base address. - */ -void ENC_Deinit(ENC_Type *base); - -/*! - * @brief Get an available pre-defined settings for ENC's configuration. - * - * This function initializes the ENC configuration structure with an available settings, the default value are: - * @code - * config->enableReverseDirection = false; - * config->decoderWorkMode = kENC_DecoderWorkAsNormalMode; - * config->HOMETriggerMode = kENC_HOMETriggerDisabled; - * config->INDEXTriggerMode = kENC_INDEXTriggerDisabled; - * config->enableTRIGGERClearPositionCounter = false; - * config->enableTRIGGERClearHoldPositionCounter = false; - * config->enableWatchdog = false; - * config->watchdogTimeoutValue = 0U; - * config->filterCount = 0U; - * config->filterSamplePeriod = 0U; - * config->positionMatchMode = kENC_POSMATCHOnPositionCounterEqualToComapreValue; - * config->positionCompareValue = 0xFFFFFFFFU; - * config->revolutionCountCondition = kENC_RevolutionCountOnINDEXPulse; - * config->enableModuloCountMode = false; - * config->positionModulusValue = 0U; - * config->positionInitialValue = 0U; - * @endcode - * @param config Pointer to a variable of configuration structure. See to "enc_config_t". - */ -void ENC_GetDefaultConfig(enc_config_t *config); - -/*! - * @brief Load the initial position value to position counter. - * - * This function is to transfer the initial position value (UINIT and LINIT) contents to position counter (UPOS and - * LPOS), so that to provide the consistent operation the position counter registers. - * - * @param base ENC peripheral base address. - */ -void ENC_DoSoftwareLoadInitialPositionValue(ENC_Type *base); - -/*! - * @brief Enable and configure the self test function. - * - * This function is to enable and configuration the self test function. It controls and sets the frequency of a - * quadrature signal generator. It provides a quadrature test signal to the inputs of the quadrature decoder module. - * It is a factory test feature; however, it may be useful to customers' software development and testing. - * - * @param base ENC peripheral base address. - * @param config Pointer to configuration structure. See to "enc_self_test_config_t". Pass "NULL" to disable. - */ -void ENC_SetSelfTestConfig(ENC_Type *base, const enc_self_test_config_t *config); - -/*! - * @brief Enable watchdog for ENC module. - * - * @param base ENC peripheral base address - * @param enable Enables or disables the watchdog - */ -void ENC_EnableWatchdog(ENC_Type *base, bool enable); - -/*! - * @brief Set initial position value for ENC module. - * - * @param base ENC peripheral base address - * @param value Positive initial value - */ -void ENC_SetInitialPositionValue(ENC_Type *base, uint32_t value); - -/* @} */ - -/*! - * @name Status - * @{ - */ -/*! - * @brief Get the status flags. - * - * @param base ENC peripheral base address. - * - * @return Mask value of status flags. For available mask, see to "_enc_status_flags". - */ -uint32_t ENC_GetStatusFlags(ENC_Type *base); - -/*! - * @brief Clear the status flags. - * - * @param base ENC peripheral base address. - * @param mask Mask value of status flags to be cleared. For available mask, see to "_enc_status_flags". - */ -void ENC_ClearStatusFlags(ENC_Type *base, uint32_t mask); - -/*! - * @brief Get the signals' real-time status. - * - * @param base ENC peripheral base address. - * - * @return Mask value of signals' real-time status. For available mask, see to "_enc_signal_status_flags" - */ -static inline uint16_t ENC_GetSignalStatusFlags(ENC_Type *base) -{ - return base->IMR; -} -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enable the interrupts. - * - * @param base ENC peripheral base address. - * @param mask Mask value of interrupts to be enabled. For available mask, see to "_enc_interrupt_enable". - */ -void ENC_EnableInterrupts(ENC_Type *base, uint32_t mask); - -/*! - * @brief Disable the interrupts. - * - * @param base ENC peripheral base address. - * @param mask Mask value of interrupts to be disabled. For available mask, see to "_enc_interrupt_enable". - */ -void ENC_DisableInterrupts(ENC_Type *base, uint32_t mask); - -/*! - * @brief Get the enabled interrupts' flags. - * - * @param base ENC peripheral base address. - * - * @return Mask value of enabled interrupts. - */ -uint32_t ENC_GetEnabledInterrupts(ENC_Type *base); - -/* @} */ - -/*! - * @name Value Operation - * @{ - */ - -/*! - * @brief Get the current position counter's value. - * - * @param base ENC peripheral base address. - * - * @return Current position counter's value. - */ -uint32_t ENC_GetPositionValue(ENC_Type *base); - -/*! - * @brief Get the hold position counter's value. - * - * When any of the counter registers is read, the contents of each counter register is written to the corresponding hold - * register. Taking a snapshot of the counters' values provides a consistent view of a system position and a velocity to - * be attained. - * - * @param base ENC peripheral base address. - * - * @return Hold position counter's value. - */ -uint32_t ENC_GetHoldPositionValue(ENC_Type *base); - -/*! - * @brief Get the position difference counter's value. - * - * @param base ENC peripheral base address. - * - * @return The position difference counter's value. - */ -static inline uint16_t ENC_GetPositionDifferenceValue(ENC_Type *base) -{ - return base->POSD; -} - -/*! - * @brief Get the hold position difference counter's value. - * - * When any of the counter registers is read, the contents of each counter register is written to the corresponding hold - * register. Taking a snapshot of the counters' values provides a consistent view of a system position and a velocity to - * be attained. - * - * @param base ENC peripheral base address. - * - * @return Hold position difference counter's value. - */ -static inline uint16_t ENC_GetHoldPositionDifferenceValue(ENC_Type *base) -{ - return base->POSDH; -} - -/*! - * @brief Get the position revolution counter's value. - * - * @param base ENC peripheral base address. - * - * @return The position revolution counter's value. - */ -static inline uint16_t ENC_GetRevolutionValue(ENC_Type *base) -{ - return base->REV; -} -/*! - * @brief Get the hold position revolution counter's value. - * - * When any of the counter registers is read, the contents of each counter register is written to the corresponding hold - * register. Taking a snapshot of the counters' values provides a consistent view of a system position and a velocity to - * be attained. - * - * @param base ENC peripheral base address. - * - * @return Hold position revolution counter's value. - */ -static inline uint16_t ENC_GetHoldRevolutionValue(ENC_Type *base) -{ - return base->REVH; -} - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/* @} */ - -#endif /* _FSL_ENC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_enet.c b/devices/MIMXRT1052/drivers/fsl_enet.c deleted file mode 100644 index cd30cab..0000000 --- a/devices/MIMXRT1052/drivers/fsl_enet.c +++ /dev/null @@ -1,3934 +0,0 @@ -/* - * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_enet.h" -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL -#include "fsl_cache.h" -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.enet" -#endif - -/*! @brief Ethernet mac address length. */ -#define ENET_FRAME_MACLEN 6U -/*! @brief MDC frequency. */ -#define ENET_MDC_FREQUENCY 2500000U -/*! @brief NanoSecond in one second. */ -#define ENET_NANOSECOND_ONE_SECOND 1000000000U - -/*! @brief Define the ENET ring/class bumber . */ -enum -{ - kENET_Ring0 = 0U, /*!< ENET ring/class 0. */ -#if FSL_FEATURE_ENET_QUEUE > 1 - kENET_Ring1 = 1U, /*!< ENET ring/class 1. */ - kENET_Ring2 = 2U /*!< ENET ring/class 2. */ -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -}; - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Pointers to enet clocks for each instance. */ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -const clock_ip_name_t s_enetClock[] = ENET_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Pointers to enet transmit IRQ number for each instance. */ -static const IRQn_Type s_enetTxIrqId[] = ENET_Transmit_IRQS; -/*! @brief Pointers to enet receive IRQ number for each instance. */ -static const IRQn_Type s_enetRxIrqId[] = ENET_Receive_IRQS; -#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! @brief Pointers to enet timestamp IRQ number for each instance. */ -static const IRQn_Type s_enetTsIrqId[] = ENET_Ts_IRQS; -/*! @brief Pointers to enet 1588 timestamp IRQ number for each instance. */ -static const IRQn_Type s_enet1588TimerIrqId[] = ENET_1588_Timer_IRQS; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ -/*! @brief Pointers to enet error IRQ number for each instance. */ -static const IRQn_Type s_enetErrIrqId[] = ENET_Error_IRQS; - -/*! @brief Pointers to enet bases for each instance. */ -static ENET_Type *const s_enetBases[] = ENET_BASE_PTRS; - -/*! @brief Pointers to enet handles for each instance. */ -static enet_handle_t *s_ENETHandle[ARRAY_SIZE(s_enetBases)]; - -/* ENET ISR for transactional APIs. */ -#if FSL_FEATURE_ENET_QUEUE > 1 -static enet_isr_ring_t s_enetTxIsr[ARRAY_SIZE(s_enetBases)]; -static enet_isr_ring_t s_enetRxIsr[ARRAY_SIZE(s_enetBases)]; -#else -static enet_isr_t s_enetTxIsr[ARRAY_SIZE(s_enetBases)]; -static enet_isr_t s_enetRxIsr[ARRAY_SIZE(s_enetBases)]; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -static enet_isr_t s_enetErrIsr[ARRAY_SIZE(s_enetBases)]; -static enet_isr_t s_enetTsIsr[ARRAY_SIZE(s_enetBases)]; -static enet_isr_t s_enet1588TimerIsr[ARRAY_SIZE(s_enetBases)]; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Set ENET MAC controller with the configuration. - * - * @param base ENET peripheral base address. - * @param handle The ENET handle pointer. - * @param config ENET Mac configuration. - * @param bufferConfig ENET buffer configuration. - * @param macAddr ENET six-byte mac address. - * @param srcClock_Hz ENET module clock source, normally it's system clock. - */ -static void ENET_SetMacController(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz); - -/*! - * @brief Set ENET handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handle pointer. - * @param config ENET configuration stucture pointer. - * @param bufferConfig ENET buffer configuration. - */ -static void ENET_SetHandler(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint32_t srcClock_Hz); - -/*! - * @brief Set ENET MAC transmit buffer descriptors. - * - * @param handle The ENET handle pointer. - * @param config The ENET configuration structure. - * @param bufferConfig The ENET buffer configuration. - */ -static void ENET_SetTxBufferDescriptors(enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig); - -/*! - * @brief Set ENET MAC receive buffer descriptors. - * - * @param handle The ENET handle pointer. - * @param config The ENET configuration structure. - * @param bufferConfig The ENET buffer configuration. - */ -static void ENET_SetRxBufferDescriptors(enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig); - -/*! - * @brief Updates the ENET read buffer descriptors. - * - * @param base ENET peripheral base address. - * @param handle The ENET handle pointer. - * @param ringId The descriptor ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - */ -static void ENET_UpdateReadBuffers(ENET_Type *base, enet_handle_t *handle, uint8_t ringId); - -/*! - * @brief Updates index. - */ -static uint16_t ENET_IncreaseIndex(uint16_t index, uint16_t max); - -/*! - * @brief Allocates all Rx buffers in BDs. - */ -static status_t ENET_RxBufferAllocAll(ENET_Type *base, enet_handle_t *handle); - -/*! - * @brief Frees all Rx buffers in BDs. - */ -static void ENET_RxBufferFreeAll(ENET_Type *base, enet_handle_t *handle); - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * @brief Get the ENET instance from peripheral base address. - * - * @param base ENET peripheral base address. - * @return ENET instance. - */ -uint32_t ENET_GetInstance(ENET_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_enetBases); instance++) - { - if (s_enetBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_enetBases)); - - return instance; -} - -/*! - * brief Gets the ENET default configuration structure. - * - * The purpose of this API is to get the default ENET MAC controller - * configure structure for ENET_Init(). User may use the initialized - * structure unchanged in ENET_Init(), or modify some fields of the - * structure before calling ENET_Init(). - * Example: - code - enet_config_t config; - ENET_GetDefaultConfig(&config); - endcode - * param config The ENET mac controller configuration structure pointer. - */ -void ENET_GetDefaultConfig(enet_config_t *config) -{ - /* Checks input parameter. */ - assert(config != NULL); - - /* Initializes the MAC configure structure to zero. */ - (void)memset(config, 0, sizeof(enet_config_t)); - - /* Sets MII mode, full duplex, 100Mbps for MAC and PHY data interface. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - config->miiMode = kENET_RgmiiMode; -#else - config->miiMode = kENET_RmiiMode; -#endif - config->miiSpeed = kENET_MiiSpeed100M; - config->miiDuplex = kENET_MiiFullDuplex; - - config->ringNum = 1; - - /* Sets the maximum receive frame length. */ - config->rxMaxFrameLen = ENET_FRAME_MAX_FRAMELEN; -} - -/*! - * brief Initializes the ENET module. - * - * This function initializes the module with the ENET configuration. - * note ENET has two buffer descriptors legacy buffer descriptors and - * enhanced IEEE 1588 buffer descriptors. The legacy descriptor is used by default. To - * use the IEEE 1588 feature, use the enhanced IEEE 1588 buffer descriptor - * by defining "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" and calling ENET_Ptp1588Configure() - * to configure the 1588 feature and related buffers after calling ENET_Up(). - * - * param base ENET peripheral base address. - * param handle ENET handler pointer. - * param config ENET mac configuration structure pointer. - * The "enet_config_t" type mac configuration return from ENET_GetDefaultConfig - * can be used directly. It is also possible to verify the Mac configuration using other methods. - * param bufferConfig ENET buffer configuration structure pointer. - * The buffer configuration should be prepared for ENET Initialization. - * It is the start address of "ringNum" enet_buffer_config structures. - * To support added multi-ring features in some soc and compatible with the previous - * enet driver version. For single ring supported, this bufferConfig is a buffer - * configure structure pointer, for multi-ring supported and used case, this bufferConfig - * pointer should be a buffer configure structure array pointer. - * param macAddr ENET mac address of Ethernet device. This MAC address should be - * provided. - * param srcClock_Hz The internal module clock source for MII clock. - * retval kStatus_Success Succeed to initialize the ethernet driver. - * retval kStatus_ENET_InitMemoryFail Init fails since buffer memory is not enough. - */ -status_t ENET_Up(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz) -{ - /* Checks input parameters. */ - assert(handle != NULL); - assert(config != NULL); - assert(bufferConfig != NULL); - assert(macAddr != NULL); - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - assert(config->ringNum <= (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - status_t result = kStatus_Success; - - /* Initializes the ENET transmit buffer descriptors. */ - ENET_SetTxBufferDescriptors(handle, config, bufferConfig); - - /* Initializes the ENET receive buffer descriptors. */ - ENET_SetRxBufferDescriptors(handle, config, bufferConfig); - - /* Initializes the ENET MAC controller with basic function. */ - ENET_SetMacController(base, handle, config, bufferConfig, macAddr, srcClock_Hz); - - /* Set all buffers or data in handler for data transmit/receive process. */ - ENET_SetHandler(base, handle, config, bufferConfig, srcClock_Hz); - - /* Allocate buffers for all Rx BDs when zero copy Rx API is needed. */ - if (handle->rxBuffAlloc != NULL) - { - result = ENET_RxBufferAllocAll(base, handle); - } - - return result; -} - -/*! - * brief Initializes the ENET module. - * - * This function ungates the module clock and initializes it with the ENET configuration. - * note ENET has two buffer descriptors legacy buffer descriptors and - * enhanced IEEE 1588 buffer descriptors. The legacy descriptor is used by default. To - * use the IEEE 1588 feature, use the enhanced IEEE 1588 buffer descriptor - * by defining "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" and calling ENET_Ptp1588Configure() - * to configure the 1588 feature and related buffers after calling ENET_Init(). - * - * param base ENET peripheral base address. - * param handle ENET handler pointer. - * param config ENET mac configuration structure pointer. - * The "enet_config_t" type mac configuration return from ENET_GetDefaultConfig - * can be used directly. It is also possible to verify the Mac configuration using other methods. - * param bufferConfig ENET buffer configuration structure pointer. - * The buffer configuration should be prepared for ENET Initialization. - * It is the start address of "ringNum" enet_buffer_config structures. - * To support added multi-ring features in some soc and compatible with the previous - * enet driver version. For single ring supported, this bufferConfig is a buffer - * configure structure pointer, for multi-ring supported and used case, this bufferConfig - * pointer should be a buffer configure structure array pointer. - * param macAddr ENET mac address of Ethernet device. This MAC address should be - * provided. - * param srcClock_Hz The internal module clock source for MII clock. - * retval kStatus_Success Succeed to initialize the ethernet driver. - * retval kStatus_ENET_InitMemoryFail Init fails since buffer memory is not enough. - */ -status_t ENET_Init(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = ENET_GetInstance(base); - - /* Ungate ENET clock. */ - (void)CLOCK_EnableClock(s_enetClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - /* Reset ENET module. */ - ENET_Reset(base); - - return ENET_Up(base, handle, config, bufferConfig, macAddr, srcClock_Hz); -} - -/*! - * brief Stops the ENET module. - - * This function disables the ENET module. - * - * param base ENET peripheral base address. - */ -void ENET_Down(ENET_Type *base) -{ - uint32_t instance = ENET_GetInstance(base); - enet_handle_t *handle = s_ENETHandle[instance]; - - /* Disable interrupt. */ - base->EIMR = 0; - - /* Disable ENET. */ - base->ECR &= ~ENET_ECR_ETHEREN_MASK; - - if (handle->rxBuffFree != NULL) - { - ENET_RxBufferFreeAll(base, handle); - } -} - -/*! - * brief Deinitializes the ENET module. - - * This function gates the module clock, clears ENET interrupts, and disables the ENET module. - * - * param base ENET peripheral base address. - */ -void ENET_Deinit(ENET_Type *base) -{ - ENET_Down(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disables the clock source. */ - (void)CLOCK_DisableClock(s_enetClock[ENET_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * deprecated Do not use this function. It has been superceded by the config param in @ref ENET_Init. - */ -void ENET_SetCallback(enet_handle_t *handle, enet_callback_t callback, void *userData) -{ - assert(handle != NULL); - - /* Set callback and userData. */ - handle->callback = callback; - handle->userData = userData; -} - -#if FSL_FEATURE_ENET_QUEUE > 1 -void ENET_SetRxISRHandler(ENET_Type *base, enet_isr_ring_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetRxIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetRxIrqId[instance]); -} - -void ENET_SetTxISRHandler(ENET_Type *base, enet_isr_ring_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetTxIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetTxIrqId[instance]); -} -#else -void ENET_SetRxISRHandler(ENET_Type *base, enet_isr_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetRxIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetRxIrqId[instance]); -} - -void ENET_SetTxISRHandler(ENET_Type *base, enet_isr_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetTxIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetTxIrqId[instance]); -} -#endif - -void ENET_SetErrISRHandler(ENET_Type *base, enet_isr_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetErrIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetErrIrqId[instance]); -} - -#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -void ENET_SetTsISRHandler(ENET_Type *base, enet_isr_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enetTsIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enetTsIrqId[instance]); -} - -void ENET_Set1588TimerISRHandler(ENET_Type *base, enet_isr_t ISRHandler) -{ - uint32_t instance = ENET_GetInstance(base); - - s_enet1588TimerIsr[instance] = ISRHandler; - (void)EnableIRQ(s_enet1588TimerIrqId[instance]); -} -#endif - -static void ENET_SetHandler(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint32_t srcClock_Hz) -{ - uint8_t count; - uint32_t instance = ENET_GetInstance(base); - const enet_buffer_config_t *buffCfg = bufferConfig; - - /* Store transfer parameters in handle pointer. */ - (void)memset(handle, 0, sizeof(enet_handle_t)); - - for (count = 0; count < config->ringNum; count++) - { - assert(buffCfg->rxBuffSizeAlign * buffCfg->rxBdNumber > config->rxMaxFrameLen); - - handle->rxBdRing[count].rxBdBase = buffCfg->rxBdStartAddrAlign; - handle->rxBuffSizeAlign[count] = buffCfg->rxBuffSizeAlign; - handle->rxBdRing[count].rxRingLen = buffCfg->rxBdNumber; - handle->rxMaintainEnable[count] = buffCfg->rxMaintainEnable; - handle->txBdRing[count].txBdBase = buffCfg->txBdStartAddrAlign; - handle->txBuffSizeAlign[count] = buffCfg->txBuffSizeAlign; - handle->txBdRing[count].txRingLen = buffCfg->txBdNumber; - handle->txMaintainEnable[count] = buffCfg->txMaintainEnable; - handle->txDirtyRing[count].txDirtyBase = buffCfg->txFrameInfo; - handle->txDirtyRing[count].txRingLen = buffCfg->txBdNumber; - buffCfg++; - } - - handle->ringNum = config->ringNum; - handle->rxBuffAlloc = config->rxBuffAlloc; - handle->rxBuffFree = config->rxBuffFree; - handle->callback = config->callback; - handle->userData = config->userData; -#if defined(FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID) && FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID - handle->enetClock = srcClock_Hz; -#endif - - /* Save the handle pointer in the global variables. */ - s_ENETHandle[instance] = handle; - - /* Set the IRQ handler when the interrupt is enabled. */ - if (0U != (config->interrupt & (uint32_t)ENET_TX_INTERRUPT)) - { - ENET_SetTxISRHandler(base, ENET_TransmitIRQHandler); - } - if (0U != (config->interrupt & (uint32_t)ENET_RX_INTERRUPT)) - { - ENET_SetRxISRHandler(base, ENET_ReceiveIRQHandler); - } - if (0U != (config->interrupt & (uint32_t)ENET_ERR_INTERRUPT)) - { - ENET_SetErrISRHandler(base, ENET_ErrorIRQHandler); - } -} - -static void ENET_SetMacController(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz) -{ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(base) == 1) - { - /* Check the MII mode/speed/duplex setting. */ - if (config->miiSpeed == kENET_MiiSpeed1000M) - { - /* Only RGMII mode has the 1000M bit/s. The 1000M only support full duplex. */ - assert(config->miiMode == kENET_RgmiiMode); - assert(config->miiDuplex == kENET_MiiFullDuplex); - } - } -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - - uint32_t rcr = 0; - uint32_t tcr = 0; - uint32_t ecr = base->ECR; - uint32_t macSpecialConfig = config->macSpecialConfig; - uint32_t maxFrameLen = config->rxMaxFrameLen; - uint32_t configVal = 0; - - /* Maximum frame length check. */ - if (0U != (macSpecialConfig & (uint32_t)kENET_ControlVLANTagEnable)) - { - maxFrameLen = (ENET_FRAME_MAX_FRAMELEN + ENET_FRAME_VLAN_TAGLEN); -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(base) == 1) - { - if (0U != (macSpecialConfig & (uint32_t)kENET_ControlSVLANEnable)) - { - /* Double vlan tag (SVLAN) supported. */ - maxFrameLen += ENET_FRAME_VLAN_TAGLEN; - } - ecr |= (uint32_t)(((macSpecialConfig & (uint32_t)kENET_ControlSVLANEnable) != 0U) ? - (ENET_ECR_SVLANEN_MASK | ENET_ECR_SVLANDBL_MASK) : - 0U) | - (uint32_t)(((macSpecialConfig & (uint32_t)kENET_ControlVLANUseSecondTag) != 0U) ? - ENET_ECR_VLANUSE2ND_MASK : - 0U); - } -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - } - - /* Configures MAC receive controller with user configure structure. */ - rcr = ((0U != (macSpecialConfig & (uint32_t)kENET_ControlRxPayloadCheckEnable)) ? ENET_RCR_NLC_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlFlowControlEnable)) ? ENET_RCR_CFEN_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlFlowControlEnable)) ? ENET_RCR_FCE_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlRxPadRemoveEnable)) ? ENET_RCR_PADEN_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlRxBroadCastRejectEnable)) ? ENET_RCR_BC_REJ_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlPromiscuousEnable)) ? ENET_RCR_PROM_MASK : 0U) | - ENET_RCR_MAX_FL(maxFrameLen) | ENET_RCR_CRCFWD_MASK; - -/* Set the RGMII or RMII, MII mode and control register. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(base) == 1) - { - if (config->miiMode == kENET_RgmiiMode) - { - rcr |= ENET_RCR_RGMII_EN_MASK; - } - else - { - rcr &= ~ENET_RCR_RGMII_EN_MASK; - } - - if (config->miiSpeed == kENET_MiiSpeed1000M) - { - ecr |= ENET_ECR_SPEED_MASK; - } - else - { - ecr &= ~ENET_ECR_SPEED_MASK; - } - } -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - rcr |= ENET_RCR_MII_MODE_MASK; - if (config->miiMode == kENET_RmiiMode) - { - rcr |= ENET_RCR_RMII_MODE_MASK; - } - - /* Speed. */ - if (config->miiSpeed == kENET_MiiSpeed10M) - { - rcr |= ENET_RCR_RMII_10T_MASK; - } - - /* Receive setting for half duplex. */ - if (config->miiDuplex == kENET_MiiHalfDuplex) - { - rcr |= ENET_RCR_DRT_MASK; - } - /* Sets internal loop only for MII mode. */ - if ((0U != (config->macSpecialConfig & (uint32_t)kENET_ControlMIILoopEnable)) && - (config->miiMode != kENET_RmiiMode)) - { - rcr |= ENET_RCR_LOOP_MASK; - rcr &= ~ENET_RCR_DRT_MASK; - } - base->RCR = rcr; - - /* Configures MAC transmit controller: duplex mode, mac address insertion. */ - tcr = base->TCR & ~(ENET_TCR_FDEN_MASK | ENET_TCR_ADDINS_MASK); - tcr |= ((kENET_MiiHalfDuplex != config->miiDuplex) ? (uint32_t)ENET_TCR_FDEN_MASK : 0U) | - ((0U != (macSpecialConfig & (uint32_t)kENET_ControlMacAddrInsert)) ? (uint32_t)ENET_TCR_ADDINS_MASK : 0U); - base->TCR = tcr; - - /* Configures receive and transmit accelerator. */ - base->TACC = config->txAccelerConfig; - base->RACC = config->rxAccelerConfig; - - /* Sets the pause duration and FIFO threshold for the flow control enabled case. */ - if (0U != (macSpecialConfig & (uint32_t)kENET_ControlFlowControlEnable)) - { - uint32_t reemReg; - base->OPD = config->pauseDuration; - reemReg = ENET_RSEM_RX_SECTION_EMPTY(config->rxFifoEmptyThreshold); -#if defined(FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD) && FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD - reemReg |= ENET_RSEM_STAT_SECTION_EMPTY(config->rxFifoStatEmptyThreshold); -#endif /* FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD */ - base->RSEM = reemReg; - } - - /* FIFO threshold setting for store and forward enable/disable case. */ - if (0U != (macSpecialConfig & (uint32_t)kENET_ControlStoreAndFwdDisable)) - { - /* Transmit fifo watermark settings. */ - configVal = ((uint32_t)config->txFifoWatermark) & ENET_TFWR_TFWR_MASK; - base->TFWR = configVal; - /* Receive fifo full threshold settings. */ - configVal = ((uint32_t)config->rxFifoFullThreshold) & ENET_RSFL_RX_SECTION_FULL_MASK; - base->RSFL = configVal; - } - else - { - /* Transmit fifo watermark settings. */ - base->TFWR = ENET_TFWR_STRFWD_MASK; - base->RSFL = 0; - } - - /* Enable store and forward when accelerator is enabled */ - if (0U != - (config->txAccelerConfig & ((uint32_t)kENET_TxAccelIpCheckEnabled | (uint32_t)kENET_TxAccelProtoCheckEnabled))) - { - base->TFWR = ENET_TFWR_STRFWD_MASK; - } - if (0U != ((config->rxAccelerConfig & - ((uint32_t)kENET_RxAccelIpCheckEnabled | (uint32_t)kENET_RxAccelProtoCheckEnabled)))) - { - base->RSFL = 0; - } - -/* Initializes the ring 0. */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - base->TDSR = MEMORY_ConvertMemoryMapAddress((uint32_t)bufferConfig->txBdStartAddrAlign, kMEMORY_Local2DMA); - base->RDSR = MEMORY_ConvertMemoryMapAddress((uint32_t)bufferConfig->rxBdStartAddrAlign, kMEMORY_Local2DMA); -#else - base->TDSR = (uint32_t)bufferConfig->txBdStartAddrAlign; - base->RDSR = (uint32_t)bufferConfig->rxBdStartAddrAlign; -#endif - base->MRBR = (uint32_t)bufferConfig->rxBuffSizeAlign; - -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(base) == 1) - { - const enet_buffer_config_t *buffCfg = bufferConfig; - - if (config->ringNum > 1U) - { - /* Initializes the ring 1. */ - buffCfg++; -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - base->TDSR1 = MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->txBdStartAddrAlign, kMEMORY_Local2DMA); - base->RDSR1 = MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->rxBdStartAddrAlign, kMEMORY_Local2DMA); -#else - base->TDSR1 = (uint32_t)buffCfg->txBdStartAddrAlign; - base->RDSR1 = (uint32_t)buffCfg->rxBdStartAddrAlign; -#endif - base->MRBR1 = (uint32_t)buffCfg->rxBuffSizeAlign; - /* Enable the DMAC for ring 1 and with no rx classification set. */ - base->DMACFG[0] = ENET_DMACFG_DMA_CLASS_EN_MASK; - } - if (config->ringNum > 2U) - { - /* Initializes the ring 2. */ - buffCfg++; -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - base->TDSR2 = MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->txBdStartAddrAlign, kMEMORY_Local2DMA); - base->RDSR2 = MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->rxBdStartAddrAlign, kMEMORY_Local2DMA); -#else - base->TDSR2 = (uint32_t)buffCfg->txBdStartAddrAlign; - base->RDSR2 = (uint32_t)buffCfg->rxBdStartAddrAlign; -#endif - base->MRBR2 = (uint32_t)buffCfg->rxBuffSizeAlign; - /* Enable the DMAC for ring 2 and with no rx classification set. */ - base->DMACFG[1] = ENET_DMACFG_DMA_CLASS_EN_MASK; - } - - /* Defaulting the class/ring 1 and 2 are not enabled and the receive classification is disabled - * so we set the default transmit scheme with the round-robin mode. Beacuse the legacy bd mode - * only supports the round-robin mode. If the avb feature is required, just call the setup avb - * feature API. */ - base->QOS |= ENET_QOS_TX_SCHEME(1); - } -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - - /* Configures the Mac address. */ - ENET_SetMacAddr(base, macAddr); - - /* Initialize the SMI if uninitialized. */ - if (!ENET_GetSMI(base)) - { - ENET_SetSMI(base, srcClock_Hz, - ((0U != (config->macSpecialConfig & (uint32_t)kENET_ControlSMIPreambleDisable)) ? true : false)); - } - -/* Enables Ethernet interrupt, enables the interrupt coalsecing if it is required. */ -#if defined(FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE) && FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE - if (NULL != config->intCoalesceCfg) - { - uint32_t intMask = (ENET_EIMR_TXB_MASK | ENET_EIMR_RXB_MASK); - -#if FSL_FEATURE_ENET_QUEUE > 1 - uint8_t queue = 0; - if (FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) > 1) - { - intMask |= ENET_EIMR_TXB2_MASK | ENET_EIMR_RXB2_MASK | ENET_EIMR_TXB1_MASK | ENET_EIMR_RXB1_MASK; - } -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - - /* Clear all buffer interrupts. */ - base->EIMR &= ~intMask; - -/* Set the interrupt coalescence. */ -#if FSL_FEATURE_ENET_QUEUE > 1 - for (queue = 0; queue < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base); queue++) - { - base->TXIC[queue] = ENET_TXIC_ICFT(config->intCoalesceCfg->txCoalesceFrameCount[queue]) | - config->intCoalesceCfg->txCoalesceTimeCount[queue] | ENET_TXIC_ICCS_MASK | - ENET_TXIC_ICEN_MASK; - base->RXIC[queue] = ENET_RXIC_ICFT(config->intCoalesceCfg->rxCoalesceFrameCount[queue]) | - config->intCoalesceCfg->rxCoalesceTimeCount[queue] | ENET_RXIC_ICCS_MASK | - ENET_RXIC_ICEN_MASK; - } -#else - base->TXIC = ENET_TXIC_ICFT(config->intCoalesceCfg->txCoalesceFrameCount[0]) | - config->intCoalesceCfg->txCoalesceTimeCount[0] | ENET_TXIC_ICCS_MASK | ENET_TXIC_ICEN_MASK; - base->RXIC = ENET_RXIC_ICFT(config->intCoalesceCfg->rxCoalesceFrameCount[0]) | - config->intCoalesceCfg->rxCoalesceTimeCount[0] | ENET_RXIC_ICCS_MASK | ENET_RXIC_ICEN_MASK; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } -#endif /* FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE */ - ENET_EnableInterrupts(base, config->interrupt); - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* Sets the 1588 enhanced feature. */ - ecr |= ENET_ECR_EN1588_MASK; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - /* Enables Ethernet module after all configuration except the buffer descriptor active. */ - ecr |= ENET_ECR_ETHEREN_MASK | ENET_ECR_DBSWP_MASK; - base->ECR = ecr; -} - -static void ENET_SetTxBufferDescriptors(enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig) -{ - assert(config != NULL); - assert(bufferConfig != NULL); - - /* Default single ring is supported. */ - uint8_t ringNum; - uint16_t count; - uint32_t txBuffSizeAlign; - uint8_t *txBuffer = NULL; - const enet_buffer_config_t *buffCfg = bufferConfig; - - /* Check the input parameters. */ - for (ringNum = 0; ringNum < config->ringNum; ringNum++) - { - if (buffCfg->txBdStartAddrAlign != NULL) - { - volatile enet_tx_bd_struct_t *curBuffDescrip = buffCfg->txBdStartAddrAlign; - txBuffSizeAlign = buffCfg->txBuffSizeAlign; - - if (buffCfg->txBufferAlign != NULL) - { -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - txBuffer = - (uint8_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->txBufferAlign, kMEMORY_Local2DMA); -#else - txBuffer = buffCfg->txBufferAlign; -#endif - } - - for (count = 0; count < buffCfg->txBdNumber; count++) - { - if (buffCfg->txBufferAlign != NULL) - { - /* Set data buffer address. */ - curBuffDescrip->buffer = (uint8_t *)((uint32_t)&txBuffer[count * txBuffSizeAlign]); - } - /* Initializes data length. */ - curBuffDescrip->length = 0; - /* Sets the crc. */ - curBuffDescrip->control = ENET_BUFFDESCRIPTOR_TX_TRANMITCRC_MASK; - /* Sets the last buffer descriptor with the wrap flag. */ - if (count == (buffCfg->txBdNumber - 1U)) - { - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_TX_WRAP_MASK; - } - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* Enable transmit interrupt for store the transmit timestamp. */ - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_INTERRUPT_MASK; -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - /* Set the type of the frame when the credit-based scheme is used. */ - curBuffDescrip->controlExtend1 |= (uint16_t)(ENET_BD_FTYPE(ringNum)); -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - /* Increase the index. */ - curBuffDescrip++; - } - } - buffCfg++; - } -} - -static void ENET_SetRxBufferDescriptors(enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig) -{ - assert(config != NULL); - assert(bufferConfig != NULL); - - /* Default single ring is supported. */ - uint8_t ringNum; - uint16_t count; - uint16_t rxBuffSizeAlign; - uint8_t *rxBuffer; - const enet_buffer_config_t *buffCfg = bufferConfig; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint32_t mask = ((uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_RxBufferInterrupt); -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* Check the input parameters. */ - for (ringNum = 0; ringNum < config->ringNum; ringNum++) - { - assert(buffCfg->rxBuffSizeAlign >= ENET_RX_MIN_BUFFERSIZE); -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -#if FSL_FEATURE_ENET_QUEUE > 1 - if (ringNum == 1U) - { - mask = ((uint32_t)kENET_RxFrame1Interrupt | (uint32_t)kENET_RxBuffer1Interrupt); - } - else if (ringNum == 2U) - { - mask = ((uint32_t)kENET_RxFrame2Interrupt | (uint32_t)kENET_RxBuffer2Interrupt); - } - else - { - /* Intentional empty */ - } -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - if ((buffCfg->rxBdStartAddrAlign != NULL) && ((buffCfg->rxBufferAlign != NULL) || config->rxBuffAlloc != NULL)) - { - volatile enet_rx_bd_struct_t *curBuffDescrip = buffCfg->rxBdStartAddrAlign; - rxBuffSizeAlign = buffCfg->rxBuffSizeAlign; -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - rxBuffer = (uint8_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)buffCfg->rxBufferAlign, kMEMORY_Local2DMA); -#else - rxBuffer = buffCfg->rxBufferAlign; -#endif - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (buffCfg->rxMaintainEnable) - { - /* Invalidate rx buffers before DMA transfer data into them. */ - DCACHE_InvalidateByRange((uint32_t)rxBuffer, ((uint32_t)buffCfg->rxBdNumber * rxBuffSizeAlign)); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - - for (count = 0; count < buffCfg->rxBdNumber; count++) - { - /* Set data buffer and the length. */ - curBuffDescrip->length = 0; - if (config->rxBuffAlloc == NULL) - { - curBuffDescrip->buffer = (uint8_t *)((uint32_t)&rxBuffer[count * rxBuffSizeAlign]); - /* Initializes the buffer descriptors with empty bit. */ - curBuffDescrip->control = ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - } - - /* Sets the last buffer descriptor with the wrap flag. */ - if (count == (buffCfg->rxBdNumber - 1U)) - { - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - } - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - if (0U != (config->interrupt & mask)) - { - /* Enable receive interrupt. */ - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_RX_INTERRUPT_MASK; - } - else - { - curBuffDescrip->controlExtend1 = 0; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - /* Increase the index. */ - curBuffDescrip++; - } - } - buffCfg++; - } -} - -/*! - * brief Allocates all Rx buffers in BDs. - */ -static status_t ENET_RxBufferAllocAll(ENET_Type *base, enet_handle_t *handle) -{ - assert(handle->rxBuffAlloc != NULL); - - enet_rx_bd_ring_t *rxBdRing; - volatile enet_rx_bd_struct_t *curBuffDescrip; - uint16_t index; - void *buffer; - uint16_t ringId; - - /* Allocate memory for all empty buffers in buffer descriptor */ - for (ringId = 0; ringId < handle->ringNum; ringId++) - { - assert(handle->rxBdRing[ringId].rxBdBase != NULL); - - rxBdRing = &handle->rxBdRing[ringId]; - curBuffDescrip = rxBdRing->rxBdBase; - index = 0; - - do - { - buffer = handle->rxBuffAlloc(base, handle->userData, ringId); - if (buffer == NULL) - { - ENET_RxBufferFreeAll(base, handle); - return kStatus_ENET_InitMemoryFail; - } - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->rxMaintainEnable[ringId]) - { - /* Invalidate cache in case any unfinished cache operation occurs. */ - DCACHE_InvalidateByRange((uint32_t)(uint32_t *)buffer, handle->rxBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - buffer = - (void *)(uint32_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)(uint32_t *)buffer, kMEMORY_Local2DMA); -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - curBuffDescrip->buffer = (uint8_t *)(uint32_t *)buffer; - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - - /* Increase the buffer descriptor, if it's the last one, increase to first one of the ring. */ - index = ENET_IncreaseIndex(index, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + index; - } while (index != 0U); - } - return kStatus_Success; -} - -/*! - * brief Frees all Rx buffers in BDs. - */ -static void ENET_RxBufferFreeAll(ENET_Type *base, enet_handle_t *handle) -{ - assert(handle->rxBuffFree != NULL); - - uint16_t index; - enet_rx_bd_ring_t *rxBdRing; - volatile enet_rx_bd_struct_t *curBuffDescrip; - void *buffer; - uint16_t ringId; - - for (ringId = 0; ringId < handle->ringNum; ringId++) - { - assert(handle->rxBdRing[ringId].rxBdBase != NULL); - - rxBdRing = &handle->rxBdRing[ringId]; - curBuffDescrip = rxBdRing->rxBdBase; - index = 0; - - /* Free memory for all buffers in buffer descriptor */ - do - { - if (curBuffDescrip->buffer != NULL) - { -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - buffer = (void *)(uint32_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, - kMEMORY_DMA2Local); -#else - buffer = curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - handle->rxBuffFree(base, buffer, handle->userData, ringId); - curBuffDescrip->buffer = NULL; - /* Clears status. */ - curBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - } - - /* Increase the buffer descriptor, if it's the last one, increase to first one of the ring. */ - index = ENET_IncreaseIndex(index, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + index; - } while (index != 0U); - } -} - -/*! - * brief Activates frame reception for specified ring. - * - * This function is to active the enet read process for specified ring. - * note This must be called after the MAC configuration and - * state are ready. It must be called after the ENET_Init() and - * ENET_Ptp1588Configure(). This should be called when the ENET receive required. - * - * param base ENET peripheral base address. - * param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - */ -static inline void ENET_ActiveReadRing(ENET_Type *base, uint8_t ringId) -{ - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - /* Ensure previous data update is completed with Data Synchronization Barrier before activing Rx BD. */ - __DSB(); - - /* Actives the receive buffer descriptor. */ - switch (ringId) - { - case kENET_Ring0: - base->RDAR = ENET_RDAR_RDAR_MASK; - break; -#if FSL_FEATURE_ENET_QUEUE > 1 - case kENET_Ring1: - base->RDAR1 = ENET_RDAR1_RDAR_MASK; - break; - case kENET_Ring2: - base->RDAR2 = ENET_RDAR2_RDAR_MASK; - break; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - default: - assert(false); - break; - } -} - -/*! - * brief Activates frame sending for specified ring. - * note This must be called after the MAC configuration and - * state are ready. It must be called after the ENET_Init() and - * this should be called when the ENET receive required. - * - * param base ENET peripheral base address. - * param ringId The descriptor ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - * - */ -static void ENET_ActiveSendRing(ENET_Type *base, uint8_t ringId) -{ - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - volatile uint32_t *txDesActive = NULL; - - /* Ensure previous data update is completed with Data Synchronization Barrier before activing Tx BD. */ - __DSB(); - - switch (ringId) - { - case kENET_Ring0: - txDesActive = &(base->TDAR); - break; -#if FSL_FEATURE_ENET_QUEUE > 1 - case kENET_Ring1: - txDesActive = &(base->TDAR1); - break; - case kENET_Ring2: - txDesActive = &(base->TDAR2); - break; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - default: - txDesActive = &(base->TDAR); - break; - } - -#if defined(FSL_FEATURE_ENET_HAS_ERRATA_007885) && FSL_FEATURE_ENET_HAS_ERRATA_007885 - /* There is a TDAR race condition for mutliQ when the software sets TDAR - * and the UDMA clears TDAR simultaneously or in a small window (2-4 cycles). - * This will cause the udma_tx and udma_tx_arbiter state machines to hang. - * Software workaround: introduces a delay by reading the relevant ENET_TDARn_TDAR 4 times - */ - for (uint8_t i = 0; i < 4U; i++) - { - if (*txDesActive == 0U) - { - break; - } - } -#endif - - /* Write to active tx descriptor */ - *txDesActive = 0; -} - -/*! - * brief Sets the ENET MII speed and duplex. - * - * This API is provided to dynamically change the speed and dulpex for MAC. - * - * param base ENET peripheral base address. - * param speed The speed of the RMII mode. - * param duplex The duplex of the RMII mode. - */ -void ENET_SetMII(ENET_Type *base, enet_mii_speed_t speed, enet_mii_duplex_t duplex) -{ - uint32_t rcr = base->RCR; - uint32_t tcr = base->TCR; - -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(base) == 1) - { - uint32_t ecr = base->ECR; - - if (kENET_MiiSpeed1000M == speed) - { - assert(duplex == kENET_MiiFullDuplex); - ecr |= ENET_ECR_SPEED_MASK; - } - else - { - ecr &= ~ENET_ECR_SPEED_MASK; - } - - base->ECR = ecr; - } -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - - /* Sets speed mode. */ - if (kENET_MiiSpeed10M == speed) - { - rcr |= ENET_RCR_RMII_10T_MASK; - } - else - { - rcr &= ~ENET_RCR_RMII_10T_MASK; - } - /* Set duplex mode. */ - if (duplex == kENET_MiiHalfDuplex) - { - rcr |= ENET_RCR_DRT_MASK; - tcr &= ~ENET_TCR_FDEN_MASK; - } - else - { - rcr &= ~ENET_RCR_DRT_MASK; - tcr |= ENET_TCR_FDEN_MASK; - } - - base->RCR = rcr; - base->TCR = tcr; -} - -/*! - * brief Sets the ENET module Mac address. - * - * param base ENET peripheral base address. - * param macAddr The six-byte Mac address pointer. - * The pointer is allocated by application and input into the API. - */ -void ENET_SetMacAddr(ENET_Type *base, uint8_t *macAddr) -{ - uint32_t address; - - /* Set physical address lower register. */ - address = (uint32_t)(((uint32_t)macAddr[0] << 24U) | ((uint32_t)macAddr[1] << 16U) | ((uint32_t)macAddr[2] << 8U) | - (uint32_t)macAddr[3]); - base->PALR = address; - /* Set physical address high register. */ - address = (uint32_t)(((uint32_t)macAddr[4] << 8U) | ((uint32_t)macAddr[5])); - base->PAUR = address << ENET_PAUR_PADDR2_SHIFT; -} - -/*! - * brief Gets the ENET module Mac address. - * - * param base ENET peripheral base address. - * param macAddr The six-byte Mac address pointer. - * The pointer is allocated by application and input into the API. - */ -void ENET_GetMacAddr(ENET_Type *base, uint8_t *macAddr) -{ - assert(macAddr != NULL); - - uint32_t address; - - /* Get from physical address lower register. */ - address = base->PALR; - macAddr[0] = 0xFFU & (uint8_t)(address >> 24U); - macAddr[1] = 0xFFU & (uint8_t)(address >> 16U); - macAddr[2] = 0xFFU & (uint8_t)(address >> 8U); - macAddr[3] = 0xFFU & (uint8_t)address; - - /* Get from physical address high register. */ - address = (base->PAUR & ENET_PAUR_PADDR2_MASK) >> ENET_PAUR_PADDR2_SHIFT; - macAddr[4] = 0xFFU & (uint8_t)(address >> 8U); - macAddr[5] = 0xFFU & (uint8_t)address; -} - -/*! - * brief Sets the ENET SMI(serial management interface)- MII management interface. - * - * param base ENET peripheral base address. - * param srcClock_Hz This is the ENET module clock frequency. See clock distribution. - * param isPreambleDisabled The preamble disable flag. - * - true Enables the preamble. - * - false Disables the preamble. - */ -void ENET_SetSMI(ENET_Type *base, uint32_t srcClock_Hz, bool isPreambleDisabled) -{ - /* Due to bits limitation of SPEED and HOLDTIME, srcClock_Hz must ensure MDC <= 2.5M and holdtime >= 10ns. */ - assert((srcClock_Hz != 0U) && (srcClock_Hz <= 320000000U)); - - uint32_t clkCycle = 0; - uint32_t speed = 0; - uint32_t mscr = 0; - - /* Use (param + N - 1) / N to increase accuracy with rounding. */ - /* Calculate the MII speed which controls the frequency of the MDC. */ - speed = (srcClock_Hz + 2U * ENET_MDC_FREQUENCY - 1U) / (2U * ENET_MDC_FREQUENCY) - 1U; - /* Calculate the hold time on the MDIO output. */ - clkCycle = (10U + ENET_NANOSECOND_ONE_SECOND / srcClock_Hz - 1U) / (ENET_NANOSECOND_ONE_SECOND / srcClock_Hz) - 1U; - /* Build the configuration for MDC/MDIO control. */ - mscr = - ENET_MSCR_MII_SPEED(speed) | ENET_MSCR_HOLDTIME(clkCycle) | (isPreambleDisabled ? ENET_MSCR_DIS_PRE_MASK : 0U); - base->MSCR = mscr; -} - -/*! - * brief Starts an SMI write command. - * - * Used for standard IEEE802.3 MDIO Clause 22 format. - * - * param base ENET peripheral base address. - * param phyAddr The PHY address. - * param phyReg The PHY register. Range from 0 ~ 31. - * param operation The write operation. - * param data The data written to PHY. - */ -void ENET_StartSMIWrite(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, enet_mii_write_t operation, uint32_t data) -{ - uint32_t mmfr = 0; - - /* Build MII write command. */ - mmfr = ENET_MMFR_ST(1U) | ENET_MMFR_OP(operation) | ENET_MMFR_PA(phyAddr) | ENET_MMFR_RA(phyReg) | - ENET_MMFR_TA(2U) | (data & 0xFFFFU); - base->MMFR = mmfr; -} - -/*! - * brief Starts an SMI (Serial Management Interface) read command. - * - * Used for standard IEEE802.3 MDIO Clause 22 format. - * - * param base ENET peripheral base address. - * param phyAddr The PHY address. - * param phyReg The PHY register. Range from 0 ~ 31. - * param operation The read operation. - */ -void ENET_StartSMIRead(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, enet_mii_read_t operation) -{ - uint32_t mmfr = 0; - - /* Build MII read command. */ - mmfr = ENET_MMFR_ST(1U) | ENET_MMFR_OP(operation) | ENET_MMFR_PA(phyAddr) | ENET_MMFR_RA(phyReg) | ENET_MMFR_TA(2U); - base->MMFR = mmfr; -} - -#if defined(FSL_FEATURE_ENET_HAS_EXTEND_MDIO) && FSL_FEATURE_ENET_HAS_EXTEND_MDIO -/*! - * brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI write register command. - * - * param base ENET peripheral base address. - * param phyAddr The PHY address. - * param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - */ -void ENET_StartExtC45SMIWriteReg(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg) -{ - uint32_t mmfr = 0; - - /* Parse the address from the input register. */ - uint16_t devAddr = (uint16_t)((phyReg >> 16U) & 0x1FU); - uint16_t regAddr = (uint16_t)(phyReg & 0xFFFFU); - - /* Address write. */ - mmfr = ENET_MMFR_ST(0) | ENET_MMFR_OP(kENET_MiiAddrWrite_C45) | ENET_MMFR_PA(phyAddr) | ENET_MMFR_RA(devAddr) | - ENET_MMFR_TA(2) | ENET_MMFR_DATA(regAddr); - base->MMFR = mmfr; -} - -/*! - * brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI write data command. - * - * After writing MMFR register, we need to check whether the transmission is over. - * This is an example for whole precedure of clause 45 MDIO write. - * code - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteReg(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteData(base, phyAddr, phyReg, data); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * endcode - * param base ENET peripheral base address. - * param phyAddr The PHY address. - * param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - * param data The data written to PHY. - */ -void ENET_StartExtC45SMIWriteData(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, uint32_t data) -{ - uint32_t mmfr = 0; - - /* Parse the address from the input register. */ - uint16_t devAddr = (uint16_t)((phyReg >> 16U) & 0x1FU); - - /* Build MII write command. */ - mmfr = ENET_MMFR_ST(0) | ENET_MMFR_OP(kENET_MiiWriteFrame_C45) | ENET_MMFR_PA(phyAddr) | ENET_MMFR_RA(devAddr) | - ENET_MMFR_TA(2) | ENET_MMFR_DATA(data); - base->MMFR = mmfr; -} - -/*! - * brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI read data command. - * - * After writing MMFR register, we need to check whether the transmission is over. - * This is an example for whole precedure of clause 45 MDIO read. - * code - * uint32_t data; - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteReg(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIReadData(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * data = ENET_ReadSMIData(base); - * endcode - * param base ENET peripheral base address. - * param phyAddr The PHY address. - * param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - */ -void ENET_StartExtC45SMIReadData(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg) -{ - uint32_t mmfr = 0; - - /* Parse the address from the input register. */ - uint16_t devAddr = (uint16_t)((phyReg >> 16U) & 0x1FU); - - /* Build MII read command. */ - mmfr = ENET_MMFR_ST(0) | ENET_MMFR_OP(kENET_MiiReadFrame_C45) | ENET_MMFR_PA(phyAddr) | ENET_MMFR_RA(devAddr) | - ENET_MMFR_TA(2); - base->MMFR = mmfr; -} -#endif /* FSL_FEATURE_ENET_HAS_EXTEND_MDIO */ - -static uint16_t ENET_IncreaseIndex(uint16_t index, uint16_t max) -{ - assert(index < max); - - /* Increase the index. */ - index++; - if (index >= max) - { - index = 0; - } - return index; -} - -static inline bool ENET_TxDirtyRingAvailable(enet_tx_dirty_ring_t *txDirtyRing) -{ - return !txDirtyRing->isFull; -} - -/*! - * brief Gets the error statistics of a received frame for ENET specified ring. - * - * This API must be called after the ENET_GetRxFrameSize and before the ENET_ReadFrame(). - * If the ENET_GetRxFrameSize returns kStatus_ENET_RxFrameError, - * the ENET_GetRxErrBeforeReadFrame can be used to get the exact error statistics. - * This is an example. - * code - * status = ENET_GetRxFrameSize(&g_handle, &length, 0); - * if (status == kStatus_ENET_RxFrameError) - * { - * ENET_GetRxErrBeforeReadFrame(&g_handle, &eErrStatic, 0); - * ENET_ReadFrame(EXAMPLE_ENET, &g_handle, NULL, 0); - * } - * endcode - * param handle The ENET handler structure pointer. This is the same handler pointer used in the ENET_Init. - * param eErrorStatic The error statistics structure pointer. - * param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - */ -void ENET_GetRxErrBeforeReadFrame(enet_handle_t *handle, enet_data_error_stats_t *eErrorStatic, uint8_t ringId) -{ - assert(handle != NULL); - assert(eErrorStatic != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - uint16_t control = 0; - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - volatile enet_rx_bd_struct_t *cmpBuffDescrip = curBuffDescrip; - - do - { - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - control = curBuffDescrip->control; - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_TRUNC_MASK)) - { - /* The receive truncate error. */ - eErrorStatic->statsRxTruncateErr++; - } - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_OVERRUN_MASK)) - { - /* The receive over run error. */ - eErrorStatic->statsRxOverRunErr++; - } - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_LENVLIOLATE_MASK)) - { - /* The receive length violation error. */ - eErrorStatic->statsRxLenGreaterErr++; - } - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_NOOCTET_MASK)) - { - /* The receive alignment error. */ - eErrorStatic->statsRxAlignErr++; - } - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_CRC_MASK)) - { - /* The receive CRC error. */ - eErrorStatic->statsRxFcsErr++; - } -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint16_t controlExt = curBuffDescrip->controlExtend1; - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_RX_MACERR_MASK)) - { - /* The MAC error. */ - eErrorStatic->statsRxMacErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_RX_PHYERR_MASK)) - { - /* The PHY error. */ - eErrorStatic->statsRxPhyErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_RX_COLLISION_MASK)) - { - /* The receive collision error. */ - eErrorStatic->statsRxCollisionErr++; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - break; - } - - /* Increase the buffer descriptor, if it's the last one, increase to first one of the ring buffer. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_WRAP_MASK)) - { - curBuffDescrip = rxBdRing->rxBdBase; - } - else - { - curBuffDescrip++; - } - - } while (curBuffDescrip != cmpBuffDescrip); -} - -/*! - * brief Gets statistical data in transfer. - * - * param base ENET peripheral base address. - * param statistics The statistics structure pointer. - */ -void ENET_GetStatistics(ENET_Type *base, enet_transfer_stats_t *statistics) -{ - /* Rx statistics */ - statistics->statsRxFrameCount = base->RMON_R_PACKETS; - statistics->statsRxFrameOk = base->IEEE_R_FRAME_OK; - statistics->statsRxCrcErr = base->IEEE_R_CRC; - statistics->statsRxAlignErr = base->IEEE_R_ALIGN; - statistics->statsRxDropInvalidSFD = base->IEEE_R_DROP; - statistics->statsRxFifoOverflowErr = base->IEEE_R_MACERR; - - /* Tx statistics */ - statistics->statsTxFrameCount = base->RMON_T_PACKETS; - statistics->statsTxFrameOk = base->IEEE_T_FRAME_OK; - statistics->statsTxCrcAlignErr = base->RMON_T_CRC_ALIGN; - statistics->statsTxFifoUnderRunErr = base->IEEE_T_MACERR; -} - -/*! - * brief Gets the size of the read frame for specified ring. - * - * This function gets a received frame size from the ENET buffer descriptors. - * note The FCS of the frame is automatically removed by MAC and the size is the length without the FCS. - * After calling ENET_GetRxFrameSize, ENET_ReadFrame() should be called to receive frame and update the BD - * if the result is not "kStatus_ENET_RxFrameEmpty". - * - * param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * param length The length of the valid frame received. - * param ringId The ring index or ring number. - * retval kStatus_ENET_RxFrameEmpty No frame received. Should not call ENET_ReadFrame to read frame. - * retval kStatus_ENET_RxFrameError Data error happens. ENET_ReadFrame should be called with NULL data - * and NULL length to update the receive buffers. - * retval kStatus_Success Receive a frame Successfully then the ENET_ReadFrame - * should be called with the right data buffer and the captured data length input. - */ -status_t ENET_GetRxFrameSize(enet_handle_t *handle, uint32_t *length, uint8_t ringId) -{ - assert(handle != NULL); - assert(length != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - /* Reset the length to zero. */ - *length = 0; - - uint16_t validLastMask = ENET_BUFFDESCRIPTOR_RX_LAST_MASK | ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - uint16_t index = rxBdRing->rxGenIdx; - bool isReturn = false; - status_t result = kStatus_Success; - - /* Check the current buffer descriptor's empty flag. If empty means there is no frame received. */ - /* If this buffer descriptor is owned by application, return empty. Only need to check the first BD's owner if one - * frame in mutiple BDs. */ - if (0U != (curBuffDescrip->control & (ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK | ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK))) - { - isReturn = true; - result = kStatus_ENET_RxFrameEmpty; - } - else - { - do - { - /* Add check for abnormal case. */ - if (curBuffDescrip->length == 0U) - { - isReturn = true; - result = kStatus_ENET_RxFrameError; - break; - } - - /* Find the last buffer descriptor. */ - if ((curBuffDescrip->control & validLastMask) == ENET_BUFFDESCRIPTOR_RX_LAST_MASK) - { - isReturn = true; - /* The last buffer descriptor in the frame check the status of the received frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_ERR_MASK)) - { - result = kStatus_ENET_RxFrameError; - break; - } -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - if (0U != (curBuffDescrip->controlExtend1 & ENET_BUFFDESCRIPTOR_RX_EXT_ERR_MASK)) - { - result = kStatus_ENET_RxFrameError; - break; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* FCS is removed by MAC. */ - *length = curBuffDescrip->length; - break; - } - /* Increase the buffer descriptor, if it is the last one, increase to first one of the ring buffer. */ - index = ENET_IncreaseIndex(index, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + index; - } while (index != rxBdRing->rxGenIdx); - } - - if (isReturn == false) - { - /* The frame is on processing - set to empty status to make application to receive it next time. */ - result = kStatus_ENET_RxFrameEmpty; - } - - return result; -} - -/*! - * brief Reads a frame from the ENET device. - * This function reads a frame (both the data and the length) from the ENET buffer descriptors. - * User can get timestamp through ts pointer if the ts is not NULL. - * note It doesn't store the timestamp in the receive timestamp queue. - * The ENET_GetRxFrameSize should be used to get the size of the prepared data buffer. - * This API uses memcpy to copy data from DMA buffer to application buffer, 4 bytes aligned data buffer - * in 32 bits platforms provided by user may let compiler use optimization instruction to reduce time - * consumption. - * This is an example: - * code - * uint32_t length; - * enet_handle_t g_handle; - * Comments: Get the received frame size firstly. - * status = ENET_GetRxFrameSize(&g_handle, &length, 0); - * if (length != 0) - * { - * Comments: Allocate memory here with the size of "length" - * uint8_t *data = memory allocate interface; - * if (!data) - * { - * ENET_ReadFrame(ENET, &g_handle, NULL, 0, 0, NULL); - * Comments: Add the console warning log. - * } - * else - * { - * status = ENET_ReadFrame(ENET, &g_handle, data, length, 0, NULL); - * Comments: Call stack input API to deliver the data to stack - * } - * } - * else if (status == kStatus_ENET_RxFrameError) - * { - * Comments: Update the received buffer when a error frame is received. - * ENET_ReadFrame(ENET, &g_handle, NULL, 0, 0, NULL); - * } - * endcode - * param base ENET peripheral base address. - * param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * param data The data buffer provided by user to store the frame which memory size should be at least "length". - * param length The size of the data buffer which is still the length of the received frame. - * param ringId The ring index or ring number. - * param ts The timestamp address to store received timestamp. - * return The execute status, successful or failure. - */ -status_t ENET_ReadFrame( - ENET_Type *base, enet_handle_t *handle, uint8_t *data, uint32_t length, uint8_t ringId, uint32_t *ts) -{ - assert(handle != NULL); - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - uint32_t len = 0; - uint32_t offset = 0; - uint16_t control; - bool isLastBuff = false; - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - uint16_t index = rxBdRing->rxGenIdx; - status_t result = kStatus_Success; - uint32_t address; - uint32_t dest; - - /* For data-NULL input, only update the buffer descriptor. */ - if (data == NULL) - { - do - { - /* Update the control flag. */ - control = curBuffDescrip->control; - - /* Updates the receive buffer descriptors. */ - ENET_UpdateReadBuffers(base, handle, ringId); - - /* Find the last buffer descriptor for the frame. */ - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - break; - } - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - } while (index != rxBdRing->rxGenIdx); - } - else - { - while (!isLastBuff) - { -/* A frame on one buffer or several receive buffers are both considered. */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - address = MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, kMEMORY_DMA2Local); -#else - address = (uint32_t)curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->rxMaintainEnable[ringId]) - { - /* Add the cache invalidate maintain. */ - DCACHE_InvalidateByRange(address, handle->rxBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - - dest = (uint32_t)data + offset; - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - /* This is a valid frame. */ - isLastBuff = true; - if (length == curBuffDescrip->length) - { - /* Copy the frame to user's buffer without FCS. */ - len = curBuffDescrip->length - offset; - (void)memcpy((void *)(uint32_t *)dest, (void *)(uint32_t *)address, len); -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* Get the timestamp if the ts isn't NULL. */ - if (ts != NULL) - { - *ts = curBuffDescrip->timestamp; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* Updates the receive buffer descriptors. */ - ENET_UpdateReadBuffers(base, handle, ringId); - break; - } - else - { - /* Updates the receive buffer descriptors. */ - ENET_UpdateReadBuffers(base, handle, ringId); - } - } - else - { - /* Store a frame on several buffer descriptors. */ - isLastBuff = false; - /* Length check. */ - if (offset >= length) - { - result = kStatus_ENET_RxFrameFail; - break; - } - (void)memcpy((void *)(uint32_t *)dest, (void *)(uint32_t *)address, handle->rxBuffSizeAlign[ringId]); - offset += handle->rxBuffSizeAlign[ringId]; - - /* Updates the receive buffer descriptors. */ - ENET_UpdateReadBuffers(base, handle, ringId); - } - - /* Get the current buffer descriptor. */ - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - } - } - - return result; -} - -static void ENET_UpdateReadBuffers(ENET_Type *base, enet_handle_t *handle, uint8_t ringId) -{ - assert(handle != NULL); - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - - /* Clears status. */ - curBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - - /* Increase current buffer descriptor to the next one. */ - rxBdRing->rxGenIdx = ENET_IncreaseIndex(rxBdRing->rxGenIdx, rxBdRing->rxRingLen); - - ENET_ActiveReadRing(base, ringId); -} - -/*! - * brief Transmits an ENET frame for specified ring. - * note The CRC is automatically appended to the data. Input the data to send without the CRC. - * This API uses memcpy to copy data from DMA buffer to application buffer, 4 bytes aligned data buffer - * in 32 bits platforms provided by user may let compiler use optimization instruction to reduce time - * consumption. - * - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * param data The data buffer provided by user to send. - * param length The length of the data to send. - * param ringId The ring index or ring number. - * param tsFlag Timestamp enable flag. - * param context Used by user to handle some events after transmit over. - * retval kStatus_Success Send frame succeed. - * retval kStatus_ENET_TxFrameBusy Transmit buffer descriptor is busy under transmission. - * The transmit busy happens when the data send rate is over the MAC capacity. - * The waiting mechanism is recommended to be added after each call return with - * kStatus_ENET_TxFrameBusy. - */ -status_t ENET_SendFrame(ENET_Type *base, - enet_handle_t *handle, - const uint8_t *data, - uint32_t length, - uint8_t ringId, - bool tsFlag, - void *context) -{ - assert(handle != NULL); - assert(data != NULL); - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - volatile enet_tx_bd_struct_t *curBuffDescrip; - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - enet_tx_dirty_ring_t *txDirtyRing = &handle->txDirtyRing[ringId]; - enet_frame_info_t *txDirty = NULL; - uint32_t len = 0; - uint32_t sizeleft = 0; - uint32_t address; - status_t result = kStatus_Success; - uint32_t src; - uint32_t configVal; - bool isReturn = false; - uint32_t primask; - - /* Check the frame length. */ - if (length > ENET_FRAME_TX_LEN_LIMITATION(base)) - { - result = kStatus_ENET_TxFrameOverLen; - } - else - { - /* Check if the transmit buffer is ready. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)) - { - result = kStatus_ENET_TxFrameBusy; - } - /* Check txDirtyRing if need frameinfo in tx interrupt callback. */ - else if ((handle->txReclaimEnable[ringId]) && !ENET_TxDirtyRingAvailable(txDirtyRing)) - { - result = kStatus_ENET_TxFrameBusy; - } - else - { - /* One transmit buffer is enough for one frame. */ - if (handle->txBuffSizeAlign[ringId] >= length) - { - /* Copy data to the buffer for uDMA transfer. */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - address = MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, kMEMORY_DMA2Local); -#else - address = (uint32_t)curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - (void)memcpy((void *)(uint32_t *)address, (const void *)(uint32_t *)(uint32_t)data, length); -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->txMaintainEnable[ringId]) - { - DCACHE_CleanByRange(address, length); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - /* Set data length. */ - curBuffDescrip->length = (uint16_t)length; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* For enable the timestamp. */ - if (tsFlag) - { - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK; - } - else - { - curBuffDescrip->controlExtend1 &= (uint16_t)(~ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK); - } - -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - curBuffDescrip->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK); - - /* Increase the buffer descriptor address. */ - txBdRing->txGenIdx = ENET_IncreaseIndex(txBdRing->txGenIdx, txBdRing->txRingLen); - - /* Add context to frame info ring */ - if (handle->txReclaimEnable[ringId]) - { - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txGenIdx; - txDirty->context = context; - txDirtyRing->txGenIdx = ENET_IncreaseIndex(txDirtyRing->txGenIdx, txDirtyRing->txRingLen); - if (txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) - { - txDirtyRing->isFull = true; - } - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor. */ - ENET_ActiveSendRing(base, ringId); - } - else - { - /* One frame requires more than one transmit buffers. */ - do - { -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* For enable the timestamp. */ - if (tsFlag) - { - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK; - } - else - { - curBuffDescrip->controlExtend1 &= (uint16_t)(~ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK); - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* Update the size left to be transmit. */ - sizeleft = length - len; -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - address = MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, kMEMORY_DMA2Local); -#else - address = (uint32_t)curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - src = (uint32_t)data + len; - - /* Increase the current software index of BD */ - txBdRing->txGenIdx = ENET_IncreaseIndex(txBdRing->txGenIdx, txBdRing->txRingLen); - - if (sizeleft > handle->txBuffSizeAlign[ringId]) - { - /* Data copy. */ - (void)memcpy((void *)(uint32_t *)address, (void *)(uint32_t *)src, - handle->txBuffSizeAlign[ringId]); -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->txMaintainEnable[ringId]) - { - /* Add the cache clean maintain. */ - DCACHE_CleanByRange(address, handle->txBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - /* Data length update. */ - curBuffDescrip->length = handle->txBuffSizeAlign[ringId]; - len += handle->txBuffSizeAlign[ringId]; - /* Sets the control flag. */ - configVal = (uint32_t)curBuffDescrip->control; - configVal &= ~ENET_BUFFDESCRIPTOR_TX_LAST_MASK; - configVal |= ENET_BUFFDESCRIPTOR_TX_READY_MASK; - curBuffDescrip->control = (uint16_t)configVal; - - if (handle->txReclaimEnable[ringId]) - { - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor*/ - ENET_ActiveSendRing(base, ringId); - } - else - { - (void)memcpy((void *)(uint32_t *)address, (void *)(uint32_t *)src, sizeleft); -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->txMaintainEnable[ringId]) - { - /* Add the cache clean maintain. */ - DCACHE_CleanByRange(address, sizeleft); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - curBuffDescrip->length = (uint16_t)sizeleft; - /* Set Last buffer wrap flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK; - - if (handle->txReclaimEnable[ringId]) - { - /* Add context to frame info ring */ - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txGenIdx; - txDirty->context = context; - txDirtyRing->txGenIdx = ENET_IncreaseIndex(txDirtyRing->txGenIdx, txDirtyRing->txRingLen); - if (txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) - { - txDirtyRing->isFull = true; - } - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor. */ - ENET_ActiveSendRing(base, ringId); - isReturn = true; - break; - } - /* Update the buffer descriptor address. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - } while (0U == (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)); - - if (isReturn == false) - { - result = kStatus_ENET_TxFrameBusy; - } - } - } - } - return result; -} - -/*! - * brief Enable or disable tx descriptors reclaim mechanism. - * note This function must be called when no pending send frame action. - * Set enable if you want to reclaim context or timestamp in interrupt. - * - * param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * param isEnable Enable or disable flag. - * param ringId The ring index or ring number. - * retval kStatus_Success Succeed to enable/disable Tx reclaim. - * retval kStatus_Fail Fail to enable/disable Tx reclaim. - */ -status_t ENET_SetTxReclaim(enet_handle_t *handle, bool isEnable, uint8_t ringId) -{ - assert(handle != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - enet_tx_dirty_ring_t *txDirtyRing = &handle->txDirtyRing[ringId]; - - status_t result = kStatus_Success; - - /* If tx dirty ring is empty, can set this flag and reset txConsumIdx */ - if ((txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) && ENET_TxDirtyRingAvailable(txDirtyRing)) - { - if (isEnable) - { - handle->txReclaimEnable[ringId] = true; - txBdRing->txConsumIdx = txBdRing->txGenIdx; - } - else - { - handle->txReclaimEnable[ringId] = false; - } - } - else - { - result = kStatus_Fail; - } - return result; -} - -/*! - * brief Reclaim tx descriptors. - * This function is used to update the tx descriptor status and - * store the tx timestamp when the 1588 feature is enabled. - * This is called by the transmit interupt IRQ handler after the - * complete of a frame transmission. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * param ringId The ring index or ring number. - */ -void ENET_ReclaimTxDescriptor(ENET_Type *base, enet_handle_t *handle, uint8_t ringId) -{ - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base)); - - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - volatile enet_tx_bd_struct_t *curBuffDescrip = txBdRing->txBdBase + txBdRing->txConsumIdx; - enet_tx_dirty_ring_t *txDirtyRing = &handle->txDirtyRing[ringId]; - enet_frame_info_t *txDirty = NULL; - uint32_t primask; - - /* Need to update the first index for transmit buffer free. */ - while ((0U == (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)) && (txBdRing->txDescUsed > 0U)) - { - if ((curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_LAST_MASK) != 0U) - { - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txConsumIdx; - txDirtyRing->txConsumIdx = ENET_IncreaseIndex(txDirtyRing->txConsumIdx, txDirtyRing->txRingLen); - txDirtyRing->isFull = false; - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - txDirty->isTsAvail = false; - if ((curBuffDescrip->controlExtend1 & ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK) != 0U) - { - enet_ptp_time_t *ts = &txDirty->timeStamp; - /* Get transmit time stamp second. */ - txDirty->isTsAvail = true; - ts->second = handle->msTimerSecond; - ts->nanosecond = curBuffDescrip->timestamp; - } -#endif - /* For tx buffer free or requeue for last descriptor. - * The tx interrupt callback should free/requeue the tx buffer. */ - if (handle->callback != NULL) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, ringId, kENET_TxEvent, txDirty, handle->userData); -#else - handle->callback(base, handle, kENET_TxEvent, txDirty, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed--; - EnableGlobalIRQ(primask); - - /* Update the index. */ - txBdRing->txConsumIdx = ENET_IncreaseIndex(txBdRing->txConsumIdx, txBdRing->txRingLen); - curBuffDescrip = txBdRing->txBdBase + txBdRing->txConsumIdx; - } -} - -/*! - * deprecated Do not use this function. It has been superseded by @ref ENET_GetRxFrame. - */ -status_t ENET_GetRxBuffer(ENET_Type *base, - enet_handle_t *handle, - void **buffer, - uint32_t *length, - uint8_t ringId, - bool *isLastBuff, - uint32_t *ts) -{ - assert(handle != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - assert(handle->rxBdRing[ringId].rxBdBase != NULL); - assert(handle->rxBuffAlloc == NULL); - - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - uint32_t address; - - /* Check if current rx BD is under usage by certain application */ - /* Buffer owner flag, 1: owned by application, 0: owned by driver */ - if ((curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK) == 0U) - { - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK; - } - else - { - return kStatus_ENET_RxFrameFail; - } - -/* A frame on one buffer or several receive buffers are both considered. */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - address = MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, kMEMORY_DMA2Local); -#else - address = (uint32_t)curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->rxMaintainEnable[ringId]) - { - /* Add the cache invalidate maintain. */ - DCACHE_InvalidateByRange(address, handle->rxBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - - *buffer = (void *)(uint32_t *)address; - *length = curBuffDescrip->length; - - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - /* This is a valid frame. */ - *isLastBuff = true; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - if (ts != NULL) - { - *ts = curBuffDescrip->timestamp; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - } - else - { - *isLastBuff = false; - } - - /* Increase current buffer descriptor to the next one. */ - rxBdRing->rxGenIdx = ENET_IncreaseIndex(rxBdRing->rxGenIdx, rxBdRing->rxRingLen); - - return kStatus_Success; -} - -/*! - * deprecated Do not use this function. It has been superseded by @ref ENET_GetRxFrame. - */ -void ENET_ReleaseRxBuffer(ENET_Type *base, enet_handle_t *handle, void *buffer, uint8_t ringId) -{ - assert(handle != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - enet_rx_bd_struct_t *ownBuffDescrip = (enet_rx_bd_struct_t *)(uint32_t)rxBdRing->rxBdBase; - enet_rx_bd_struct_t *blockBuffDescrip = (enet_rx_bd_struct_t *)(uint32_t)rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - enet_rx_bd_struct_t tempBuffDescrip; - uint16_t index = rxBdRing->rxGenIdx; - bool isReleaseBd = false; - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - buffer = (void *)(uint32_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)(uint32_t *)buffer, kMEMORY_Local2DMA); -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - - do - { - /* Find the BD for releasing, do nothing if it's not owned by application. */ - if (buffer == ownBuffDescrip->buffer) - { - if (0U != (ownBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK)) - { - isReleaseBd = true; - break; - } - } - - if (0U != (ownBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_WRAP_MASK)) - { - break; - } - ownBuffDescrip++; - } while (true); - - if (isReleaseBd) - { - /* Find the first BD owned by application after rxBdCurrent, isReleaseBd is true so there's at least one BD is - * owned by application */ - do - { - if (0U != (blockBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK)) - { - break; - } - if (0U != (blockBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_WRAP_MASK)) - { - blockBuffDescrip = (enet_rx_bd_struct_t *)(uint32_t)rxBdRing->rxBdBase; - } - else - { - blockBuffDescrip++; - } - index = ENET_IncreaseIndex(index, rxBdRing->rxRingLen); - } while (index != rxBdRing->rxGenIdx); - - /* If the BD ready for releasing isn't the first BD owned by application after rxBdCurrent then exchange the two - * BDs */ - if (blockBuffDescrip != ownBuffDescrip) - { - /* Exchange buffer descriptor content */ - tempBuffDescrip = *ownBuffDescrip; - *ownBuffDescrip = *blockBuffDescrip; - *blockBuffDescrip = tempBuffDescrip; - - /* Maintain the wrap flag */ - if (0U != (ownBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_WRAP_MASK)) - { - ownBuffDescrip->control &= (uint16_t)(~ENET_BUFFDESCRIPTOR_RX_WRAP_MASK); - blockBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - } - else if (0U != (blockBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_WRAP_MASK)) - { - blockBuffDescrip->control &= (uint16_t)(~ENET_BUFFDESCRIPTOR_RX_WRAP_MASK); - ownBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - } - else - { - /* Intentional empty */ - } - - /* Clears status including the owner flag. */ - blockBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - blockBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - } - else - { - /* Clears status including the owner flag. */ - ownBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - ownBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - } - - ENET_ActiveReadRing(base, ringId); - } -} - -static inline status_t ENET_GetRxFrameErr(enet_rx_bd_struct_t *rxDesc, enet_rx_frame_error_t *rxFrameError) -{ - assert(rxDesc != NULL); - assert(rxFrameError != NULL); - - status_t result = kStatus_Success; - uint16_t control = rxDesc->control; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint16_t controlExtend1 = rxDesc->controlExtend1; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - union _frame_error - { - uint32_t data; - enet_rx_frame_error_t frameError; - }; - union _frame_error error; - - (void)memset((void *)&error.frameError, 0, sizeof(enet_rx_frame_error_t)); - - /* The last buffer descriptor in the frame check the status of the received frame. */ - if (0U != (control & ENET_BUFFDESCRIPTOR_RX_ERR_MASK)) - { - result = kStatus_ENET_RxFrameError; - } -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - if (0U != (controlExtend1 & ENET_BUFFDESCRIPTOR_RX_EXT_ERR_MASK)) - { - result = kStatus_ENET_RxFrameError; - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - if (result != kStatus_Success) - { - error.data = control; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - error.data |= ((uint32_t)controlExtend1 << 16U); -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - } - - *rxFrameError = error.frameError; - - return result; -} - -/*! - * brief Receives one frame in specified BD ring with zero copy. - * - * This function will use the user-defined allocate and free callback. Every time application gets one frame through - * this function, driver will allocate new buffers for the BDs whose buffers have been taken by application. - * note This function will drop current frame and update related BDs as available for DMA if new buffers allocating - * fails. Application must provide a memory pool including at least BD number + 1 buffers to make this function work - * normally. If user calls this function in Rx interrupt handler, be careful that this function makes Rx BD ready with - * allocating new buffer(normal) or updating current BD(out of memory). If there's always new Rx frame input, Rx - * interrupt will be triggered forever. Application need to disable Rx interrupt according to specific design in this - * case. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * param rxFrame The received frame information structure provided by user. - * param ringId The ring index or ring number. - * retval kStatus_Success Succeed to get one frame and allocate new memory for Rx buffer. - * retval kStatus_ENET_RxFrameEmpty There's no Rx frame in the BD. - * retval kStatus_ENET_RxFrameError There's issue in this receiving. - * retval kStatus_ENET_RxFrameDrop There's no new buffer memory for BD, drop this frame. - */ -status_t ENET_GetRxFrame(ENET_Type *base, enet_handle_t *handle, enet_rx_frame_struct_t *rxFrame, uint8_t ringId) -{ - assert(handle != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - assert(handle->rxBdRing[ringId].rxBdBase != NULL); - assert(rxFrame != NULL); - assert(rxFrame->rxBuffArray != NULL); - - status_t result = kStatus_Success; - enet_rx_bd_ring_t *rxBdRing = &handle->rxBdRing[ringId]; - volatile enet_rx_bd_struct_t *curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - void *newBuff = NULL; - bool isLastBuff = false; - uint16_t buffLen = 0; - enet_buffer_struct_t *rxBuffer; - uint16_t index; - uint32_t address; - void *buffer; - - /* Check the current buffer descriptor's empty flag. If empty means there is no frame received. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK)) - { - result = kStatus_ENET_RxFrameEmpty; - } - else - { - index = rxBdRing->rxGenIdx; - do - { - /* Find the last buffer descriptor. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - /* The last buffer descriptor stores the status of rhis received frame. */ - result = ENET_GetRxFrameErr((enet_rx_bd_struct_t *)(uint32_t)curBuffDescrip, &rxFrame->rxFrameError); - break; - } - - /* Can't find the last BD flag, no valid frame. */ - index = ENET_IncreaseIndex(index, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + index; - if (index == rxBdRing->rxGenIdx) - { - result = kStatus_ENET_RxFrameEmpty; - break; - } - } while (0U == (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK)); - } - - /* Drop the error frame. */ - if (result == kStatus_ENET_RxFrameError) - { - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - do - { - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - isLastBuff = true; - } - - /* Clears status including the owner flag. */ - curBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - - /* Increase current buffer descriptor to the next one. */ - rxBdRing->rxGenIdx = ENET_IncreaseIndex(rxBdRing->rxGenIdx, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - } while (!isLastBuff); - - ENET_ActiveReadRing(base, ringId); - - return result; - } - else if (result != kStatus_Success) - { - return result; - } - else - { - /* Intentional empty */ - } - - /* Get the valid frame */ - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - index = 0; - do - { - newBuff = handle->rxBuffAlloc(base, handle->userData, ringId); - if (newBuff != NULL) - { - rxBuffer = &rxFrame->rxBuffArray[index]; - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - address = MEMORY_ConvertMemoryMapAddress((uint32_t)curBuffDescrip->buffer, kMEMORY_DMA2Local); -#else - address = (uint32_t)curBuffDescrip->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->rxMaintainEnable[ringId]) - { - DCACHE_InvalidateByRange(address, handle->rxBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - - rxBuffer->buffer = (void *)(uint32_t *)address; - - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - /* This is a valid frame. */ - isLastBuff = true; - rxFrame->totLen = curBuffDescrip->length; - rxBuffer->length = curBuffDescrip->length - buffLen; - - rxFrame->rxAttribute.promiscuous = false; - if (0U != (base->RCR & ENET_RCR_PROM_MASK)) - { - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_MISS_MASK)) - { - rxFrame->rxAttribute.promiscuous = true; - } - } -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - rxFrame->rxAttribute.timestamp = curBuffDescrip->timestamp; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - } - else - { - rxBuffer->length = curBuffDescrip->length; - buffLen += rxBuffer->length; - } - - /* Give new buffer from application to BD */ - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - buffer = - (void *)(uint32_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)(uint32_t *)newBuff, kMEMORY_Local2DMA); -#else - buffer = newBuff; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->rxMaintainEnable[ringId]) - { - DCACHE_InvalidateByRange((uint32_t)buffer, handle->rxBuffSizeAlign[ringId]); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ - - curBuffDescrip->buffer = buffer; - - /* Clears status including the owner flag. */ - curBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - - /* Increase Rx array index and the buffer descriptor address. */ - index++; - rxBdRing->rxGenIdx = ENET_IncreaseIndex(rxBdRing->rxGenIdx, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - } - else - { - /* Drop frame if there's no new buffer memory */ - - /* Free the incomplete frame buffers. */ - while (index-- != 0U) - { - handle->rxBuffFree(base, &rxFrame->rxBuffArray[index].buffer, handle->userData, ringId); - } - - /* Update left buffers as ready for next coming frame */ - do - { - /* The last buffer descriptor of a frame. */ - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_RX_LAST_MASK)) - { - isLastBuff = true; - } - - /* Clears status including the owner flag. */ - curBuffDescrip->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK; - /* Sets the receive buffer descriptor with the empty flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK; - - /* Increase current buffer descriptor to the next one. */ - rxBdRing->rxGenIdx = ENET_IncreaseIndex(rxBdRing->rxGenIdx, rxBdRing->rxRingLen); - curBuffDescrip = rxBdRing->rxBdBase + rxBdRing->rxGenIdx; - } while (!isLastBuff); - - result = kStatus_ENET_RxFrameDrop; - break; - } - } while (!isLastBuff); - - ENET_ActiveReadRing(base, ringId); - - return result; -} - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -static inline void ENET_PrepareTxDesc(volatile enet_tx_bd_struct_t *txDesc, enet_tx_config_struct_t *txConfig) -{ - uint16_t controlExtend1 = 0U; - - /* For enable the timestamp. */ - if (txConfig->intEnable) - { - controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_INTERRUPT_MASK; - } - if (txConfig->tsEnable) - { - controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK; - } - if (txConfig->autoProtocolChecksum) - { - controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_PROTOCHECKSUM_MASK; - } - if (txConfig->autoIPChecksum) - { - controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_IPCHECKSUM_MASK; - } -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - if (txConfig->tltEnable) - { - controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_USETXLAUNCHTIME_MASK; - txDesc->txLaunchTimeLow |= txConfig->tltLow; - txDesc->txLaunchTimeHigh |= txConfig->tltHigh; - } - controlExtend1 |= (uint16_t)ENET_BD_FTYPE(txConfig->AVBFrameType); -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - - txDesc->controlExtend1 = controlExtend1; -} -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! - * brief Sends one frame in specified BD ring with zero copy. - * - * This function supports scattered buffer transmit, user needs to provide the buffer array. - * note Tx reclaim should be enabled to ensure the Tx buffer ownership can be given back to - * application after Tx is over. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * param txFrame The Tx frame structure. - * param ringId The ring index or ring number. - * retval kStatus_Success Succeed to send one frame. - * retval kStatus_ENET_TxFrameBusy The BD is not ready for Tx or the reclaim operation still not finishs. - * retval kStatus_ENET_TxFrameOverLen The Tx frame length is over max ethernet frame length. - */ -status_t ENET_StartTxFrame(ENET_Type *base, enet_handle_t *handle, enet_tx_frame_struct_t *txFrame, uint8_t ringId) -{ - assert(handle != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - assert(txFrame->txBuffArray != NULL); - assert(txFrame->txBuffNum != 0U); - assert(handle->txReclaimEnable[ringId]); - - volatile enet_tx_bd_struct_t *curBuffDescrip; - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - enet_tx_dirty_ring_t *txDirtyRing = &handle->txDirtyRing[ringId]; - status_t result = kStatus_Success; - enet_buffer_struct_t *txBuff = txFrame->txBuffArray; - uint32_t txBuffNum = txFrame->txBuffNum; - enet_frame_info_t *txDirty = NULL; - uint32_t frameLen = 0; - uint32_t idleDescNum = 0; - uint16_t index = 0; - uint32_t configVal; - uint32_t primask; - void *buffer; - - /* Calculate frame length and Tx data buffer number. */ - do - { - frameLen += txBuff->length; - txBuff++; - } while (--txBuffNum != 0U); - txBuffNum = txFrame->txBuffNum; - - /* Check whether the available BD number is enough for Tx data buffer. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - index = txBdRing->txGenIdx; - do - { - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)) - { - break; - } - - /* Idle BD number is enough */ - if (++idleDescNum >= txBuffNum) - { - break; - } - index = ENET_IncreaseIndex(index, txBdRing->txRingLen); - curBuffDescrip = txBdRing->txBdBase + index; - } while (index != txBdRing->txGenIdx); - - /* Check the frame length. */ - if (frameLen > ENET_FRAME_TX_LEN_LIMITATION(base)) - { - result = kStatus_ENET_TxFrameOverLen; - } - /* Return busy if idle BD is not enough. */ - else if (txBuffNum > idleDescNum) - { - result = kStatus_ENET_TxFrameBusy; - } - /* Check txDirtyRing if need frameinfo in tx interrupt callback. */ - else if (!ENET_TxDirtyRingAvailable(txDirtyRing)) - { - result = kStatus_ENET_TxFrameBusy; - } - else - { - txBuff = txFrame->txBuffArray; - do - { - assert(txBuff->buffer != NULL); - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->txMaintainEnable[ringId]) - { - DCACHE_CleanByRange((uint32_t)txBuff->buffer, txBuff->length); - } -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - /* Map loacl memory address to DMA for special platform. */ - buffer = (uint8_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)txBuff->buffer, kMEMORY_Local2DMA); -#else - buffer = txBuff->buffer; -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - - /* Set data buffer and length. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - curBuffDescrip->buffer = (uint8_t *)(uint32_t *)buffer; - curBuffDescrip->length = txBuff->length; - - /* Increase txBuffer array address and the buffer descriptor address. */ - txBuff++; - txBdRing->txGenIdx = ENET_IncreaseIndex(txBdRing->txGenIdx, txBdRing->txRingLen); - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - ENET_PrepareTxDesc(curBuffDescrip, &txFrame->txConfig); -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* Linked buffers */ - if (--txBuffNum != 0U) - { - /* Set BD ready flag and clean last BD flag. */ - configVal = (uint32_t)curBuffDescrip->control; - configVal &= ~ENET_BUFFDESCRIPTOR_TX_LAST_MASK; - configVal |= ENET_BUFFDESCRIPTOR_TX_READY_MASK; - curBuffDescrip->control = (uint16_t)configVal; - - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - else - { - curBuffDescrip->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK); - - /* Add context to frame info ring */ - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txGenIdx; - txDirty->context = txFrame->context; - txDirtyRing->txGenIdx = ENET_IncreaseIndex(txDirtyRing->txGenIdx, txDirtyRing->txRingLen); - if (txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) - { - txDirtyRing->isFull = true; - } - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - /* Active Tx BD everytime to speed up transfer */ - ENET_ActiveSendRing(base, ringId); - } while (txBuffNum != 0U); - } - return result; -} - -/*! - * deprecated Do not use this function. It has been superseded by @ref ENET_StartTxFrame. - */ -status_t ENET_SendFrameZeroCopy(ENET_Type *base, - enet_handle_t *handle, - const uint8_t *data, - uint32_t length, - uint8_t ringId, - bool tsFlag, - void *context) -{ - assert(handle != NULL); - assert(data != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - volatile enet_tx_bd_struct_t *curBuffDescrip; - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - enet_tx_dirty_ring_t *txDirtyRing = &handle->txDirtyRing[ringId]; - enet_frame_info_t *txDirty = NULL; - uint32_t len = 0; - uint32_t sizeleft = 0; - status_t result = kStatus_Success; - uint8_t *data_temp; - uint32_t configVal; - bool isReturn = false; - uint32_t primask; - - /* Check the frame length. */ - if (length > ENET_FRAME_TX_LEN_LIMITATION(base)) - { - result = kStatus_ENET_TxFrameOverLen; - } - else - { - /* Check if the transmit buffer is ready. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - if (0U != (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)) - { - result = kStatus_ENET_TxFrameBusy; - } - /* Check txDirtyRing if need frameinfo in tx interrupt callback. */ - else if (handle->txReclaimEnable[ringId] && !ENET_TxDirtyRingAvailable(txDirtyRing)) - { - result = kStatus_ENET_TxFrameBusy; - } - else - { - /* One transmit buffer is enough for one frame. */ - if (handle->txBuffSizeAlign[ringId] >= length) - { - /* Copy data to the buffer for uDMA transfer. */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - data = (uint8_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)data, kMEMORY_Local2DMA); -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - curBuffDescrip->buffer = (uint8_t *)(uint32_t)data; - /* Set data length. */ - curBuffDescrip->length = (uint16_t)length; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* For enable the timestamp. */ - if (tsFlag) - { - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK; - } - else - { - curBuffDescrip->controlExtend1 &= (uint16_t)(~ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK); - } - -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - curBuffDescrip->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK); - - /* Increase the buffer descriptor address. */ - txBdRing->txGenIdx = ENET_IncreaseIndex(txBdRing->txGenIdx, txBdRing->txRingLen); - - /* Add context to frame info ring */ - if (handle->txReclaimEnable[ringId]) - { - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txGenIdx; - txDirty->context = context; - txDirtyRing->txGenIdx = ENET_IncreaseIndex(txDirtyRing->txGenIdx, txDirtyRing->txRingLen); - if (txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) - { - txDirtyRing->isFull = true; - } - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor. */ - ENET_ActiveSendRing(base, ringId); - } - else - { - /* One frame requires more than one transmit buffers. */ - do - { -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* For enable the timestamp. */ - if (tsFlag) - { - curBuffDescrip->controlExtend1 |= ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK; - } - else - { - curBuffDescrip->controlExtend1 &= (uint16_t)(~ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK); - } -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - - /* Update the size left to be transmit. */ - sizeleft = length - len; -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET - data = (uint8_t *)MEMORY_ConvertMemoryMapAddress((uint32_t)data, kMEMORY_Local2DMA); -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - data_temp = (uint8_t *)(uint32_t)data + len; - - /* Increase the current software index of BD */ - txBdRing->txGenIdx = ENET_IncreaseIndex(txBdRing->txGenIdx, txBdRing->txRingLen); - - if (sizeleft > handle->txBuffSizeAlign[ringId]) - { - /* Set buffer. */ - curBuffDescrip->buffer = data_temp; - /* Data length update. */ - curBuffDescrip->length = handle->txBuffSizeAlign[ringId]; - len += handle->txBuffSizeAlign[ringId]; - /* Sets the control flag. */ - configVal = (uint32_t)curBuffDescrip->control; - configVal &= ~ENET_BUFFDESCRIPTOR_TX_LAST_MASK; - configVal |= ENET_BUFFDESCRIPTOR_TX_READY_MASK; - curBuffDescrip->control = (uint16_t)configVal; - - if (handle->txReclaimEnable[ringId]) - { - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor*/ - ENET_ActiveSendRing(base, ringId); - } - else - { - curBuffDescrip->buffer = data_temp; - curBuffDescrip->length = (uint16_t)sizeleft; - /* Set Last buffer wrap flag. */ - curBuffDescrip->control |= ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK; - - if (handle->txReclaimEnable[ringId]) - { - /* Add context to frame info ring */ - txDirty = txDirtyRing->txDirtyBase + txDirtyRing->txGenIdx; - txDirty->context = context; - txDirtyRing->txGenIdx = ENET_IncreaseIndex(txDirtyRing->txGenIdx, txDirtyRing->txRingLen); - if (txDirtyRing->txGenIdx == txDirtyRing->txConsumIdx) - { - txDirtyRing->isFull = true; - } - primask = DisableGlobalIRQ(); - txBdRing->txDescUsed++; - EnableGlobalIRQ(primask); - } - - /* Active the transmit buffer descriptor. */ - ENET_ActiveSendRing(base, ringId); - isReturn = true; - break; - } - /* Update buffer descriptor address. */ - curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - - } while (0U == (curBuffDescrip->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)); - - if (isReturn == false) - { - result = kStatus_ENET_TxFrameBusy; - } - } - } - } - return result; -} - -/*! - * brief Adds the ENET device to a multicast group. - * - * param base ENET peripheral base address. - * param address The six-byte multicast group address which is provided by application. - */ -void ENET_AddMulticastGroup(ENET_Type *base, uint8_t *address) -{ - assert(address != NULL); - - enet_handle_t *handle = s_ENETHandle[ENET_GetInstance(base)]; - uint32_t crc = 0xFFFFFFFFU; - uint32_t count1 = 0; - uint32_t count2 = 0; - uint32_t configVal = 0; - - /* Calculates the CRC-32 polynomial on the multicast group address. */ - for (count1 = 0; count1 < ENET_FRAME_MACLEN; count1++) - { - uint8_t c = address[count1]; - for (count2 = 0; count2 < 0x08U; count2++) - { - if (0U != ((c ^ crc) & 1U)) - { - crc >>= 1U; - c >>= 1U; - crc ^= 0xEDB88320U; - } - else - { - crc >>= 1U; - c >>= 1U; - } - } - } - - crc = crc >> 26U; - - handle->multicastCount[crc]++; - - /* Enable a multicast group address. */ - configVal = ((uint32_t)1U << (crc & 0x1FU)); - - if (0U != (crc & 0x20U)) - { - base->GAUR |= configVal; - } - else - { - base->GALR |= configVal; - } -} - -/*! - * brief Moves the ENET device from a multicast group. - * - * param base ENET peripheral base address. - * param address The six-byte multicast group address which is provided by application. - */ -void ENET_LeaveMulticastGroup(ENET_Type *base, uint8_t *address) -{ - assert(address != NULL); - - enet_handle_t *handle = s_ENETHandle[ENET_GetInstance(base)]; - uint32_t crc = 0xFFFFFFFFU; - uint32_t count1 = 0; - uint32_t count2 = 0; - uint32_t configVal = 0; - - /* Calculates the CRC-32 polynomial on the multicast group address. */ - for (count1 = 0; count1 < ENET_FRAME_MACLEN; count1++) - { - uint8_t c = address[count1]; - for (count2 = 0; count2 < 0x08U; count2++) - { - if (0U != ((c ^ crc) & 1U)) - { - crc >>= 1U; - c >>= 1U; - crc ^= 0xEDB88320U; - } - else - { - crc >>= 1U; - c >>= 1U; - } - } - } - - crc = crc >> 26U; - - handle->multicastCount[crc]--; - - /* Set the hash table if no collisions */ - if (0U == handle->multicastCount[crc]) - { - configVal = ~((uint32_t)1U << (crc & 0x1FU)); - - if (0U != (crc & 0x20U)) - { - base->GAUR &= configVal; - } - else - { - base->GALR &= configVal; - } - } -} - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! - * brief Gets the ENET transmit frame statistics after the data send for specified ring. - * - * This interface gets the error statistics of the transmit frame. - * Because the error information is reported by the uDMA after the data delivery, this interface - * should be called after the data transmit API. It is recommended to call this function on - * transmit interrupt handler. After calling the ENET_SendFrame, the - * transmit interrupt notifies the transmit completion. - * - * param handle The PTP handler pointer. This is the same handler pointer used in the ENET_Init. - * param eErrorStatic The error statistics structure pointer. - * param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - * return The execute status. - */ -status_t ENET_GetTxErrAfterSendFrame(enet_handle_t *handle, enet_data_error_stats_t *eErrorStatic, uint8_t ringId) -{ - assert(handle != NULL); - assert(eErrorStatic != NULL); - assert(ringId < (uint8_t)FSL_FEATURE_ENET_QUEUE); - - uint16_t control = 0; - uint16_t controlExt = 0; - status_t result = kStatus_Success; - bool isReturn = false; - enet_tx_bd_ring_t *txBdRing = &handle->txBdRing[ringId]; - volatile enet_tx_bd_struct_t *curBuffDescrip = txBdRing->txBdBase + txBdRing->txGenIdx; - - do - { - /* Get the current dirty transmit buffer descriptor. */ - control = handle->txBdDirtyStatic[ringId]->control; - controlExt = handle->txBdDirtyStatic[ringId]->controlExtend0; - - /* Get the control status data, If the buffer descriptor has not been processed break out. */ - if (0U != (control & ENET_BUFFDESCRIPTOR_TX_READY_MASK)) - { - result = kStatus_ENET_TxFrameBusy; - isReturn = true; - break; - } - - /* Increase the transmit dirty static pointer. */ - if (0U != (handle->txBdDirtyStatic[ringId]->control & ENET_BUFFDESCRIPTOR_TX_WRAP_MASK)) - { - handle->txBdDirtyStatic[ringId] = txBdRing->txBdBase; - } - else - { - handle->txBdDirtyStatic[ringId]++; - } - - /* If the transmit buffer descriptor is ready and the last buffer descriptor, store packet statistic. */ - if (0U != (control & ENET_BUFFDESCRIPTOR_TX_LAST_MASK)) - { - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_TX_ERR_MASK)) - { - /* Transmit error. */ - eErrorStatic->statsTxErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_TX_EXCCOLLISIONERR_MASK)) - { - /* Transmit excess collision error. */ - eErrorStatic->statsTxExcessCollisionErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_TX_LATECOLLISIONERR_MASK)) - { - /* Transmit late collision error. */ - eErrorStatic->statsTxLateCollisionErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_TX_UNDERFLOWERR_MASK)) - { - /* Transmit under flow error. */ - eErrorStatic->statsTxUnderFlowErr++; - } - if (0U != (controlExt & ENET_BUFFDESCRIPTOR_TX_OVERFLOWERR_MASK)) - { - /* Transmit over flow error. */ - eErrorStatic->statsTxOverFlowErr++; - } - isReturn = true; - break; - } - - } while (handle->txBdDirtyStatic[ringId] != curBuffDescrip); - - if (isReturn == false) - { - result = kStatus_ENET_TxFrameFail; - } - return result; -} - -void ENET_Ptp1588ConfigureHandler(ENET_Type *base, enet_handle_t *handle, enet_ptp_config_t *ptpConfig) -{ - assert(handle != NULL); - assert(ptpConfig != NULL); - uint8_t count; - - uint32_t mask = (uint32_t)kENET_TxBufferInterrupt; -#if FSL_FEATURE_ENET_QUEUE > 1 - mask |= (uint32_t)kENET_TxBuffer1Interrupt | (uint32_t)kENET_TxBuffer2Interrupt; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - - for (count = 0; count < handle->ringNum; count++) - { - handle->txBdDirtyStatic[count] = handle->txBdRing[count].txBdBase; - } - - /* Setting the receive and transmit state for transaction. */ - handle->msTimerSecond = 0; - -#if defined(FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID) && FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID - uint32_t refClock; - - /* The minimum time is defined by the greater of either six register clock cycles or six ptp clock cycles. */ - if (handle->enetClock <= ptpConfig->ptp1588ClockSrc_Hz) - { - /* Caculate how many core cycles delay is needed. */ - /* In the cases with this IP design issue, core clock = enetClock */ - handle->tsDelayCount = 6U * handle->enetClock; - } - else - { - refClock = ptpConfig->ptp1588ClockSrc_Hz; - - /* Caculate how many core cycles delay is needed. */ - /* In the cases with this IP design issue, core clock = enetClock */ - handle->tsDelayCount = 6U * ((handle->enetClock + refClock - 1U) / refClock); - } - -#endif - - ENET_DisableInterrupts(base, mask); - - /* Set the IRQ handler when the interrupt is enabled. */ - ENET_SetTsISRHandler(base, ENET_TimeStampIRQHandler); - ENET_SetTxISRHandler(base, ENET_TransmitIRQHandler); - - /* Enables the time stamp interrupt and transmit frame interrupt to - * handle the time-stamp . */ - ENET_EnableInterrupts(base, (ENET_TS_INTERRUPT | ENET_TX_INTERRUPT)); -} - -/*! - * brief Configures the ENET PTP IEEE 1588 feature with the basic configuration. - * The function sets the clock for PTP 1588 timer and enables - * time stamp interrupts and transmit interrupts for PTP 1588 features. - * This API should be called when the 1588 feature is enabled - * or the ENET_ENHANCEDBUFFERDESCRIPTOR_MODE is defined. - * ENET_Init should be called before calling this API. - * - * note The PTP 1588 time-stamp second increase though time-stamp interrupt handler - * and the transmit time-stamp store is done through transmit interrupt handler. - * As a result, the TS interrupt and TX interrupt are enabled when you call this API. - * - * param base ENET peripheral base address. - * param handle ENET handler pointer. - * param ptpConfig The ENET PTP1588 configuration. - */ -void ENET_Ptp1588Configure(ENET_Type *base, enet_handle_t *handle, enet_ptp_config_t *ptpConfig) -{ - assert(handle != NULL); - assert(ptpConfig != NULL); - - /* Start the 1588 timer. */ - ENET_Ptp1588StartTimer(base, ptpConfig->ptp1588ClockSrc_Hz); - - ENET_Ptp1588ConfigureHandler(base, handle, ptpConfig); -} - -/*! - * brief Starts the ENET PTP 1588 Timer. - * This function is used to initialize the PTP timer. After the PTP starts, - * the PTP timer starts running. - * - * param base ENET peripheral base address. - * param ptpClkSrc The clock source of the PTP timer. - */ -void ENET_Ptp1588StartTimer(ENET_Type *base, uint32_t ptpClkSrc) -{ - /* Restart PTP 1588 timer, master clock. */ - base->ATCR = ENET_ATCR_RESTART_MASK; - - /* Initializes PTP 1588 timer. */ - base->ATINC = ENET_ATINC_INC(ENET_NANOSECOND_ONE_SECOND / ptpClkSrc); - base->ATPER = ENET_NANOSECOND_ONE_SECOND; - /* Sets periodical event and the event signal output assertion and Actives PTP 1588 timer. */ - base->ATCR = ENET_ATCR_PEREN_MASK | ENET_ATCR_PINPER_MASK | ENET_ATCR_EN_MASK; -} - -/*! - * brief Gets the current ENET time from the PTP 1588 timer. - * Interrupts are not disabled. - * - * param base ENET peripheral base address. - * param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * param ptpTime The PTP timer structure. - */ -void ENET_Ptp1588GetTimerNoIrqDisable(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime) -{ - /* Get the current PTP time. */ - ptpTime->second = handle->msTimerSecond; - /* Get the nanosecond from the master timer. */ - base->ATCR |= ENET_ATCR_CAPTURE_MASK; - -#if defined(FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID) && FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID - /* The whole while loop includes at least three instructions(subs, nop and bne). */ - uint32_t count = (handle->tsDelayCount + 3U - 1U) / 3U; - - while (0U != (count--)) - { - __NOP(); - } -#else - /* Wait for capture over */ - while (0U != (base->ATCR & ENET_ATCR_CAPTURE_MASK)) - { - } -#endif - - /* Get the captured time. */ - ptpTime->nanosecond = base->ATVR; -} - -/*! - * brief Gets the current ENET time from the PTP 1588 timer. - * - * param base ENET peripheral base address. - * param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * param ptpTime The PTP timer structure. - */ -void ENET_Ptp1588GetTimer(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime) -{ - assert(handle != NULL); - assert(ptpTime != NULL); - uint32_t primask; - - /* Disables the interrupt. */ - primask = DisableGlobalIRQ(); - - ENET_Ptp1588GetTimerNoIrqDisable(base, handle, ptpTime); - - /* Get PTP timer wrap event. */ - if (0U != (base->EIR & (uint32_t)kENET_TsTimerInterrupt)) - { - ptpTime->second++; - } - - /* Enables the interrupt. */ - EnableGlobalIRQ(primask); -} - -/*! - * brief Sets the ENET PTP 1588 timer to the assigned time. - * - * param base ENET peripheral base address. - * param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * param ptpTime The timer to be set to the PTP timer. - */ -void ENET_Ptp1588SetTimer(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime) -{ - assert(handle != NULL); - assert(ptpTime != NULL); - - uint32_t primask; - - /* Disables the interrupt. */ - primask = DisableGlobalIRQ(); - - /* Sets PTP timer. */ - handle->msTimerSecond = ptpTime->second; - base->ATVR = ptpTime->nanosecond; - - /* Enables the interrupt. */ - EnableGlobalIRQ(primask); -} - -/*! - * brief Adjusts the ENET PTP 1588 timer. - * - * param base ENET peripheral base address. - * param corrIncrease The correction increment value. This value is added every time the correction - * timer expires. A value less than the PTP timer frequency(1/ptpClkSrc) slows down the timer, - * a value greater than the 1/ptpClkSrc speeds up the timer. - * param corrPeriod The PTP timer correction counter wrap-around value. This defines after how - * many timer clock the correction counter should be reset and trigger a correction - * increment on the timer. A value of 0 disables the correction counter and no correction occurs. - */ -void ENET_Ptp1588AdjustTimer(ENET_Type *base, uint32_t corrIncrease, uint32_t corrPeriod) -{ - /* Set correction for PTP timer increment. */ - base->ATINC = (base->ATINC & ~ENET_ATINC_INC_CORR_MASK) | (corrIncrease << ENET_ATINC_INC_CORR_SHIFT); - /* Set correction for PTP timer period. */ - base->ATCOR = (base->ATCOR & ~ENET_ATCOR_COR_MASK) | (corrPeriod << ENET_ATCOR_COR_SHIFT); -} - -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB -/*! - * brief Sets the ENET AVB feature. - * - * ENET AVB feature configuration, set the Receive classification match and transmit - * bandwidth. This API is called when the AVB feature is required. - * - * Note: The AVB frames transmission scheme is credit-based tx scheme and it's only supported - * with the Enhanced buffer descriptors. so the AVB configuration should only done with - * Enhanced buffer descriptor. so when the AVB feature is required, please make sure the - * the "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" is defined. - * - * param base ENET peripheral base address. - * param handle ENET handler pointer. - * param config The ENET AVB feature configuration structure. - */ -void ENET_AVBConfigure(ENET_Type *base, enet_handle_t *handle, const enet_avb_config_t *config) -{ - assert(config != NULL); - assert(FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) != -1); - - uint8_t count = 0; - - for (count = 0; count < (uint8_t)FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) - 1U; count++) - { - /* Set the AVB receive ring classification match when the match is not 0. */ - if (0U != (config->rxClassifyMatch[count])) - { - base->RCMR[count] = ((uint32_t)config->rxClassifyMatch[count] & 0xFFFFU) | ENET_RCMR_MATCHEN_MASK; - } - /* Set the dma controller for the extended ring. */ - base->DMACFG[count] |= ENET_DMACFG_IDLE_SLOPE(config->idleSlope[count]); - } - - /* Shall use the credit-based scheme for avb. */ - base->QOS &= ~ENET_QOS_TX_SCHEME_MASK; - base->QOS |= ENET_QOS_RX_FLUSH0_MASK; -} -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -#if FSL_FEATURE_ENET_QUEUE > 1 -/*! - * brief The transmit IRQ handler. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. - */ -void ENET_TransmitIRQHandler(ENET_Type *base, enet_handle_t *handle, uint32_t ringId) -#else -/*! - * brief The transmit IRQ handler. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. - */ -void ENET_TransmitIRQHandler(ENET_Type *base, enet_handle_t *handle) -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -{ - assert(handle != NULL); - uint32_t mask = (uint32_t)kENET_TxBufferInterrupt | (uint32_t)kENET_TxFrameInterrupt; - uint32_t index = 0; - uint32_t irq; - -/* Check if the transmit interrupt happen. */ -#if FSL_FEATURE_ENET_QUEUE > 1 - switch (ringId) - { - case kENET_Ring1: - mask = ((uint32_t)kENET_TxFrame1Interrupt | (uint32_t)kENET_TxBuffer1Interrupt); - break; - case kENET_Ring2: - mask = ((uint32_t)kENET_TxFrame2Interrupt | (uint32_t)kENET_TxBuffer2Interrupt); - break; - default: - mask = (uint32_t)kENET_TxBufferInterrupt | (uint32_t)kENET_TxFrameInterrupt; - break; - } - index = ringId; -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - - while (0U != (mask & base->EIR)) - { - irq = base->EIR; - - /* Clear the transmit interrupt event. */ - base->EIR = mask; - - /* Callback Handler. */ - if (handle->txReclaimEnable[index] && (0U != (irq & (uint32_t)kENET_TxFrameInterrupt))) - { - ENET_ReclaimTxDescriptor(base, handle, (uint8_t)index); - } - else - { - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, index, kENET_TxEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_TxEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - } -} - -/*! - * brief The receive IRQ handler. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. - */ -#if FSL_FEATURE_ENET_QUEUE > 1 -void ENET_ReceiveIRQHandler(ENET_Type *base, enet_handle_t *handle, uint32_t ringId) -#else -void ENET_ReceiveIRQHandler(ENET_Type *base, enet_handle_t *handle) -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -{ - assert(handle != NULL); - uint32_t mask = (uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_RxBufferInterrupt; - -/* Check if the receive interrupt happen. */ -#if FSL_FEATURE_ENET_QUEUE > 1 - switch (ringId) - { - case kENET_Ring1: - mask = ((uint32_t)kENET_RxFrame1Interrupt | (uint32_t)kENET_RxBuffer1Interrupt); - break; - case kENET_Ring2: - mask = ((uint32_t)kENET_RxFrame2Interrupt | (uint32_t)kENET_RxBuffer2Interrupt); - break; - default: - mask = (uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_RxBufferInterrupt; - break; - } -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - - while (0U != (mask & base->EIR)) - { - /* Clear the transmit interrupt event. */ - base->EIR = mask; - - /* Callback function. */ - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, ringId, kENET_RxEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_RxEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } -} - -/*! - * brief Some special IRQ handler including the error, mii, wakeup irq handler. - * - * param base ENET peripheral base address. - * param handle The ENET handler pointer. - */ -void ENET_ErrorIRQHandler(ENET_Type *base, enet_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t errMask = (uint32_t)kENET_BabrInterrupt | (uint32_t)kENET_BabtInterrupt | (uint32_t)kENET_EBusERInterrupt | - (uint32_t)kENET_PayloadRxInterrupt | (uint32_t)kENET_LateCollisionInterrupt | - (uint32_t)kENET_RetryLimitInterrupt | (uint32_t)kENET_UnderrunInterrupt; - - /* Check if the error interrupt happen. */ - if (0U != ((uint32_t)kENET_WakeupInterrupt & base->EIR)) - { - /* Clear the wakeup interrupt. */ - base->EIR = (uint32_t)kENET_WakeupInterrupt; - /* wake up and enter the normal mode. */ - ENET_EnableSleepMode(base, false); - /* Callback function. */ - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, 0, kENET_WakeUpEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_WakeUpEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - else - { - /* Clear the error interrupt event status. */ - errMask &= base->EIR; - base->EIR = errMask; - /* Callback function. */ - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, 0, kENET_ErrEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_ErrEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } -} - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! - * brief The IEEE 1588 PTP time stamp interrupt handler. - * - * param base ENET peripheral base address. - * param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - */ -void ENET_TimeStampIRQHandler(ENET_Type *base, enet_handle_t *handle) -{ - assert(handle != NULL); - - /* Check if the PTP time stamp interrupt happen. */ - if (0U != ((uint32_t)kENET_TsTimerInterrupt & base->EIR)) - { - /* Clear the time stamp interrupt. */ - base->EIR = (uint32_t)kENET_TsTimerInterrupt; - - /* Increase timer second counter. */ - handle->msTimerSecond++; - - /* Callback function. */ - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, 0, kENET_TimeStampEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_TimeStampEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - - if (0U != ((uint32_t)kENET_TsAvailInterrupt & base->EIR)) - { - /* Clear the time stamp interrupt. */ - base->EIR = (uint32_t)kENET_TsAvailInterrupt; - /* Callback function. */ - if (NULL != handle->callback) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - handle->callback(base, handle, 0, kENET_TimeStampAvailEvent, NULL, handle->userData); -#else - handle->callback(base, handle, kENET_TimeStampAvailEvent, NULL, handle->userData); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } -} -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! - * brief the common IRQ handler for the tx/rx/error etc irq handler. - * - * This is used for the combined tx/rx/error interrupt for single/mutli-ring (frame 0). - * - * param base ENET peripheral base address. - */ -void ENET_CommonFrame0IRQHandler(ENET_Type *base) -{ - uint32_t event = base->EIR; - uint32_t instance = ENET_GetInstance(base); - - event &= base->EIMR; - if (0U != (event & ((uint32_t)kENET_TxBufferInterrupt | (uint32_t)kENET_TxFrameInterrupt))) - { - if (s_enetTxIsr[instance] != NULL) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - s_enetTxIsr[instance](base, s_ENETHandle[instance], 0); -#else - s_enetTxIsr[instance](base, s_ENETHandle[instance]); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - - if (0U != (event & ((uint32_t)kENET_RxBufferInterrupt | (uint32_t)kENET_RxFrameInterrupt))) - { - if (s_enetRxIsr[instance] != NULL) - { -#if FSL_FEATURE_ENET_QUEUE > 1 - s_enetRxIsr[instance](base, s_ENETHandle[instance], 0); -#else - s_enetRxIsr[instance](base, s_ENETHandle[instance]); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - } - } - - if (0U != (event & ENET_TS_INTERRUPT) && (NULL != s_enetTsIsr[instance])) - { - s_enetTsIsr[instance](base, s_ENETHandle[instance]); - } - if (0U != (event & ENET_ERR_INTERRUPT) && (NULL != s_enetErrIsr[instance])) - { - s_enetErrIsr[instance](base, s_ENETHandle[instance]); - } -} - -#if FSL_FEATURE_ENET_QUEUE > 1 -/*! - * brief the common IRQ handler for the tx/rx irq handler. - * - * This is used for the combined tx/rx interrupt for multi-ring (frame 1). - * - * param base ENET peripheral base address. - */ -void ENET_CommonFrame1IRQHandler(ENET_Type *base) -{ - uint32_t event = base->EIR; - uint32_t instance = ENET_GetInstance(base); - - event &= base->EIMR; - if (0U != (event & ((uint32_t)kENET_TxBuffer1Interrupt | (uint32_t)kENET_TxFrame1Interrupt))) - { - if (s_enetTxIsr[instance] != NULL) - { - s_enetTxIsr[instance](base, s_ENETHandle[instance], 1); - } - } - - if (0U != (event & ((uint32_t)kENET_RxBuffer1Interrupt | (uint32_t)kENET_RxFrame1Interrupt))) - { - if (s_enetRxIsr[instance] != NULL) - { - s_enetRxIsr[instance](base, s_ENETHandle[instance], 1); - } - } -} - -/*! - * brief the common IRQ handler for the tx/rx irq handler. - * - * This is used for the combined tx/rx interrupt for multi-ring (frame 2). - * - * param base ENET peripheral base address. - */ -void ENET_CommonFrame2IRQHandler(ENET_Type *base) -{ - uint32_t event = base->EIR; - uint32_t instance = ENET_GetInstance(base); - - event &= base->EIMR; - if (0U != (event & ((uint32_t)kENET_TxBuffer2Interrupt | (uint32_t)kENET_TxFrame2Interrupt))) - { - if (s_enetTxIsr[instance] != NULL) - { - s_enetTxIsr[instance](base, s_ENETHandle[instance], 2); - } - } - - if (0U != (event & ((uint32_t)kENET_RxBuffer2Interrupt | (uint32_t)kENET_RxFrame2Interrupt))) - { - if (s_enetRxIsr[instance] != NULL) - { - s_enetRxIsr[instance](base, s_ENETHandle[instance], 2); - } - } -} -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - -void ENET_Ptp1588IRQHandler(ENET_Type *base) -{ - uint32_t instance = ENET_GetInstance(base); - -#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - /* In some platforms, the 1588 event uses same irq with timestamp event. */ - if ((s_enetTsIrqId[instance] == s_enet1588TimerIrqId[instance]) && (s_enetTsIrqId[instance] != NotAvail_IRQn)) - { - uint32_t event = base->EIR; - event &= base->EIMR; - if (0U != (event & ((uint32_t)kENET_TsTimerInterrupt | (uint32_t)kENET_TsAvailInterrupt))) - { - if (s_enetTsIsr[instance] != NULL) - { - s_enetTsIsr[instance](base, s_ENETHandle[instance]); - } - } - } -#endif - - if (s_enet1588TimerIsr[instance] != NULL) - { - s_enet1588TimerIsr[instance](base, s_ENETHandle[instance]); - } -} - -#if defined(ENET) -#if FSL_FEATURE_ENET_QUEUE < 2 -void ENET_TxIRQHandler(ENET_Type *base); -void ENET_TxIRQHandler(ENET_Type *base) -{ - uint32_t instance = ENET_GetInstance(base); - - if (s_enetTxIsr[instance] != NULL) - { - s_enetTxIsr[instance](base, s_ENETHandle[instance]); - } - SDK_ISR_EXIT_BARRIER; -} - -void ENET_RxIRQHandler(ENET_Type *base); -void ENET_RxIRQHandler(ENET_Type *base) -{ - uint32_t instance = ENET_GetInstance(base); - - if (s_enetRxIsr[instance] != NULL) - { - s_enetRxIsr[instance](base, s_ENETHandle[instance]); - } -} - -void ENET_ErrIRQHandler(ENET_Type *base); -void ENET_ErrIRQHandler(ENET_Type *base) -{ - uint32_t instance = ENET_GetInstance(base); - - if (s_enetErrIsr[instance] != NULL) - { - s_enetErrIsr[instance](base, s_ENETHandle[instance]); - } -} - -void ENET_Transmit_DriverIRQHandler(void); -void ENET_Transmit_DriverIRQHandler(void) -{ - ENET_TxIRQHandler(ENET); - SDK_ISR_EXIT_BARRIER; -} - -void ENET_Receive_DriverIRQHandler(void); -void ENET_Receive_DriverIRQHandler(void) -{ - ENET_RxIRQHandler(ENET); - SDK_ISR_EXIT_BARRIER; -} - -void ENET_Error_DriverIRQHandler(void); -void ENET_Error_DriverIRQHandler(void) -{ - ENET_ErrIRQHandler(ENET); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_ENET_QUEUE < 2 */ - -void ENET_DriverIRQHandler(void); -void ENET_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(ENET); - SDK_ISR_EXIT_BARRIER; -} - -void ENET_1588_Timer_DriverIRQHandler(void); -void ENET_1588_Timer_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(ENET); - SDK_ISR_EXIT_BARRIER; -} -#endif /* ENET */ - -#if defined(ENET1) -void ENET1_DriverIRQHandler(void); -void ENET1_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(ENET1); - SDK_ISR_EXIT_BARRIER; -} -#endif /* ENET1 */ - -#if defined(ENET2) -void ENET2_DriverIRQHandler(void); -void ENET2_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(ENET2); - SDK_ISR_EXIT_BARRIER; -} - -void ENET2_1588_Timer_DriverIRQHandler(void); -void ENET2_1588_Timer_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(ENET2); - SDK_ISR_EXIT_BARRIER; -} -#endif /* ENET2 */ - -#if defined(CONNECTIVITY__ENET0) -void CONNECTIVITY_ENET0_FRAME0_EVENT_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET0_FRAME0_EVENT_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(CONNECTIVITY__ENET0); - SDK_ISR_EXIT_BARRIER; -} -#if FSL_FEATURE_ENET_QUEUE > 1 -void CONNECTIVITY_ENET0_FRAME1_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET0_FRAME1_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame1IRQHandler(CONNECTIVITY__ENET0); - SDK_ISR_EXIT_BARRIER; -} -void CONNECTIVITY_ENET0_FRAME2_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET0_FRAME2_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame2IRQHandler(CONNECTIVITY__ENET0); - SDK_ISR_EXIT_BARRIER; -} -void CONNECTIVITY_ENET0_TIMER_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET0_TIMER_INT_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(CONNECTIVITY__ENET0); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -#endif /* CONNECTIVITY__ENET0 */ -#if defined(CONNECTIVITY__ENET1) -void CONNECTIVITY_ENET1_FRAME0_EVENT_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET1_FRAME0_EVENT_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(CONNECTIVITY__ENET1); - SDK_ISR_EXIT_BARRIER; -} -#if FSL_FEATURE_ENET_QUEUE > 1 -void CONNECTIVITY_ENET1_FRAME1_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET1_FRAME1_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame1IRQHandler(CONNECTIVITY__ENET1); - SDK_ISR_EXIT_BARRIER; -} -void CONNECTIVITY_ENET1_FRAME2_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET1_FRAME2_INT_DriverIRQHandler(void) -{ - ENET_CommonFrame2IRQHandler(CONNECTIVITY__ENET1); - SDK_ISR_EXIT_BARRIER; -} -void CONNECTIVITY_ENET1_TIMER_INT_DriverIRQHandler(void); -void CONNECTIVITY_ENET1_TIMER_INT_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(CONNECTIVITY__ENET1); - SDK_ISR_EXIT_BARRIER; -} -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -#endif /* CONNECTIVITY__ENET1 */ -#if FSL_FEATURE_ENET_QUEUE > 1 -#if defined(ENET_1G) -void ENET_1G_DriverIRQHandler(void); -void ENET_1G_DriverIRQHandler(void) -{ - ENET_CommonFrame0IRQHandler(ENET_1G); - SDK_ISR_EXIT_BARRIER; -} -void ENET_1G_MAC0_Tx_Rx_1_DriverIRQHandler(void); -void ENET_1G_MAC0_Tx_Rx_1_DriverIRQHandler(void) -{ - ENET_CommonFrame1IRQHandler(ENET_1G); - SDK_ISR_EXIT_BARRIER; -} -void ENET_1G_MAC0_Tx_Rx_2_DriverIRQHandler(void); -void ENET_1G_MAC0_Tx_Rx_2_DriverIRQHandler(void) -{ - ENET_CommonFrame2IRQHandler(ENET_1G); - SDK_ISR_EXIT_BARRIER; -} -void ENET_1G_1588_Timer_DriverIRQHandler(void); -void ENET_1G_1588_Timer_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(ENET_1G); - SDK_ISR_EXIT_BARRIER; -} -#endif /* ENET_1G */ - -#if defined(ENET1) -void ENET1_MAC0_Rx_Tx_Done0_DriverIRQHandler(void); -void ENET1_MAC0_Rx_Tx_Done0_DriverIRQHandler(void) -{ - ENET_CommonFrame1IRQHandler(ENET1); - SDK_ISR_EXIT_BARRIER; -} -void ENET1_MAC0_Rx_Tx_Done1_DriverIRQHandler(void); -void ENET1_MAC0_Rx_Tx_Done1_DriverIRQHandler(void) -{ - ENET_CommonFrame2IRQHandler(ENET1); - SDK_ISR_EXIT_BARRIER; -} -void ENET1_1588_Timer_DriverIRQHandler(void); -void ENET1_1588_Timer_DriverIRQHandler(void) -{ - ENET_Ptp1588IRQHandler(ENET1); - SDK_ISR_EXIT_BARRIER; -} -#endif /* ENET1 */ -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ diff --git a/devices/MIMXRT1052/drivers/fsl_enet.h b/devices/MIMXRT1052/drivers/fsl_enet.h deleted file mode 100644 index 6c6a087..0000000 --- a/devices/MIMXRT1052/drivers/fsl_enet.h +++ /dev/null @@ -1,1993 +0,0 @@ -/* - * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_ENET_H_ -#define _FSL_ENET_H_ - -#include "fsl_common.h" -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#include "fsl_memory.h" -#endif -/*! - * @addtogroup enet - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief Defines the driver version. */ -#define FSL_ENET_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) -/*@}*/ - -/*! @name ENET DESCRIPTOR QUEUE */ -/*@{*/ -/*! @brief Defines the queue number. */ -#ifndef FSL_FEATURE_ENET_QUEUE -#define FSL_FEATURE_ENET_QUEUE 1 /* Singal queue for previous IP. */ -#endif -/*@}*/ - -/*! @name Control and status region bit masks of the receive buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_RX_EMPTY_MASK 0x8000U /*!< Empty bit mask. */ -#define ENET_BUFFDESCRIPTOR_RX_SOFTOWNER1_MASK 0x4000U /*!< Software owner one mask. */ -#define ENET_BUFFDESCRIPTOR_RX_WRAP_MASK 0x2000U /*!< Next buffer descriptor is the start address. */ -#define ENET_BUFFDESCRIPTOR_RX_SOFTOWNER2_Mask 0x1000U /*!< Software owner two mask. */ -#define ENET_BUFFDESCRIPTOR_RX_LAST_MASK 0x0800U /*!< Last BD of the frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_MISS_MASK 0x0100U /*!< Received because of the promiscuous mode. */ -#define ENET_BUFFDESCRIPTOR_RX_BROADCAST_MASK 0x0080U /*!< Broadcast packet mask. */ -#define ENET_BUFFDESCRIPTOR_RX_MULTICAST_MASK 0x0040U /*!< Multicast packet mask. */ -#define ENET_BUFFDESCRIPTOR_RX_LENVLIOLATE_MASK 0x0020U /*!< Length violation mask. */ -#define ENET_BUFFDESCRIPTOR_RX_NOOCTET_MASK 0x0010U /*!< Non-octet aligned frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_CRC_MASK 0x0004U /*!< CRC error mask. */ -#define ENET_BUFFDESCRIPTOR_RX_OVERRUN_MASK 0x0002U /*!< FIFO overrun mask. */ -#define ENET_BUFFDESCRIPTOR_RX_TRUNC_MASK 0x0001U /*!< Frame is truncated mask. */ -/*@}*/ - -/*! @name Control and status bit masks of the transmit buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_TX_READY_MASK 0x8000U /*!< Ready bit mask. */ -#define ENET_BUFFDESCRIPTOR_TX_SOFTOWENER1_MASK 0x4000U /*!< Software owner one mask. */ -#define ENET_BUFFDESCRIPTOR_TX_WRAP_MASK 0x2000U /*!< Wrap buffer descriptor mask. */ -#define ENET_BUFFDESCRIPTOR_TX_SOFTOWENER2_MASK 0x1000U /*!< Software owner two mask. */ -#define ENET_BUFFDESCRIPTOR_TX_LAST_MASK 0x0800U /*!< Last BD of the frame mask. */ -#define ENET_BUFFDESCRIPTOR_TX_TRANMITCRC_MASK 0x0400U /*!< Transmit CRC mask. */ -/*@}*/ - -/* Extended control regions for enhanced buffer descriptors. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! @name First extended control region bit masks of the receive buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_RX_IPV4_MASK 0x0001U /*!< Ipv4 frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_IPV6_MASK 0x0002U /*!< Ipv6 frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_VLAN_MASK 0x0004U /*!< VLAN frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_PROTOCOLCHECKSUM_MASK 0x0010U /*!< Protocol checksum error mask. */ -#define ENET_BUFFDESCRIPTOR_RX_IPHEADCHECKSUM_MASK 0x0020U /*!< IP header checksum error mask. */ -/*@}*/ - -/*! @name Second extended control region bit masks of the receive buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_RX_INTERRUPT_MASK 0x0080U /*!< BD interrupt mask. */ -#define ENET_BUFFDESCRIPTOR_RX_UNICAST_MASK 0x0100U /*!< Unicast frame mask. */ -#define ENET_BUFFDESCRIPTOR_RX_COLLISION_MASK 0x0200U /*!< BD collision mask. */ -#define ENET_BUFFDESCRIPTOR_RX_PHYERR_MASK 0x0400U /*!< PHY error mask. */ -#define ENET_BUFFDESCRIPTOR_RX_MACERR_MASK 0x8000U /*!< Mac error mask. */ -/*@}*/ - -/*! @name First extended control region bit masks of the transmit buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_TX_ERR_MASK 0x8000U /*!< Transmit error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_UNDERFLOWERR_MASK 0x2000U /*!< Underflow error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_EXCCOLLISIONERR_MASK 0x1000U /*!< Excess collision error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_FRAMEERR_MASK 0x0800U /*!< Frame error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_LATECOLLISIONERR_MASK 0x0400U /*!< Late collision error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_OVERFLOWERR_MASK 0x0200U /*!< Overflow error mask. */ -#define ENET_BUFFDESCRIPTOR_TX_TIMESTAMPERR_MASK 0x0100U /*!< Timestamp error mask. */ -/*@}*/ - -/*! @name Second extended control region bit masks of the transmit buffer descriptor. */ -/*@{*/ -#define ENET_BUFFDESCRIPTOR_TX_INTERRUPT_MASK 0x4000U /*!< Interrupt mask. */ -#define ENET_BUFFDESCRIPTOR_TX_TIMESTAMP_MASK 0x2000U /*!< Timestamp flag mask. */ -#define ENET_BUFFDESCRIPTOR_TX_PROTOCHECKSUM_MASK 0x1000U /*!< Protocal checksum mask. */ -#define ENET_BUFFDESCRIPTOR_TX_IPCHECKSUM_MASK 0x0800U /*!< IP header checksum flag mask. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB -#define ENET_BUFFDESCRIPTOR_TX_USETXLAUNCHTIME_MASK 0x0100U /*!< Use the transmit launch time. */ -#define ENET_BUFFDESCRIPTOR_TX_FRAMETYPE_MASK 0x00F0U /*!< Frame type mask. */ -#define ENET_BUFFDESCRIPTOR_TX_FRAMETYPE_SHIFT 4U /*!< Frame type shift. */ -#define ENET_BD_FTYPE(n) \ - (((uint32_t)(n) << ENET_BUFFDESCRIPTOR_TX_FRAMETYPE_SHIFT) & ENET_BUFFDESCRIPTOR_TX_FRAMETYPE_MASK) -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -/*@}*/ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! @brief Defines the receive error status flag mask. */ -#define ENET_BUFFDESCRIPTOR_RX_ERR_MASK \ - (ENET_BUFFDESCRIPTOR_RX_TRUNC_MASK | ENET_BUFFDESCRIPTOR_RX_OVERRUN_MASK | \ - ENET_BUFFDESCRIPTOR_RX_LENVLIOLATE_MASK | ENET_BUFFDESCRIPTOR_RX_NOOCTET_MASK | ENET_BUFFDESCRIPTOR_RX_CRC_MASK) -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -#define ENET_BUFFDESCRIPTOR_RX_EXT_ERR_MASK \ - (ENET_BUFFDESCRIPTOR_RX_MACERR_MASK | ENET_BUFFDESCRIPTOR_RX_PHYERR_MASK | ENET_BUFFDESCRIPTOR_RX_COLLISION_MASK) -#endif - -/*! @name Defines some Ethernet parameters. */ -/*@{*/ -#define ENET_FRAME_MAX_FRAMELEN 1518U /*!< Default maximum Ethernet frame size without VLAN tag. */ -#define ENET_FRAME_VLAN_TAGLEN 4U /*!< Ethernet single VLAN tag size. */ -#define ENET_FRAME_CRC_LEN 4U /*!< CRC size in a frame. */ -#define ENET_FRAME_TX_LEN_LIMITATION(x) \ - ((((x)->RCR & ENET_RCR_MAX_FL_MASK) >> ENET_RCR_MAX_FL_SHIFT) - ENET_FRAME_CRC_LEN) - -#define ENET_FIFO_MIN_RX_FULL 5U /*!< ENET minimum receive FIFO full. */ -#define ENET_RX_MIN_BUFFERSIZE 256U /*!< ENET minimum buffer size. */ -#define ENET_PHY_MAXADDRESS (ENET_MMFR_PA_MASK >> ENET_MMFR_PA_SHIFT) /*!< Maximum PHY address. */ - -#if FSL_FEATURE_ENET_QUEUE > 1 -#define ENET_TX_INTERRUPT \ - ((uint32_t)kENET_TxFrameInterrupt | (uint32_t)kENET_TxBufferInterrupt | (uint32_t)kENET_TxFrame1Interrupt | \ - (uint32_t)kENET_TxBuffer1Interrupt | (uint32_t)kENET_TxFrame2Interrupt | \ - (uint32_t)kENET_TxBuffer2Interrupt) /*!< Enet Tx interrupt flag. */ -#define ENET_RX_INTERRUPT \ - ((uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_RxBufferInterrupt | (uint32_t)kENET_RxFrame1Interrupt | \ - (uint32_t)kENET_RxBuffer1Interrupt | (uint32_t)kENET_RxFrame2Interrupt | \ - (uint32_t)kENET_RxBuffer2Interrupt) /*!< Enet Rx interrupt flag. */ -#else -#define ENET_TX_INTERRUPT \ - ((uint32_t)kENET_TxFrameInterrupt | (uint32_t)kENET_TxBufferInterrupt) /*!< Enet Tx interrupt flag. */ -#define ENET_RX_INTERRUPT \ - ((uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_RxBufferInterrupt) /*!< Enet Rx interrupt flag. */ -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -#define ENET_TS_INTERRUPT \ - ((uint32_t)kENET_TsTimerInterrupt | (uint32_t)kENET_TsAvailInterrupt) /*!< Enet timestamp interrupt flag. */ -#define ENET_ERR_INTERRUPT \ - ((uint32_t)kENET_BabrInterrupt | (uint32_t)kENET_BabtInterrupt | (uint32_t)kENET_EBusERInterrupt | \ - (uint32_t)kENET_LateCollisionInterrupt | (uint32_t)kENET_RetryLimitInterrupt | \ - (uint32_t)kENET_UnderrunInterrupt | (uint32_t)kENET_PayloadRxInterrupt) /*!< Enet error interrupt flag. */ -/*@}*/ - -/*! @brief Defines the status return codes for transaction. */ -enum -{ - kStatus_ENET_InitMemoryFail = - MAKE_STATUS(kStatusGroup_ENET, 0U), /*!< Init fails since buffer memory is not enough. */ - kStatus_ENET_RxFrameError = MAKE_STATUS(kStatusGroup_ENET, 1U), /*!< A frame received but data error happen. */ - kStatus_ENET_RxFrameFail = MAKE_STATUS(kStatusGroup_ENET, 2U), /*!< Failed to receive a frame. */ - kStatus_ENET_RxFrameEmpty = MAKE_STATUS(kStatusGroup_ENET, 3U), /*!< No frame arrive. */ - kStatus_ENET_RxFrameDrop = MAKE_STATUS(kStatusGroup_ENET, 4U), /*!< Rx frame is dropped since no buffer memory. */ - kStatus_ENET_TxFrameOverLen = MAKE_STATUS(kStatusGroup_ENET, 5U), /*!< Tx frame over length. */ - kStatus_ENET_TxFrameBusy = MAKE_STATUS(kStatusGroup_ENET, 6U), /*!< Tx buffer descriptors are under process. */ - kStatus_ENET_TxFrameFail = MAKE_STATUS(kStatusGroup_ENET, 7U), /*!< Transmit frame fail. */ -}; - -/*! @brief Defines the MII/RMII/RGMII mode for data interface between the MAC and the PHY. */ -typedef enum _enet_mii_mode -{ - kENET_MiiMode = 0U, /*!< MII mode for data interface. */ - kENET_RmiiMode = 1U, /*!< RMII mode for data interface. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - kENET_RgmiiMode = 2U /*!< RGMII mode for data interface. */ -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -} enet_mii_mode_t; - -/*! @brief Defines the 10/100/1000 Mbps speed for the MII data interface. - * - * Notice: "kENET_MiiSpeed1000M" only supported when mii mode is "kENET_RgmiiMode". - */ -typedef enum _enet_mii_speed -{ - kENET_MiiSpeed10M = 0U, /*!< Speed 10 Mbps. */ - kENET_MiiSpeed100M = 1U, /*!< Speed 100 Mbps. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - kENET_MiiSpeed1000M = 2U /*!< Speed 1000M bps. */ -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -} enet_mii_speed_t; - -/*! @brief Defines the half or full duplex for the MII data interface. */ -typedef enum _enet_mii_duplex -{ - kENET_MiiHalfDuplex = 0U, /*!< Half duplex mode. */ - kENET_MiiFullDuplex /*!< Full duplex mode. */ -} enet_mii_duplex_t; - -/*! @brief Define the MII opcode for normal MDIO_CLAUSES_22 Frame. */ -typedef enum _enet_mii_write -{ - kENET_MiiWriteNoCompliant = 0U, /*!< Write frame operation, but not MII-compliant. */ - kENET_MiiWriteValidFrame /*!< Write frame operation for a valid MII management frame. */ -} enet_mii_write_t; - -/*! @brief Defines the read operation for the MII management frame. */ -typedef enum _enet_mii_read -{ - kENET_MiiReadValidFrame = 2U, /*!< Read frame operation for a valid MII management frame. */ - kENET_MiiReadNoCompliant = 3U /*!< Read frame operation, but not MII-compliant. */ -} enet_mii_read_t; - -#if defined(FSL_FEATURE_ENET_HAS_EXTEND_MDIO) && FSL_FEATURE_ENET_HAS_EXTEND_MDIO -/*! @brief Define the MII opcode for extended MDIO_CLAUSES_45 Frame. */ -typedef enum _enet_mii_extend_opcode -{ - kENET_MiiAddrWrite_C45 = 0U, /*!< Address Write operation. */ - kENET_MiiWriteFrame_C45 = 1U, /*!< Write frame operation for a valid MII management frame. */ - kENET_MiiReadFrame_C45 = 3U /*!< Read frame operation for a valid MII management frame. */ -} enet_mii_extend_opcode; -#endif /* FSL_FEATURE_ENET_HAS_EXTEND_MDIO */ - -/*! @brief Defines a special configuration for ENET MAC controller. - * - * These control flags are provided for special user requirements. - * Normally, these control flags are unused for ENET initialization. - * For special requirements, set the flags to - * macSpecialConfig in the enet_config_t. - * The kENET_ControlStoreAndFwdDisable is used to disable the FIFO store - * and forward. FIFO store and forward means that the FIFO read/send is started - * when a complete frame is stored in TX/RX FIFO. If this flag is set, - * configure rxFifoFullThreshold and txFifoWatermark - * in the enet_config_t. - */ -typedef enum _enet_special_control_flag -{ - kENET_ControlFlowControlEnable = 0x0001U, /*!< Enable ENET flow control: pause frame. */ - kENET_ControlRxPayloadCheckEnable = 0x0002U, /*!< Enable ENET receive payload length check. */ - kENET_ControlRxPadRemoveEnable = 0x0004U, /*!< Padding is removed from received frames. */ - kENET_ControlRxBroadCastRejectEnable = 0x0008U, /*!< Enable broadcast frame reject. */ - kENET_ControlMacAddrInsert = 0x0010U, /*!< Enable MAC address insert. */ - kENET_ControlStoreAndFwdDisable = 0x0020U, /*!< Enable FIFO store and forward. */ - kENET_ControlSMIPreambleDisable = 0x0040U, /*!< Enable SMI preamble. */ - kENET_ControlPromiscuousEnable = 0x0080U, /*!< Enable promiscuous mode. */ - kENET_ControlMIILoopEnable = 0x0100U, /*!< Enable ENET MII loop back. */ - kENET_ControlVLANTagEnable = 0x0200U, /*!< Enable normal VLAN (single vlan tag). */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - kENET_ControlSVLANEnable = 0x0400U, /*!< Enable S-VLAN. */ - kENET_ControlVLANUseSecondTag = 0x0800U /*!< Enable extracting the second vlan tag for further processing. */ -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -} enet_special_control_flag_t; - -/*! @brief List of interrupts supported by the peripheral. This - * enumeration uses one-bot encoding to allow a logical OR of multiple - * members. Members usually map to interrupt enable bits in one or more - * peripheral registers. - */ -typedef enum _enet_interrupt_enable -{ - kENET_BabrInterrupt = ENET_EIR_BABR_MASK, /*!< Babbling receive error interrupt source */ - kENET_BabtInterrupt = ENET_EIR_BABT_MASK, /*!< Babbling transmit error interrupt source */ - kENET_GraceStopInterrupt = ENET_EIR_GRA_MASK, /*!< Graceful stop complete interrupt source */ - kENET_TxFrameInterrupt = ENET_EIR_TXF_MASK, /*!< TX FRAME interrupt source */ - kENET_TxBufferInterrupt = ENET_EIR_TXB_MASK, /*!< TX BUFFER interrupt source */ - kENET_RxFrameInterrupt = ENET_EIR_RXF_MASK, /*!< RX FRAME interrupt source */ - kENET_RxBufferInterrupt = ENET_EIR_RXB_MASK, /*!< RX BUFFER interrupt source */ - kENET_MiiInterrupt = ENET_EIR_MII_MASK, /*!< MII interrupt source */ - kENET_EBusERInterrupt = ENET_EIR_EBERR_MASK, /*!< Ethernet bus error interrupt source */ - kENET_LateCollisionInterrupt = ENET_EIR_LC_MASK, /*!< Late collision interrupt source */ - kENET_RetryLimitInterrupt = ENET_EIR_RL_MASK, /*!< Collision Retry Limit interrupt source */ - kENET_UnderrunInterrupt = ENET_EIR_UN_MASK, /*!< Transmit FIFO underrun interrupt source */ - kENET_PayloadRxInterrupt = ENET_EIR_PLR_MASK, /*!< Payload Receive error interrupt source */ - kENET_WakeupInterrupt = ENET_EIR_WAKEUP_MASK, /*!< WAKEUP interrupt source */ -#if FSL_FEATURE_ENET_QUEUE > 1 - kENET_RxFlush2Interrupt = ENET_EIR_RXFLUSH_2_MASK, /*!< Rx DMA ring2 flush indication. */ - kENET_RxFlush1Interrupt = ENET_EIR_RXFLUSH_1_MASK, /*!< Rx DMA ring1 flush indication. */ - kENET_RxFlush0Interrupt = ENET_EIR_RXFLUSH_0_MASK, /*!< RX DMA ring0 flush indication. */ - kENET_TxFrame2Interrupt = ENET_EIR_TXF2_MASK, /*!< Tx frame interrupt for Tx ring/class 2. */ - kENET_TxBuffer2Interrupt = ENET_EIR_TXB2_MASK, /*!< Tx buffer interrupt for Tx ring/class 2. */ - kENET_RxFrame2Interrupt = ENET_EIR_RXF2_MASK, /*!< Rx frame interrupt for Rx ring/class 2. */ - kENET_RxBuffer2Interrupt = ENET_EIR_RXB2_MASK, /*!< Rx buffer interrupt for Rx ring/class 2. */ - kENET_TxFrame1Interrupt = ENET_EIR_TXF1_MASK, /*!< Tx frame interrupt for Tx ring/class 1. */ - kENET_TxBuffer1Interrupt = ENET_EIR_TXB1_MASK, /*!< Tx buffer interrupt for Tx ring/class 1. */ - kENET_RxFrame1Interrupt = ENET_EIR_RXF1_MASK, /*!< Rx frame interrupt for Rx ring/class 1. */ - kENET_RxBuffer1Interrupt = ENET_EIR_RXB1_MASK, /*!< Rx buffer interrupt for Rx ring/class 1. */ -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - kENET_TsAvailInterrupt = ENET_EIR_TS_AVAIL_MASK, /*!< TS AVAIL interrupt source for PTP */ - kENET_TsTimerInterrupt = ENET_EIR_TS_TIMER_MASK /*!< TS WRAP interrupt source for PTP */ -} enet_interrupt_enable_t; - -/*! @brief Defines the common interrupt event for callback use. */ -typedef enum _enet_event -{ - kENET_RxEvent, /*!< Receive event. */ - kENET_TxEvent, /*!< Transmit event. */ - kENET_ErrEvent, /*!< Error event: BABR/BABT/EBERR/LC/RL/UN/PLR . */ - kENET_WakeUpEvent, /*!< Wake up from sleep mode event. */ - kENET_TimeStampEvent, /*!< Time stamp event. */ - kENET_TimeStampAvailEvent /*!< Time stamp available event.*/ -} enet_event_t; - -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB -/*! @brief Defines certain idle slope for bandwidth fraction. */ -typedef enum _enet_idle_slope -{ - kENET_IdleSlope1 = 1U, /*!< The bandwidth fraction is about 0.002. */ - kENET_IdleSlope2 = 2U, /*!< The bandwidth fraction is about 0.003. */ - kENET_IdleSlope4 = 4U, /*!< The bandwidth fraction is about 0.008. */ - kENET_IdleSlope8 = 8U, /*!< The bandwidth fraction is about 0.02. */ - kENET_IdleSlope16 = 16U, /*!< The bandwidth fraction is about 0.03. */ - kENET_IdleSlope32 = 32U, /*!< The bandwidth fraction is about 0.06. */ - kENET_IdleSlope64 = 64U, /*!< The bandwidth fraction is about 0.11. */ - kENET_IdleSlope128 = 128U, /*!< The bandwidth fraction is about 0.20. */ - kENET_IdleSlope256 = 256U, /*!< The bandwidth fraction is about 0.33. */ - kENET_IdleSlope384 = 384U, /*!< The bandwidth fraction is about 0.43. */ - kENET_IdleSlope512 = 512U, /*!< The bandwidth fraction is about 0.50. */ - kENET_IdleSlope640 = 640U, /*!< The bandwidth fraction is about 0.56. */ - kENET_IdleSlope768 = 768U, /*!< The bandwidth fraction is about 0.60. */ - kENET_IdleSlope896 = 896U, /*!< The bandwidth fraction is about 0.64. */ - kENET_IdleSlope1024 = 1024U, /*!< The bandwidth fraction is about 0.67. */ - kENET_IdleSlope1152 = 1152U, /*!< The bandwidth fraction is about 0.69. */ - kENET_IdleSlope1280 = 1280U, /*!< The bandwidth fraction is about 0.71. */ - kENET_IdleSlope1408 = 1408U, /*!< The bandwidth fraction is about 0.73. */ - kENET_IdleSlope1536 = 1536U /*!< The bandwidth fraction is about 0.75. */ -} enet_idle_slope_t; -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - -/*! @brief Defines the transmit accelerator configuration. */ -typedef enum _enet_tx_accelerator -{ - kENET_TxAccelIsShift16Enabled = ENET_TACC_SHIFT16_MASK, /*!< Transmit FIFO shift-16. */ - kENET_TxAccelIpCheckEnabled = ENET_TACC_IPCHK_MASK, /*!< Insert IP header checksum. */ - kENET_TxAccelProtoCheckEnabled = ENET_TACC_PROCHK_MASK /*!< Insert protocol checksum. */ -} enet_tx_accelerator_t; - -/*! @brief Defines the receive accelerator configuration. */ -typedef enum _enet_rx_accelerator -{ - kENET_RxAccelPadRemoveEnabled = ENET_RACC_PADREM_MASK, /*!< Padding removal for short IP frames. */ - kENET_RxAccelIpCheckEnabled = ENET_RACC_IPDIS_MASK, /*!< Discard with wrong IP header checksum. */ - kENET_RxAccelProtoCheckEnabled = ENET_RACC_PRODIS_MASK, /*!< Discard with wrong protocol checksum. */ - kENET_RxAccelMacCheckEnabled = ENET_RACC_LINEDIS_MASK, /*!< Discard with Mac layer errors. */ - kENET_RxAccelisShift16Enabled = ENET_RACC_SHIFT16_MASK /*!< Receive FIFO shift-16. */ -} enet_rx_accelerator_t; - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! @brief Defines the ENET PTP message related constant. */ -typedef enum _enet_ptp_event_type -{ - kENET_PtpEventMsgType = 3U, /*!< PTP event message type. */ - kENET_PtpSrcPortIdLen = 10U, /*!< PTP message sequence id length. */ - kENET_PtpEventPort = 319U, /*!< PTP event port number. */ - kENET_PtpGnrlPort = 320U /*!< PTP general port number. */ -} enet_ptp_event_type_t; - -/*! @brief Defines the IEEE 1588 PTP timer channel numbers. */ -typedef enum _enet_ptp_timer_channel -{ - kENET_PtpTimerChannel1 = 0U, /*!< IEEE 1588 PTP timer Channel 1. */ - kENET_PtpTimerChannel2, /*!< IEEE 1588 PTP timer Channel 2. */ - kENET_PtpTimerChannel3, /*!< IEEE 1588 PTP timer Channel 3. */ - kENET_PtpTimerChannel4 /*!< IEEE 1588 PTP timer Channel 4. */ -} enet_ptp_timer_channel_t; - -/*! @brief Defines the capture or compare mode for IEEE 1588 PTP timer channels. */ -typedef enum _enet_ptp_timer_channel_mode -{ - kENET_PtpChannelDisable = 0U, /*!< Disable timer channel. */ - kENET_PtpChannelRisingCapture = 1U, /*!< Input capture on rising edge. */ - kENET_PtpChannelFallingCapture = 2U, /*!< Input capture on falling edge. */ - kENET_PtpChannelBothCapture = 3U, /*!< Input capture on both edges. */ - kENET_PtpChannelSoftCompare = 4U, /*!< Output compare software only. */ - kENET_PtpChannelToggleCompare = 5U, /*!< Toggle output on compare. */ - kENET_PtpChannelClearCompare = 6U, /*!< Clear output on compare. */ - kENET_PtpChannelSetCompare = 7U, /*!< Set output on compare. */ - kENET_PtpChannelClearCompareSetOverflow = 10U, /*!< Clear output on compare, set output on overflow. */ - kENET_PtpChannelSetCompareClearOverflow = 11U, /*!< Set output on compare, clear output on overflow. */ - kENET_PtpChannelPulseLowonCompare = 14U, /*!< Pulse output low on compare for one IEEE 1588 clock cycle. */ - kENET_PtpChannelPulseHighonCompare = 15U /*!< Pulse output high on compare for one IEEE 1588 clock cycle. */ -} enet_ptp_timer_channel_mode_t; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! @brief Defines the receive buffer descriptor structure for the little endian system.*/ -typedef struct _enet_rx_bd_struct -{ - uint16_t length; /*!< Buffer descriptor data length. */ - uint16_t control; /*!< Buffer descriptor control and status. */ - uint8_t *buffer; /*!< Data buffer pointer. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint16_t controlExtend0; /*!< Extend buffer descriptor control0. */ - uint16_t controlExtend1; /*!< Extend buffer descriptor control1. */ - uint16_t payloadCheckSum; /*!< Internal payload checksum. */ - uint8_t headerLength; /*!< Header length. */ - uint8_t protocolTyte; /*!< Protocol type. */ - uint16_t reserved0; - uint16_t controlExtend2; /*!< Extend buffer descriptor control2. */ - uint32_t timestamp; /*!< Timestamp. */ - uint16_t reserved1; - uint16_t reserved2; - uint16_t reserved3; - uint16_t reserved4; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ -} enet_rx_bd_struct_t; - -/*! @brief Defines the enhanced transmit buffer descriptor structure for the little endian system. */ -typedef struct _enet_tx_bd_struct -{ - uint16_t length; /*!< Buffer descriptor data length. */ - uint16_t control; /*!< Buffer descriptor control and status. */ - uint8_t *buffer; /*!< Data buffer pointer. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint16_t controlExtend0; /*!< Extend buffer descriptor control0. */ - uint16_t controlExtend1; /*!< Extend buffer descriptor control1. */ -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB - uint16_t txLaunchTimeLow; /*!< Low 16-bits of transmit launch time. */ - uint16_t txLaunchTimeHigh; /*!< High 16-bits of transmit launch time. */ -#else - uint16_t reserved0; - uint16_t reserved1; -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - uint16_t reserved2; - uint16_t controlExtend2; /*!< Extend buffer descriptor control2. */ - uint32_t timestamp; /*!< Timestamp. */ - uint16_t reserved3; - uint16_t reserved4; - uint16_t reserved5; - uint16_t reserved6; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ -} enet_tx_bd_struct_t; - -/*! @brief Defines the ENET data error statistics structure. */ -typedef struct _enet_data_error_stats -{ - uint32_t statsRxLenGreaterErr; /*!< Receive length greater than RCR[MAX_FL]. */ - uint32_t statsRxAlignErr; /*!< Receive non-octet alignment/ */ - uint32_t statsRxFcsErr; /*!< Receive CRC error. */ - uint32_t statsRxOverRunErr; /*!< Receive over run. */ - uint32_t statsRxTruncateErr; /*!< Receive truncate. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint32_t statsRxProtocolChecksumErr; /*!< Receive protocol checksum error. */ - uint32_t statsRxIpHeadChecksumErr; /*!< Receive IP header checksum error. */ - uint32_t statsRxMacErr; /*!< Receive Mac error. */ - uint32_t statsRxPhyErr; /*!< Receive PHY error. */ - uint32_t statsRxCollisionErr; /*!< Receive collision. */ - uint32_t statsTxErr; /*!< The error happen when transmit the frame. */ - uint32_t statsTxFrameErr; /*!< The transmit frame is error. */ - uint32_t statsTxOverFlowErr; /*!< Transmit overflow. */ - uint32_t statsTxLateCollisionErr; /*!< Transmit late collision. */ - uint32_t statsTxExcessCollisionErr; /*!< Transmit excess collision.*/ - uint32_t statsTxUnderFlowErr; /*!< Transmit under flow error. */ - uint32_t statsTxTsErr; /*!< Transmit time stamp error. */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ -} enet_data_error_stats_t; - -/*! @brief Defines the Rx frame error structure. */ -typedef struct _enet_rx_frame_error -{ - bool statsRxTruncateErr : 1; /*!< Receive truncate. */ - bool statsRxOverRunErr : 1; /*!< Receive over run. */ - bool statsRxFcsErr : 1; /*!< Receive CRC error. */ - bool : 1; - bool statsRxAlignErr : 1; /*!< Receive non-octet alignment. */ - bool statsRxLenGreaterErr : 1; /*!< Receive length greater than RCR[MAX_FL]. */ - uint32_t : 19; -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - bool statsRxCollisionErr : 1; /*!< Receive collision. */ - bool statsRxPhyErr : 1; /*!< Receive PHY error. */ - uint8_t : 4; - bool statsRxMacErr : 1; /*!< Receive Mac error. */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ -} enet_rx_frame_error_t; - -/*! @brief Defines the ENET transfer statistics structure. */ -typedef struct _enet_transfer_stats -{ - uint32_t statsRxFrameCount; /*!< Rx frame number. */ - uint32_t statsRxFrameOk; /*!< Good Rx frame number. */ - uint32_t statsRxCrcErr; /*!< Rx frame number with CRC error. */ - uint32_t statsRxAlignErr; /*!< Rx frame number with alignment error. */ - uint32_t statsRxDropInvalidSFD; /*!< Dropped frame number due to invalid SFD. */ - uint32_t statsRxFifoOverflowErr; /*!< Rx FIFO overflow count. */ - uint32_t statsTxFrameCount; /*!< Tx frame number. */ - uint32_t statsTxFrameOk; /*!< Good Tx frame number. */ - uint32_t statsTxCrcAlignErr; /*!< The transmit frame is error. */ - uint32_t statsTxFifoUnderRunErr; /*!< Tx FIFO underrun count. */ -} enet_transfer_stats_t; - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! @brief Defines the ENET PTP time stamp structure. */ -typedef struct _enet_ptp_time -{ - uint64_t second; /*!< Second. */ - uint32_t nanosecond; /*!< Nanosecond. */ -} enet_ptp_time_t; - -/*! @brief Defines the structure for the ENET PTP message data and timestamp data.*/ -typedef struct _enet_ptp_time_data -{ - uint8_t version; /*!< PTP version. */ - uint8_t sourcePortId[kENET_PtpSrcPortIdLen]; /*!< PTP source port ID. */ - uint16_t sequenceId; /*!< PTP sequence ID. */ - uint8_t messageType; /*!< PTP message type. */ - enet_ptp_time_t timeStamp; /*!< PTP timestamp. */ -} enet_ptp_time_data_t; - -/*! @brief Defines the ENET PTP configuration structure. */ -typedef struct _enet_ptp_config -{ - enet_ptp_timer_channel_t channel; /*!< Used for ERRATA_2579: the PTP 1588 timer channel for time interrupt. */ - uint32_t ptp1588ClockSrc_Hz; /*!< The clock source of the PTP 1588 timer. */ -} enet_ptp_config_t; -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! @brief Defines the frame info structure. */ -typedef struct enet_frame_info -{ - void *context; /*!< User specified data */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - bool isTsAvail; /*!< Flag indicates timestamp available status */ - enet_ptp_time_t timeStamp; /*!< Timestamp of frame */ -#endif -} enet_frame_info_t; - -/*! @brief Defines the ENET transmit dirty addresses ring/queue structure. */ -typedef struct _enet_tx_dirty_ring -{ - enet_frame_info_t *txDirtyBase; /*!< Dirty buffer descriptor base address pointer. */ - uint16_t txGenIdx; /*!< tx generate index. */ - uint16_t txConsumIdx; /*!< tx consume index. */ - uint16_t txRingLen; /*!< tx ring length. */ - bool isFull; /*!< tx ring is full flag. */ -} enet_tx_dirty_ring_t; - -/*! @brief Defines the ENET Rx memory buffer alloc function pointer. */ -typedef void *(*enet_rx_alloc_callback_t)(ENET_Type *base, void *userData, uint8_t ringId); - -/*! @brief Defines the ENET Rx memory buffer free function pointer. */ -typedef void (*enet_rx_free_callback_t)(ENET_Type *base, void *buffer, void *userData, uint8_t ringId); - -/*! @brief Defines the receive buffer descriptor configuration structure. - * - * Note that for the internal DMA requirements, the buffers have a corresponding alignment requirements. - * 1. The aligned receive and transmit buffer size must be evenly divisible by ENET_BUFF_ALIGNMENT. - * when the data buffers are in cacheable region when cache is enabled, all those size should be - * aligned to the maximum value of "ENET_BUFF_ALIGNMENT" and the cache line size. - * 2. The aligned transmit and receive buffer descriptor start address must be at - * least 64 bit aligned. However, it's recommended to be evenly divisible by ENET_BUFF_ALIGNMENT. - * buffer descriptors should be put in non-cacheable region when cache is enabled. - * 3. The aligned transmit and receive data buffer start address must be evenly divisible by ENET_BUFF_ALIGNMENT. - * Receive buffers should be continuous with the total size equal to "rxBdNumber * rxBuffSizeAlign". - * Transmit buffers should be continuous with the total size equal to "txBdNumber * txBuffSizeAlign". - * when the data buffers are in cacheable region when cache is enabled, all those size should be - * aligned to the maximum value of "ENET_BUFF_ALIGNMENT" and the cache line size. - */ -typedef struct _enet_buffer_config -{ - uint16_t rxBdNumber; /*!< Receive buffer descriptor number. */ - uint16_t txBdNumber; /*!< Transmit buffer descriptor number. */ - uint16_t rxBuffSizeAlign; /*!< Aligned receive data buffer size. */ - uint16_t txBuffSizeAlign; /*!< Aligned transmit data buffer size. */ - volatile enet_rx_bd_struct_t - *rxBdStartAddrAlign; /*!< Aligned receive buffer descriptor start address: should be non-cacheable. */ - volatile enet_tx_bd_struct_t - *txBdStartAddrAlign; /*!< Aligned transmit buffer descriptor start address: should be non-cacheable. */ - uint8_t *rxBufferAlign; /*!< Receive data buffer start address. */ - uint8_t *txBufferAlign; /*!< Transmit data buffer start address. */ - bool rxMaintainEnable; /*!< Receive buffer cache maintain. */ - bool txMaintainEnable; /*!< Transmit buffer cache maintain. */ - enet_frame_info_t *txFrameInfo; /*!< Transmit frame information start address. */ -} enet_buffer_config_t; - -#if defined(FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE) && FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE -/*! @brief Defines the interrupt coalescing configure structure. */ -typedef struct _enet_intcoalesce_config -{ - uint8_t txCoalesceFrameCount[FSL_FEATURE_ENET_QUEUE]; /*!< Transmit interrupt coalescing frame count threshold. */ - uint16_t txCoalesceTimeCount[FSL_FEATURE_ENET_QUEUE]; /*!< Transmit interrupt coalescing timer count threshold. */ - uint8_t rxCoalesceFrameCount[FSL_FEATURE_ENET_QUEUE]; /*!< Receive interrupt coalescing frame count threshold. */ - uint16_t rxCoalesceTimeCount[FSL_FEATURE_ENET_QUEUE]; /*!< Receive interrupt coalescing timer count threshold. */ -} enet_intcoalesce_config_t; -#endif /* FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE */ - -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB -/*! @brief Defines the ENET AVB Configure structure. - * - * This is used for to configure the extended ring 1 and ring 2. - * 1. The classification match format is (CMP3 << 12) | (CMP2 << 8) | (CMP1 << 4) | CMP0. - * composed of four 3-bit compared VLAN priority field cmp0~cmp3, cm0 ~ cmp3 are used in parallel. - * - * If CMP1,2,3 are not unused, please set them to the same value as CMP0. - * 2. The idleSlope is used to calculate the Band Width fraction, BW fraction = 1 / (1 + 512/idleSlope). - * For avb configuration, the BW fraction of Class 1 and Class 2 combined must not exceed 0.75. - */ -typedef struct _enet_avb_config -{ - uint16_t rxClassifyMatch[FSL_FEATURE_ENET_QUEUE - 1]; /*!< The classification match value for the ring. */ - enet_idle_slope_t idleSlope[FSL_FEATURE_ENET_QUEUE - 1]; /*!< The idle slope for certian bandwidth fraction. */ -} enet_avb_config_t; -#endif /* FSL_FEATURE_ENET_HAS_AVB */ - -/* Forward declaration of the handle typedef. */ -typedef struct _enet_handle enet_handle_t; - -/*! @brief ENET callback function. */ -typedef void (*enet_callback_t)(ENET_Type *base, - enet_handle_t *handle, -#if FSL_FEATURE_ENET_QUEUE > 1 - uint32_t ringId, -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - enet_event_t event, - enet_frame_info_t *frameInfo, - void *userData); - -/*! @brief Defines the basic configuration structure for the ENET device. - * - * Note: - * 1. macSpecialConfig is used for a special control configuration, A logical OR of - * "enet_special_control_flag_t". For a special configuration for MAC, - * set this parameter to 0. - * 2. txWatermark is used for a cut-through operation. It is in steps of 64 bytes: - * 0/1 - 64 bytes written to TX FIFO before transmission of a frame begins. - * 2 - 128 bytes written to TX FIFO .... - * 3 - 192 bytes written to TX FIFO .... - * The maximum of txWatermark is 0x2F - 4032 bytes written to TX FIFO .... - * txWatermark allows minimizing the transmit latency to set the txWatermark to 0 or 1 - * or for larger bus access latency 3 or larger due to contention for the system bus. - * 3. rxFifoFullThreshold is similar to the txWatermark for cut-through operation in RX. - * It is in 64-bit words. The minimum is ENET_FIFO_MIN_RX_FULL and the maximum is 0xFF. - * If the end of the frame is stored in FIFO and the frame size if smaller than the - * txWatermark, the frame is still transmitted. The rule is the - * same for rxFifoFullThreshold in the receive direction. - * 4. When "kENET_ControlFlowControlEnable" is set in the macSpecialConfig, ensure - * that the pauseDuration, rxFifoEmptyThreshold, and rxFifoStatEmptyThreshold - * are set for flow control enabled case. - * 5. When "kENET_ControlStoreAndFwdDisabled" is set in the macSpecialConfig, ensure - * that the rxFifoFullThreshold and txFifoWatermark are set for store and forward disable. - * 6. The rxAccelerConfig and txAccelerConfig default setting with 0 - accelerator - * are disabled. The "enet_tx_accelerator_t" and "enet_rx_accelerator_t" are - * recommended to be used to enable the transmit and receive accelerator. - * After the accelerators are enabled, the store and forward feature should be enabled. - * As a result, kENET_ControlStoreAndFwdDisabled should not be set. - * 7. The intCoalesceCfg can be used in the rx or tx enabled cases to decrese the CPU loading. - */ -typedef struct _enet_config -{ - uint32_t macSpecialConfig; /*!< Mac special configuration. A logical OR of "enet_special_control_flag_t". */ - uint32_t interrupt; /*!< Mac interrupt source. A logical OR of "enet_interrupt_enable_t". */ - uint16_t rxMaxFrameLen; /*!< Receive maximum frame length. */ - enet_mii_mode_t miiMode; /*!< MII mode. */ - enet_mii_speed_t miiSpeed; /*!< MII Speed. */ - enet_mii_duplex_t miiDuplex; /*!< MII duplex. */ - uint8_t rxAccelerConfig; /*!< Receive accelerator, A logical OR of "enet_rx_accelerator_t". */ - uint8_t txAccelerConfig; /*!< Transmit accelerator, A logical OR of "enet_rx_accelerator_t". */ - uint16_t pauseDuration; /*!< For flow control enabled case: Pause duration. */ - uint8_t rxFifoEmptyThreshold; /*!< For flow control enabled case: when RX FIFO level reaches this value, - it makes MAC generate XOFF pause frame. */ -#if defined(FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD) && FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD - uint8_t rxFifoStatEmptyThreshold; /*!< For flow control enabled case: number of frames in the receive FIFO, - independent of size, that can be accept. If the limit is reached, reception - continues and a pause frame is triggered. */ -#endif /* FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD */ - uint8_t rxFifoFullThreshold; /*!< For store and forward disable case, the data required in RX FIFO to notify - the MAC receive ready status. */ - uint8_t txFifoWatermark; /*!< For store and forward disable case, the data required in TX FIFO - before a frame transmit start. */ -#if defined(FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE) && FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE - enet_intcoalesce_config_t *intCoalesceCfg; /*!< If the interrupt coalsecence is not required in the ring n(0,1,2), - please set to NULL. */ -#endif /* FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE */ - uint8_t ringNum; /*!< Number of used rings. default with 1 -- single ring. */ - enet_rx_alloc_callback_t rxBuffAlloc; /*!< Callback function to alloc memory, must be provided for zero-copy Rx. */ - enet_rx_free_callback_t rxBuffFree; /*!< Callback function to free memory, must be provided for zero-copy Rx. */ - enet_callback_t callback; /*!< General callback function. */ - void *userData; /*!< Callback function parameter.*/ -} enet_config_t; - -/*! @brief Defines the ENET transmit buffer descriptor ring/queue structure. */ -typedef struct _enet_tx_bd_ring -{ - volatile enet_tx_bd_struct_t *txBdBase; /*!< Buffer descriptor base address pointer. */ - uint16_t txGenIdx; /*!< The current available transmit buffer descriptor pointer. */ - uint16_t txConsumIdx; /*!< Transmit consume index. */ - volatile uint16_t txDescUsed; /*!< Transmit descriptor used number. */ - uint16_t txRingLen; /*!< Transmit ring length. */ -} enet_tx_bd_ring_t; - -/*! @brief Defines the ENET receive buffer descriptor ring/queue structure. */ -typedef struct _enet_rx_bd_ring -{ - volatile enet_rx_bd_struct_t *rxBdBase; /*!< Buffer descriptor base address pointer. */ - uint16_t rxGenIdx; /*!< The current available receive buffer descriptor pointer. */ - uint16_t rxRingLen; /*!< Receive ring length. */ -} enet_rx_bd_ring_t; - -/*! @brief Defines the ENET handler structure. */ -struct _enet_handle -{ - enet_rx_bd_ring_t rxBdRing[FSL_FEATURE_ENET_QUEUE]; /*!< Receive buffer descriptor. */ - enet_tx_bd_ring_t txBdRing[FSL_FEATURE_ENET_QUEUE]; /*!< Transmit buffer descriptor. */ - uint16_t rxBuffSizeAlign[FSL_FEATURE_ENET_QUEUE]; /*!< Receive buffer size alignment. */ - uint16_t txBuffSizeAlign[FSL_FEATURE_ENET_QUEUE]; /*!< Transmit buffer size alignment. */ - bool rxMaintainEnable[FSL_FEATURE_ENET_QUEUE]; /*!< Receive buffer cache maintain. */ - bool txMaintainEnable[FSL_FEATURE_ENET_QUEUE]; /*!< Transmit buffer cache maintain. */ - uint8_t ringNum; /*!< Number of used rings. */ - enet_callback_t callback; /*!< Callback function. */ - void *userData; /*!< Callback function parameter.*/ - enet_tx_dirty_ring_t txDirtyRing[FSL_FEATURE_ENET_QUEUE]; /*!< Ring to store tx frame information.*/ - bool txReclaimEnable[FSL_FEATURE_ENET_QUEUE]; /*!< Tx reclaim enable flag.*/ - enet_rx_alloc_callback_t rxBuffAlloc; /*!< Callback function to alloc memory for zero copy Rx. */ - enet_rx_free_callback_t rxBuffFree; /*!< Callback function to free memory for zero copy Rx. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - volatile enet_tx_bd_struct_t - *txBdDirtyStatic[FSL_FEATURE_ENET_QUEUE]; /*!< The dirty transmit buffer descriptor for error static update. */ - uint64_t msTimerSecond; /*!< The second for Master PTP timer. */ -#endif - uint8_t multicastCount[64]; /*!< Multicast collisions counter */ -#if defined(FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID) && FSL_FEATURE_ENET_TIMESTAMP_CAPTURE_BIT_INVALID - uint32_t enetClock; /*!< The clock of enet peripheral, to caculate core cycles for PTP timestamp.*/ - uint32_t tsDelayCount; /*!< The count of core cycles for PTP timestamp capture delay.*/ -#endif -}; - -typedef struct _enet_buffer_struct -{ - void *buffer; /*!< The buffer store the whole or partial frame. */ - uint16_t length; /*!< The byte length of this buffer. */ -} enet_buffer_struct_t; - -typedef struct _enet_rx_frame_attribute_struct -{ - bool promiscuous; /*!< This frame is received because of promiscuous mode. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - uint32_t timestamp; /*!< The nanosecond part timestamp of this Rx frame. */ -#endif -} enet_rx_frame_attribute_t; - -typedef struct _enet_rx_frame_struct -{ - enet_buffer_struct_t *rxBuffArray; /*!< Rx frame buffer structure. */ - uint16_t totLen; /*!< Rx frame total length. */ - enet_rx_frame_attribute_t rxAttribute; /*!< Rx frame attribute structure. */ - enet_rx_frame_error_t rxFrameError; /*!< Rx frame error. */ -} enet_rx_frame_struct_t; - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -typedef struct _enet_tx_config_struct -{ - bool intEnable : 1; - bool tsEnable : 1; - bool autoProtocolChecksum : 1; - bool autoIPChecksum : 1; - uint8_t AVBFrameType : 4; /*!< AVB class type. */ - bool tltEnable : 1; /*!< Transmit launch time enable. */ - uint16_t tltLow; /*!< Specifies when frame can be transmitted. */ - uint16_t tltHigh; /*!< Specifies when frame can be transmitted. */ -} enet_tx_config_struct_t; -#endif - -typedef struct _enet_tx_frame_struct -{ - enet_buffer_struct_t *txBuffArray; /*!< Tx frame buffer structure. */ - uint32_t txBuffNum; /*!< Buffer number of this Tx frame. */ -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE - enet_tx_config_struct_t txConfig; /*!< Tx extra configuation. */ -#endif - void *context; /*!< Driver reclaims and gives it in Tx over callback, usually store network packet header. */ -} enet_tx_frame_struct_t; - -/*! @brief Define interrupt IRQ handler. */ -#if FSL_FEATURE_ENET_QUEUE > 1 -typedef void (*enet_isr_ring_t)(ENET_Type *base, enet_handle_t *handle, uint32_t ringId); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -typedef void (*enet_isr_t)(ENET_Type *base, enet_handle_t *handle); - -/*! @brief Pointers to enet clocks for each instance. */ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -extern const clock_ip_name_t s_enetClock[]; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Get the ENET instance from peripheral base address. - * - * @param base ENET peripheral base address. - * @return ENET instance. - */ -uint32_t ENET_GetInstance(ENET_Type *base); - -/*! - * @name Initialization and De-initialization - * @{ - */ - -/*! - * @brief Gets the ENET default configuration structure. - * - * The purpose of this API is to get the default ENET MAC controller - * configure structure for ENET_Init(). User may use the initialized - * structure unchanged in ENET_Init(), or modify some fields of the - * structure before calling ENET_Init(). - * Example: - @code - enet_config_t config; - ENET_GetDefaultConfig(&config); - @endcode - * @param config The ENET mac controller configuration structure pointer. - */ -void ENET_GetDefaultConfig(enet_config_t *config); - -/*! - * @brief Initializes the ENET module. - * - * This function initializes the module with the ENET configuration. - * @note ENET has two buffer descriptors legacy buffer descriptors and - * enhanced IEEE 1588 buffer descriptors. The legacy descriptor is used by default. To - * use the IEEE 1588 feature, use the enhanced IEEE 1588 buffer descriptor - * by defining "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" and calling ENET_Ptp1588Configure() - * to configure the 1588 feature and related buffers after calling ENET_Up(). - * - * @param base ENET peripheral base address. - * @param handle ENET handler pointer. - * @param config ENET mac configuration structure pointer. - * The "enet_config_t" type mac configuration return from ENET_GetDefaultConfig - * can be used directly. It is also possible to verify the Mac configuration using other methods. - * @param bufferConfig ENET buffer configuration structure pointer. - * The buffer configuration should be prepared for ENET Initialization. - * It is the start address of "ringNum" enet_buffer_config structures. - * To support added multi-ring features in some soc and compatible with the previous - * enet driver version. For single ring supported, this bufferConfig is a buffer - * configure structure pointer, for multi-ring supported and used case, this bufferConfig - * pointer should be a buffer configure structure array pointer. - * @param macAddr ENET mac address of Ethernet device. This MAC address should be - * provided. - * @param srcClock_Hz The internal module clock source for MII clock. - * @retval kStatus_Success Succeed to initialize the ethernet driver. - * @retval kStatus_ENET_InitMemoryFail Init fails since buffer memory is not enough. - * - */ -status_t ENET_Up(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz); - -/*! - * @brief Initializes the ENET module. - * - * This function ungates the module clock and initializes it with the ENET configuration. - * @note ENET has two buffer descriptors legacy buffer descriptors and - * enhanced IEEE 1588 buffer descriptors. The legacy descriptor is used by default. To - * use the IEEE 1588 feature, use the enhanced IEEE 1588 buffer descriptor - * by defining "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" and calling ENET_Ptp1588Configure() - * to configure the 1588 feature and related buffers after calling ENET_Init(). - * - * @param base ENET peripheral base address. - * @param handle ENET handler pointer. - * @param config ENET mac configuration structure pointer. - * The "enet_config_t" type mac configuration return from ENET_GetDefaultConfig - * can be used directly. It is also possible to verify the Mac configuration using other methods. - * @param bufferConfig ENET buffer configuration structure pointer. - * The buffer configuration should be prepared for ENET Initialization. - * It is the start address of "ringNum" enet_buffer_config structures. - * To support added multi-ring features in some soc and compatible with the previous - * enet driver version. For single ring supported, this bufferConfig is a buffer - * configure structure pointer, for multi-ring supported and used case, this bufferConfig - * pointer should be a buffer configure structure array pointer. - * @param macAddr ENET mac address of Ethernet device. This MAC address should be - * provided. - * @param srcClock_Hz The internal module clock source for MII clock. - * @retval kStatus_Success Succeed to initialize the ethernet driver. - * @retval kStatus_ENET_InitMemoryFail Init fails since buffer memory is not enough. - */ -status_t ENET_Init(ENET_Type *base, - enet_handle_t *handle, - const enet_config_t *config, - const enet_buffer_config_t *bufferConfig, - uint8_t *macAddr, - uint32_t srcClock_Hz); - -/*! - * @brief Stops the ENET module. - - * This function disables the ENET module. - * - * @param base ENET peripheral base address. - */ -void ENET_Down(ENET_Type *base); - -/*! - * @brief Deinitializes the ENET module. - - * This function gates the module clock, clears ENET interrupts, and disables the ENET module. - * - * @param base ENET peripheral base address. - */ -void ENET_Deinit(ENET_Type *base); - -/*! - * @brief Resets the ENET module. - * - * This function restores the ENET module to reset state. - * Note that this function sets all registers to - * reset state. As a result, the ENET module can't work after calling this function. - * - * @param base ENET peripheral base address. - */ -static inline void ENET_Reset(ENET_Type *base) -{ - base->ECR |= ENET_ECR_RESET_MASK; -} - -/* @} */ - -/*! - * @name MII interface operation - * @{ - */ - -/*! - * @brief Sets the ENET MII speed and duplex. - * - * This API is provided to dynamically change the speed and dulpex for MAC. - * - * @param base ENET peripheral base address. - * @param speed The speed of the RMII mode. - * @param duplex The duplex of the RMII mode. - */ -void ENET_SetMII(ENET_Type *base, enet_mii_speed_t speed, enet_mii_duplex_t duplex); - -/*! - * @brief Sets the ENET SMI(serial management interface)- MII management interface. - * - * @param base ENET peripheral base address. - * @param srcClock_Hz This is the ENET module clock frequency. See clock distribution. - * @param isPreambleDisabled The preamble disable flag. - * - true Enables the preamble. - * - false Disables the preamble. - */ -void ENET_SetSMI(ENET_Type *base, uint32_t srcClock_Hz, bool isPreambleDisabled); - -/*! - * @brief Gets the ENET SMI- MII management interface configuration. - * - * This API is used to get the SMI configuration to check whether the MII management - * interface has been set. - * - * @param base ENET peripheral base address. - * @return The SMI setup status true or false. - */ -static inline bool ENET_GetSMI(ENET_Type *base) -{ - return (0U != (base->MSCR & 0x7EU)); -} - -/*! - * @brief Reads data from the PHY register through an SMI interface. - * - * @param base ENET peripheral base address. - * @return The data read from PHY - */ -static inline uint32_t ENET_ReadSMIData(ENET_Type *base) -{ - return (uint32_t)((base->MMFR & ENET_MMFR_DATA_MASK) >> ENET_MMFR_DATA_SHIFT); -} - -/*! - * @brief Starts an SMI (Serial Management Interface) read command. - * - * Used for standard IEEE802.3 MDIO Clause 22 format. - * - * @param base ENET peripheral base address. - * @param phyAddr The PHY address. - * @param phyReg The PHY register. Range from 0 ~ 31. - * @param operation The read operation. - */ -void ENET_StartSMIRead(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, enet_mii_read_t operation); - -/*! - * @brief Starts an SMI write command. - * - * Used for standard IEEE802.3 MDIO Clause 22 format. - * - * @param base ENET peripheral base address. - * @param phyAddr The PHY address. - * @param phyReg The PHY register. Range from 0 ~ 31. - * @param operation The write operation. - * @param data The data written to PHY. - */ -void ENET_StartSMIWrite(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, enet_mii_write_t operation, uint32_t data); - -#if defined(FSL_FEATURE_ENET_HAS_EXTEND_MDIO) && FSL_FEATURE_ENET_HAS_EXTEND_MDIO -/*! - * @brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI write register command. - * - * @param base ENET peripheral base address. - * @param phyAddr The PHY address. - * @param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - */ -void ENET_StartExtC45SMIWriteReg(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg); - -/*! - * @brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI write data command. - * - * After writing MMFR register, we need to check whether the transmission is over. - * This is an example for whole precedure of clause 45 MDIO write. - * @code - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteReg(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteData(base, phyAddr, phyReg, data); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * @endcode - * @param base ENET peripheral base address. - * @param phyAddr The PHY address. - * @param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - * @param data The data written to PHY. - */ -void ENET_StartExtC45SMIWriteData(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg, uint32_t data); - -/*! - * @brief Starts the extended IEEE802.3 Clause 45 MDIO format SMI read data command. - * - * After writing MMFR register, we need to check whether the transmission is over. - * This is an example for whole precedure of clause 45 MDIO read. - * @code - * uint32_t data; - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIWriteReg(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * ENET_StartExtC45SMIReadData(base, phyAddr, phyReg); - * while ((ENET_GetInterruptStatus(base) & ENET_EIR_MII_MASK) == 0U) - * { - * } - * ENET_ClearInterruptStatus(base, ENET_EIR_MII_MASK); - * data = ENET_ReadSMIData(base); - * @endcode - * @param base ENET peripheral base address. - * @param phyAddr The PHY address. - * @param phyReg The PHY register. For MDIO IEEE802.3 Clause 45, - * the phyReg is a 21-bits combination of the devaddr (5 bits device address) - * and the regAddr (16 bits phy register): phyReg = (devaddr << 16) | regAddr. - */ -void ENET_StartExtC45SMIReadData(ENET_Type *base, uint32_t phyAddr, uint32_t phyReg); -#endif /* FSL_FEATURE_ENET_HAS_EXTEND_MDIO */ - -#if ((defined(FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY) && FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY) || \ - (defined(FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY) && FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY)) -/*! - * @brief Control the usage of the delayed tx/rx RGMII clock. - * - * @param base ENET peripheral base address. - * @param txEnabled Enable or disable to generate the delayed version of RGMII_TXC. - * @param rxEnabled Enable or disable to use the delayed version of RGMII_RXC. - */ -static inline void ENET_SetRGMIIClockDelay(ENET_Type *base, bool txEnabled, bool rxEnabled) -{ - uint32_t ecrReg = base->ECR; - -#if defined(FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY) && FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY - /* Set for transmit clock delay. */ - if (txEnabled) - { - ecrReg |= ENET_ECR_TXC_DLY_MASK; - } - else - { - ecrReg &= ~ENET_ECR_TXC_DLY_MASK; - } -#endif /* FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY */ - -#if defined(FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY) && FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY - /* Set for receive clock delay. */ - if (rxEnabled) - { - ecrReg |= ENET_ECR_RXC_DLY_MASK; - } - else - { - ecrReg &= ~ENET_ECR_RXC_DLY_MASK; - } -#endif /* FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY */ - base->ECR = ecrReg; -} -#endif - -/* @} */ - -/*! - * @name MAC Address Filter - * @{ - */ - -/*! - * @brief Sets the ENET module Mac address. - * - * @param base ENET peripheral base address. - * @param macAddr The six-byte Mac address pointer. - * The pointer is allocated by application and input into the API. - */ -void ENET_SetMacAddr(ENET_Type *base, uint8_t *macAddr); - -/*! - * @brief Gets the ENET module Mac address. - * - * @param base ENET peripheral base address. - * @param macAddr The six-byte Mac address pointer. - * The pointer is allocated by application and input into the API. - */ -void ENET_GetMacAddr(ENET_Type *base, uint8_t *macAddr); - -/*! - * @brief Adds the ENET device to a multicast group. - * - * @param base ENET peripheral base address. - * @param address The six-byte multicast group address which is provided by application. - */ -void ENET_AddMulticastGroup(ENET_Type *base, uint8_t *address); - -/*! - * @brief Moves the ENET device from a multicast group. - * - * @param base ENET peripheral base address. - * @param address The six-byte multicast group address which is provided by application. - */ -void ENET_LeaveMulticastGroup(ENET_Type *base, uint8_t *address); - -/* @} */ - -/*! - * @name Other basic operation - * @{ - */ - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -#if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB -/*! - * @brief Sets the ENET AVB feature. - * - * ENET AVB feature configuration, set the Receive classification match and transmit - * bandwidth. This API is called when the AVB feature is required. - * - * Note: The AVB frames transmission scheme is credit-based tx scheme and it's only supported - * with the Enhanced buffer descriptors. so the AVB configuration should only done with - * Enhanced buffer descriptor. so when the AVB feature is required, please make sure the - * the "ENET_ENHANCEDBUFFERDESCRIPTOR_MODE" is defined. - * - * @param base ENET peripheral base address. - * @param handle ENET handler pointer. - * @param config The ENET AVB feature configuration structure. - */ -void ENET_AVBConfigure(ENET_Type *base, enet_handle_t *handle, const enet_avb_config_t *config); -#endif /* FSL_FEATURE_ENET_HAS_AVB */ -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! - * @brief Activates frame reception for multiple rings. - * - * This function is to active the enet read process. - * @note This must be called after the MAC configuration and - * state are ready. It must be called after the ENET_Init(). - * This should be called when the frame reception is required. - * - * @param base ENET peripheral base address. - */ -static inline void ENET_ActiveRead(ENET_Type *base) -{ - base->RDAR = ENET_RDAR_RDAR_MASK; -#if FSL_FEATURE_ENET_QUEUE > 1 - if (FSL_FEATURE_ENET_INSTANCE_QUEUEn(base) > 1) - { - base->RDAR1 = ENET_RDAR1_RDAR_MASK; - base->RDAR2 = ENET_RDAR2_RDAR_MASK; - } -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ -} - -/*! - * @brief Enables/disables the MAC to enter sleep mode. - * This function is used to set the MAC enter sleep mode. - * When entering sleep mode, the magic frame wakeup interrupt should be enabled - * to wake up MAC from the sleep mode and reset it to normal mode. - * - * @param base ENET peripheral base address. - * @param enable True enable sleep mode, false disable sleep mode. - */ -static inline void ENET_EnableSleepMode(ENET_Type *base, bool enable) -{ - if (enable) - { - /* When this field is set, MAC enters sleep mode. */ - base->ECR |= ENET_ECR_SLEEP_MASK | ENET_ECR_MAGICEN_MASK; - } - else - { /* MAC exits sleep mode. */ - base->ECR &= ~(ENET_ECR_SLEEP_MASK | ENET_ECR_MAGICEN_MASK); - } -} - -/*! - * @brief Gets ENET transmit and receive accelerator functions from MAC controller. - * - * @param base ENET peripheral base address. - * @param txAccelOption The transmit accelerator option. The "enet_tx_accelerator_t" is - * recommended to be used to as the mask to get the exact the accelerator option. - * @param rxAccelOption The receive accelerator option. The "enet_rx_accelerator_t" is - * recommended to be used to as the mask to get the exact the accelerator option. - */ -static inline void ENET_GetAccelFunction(ENET_Type *base, uint32_t *txAccelOption, uint32_t *rxAccelOption) -{ - assert(txAccelOption != NULL); - assert(txAccelOption != NULL); - - *txAccelOption = base->TACC; - *rxAccelOption = base->RACC; -} - -/* @} */ - -/*! - * @name Interrupts. - * @{ - */ - -/*! - * @brief Enables the ENET interrupt. - * - * This function enables the ENET interrupt according to the provided mask. The mask - * is a logical OR of enumeration members. See ::enet_interrupt_enable_t. - * For example, to enable the TX frame interrupt and RX frame interrupt, do the following. - * @code - * ENET_EnableInterrupts(ENET, kENET_TxFrameInterrupt | kENET_RxFrameInterrupt); - * @endcode - * - * @param base ENET peripheral base address. - * @param mask ENET interrupts to enable. This is a logical OR of the - * enumeration ::enet_interrupt_enable_t. - */ -static inline void ENET_EnableInterrupts(ENET_Type *base, uint32_t mask) -{ - base->EIMR |= mask; -} - -/*! - * @brief Disables the ENET interrupt. - * - * This function disables the ENET interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See ::enet_interrupt_enable_t. - * For example, to disable the TX frame interrupt and RX frame interrupt, do the following. - * @code - * ENET_DisableInterrupts(ENET, kENET_TxFrameInterrupt | kENET_RxFrameInterrupt); - * @endcode - * - * @param base ENET peripheral base address. - * @param mask ENET interrupts to disable. This is a logical OR of the - * enumeration ::enet_interrupt_enable_t. - */ -static inline void ENET_DisableInterrupts(ENET_Type *base, uint32_t mask) -{ - base->EIMR &= ~mask; -} - -/*! - * @brief Gets the ENET interrupt status flag. - * - * @param base ENET peripheral base address. - * @return The event status of the interrupt source. This is the logical OR of members - * of the enumeration ::enet_interrupt_enable_t. - */ -static inline uint32_t ENET_GetInterruptStatus(ENET_Type *base) -{ - return base->EIR; -} - -/*! - * @brief Clears the ENET interrupt events status flag. - * - * This function clears enabled ENET interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See the ::enet_interrupt_enable_t. - * For example, to clear the TX frame interrupt and RX frame interrupt, do the following. - * @code - * ENET_ClearInterruptStatus(ENET, kENET_TxFrameInterrupt | kENET_RxFrameInterrupt); - * @endcode - * - * @param base ENET peripheral base address. - * @param mask ENET interrupt source to be cleared. - * This is the logical OR of members of the enumeration ::enet_interrupt_enable_t. - */ -static inline void ENET_ClearInterruptStatus(ENET_Type *base, uint32_t mask) -{ - base->EIR = mask; -} - -#if FSL_FEATURE_ENET_QUEUE > 1 -/*! - * @brief Set the second level Rx IRQ handler - * - * @param base ENET peripheral base address. - * @param ISRHandler The handler to install. - */ -void ENET_SetRxISRHandler(ENET_Type *base, enet_isr_ring_t ISRHandler); - -/*! - * @brief Set the second level Tx IRQ handler - * - * @param base ENET peripheral base address. - * @param ISRHandler The handler to install. - */ -void ENET_SetTxISRHandler(ENET_Type *base, enet_isr_ring_t ISRHandler); - -#else -/*! - * @brief Set the second level Rx IRQ handler - * - * @param base ENET peripheral base address. - * @param ISRHandler The handler to install. - */ -void ENET_SetRxISRHandler(ENET_Type *base, enet_isr_t ISRHandler); - -/*! - * @brief Set the second level Tx IRQ handler - * - * @param base ENET peripheral base address. - * @param ISRHandler The handler to install. - */ -void ENET_SetTxISRHandler(ENET_Type *base, enet_isr_t ISRHandler); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - -/*! - * @brief Set the second level Err IRQ handler - * - * @param base ENET peripheral base address. - * @param ISRHandler The handler to install. - */ -void ENET_SetErrISRHandler(ENET_Type *base, enet_isr_t ISRHandler); - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! - * @brief Set the second level Ts IRQ handler - * - * @param ISRHandler The handler to install. - */ -void ENET_SetTsISRHandler(ENET_Type *base, enet_isr_t ISRHandler); - -/*! - * @brief Set the second level 1588 Timer IRQ handler - * - * @param ISRHandler The handler to install. - */ -void ENET_Set1588TimerISRHandler(ENET_Type *base, enet_isr_t ISRHandler); -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/* @} */ - -/*! - * @name Transactional operation - * @{ - */ - -/*! - * @brief Sets the callback function. - * @deprecated Do not use this function. It has been superceded by the config param in @ref ENET_Init. - * This API is provided for the application callback required case when ENET - * interrupt is enabled. This API should be called after calling ENET_Init. - * - * @param handle ENET handler pointer. Should be provided by application. - * @param callback The ENET callback function. - * @param userData The callback function parameter. - */ -void ENET_SetCallback(enet_handle_t *handle, enet_callback_t callback, void *userData); - -/*! - * @brief Gets the error statistics of a received frame for ENET specified ring. - * - * This API must be called after the ENET_GetRxFrameSize and before the ENET_ReadFrame(). - * If the ENET_GetRxFrameSize returns kStatus_ENET_RxFrameError, - * the ENET_GetRxErrBeforeReadFrame can be used to get the exact error statistics. - * This is an example. - * @code - * status = ENET_GetRxFrameSize(&g_handle, &length, 0); - * if (status == kStatus_ENET_RxFrameError) - * { - * Comments: Get the error information of the received frame. - * ENET_GetRxErrBeforeReadFrame(&g_handle, &eErrStatic, 0); - * Comments: update the receive buffer. - * ENET_ReadFrame(EXAMPLE_ENET, &g_handle, NULL, 0); - * } - * @endcode - * @param handle The ENET handler structure pointer. This is the same handler pointer used in the ENET_Init. - * @param eErrorStatic The error statistics structure pointer. - * @param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - */ -void ENET_GetRxErrBeforeReadFrame(enet_handle_t *handle, enet_data_error_stats_t *eErrorStatic, uint8_t ringId); - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! - * @brief Gets the ENET transmit frame statistics after the data send for specified ring. - * - * This interface gets the error statistics of the transmit frame. - * Because the error information is reported by the uDMA after the data delivery, this interface - * should be called after the data transmit API. It is recommended to call this function on - * transmit interrupt handler. After calling the ENET_SendFrame, the - * transmit interrupt notifies the transmit completion. - * - * @param handle The PTP handler pointer. This is the same handler pointer used in the ENET_Init. - * @param eErrorStatic The error statistics structure pointer. - * @param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - * @return The execute status. - */ -status_t ENET_GetTxErrAfterSendFrame(enet_handle_t *handle, enet_data_error_stats_t *eErrorStatic, uint8_t ringId); -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -/*! - * @brief Gets statistical data in transfer. - * - * @param base ENET peripheral base address. - * @param statistics The statistics structure pointer. - */ -void ENET_GetStatistics(ENET_Type *base, enet_transfer_stats_t *statistics); - -/*! - * @brief Gets the size of the read frame for specified ring. - * - * This function gets a received frame size from the ENET buffer descriptors. - * @note The FCS of the frame is automatically removed by MAC and the size is the length without the FCS. - * After calling ENET_GetRxFrameSize, ENET_ReadFrame() should be called to receive frame and update the BD - * if the result is not "kStatus_ENET_RxFrameEmpty". - * - * @param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * @param length The length of the valid frame received. - * @param ringId The ring index or ring number. - * @retval kStatus_ENET_RxFrameEmpty No frame received. Should not call ENET_ReadFrame to read frame. - * @retval kStatus_ENET_RxFrameError Data error happens. ENET_ReadFrame should be called with NULL data - * and NULL length to update the receive buffers. - * @retval kStatus_Success Receive a frame Successfully then the ENET_ReadFrame - * should be called with the right data buffer and the captured data length input. - */ -status_t ENET_GetRxFrameSize(enet_handle_t *handle, uint32_t *length, uint8_t ringId); - -/*! - * @brief Reads a frame from the ENET device. - * This function reads a frame (both the data and the length) from the ENET buffer descriptors. - * User can get timestamp through ts pointer if the ts is not NULL. - * @note It doesn't store the timestamp in the receive timestamp queue. - * The ENET_GetRxFrameSize should be used to get the size of the prepared data buffer. - * This API uses memcpy to copy data from DMA buffer to application buffer, 4 bytes aligned data buffer - * in 32 bits platforms provided by user may let compiler use optimization instruction to reduce time - * consumption. - * This is an example: - * @code - * uint32_t length; - * enet_handle_t g_handle; - * Comments: Get the received frame size firstly. - * status = ENET_GetRxFrameSize(&g_handle, &length, 0); - * if (length != 0) - * { - * Comments: Allocate memory here with the size of "length" - * uint8_t *data = memory allocate interface; - * if (!data) - * { - * ENET_ReadFrame(ENET, &g_handle, NULL, 0, 0, NULL); - * Comments: Add the console warning log. - * } - * else - * { - * status = ENET_ReadFrame(ENET, &g_handle, data, length, 0, NULL); - * Comments: Call stack input API to deliver the data to stack - * } - * } - * else if (status == kStatus_ENET_RxFrameError) - * { - * Comments: Update the received buffer when a error frame is received. - * ENET_ReadFrame(ENET, &g_handle, NULL, 0, 0, NULL); - * } - * @endcode - * @param base ENET peripheral base address. - * @param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * @param data The data buffer provided by user to store the frame which memory size should be at least "length". - * @param length The size of the data buffer which is still the length of the received frame. - * @param ringId The ring index or ring number. - * @param ts The timestamp address to store received timestamp. - * @return The execute status, successful or failure. - */ -status_t ENET_ReadFrame( - ENET_Type *base, enet_handle_t *handle, uint8_t *data, uint32_t length, uint8_t ringId, uint32_t *ts); - -/*! - * @brief Transmits an ENET frame for specified ring. - * @note The CRC is automatically appended to the data. Input the data to send without the CRC. - * This API uses memcpy to copy data from DMA buffer to application buffer, 4 bytes aligned data buffer - * in 32 bits platforms provided by user may let compiler use optimization instruction to reduce time - * consumption. - * - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param data The data buffer provided by user to send. - * @param length The length of the data to send. - * @param ringId The ring index or ring number. - * @param tsFlag Timestamp enable flag. - * @param context Used by user to handle some events after transmit over. - * @retval kStatus_Success Send frame succeed. - * @retval kStatus_ENET_TxFrameBusy Transmit buffer descriptor is busy under transmission. - * The transmit busy happens when the data send rate is over the MAC capacity. - * The waiting mechanism is recommended to be added after each call return with - * kStatus_ENET_TxFrameBusy. - */ -status_t ENET_SendFrame(ENET_Type *base, - enet_handle_t *handle, - const uint8_t *data, - uint32_t length, - uint8_t ringId, - bool tsFlag, - void *context); - -/*! - * @brief Enable or disable tx descriptors reclaim mechanism. - * @note This function must be called when no pending send frame action. - * Set enable if you want to reclaim context or timestamp in interrupt. - * - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param isEnable Enable or disable flag. - * @param ringId The ring index or ring number. - * @retval kStatus_Success Succeed to enable/disable Tx reclaim. - * @retval kStatus_Fail Fail to enable/disable Tx reclaim. - */ -status_t ENET_SetTxReclaim(enet_handle_t *handle, bool isEnable, uint8_t ringId); - -/*! - * @brief Reclaim tx descriptors. - * This function is used to update the tx descriptor status and - * store the tx timestamp when the 1588 feature is enabled. - * This is called by the transmit interupt IRQ handler after the - * complete of a frame transmission. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param ringId The ring index or ring number. - */ -void ENET_ReclaimTxDescriptor(ENET_Type *base, enet_handle_t *handle, uint8_t ringId); - -/*! - * @brief Get a receive buffer pointer of the ENET device for specified ring. - * @deprecated Do not use this function. It has been superseded by @ref ENET_GetRxFrame. - * - * This function can get the data address which stores frame. Then can analyze these data directly without doing any - * memory copy. When the frame locates in multiple BD buffer, need to repeat calling this function until isLastBuff=true - * (need to store the temp buf pointer everytime call this function). After finishing the analysis of this frame, - * call ENET_ReleaseRxBuffer to release rxbuff memory to DMA. - * This is an example: - * @code - * uint32_t length; - * uint8_t *buf = NULL; - * uint32_t data_len = 0; - * bool isLastBuff = false; - * enet_handle_t g_handle; - * status_t status; - * status = ENET_GetRxFrameSize(&g_handle, &length, 0); - * if (length != 0) - * { - * ENET_GetRxBuffer(EXAMPLE_ENET, &g_handle, &buf, &data_len, 0, &isLastBuff, NULL); - * ENET_ReleaseRxBuffer(EXAMPLE_ENET, &g_handle, buf, 0); - * } - * @endcode - * @param base ENET peripheral base address. - * @param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * @param buffer The data buffer pointer to store the frame. - * @param length The size of the data buffer. If isLastBuff=false, it represents data length of this buffer. If - * isLastBuff=true, it represents data length of total frame. - * @param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - * @param isLastBuff The flag represents whether this buffer is the last buffer to store frame. - * @param ts The 1588 timestamp value, vaild in last buffer. - * @retval kStatus_Success Get receive buffer succeed. - * @retval kStatus_ENET_RxFrameFail Get receive buffer fails, it's owned by application, should wait app to release this - * buffer. - */ -status_t ENET_GetRxBuffer(ENET_Type *base, - enet_handle_t *handle, - void **buffer, - uint32_t *length, - uint8_t ringId, - bool *isLastBuff, - uint32_t *ts); - -/*! - * @brief Release receive buffer descriptor to DMA. - * @deprecated Do not use this function. It has been superseded by @ref ENET_GetRxFrame. - * - * This function can release specified BD owned by application, meanwhile it may rearrange the BD to let the no-owned - * BDs always in back of the index of DMA transfer. So for the situation that releasing order is not same as the getting - * order, the rearrangement makes all ready BDs can be used by DMA. - * @note This function can't be interrupted by ENET_GetRxBuffer, so in application must make sure ENET_GetRxBuffer is - * called before or after this function. And this function itself isn't thread safe due to BD content exchanging. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler structure. This is the same handler pointer used in the ENET_Init. - * @param buffer The buffer address to store frame, using it to find the correspond BD and release it. - * @param ringId The ring index, range from 0 ~ (FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) - 1). - */ -void ENET_ReleaseRxBuffer(ENET_Type *base, enet_handle_t *handle, void *buffer, uint8_t ringId); - -/*! - * @brief Receives one frame in specified BD ring with zero copy. - * - * This function will use the user-defined allocate and free callback. Every time application gets one frame through - * this function, driver will allocate new buffers for the BDs whose buffers have been taken by application. - * @note This function will drop current frame and update related BDs as available for DMA if new buffers allocating - * fails. Application must provide a memory pool including at least BD number + 1 buffers to make this function work - * normally. If user calls this function in Rx interrupt handler, be careful that this function makes Rx BD ready with - * allocating new buffer(normal) or updating current BD(out of memory). If there's always new Rx frame input, Rx - * interrupt will be triggered forever. Application need to disable Rx interrupt according to specific design in this - * case. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param rxFrame The received frame information structure provided by user. - * @param ringId The ring index or ring number. - * @retval kStatus_Success Succeed to get one frame and allocate new memory for Rx buffer. - * @retval kStatus_ENET_RxFrameEmpty There's no Rx frame in the BD. - * @retval kStatus_ENET_RxFrameError There's issue in this receiving. - * @retval kStatus_ENET_RxFrameDrop There's no new buffer memory for BD, drop this frame. - */ -status_t ENET_GetRxFrame(ENET_Type *base, enet_handle_t *handle, enet_rx_frame_struct_t *rxFrame, uint8_t ringId); - -/*! - * @brief Sends one frame in specified BD ring with zero copy. - * - * This function supports scattered buffer transmit, user needs to provide the buffer array. - * @note Tx reclaim should be enabled to ensure the Tx buffer ownership can be given back to - * application after Tx is over. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param txFrame The Tx frame structure. - * @param ringId The ring index or ring number. - * @retval kStatus_Success Succeed to send one frame. - * @retval kStatus_ENET_TxFrameBusy The BD is not ready for Tx or the reclaim operation still not finishs. - * @retval kStatus_ENET_TxFrameOverLen The Tx frame length is over max ethernet frame length. - */ -status_t ENET_StartTxFrame(ENET_Type *base, enet_handle_t *handle, enet_tx_frame_struct_t *txFrame, uint8_t ringId); - -/*! - * @brief Transmits an ENET frame for specified ring with zero-copy. - * @deprecated Do not use this function. It has been superseded by @ref ENET_StartTxFrame. - * @note The CRC is automatically appended to the data. Input the data - * to send without the CRC. The frame must store in continuous memory - * and need to check the buffer start address alignment based on your - * device, otherwise it has issue or can't get highest DMA transmit speed. - * - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. This is the same handler pointer used in the ENET_Init. - * @param data The data buffer provided by user to send. - * @param length The length of the data to send. - * @param ringId The ring index or ring number. - * @param tsFlag Timestamp enable flag. - * @param context Used by user to handle some events after transmit over. - * @retval kStatus_Success Send frame succeed. - * @retval kStatus_ENET_TxFrameBusy Transmit buffer descriptor is busy under transmission. - * The transmit busy happens when the data send rate is over the MAC capacity. - * The waiting mechanism is recommended to be added after each call return with - * kStatus_ENET_TxFrameBusy. - */ -status_t ENET_SendFrameZeroCopy(ENET_Type *base, - enet_handle_t *handle, - const uint8_t *data, - uint32_t length, - uint8_t ringId, - bool tsFlag, - void *context); - -#if FSL_FEATURE_ENET_QUEUE > 1 -/*! - * @brief The transmit IRQ handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. - * @param ringId The ring id or ring number. - */ -void ENET_TransmitIRQHandler(ENET_Type *base, enet_handle_t *handle, uint32_t ringId); - -/*! - * @brief The receive IRQ handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. - * @param ringId The ring id or ring number. - */ -void ENET_ReceiveIRQHandler(ENET_Type *base, enet_handle_t *handle, uint32_t ringId); - -/*! - * @brief the common IRQ handler for the tx/rx irq handler. - * - * This is used for the combined tx/rx interrupt for multi-ring (frame 1). - * - * @param base ENET peripheral base address. - */ -void ENET_CommonFrame1IRQHandler(ENET_Type *base); - -/*! - * @brief the common IRQ handler for the tx/rx irq handler. - * - * This is used for the combined tx/rx interrupt for multi-ring (frame 2). - * - * @param base ENET peripheral base address. - */ -void ENET_CommonFrame2IRQHandler(ENET_Type *base); -#else -/*! - * @brief The transmit IRQ handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. - */ -void ENET_TransmitIRQHandler(ENET_Type *base, enet_handle_t *handle); - -/*! - * @brief The receive IRQ handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. - */ -void ENET_ReceiveIRQHandler(ENET_Type *base, enet_handle_t *handle); -#endif /* FSL_FEATURE_ENET_QUEUE > 1 */ - -/*! - * @brief Some special IRQ handler including the error, mii, wakeup irq handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET handler pointer. - */ -void ENET_ErrorIRQHandler(ENET_Type *base, enet_handle_t *handle); - -/*! - * @brief the common IRQ handler for the 1588 irq handler. - * - * This is used for the 1588 timer interrupt. - * - * @param base ENET peripheral base address. - */ -void ENET_Ptp1588IRQHandler(ENET_Type *base); - -/*! - * @brief the common IRQ handler for the tx/rx/error etc irq handler. - * - * This is used for the combined tx/rx/error interrupt for single/mutli-ring (frame 0). - * - * @param base ENET peripheral base address. - */ -void ENET_CommonFrame0IRQHandler(ENET_Type *base); -/* @} */ - -#ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE -/*! - * @name ENET PTP 1588 function operation - * @{ - */ -void ENET_Ptp1588ConfigureHandler(ENET_Type *base, enet_handle_t *handle, enet_ptp_config_t *ptpConfig); - -/*! - * @brief Configures the ENET PTP IEEE 1588 feature with the basic configuration. - * The function sets the clock for PTP 1588 timer and enables - * time stamp interrupts and transmit interrupts for PTP 1588 features. - * This API should be called when the 1588 feature is enabled - * or the ENET_ENHANCEDBUFFERDESCRIPTOR_MODE is defined. - * ENET_Init should be called before calling this API. - * - * @note The PTP 1588 time-stamp second increase though time-stamp interrupt handler - * and the transmit time-stamp store is done through transmit interrupt handler. - * As a result, the TS interrupt and TX interrupt are enabled when you call this API. - * - * @param base ENET peripheral base address. - * @param handle ENET handler pointer. - * @param ptpConfig The ENET PTP1588 configuration. - */ -void ENET_Ptp1588Configure(ENET_Type *base, enet_handle_t *handle, enet_ptp_config_t *ptpConfig); - -/*! - * @brief Starts the ENET PTP 1588 Timer. - * This function is used to initialize the PTP timer. After the PTP starts, - * the PTP timer starts running. - * - * @param base ENET peripheral base address. - * @param ptpClkSrc The clock source of the PTP timer. - */ -void ENET_Ptp1588StartTimer(ENET_Type *base, uint32_t ptpClkSrc); - -/*! - * @brief Stops the ENET PTP 1588 Timer. - * This function is used to stops the ENET PTP timer. - * - * @param base ENET peripheral base address. - */ -static inline void ENET_Ptp1588StopTimer(ENET_Type *base) -{ - /* Disable PTP timer and reset the timer. */ - base->ATCR &= ~ENET_ATCR_EN_MASK; - base->ATCR |= ENET_ATCR_RESTART_MASK; -} - -/*! - * @brief Adjusts the ENET PTP 1588 timer. - * - * @param base ENET peripheral base address. - * @param corrIncrease The correction increment value. This value is added every time the correction - * timer expires. A value less than the PTP timer frequency(1/ptpClkSrc) slows down the timer, - * a value greater than the 1/ptpClkSrc speeds up the timer. - * @param corrPeriod The PTP timer correction counter wrap-around value. This defines after how - * many timer clock the correction counter should be reset and trigger a correction - * increment on the timer. A value of 0 disables the correction counter and no correction occurs. - */ -void ENET_Ptp1588AdjustTimer(ENET_Type *base, uint32_t corrIncrease, uint32_t corrPeriod); - -/*! - * @brief Sets the ENET PTP 1588 timer channel mode. - * - * @param base ENET peripheral base address. - * @param channel The ENET PTP timer channel number. - * @param mode The PTP timer channel mode, see "enet_ptp_timer_channel_mode_t". - * @param intEnable Enables or disables the interrupt. - */ -static inline void ENET_Ptp1588SetChannelMode(ENET_Type *base, - enet_ptp_timer_channel_t channel, - enet_ptp_timer_channel_mode_t mode, - bool intEnable) -{ - uint32_t tcrReg = 0; - - tcrReg = ENET_TCSR_TMODE(mode) | (intEnable ? ENET_TCSR_TIE_MASK : 0U); - - /* Disable channel mode first. */ - base->CHANNEL[channel].TCSR = 0; - base->CHANNEL[channel].TCSR = tcrReg; -} - -#if defined(FSL_FEATURE_ENET_HAS_TIMER_PWCONTROL) && FSL_FEATURE_ENET_HAS_TIMER_PWCONTROL -/*! - * @brief Sets ENET PTP 1588 timer channel mode pulse width. - * - * For the input "mode" in ENET_Ptp1588SetChannelMode, the kENET_PtpChannelPulseLowonCompare - * kENET_PtpChannelPulseHighonCompare only support the pulse width for one 1588 clock. - * this function is extended for control the pulse width from 1 to 32 1588 clock cycles. - * so call this function if you need to set the timer channel mode for - * kENET_PtpChannelPulseLowonCompare or kENET_PtpChannelPulseHighonCompare - * with pulse width more than one 1588 clock, - * - * @param base ENET peripheral base address. - * @param channel The ENET PTP timer channel number. - * @param isOutputLow True --- timer channel is configured for output compare - * pulse output low. - * false --- timer channel is configured for output compare - * pulse output high. - * @param pulseWidth The pulse width control value, range from 0 ~ 31. - * 0 --- pulse width is one 1588 clock cycle. - * 31 --- pulse width is thirty two 1588 clock cycles. - * @param intEnable Enables or disables the interrupt. - */ -static inline void ENET_Ptp1588SetChannelOutputPulseWidth( - ENET_Type *base, enet_ptp_timer_channel_t channel, bool isOutputLow, uint8_t pulseWidth, bool intEnable) -{ - uint32_t tcrReg; - - tcrReg = ENET_TCSR_TIE(intEnable) | ENET_TCSR_TPWC(pulseWidth); - - if (isOutputLow) - { - tcrReg |= ENET_TCSR_TMODE(kENET_PtpChannelPulseLowonCompare); - } - else - { - tcrReg |= ENET_TCSR_TMODE(kENET_PtpChannelPulseHighonCompare); - } - - /* Disable channel mode first. */ - base->CHANNEL[channel].TCSR = 0; - base->CHANNEL[channel].TCSR = tcrReg; -} -#endif /* FSL_FEATURE_ENET_HAS_TIMER_PWCONTROL */ - -/*! - * @brief Sets the ENET PTP 1588 timer channel comparison value. - * - * @param base ENET peripheral base address. - * @param channel The PTP timer channel, see "enet_ptp_timer_channel_t". - * @param cmpValue The compare value for the compare setting. - */ -static inline void ENET_Ptp1588SetChannelCmpValue(ENET_Type *base, enet_ptp_timer_channel_t channel, uint32_t cmpValue) -{ - base->CHANNEL[channel].TCCR = cmpValue; -} - -/*! - * @brief Gets the ENET PTP 1588 timer channel status. - * - * @param base ENET peripheral base address. - * @param channel The IEEE 1588 timer channel number. - * @return True or false, Compare or capture operation status - */ -static inline bool ENET_Ptp1588GetChannelStatus(ENET_Type *base, enet_ptp_timer_channel_t channel) -{ - return (0U != (base->CHANNEL[channel].TCSR & ENET_TCSR_TF_MASK)); -} - -/*! - * @brief Clears the ENET PTP 1588 timer channel status. - * - * @param base ENET peripheral base address. - * @param channel The IEEE 1588 timer channel number. - */ -static inline void ENET_Ptp1588ClearChannelStatus(ENET_Type *base, enet_ptp_timer_channel_t channel) -{ - base->CHANNEL[channel].TCSR |= ENET_TCSR_TF_MASK; - base->TGSR = (1UL << (uint32_t)channel); -} - -/*! - * @brief Get the ENET PTP 1588 timer global status. - * - * @param base ENET peripheral base address. - */ -static inline uint32_t ENET_Ptp1588GetGlobalStatus(ENET_Type *base) -{ - return base->TGSR; -} - -/*! - * @brief Gets the current ENET time from the PTP 1588 timer. - * A variant of ENET_Ptp1588GetTimer() which does not disable interrupts. - * - * @param base ENET peripheral base address. - * @param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * @param ptpTime The PTP timer structure. - */ -void ENET_Ptp1588GetTimerNoIrqDisable(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime); - -/*! - * @brief Gets the current ENET time from the PTP 1588 timer. - * - * @param base ENET peripheral base address. - * @param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * @param ptpTime The PTP timer structure. - */ -void ENET_Ptp1588GetTimer(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime); - -/*! - * @brief Sets the ENET PTP 1588 timer to the assigned time. - * - * @param base ENET peripheral base address. - * @param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - * @param ptpTime The timer to be set to the PTP timer. - */ -void ENET_Ptp1588SetTimer(ENET_Type *base, enet_handle_t *handle, enet_ptp_time_t *ptpTime); - -/*! - * @brief The IEEE 1588 PTP time stamp interrupt handler. - * - * @param base ENET peripheral base address. - * @param handle The ENET state pointer. This is the same state pointer used in the ENET_Init. - */ -void ENET_TimeStampIRQHandler(ENET_Type *base, enet_handle_t *handle); - -/* @} */ - -#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_ENET_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_ewm.c b/devices/MIMXRT1052/drivers/fsl_ewm.c deleted file mode 100644 index 593cf87..0000000 --- a/devices/MIMXRT1052/drivers/fsl_ewm.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017, 2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_ewm.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.ewm" -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Initializes the EWM peripheral. - * - * This function is used to initialize the EWM. After calling, the EWM - * runs immediately according to the configuration. - * Note that, except for the interrupt enable control bit, other control bits and registers are write once after a - * CPU reset. Modifying them more than once generates a bus transfer error. - * - * This is an example. - * code - * ewm_config_t config; - * EWM_GetDefaultConfig(&config); - * config.compareHighValue = 0xAAU; - * EWM_Init(ewm_base,&config); - * endcode - * - * param base EWM peripheral base address - * param config The configuration of the EWM - */ -void EWM_Init(EWM_Type *base, const ewm_config_t *config) -{ - assert(NULL != config); - - uint8_t value = 0U; - -#if !((defined(FSL_FEATURE_SOC_PCC_COUNT) && FSL_FEATURE_SOC_PCC_COUNT) && \ - (defined(FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE) && FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE)) -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_EnableClock(kCLOCK_Ewm0); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -#endif - value = EWM_CTRL_EWMEN(config->enableEwm) | EWM_CTRL_ASSIN(config->setInputAssertLogic) | - EWM_CTRL_INEN(config->enableEwmInput) | EWM_CTRL_INTEN(config->enableInterrupt); -#if defined(FSL_FEATURE_EWM_HAS_PRESCALER) && FSL_FEATURE_EWM_HAS_PRESCALER - base->CLKPRESCALER = config->prescaler; -#endif /* FSL_FEATURE_EWM_HAS_PRESCALER */ - -#if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT - base->CLKCTRL = (uint8_t)config->clockSource; -#endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT*/ - - base->CMPL = config->compareLowValue; - base->CMPH = config->compareHighValue; - base->CTRL = value; -} - -/*! - * brief Deinitializes the EWM peripheral. - * - * This function is used to shut down the EWM. - * - * param base EWM peripheral base address - */ -void EWM_Deinit(EWM_Type *base) -{ - EWM_DisableInterrupts(base, (uint32_t)kEWM_InterruptEnable); -#if !((defined(FSL_FEATURE_SOC_PCC_COUNT) && FSL_FEATURE_SOC_PCC_COUNT) && \ - (defined(FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE) && FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE)) -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(kCLOCK_Ewm0); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -#endif /* FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE */ -} - -/*! - * brief Initializes the EWM configuration structure. - * - * This function initializes the EWM configuration structure to default values. The default - * values are as follows. - * code - * ewmConfig->enableEwm = true; - * ewmConfig->enableEwmInput = false; - * ewmConfig->setInputAssertLogic = false; - * ewmConfig->enableInterrupt = false; - * ewmConfig->ewm_lpo_clock_source_t = kEWM_LpoClockSource0; - * ewmConfig->prescaler = 0; - * ewmConfig->compareLowValue = 0; - * ewmConfig->compareHighValue = 0xFEU; - * endcode - * - * param config Pointer to the EWM configuration structure. - * see ewm_config_t - */ -void EWM_GetDefaultConfig(ewm_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableEwm = true; - config->enableEwmInput = false; - config->setInputAssertLogic = false; - config->enableInterrupt = false; -#if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT - config->clockSource = kEWM_LpoClockSource0; -#endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT*/ -#if defined(FSL_FEATURE_EWM_HAS_PRESCALER) && FSL_FEATURE_EWM_HAS_PRESCALER - config->prescaler = 0U; -#endif /* FSL_FEATURE_EWM_HAS_PRESCALER */ - config->compareLowValue = 0U; - config->compareHighValue = 0xFEU; -} - -/*! - * brief Services the EWM. - * - * This function resets the EWM counter to zero. - * - * param base EWM peripheral base address - */ -void EWM_Refresh(EWM_Type *base) -{ - uint32_t primaskValue = 0U; - - /* Disable the global interrupt to protect refresh sequence */ - primaskValue = DisableGlobalIRQ(); - base->SERV = (uint8_t)0xB4U; - base->SERV = (uint8_t)0x2CU; - EnableGlobalIRQ(primaskValue); -} diff --git a/devices/MIMXRT1052/drivers/fsl_ewm.h b/devices/MIMXRT1052/drivers/fsl_ewm.h deleted file mode 100644 index dbef1b3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_ewm.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017, 2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_EWM_H_ -#define _FSL_EWM_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup ewm - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief EWM driver version 2.0.3. */ -#define FSL_EWM_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) -/*@}*/ - -/*! @brief Describes EWM clock source. */ -#if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT -typedef enum _ewm_lpo_clock_source -{ - kEWM_LpoClockSource0 = 0U, /*!< EWM clock sourced from lpo_clk[0]*/ - kEWM_LpoClockSource1 = 1U, /*!< EWM clock sourced from lpo_clk[1]*/ - kEWM_LpoClockSource2 = 2U, /*!< EWM clock sourced from lpo_clk[2]*/ - kEWM_LpoClockSource3 = 3U, /*!< EWM clock sourced from lpo_clk[3]*/ -} ewm_lpo_clock_source_t; -#endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT */ - -/*! - * @brief Data structure for EWM configuration. - * - * This structure is used to configure the EWM. - */ -typedef struct _ewm_config -{ - bool enableEwm; /*!< Enable EWM module */ - bool enableEwmInput; /*!< Enable EWM_in input */ - bool setInputAssertLogic; /*!< EWM_in signal assertion state */ - bool enableInterrupt; /*!< Enable EWM interrupt */ -#if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT - ewm_lpo_clock_source_t clockSource; /*!< Clock source select */ -#endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT */ -#if defined(FSL_FEATURE_EWM_HAS_PRESCALER) && FSL_FEATURE_EWM_HAS_PRESCALER - uint8_t prescaler; /*!< Clock prescaler value */ -#endif /* FSL_FEATURE_EWM_HAS_PRESCALER */ - uint8_t compareLowValue; /*!< Compare low-register value */ - uint8_t compareHighValue; /*!< Compare high-register value */ -} ewm_config_t; - -/*! - * @brief EWM interrupt configuration structure with default settings all disabled. - * - * This structure contains the settings for all of EWM interrupt configurations. - */ -enum _ewm_interrupt_enable_t -{ - kEWM_InterruptEnable = EWM_CTRL_INTEN_MASK, /*!< Enable the EWM to generate an interrupt*/ -}; - -/*! - * @brief EWM status flags. - * - * This structure contains the constants for the EWM status flags for use in the EWM functions. - */ -enum _ewm_status_flags_t -{ - kEWM_RunningFlag = EWM_CTRL_EWMEN_MASK, /*!< Running flag, set when EWM is enabled*/ -}; - -/******************************************************************************* - * API - *******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name EWM initialization and de-initialization - * @{ - */ - -/*! - * @brief Initializes the EWM peripheral. - * - * This function is used to initialize the EWM. After calling, the EWM - * runs immediately according to the configuration. - * Note that, except for the interrupt enable control bit, other control bits and registers are write once after a - * CPU reset. Modifying them more than once generates a bus transfer error. - * - * This is an example. - * @code - * ewm_config_t config; - * EWM_GetDefaultConfig(&config); - * config.compareHighValue = 0xAAU; - * EWM_Init(ewm_base,&config); - * @endcode - * - * @param base EWM peripheral base address - * @param config The configuration of the EWM - */ -void EWM_Init(EWM_Type *base, const ewm_config_t *config); - -/*! - * @brief Deinitializes the EWM peripheral. - * - * This function is used to shut down the EWM. - * - * @param base EWM peripheral base address - */ -void EWM_Deinit(EWM_Type *base); - -/*! - * @brief Initializes the EWM configuration structure. - * - * This function initializes the EWM configuration structure to default values. The default - * values are as follows. - * @code - * ewmConfig->enableEwm = true; - * ewmConfig->enableEwmInput = false; - * ewmConfig->setInputAssertLogic = false; - * ewmConfig->enableInterrupt = false; - * ewmConfig->ewm_lpo_clock_source_t = kEWM_LpoClockSource0; - * ewmConfig->prescaler = 0; - * ewmConfig->compareLowValue = 0; - * ewmConfig->compareHighValue = 0xFEU; - * @endcode - * - * @param config Pointer to the EWM configuration structure. - * @see ewm_config_t - */ -void EWM_GetDefaultConfig(ewm_config_t *config); - -/* @} */ - -/*! - * @name EWM functional Operation - * @{ - */ - -/*! - * @brief Enables the EWM interrupt. - * - * This function enables the EWM interrupt. - * - * @param base EWM peripheral base address - * @param mask The interrupts to enable - * The parameter can be combination of the following source if defined - * @arg kEWM_InterruptEnable - */ -static inline void EWM_EnableInterrupts(EWM_Type *base, uint32_t mask) -{ - base->CTRL |= (uint8_t)mask; -} - -/*! - * @brief Disables the EWM interrupt. - * - * This function enables the EWM interrupt. - * - * @param base EWM peripheral base address - * @param mask The interrupts to disable - * The parameter can be combination of the following source if defined - * @arg kEWM_InterruptEnable - */ -static inline void EWM_DisableInterrupts(EWM_Type *base, uint32_t mask) -{ - base->CTRL &= (uint8_t)(~mask); -} - -/*! - * @brief Gets all status flags. - * - * This function gets all status flags. - * - * This is an example for getting the running flag. - * @code - * uint32_t status; - * status = EWM_GetStatusFlags(ewm_base) & kEWM_RunningFlag; - * @endcode - * @param base EWM peripheral base address - * @return State of the status flag: asserted (true) or not-asserted (false).@see _ewm_status_flags_t - * - True: a related status flag has been set. - * - False: a related status flag is not set. - */ -static inline uint32_t EWM_GetStatusFlags(EWM_Type *base) -{ - return ((uint32_t)base->CTRL & EWM_CTRL_EWMEN_MASK); -} - -/*! - * @brief Services the EWM. - * - * This function resets the EWM counter to zero. - * - * @param base EWM peripheral base address - */ -void EWM_Refresh(EWM_Type *base); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -#endif /* _FSL_EWM_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexcan.c b/devices/MIMXRT1052/drivers/fsl_flexcan.c deleted file mode 100644 index c49d4c3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexcan.c +++ /dev/null @@ -1,4670 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexcan.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexcan" -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) -#define RXINTERMISSION (CAN_DBG1_CFSM(0x2f)) -#define TXINTERMISSION (CAN_DBG1_CFSM(0x14)) -#define BUSIDLE (CAN_DBG1_CFSM(0x02)) -#define CBN_VALUE3 (CAN_DBG1_CBN(0x03)) -#define DELAY_BUSIDLE (200) -#endif - -/* According to CiA doc 1301 v1.0.0, specified data/nominal phase sample point postion for CAN FD at 80 MHz. */ -#define IDEAL_DATA_SP_1 (800U) -#define IDEAL_DATA_SP_2 (750U) -#define IDEAL_DATA_SP_3 (700U) -#define IDEAL_DATA_SP_4 (625U) -#define IDEAL_NOMINAL_SP (800U) - -/* According to CiA doc 301 v4.2.0 and previous version. */ -#define IDEAL_SP_LOW (750U) -#define IDEAL_SP_MID (800U) -#define IDEAL_SP_HIGH (875U) - -#define IDEAL_SP_FACTOR (1000U) - -/* Define the max value of bit timing segments when use different timing register. */ -#define MAX_PROPSEG (CAN_CTRL1_PROPSEG_MASK >> CAN_CTRL1_PROPSEG_SHIFT) -#define MAX_PSEG1 (CAN_CTRL1_PSEG1_MASK >> CAN_CTRL1_PSEG1_SHIFT) -#define MAX_PSEG2 (CAN_CTRL1_PSEG2_MASK >> CAN_CTRL1_PSEG2_SHIFT) -#define MAX_RJW (CAN_CTRL1_RJW_MASK >> CAN_CTRL1_RJW_SHIFT) -#define MAX_PRESDIV (CAN_CTRL1_PRESDIV_MASK >> CAN_CTRL1_PRESDIV_SHIFT) -#define CTRL1_MAX_TIME_QUANTA (1U + MAX_PROPSEG + 1U + MAX_PSEG1 + 1U + MAX_PSEG2 + 1U) -#define CTRL1_MIN_TIME_QUANTA (8U) - -#define MAX_EPROPSEG (CAN_CBT_EPROPSEG_MASK >> CAN_CBT_EPROPSEG_SHIFT) -#define MAX_EPSEG1 (CAN_CBT_EPSEG1_MASK >> CAN_CBT_EPSEG1_SHIFT) -#define MAX_EPSEG2 (CAN_CBT_EPSEG2_MASK >> CAN_CBT_EPSEG2_SHIFT) -#define MAX_ERJW (CAN_CBT_ERJW_MASK >> CAN_CBT_ERJW_SHIFT) -#define MAX_EPRESDIV (CAN_CBT_EPRESDIV_MASK >> CAN_CBT_EPRESDIV_SHIFT) -#define CBT_MAX_TIME_QUANTA (1U + MAX_EPROPSEG + 1U + MAX_EPSEG1 + 1U + MAX_EPSEG2 + 1U) -#define CBT_MIN_TIME_QUANTA (8U) - -#define MAX_FPROPSEG (CAN_FDCBT_FPROPSEG_MASK >> CAN_FDCBT_FPROPSEG_SHIFT) -#define MAX_FPSEG1 (CAN_FDCBT_FPSEG1_MASK >> CAN_FDCBT_FPSEG1_SHIFT) -#define MAX_FPSEG2 (CAN_FDCBT_FPSEG2_MASK >> CAN_FDCBT_FPSEG2_SHIFT) -#define MAX_FRJW (CAN_FDCBT_FRJW_MASK >> CAN_FDCBT_FRJW_SHIFT) -#define MAX_FPRESDIV (CAN_FDCBT_FPRESDIV_MASK >> CAN_FDCBT_FPRESDIV_SHIFT) -#define FDCBT_MAX_TIME_QUANTA (1U + MAX_FPROPSEG + 0U + MAX_FPSEG1 + 1U + MAX_FPSEG2 + 1U) -#define FDCBT_MIN_TIME_QUANTA (5U) - -#define MAX_TDCOFF ((uint32_t)CAN_FDCTRL_TDCOFF_MASK >> CAN_FDCTRL_TDCOFF_SHIFT) - -#define MAX_NTSEG1 (CAN_ENCBT_NTSEG1_MASK >> CAN_ENCBT_NTSEG1_SHIFT) -#define MAX_NTSEG2 (CAN_ENCBT_NTSEG2_MASK >> CAN_ENCBT_NTSEG2_SHIFT) -#define MAX_NRJW (CAN_ENCBT_NRJW_MASK >> CAN_ENCBT_NRJW_SHIFT) -#define MAX_ENPRESDIV (CAN_EPRS_ENPRESDIV_MASK >> CAN_EPRS_ENPRESDIV_SHIFT) -#define ENCBT_MAX_TIME_QUANTA (1U + MAX_NTSEG1 + 1U + MAX_NTSEG2 + 1U) -#define ENCBT_MIN_TIME_QUANTA (8U) - -#define MAX_DTSEG1 (CAN_EDCBT_DTSEG1_MASK >> CAN_EDCBT_DTSEG1_SHIFT) -#define MAX_DTSEG2 (CAN_EDCBT_DTSEG2_MASK >> CAN_EDCBT_DTSEG2_SHIFT) -#define MAX_DRJW (CAN_EDCBT_DRJW_MASK >> CAN_EDCBT_DRJW_SHIFT) -#define MAX_EDPRESDIV (CAN_EPRS_EDPRESDIV_MASK >> CAN_EPRS_EDPRESDIV_SHIFT) -#define EDCBT_MAX_TIME_QUANTA (1U + MAX_DTSEG1 + 1U + MAX_DTSEG2 + 1U) -#define EDCBT_MIN_TIME_QUANTA (5U) - -#define MAX_ETDCOFF ((uint32_t)CAN_ETDC_ETDCOFF_MASK >> CAN_ETDC_ETDCOFF_SHIFT) - -/* TSEG1 corresponds to the sum of xPROPSEG and xPSEG1, TSEG2 corresponds to the xPSEG2 value. */ -#define MIN_TIME_SEGMENT1 (2U) -#define MIN_TIME_SEGMENT2 (2U) - -/* Define maximum CAN and CAN FD bit rate supported by FLEXCAN. */ -#define MAX_CANFD_BITRATE (8000000U) -#define MAX_CAN_BITRATE (1000000U) - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) -#define CAN_ESR1_FLTCONF_BUSOFF CAN_ESR1_FLTCONF(2U) -#endif - -/* Define the range of memory that needs to be initialized when the device has memory error detection feature. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -#define CAN_INIT_RXFIR ((uint32_t)base + 0x4Cu) -#define CAN_INIT_MEMORY_BASE_1 (uint32_t *)((uint32_t)base + (uint32_t)FSL_FEATURE_FLEXCAN_INIT_MEMORY_BASE_1) -#define CAN_INIT_MEMORY_SIZE_1 FSL_FEATURE_FLEXCAN_INIT_MEMORY_SIZE_1 -#define CAN_INIT_MEMORY_BASE_2 (uint32_t *)((uint32_t)base + (uint32_t)FSL_FEATURE_FLEXCAN_INIT_MEMORY_BASE_2) -#define CAN_INIT_MEMORY_SIZE_2 FSL_FEATURE_FLEXCAN_INIT_MEMORY_SIZE_2 -#endif - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -#ifndef CAN_CLOCK_CHECK_NO_AFFECTS -/* If no define such MACRO, it mean that the CAN in current device have no clock affect issue. */ -#define CAN_CLOCK_CHECK_NO_AFFECTS (true) -#endif /* CAN_CLOCK_CHECK_NO_AFFECTS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief FlexCAN Internal State. */ -enum _flexcan_state -{ - kFLEXCAN_StateIdle = 0x0, /*!< MB/RxFIFO idle.*/ - kFLEXCAN_StateRxData = 0x1, /*!< MB receiving.*/ - kFLEXCAN_StateRxRemote = 0x2, /*!< MB receiving remote reply.*/ - kFLEXCAN_StateTxData = 0x3, /*!< MB transmitting.*/ - kFLEXCAN_StateTxRemote = 0x4, /*!< MB transmitting remote request.*/ - kFLEXCAN_StateRxFifo = 0x5, /*!< RxFIFO receiving.*/ -}; - -/*! @brief FlexCAN message buffer CODE for Rx buffers. */ -enum _flexcan_mb_code_rx -{ - kFLEXCAN_RxMbInactive = 0x0, /*!< MB is not active.*/ - kFLEXCAN_RxMbFull = 0x2, /*!< MB is full.*/ - kFLEXCAN_RxMbEmpty = 0x4, /*!< MB is active and empty.*/ - kFLEXCAN_RxMbOverrun = 0x6, /*!< MB is overwritten into a full buffer.*/ - kFLEXCAN_RxMbBusy = 0x8, /*!< FlexCAN is updating the contents of the MB, The CPU must not access the MB.*/ - kFLEXCAN_RxMbRanswer = 0xA, /*!< A frame was configured to recognize a Remote Request Frame and transmit a - Response Frame in return.*/ - kFLEXCAN_RxMbNotUsed = 0xF, /*!< Not used.*/ -}; - -/*! @brief FlexCAN message buffer CODE FOR Tx buffers. */ -enum _flexcan_mb_code_tx -{ - kFLEXCAN_TxMbInactive = 0x8, /*!< MB is not active.*/ - kFLEXCAN_TxMbAbort = 0x9, /*!< MB is aborted.*/ - kFLEXCAN_TxMbDataOrRemote = 0xC, /*!< MB is a TX Data Frame(when MB RTR = 0) or MB is a TX Remote Request - Frame (when MB RTR = 1).*/ - kFLEXCAN_TxMbTanswer = 0xE, /*!< MB is a TX Response Request Frame from an incoming Remote Request Frame.*/ - kFLEXCAN_TxMbNotUsed = 0xF, /*!< Not used.*/ -}; - -/* Typedef for interrupt handler. */ -typedef void (*flexcan_isr_t)(CAN_Type *base, flexcan_handle_t *handle); - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -#if !defined(NDEBUG) -/*! - * @brief Check if Message Buffer is occupied by Rx FIFO. - * - * This function check if Message Buffer is occupied by Rx FIFO. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN Message Buffer index. - * @return TRUE if the index MB is occupied by Rx FIFO, FALSE if the index MB not occupied by Rx FIFO. - */ -static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx); -#endif - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) -/*! - * @brief Get the first valid Message buffer ID of give FlexCAN instance. - * - * This function is a helper function for Errata 5641 workaround. - * - * @param base FlexCAN peripheral base address. - * @return The first valid Message Buffer Number. - */ -static uint8_t FLEXCAN_GetFirstValidMb(CAN_Type *base); -#endif - -/*! - * @brief Check if Message Buffer interrupt is enabled. - * - * This function check if Message Buffer interrupt is enabled. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN Message Buffer index. - * - * @return TRUE if the index MB interrupt mask enabled, FALSE if the index MB interrupt mask disabled. - */ -static bool FLEXCAN_IsMbIntEnabled(CAN_Type *base, uint8_t mbIdx); - -/*! - * @brief Reset the FlexCAN Instance. - * - * Restores the FlexCAN module to reset state, notice that this function - * will set all the registers to reset state so the FlexCAN module can not work - * after calling this API. - * - * @param base FlexCAN peripheral base address. - */ -static void FLEXCAN_Reset(CAN_Type *base); - -/*! - * @brief Set bit rate of FlexCAN classical CAN frame or CAN FD frame nominal phase. - * - * This function set the bit rate of classical CAN frame or CAN FD frame nominal phase base on the value of the - * parameter passed in. Users need to ensure that the timing segment values (phaseSeg1, phaseSeg2 and propSeg) match the - * clock and bit rate, if not match, the final output bit rate may not equal the bitRate_Bps value. Suggest use - * FLEXCAN_CalculateImprovedTimingValues() to get timing configuration. - * - * @param base FlexCAN peripheral base address. - * @param sourceClock_Hz Source Clock in Hz. - * @param bitRate_Bps Bit rate in Bps. - * @param timingConfig FlexCAN timingConfig. - */ -static void FLEXCAN_SetBitRate(CAN_Type *base, - uint32_t sourceClock_Hz, - uint32_t bitRate_Bps, - flexcan_timing_config_t timingConfig); - -/*! - * @brief Calculates the segment values for a single bit time for classical CAN. - * - * This function use to calculates the Classical CAN segment values which will be set in CTRL1/CBT/ENCBT register. - * - * @param base FlexCAN peripheral base address. - * @param tqNum Number of time quantas per bit, range in 8 ~ 25 when use CTRL1, range in 8 ~ 129 when use CBT, range in - * 8 ~ 385 when use ENCBT. param pTimingConfig Pointer to the FlexCAN timing configuration structure. - */ -static void FLEXCAN_GetSegments(CAN_Type *base, - uint32_t bitRate, - uint32_t tqNum, - flexcan_timing_config_t *pTimingConfig); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Set data phase bit rate of FlexCAN FD frame. - * - * This function set the data phase bit rate of CAN FD frame base on the value of the parameter - * passed in. Users need to ensure that the timing segment values (fphaseSeg1, fphaseSeg2 and fpropSeg) match the clock - * and bit rate, if not match, the final output bit rate may not equal the bitRateFD value. Suggest use - * FLEXCAN_FDCalculateImprovedTimingValues() to get timing configuration. - * - * - * @param base FlexCAN peripheral base address. - * @param sourceClock_Hz Source Clock in Hz. - * @param bitRateFD_Bps FD frame data phase bit rate in Bps. - * @param timingConfig FlexCAN timingConfig. - */ -static void FLEXCAN_SetFDBitRate(CAN_Type *base, - uint32_t sourceClock_Hz, - uint32_t bitRateFD_Bps, - flexcan_timing_config_t timingConfig); - -/*! - * @brief Get Mailbox offset number by dword. - * - * This function gets the offset number of the specified mailbox. - * Mailbox is not consecutive between memory regions when payload is not 8 bytes - * so need to calculate the specified mailbox address. - * For example, in the first memory region, MB[0].CS address is 0x4002_4080. For 32 bytes - * payload frame, the second mailbox is ((1/12)*512 + 1%12*40)/4 = 10, meaning 10 dword - * after the 0x4002_4080, which is actually the address of mailbox MB[1].CS. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx Mailbox index. - */ -static uint32_t FLEXCAN_GetFDMailboxOffset(CAN_Type *base, uint8_t mbIdx); - -/*! - * @brief Calculates the segment values for a single bit time for CAN FD data phase. - * - * This function use to calculates the CAN FD data phase segment values which will be set in CFDCBT/EDCBT - * register. - * - * @param bitRateFD Data phase bit rate - * @param tqNum Number of time quanta per bit - * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. - */ -static void FLEXCAN_FDGetSegments(uint32_t bitRateFD, uint32_t tqNum, flexcan_timing_config_t *pTimingConfig); - -/*! - * @brief Calculates the improved timing values by specific bit rate for CAN FD nominal phase. - * - * This function use to calculates the CAN FD nominal phase timing values according to the given nominal phase bit rate. - * The Calculated timing values will be set in CBT/ENCBT registers. The calculation is based on the recommendation of - * the CiA 1301 v1.0.0 document. - * - * @param bitRate The CAN FD nominal phase speed in bps defined by user, should be less than or equal to 1Mbps. - * @param sourceClock_Hz The Source clock frequency in Hz. - * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. - * - * @return TRUE if timing configuration found, FALSE if failed to find configuration. - */ -static bool FLEXCAN_CalculateImprovedNominalTimingValues(uint32_t bitRate, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig); - -#endif - -/*! - * @brief Check unhandle interrupt events - * - * @param base FlexCAN peripheral base address. - * @return TRUE if unhandled interrupt action exist, FALSE if no unhandlered interrupt action exist. - */ -static bool FLEXCAN_CheckUnhandleInterruptEvents(CAN_Type *base); - -/*! - * @brief Sub Handler Data Trasfered Events - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pResult Pointer to the Handle result. - * - * @return the status after handle each data transfered event. - */ -static status_t FLEXCAN_SubHandlerForDataTransfered(CAN_Type *base, flexcan_handle_t *handle, uint32_t *pResult); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Sub Handler Ehanced Rx FIFO event - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param flags FlexCAN interrupt flags. - * - * @return the status after handle Ehanced Rx FIFO event. - */ -static status_t FLEXCAN_SubHandlerForEhancedRxFifo(CAN_Type *base, flexcan_handle_t *handle, uint64_t flags); -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* Array of FlexCAN peripheral base address. */ -static CAN_Type *const s_flexcanBases[] = CAN_BASE_PTRS; - -/* Array of FlexCAN IRQ number. */ -static const IRQn_Type s_flexcanRxWarningIRQ[] = CAN_Rx_Warning_IRQS; -static const IRQn_Type s_flexcanTxWarningIRQ[] = CAN_Tx_Warning_IRQS; -static const IRQn_Type s_flexcanWakeUpIRQ[] = CAN_Wake_Up_IRQS; -static const IRQn_Type s_flexcanErrorIRQ[] = CAN_Error_IRQS; -static const IRQn_Type s_flexcanBusOffIRQ[] = CAN_Bus_Off_IRQS; -static const IRQn_Type s_flexcanMbIRQ[] = CAN_ORed_Message_buffer_IRQS; - -/* Array of FlexCAN handle. */ -static flexcan_handle_t *s_flexcanHandle[ARRAY_SIZE(s_flexcanBases)]; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of FlexCAN clock name. */ -static const clock_ip_name_t s_flexcanClock[] = FLEXCAN_CLOCKS; -#if defined(FLEXCAN_PERIPH_CLOCKS) -/* Array of FlexCAN serial clock name. */ -static const clock_ip_name_t s_flexcanPeriphClock[] = FLEXCAN_PERIPH_CLOCKS; -#endif /* FLEXCAN_PERIPH_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/* FlexCAN ISR for transactional APIs. */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -static flexcan_isr_t s_flexcanIsr = (flexcan_isr_t)DefaultISR; -#else -static flexcan_isr_t s_flexcanIsr; -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ -/*! - * brief Get the FlexCAN instance from peripheral base address. - * - * param base FlexCAN peripheral base address. - * return FlexCAN instance. - */ -uint32_t FLEXCAN_GetInstance(CAN_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_flexcanBases); instance++) - { - if (s_flexcanBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_flexcanBases)); - - return instance; -} - -/*! - * brief Enter FlexCAN Freeze Mode. - * - * This function makes the FlexCAN work under Freeze Mode. - * - * param base FlexCAN peripheral base address. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) -void FLEXCAN_EnterFreezeMode(CAN_Type *base) -{ - uint32_t u32TimeoutCount = 0U; - uint32_t u32TempMCR = 0U; - uint32_t u32TempIMASK1 = 0U; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint32_t u32TempIMASK2 = 0U; -#endif - - /* Step1: set FRZ enable in MCR. */ - base->MCR |= CAN_MCR_FRZ_MASK; - - /* Step2: to check if MDIS bit set in MCR. if yes, clear it. */ - if (0U != (base->MCR & CAN_MCR_MDIS_MASK)) - { - base->MCR &= ~CAN_MCR_MDIS_MASK; - } - - /* Step3: polling LPMACK. */ - u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; - while ((0U == (base->MCR & CAN_MCR_LPMACK_MASK)) && (u32TimeoutCount > 0U)) - { - u32TimeoutCount--; - } - - /* Step4: to check FLTCONF in ESR1 register */ - if (0U == (base->ESR1 & CAN_ESR1_FLTCONF_BUSOFF)) - { - /* Step5B: Set Halt bits. */ - base->MCR |= CAN_MCR_HALT_MASK; - - /* Step6B: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set, timeout need more than 178 - * CAN bit length, so 20 multiply timeout is enough. */ - u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT * 20U; - while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) - { - u32TimeoutCount--; - } - } - else - { - /* backup MCR and IMASK register. Errata document not descript it, but we need backup for step 8A and 9A. */ - u32TempMCR = base->MCR; - u32TempIMASK1 = base->IMASK1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - u32TempIMASK2 = base->IMASK2; -#endif - - /* Step5A: Set the Soft Reset bit ((SOFTRST) in the MCR.*/ - base->MCR |= CAN_MCR_SOFTRST_MASK; - - /* Step6A: Poll the MCR register until the Soft Reset (SOFTRST) bit is cleared. */ - u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; - while ((CAN_MCR_SOFTRST_MASK == (base->MCR & CAN_MCR_SOFTRST_MASK)) && (u32TimeoutCount > 0U)) - { - u32TimeoutCount--; - } - - /* Step7A: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set. */ - u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; - while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) - { - u32TimeoutCount--; - } - - /* Step8A: reconfig MCR. */ - base->MCR = u32TempMCR; - - /* Step9A: reconfig IMASK. */ - base->IMASK1 = u32TempIMASK1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IMASK2 = u32TempIMASK2; -#endif - } -} -#elif (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_8341) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_8341) -void FLEXCAN_EnterFreezeMode(CAN_Type *base) -{ - uint32_t u32TimeoutCount = 0U; - uint32_t u32TempMCR = 0U; - uint32_t u32TempIMASK1 = 0U; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint32_t u32TempIMASK2 = 0U; -#endif - - /* Step1: set FRZ and HALT bit enable in MCR. */ - base->MCR |= CAN_MCR_FRZ_MASK; - base->MCR |= CAN_MCR_HALT_MASK; - - /* Step2: to check if MDIS bit set in MCR. if yes, clear it. */ - if (0U != (base->MCR & CAN_MCR_MDIS_MASK)) - { - base->MCR &= ~CAN_MCR_MDIS_MASK; - } - - /* Step3: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set. */ - u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT * 100U; - while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) - { - u32TimeoutCount--; - } - - /* Step4: check whether the timeout reached. if no skip step5 to step8. */ - if (0U == u32TimeoutCount) - { - /* backup MCR and IMASK register. Errata document not descript it, but we need backup for step 8A and 9A. */ - u32TempMCR = base->MCR; - u32TempIMASK1 = base->IMASK1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - u32TempIMASK2 = base->IMASK2; -#endif - /* Step5: Set the Soft Reset bit ((SOFTRST) in the MCR.*/ - base->MCR |= CAN_MCR_SOFTRST_MASK; - - /* Step6: Poll the MCR register until the Soft Reset (SOFTRST) bit is cleared. */ - while (CAN_MCR_SOFTRST_MASK == (base->MCR & CAN_MCR_SOFTRST_MASK)) - { - } - - /* Step7: reconfig MCR. */ - base->MCR = u32TempMCR; - - /* Step8: reconfig IMASK. */ - base->IMASK1 = u32TempIMASK1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IMASK2 = u32TempIMASK2; -#endif - } -} -#else -void FLEXCAN_EnterFreezeMode(CAN_Type *base) -{ - /* Set Freeze, Halt bits. */ - base->MCR |= CAN_MCR_FRZ_MASK; - base->MCR |= CAN_MCR_HALT_MASK; - while (0U == (base->MCR & CAN_MCR_FRZACK_MASK)) - { - } -} -#endif - -/*! - * brief Exit FlexCAN Freeze Mode. - * - * This function makes the FlexCAN leave Freeze Mode. - * - * param base FlexCAN peripheral base address. - */ -void FLEXCAN_ExitFreezeMode(CAN_Type *base) -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Clean FlexCAN Access With Non-Correctable Error Interrupt Flag to avoid be put in freeze mode. */ - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag | - (uint64_t)kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag); -#endif - - /* Clear Freeze, Halt bits. */ - base->MCR &= ~CAN_MCR_HALT_MASK; - base->MCR &= ~CAN_MCR_FRZ_MASK; - - /* Wait until the FlexCAN Module exit freeze mode. */ - while (0U != (base->MCR & CAN_MCR_FRZACK_MASK)) - { - } -} - -#if !defined(NDEBUG) -/*! - * brief Check if Message Buffer is occupied by Rx FIFO. - * - * This function check if Message Buffer is occupied by Rx FIFO. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN Message Buffer index. - * return TRUE if the index MB is occupied by Rx FIFO, FALSE if the index MB not occupied by Rx FIFO. - */ -static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx) -{ - uint8_t lastOccupiedMb; - bool fgRet; - - /* Is Rx FIFO enabled? */ - if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) - { - /* Get RFFN value. */ - lastOccupiedMb = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); - /* Calculate the number of last Message Buffer occupied by Rx FIFO. */ - lastOccupiedMb = ((lastOccupiedMb + 1U) * 2U) + 5U; - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - /* the first valid MB should be occupied by ERRATA 5461 or 5829. */ - lastOccupiedMb += 1U; -#endif - fgRet = (mbIdx <= lastOccupiedMb); - } - else - { -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - if (0U == mbIdx) - { - fgRet = true; - } - else -#endif - { - fgRet = false; - } - } - - return fgRet; -} -#endif - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) -/*! - * brief Get the first valid Message buffer ID of give FlexCAN instance. - * - * This function is a helper function for Errata 5641 workaround. - * - * param base FlexCAN peripheral base address. - * return The first valid Message Buffer Number. - */ -static uint8_t FLEXCAN_GetFirstValidMb(CAN_Type *base) -{ - uint8_t firstValidMbNum; - - if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) - { - firstValidMbNum = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); - firstValidMbNum = ((firstValidMbNum + 1U) * 2U) + 6U; - } - else - { - firstValidMbNum = 0U; - } - - return firstValidMbNum; -} -#endif - -/*! - * brief Check if Message Buffer interrupt is enabled. - * - * This function check if Message Buffer interrupt is enabled. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN Message Buffer index. - * - * return TRUE if the index MB interrupt mask enabled, FALSE if the index MB interrupt mask disabled. - */ -static bool FLEXCAN_IsMbIntEnabled(CAN_Type *base, uint8_t mbIdx) -{ - /* Assertion. */ - assert(mbIdx < (uint8_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)); - - uint32_t flag = 1U; - bool fgRet = false; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - if (mbIdx >= 32U) - { - fgRet = (0U != (base->IMASK2 & (flag << (mbIdx - 32U)))); - } - else -#endif - { - fgRet = (0U != (base->IMASK1 & (flag << mbIdx))); - } - - return fgRet; -} - -/*! - * brief Reset the FlexCAN Instance. - * - * Restores the FlexCAN module to reset state, notice that this function - * will set all the registers to reset state so the FlexCAN module can not work - * after calling this API. - * - * param base FlexCAN peripheral base address. - */ -static void FLEXCAN_Reset(CAN_Type *base) -{ - /* The module must should be first exit from low power - * mode, and then soft reset can be applied. - */ - assert(0U == (base->MCR & CAN_MCR_MDIS_MASK)); - - uint8_t i; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) - if (0 != (FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(base))) - { - /* De-assert DOZE Enable Bit. */ - base->MCR &= ~CAN_MCR_DOZE_MASK; - } -#endif - - /* Wait until FlexCAN exit from any Low Power Mode. */ - while (0U != (base->MCR & CAN_MCR_LPMACK_MASK)) - { - } - - /* Assert Soft Reset Signal. */ - base->MCR |= CAN_MCR_SOFTRST_MASK; - /* Wait until FlexCAN reset completes. */ - while (0U != (base->MCR & CAN_MCR_SOFTRST_MASK)) - { - } - -/* Reset MCR register. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER) && FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER) - base->MCR |= CAN_MCR_WRNEN_MASK | CAN_MCR_WAKSRC_MASK | - CAN_MCR_MAXMB((uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1U); -#else - base->MCR |= - CAN_MCR_WRNEN_MASK | CAN_MCR_MAXMB((uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1U); -#endif - -/* Reset CTRL1 and CTRL2 register. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - /* SMP bit cannot be asserted when CAN FD is enabled */ - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { - base->CTRL1 = 0x0; - } - else - { - base->CTRL1 = CAN_CTRL1_SMP_MASK; - } -#else - base->CTRL1 = CAN_CTRL1_SMP_MASK; -#endif - base->CTRL2 = CAN_CTRL2_TASD(0x16) | CAN_CTRL2_RRS_MASK | CAN_CTRL2_EACEN_MASK; - base->CTRL1 = CAN_CTRL1_SMP_MASK; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Clean all Wake Up Message Buffer memory. */ - (void)memset((void *)&base->WMB[0], 0, sizeof(base->WMB)); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Enable unrestricted write access to FlexCAN memory. */ - base->CTRL2 |= CAN_CTRL2_WRMFRZ_MASK; - /* Do memory initialization for all FlexCAN RAM in order to have the parity bits in memory properly - updated. */ - *(volatile uint32_t *)CAN_INIT_RXFIR = 0x0U; - (void)memset((void *)CAN_INIT_MEMORY_BASE_1, 0, CAN_INIT_MEMORY_SIZE_1); - (void)memset((void *)CAN_INIT_MEMORY_BASE_2, 0, CAN_INIT_MEMORY_SIZE_2); - /* Disable unrestricted write access to FlexCAN memory. */ - base->CTRL2 &= ~CAN_CTRL2_WRMFRZ_MASK; - - /* Clean all memory error flags. */ - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_AllMemoryErrorFlag); -#else - /* Only need clean all Message Buffer memory. */ - (void)memset((void *)&base->MB[0], 0, sizeof(base->MB)); -#endif - - /* Clean all individual Rx Mask of Message Buffers. */ - for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); i++) - { - base->RXIMR[i] = 0x3FFFFFFF; - } - - /* Clean Global Mask of Message Buffers. */ - base->RXMGMASK = 0x3FFFFFFF; - /* Clean Global Mask of Message Buffer 14. */ - base->RX14MASK = 0x3FFFFFFF; - /* Clean Global Mask of Message Buffer 15. */ - base->RX15MASK = 0x3FFFFFFF; - /* Clean Global Mask of Rx FIFO. */ - base->RXFGMASK = 0x3FFFFFFF; -} - -/*! - * brief Set bit rate of FlexCAN classical CAN frame or CAN FD frame nominal phase. - * - * This function set the bit rate of classical CAN frame or CAN FD frame nominal phase base on the value of the - * parameter passed in. Users need to ensure that the timing segment values (phaseSeg1, phaseSeg2 and propSeg) match the - * clock and bit rate, if not match, the final output bit rate may not equal the bitRate_Bps value. Suggest use - * FLEXCAN_CalculateImprovedTimingValues() to get timing configuration. - * - * param base FlexCAN peripheral base address. - * param sourceClock_Hz Source Clock in Hz. - * param bitRate_Bps Bit rate in Bps. - * param timingConfig FlexCAN timingConfig. - */ -static void FLEXCAN_SetBitRate(CAN_Type *base, - uint32_t sourceClock_Hz, - uint32_t bitRate_Bps, - flexcan_timing_config_t timingConfig) -{ - /* FlexCAN classical CAN frame or CAN FD frame nominal phase timing setting formula: - * quantum = 1 + (phaseSeg1 + 1) + (phaseSeg2 + 1) + (propSeg + 1); - */ - uint32_t quantum = (1U + ((uint32_t)timingConfig.phaseSeg1 + 1U) + ((uint32_t)timingConfig.phaseSeg2 + 1U) + - ((uint32_t)timingConfig.propSeg + 1U)); - - /* Assertion: Desired bit rate is too high. */ - assert(bitRate_Bps <= 1000000U); - /* Assertion: Source clock should greater than or equal to bit rate * quantum. */ - assert((bitRate_Bps * quantum) <= sourceClock_Hz); - /* Assertion: Desired bit rate is too low, the bit rate * quantum * max prescaler divider value should greater than - or equal to source clock. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - assert((bitRate_Bps * quantum * MAX_ENPRESDIV) >= sourceClock_Hz); -#else - assert((bitRate_Bps * quantum * MAX_EPRESDIV) >= sourceClock_Hz); -#endif - } - else - { - assert((bitRate_Bps * quantum * MAX_PRESDIV) >= sourceClock_Hz); - } -#else - assert((bitRate_Bps * quantum * MAX_PRESDIV) >= sourceClock_Hz); -#endif - if (quantum < (MIN_TIME_SEGMENT1 + MIN_TIME_SEGMENT2 + 1U)) - { - /* No valid timing configuration. */ - timingConfig.preDivider = 0U; - } - else - { - timingConfig.preDivider = (uint16_t)((sourceClock_Hz / (bitRate_Bps * quantum)) - 1U); - } - - /* Update actual timing characteristic. */ - FLEXCAN_SetTimingConfig(base, (const flexcan_timing_config_t *)(uint32_t)&timingConfig); -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Set data phase bit rate of FlexCAN FD frame. - * - * This function set the data phase bit rate of CAN FD frame base on the value of the parameter - * passed in. Users need to ensure that the timing segment values (fphaseSeg1, fphaseSeg2 and fpropSeg) match the clock - * and bit rate, if not match, the final output bit rate may not equal the bitRateFD value. Suggest use - * FLEXCAN_FDCalculateImprovedTimingValues() to get timing configuration. - * - * - * param base FlexCAN peripheral base address. - * param sourceClock_Hz Source Clock in Hz. - * param bitRateFD_Bps FD frame data phase bit rate in Bps. - * param timingConfig FlexCAN timingConfig. - */ -static void FLEXCAN_SetFDBitRate(CAN_Type *base, - uint32_t sourceClock_Hz, - uint32_t bitRateFD_Bps, - flexcan_timing_config_t timingConfig) -{ - /* FlexCAN FD frame data phase timing setting formula: - * quantum = 1 + (fphaseSeg1 + 1) + (fphaseSeg2 + 1) + fpropSeg; - */ - uint32_t quantum = (1U + ((uint32_t)timingConfig.fphaseSeg1 + 1U) + ((uint32_t)timingConfig.fphaseSeg2 + 1U) + - (uint32_t)timingConfig.fpropSeg); - - /* Assertion: Desired bit rate is too high. */ - assert(bitRateFD_Bps <= 8000000U); - /* Assertion: Source clock should greater than or equal to bit rate * quantum. */ - assert((bitRateFD_Bps * quantum) <= sourceClock_Hz); -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Assertion: Desired bit rate is too low, the bit rate * quantum * max prescaler divider value should greater than - or equal to source clock. */ - assert((bitRateFD_Bps * quantum * MAX_EDPRESDIV) >= sourceClock_Hz); -#else - assert((bitRateFD_Bps * quantum * MAX_FPRESDIV) >= sourceClock_Hz); -#endif - if (quantum < (MIN_TIME_SEGMENT1 + MIN_TIME_SEGMENT2 + 1U)) - { - /* No valid data phase timing configuration. */ - timingConfig.fpreDivider = 0U; - } - else - { - timingConfig.fpreDivider = (uint16_t)((sourceClock_Hz / (bitRateFD_Bps * quantum)) - 1U); - } - - /* Update actual timing characteristic. */ - FLEXCAN_SetFDTimingConfig(base, (const flexcan_timing_config_t *)(uint32_t)&timingConfig); -} -#endif - -/*! - * brief Initializes a FlexCAN instance. - * - * This function initializes the FlexCAN module with user-defined settings. - * This example shows how to set up the flexcan_config_t parameters and how - * to call the FLEXCAN_Init function by passing in these parameters. - * code - * flexcan_config_t flexcanConfig; - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig.bitRate = 1000000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.disableSelfReception = false; - * flexcanConfig.enableListenOnlyMode = false; - * flexcanConfig.enableDoze = false; - * flexcanConfig.timingConfig = timingConfig; - * FLEXCAN_Init(CAN0, &flexcanConfig, 40000000UL); - * endcode - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the user-defined configuration structure. - * param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. - */ -void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz) -{ - /* Assertion. */ - assert(NULL != pConfig); - assert((pConfig->maxMbNum > 0U) && - (pConfig->maxMbNum <= (uint8_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base))); - assert(pConfig->bitRate > 0U); - - uint32_t mcrTemp; - uint32_t ctrl1Temp; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance; -#endif - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - instance = FLEXCAN_GetInstance(base); - /* Enable FlexCAN clock. */ - (void)CLOCK_EnableClock(s_flexcanClock[instance]); - /* - * Check the CAN clock in this device whether affected by Other clock gate - * If it affected, we'd better to change other clock source, - * If user insist on using that clock source, user need open these gate at same time, - * In this scene, User need to care the power consumption. - */ - assert(CAN_CLOCK_CHECK_NO_AFFECTS); -#if defined(FLEXCAN_PERIPH_CLOCKS) - /* Enable FlexCAN serial clock. */ - (void)CLOCK_EnableClock(s_flexcanPeriphClock[instance]); -#endif /* FLEXCAN_PERIPH_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(CAN_CTRL1_CLKSRC_MASK) -#if (defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE) && FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE) - if (0 == FSL_FEATURE_FLEXCAN_INSTANCE_SUPPORT_ENGINE_CLK_SEL_REMOVEn(base)) -#endif /* FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE */ - { - /* Disable FlexCAN Module. */ - FLEXCAN_Enable(base, false); - - /* Protocol-Engine clock source selection, This bit must be set - * when FlexCAN Module in Disable Mode. - */ - base->CTRL1 = (kFLEXCAN_ClkSrc0 == pConfig->clkSrc) ? (base->CTRL1 & ~CAN_CTRL1_CLKSRC_MASK) : - (base->CTRL1 | CAN_CTRL1_CLKSRC_MASK); - } -#endif /* CAN_CTRL1_CLKSRC_MASK */ - - /* Enable FlexCAN Module for configuration. */ - FLEXCAN_Enable(base, true); - - /* Reset to known status. */ - FLEXCAN_Reset(base); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Enable to update in MCER. */ - base->CTRL2 |= CAN_CTRL2_ECRWRE_MASK; - base->MECR &= ~CAN_MECR_ECRWRDIS_MASK; - - /* Enable/Disable Memory Error Detection and Correction.*/ - base->MECR = (pConfig->enableMemoryErrorControl) ? (base->MECR & ~CAN_MECR_ECCDIS_MASK) : - (base->MECR | CAN_MECR_ECCDIS_MASK); - - /* Enable/Disable Non-Correctable Errors In FlexCAN Access Put Device In Freeze Mode. */ - base->MECR = (pConfig->enableNonCorrectableErrorEnterFreeze) ? (base->MECR | CAN_MECR_NCEFAFRZ_MASK) : - (base->MECR & ~CAN_MECR_NCEFAFRZ_MASK); - /* Lock MCER register. */ - base->CTRL2 &= ~CAN_CTRL2_ECRWRE_MASK; -#endif - - /* Save current CTRL1 value and enable to enter Freeze mode(enabled by default). */ - ctrl1Temp = base->CTRL1; - - /* Save current MCR value and enable to enter Freeze mode(enabled by default). */ - mcrTemp = base->MCR; - - /* Enable Loop Back Mode? */ - ctrl1Temp = (pConfig->enableLoopBack) ? (ctrl1Temp | CAN_CTRL1_LPB_MASK) : (ctrl1Temp & ~CAN_CTRL1_LPB_MASK); - - /* Enable Timer Sync? */ - ctrl1Temp = (pConfig->enableTimerSync) ? (ctrl1Temp | CAN_CTRL1_TSYN_MASK) : (ctrl1Temp & ~CAN_CTRL1_TSYN_MASK); - - /* Enable Listen Only Mode? */ - ctrl1Temp = (pConfig->enableListenOnlyMode) ? ctrl1Temp | CAN_CTRL1_LOM_MASK : ctrl1Temp & ~CAN_CTRL1_LOM_MASK; - - /* Set the maximum number of Message Buffers */ - mcrTemp = (mcrTemp & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB((uint32_t)pConfig->maxMbNum - 1U); - - /* Enable Self Wake Up Mode and configure the wake up source. */ - mcrTemp = (pConfig->enableSelfWakeup) ? (mcrTemp | CAN_MCR_SLFWAK_MASK) : (mcrTemp & ~CAN_MCR_SLFWAK_MASK); - mcrTemp = (kFLEXCAN_WakeupSrcFiltered == pConfig->wakeupSrc) ? (mcrTemp | CAN_MCR_WAKSRC_MASK) : - (mcrTemp & ~CAN_MCR_WAKSRC_MASK); -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Enable Pretended Networking Mode? When Pretended Networking mode is set, Self Wake Up feature must be disabled.*/ - mcrTemp = (pConfig->enablePretendedeNetworking) ? ((mcrTemp & ~CAN_MCR_SLFWAK_MASK) | CAN_MCR_PNET_EN_MASK) : - (mcrTemp & ~CAN_MCR_PNET_EN_MASK); -#endif - - /* Enable Individual Rx Masking and Queue feature? */ - mcrTemp = (pConfig->enableIndividMask) ? (mcrTemp | CAN_MCR_IRMQ_MASK) : (mcrTemp & ~CAN_MCR_IRMQ_MASK); - - /* Disable Self Reception? */ - mcrTemp = (pConfig->disableSelfReception) ? mcrTemp | CAN_MCR_SRXDIS_MASK : mcrTemp & ~CAN_MCR_SRXDIS_MASK; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(base)) - { - /* Enable Doze Mode? */ - mcrTemp = (pConfig->enableDoze) ? (mcrTemp | CAN_MCR_DOZE_MASK) : (mcrTemp & ~CAN_MCR_DOZE_MASK); - } -#endif - - /* Write back CTRL1 Configuration to register. */ - base->CTRL1 = ctrl1Temp; - - /* Write back MCR Configuration to register. */ - base->MCR = mcrTemp; - - /* Bit Rate Configuration.*/ - FLEXCAN_SetBitRate(base, sourceClock_Hz, pConfig->bitRate, pConfig->timingConfig); -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Initializes a FlexCAN instance. - * - * This function initializes the FlexCAN module with user-defined settings. - * This example shows how to set up the flexcan_config_t parameters and how - * to call the FLEXCAN_FDInit function by passing in these parameters. - * code - * flexcan_config_t flexcanConfig; - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig.bitRate = 1000000U; - * flexcanConfig.bitRateFD = 2000000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.disableSelfReception = false; - * flexcanConfig.enableListenOnlyMode = false; - * flexcanConfig.enableDoze = false; - * flexcanConfig.timingConfig = timingConfig; - * FLEXCAN_FDInit(CAN0, &flexcanConfig, 80000000UL, kFLEXCAN_16BperMB, true); - * endcode - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the user-defined configuration structure. - * param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. - * param dataSize FlexCAN Message Buffer payload size. The actual transmitted or received CAN FD frame data size needs - * to be less than or equal to this value. - * param brs True if bit rate switch is enabled in FD mode. - */ -void FLEXCAN_FDInit( - CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz, flexcan_mb_size_t dataSize, bool brs) -{ - assert((uint32_t)dataSize <= 3U); - assert(((pConfig->bitRate < pConfig->bitRateFD) && brs) || ((pConfig->bitRate == pConfig->bitRateFD) && (!brs))); - - uint32_t fdctrl = 0U; - - /* Initialization of classical CAN. */ - FLEXCAN_Init(base, pConfig, sourceClock_Hz); - - /* Extra bit rate setting for CAN FD data phase. */ - FLEXCAN_SetFDBitRate(base, sourceClock_Hz, pConfig->bitRateFD, pConfig->timingConfig); - - /* read FDCTRL register. */ - fdctrl = base->FDCTRL; - - /* Enable FD operation and set bit rate switch. */ - if (brs) - { - fdctrl |= CAN_FDCTRL_FDRATE_MASK; - } - else - { - fdctrl &= ~CAN_FDCTRL_FDRATE_MASK; - } - - /* Before use "|=" operation for multi-bits field, CPU should clean previous Setting. */ - fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR0_MASK) | CAN_FDCTRL_MBDSR0(dataSize); -#if defined(CAN_FDCTRL_MBDSR1_MASK) - fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR1_MASK) | CAN_FDCTRL_MBDSR1(dataSize); -#endif -#if defined(CAN_FDCTRL_MBDSR2_MASK) - fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR2_MASK) | CAN_FDCTRL_MBDSR2(dataSize); -#endif -#if defined(CAN_FDCTRL_MBDSR3_MASK) - fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR3_MASK) | CAN_FDCTRL_MBDSR3(dataSize); -#endif - - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - /* Enable CAN FD operation. */ - base->MCR |= CAN_MCR_FDEN_MASK; - - if (brs && !(pConfig->enableLoopBack)) - { -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* The TDC offset should be configured as shown in this equation : offset = DTSEG1 + 2 */ - if (((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * - (pConfig->timingConfig.fpreDivider + 1U) < - MAX_ETDCOFF) - { - base->ETDC = - CAN_ETDC_ETDCEN_MASK | CAN_ETDC_TDMDIS(!pConfig->enableTransceiverDelayMeasure) | - CAN_ETDC_ETDCOFF(((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * - (pConfig->timingConfig.fpreDivider + 1U)); - } - else - { - /* Enable the Transceiver Delay Compensation */ - base->ETDC = CAN_ETDC_ETDCEN_MASK | CAN_ETDC_TDMDIS(!pConfig->enableTransceiverDelayMeasure) | - CAN_ETDC_ETDCOFF(MAX_ETDCOFF); - } -#else - /* The TDC offset should be configured as shown in this equation : offset = PSEG1 + PROPSEG + 2 */ - if (((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * - (pConfig->timingConfig.fpreDivider + 1U) < - MAX_TDCOFF) - { - fdctrl = - (fdctrl & ~CAN_FDCTRL_TDCOFF_MASK) | - CAN_FDCTRL_TDCOFF(((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * - (pConfig->timingConfig.fpreDivider + 1U)); - } - else - { - fdctrl = (fdctrl & ~CAN_FDCTRL_TDCOFF_MASK) | CAN_FDCTRL_TDCOFF(MAX_TDCOFF); - } - /* Enable the Transceiver Delay Compensation */ - fdctrl = (fdctrl & ~CAN_FDCTRL_TDCEN_MASK) | CAN_FDCTRL_TDCEN_MASK; -#endif - } - - /* update the FDCTL register. */ - base->FDCTRL = fdctrl; - - /* Enable CAN FD ISO mode by default. */ - base->CTRL2 |= CAN_CTRL2_ISOCANFDEN_MASK; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} -#endif - -/*! - * brief De-initializes a FlexCAN instance. - * - * This function disables the FlexCAN module clock and sets all register values - * to the reset value. - * - * param base FlexCAN peripheral base address. - */ -void FLEXCAN_Deinit(CAN_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance; -#endif - /* Reset all Register Contents. */ - FLEXCAN_Reset(base); - - /* Disable FlexCAN module. */ - FLEXCAN_Enable(base, false); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - instance = FLEXCAN_GetInstance(base); -#if defined(FLEXCAN_PERIPH_CLOCKS) - /* Disable FlexCAN serial clock. */ - (void)CLOCK_DisableClock(s_flexcanPeriphClock[instance]); -#endif /* FLEXCAN_PERIPH_CLOCKS */ - /* Disable FlexCAN clock. */ - (void)CLOCK_DisableClock(s_flexcanClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets the default configuration structure. - * - * This function initializes the FlexCAN configuration structure to default values. The default - * values are as follows. - * flexcanConfig->clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig->bitRate = 1000000U; - * flexcanConfig->bitRateFD = 2000000U; - * flexcanConfig->maxMbNum = 16; - * flexcanConfig->enableLoopBack = false; - * flexcanConfig->enableSelfWakeup = false; - * flexcanConfig->enableIndividMask = false; - * flexcanConfig->disableSelfReception = false; - * flexcanConfig->enableListenOnlyMode = false; - * flexcanConfig->enableDoze = false; - * flexcanConfig->enablePretendedeNetworking = false; - * flexcanConfig->enableMemoryErrorControl = true; - * flexcanConfig->enableNonCorrectableErrorEnterFreeze = true; - * flexcanConfig->enableTransceiverDelayMeasure = true; - * flexcanConfig.timingConfig = timingConfig; - * - * param pConfig Pointer to the FlexCAN configuration structure. - */ -void FLEXCAN_GetDefaultConfig(flexcan_config_t *pConfig) -{ - /* Assertion. */ - assert(NULL != pConfig); - - /* Initializes the configure structure to zero. */ - (void)memset(pConfig, 0, sizeof(*pConfig)); - - /* Initialize FlexCAN Module config struct with default value. */ - pConfig->clkSrc = kFLEXCAN_ClkSrc0; - pConfig->bitRate = 1000000U; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - pConfig->bitRateFD = 2000000U; -#endif - pConfig->maxMbNum = 16; - pConfig->enableLoopBack = false; - pConfig->enableTimerSync = true; - pConfig->enableSelfWakeup = false; - pConfig->wakeupSrc = kFLEXCAN_WakeupSrcUnfiltered; - pConfig->enableIndividMask = false; - pConfig->disableSelfReception = false; - pConfig->enableListenOnlyMode = false; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) - pConfig->enableDoze = false; -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - pConfig->enablePretendedeNetworking = false; -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - pConfig->enableMemoryErrorControl = true; - pConfig->enableNonCorrectableErrorEnterFreeze = true; -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - pConfig->enableTransceiverDelayMeasure = true; -#endif - - /* Default protocol timing configuration, nominal bit time quantum is 10 (80% SP), data bit time quantum is 5 - * (60%). Suggest use FLEXCAN_CalculateImprovedTimingValues/FLEXCAN_FDCalculateImprovedTimingValues to get the - * improved timing configuration.*/ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - pConfig->timingConfig.phaseSeg1 = 1; - pConfig->timingConfig.phaseSeg2 = 1; - pConfig->timingConfig.propSeg = 4; - pConfig->timingConfig.rJumpwidth = 1; - pConfig->timingConfig.fphaseSeg1 = 1; - pConfig->timingConfig.fphaseSeg2 = 1; - pConfig->timingConfig.fpropSeg = 0; - pConfig->timingConfig.frJumpwidth = 1; -#else - pConfig->timingConfig.phaseSeg1 = 1; - pConfig->timingConfig.phaseSeg2 = 1; - pConfig->timingConfig.propSeg = 4; - pConfig->timingConfig.rJumpwidth = 1; -#endif -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! - * brief Configures the FlexCAN Pretended Networking mode. - * - * This function configures the FlexCAN Pretended Networking mode with given configuration. - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the FlexCAN Rx FIFO configuration structure. - */ -void FLEXCAN_SetPNConfig(CAN_Type *base, const flexcan_pn_config_t *pConfig) -{ - /* Assertion. */ - assert(NULL != pConfig); - assert(0U != pConfig->matchNum); - uint32_t pnctrl; - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - pnctrl = (pConfig->matchNum > 1U) ? CAN_CTRL1_PN_FCS(0x2U | (uint32_t)pConfig->matchSrc) : - CAN_CTRL1_PN_FCS(pConfig->matchSrc); - pnctrl |= (pConfig->enableMatch) ? (CAN_CTRL1_PN_WUMF_MSK_MASK) : 0U; - pnctrl |= (pConfig->enableTimeout) ? (CAN_CTRL1_PN_WTOF_MSK_MASK) : 0U; - pnctrl |= CAN_CTRL1_PN_NMATCH(pConfig->matchNum) | CAN_CTRL1_PN_IDFS(pConfig->idMatchMode) | - CAN_CTRL1_PN_PLFS(pConfig->dataMatchMode); - base->CTRL1_PN = pnctrl; - base->CTRL2_PN = CAN_CTRL2_PN_MATCHTO(pConfig->timeoutValue); - base->FLT_ID1 = pConfig->idLower; - base->FLT_ID2_IDMASK = pConfig->idUpper; - base->FLT_DLC = CAN_FLT_DLC_FLT_DLC_LO(pConfig->lengthLower) | CAN_FLT_DLC_FLT_DLC_HI(pConfig->lengthUpper); - base->PL1_LO = pConfig->lowerWord0; - base->PL1_HI = pConfig->lowerWord1; - base->PL2_PLMASK_LO = pConfig->upperWord0; - base->PL2_PLMASK_HI = pConfig->upperWord1; - - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_PNMatchIntFlag | (uint64_t)kFLEXCAN_PNTimeoutIntFlag); - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -/*! - * brief Reads a FlexCAN Message from Wake Up MB. - * - * This function reads a CAN message from the FlexCAN Wake up Message Buffers. There are four Wake up Message Buffers - * (WMBs) used to store incoming messages in Pretended Networking mode. The WMB index indicates the arrival order. The - * last message is stored in WMB3. - * - * param base FlexCAN peripheral base address. - * param pRxFrame Pointer to CAN message frame structure for reception. - * param mbIdx The FlexCAN Wake up Message Buffer index. Range in 0x0 ~ 0x3. - * retval kStatus_Success - Read Message from Wake up Message Buffer successfully. - * retval kStatus_Fail - Wake up Message Buffer has no valid content. - */ -status_t FLEXCAN_ReadPNWakeUpMB(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) -{ - /* Assertion. */ - assert(NULL != pRxFrame); - assert(mbIdx <= 0x3U); - - uint32_t cs_temp; - status_t status; - - /* Check if Wake Up MB has valid content. */ - if (CAN_WU_MTC_MCOUNTER(mbIdx) <= (base->WU_MTC & CAN_WU_MTC_MCOUNTER_MASK)) - { - /* Read CS field of wake up Message Buffer. */ - cs_temp = base->WMB[mbIdx].CS; - - /* Store Message ID. */ - pRxFrame->id = base->WMB[mbIdx].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); - - /* Get the message ID and format. */ - pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : - (uint8_t)kFLEXCAN_FrameFormatStandard; - - /* Get the message type. */ - pRxFrame->type = - (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; - - /* Get the message length. */ - pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); - - /* Messages received during Pretended Networking mode don't have time stamps, and the respective field in the - WMB structure must be ignored. */ - pRxFrame->timestamp = 0x0; - - /* Store Message Payload. */ - pRxFrame->dataWord0 = base->WMB[mbIdx].D03; - pRxFrame->dataWord1 = base->WMB[mbIdx].D47; - - status = kStatus_Success; - } - else - { - status = kStatus_Fail; - } - - return status; -} -#endif - -/*! - * brief Sets the FlexCAN classical protocol timing characteristic. - * - * This function gives user settings to classical CAN or CAN FD nominal phase timing characteristic. - * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() - * and get the default timing characteristicsthe, then call FLEXCAN_Init() and fill the - * bit rate field. - * - * note Calling FLEXCAN_SetTimingConfig() overrides the bit rate set - * in FLEXCAN_Init(). - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the timing configuration structure. - */ -void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig) -{ - /* Assertion. */ - assert(NULL != pConfig); - - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Enable extended Bit Timing register ENCBT. */ - base->CTRL2 |= CAN_CTRL2_BTE_MASK; - - /* Updating Timing Setting according to configuration structure. */ - base->EPRS = (base->EPRS & (~CAN_EPRS_ENPRESDIV_MASK)) | CAN_EPRS_ENPRESDIV(pConfig->preDivider); - base->ENCBT = CAN_ENCBT_NRJW(pConfig->rJumpwidth) | - CAN_ENCBT_NTSEG1(pConfig->phaseSeg1 + pConfig->propSeg + 1U) | - CAN_ENCBT_NTSEG2(pConfig->phaseSeg2); -#else - /* Enable Bit Timing register CBT, updating Timing Setting according to configuration structure. */ - base->CBT = CAN_CBT_BTF_MASK | CAN_CBT_EPRESDIV(pConfig->preDivider) | CAN_CBT_ERJW(pConfig->rJumpwidth) | - CAN_CBT_EPSEG1(pConfig->phaseSeg1) | CAN_CBT_EPSEG2(pConfig->phaseSeg2) | - CAN_CBT_EPROPSEG(pConfig->propSeg); -#endif - } - else - { - /* Cleaning previous Timing Setting. */ - base->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_RJW_MASK | CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | - CAN_CTRL1_PROPSEG_MASK); - - /* Updating Timing Setting according to configuration structure. */ - base->CTRL1 |= (CAN_CTRL1_PRESDIV(pConfig->preDivider) | CAN_CTRL1_RJW(pConfig->rJumpwidth) | - CAN_CTRL1_PSEG1(pConfig->phaseSeg1) | CAN_CTRL1_PSEG2(pConfig->phaseSeg2) | - CAN_CTRL1_PROPSEG(pConfig->propSeg)); - } -#else - /* Cleaning previous Timing Setting. */ - base->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_RJW_MASK | CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | - CAN_CTRL1_PROPSEG_MASK); - - /* Updating Timing Setting according to configuration structure. */ - base->CTRL1 |= (CAN_CTRL1_PRESDIV(pConfig->preDivider) | CAN_CTRL1_RJW(pConfig->rJumpwidth) | - CAN_CTRL1_PSEG1(pConfig->phaseSeg1) | CAN_CTRL1_PSEG2(pConfig->phaseSeg2) | - CAN_CTRL1_PROPSEG(pConfig->propSeg)); -#endif - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Sets the FlexCAN FD data phase timing characteristic. - * - * This function gives user settings to CAN FD data phase timing characteristic. - * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() - * and get the default timing characteristicsthe, then call FLEXCAN_FDInit() and fill the - * data phase bit rate field. - * - * note Calling FLEXCAN_SetFDTimingConfig() overrides the bit rate set - * in FLEXCAN_FDInit(). - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the timing configuration structure. - */ -void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig) -{ - /* Assertion. */ - assert(NULL != pConfig); - - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Enable extended Bit Timing register EDCBT. */ - base->CTRL2 |= CAN_CTRL2_BTE_MASK; - - base->EPRS = (base->EPRS & (~CAN_EPRS_EDPRESDIV_MASK)) | CAN_EPRS_EDPRESDIV(pConfig->fpreDivider); - base->EDCBT = CAN_EDCBT_DRJW(pConfig->frJumpwidth) | CAN_EDCBT_DTSEG2(pConfig->fphaseSeg2) | - CAN_EDCBT_DTSEG1((uint32_t)pConfig->fphaseSeg1 + pConfig->fpropSeg); -#else - /* Enable Bit Timing register FDCBT,*/ - base->CBT |= CAN_CBT_BTF_MASK; - /* Cleaning previous Timing Setting. */ - base->FDCBT &= ~(CAN_FDCBT_FPRESDIV_MASK | CAN_FDCBT_FRJW_MASK | CAN_FDCBT_FPSEG1_MASK | CAN_FDCBT_FPSEG2_MASK | - CAN_FDCBT_FPROPSEG_MASK); - - /* Updating Timing Setting according to configuration structure. */ - base->FDCBT |= (CAN_FDCBT_FPRESDIV(pConfig->fpreDivider) | CAN_FDCBT_FRJW(pConfig->frJumpwidth) | - CAN_FDCBT_FPSEG1(pConfig->fphaseSeg1) | CAN_FDCBT_FPSEG2(pConfig->fphaseSeg2) | - CAN_FDCBT_FPROPSEG(pConfig->fpropSeg)); -#endif - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} -#endif - -/*! - * brief Sets the FlexCAN receive message buffer global mask. - * - * This function sets the global mask for the FlexCAN message buffer in a matching process. - * The configuration is only effective when the Rx individual mask is disabled in the FLEXCAN_Init(). - * - * param base FlexCAN peripheral base address. - * param mask Rx Message Buffer Global Mask value. - */ -void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask) -{ - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - /* Setting Rx Message Buffer Global Mask value. */ - base->RXMGMASK = mask; - base->RX14MASK = mask; - base->RX15MASK = mask; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -/*! - * brief Sets the FlexCAN receive FIFO global mask. - * - * This function sets the global mask for FlexCAN FIFO in a matching process. - * - * param base FlexCAN peripheral base address. - * param mask Rx Fifo Global Mask value. - */ -void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask) -{ - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - /* Setting Rx FIFO Global Mask value. */ - base->RXFGMASK = mask; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -/*! - * brief Sets the FlexCAN receive individual mask. - * - * This function sets the individual mask for the FlexCAN matching process. - * The configuration is only effective when the Rx individual mask is enabled in the FLEXCAN_Init(). - * If the Rx FIFO is disabled, the individual mask is applied to the corresponding Message Buffer. - * If the Rx FIFO is enabled, the individual mask for Rx FIFO occupied Message Buffer is applied to - * the Rx Filter with the same index. Note that only the first 32 - * individual masks can be used as the Rx FIFO filter mask. - * - * param base FlexCAN peripheral base address. - * param maskIdx The Index of individual Mask. - * param mask Rx Individual Mask value. - */ -void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask) -{ - assert(maskIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - /* Setting Rx Individual Mask value. */ - base->RXIMR[maskIdx] = mask; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -/*! - * brief Configures a FlexCAN transmit message buffer. - * - * This function aborts the previous transmission, cleans the Message Buffer, and - * configures it as a Transmit Message Buffer. - * - * param base FlexCAN peripheral base address. - * param mbIdx The Message Buffer index. - * param enable Enable/disable Tx Message Buffer. - * - true: Enable Tx Message Buffer. - * - false: Disable Tx Message Buffer. - */ -void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - /* Inactivate Message Buffer. */ - if (enable) - { - base->MB[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); - } - else - { - base->MB[mbIdx].CS = 0; - } - - /* Clean Message Buffer content. */ - base->MB[mbIdx].ID = 0x0; - base->MB[mbIdx].WORD0 = 0x0; - base->MB[mbIdx].WORD1 = 0x0; -} - -/*! - * brief Calculates the segment values for a single bit time for classical CAN. - * - * This function use to calculates the Classical CAN segment values which will be set in CTRL1/CBT/ENCBT register. - * - * param bitRate The classical CAN bit rate in bps. - * param base FlexCAN peripheral base address. - * param tqNum Number of time quantas per bit, range in 8 ~ 25 when use CTRL1, range in 8 ~ 129 when use CBT, range in - * 8 ~ 385 when use ENCBT. param pTimingConfig Pointer to the FlexCAN timing configuration structure. - */ -static void FLEXCAN_GetSegments(CAN_Type *base, - uint32_t bitRate, - uint32_t tqNum, - flexcan_timing_config_t *pTimingConfig) -{ - uint32_t ideal_sp; - uint32_t seg1Max, proSegMax, sjwMAX; - uint32_t seg1Temp; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Maximum value allowed in ENCBT register. */ - seg1Max = MAX_NTSEG2 + 1U; - proSegMax = MAX_NTSEG1 - MAX_NTSEG2; - sjwMAX = MAX_NRJW + 1U; -#else - /* Maximum value allowed in CBT register. */ - seg1Max = MAX_EPSEG1 + 1U; - proSegMax = MAX_EPROPSEG + 1U; - sjwMAX = MAX_ERJW + 1U; -#endif - } - else - { - /* Maximum value allowed in CTRL1 register. */ - seg1Max = MAX_PSEG1 + 1U; - proSegMax = MAX_PROPSEG + 1U; - sjwMAX = MAX_RJW + 1U; - } -#else - /* Maximum value allowed in CTRL1 register. */ - seg1Max = MAX_PSEG1 + 1U; - proSegMax = MAX_PROPSEG + 1U; - sjwMAX = MAX_RJW + 1U; -#endif - - /* Try to find the ideal sample point, according to CiA 301 doc.*/ - if (bitRate == 1000000U) - { - ideal_sp = IDEAL_SP_LOW; - } - else if (bitRate >= 800000U) - { - ideal_sp = IDEAL_SP_MID; - } - else - { - ideal_sp = IDEAL_SP_HIGH; - } - /* Calculates phaseSeg2. */ - pTimingConfig->phaseSeg2 = (uint8_t)(tqNum - (tqNum * ideal_sp) / (uint32_t)IDEAL_SP_FACTOR); - if (pTimingConfig->phaseSeg2 < MIN_TIME_SEGMENT2) - { - pTimingConfig->phaseSeg2 = MIN_TIME_SEGMENT2; - } - else if (pTimingConfig->phaseSeg2 > seg1Max) - { - pTimingConfig->phaseSeg2 = (uint8_t)seg1Max; - } - else - { - ; /* Intentional empty */ - } - - /* Calculates phaseSeg1 and propSeg. */ - seg1Temp = tqNum - pTimingConfig->phaseSeg2 - 1U; - - if (seg1Temp > (seg1Max + proSegMax)) - { - pTimingConfig->phaseSeg2 += (uint8_t)(seg1Temp - seg1Max - proSegMax); - pTimingConfig->propSeg = (uint8_t)proSegMax; - pTimingConfig->phaseSeg1 = (uint8_t)seg1Max; - } - else if (seg1Temp > proSegMax) - { - pTimingConfig->propSeg = (uint8_t)proSegMax; - pTimingConfig->phaseSeg1 = (uint8_t)(seg1Temp - proSegMax); - } - else - { - pTimingConfig->propSeg = (uint8_t)(seg1Temp - 1U); - pTimingConfig->phaseSeg1 = 1U; - } - - /* try to make phaseSeg1 equal to phaseSeg2*/ - if (pTimingConfig->phaseSeg1 < pTimingConfig->phaseSeg2) - { - seg1Temp = - ((pTimingConfig->phaseSeg2 - pTimingConfig->phaseSeg1) > ((uint8_t)proSegMax - pTimingConfig->propSeg)) ? - (proSegMax - pTimingConfig->propSeg) : - (pTimingConfig->phaseSeg2 - pTimingConfig->phaseSeg1); - pTimingConfig->propSeg -= (uint8_t)seg1Temp; - pTimingConfig->phaseSeg1 += (uint8_t)seg1Temp; - } - else - { - seg1Temp = - ((pTimingConfig->phaseSeg1 - pTimingConfig->phaseSeg2) > ((uint8_t)proSegMax - pTimingConfig->propSeg)) ? - (proSegMax - pTimingConfig->propSeg) : - (pTimingConfig->phaseSeg1 - pTimingConfig->phaseSeg2); - pTimingConfig->propSeg += (uint8_t)seg1Temp; - pTimingConfig->phaseSeg1 -= (uint8_t)seg1Temp; - } - - /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ - pTimingConfig->rJumpwidth = - (pTimingConfig->phaseSeg1 > pTimingConfig->phaseSeg2) ? pTimingConfig->phaseSeg2 : pTimingConfig->phaseSeg1; - if (pTimingConfig->rJumpwidth > sjwMAX) - { - pTimingConfig->rJumpwidth = (uint8_t)sjwMAX; - } - - pTimingConfig->phaseSeg1 -= 1U; - pTimingConfig->phaseSeg2 -= 1U; - pTimingConfig->propSeg -= 1U; - pTimingConfig->rJumpwidth -= 1U; -} - -/*! - * brief Calculates the improved timing values by specific bit Rates for classical CAN. - * - * This function use to calculates the Classical CAN timing values according to the given bit rate. The Calculated - * timing values will be set in CTRL1/CBT/ENCBT register. The calculation is based on the recommendation of the CiA 301 - * v4.2.0 and previous version document. - * - * param base FlexCAN peripheral base address. - * param bitRate The classical CAN speed in bps defined by user, should be less than or equal to 1Mbps. - * param sourceClock_Hz The Source clock frequency in Hz. - * param pTimingConfig Pointer to the FlexCAN timing configuration structure. - * - * return TRUE if timing configuration found, FALSE if failed to find configuration. - */ -bool FLEXCAN_CalculateImprovedTimingValues(CAN_Type *base, - uint32_t bitRate, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig) -{ - /* Observe bit rate maximums. */ - assert(bitRate <= MAX_CAN_BITRATE); - - uint32_t clk; - uint32_t tqNum, tqMin, pdivMAX; - uint32_t spTemp = 1000U; - flexcan_timing_config_t configTemp = {0}; - bool fgRet = false; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Auto Improved Protocal timing for ENCBT. */ - tqNum = ENCBT_MAX_TIME_QUANTA; - tqMin = ENCBT_MIN_TIME_QUANTA; - pdivMAX = MAX_ENPRESDIV; -#else - /* Auto Improved Protocal timing for CBT. */ - tqNum = CBT_MAX_TIME_QUANTA; - tqMin = CBT_MIN_TIME_QUANTA; - pdivMAX = MAX_PRESDIV; -#endif - } - else - { - /* Auto Improved Protocal timing for CTRL1. */ - tqNum = CTRL1_MAX_TIME_QUANTA; - tqMin = CTRL1_MIN_TIME_QUANTA; - pdivMAX = MAX_PRESDIV; - } -#else - /* Auto Improved Protocal timing for CTRL1. */ - tqNum = CTRL1_MAX_TIME_QUANTA; - tqMin = CTRL1_MIN_TIME_QUANTA; - pdivMAX = MAX_PRESDIV; -#endif - do - { - clk = bitRate * tqNum; - if (clk > sourceClock_Hz) - { - continue; /* tqNum too large, clk has been exceed sourceClock_Hz. */ - } - - if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) - { - continue; /* Non-supporting: the frequency of clock source is not divisible by target bit rate, the user - should change a divisible bit rate. */ - } - - configTemp.preDivider = (uint16_t)(sourceClock_Hz / clk) - 1U; - if (configTemp.preDivider > pdivMAX) - { - break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider could - not handle it. */ - } - - /* Calculates the best timing configuration under current tqNum. */ - FLEXCAN_GetSegments(base, bitRate, tqNum, &configTemp); - /* Determine whether the calculated timing configuration can get the optimal sampling point. */ - if (((((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum) < spTemp) - { - spTemp = (((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum; - (void)memcpy(pTimingConfig, &configTemp, sizeof(configTemp)); - } - fgRet = true; - } while (--tqNum >= tqMin); - - return fgRet; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Get Mailbox offset number by dword. - * - * This function gets the offset number of the specified mailbox. - * Mailbox is not consecutive between memory regions when payload is not 8 bytes - * so need to calculate the specified mailbox address. - * For example, in the first memory region, MB[0].CS address is 0x4002_4080. For 32 bytes - * payload frame, the second mailbox is ((1/12)*512 + 1%12*40)/4 = 10, meaning 10 dword - * after the 0x4002_4080, which is actually the address of mailbox MB[1].CS. - * - * param base FlexCAN peripheral base address. - * param mbIdx Mailbox index. - */ -static uint32_t FLEXCAN_GetFDMailboxOffset(CAN_Type *base, uint8_t mbIdx) -{ - uint32_t offset = 0; - uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; - switch (dataSize) - { - case (uint32_t)kFLEXCAN_8BperMB: - offset = (((uint32_t)mbIdx / 32U) * 512U + ((uint32_t)mbIdx % 32U) * 16U); - break; - case (uint32_t)kFLEXCAN_16BperMB: - offset = (((uint32_t)mbIdx / 21U) * 512U + ((uint32_t)mbIdx % 21U) * 24U); - break; - case (uint32_t)kFLEXCAN_32BperMB: - offset = (((uint32_t)mbIdx / 12U) * 512U + ((uint32_t)mbIdx % 12U) * 40U); - break; - case (uint32_t)kFLEXCAN_64BperMB: - offset = (((uint32_t)mbIdx / 7U) * 512U + ((uint32_t)mbIdx % 7U) * 72U); - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - assert(false); - break; - } - /* To get the dword aligned offset, need to divide by 4. */ - offset = offset / 4U; - return offset; -} - -/*! - * brief Calculates the segment values for a single bit time for CAN FD data phase. - * - * This function use to calculates the CAN FD data phase segment values which will be set in CFDCBT/EDCBT - * register. - * - * param bitRateFD CAN FD data phase bit rate. - * param tqNum Number of time quanta per bit - * param pTimingConfig Pointer to the FlexCAN timing configuration structure. - */ -static void FLEXCAN_FDGetSegments(uint32_t bitRateFD, uint32_t tqNum, flexcan_timing_config_t *pTimingConfig) -{ - uint32_t ideal_sp; - uint32_t seg1Max, proSegMax, sjwMAX; - uint32_t seg1Temp; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Maximum value allowed in ENCBT register. */ - seg1Max = MAX_DTSEG1; - proSegMax = 0U; - sjwMAX = MAX_DRJW + 1U; -#else - /* Maximum value allowed in CBT register. */ - seg1Max = MAX_FPSEG1 + 1U; - proSegMax = MAX_FPROPSEG; - sjwMAX = MAX_FRJW + 1U; -#endif - - /* According to CiA doc 1301 v1.0.0, which specified data phase sample point postion for CAN FD at 80 MHz. */ - if (bitRateFD <= 1000000U) - { - ideal_sp = IDEAL_DATA_SP_1; - } - else if (bitRateFD <= 2000000U) - { - ideal_sp = IDEAL_DATA_SP_2; - } - else if (bitRateFD <= 4000000U) - { - ideal_sp = IDEAL_DATA_SP_3; - } - else - { - ideal_sp = IDEAL_DATA_SP_4; - } - - /* Calculates fphaseSeg2. */ - pTimingConfig->fphaseSeg2 = (uint8_t)(tqNum - (tqNum * ideal_sp) / (uint32_t)IDEAL_SP_FACTOR); - if (pTimingConfig->fphaseSeg2 < MIN_TIME_SEGMENT2) - { - pTimingConfig->fphaseSeg2 = MIN_TIME_SEGMENT2; - } - else if (pTimingConfig->fphaseSeg2 > seg1Max) - { - pTimingConfig->fphaseSeg2 = (uint8_t)seg1Max; - } - else - { - ; /* Intentional empty */ - } - - /* Calculates phaseSeg1 and propSeg. */ - seg1Temp = tqNum - pTimingConfig->fphaseSeg2 - 1U; - - if (seg1Temp > (seg1Max + proSegMax)) - { - pTimingConfig->fphaseSeg2 += (uint8_t)(seg1Temp - seg1Max - proSegMax); - pTimingConfig->fpropSeg = (uint8_t)proSegMax; - pTimingConfig->fphaseSeg1 = (uint8_t)seg1Max; - } - else if (seg1Temp > proSegMax) - { - pTimingConfig->fpropSeg = (uint8_t)proSegMax; - pTimingConfig->fphaseSeg1 = (uint8_t)(seg1Temp - proSegMax); - } - else - { - pTimingConfig->fpropSeg = (uint8_t)(seg1Temp - 1U); - pTimingConfig->fphaseSeg1 = 1U; - } - - /* try to make phaseSeg1 equal to phaseSeg2*/ - if (pTimingConfig->fphaseSeg1 < pTimingConfig->fphaseSeg2) - { - seg1Temp = - ((pTimingConfig->fphaseSeg2 - pTimingConfig->fphaseSeg1) > ((uint8_t)proSegMax - pTimingConfig->fpropSeg)) ? - (proSegMax - pTimingConfig->fpropSeg) : - (pTimingConfig->fphaseSeg2 - pTimingConfig->fphaseSeg1); - pTimingConfig->fpropSeg -= (uint8_t)seg1Temp; - pTimingConfig->fphaseSeg1 += (uint8_t)seg1Temp; - } - else - { - seg1Temp = - ((pTimingConfig->fphaseSeg1 - pTimingConfig->fphaseSeg2) > ((uint8_t)proSegMax - pTimingConfig->fpropSeg)) ? - (proSegMax - pTimingConfig->fpropSeg) : - (pTimingConfig->fphaseSeg1 - pTimingConfig->fphaseSeg2); - pTimingConfig->fpropSeg += (uint8_t)seg1Temp; - pTimingConfig->fphaseSeg1 -= (uint8_t)seg1Temp; - } - - /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ - pTimingConfig->frJumpwidth = - (pTimingConfig->fphaseSeg1 > pTimingConfig->fphaseSeg2) ? pTimingConfig->fphaseSeg2 : pTimingConfig->fphaseSeg1; - if (pTimingConfig->frJumpwidth > sjwMAX) - { - pTimingConfig->frJumpwidth = (uint8_t)sjwMAX; - } - - pTimingConfig->fphaseSeg1 -= 1U; - pTimingConfig->fphaseSeg2 -= 1U; - pTimingConfig->frJumpwidth -= 1U; -} - -/*! - * brief Calculates the improved timing values by specific bit rate for CAN FD nominal phase. - * - * This function use to calculates the CAN FD nominal phase timing values according to the given nominal phase bit rate. - * The Calculated timing values will be set in CBT/ENCBT registers. The calculation is based on the recommendation of - * the CiA 1301 v1.0.0 document. - * - * param bitRate The CAN FD nominal phase speed in bps defined by user, should be less than or equal to 1Mbps. - * param sourceClock_Hz The Source clock frequency in Hz. - * param pTimingConfig Pointer to the FlexCAN timing configuration structure. - * - * return TRUE if timing configuration found, FALSE if failed to find configuration. - */ -static bool FLEXCAN_CalculateImprovedNominalTimingValues(uint32_t bitRate, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig) -{ - /* Observe bit rate maximums. */ - assert(bitRate <= MAX_CAN_BITRATE); - - uint32_t clk; - uint32_t tqNum, tqMin, pdivMAX, seg1Max, proSegMax, sjwMAX, seg1Temp; - uint32_t spTemp = 1000U; - flexcan_timing_config_t configTemp = {0}; - bool fgRet = false; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Auto Improved Protocal timing for ENCBT. */ - tqNum = ENCBT_MAX_TIME_QUANTA; - tqMin = ENCBT_MIN_TIME_QUANTA; - pdivMAX = MAX_ENPRESDIV; - seg1Max = MAX_NTSEG2 + 1U; - proSegMax = MAX_NTSEG1 - MAX_NTSEG2; - sjwMAX = MAX_NRJW + 1U; -#else - /* Auto Improved Protocal timing for CBT. */ - tqNum = CBT_MAX_TIME_QUANTA; - tqMin = CBT_MIN_TIME_QUANTA; - pdivMAX = MAX_PRESDIV; - seg1Max = MAX_EPSEG1 + 1U; - proSegMax = MAX_EPROPSEG + 1U; - sjwMAX = MAX_ERJW + 1U; -#endif - - do - { - clk = bitRate * tqNum; - if (clk > sourceClock_Hz) - { - continue; /* tqNum too large, clk has been exceed sourceClock_Hz. */ - } - - if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) - { - continue; /* Non-supporting: the frequency of clock source is not divisible by target bit rate, the user - should change a divisible bit rate. */ - } - - configTemp.preDivider = (uint16_t)(sourceClock_Hz / clk) - 1U; - if (configTemp.preDivider > pdivMAX) - { - break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider could - not handle it. */ - } - - /* Calculates the best timing configuration under current tqNum. */ - configTemp.phaseSeg2 = (uint8_t)(tqNum - (tqNum * IDEAL_NOMINAL_SP) / (uint32_t)IDEAL_SP_FACTOR); - if (configTemp.phaseSeg2 < MIN_TIME_SEGMENT2) - { - configTemp.phaseSeg2 = MIN_TIME_SEGMENT2; - } - else if (configTemp.phaseSeg2 > seg1Max) - { - configTemp.phaseSeg2 = (uint8_t)seg1Max; - } - else - { - ; /* Intentional empty */ - } - - /* Calculates phaseSeg1 and propSeg. */ - seg1Temp = tqNum - configTemp.phaseSeg2 - 1U; - - if (seg1Temp > (seg1Max + proSegMax)) - { - configTemp.phaseSeg2 += (uint8_t)(seg1Temp - seg1Max - proSegMax); - configTemp.propSeg = (uint8_t)proSegMax; - configTemp.phaseSeg1 = (uint8_t)seg1Max; - } - else if (seg1Temp > proSegMax) - { - configTemp.propSeg = (uint8_t)proSegMax; - configTemp.phaseSeg1 = (uint8_t)(seg1Temp - proSegMax); - } - else - { - configTemp.propSeg = (uint8_t)(seg1Temp - 1U); - configTemp.phaseSeg1 = 1U; - } - - /* try to make phaseSeg1 equal to phaseSeg2*/ - if (configTemp.phaseSeg1 < configTemp.phaseSeg2) - { - seg1Temp = ((configTemp.phaseSeg2 - configTemp.phaseSeg1) > ((uint8_t)proSegMax - configTemp.propSeg)) ? - (proSegMax - configTemp.propSeg) : - (configTemp.phaseSeg2 - configTemp.phaseSeg1); - configTemp.propSeg -= (uint8_t)seg1Temp; - configTemp.phaseSeg1 += (uint8_t)seg1Temp; - } - else - { - seg1Temp = ((configTemp.phaseSeg1 - configTemp.phaseSeg2) > ((uint8_t)proSegMax - configTemp.propSeg)) ? - (proSegMax - configTemp.propSeg) : - (configTemp.phaseSeg1 - configTemp.phaseSeg2); - configTemp.propSeg += (uint8_t)seg1Temp; - configTemp.phaseSeg1 -= (uint8_t)seg1Temp; - } - - /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ - configTemp.rJumpwidth = - (configTemp.phaseSeg1 > configTemp.phaseSeg2) ? configTemp.phaseSeg2 : configTemp.phaseSeg1; - if (configTemp.rJumpwidth > sjwMAX) - { - configTemp.rJumpwidth = (uint8_t)sjwMAX; - } - configTemp.phaseSeg1 -= 1U; - configTemp.phaseSeg2 -= 1U; - configTemp.propSeg -= 1U; - configTemp.rJumpwidth -= 1U; - - if (((((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum) < spTemp) - { - spTemp = (((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum; - (void)memcpy(pTimingConfig, &configTemp, sizeof(configTemp)); - } - fgRet = true; - } while (--tqNum >= tqMin); - - return fgRet; -} - -/*! - * brief Calculates the improved timing values by specific bit rates for CAN FD. - * - * This function use to calculates the CAN FD timing values according to the given nominal phase bit rate and data phase - * bit rate. The Calculated timing values will be set in CBT/ENCBT and FDCBT/EDCBT registers. The calculation is based - * on the recommendation of the CiA 1301 v1.0.0 document. - * - * param bitRate The CAN FD nominal phase speed in bps defined by user. - * param bitRateFD The CAN FD data phase speed in bps defined by user. Equal to bitRate means disable bit rate - * switching. param sourceClock_Hz The Source clock frequency in Hz. param pTimingConfig Pointer to the FlexCAN timing - * configuration structure. - * - * return TRUE if timing configuration found, FALSE if failed to find configuration - */ -bool FLEXCAN_FDCalculateImprovedTimingValues(CAN_Type *base, - uint32_t bitRate, - uint32_t bitRateFD, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig) -{ - /* Observe bit rate maximums */ - assert(bitRate <= MAX_CANFD_BITRATE); - assert(bitRateFD <= MAX_CANFD_BITRATE); - /* Data phase bit rate need greater or equal to nominal phase bit rate. */ - assert(bitRate <= bitRateFD); - - uint32_t clk; - uint16_t preDividerTemp; - uint32_t tqMax, tqMin, pdivMAX, tqTemp; - bool fgRet = false; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* Auto Improved Protocal timing for EDCBT. */ - tqMax = EDCBT_MAX_TIME_QUANTA; - tqMin = EDCBT_MIN_TIME_QUANTA; - pdivMAX = MAX_EDPRESDIV; -#else - /* Auto Improved Protocal timing for FDCBT. */ - tqMax = FDCBT_MAX_TIME_QUANTA; - tqMin = FDCBT_MIN_TIME_QUANTA; - pdivMAX = MAX_FPRESDIV; -#endif - - if (bitRate != bitRateFD) - { - /* To minimize errors when processing FD frames, try to get the same bit rate prescaler value for nominal phase - and data phase. */ - preDividerTemp = 1U; - while (FLEXCAN_CalculateImprovedNominalTimingValues(bitRate, sourceClock_Hz / preDividerTemp, pTimingConfig)) - { - tqTemp = tqMax; - do - { - clk = bitRateFD * tqTemp; - if (clk > sourceClock_Hz) - { - continue; /* tqTemp too large, clk x tqTemp has been exceed sourceClock_Hz. */ - } - - if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) - { - continue; /* the frequency of clock source is not divisible by target bit rate. */ - } - - pTimingConfig->fpreDivider = (uint16_t)(sourceClock_Hz / clk - 1U); - - if (pTimingConfig->fpreDivider > pdivMAX) - { - break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider - could not handle it. */ - } - - if (pTimingConfig->fpreDivider != ((pTimingConfig->preDivider + 1U) * preDividerTemp - 1U)) - { - continue; - } - else - { - /* Calculates the best data phase timing configuration. */ - FLEXCAN_FDGetSegments(bitRateFD, tqTemp, pTimingConfig); - fgRet = true; - break; - } - } while (--tqTemp >= tqMin); - - if (fgRet) - { - /* Find same bit rate prescaler (BRP) configuration in both nominal and data bit timing configurations. - */ - pTimingConfig->preDivider = (pTimingConfig->preDivider + 1U) * preDividerTemp - 1U; - break; - } - else if (pTimingConfig->fpreDivider != 0U) - { - /* Can't find same data bit rate prescaler (BRP) configuration under current nominal phase bit rate - prescaler, double the nominal phase bit rate prescaler and recalculate. */ - preDividerTemp++; - } - else - { - break; - } - } - } - else - { - if (FLEXCAN_CalculateImprovedNominalTimingValues(bitRate, sourceClock_Hz, pTimingConfig)) - { - /* No need data phase timing configuration, data phase rate equal to nominal phase rate, user don't use Brs - feature. */ - fgRet = true; - } - } - return fgRet; -} - -/*! - * brief Configures a FlexCAN transmit message buffer. - * - * This function aborts the previous transmission, cleans the Message Buffer, and - * configures it as a Transmit Message Buffer. - * - * param base FlexCAN peripheral base address. - * param mbIdx The Message Buffer index. - * param enable Enable/disable Tx Message Buffer. - * - true: Enable Tx Message Buffer. - * - false: Disable Tx Message Buffer. - */ -void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - uint8_t cnt = 0; - uint8_t payload_dword = 1; - uint32_t dataSize; - dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; - volatile uint32_t *mbAddr = &(base->MB[0].CS); - uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - uint32_t availoffset = FLEXCAN_GetFDMailboxOffset(base, FLEXCAN_GetFirstValidMb(base)); -#endif - - /* Inactivate Message Buffer. */ - if (enable) - { - /* Inactivate by writing CS. */ - mbAddr[offset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); - } - else - { - mbAddr[offset] = 0x0; - } - - /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 - Bytes payload. */ - for (cnt = 0; cnt < (dataSize + 1U); cnt++) - { - payload_dword *= 2U; - } - - /* Clean ID. */ - mbAddr[offset + 1U] = 0x0U; - /* Clean Message Buffer content, DWORD by DWORD. */ - for (cnt = 0; cnt < payload_dword; cnt++) - { - mbAddr[offset + 2U + cnt] = 0x0U; - } - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); -#endif -} -#endif /* FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE */ - -/*! - * brief Configures a FlexCAN Receive Message Buffer. - * - * This function cleans a FlexCAN build-in Message Buffer and configures it - * as a Receive Message Buffer. - * - * param base FlexCAN peripheral base address. - * param mbIdx The Message Buffer index. - * param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. - * param enable Enable/disable Rx Message Buffer. - * - true: Enable Rx Message Buffer. - * - false: Disable Rx Message Buffer. - */ -void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(((NULL != pRxMbConfig) || (false == enable))); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - uint32_t cs_temp = 0; - - /* Inactivate Message Buffer. */ - base->MB[mbIdx].CS = 0; - - /* Clean Message Buffer content. */ - base->MB[mbIdx].ID = 0x0; - base->MB[mbIdx].WORD0 = 0x0; - base->MB[mbIdx].WORD1 = 0x0; - - if (enable) - { - /* Setup Message Buffer ID. */ - base->MB[mbIdx].ID = pRxMbConfig->id; - - /* Setup Message Buffer format. */ - if (kFLEXCAN_FrameFormatExtend == pRxMbConfig->format) - { - cs_temp |= CAN_CS_IDE_MASK; - } - - /* Setup Message Buffer type. */ - if (kFLEXCAN_FrameTypeRemote == pRxMbConfig->type) - { - cs_temp |= CAN_CS_RTR_MASK; - } - - /* Activate Rx Message Buffer. */ - cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty); - base->MB[mbIdx].CS = cs_temp; - } -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Configures a FlexCAN Receive Message Buffer. - * - * This function cleans a FlexCAN build-in Message Buffer and configures it - * as a Receive Message Buffer. - * - * param base FlexCAN peripheral base address. - * param mbIdx The Message Buffer index. - * param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. - * param enable Enable/disable Rx Message Buffer. - * - true: Enable Rx Message Buffer. - * - false: Disable Rx Message Buffer. - */ -void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(((NULL != pRxMbConfig) || (false == enable))); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - uint32_t cs_temp = 0; - uint8_t cnt = 0; - volatile uint32_t *mbAddr = &(base->MB[0].CS); - uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); - uint8_t payload_dword; - uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; - - /* Inactivate Message Buffer. */ - mbAddr[offset] = 0U; - - /* Clean Message Buffer content. */ - mbAddr[offset + 1U] = 0U; - /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 - Bytes payload. */ - payload_dword = (2U << dataSize); - for (cnt = 0; cnt < payload_dword; cnt++) - { - mbAddr[offset + 2U + cnt] = 0x0; - } - - if (enable) - { - /* Setup Message Buffer ID. */ - mbAddr[offset + 1U] = pRxMbConfig->id; - - /* Setup Message Buffer format. */ - if (kFLEXCAN_FrameFormatExtend == pRxMbConfig->format) - { - cs_temp |= CAN_CS_IDE_MASK; - } - - /* Setup Message Buffer type. */ - if (kFLEXCAN_FrameTypeRemote == pRxMbConfig->type) - { - cs_temp |= CAN_CS_RTR_MASK; - } - - /* Activate Rx Message Buffer. */ - cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty); - mbAddr[offset] = cs_temp; - } -} -#endif - -/*! - * brief Configures the FlexCAN Legacy Rx FIFO. - * - * This function configures the FlexCAN Rx FIFO with given configuration. - * note Legacy Rx FIFO only can receive classic CAN message. - * - * param base FlexCAN peripheral base address. - * param pRxFifoConfig Pointer to the FlexCAN Legacy Rx FIFO configuration structure. Can be NULL when enable parameter - * is false. - * param enable Enable/disable Legacy Rx FIFO. - * - true: Enable Legacy Rx FIFO. - * - false: Disable Legacy Rx FIFO. - */ -void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *pRxFifoConfig, bool enable) -{ - /* Assertion. */ - assert((NULL != pRxFifoConfig) || (false == enable)); - - volatile uint32_t *mbAddr; - uint8_t i, j, k, rffn = 0, numMbOccupy; - uint32_t setup_mb = 0; - - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - if (enable) - { - assert(pRxFifoConfig->idFilterNum <= 128U); -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /* Legacy Rx FIFO and Enhanced Rx FIFO cannot be enabled at the same time. */ - assert((base->ERFCR & CAN_ERFCR_ERFEN_MASK) == 0U); -#endif - - /* Get the setup_mb value. */ - setup_mb = (uint8_t)((base->MCR & CAN_MCR_MAXMB_MASK) >> CAN_MCR_MAXMB_SHIFT); - setup_mb = (setup_mb < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)) ? - setup_mb : - (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); - - /* Determine RFFN value. */ - for (i = 0; i <= 0xFU; i++) - { - if ((8U * (i + 1U)) >= pRxFifoConfig->idFilterNum) - { - rffn = i; - assert(((setup_mb - 8U) - (2U * rffn)) > 0U); - - base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_RFFN_MASK) | CAN_CTRL2_RFFN(rffn); - break; - } - } - - /* caculate the Number of Mailboxes occupied by RX Legacy FIFO and the filter. */ - numMbOccupy = 6U + (rffn + 1U) * 2U; - - /* Copy ID filter table to Message Buffer Region (Fix MISRA_C-2012 Rule 18.1). */ - j = 0U; - for (i = 6U; i < numMbOccupy; i++) - { - /* Get address for current mail box. */ - mbAddr = &(base->MB[i].CS); - - /* One Mail box contain 4U DWORD registers. */ - for (k = 0; k < 4U; k++) - { - /* Fill all valid filter in the mail box occupied by filter. - * Disable unused Rx FIFO Filter, the other rest of register in the last Mail box occupied by fiter set - * as 0xffffffff. - */ - mbAddr[k] = (j < pRxFifoConfig->idFilterNum) ? (pRxFifoConfig->idFilterTable[j]) : 0xFFFFFFFFU; - - /* Try to fill next filter in current Mail Box. */ - j++; - } - } - - /* Setup ID Fitlter Type. */ - switch (pRxFifoConfig->idFilterType) - { - case kFLEXCAN_RxFifoFilterTypeA: - base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x0); - break; - case kFLEXCAN_RxFifoFilterTypeB: - base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x1); - break; - case kFLEXCAN_RxFifoFilterTypeC: - base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x2); - break; - case kFLEXCAN_RxFifoFilterTypeD: - /* All frames rejected. */ - base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x3); - break; - default: - /* All the cases have been listed above, the default clause should not be reached. */ - assert(false); - break; - } - - /* Setting Message Reception Priority. */ - base->CTRL2 = (pRxFifoConfig->priority == kFLEXCAN_RxFifoPrioHigh) ? (base->CTRL2 & ~CAN_CTRL2_MRP_MASK) : - (base->CTRL2 | CAN_CTRL2_MRP_MASK); - - /* Enable Rx Message FIFO. */ - base->MCR |= CAN_MCR_RFEN_MASK; - } - else - { - rffn = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); - /* caculate the Number of Mailboxes occupied by RX Legacy FIFO and the filter. */ - numMbOccupy = 6U + (rffn + 1U) * 2U; - - /* Disable Rx Message FIFO. */ - base->MCR &= ~CAN_MCR_RFEN_MASK; - - /* Clean MB0 ~ MB5 and all MB occupied by ID filters (Fix MISRA_C-2012 Rule 18.1). */ - - for (i = 0; i < numMbOccupy; i++) - { - FLEXCAN_SetRxMbConfig(base, i, NULL, false); - } - } - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Configures the FlexCAN Enhanced Rx FIFO. - * - * This function configures the Enhanced Rx FIFO with given configuration. - * note Enhanced Rx FIFO support receive classic CAN or CAN FD messages, Legacy Rx FIFO and Enhanced Rx FIFO - * cannot be enabled at the same time. - * - * param base FlexCAN peripheral base address. - * param pConfig Pointer to the FlexCAN Enhanced Rx FIFO configuration structure. Can be NULL when enable parameter - * is false. - * param enable Enable/disable Enhanced Rx FIFO. - * - true: Enable Enhanced Rx FIFO. - * - false: Disable Enhanced Rx FIFO. - */ -void FLEXCAN_SetEnhancedRxFifoConfig(CAN_Type *base, const flexcan_enhanced_rx_fifo_config_t *pConfig, bool enable) -{ - /* Assertion. */ - assert((NULL != pConfig) || (false == enable)); - uint32_t i; - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - if (enable) - { - /* Each pair of filter elements occupies 2 words and can consist of one extended ID filter element or two - * standard ID filter elements. */ - assert((pConfig->idFilterPairNum < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER) && - (pConfig->extendIdFilterNum <= (pConfig->idFilterPairNum + 1U))); - - /* The Enhanced Rx FIFO Watermark cannot be greater than the enhanced Rx FIFO size. */ - assert(pConfig->fifoWatermark < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_SIZE); - - /* Legacy Rx FIFO and Enhanced Rx FIFO cannot be enabled at the same time. */ - assert((base->MCR & CAN_MCR_RFEN_MASK) == 0U); - - /* Enable Enhanced Rx FIFO. */ - base->ERFCR = CAN_ERFCR_ERFEN_MASK; - /* Reset Enhanced Rx FIFO engine and clear flags. */ - base->ERFSR |= CAN_ERFSR_ERFCLR_MASK | CAN_ERFSR_ERFUFW_MASK | CAN_ERFSR_ERFOVF_MASK | CAN_ERFSR_ERFWMI_MASK | - CAN_ERFSR_ERFDA_MASK; - /* Setting Enhanced Rx FIFO. */ - base->ERFCR |= CAN_ERFCR_DMALW(pConfig->dmaPerReadLength) | CAN_ERFCR_NEXIF(pConfig->extendIdFilterNum) | - CAN_ERFCR_NFE(pConfig->idFilterPairNum) | CAN_ERFCR_ERFWM(pConfig->fifoWatermark); - /* Copy ID filter table to Enhanced Rx FIFO Filter Element registers. */ - for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER; i++) - { - base->ERFFEL[i] = (i < ((uint32_t)pConfig->idFilterPairNum * 2U)) ? pConfig->idFilterTable[i] : 0xFFFFFFFFU; - } - - /* Setting Message Reception Priority. */ - base->CTRL2 = (pConfig->priority == kFLEXCAN_RxFifoPrioHigh) ? (base->CTRL2 & ~CAN_CTRL2_MRP_MASK) : - (base->CTRL2 | CAN_CTRL2_MRP_MASK); - } - else - { - /* Disable Enhanced Rx FIFO. */ - base->ERFCR &= ~CAN_ERFCR_ERFEN_MASK; - /* Clean all Enhanced Rx FIFO Filter Element registers. */ - for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER; i++) - { - base->ERFFEL[i] = 0xFFFFFFFFU; - } - } - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); -} -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) -/*! - * brief Enables or disables the FlexCAN Legacy/Enhanced Rx FIFO DMA request. - * - * This function enables or disables the DMA feature of FlexCAN build-in Rx FIFO. - * - * param base FlexCAN peripheral base address. - * param enable true to enable, false to disable. - */ -void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable) -{ - if (enable) - { - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - /* Enable FlexCAN DMA. */ - base->MCR |= CAN_MCR_DMA_MASK; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); - } - else - { - /* Enter Freeze Mode. */ - FLEXCAN_EnterFreezeMode(base); - - /* Disable FlexCAN DMA. */ - base->MCR &= ~CAN_MCR_DMA_MASK; - - /* Exit Freeze Mode. */ - FLEXCAN_ExitFreezeMode(base); - } -} -#endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */ - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -/*! - * brief Gets the FlexCAN Memory Error Report registers status. - * - * This function gets the FlexCAN Memory Error Report registers status. - * - * param base FlexCAN peripheral base address. - * param errorStatus Pointer to FlexCAN Memory Error Report registers status structure. - */ -void FLEXCAN_GetMemoryErrorReportStatus(CAN_Type *base, flexcan_memory_error_report_status_t *errorStatus) -{ - uint32_t temp; - /* Disable updates of the error report registers. */ - base->MECR |= CAN_MECR_RERRDIS_MASK; - - errorStatus->accessAddress = (uint16_t)(base->RERRAR & CAN_RERRAR_ERRADDR_MASK); - errorStatus->errorData = base->RERRDR; - errorStatus->errorType = - (base->RERRAR & CAN_RERRAR_NCE_MASK) == 0U ? kFLEXCAN_CorrectableError : kFLEXCAN_NonCorrectableError; - - temp = (base->RERRAR & CAN_RERRAR_SAID_MASK) >> CAN_RERRAR_SAID_SHIFT; - switch (temp) - { - case (uint32_t)kFLEXCAN_MoveOutFlexCanAccess: - case (uint32_t)kFLEXCAN_MoveInAccess: - case (uint32_t)kFLEXCAN_TxArbitrationAccess: - case (uint32_t)kFLEXCAN_RxMatchingAccess: - case (uint32_t)kFLEXCAN_MoveOutHostAccess: - errorStatus->accessType = (flexcan_memory_access_type_t)temp; - break; - default: - assert(false); - break; - } - - for (uint32_t i = 0; i < 4U; i++) - { - temp = (base->RERRSYNR & ((uint32_t)CAN_RERRSYNR_SYND0_MASK << (i * 8U))) >> (i * 8U); - errorStatus->byteStatus[i].byteIsRead = (base->RERRSYNR & ((uint32_t)CAN_RERRSYNR_BE0_MASK << (i * 8U))) != 0U; - switch (temp) - { - case CAN_RERRSYNR_SYND0(kFLEXCAN_NoError): - case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits0Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits1Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits2Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits3Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits4Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits0Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits1Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits2Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits3Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits4Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits5Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits6Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits7Error): - case CAN_RERRSYNR_SYND0(kFLEXCAN_AllZeroError): - case CAN_RERRSYNR_SYND0(kFLEXCAN_AllOneError): - errorStatus->byteStatus[i].bitAffected = (flexcan_byte_error_syndrome_t)temp; - break; - default: - errorStatus->byteStatus[i].bitAffected = kFLEXCAN_NonCorrectableErrors; - break; - } - } - - /* Re-enable updates of the error report registers. */ - base->MECR &= CAN_MECR_RERRDIS_MASK; -} -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) -/*! - * FlexCAN: A frame with wrong ID or payload is transmitted into - * the CAN bus when the Message Buffer under transmission is - * either aborted or deactivated while the CAN bus is in the Bus Idle state - * - * This function to do workaround for ERR006032 - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN Message Buffer index. - */ -static void FLEXCAN_ERRATA_6032(CAN_Type *base, volatile uint32_t *mbCSAddr) -{ - uint32_t dbg_temp = 0U; - uint32_t u32TempCS = 0U; - uint32_t u32Timeout = DELAY_BUSIDLE; - uint32_t u32TempIMASK1 = base->IMASK1; -/*after backup all interruption, disable ALL interruption*/ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint32_t u32TempIMASK2 = base->IMASK2; - base->IMASK2 = 0; -#endif - base->IMASK1 = 0; - dbg_temp = (uint32_t)(base->DBG1); - switch (dbg_temp & CAN_DBG1_CFSM_MASK) - { - case RXINTERMISSION: - if (CBN_VALUE3 == (dbg_temp & CAN_DBG1_CBN_MASK)) - { - /*wait until CFSM is different from RXINTERMISSION */ - while (RXINTERMISSION == (base->DBG1 & CAN_DBG1_CFSM_MASK)) - { - __NOP(); - } - } - break; - case TXINTERMISSION: - if (CBN_VALUE3 == (dbg_temp & CAN_DBG1_CBN_MASK)) - { - /*wait until CFSM is different from TXINTERMISSION*/ - while (TXINTERMISSION == (base->DBG1 & CAN_DBG1_CFSM_MASK)) - { - __NOP(); - } - } - break; - default: - /* To avoid MISRA-C 2012 rule 16.4 issue. */ - break; - } - /*Anyway, BUSIDLE need to delay*/ - if (BUSIDLE == (base->DBG1 & CAN_DBG1_CFSM_MASK)) - { - while (u32Timeout-- > 0U) - { - __NOP(); - } - - /*Write 0x0 into Code field of CS word.*/ - u32TempCS = (uint32_t)(*mbCSAddr); - u32TempCS &= ~CAN_CS_CODE_MASK; - *mbCSAddr = u32TempCS; - } - /*restore interruption*/ - base->IMASK1 = u32TempIMASK1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IMASK2 = u32TempIMASK2; -#endif -} -#endif - -/*! - * brief Writes a FlexCAN Message to the Transmit Message Buffer. - * - * This function writes a CAN Message to the specified Transmit Message Buffer - * and changes the Message Buffer state to start CAN Message transmit. After - * that the function returns immediately. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN Message Buffer index. - * param pTxFrame Pointer to CAN message frame to be sent. - * retval kStatus_Success - Write Tx Message Buffer Successfully. - * retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *pTxFrame) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(NULL != pTxFrame); - assert(pTxFrame->length <= 8U); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - uint32_t cs_temp = 0; - status_t status; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) - FLEXCAN_ERRATA_6032(base, &(base->MB[mbIdx].CS)); -#endif - /* Check if Message Buffer is available. */ - if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (base->MB[mbIdx].CS & CAN_CS_CODE_MASK)) - { - /* Inactive Tx Message Buffer. */ - base->MB[mbIdx].CS = (base->MB[mbIdx].CS & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive); - - /* Fill Message ID field. */ - base->MB[mbIdx].ID = pTxFrame->id; - - /* Fill Message Format field. */ - if ((uint32_t)kFLEXCAN_FrameFormatExtend == pTxFrame->format) - { - cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK; - } - - /* Fill Message Type field. */ - if ((uint32_t)kFLEXCAN_FrameTypeRemote == pTxFrame->type) - { - cs_temp |= CAN_CS_RTR_MASK; - } - - cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(pTxFrame->length); - - /* Load Message Payload. */ - base->MB[mbIdx].WORD0 = pTxFrame->dataWord0; - base->MB[mbIdx].WORD1 = pTxFrame->dataWord1; - - /* Activate Tx Message Buffer. */ - base->MB[mbIdx].CS = cs_temp; - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); - base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); -#endif - - status = kStatus_Success; - } - else - { - /* Tx Message Buffer is activated, return immediately. */ - status = kStatus_Fail; - } - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Writes a FlexCAN FD Message to the Transmit Message Buffer. - * - * This function writes a CAN FD Message to the specified Transmit Message Buffer - * and changes the Message Buffer state to start CAN FD Message transmit. After - * that the function returns immediately. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN FD Message Buffer index. - * param pTxFrame Pointer to CAN FD message frame to be sent. - * retval kStatus_Success - Write Tx Message Buffer Successfully. - * retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *pTxFrame) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(NULL != pTxFrame); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - status_t status; - uint32_t cs_temp = 0; - uint8_t cnt = 0; - uint32_t can_cs = 0; - uint8_t payload_dword = 1; - uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - uint32_t availoffset = FLEXCAN_GetFDMailboxOffset(base, FLEXCAN_GetFirstValidMb(base)); -#endif - volatile uint32_t *mbAddr = &(base->MB[0].CS); - uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) - FLEXCAN_ERRATA_6032(base, &(mbAddr[offset])); -#endif - - can_cs = mbAddr[offset]; - /* Check if Message Buffer is available. */ - if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (can_cs & CAN_CS_CODE_MASK)) - { - /* Inactive Tx Message Buffer and Fill Message ID field. */ - mbAddr[offset] = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive); - mbAddr[offset + 1U] = pTxFrame->id; - - /* Fill Message Format field. */ - if ((uint32_t)kFLEXCAN_FrameFormatExtend == pTxFrame->format) - { - cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK; - } - - /* Fill Message Type field. */ - if ((uint32_t)kFLEXCAN_FrameTypeRemote == pTxFrame->type) - { - cs_temp |= CAN_CS_RTR_MASK; - } - - cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(pTxFrame->length) | CAN_CS_EDL(1) | - CAN_CS_BRS(pTxFrame->brs); - - /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 - Bytes payload. */ - for (cnt = 0; cnt < (dataSize + 1U); cnt++) - { - payload_dword *= 2U; - } - - /* Load Message Payload and Activate Tx Message Buffer. */ - for (cnt = 0; cnt < payload_dword; cnt++) - { - mbAddr[offset + 2U + cnt] = pTxFrame->dataWord[cnt]; - } - mbAddr[offset] = cs_temp; - -#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) - mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); - mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); -#endif - - status = kStatus_Success; - } - else - { - /* Tx Message Buffer is activated, return immediately. */ - status = kStatus_Fail; - } - - return status; -} -#endif - -/*! - * brief Reads a FlexCAN Message from Receive Message Buffer. - * - * This function reads a CAN message from a specified Receive Message Buffer. - * The function fills a receive CAN message frame structure with - * just received data and activates the Message Buffer again. - * The function returns immediately. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN Message Buffer index. - * param pRxFrame Pointer to CAN message frame structure for reception. - * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(NULL != pRxFrame); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - uint32_t cs_temp; - uint32_t rx_code; - status_t status; - - /* Read CS field of Rx Message Buffer to lock Message Buffer. */ - cs_temp = base->MB[mbIdx].CS; - /* Get Rx Message Buffer Code field. */ - rx_code = (cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT; - - /* Check to see if Rx Message Buffer is full. */ - if (((uint32_t)kFLEXCAN_RxMbFull == rx_code) || ((uint32_t)kFLEXCAN_RxMbOverrun == rx_code)) - { - /* Store Message ID. */ - pRxFrame->id = base->MB[mbIdx].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); - - /* Get the message ID and format. */ - pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : - (uint8_t)kFLEXCAN_FrameFormatStandard; - - /* Get the message type. */ - pRxFrame->type = - (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; - - /* Get the message length. */ - pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); - - /* Get the time stamp. */ - pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - - /* Store Message Payload. */ - pRxFrame->dataWord0 = base->MB[mbIdx].WORD0; - pRxFrame->dataWord1 = base->MB[mbIdx].WORD1; - - /* Read free-running timer to unlock Rx Message Buffer. */ - (void)base->TIMER; - - if ((uint32_t)kFLEXCAN_RxMbFull == rx_code) - { - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxOverflow; - } - } - else - { - /* Read free-running timer to unlock Rx Message Buffer. */ - (void)base->TIMER; - - status = kStatus_Fail; - } - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Reads a FlexCAN FD Message from Receive Message Buffer. - * - * This function reads a CAN FD message from a specified Receive Message Buffer. - * The function fills a receive CAN FD message frame structure with - * just received data and activates the Message Buffer again. - * The function returns immediately. - * - * param base FlexCAN peripheral base address. - * param mbIdx The FlexCAN FD Message Buffer index. - * param pRxFrame Pointer to CAN FD message frame structure for reception. - * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame) -{ - /* Assertion. */ - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); - assert(NULL != pRxFrame); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - - status_t status; - uint32_t cs_temp; - uint8_t rx_code; - uint8_t cnt = 0; - uint32_t can_id = 0; - uint32_t dataSize; - dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; - uint8_t payload_dword = 1; - volatile uint32_t *mbAddr = &(base->MB[0].CS); - uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); - - /* Read CS field of Rx Message Buffer to lock Message Buffer. */ - cs_temp = mbAddr[offset]; - can_id = mbAddr[offset + 1U]; - - /* Get Rx Message Buffer Code field. */ - rx_code = (uint8_t)((cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT); - - /* Check to see if Rx Message Buffer is full. */ - if (((uint8_t)kFLEXCAN_RxMbFull == rx_code) || ((uint8_t)kFLEXCAN_RxMbOverrun == rx_code)) - { - /* Store Message ID. */ - pRxFrame->id = can_id & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); - - /* Get the message ID and format. */ - pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : - (uint8_t)kFLEXCAN_FrameFormatStandard; - - /* Get the message type. */ - pRxFrame->type = - (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; - - /* Get the message length. */ - pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); - - /* Get the time stamp. */ - pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - - /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 - Bytes payload. */ - for (cnt = 0; cnt < (dataSize + 1U); cnt++) - { - payload_dword *= 2U; - } - - /* Store Message Payload. */ - for (cnt = 0; cnt < payload_dword; cnt++) - { - pRxFrame->dataWord[cnt] = mbAddr[offset + 2U + cnt]; - } - - /* Read free-running timer to unlock Rx Message Buffer. */ - (void)base->TIMER; - - if ((uint32_t)kFLEXCAN_RxMbFull == rx_code) - { - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxOverflow; - } - } - else - { - /* Read free-running timer to unlock Rx Message Buffer. */ - (void)base->TIMER; - - status = kStatus_Fail; - } - - return status; -} -#endif - -/*! - * brief Reads a FlexCAN Message from Legacy Rx FIFO. - * - * This function reads a CAN message from the FlexCAN Legacy Rx FIFO. - * - * param base FlexCAN peripheral base address. - * param pRxFrame Pointer to CAN message frame structure for reception. - * retval kStatus_Success - Read Message from Rx FIFO successfully. - * retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *pRxFrame) -{ - /* Assertion. */ - assert(NULL != pRxFrame); - - uint32_t cs_temp; - status_t status; - - /* Check if Legacy Rx FIFO is Enabled. */ - if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) - { - /* Read CS field of Rx Message Buffer to lock Message Buffer. */ - cs_temp = base->MB[0].CS; - - /* Read data from Rx FIFO output port. */ - /* Store Message ID. */ - pRxFrame->id = base->MB[0].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); - - /* Get the message ID and format. */ - pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : - (uint8_t)kFLEXCAN_FrameFormatStandard; - - /* Get the message type. */ - pRxFrame->type = - (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; - - /* Get the message length. */ - pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); - - /* Get the time stamp. */ - pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - - /* Store Message Payload. */ - pRxFrame->dataWord0 = base->MB[0].WORD0; - pRxFrame->dataWord1 = base->MB[0].WORD1; - - /* Store ID Filter Hit Index. */ - pRxFrame->idhit = (uint16_t)(base->RXFIR & CAN_RXFIR_IDHIT_MASK); - - /* Read free-running timer to unlock Rx Message Buffer. */ - (void)base->TIMER; - - status = kStatus_Success; - } - else - { - status = kStatus_Fail; - } - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Reads a FlexCAN Message from Enhanced Rx FIFO. - * - * This function reads a CAN or CAN FD message from the FlexCAN Enhanced Rx FIFO. - * - * param base FlexCAN peripheral base address. - * param pRxFrame Pointer to CAN FD message frame structure for reception. - * retval kStatus_Success - Read Message from Rx FIFO successfully. - * retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_ReadEnhancedRxFifo(CAN_Type *base, flexcan_fd_frame_t *pRxFrame) -{ - /* Assertion. */ - assert(NULL != pRxFrame); - - status_t status; - uint32_t idHitOff; - - /* Check if Enhanced Rx FIFO is Enabled. */ - if (0U != (base->ERFCR & CAN_ERFCR_ERFEN_MASK)) - { - /* Enhanced Rx FIFO ID HIT offset is changed dynamically according to data length code (DLC) . */ - idHitOff = (DLC_LENGTH_DECODE(((flexcan_fd_frame_t *)E_RX_FIFO(base))->length) + 3U) / 4U + 3U; - /* Copy CAN FD Message from Enhanced Rx FIFO, should use the DLC value to identify the bytes that belong to the - * message which is being read. */ - (void)memcpy((void *)pRxFrame, (void *)(uint32_t *)E_RX_FIFO(base), sizeof(uint32_t) * idHitOff); - pRxFrame->idhit = pRxFrame->dataWord[idHitOff - 3U]; - /* Clear the unused frame data. */ - for (uint32_t i = (idHitOff - 3U); i < 16U; i++) - { - pRxFrame->dataWord[i] = 0x0; - } - - /* Clear data available flag to let FlexCAN know one frame has been read from the Enhanced Rx FIFO. */ - base->ERFSR |= CAN_ERFSR_ERFDA_MASK; - status = kStatus_Success; - } - else - { - status = kStatus_Fail; - } - - return status; -} -#endif - -/*! - * brief Performs a polling send transaction on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param mbIdx The FlexCAN Message Buffer index. - * param pTxFrame Pointer to CAN message frame to be sent. - * retval kStatus_Success - Write Tx Message Buffer Successfully. - * retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pTxFrame) -{ - status_t status; - - /* Write Tx Message Buffer to initiate a data sending. */ - if (kStatus_Success == FLEXCAN_WriteTxMb(base, mbIdx, (const flexcan_frame_t *)(uint32_t)pTxFrame)) - { -/* Wait until CAN Message send out. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u64flag << mbIdx)) -#else - uint32_t u32flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u32flag << mbIdx)) -#endif - { - } - -/* Clean Tx Message Buffer Flag. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - FLEXCAN_ClearMbStatusFlags(base, u64flag << mbIdx); -#else - FLEXCAN_ClearMbStatusFlags(base, u32flag << mbIdx); -#endif - /*After TX MB tranfered success, update the Timestamp from MB[mbIdx].CS register*/ - pTxFrame->timestamp = (uint16_t)((base->MB[mbIdx].CS & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - - status = kStatus_Success; - } - else - { - status = kStatus_Fail; - } - - return status; -} - -/*! - * brief Performs a polling receive transaction on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param mbIdx The FlexCAN Message Buffer index. - * param pRxFrame Pointer to CAN message frame structure for reception. - * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) -{ -/* Wait until Rx Message Buffer non-empty. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u64flag << mbIdx)) -#else - uint32_t u32flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u32flag << mbIdx)) -#endif - { - } - -/* Clean Rx Message Buffer Flag. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - FLEXCAN_ClearMbStatusFlags(base, u64flag << mbIdx); -#else - FLEXCAN_ClearMbStatusFlags(base, u32flag << mbIdx); -#endif - - /* Read Received CAN Message. */ - return FLEXCAN_ReadRxMb(base, mbIdx, pRxFrame); -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Performs a polling send transaction on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param mbIdx The FlexCAN FD Message Buffer index. - * param pTxFrame Pointer to CAN FD message frame to be sent. - * retval kStatus_Success - Write Tx Message Buffer Successfully. - * retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pTxFrame) -{ - status_t status; - - /* Write Tx Message Buffer to initiate a data sending. */ - if (kStatus_Success == FLEXCAN_WriteFDTxMb(base, mbIdx, (const flexcan_fd_frame_t *)(uint32_t)pTxFrame)) - { -/* Wait until CAN Message send out. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u64flag << mbIdx)) -#else - uint32_t u32flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u32flag << mbIdx)) -#endif - { - } - -/* Clean Tx Message Buffer Flag. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - FLEXCAN_ClearMbStatusFlags(base, u64flag << mbIdx); -#else - FLEXCAN_ClearMbStatusFlags(base, u32flag << mbIdx); -#endif - /*After TX MB tranfered success, update the Timestamp from base->MB[offset for CAN FD].CS register*/ - volatile uint32_t *mbAddr = &(base->MB[0].CS); - uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); - pTxFrame->timestamp = (uint16_t)((mbAddr[offset] & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - - status = kStatus_Success; - } - else - { - status = kStatus_Fail; - } - - return status; -} - -/*! - * brief Performs a polling receive transaction on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param mbIdx The FlexCAN FD Message Buffer index. - * param pRxFrame Pointer to CAN FD message frame structure for reception. - * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame) -{ -/* Wait until Rx Message Buffer non-empty. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u64flag << mbIdx)) -#else - uint32_t u32flag = 1; - while (0U == FLEXCAN_GetMbStatusFlags(base, u32flag << mbIdx)) -#endif - { - } - -/* Clean Rx Message Buffer Flag. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - FLEXCAN_ClearMbStatusFlags(base, u64flag << mbIdx); -#else - FLEXCAN_ClearMbStatusFlags(base, u32flag << mbIdx); -#endif - - /* Read Received CAN Message. */ - return FLEXCAN_ReadFDRxMb(base, mbIdx, pRxFrame); -} -#endif - -/*! - * brief Performs a polling receive transaction from Legacy Rx FIFO on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param pRxFrame Pointer to CAN message frame structure for reception. - * retval kStatus_Success - Read Message from Rx FIFO successfully. - * retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *pRxFrame) -{ - status_t rxFifoStatus; - - /* Wait until Legacy Rx FIFO non-empty. */ - while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag)) - { - } - - /* Read data from Legacy Rx FIFO. */ - rxFifoStatus = FLEXCAN_ReadRxFifo(base, pRxFrame); - - /* Clean Rx Fifo available flag. */ - FLEXCAN_ClearMbStatusFlags(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); - - return rxFifoStatus; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Performs a polling receive transaction from Enhanced Rx FIFO on the CAN bus. - * - * note A transfer handle does not need to be created before calling this API. - * - * param base FlexCAN peripheral base pointer. - * param pRxFrame Pointer to CAN FD message frame structure for reception. - * retval kStatus_Success - Read Message from Rx FIFO successfully. - * retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_TransferReceiveEnhancedFifoBlocking(CAN_Type *base, flexcan_fd_frame_t *pRxFrame) -{ - status_t rxFifoStatus; - - /* Wait until Enhanced Rx FIFO non-empty. */ - while (0U == (FLEXCAN_GetStatusFlags(base) & (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag)) - { - } - - /* Read data from Enhanced Rx FIFO */ - rxFifoStatus = FLEXCAN_ReadEnhancedRxFifo(base, pRxFrame); - - /* Clean Enhanced Rx Fifo data available flag. */ - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag); - - return rxFifoStatus; -} -#endif - -/*! - * brief Initializes the FlexCAN handle. - * - * This function initializes the FlexCAN handle, which can be used for other FlexCAN - * transactional APIs. Usually, for a specified FlexCAN instance, - * call this API once to get the initialized handle. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param callback The callback function. - * param userData The parameter of the callback function. - */ -void FLEXCAN_TransferCreateHandle(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_transfer_callback_t callback, - void *userData) -{ - assert(NULL != handle); - - uint8_t instance; - - /* Clean FlexCAN transfer handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Get instance from peripheral base address. */ - instance = (uint8_t)FLEXCAN_GetInstance(base); - - /* Save the context in global variables to support the double weak mechanism. */ - s_flexcanHandle[instance] = handle; - - /* Register Callback function. */ - handle->callback = callback; - handle->userData = userData; - - s_flexcanIsr = FLEXCAN_TransferHandleIRQ; - - /* We Enable Error & Status interrupt here, because this interrupt just - * report current status of FlexCAN module through Callback function. - * It is insignificance without a available callback function. - */ - if (handle->callback != NULL) - { - FLEXCAN_EnableInterrupts( - base, (uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | - (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | - (uint32_t)kFLEXCAN_WakeUpInterruptEnable -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - | (uint64_t)kFLEXCAN_PNMatchWakeUpInterruptEnable | - (uint64_t)kFLEXCAN_PNTimeoutWakeUpInterruptEnable -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - | (uint64_t)kFLEXCAN_HostAccessNCErrorInterruptEnable | - (uint64_t)kFLEXCAN_FlexCanAccessNCErrorInterruptEnable | - (uint64_t)kFLEXCAN_HostOrFlexCanCErrorInterruptEnable -#endif - ); - } - else - { - FLEXCAN_DisableInterrupts( - base, (uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | - (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | - (uint32_t)kFLEXCAN_WakeUpInterruptEnable -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - | (uint64_t)kFLEXCAN_PNMatchWakeUpInterruptEnable | - (uint64_t)kFLEXCAN_PNTimeoutWakeUpInterruptEnable -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - | (uint64_t)kFLEXCAN_HostAccessNCErrorInterruptEnable | - (uint64_t)kFLEXCAN_FlexCanAccessNCErrorInterruptEnable | - (uint64_t)kFLEXCAN_HostOrFlexCanCErrorInterruptEnable -#endif - ); - } - - /* Enable interrupts in NVIC. */ - (void)EnableIRQ((IRQn_Type)(s_flexcanRxWarningIRQ[instance])); - (void)EnableIRQ((IRQn_Type)(s_flexcanTxWarningIRQ[instance])); - (void)EnableIRQ((IRQn_Type)(s_flexcanWakeUpIRQ[instance])); - (void)EnableIRQ((IRQn_Type)(s_flexcanErrorIRQ[instance])); - (void)EnableIRQ((IRQn_Type)(s_flexcanBusOffIRQ[instance])); - (void)EnableIRQ((IRQn_Type)(s_flexcanMbIRQ[instance])); -} - -/*! - * brief Sends a message using IRQ. - * - * This function sends a message using IRQ. This is a non-blocking function, which returns - * right away. When messages have been sent out, the send callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * retval kStatus_Success Start Tx Message Buffer sending process successfully. - * retval kStatus_Fail Write Tx Message Buffer failed. - * retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. - */ -status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) -{ - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pMbXfer); - assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); -#endif - - status_t status; - - /* Check if Message Buffer is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) - { - /* Distinguish transmit type. */ - if ((uint32_t)kFLEXCAN_FrameTypeRemote == pMbXfer->frame->type) - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxRemote; - } - else - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxData; - } - - if (kStatus_Success == - FLEXCAN_WriteTxMb(base, pMbXfer->mbIdx, (const flexcan_frame_t *)(uint32_t)pMbXfer->frame)) - { -/* Enable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_EnableMbInterrupts(base, u64mask << pMbXfer->mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_EnableMbInterrupts(base, u32mask << pMbXfer->mbIdx); -#endif - status = kStatus_Success; - } - else - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateIdle; - status = kStatus_Fail; - } - } - else - { - status = kStatus_FLEXCAN_TxBusy; - } - - return status; -} - -/*! - * brief Receives a message using IRQ. - * - * This function receives a message using IRQ. This is non-blocking function, which returns - * right away. When the message has been received, the receive callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * retval kStatus_Success - Start Rx Message Buffer receiving process successfully. - * retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. - */ -status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) -{ - status_t status; - - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pMbXfer); - assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); -#endif - - /* Check if Message Buffer is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateRxData; - - /* Register Message Buffer. */ - handle->mbFrameBuf[pMbXfer->mbIdx] = pMbXfer->frame; - -/* Enable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_EnableMbInterrupts(base, u64mask << pMbXfer->mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_EnableMbInterrupts(base, u32mask << pMbXfer->mbIdx); -#endif - - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxBusy; - } - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Sends a message using IRQ. - * - * This function sends a message using IRQ. This is a non-blocking function, which returns - * right away. When messages have been sent out, the send callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * retval kStatus_Success Start Tx Message Buffer sending process successfully. - * retval kStatus_Fail Write Tx Message Buffer failed. - * retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. - */ -status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) -{ - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pMbXfer); - assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); -#endif - - status_t status; - - /* Check if Message Buffer is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) - { - /* Distinguish transmit type. */ - if ((uint32_t)kFLEXCAN_FrameTypeRemote == pMbXfer->framefd->type) - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxRemote; - } - else - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxData; - } - - if (kStatus_Success == - FLEXCAN_WriteFDTxMb(base, pMbXfer->mbIdx, (const flexcan_fd_frame_t *)(uint32_t)pMbXfer->framefd)) - { -/* Enable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_EnableMbInterrupts(base, u64mask << pMbXfer->mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_EnableMbInterrupts(base, u32mask << pMbXfer->mbIdx); -#endif - - status = kStatus_Success; - } - else - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateIdle; - status = kStatus_Fail; - } - } - else - { - status = kStatus_FLEXCAN_TxBusy; - } - - return status; -} - -/*! - * brief Receives a message using IRQ. - * - * This function receives a message using IRQ. This is non-blocking function, which returns - * right away. When the message has been received, the receive callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * retval kStatus_Success - Start Rx Message Buffer receiving process successfully. - * retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. - */ -status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) -{ - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pMbXfer); - assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); -#endif - - status_t status; - - /* Check if Message Buffer is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) - { - handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateRxData; - - /* Register Message Buffer. */ - handle->mbFDFrameBuf[pMbXfer->mbIdx] = pMbXfer->framefd; - -/* Enable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_EnableMbInterrupts(base, u64mask << pMbXfer->mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_EnableMbInterrupts(base, u32mask << pMbXfer->mbIdx); -#endif - - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxBusy; - } - - return status; -} -#endif - -/*! - * brief Receives a message from Legacy Rx FIFO using IRQ. - * - * This function receives a message using IRQ. This is a non-blocking function, which returns - * right away. When all messages have been received, the receive callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t. - * retval kStatus_Success - Start Rx FIFO receiving process successfully. - * retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. - */ -status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_fifo_transfer_t *pFifoXfer) -{ - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pFifoXfer); - - status_t status; - - /* Check if Message Buffer is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->rxFifoState) - { - handle->rxFifoState = (uint8_t)kFLEXCAN_StateRxFifo; - - /* Register Message Buffer. */ - handle->rxFifoFrameBuf = pFifoXfer->frame; - - /* Enable Message Buffer Interrupt. */ - FLEXCAN_EnableMbInterrupts(base, (uint32_t)kFLEXCAN_RxFifoOverflowFlag | (uint32_t)kFLEXCAN_RxFifoWarningFlag | - (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); - - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxFifoBusy; - } - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Receives a message from Enhanced Rx FIFO using IRQ. - * - * This function receives a message using IRQ. This is a non-blocking function, which returns - * right away. When all messages have been received, the receive callback function is called. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t. - * retval kStatus_Success - Start Rx FIFO receiving process successfully. - * retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. - */ -status_t FLEXCAN_TransferReceiveEnhancedFifoNonBlocking(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_fifo_transfer_t *pFifoXfer) -{ - /* Assertion. */ - assert(NULL != handle); - assert(NULL != pFifoXfer); - - status_t status; - uint32_t watermark = ((base->ERFCR & CAN_ERFCR_ERFWM_MASK) >> CAN_ERFCR_ERFWM_SHIFT) + 1U; - uint64_t irqMask = - (uint64_t)kFLEXCAN_ERxFifoUnderflowInterruptEnable | (uint64_t)kFLEXCAN_ERxFifoOverflowInterruptEnable; - - /* Check if Enhanced Rx FIFO is idle. */ - if ((uint8_t)kFLEXCAN_StateIdle == handle->rxFifoState) - { - handle->rxFifoState = (uint8_t)kFLEXCAN_StateRxFifo; - - /* Register Message Buffer. */ - handle->rxFifoFDFrameBuf = pFifoXfer->framefd; - handle->frameNum = pFifoXfer->frameNum; - handle->transferTotalNum = pFifoXfer->frameNum; - - if (handle->transferTotalNum >= watermark) - { - /* Enable watermark interrupt. */ - irqMask |= (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable; - } - else - { - /* Enable data available interrupt. */ - irqMask |= (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable; - } - /* Enable Enhanced Rx FIFO Interrupt. */ - FLEXCAN_EnableInterrupts(base, irqMask); - - status = kStatus_Success; - } - else - { - status = kStatus_FLEXCAN_RxFifoBusy; - } - - return status; -} - -/*! - * brief Gets the Enhanced Rx Fifo transfer status during a interrupt non-blocking receive. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param count Number of CAN messages receive so far by the non-blocking transaction. - * retval kStatus_InvalidArgument count is Invalid. - * retval kStatus_Success Successfully return the count. - */ - -status_t FLEXCAN_TransferGetReceiveEnhancedFifoCount(CAN_Type *base, flexcan_handle_t *handle, size_t *count) -{ - assert(NULL != handle); - - status_t result = kStatus_Success; - - if (handle->rxFifoState == (uint32_t)kFLEXCAN_StateIdle) - { - result = kStatus_NoTransferInProgress; - } - else - { - *count = handle->transferTotalNum - handle->frameNum; - } - - return result; -} -#endif -/*! - * brief Aborts the interrupt driven message send process. - * - * This function aborts the interrupt driven message send process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param mbIdx The FlexCAN Message Buffer index. - */ -void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) -{ - uint16_t timestamp; - - /* Assertion. */ - assert(NULL != handle); - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - -/* Disable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_DisableMbInterrupts(base, u64mask << mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_DisableMbInterrupts(base, u32mask << mbIdx); -#endif - - /* Update the TX frame 's time stamp by MB[mbIdx].cs. */ - timestamp = (uint16_t)((base->MB[mbIdx].CS & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - handle->timestamp[mbIdx] = timestamp; - - /* Clean Message Buffer. */ - FLEXCAN_SetTxMbConfig(base, mbIdx, true); - - handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * brief Aborts the interrupt driven message send process. - * - * This function aborts the interrupt driven message send process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param mbIdx The FlexCAN FD Message Buffer index. - */ -void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) -{ - volatile uint32_t *mbAddr; - uint32_t offset; - uint16_t timestamp; - - /* Assertion. */ - assert(NULL != handle); - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - -/* Disable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_DisableMbInterrupts(base, u64mask << mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_DisableMbInterrupts(base, u32mask << mbIdx); -#endif - - /* Update the TX frame 's time stamp by base->MB[offset for CAN FD].CS. */ - mbAddr = &(base->MB[0].CS); - offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); - timestamp = (uint16_t)((mbAddr[offset] & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); - handle->timestamp[mbIdx] = timestamp; - - /* Clean Message Buffer. */ - FLEXCAN_SetFDTxMbConfig(base, mbIdx, true); - - handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; -} - -/*! - * brief Aborts the interrupt driven message receive process. - * - * This function aborts the interrupt driven message receive process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param mbIdx The FlexCAN FD Message Buffer index. - */ -void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) -{ - /* Assertion. */ - assert(NULL != handle); - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - -/* Disable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_DisableMbInterrupts(base, u64mask << mbIdx); -#else - uint32_t u32mask = 1; - FLEXCAN_DisableMbInterrupts(base, u32mask << mbIdx); -#endif - - /* Un-register handle. */ - handle->mbFDFrameBuf[mbIdx] = NULL; - handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; -} -#endif - -/*! - * brief Aborts the interrupt driven message receive process. - * - * This function aborts the interrupt driven message receive process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param mbIdx The FlexCAN Message Buffer index. - */ -void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) -{ - /* Assertion. */ - assert(NULL != handle); - assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); -#if !defined(NDEBUG) - assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); -#endif - -/* Disable Message Buffer Interrupt. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64mask = 1; - FLEXCAN_DisableMbInterrupts(base, (u64mask << mbIdx)); -#else - uint32_t u32mask = 1; - FLEXCAN_DisableMbInterrupts(base, (u32mask << mbIdx)); -#endif - - /* Un-register handle. */ - handle->mbFrameBuf[mbIdx] = NULL; - handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; -} - -/*! - * brief Aborts the interrupt driven message receive from Legacy Rx FIFO process. - * - * This function aborts the interrupt driven message receive from Legacy Rx FIFO process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle) -{ - /* Assertion. */ - assert(NULL != handle); - - /* Check if Rx FIFO is enabled. */ - if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) - { - /* Disable Rx Message FIFO Interrupts. */ - FLEXCAN_DisableMbInterrupts(base, (uint32_t)kFLEXCAN_RxFifoOverflowFlag | (uint32_t)kFLEXCAN_RxFifoWarningFlag | - (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); - - /* Un-register handle. */ - handle->rxFifoFrameBuf = NULL; - } - - handle->rxFifoState = (uint8_t)kFLEXCAN_StateIdle; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Aborts the interrupt driven message receive from Enhanced Rx FIFO process. - * - * This function aborts the interrupt driven message receive from Rx FIFO process. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferAbortReceiveEnhancedFifo(CAN_Type *base, flexcan_handle_t *handle) -{ - /* Assertion. */ - assert(NULL != handle); - - /* Check if Enhanced Rx FIFO is enabled. */ - if (0U != (base->ERFCR & CAN_ERFCR_ERFEN_MASK)) - { - /* Disable all Rx Message FIFO interrupts. */ - FLEXCAN_DisableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoUnderflowInterruptEnable | - (uint64_t)kFLEXCAN_ERxFifoOverflowInterruptEnable | - (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable | - (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable); - - /* Un-register handle. */ - handle->rxFifoFDFrameBuf = NULL; - /* Clear transfer count. */ - handle->frameNum = 0U; - handle->transferTotalNum = 0U; - } - - handle->rxFifoState = (uint8_t)kFLEXCAN_StateIdle; -} -#endif - -/*! - * brief Gets the detail index of Mailbox's Timestamp by handle. - * - * Then function can only be used when calling non-blocking Data transfer (TX/RX) API, - * After TX/RX data transfer done (User can get the status by handler's callback function), - * we can get the detail index of Mailbox's timestamp by handle, - * Detail non-blocking data transfer API (TX/RX) contain. - * -FLEXCAN_TransferSendNonBlocking - * -FLEXCAN_TransferFDSendNonBlocking - * -FLEXCAN_TransferReceiveNonBlocking - * -FLEXCAN_TransferFDReceiveNonBlocking - * -FLEXCAN_TransferReceiveFifoNonBlocking - * - * param handle FlexCAN handle pointer. - * param mbIdx The FlexCAN FD Message Buffer index. - * return the index of mailbox 's timestamp stored in the handle. - * - */ -uint32_t FLEXCAN_GetTimeStamp(flexcan_handle_t *handle, uint8_t mbIdx) -{ - /* Assertion. */ - assert(NULL != handle); - - return (uint32_t)(handle->timestamp[mbIdx]); -} - -/*! - * brief Check unhandle interrupt events - * - * param base FlexCAN peripheral base address. - * return TRUE if unhandled interrupt action exist, FALSE if no unhandlered interrupt action exist. - */ -static bool FLEXCAN_CheckUnhandleInterruptEvents(CAN_Type *base) -{ - uint64_t tempmask; - uint64_t tempflag; - bool fgRet = false; - - /* Checking exist error or status flag. */ - if (0U == (FLEXCAN_GetStatusFlags(base) & (FLEXCAN_ERROR_AND_STATUS_INIT_FLAG | FLEXCAN_WAKE_UP_FLAG))) - { - tempmask = (uint64_t)base->IMASK1; - tempflag = (uint64_t)base->IFLAG1; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - /* Checking whether exist MB interrupt status and legacy RX FIFO interrupt status. */ - tempmask |= ((uint64_t)base->IMASK2) << 32; - tempflag |= ((uint64_t)base->IFLAG2) << 32; -#endif - fgRet = (0U != (tempmask & tempflag)); - } -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - else if (0U == (FLEXCAN_GetStatusFlags(base) & FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG)) - { - /* Checking whether exist enhanced RX FIFO interrupt status. */ - tempmask = (uint64_t)base->ERFIER; - tempflag = (uint64_t)base->ERFSR; - fgRet = (0U != (tempmask & tempflag)); - } -#endif - else - { - fgRet = true; - } - - return fgRet; -} - -/*! - * brief Sub Handler Data Trasfered Events - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param pResult Pointer to the Handle result. - * - * return the status after handle each data transfered event. - */ -static status_t FLEXCAN_SubHandlerForDataTransfered(CAN_Type *base, flexcan_handle_t *handle, uint32_t *pResult) -{ - status_t status = kStatus_FLEXCAN_UnHandled; - uint32_t result = 0xFFU; - - /* For this implementation, we solve the Message with lowest MB index first. */ - for (result = 0U; result < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); result++) - { - /* Get the lowest unhandled Message Buffer */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - if (0U != FLEXCAN_GetMbStatusFlags(base, u64flag << result)) -#else - uint32_t u32flag = 1; - if (0U != FLEXCAN_GetMbStatusFlags(base, u32flag << result)) -#endif - { - if (FLEXCAN_IsMbIntEnabled(base, (uint8_t)result)) - { - break; - } - } - } - - /* find Message to deal with. */ - if (result < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)) - { - /* Solve Legacy Rx FIFO interrupt. */ - if (((uint8_t)kFLEXCAN_StateIdle != handle->rxFifoState) && (result <= (uint32_t)CAN_IFLAG1_BUF7I_SHIFT) && - ((base->MCR & CAN_MCR_RFEN_MASK) != 0U)) - { - uint32_t u32mask = 1; - switch (u32mask << result) - { - case kFLEXCAN_RxFifoOverflowFlag: - status = kStatus_FLEXCAN_RxFifoOverflow; - break; - - case kFLEXCAN_RxFifoWarningFlag: - status = kStatus_FLEXCAN_RxFifoWarning; - break; - - case kFLEXCAN_RxFifoFrameAvlFlag: - status = FLEXCAN_ReadRxFifo(base, handle->rxFifoFrameBuf); - if (kStatus_Success == status) - { - /* Align the current (index 0) rxfifo timestamp to the timestamp array by handle. */ - handle->timestamp[0] = handle->rxFifoFrameBuf->timestamp; - status = kStatus_FLEXCAN_RxFifoIdle; - } - FLEXCAN_TransferAbortReceiveFifo(base, handle); - break; - - default: - status = kStatus_FLEXCAN_UnHandled; - break; - } - } - else - { - /* Get current State of Message Buffer. */ - switch (handle->mbState[result]) - { - /* Solve Rx Data Frame. */ - case (uint8_t)kFLEXCAN_StateRxData: -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) - { - status = FLEXCAN_ReadFDRxMb(base, (uint8_t)result, handle->mbFDFrameBuf[result]); - if (kStatus_Success == status) - { - /* Align the current index of RX MB timestamp to the timestamp array by handle. */ - handle->timestamp[result] = handle->mbFDFrameBuf[result]->timestamp; - status = kStatus_FLEXCAN_RxIdle; - } - } - else -#endif - { - status = FLEXCAN_ReadRxMb(base, (uint8_t)result, handle->mbFrameBuf[result]); - if (kStatus_Success == status) - { - /* Align the current index of RX MB timestamp to the timestamp array by handle. */ - handle->timestamp[result] = handle->mbFrameBuf[result]->timestamp; - status = kStatus_FLEXCAN_RxIdle; - } - } -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) - { - FLEXCAN_TransferFDAbortReceive(base, handle, (uint8_t)result); - } - else -#endif - { - FLEXCAN_TransferAbortReceive(base, handle, (uint8_t)result); - } - break; - - /* Sove Rx Remote Frame. User need to Read the frame in Mail box in time by Read from MB API. */ - case (uint8_t)kFLEXCAN_StateRxRemote: - status = kStatus_FLEXCAN_RxRemote; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) - { - FLEXCAN_TransferFDAbortReceive(base, handle, (uint8_t)result); - } - else -#endif - { - FLEXCAN_TransferAbortReceive(base, handle, (uint8_t)result); - } - break; - - /* Solve Tx Data Frame. */ - case (uint8_t)kFLEXCAN_StateTxData: - status = kStatus_FLEXCAN_TxIdle; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) - { - FLEXCAN_TransferFDAbortSend(base, handle, (uint8_t)result); - } - else -#endif - { - FLEXCAN_TransferAbortSend(base, handle, (uint8_t)result); - } - break; - - /* Solve Tx Remote Frame. */ - case (uint8_t)kFLEXCAN_StateTxRemote: - handle->mbState[result] = (uint8_t)kFLEXCAN_StateRxRemote; - status = kStatus_FLEXCAN_TxSwitchToRx; - break; - - default: - status = kStatus_FLEXCAN_UnHandled; - break; - } - } - - /* Clear resolved Message Buffer IRQ. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t u64flag = 1; - FLEXCAN_ClearMbStatusFlags(base, u64flag << result); -#else - uint32_t u32flag = 1; - FLEXCAN_ClearMbStatusFlags(base, u32flag << result); -#endif - } - - *pResult = result; - - return status; -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * brief Sub Handler Ehanced Rx FIFO event - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - * param flags FlexCAN interrupt flags. - * - * return the status after handle Ehanced Rx FIFO event. - */ -static status_t FLEXCAN_SubHandlerForEhancedRxFifo(CAN_Type *base, flexcan_handle_t *handle, uint64_t flags) -{ - uint32_t watermark = ((base->ERFCR & CAN_ERFCR_ERFWM_MASK) >> CAN_ERFCR_ERFWM_SHIFT) + 1U; - uint32_t transferFrames; - - status_t status; - /* Solve Ehanced Rx FIFO interrupt. */ - if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag)) && (0u != (base->ERFIER & CAN_ERFIER_ERFDAIE_MASK))) - { - /* Whether still has CAN messages remaining to be received. */ - if (handle->frameNum > 0U) - { - status = FLEXCAN_ReadEnhancedRxFifo(base, handle->rxFifoFDFrameBuf); - - if (kStatus_Success == status) - { - handle->rxFifoFDFrameBuf++; - handle->frameNum--; - } - else - { - return status; - } - } - if (handle->frameNum == 0U) - { - /* Stop receiving Ehanced Rx FIFO when the transmission is over. */ - FLEXCAN_TransferAbortReceiveEnhancedFifo(base, handle); - status = kStatus_FLEXCAN_RxFifoIdle; - } - else - { - /* Continue use data avaliable interrupt. */ - status = kStatus_FLEXCAN_RxFifoBusy; - } - } - else if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoWatermarkIntFlag)) && - (0u != (base->ERFIER & CAN_ERFIER_ERFWMIIE_MASK))) - { - /* Whether the number of CAN messages remaining to be received is greater than the watermark. */ - transferFrames = (handle->frameNum > watermark) ? watermark : handle->frameNum; - - for (uint32_t i = 0; i < transferFrames; i++) - { - status = FLEXCAN_ReadEnhancedRxFifo(base, handle->rxFifoFDFrameBuf); - - if (kStatus_Success == status) - { - handle->rxFifoFDFrameBuf++; - handle->frameNum--; - } - else - { - return status; - } - } - if (handle->frameNum == 0U) - { - /* Stop receiving Ehanced Rx FIFO when the transmission is over. */ - FLEXCAN_TransferAbortReceiveEnhancedFifo(base, handle); - status = kStatus_FLEXCAN_RxFifoIdle; - } - else if (handle->frameNum < watermark) - { - /* Disable watermark interrupt and enable data avaliable interrupt. */ - FLEXCAN_DisableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable); - FLEXCAN_EnableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable); - status = kStatus_FLEXCAN_RxFifoBusy; - } - else - { - /* Continue use watermark interrupt. */ - status = kStatus_FLEXCAN_RxFifoBusy; - } - } - else if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag)) && - (0u != (base->ERFIER & CAN_ERFIER_ERFUFWIE_MASK))) - { - status = kStatus_FLEXCAN_RxFifoUnderflow; - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag); - } - else if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag)) && - (0u != (base->ERFIER & CAN_ERFIER_ERFOVFIE_MASK))) - { - status = kStatus_FLEXCAN_RxOverflow; - FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag); - } - else - { - status = kStatus_FLEXCAN_UnHandled; - } - - return status; -} -#endif - -/*! - * brief FlexCAN IRQ handle function. - * - * This function handles the FlexCAN Error, the Message Buffer, and the Rx FIFO IRQ request. - * - * param base FlexCAN peripheral base address. - * param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle) -{ - /* Assertion. */ - assert(NULL != handle); - - status_t status; - uint32_t mbNum = 0xFFU; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - uint64_t result = 0U; -#else - uint32_t result = 0U; -#endif - do - { - /* Get Current FlexCAN Module Error and Status. */ - result = FLEXCAN_GetStatusFlags(base); - - /* To handle FlexCAN Error and Status Interrupt first. */ - if (0U != (result & FLEXCAN_ERROR_AND_STATUS_INIT_FLAG)) - { - status = kStatus_FLEXCAN_ErrorStatus; - /* Clear FlexCAN Error and Status Interrupt. */ - FLEXCAN_ClearStatusFlags(base, FLEXCAN_ERROR_AND_STATUS_INIT_FLAG); - } - else if (0U != (result & FLEXCAN_WAKE_UP_FLAG)) - { - status = kStatus_FLEXCAN_WakeUp; - FLEXCAN_ClearStatusFlags(base, FLEXCAN_WAKE_UP_FLAG); - } -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - else if ((0U != (result & FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG)) && - (0u != (base->ERFIER & FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_MASK))) - { - status = FLEXCAN_SubHandlerForEhancedRxFifo(base, handle, result); - } -#endif - else - { - /* To handle Message Buffer or Legacy Rx FIFO transfer. */ - status = FLEXCAN_SubHandlerForDataTransfered(base, handle, &mbNum); - result = mbNum; - } - - /* Calling Callback Function if has one. */ - if (handle->callback != NULL) - { - handle->callback(base, handle, status, result, handle->userData); - } - } while (FLEXCAN_CheckUnhandleInterruptEvents(base)); -} - -#if defined(CAN0) -void CAN0_DriverIRQHandler(void); -void CAN0_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[0]); - - s_flexcanIsr(CAN0, s_flexcanHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CAN1) -void CAN1_DriverIRQHandler(void); -void CAN1_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[1]); - - s_flexcanIsr(CAN1, s_flexcanHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CAN2) -void CAN2_DriverIRQHandler(void); -void CAN2_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[2]); - - s_flexcanIsr(CAN2, s_flexcanHandle[2]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CAN3) -void CAN3_DriverIRQHandler(void); -void CAN3_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[3]); - - s_flexcanIsr(CAN3, s_flexcanHandle[3]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CAN4) -void CAN4_DriverIRQHandler(void); -void CAN4_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[4]); - - s_flexcanIsr(CAN4, s_flexcanHandle[4]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__CAN0) -void DMA_FLEXCAN0_INT_DriverIRQHandler(void); -void DMA_FLEXCAN0_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]); - - s_flexcanIsr(DMA__CAN0, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__CAN1) -void DMA_FLEXCAN1_INT_DriverIRQHandler(void); -void DMA_FLEXCAN1_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]); - - s_flexcanIsr(DMA__CAN1, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__CAN2) -void DMA_FLEXCAN2_INT_DriverIRQHandler(void); -void DMA_FLEXCAN2_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]); - - s_flexcanIsr(DMA__CAN2, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__CAN0) -void ADMA_FLEXCAN0_INT_DriverIRQHandler(void); -void ADMA_FLEXCAN0_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN0)]); - - s_flexcanIsr(ADMA__CAN0, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN0)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__CAN1) -void ADMA_FLEXCAN1_INT_DriverIRQHandler(void); -void ADMA_FLEXCAN1_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN1)]); - - s_flexcanIsr(ADMA__CAN1, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN1)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__CAN2) -void ADMA_FLEXCAN2_INT_DriverIRQHandler(void); -void ADMA_FLEXCAN2_INT_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN2)]); - - s_flexcanIsr(ADMA__CAN2, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN2)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(FLEXCAN1) -void CAN_FD1_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[1]); - - s_flexcanIsr(FLEXCAN1, s_flexcanHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(FLEXCAN2) -void CAN_FD2_DriverIRQHandler(void) -{ - assert(NULL != s_flexcanHandle[2]); - - s_flexcanIsr(FLEXCAN1, s_flexcanHandle[2]); - SDK_ISR_EXIT_BARRIER; -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexcan.h b/devices/MIMXRT1052/drivers/fsl_flexcan.h deleted file mode 100644 index 6c8778d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexcan.h +++ /dev/null @@ -1,2194 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXCAN_H_ -#define _FSL_FLEXCAN_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup flexcan_driver - * @{ - */ - -/****************************************************************************** - * Definitions - *****************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexCAN driver version. */ -#define FSL_FLEXCAN_DRIVER_VERSION (MAKE_VERSION(2, 7, 1)) -/*@}*/ - -#if !(defined(FLEXCAN_WAIT_TIMEOUT) && FLEXCAN_WAIT_TIMEOUT) -/* Define to 1000 means keep waiting 1000 times until the flag is assert/deassert. */ -#define FLEXCAN_WAIT_TIMEOUT (1000U) -#endif - -/*! @brief FlexCAN frame length helper macro. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -#define DLC_LENGTH_DECODE(dlc) (((dlc) <= 8U) ? (dlc) : (((dlc) <= 12U) ? (((dlc)-6U) * 4U) : (((dlc)-11U) * 16U))) -#endif - -/*! @brief FlexCAN Frame ID helper macro. */ -#define FLEXCAN_ID_STD(id) \ - (((uint32_t)(((uint32_t)(id)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK) /*!< Standard Frame ID helper macro. */ -#define FLEXCAN_ID_EXT(id) \ - (((uint32_t)(((uint32_t)(id)) << CAN_ID_EXT_SHIFT)) & \ - (CAN_ID_EXT_MASK | CAN_ID_STD_MASK)) /*!< Extend Frame ID helper macro. */ - -/*! @brief FlexCAN Rx Message Buffer Mask helper macro. */ -#define FLEXCAN_RX_MB_STD_MASK(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - FLEXCAN_ID_STD(id)) /*!< Standard Rx Message Buffer Mask helper macro. */ -#define FLEXCAN_RX_MB_EXT_MASK(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - FLEXCAN_ID_EXT(id)) /*!< Extend Rx Message Buffer Mask helper macro. */ - -/*! @brief FlexCAN Legacy Rx FIFO Mask helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - (FLEXCAN_ID_STD(id) << 1)) /*!< Standard Rx FIFO Mask helper macro Type A helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - (((uint32_t)(id)&0x7FF) << 19)) /*!< Standard Rx FIFO Mask helper macro Type B upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \ - (((uint32_t)(id)&0x7FF) << 3)) /*!< Standard Rx FIFO Mask helper macro Type B lower part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH(id) \ - (((uint32_t)(id)&0x7F8) << 21) /*!< Standard Rx FIFO Mask helper macro Type C upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH(id) \ - (((uint32_t)(id)&0x7F8) << 13) /*!< Standard Rx FIFO Mask helper macro Type C mid-upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW(id) \ - (((uint32_t)(id)&0x7F8) << 5) /*!< Standard Rx FIFO Mask helper macro Type C mid-lower part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id) \ - (((uint32_t)(id)&0x7F8) >> 3) /*!< Standard Rx FIFO Mask helper macro Type C lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - (FLEXCAN_ID_EXT(id) << 1)) /*!< Extend Rx FIFO Mask helper macro Type A helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH(id, rtr, ide) \ - ( \ - ((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ - ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) \ - << 1)) /*!< Extend Rx FIFO Mask helper macro Type B upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW(id, rtr, ide) \ - (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \ - ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) >> \ - 15)) /*!< Extend Rx FIFO Mask helper macro Type B lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id) \ - ((FLEXCAN_ID_EXT(id) & 0x1FE00000) << 3) /*!< Extend Rx FIFO Mask helper macro Type C upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH(id) \ - ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \ - 5) /*!< Extend Rx FIFO Mask helper macro Type C mid-upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW(id) \ - ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \ - 13) /*!< Extend Rx FIFO Mask helper macro Type C mid-lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) \ - ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> 21) /*!< Extend Rx FIFO Mask helper macro Type C lower part helper macro. */ - -/*! @brief FlexCAN Rx FIFO Filter helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_A(id, rtr, ide) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type A helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_HIGH(id, rtr, ide) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH( \ - id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type B upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_LOW(id, rtr, ide) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW( \ - id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type B lower part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_HIGH(id) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH( \ - id) /*!< Standard Rx FIFO Filter helper macro Type C upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_HIGH(id) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH( \ - id) /*!< Standard Rx FIFO Filter helper macro Type C mid-upper part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_LOW(id) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW( \ - id) /*!< Standard Rx FIFO Filter helper macro Type C mid-lower part helper macro. */ -#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_LOW(id) \ - FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW( \ - id) /*!< Standard Rx FIFO Filter helper macro Type C lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_A(id, rtr, ide) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type A helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_HIGH(id, rtr, ide) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH( \ - id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type B upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_LOW(id, rtr, ide) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW( \ - id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type B lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_HIGH(id) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH( \ - id) /*!< Extend Rx FIFO Filter helper macro Type C upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_HIGH(id) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH( \ - id) /*!< Extend Rx FIFO Filter helper macro Type C mid-upper part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_LOW(id) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW( \ - id) /*!< Extend Rx FIFO Filter helper macro Type C mid-lower part helper macro. */ -#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_LOW(id) \ - FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) /*!< Extend Rx FIFO Filter helper macro Type C lower part helper macro. */ - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! @brief FlexCAN Enhanced Rx FIFO Filter and Mask helper macro. */ -#define ENHANCED_RX_FIFO_FSCH(x) (((uint32_t)(((uint32_t)(x)) << 30)) & 0xC0000000U) -#define RTR_STD_HIGH(x) (((uint32_t)(((uint32_t)(x)) << 27)) & 0x08000000U) -#define RTR_STD_LOW(x) (((uint32_t)(((uint32_t)(x)) << 11)) & 0x00000800U) -#define RTR_EXT(x) (((uint32_t)(((uint32_t)(x)) << 29)) & 0x40000000U) -#define ID_STD_LOW(id) (((uint32_t)id) & 0x7FFU) -#define ID_STD_HIGH(id) (((uint32_t)(((uint32_t)(id)) << 16)) & 0x07FF0000U) -#define ID_EXT(id) (((uint32_t)id) & 0x1FFFFFFFU) - -/*! Standard ID filter element with filter + mask scheme. */ -#define FLEXCAN_ENHANCED_RX_FIFO_STD_MASK_AND_FILTER(id, rtr, id_mask, rtr_mask) \ - (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_STD_HIGH(rtr) | ID_STD_HIGH(id) | RTR_STD_LOW(rtr_mask) | ID_STD_LOW(id_mask)) -/*! Standard ID filter element with filter range. */ -#define FLEXCAN_ENHANCED_RX_FIFO_STD_FILTER_WITH_RANGE(id_upper, rtr, id_lower, rtr_mask) \ - (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_STD_HIGH(rtr) | ID_STD_HIGH(id_upper) | RTR_STD_LOW(rtr_mask) | \ - ID_STD_LOW(id_lower)) -/*! Standard ID filter element with two filters without masks. */ -#define FLEXCAN_ENHANCED_RX_FIFO_STD_TWO_FILTERS(id1, rtr1, id2, rtr2) \ - (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_STD_HIGH(rtr1) | ID_STD_HIGH(id1) | RTR_STD_LOW(rtr2) | ID_STD_LOW(id2)) -/*! Extended ID filter element with filter + mask scheme low word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_MASK_AND_FILTER_LOW(id, rtr) \ - (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_EXT(rtr) | ID_EXT(id)) -/*! Extended ID filter element with filter + mask scheme high word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_MASK_AND_FILTER_HIGH(id_mask, rtr_mask) \ - (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_EXT(rtr_mask) | ID_EXT(id_mask)) -/*! Extended ID filter element with range scheme low word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_FILTER_WITH_RANGE_LOW(id_upper, rtr) \ - (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_EXT(rtr) | ID_EXT(id_upper)) -/*! Extended ID filter element with range scheme high word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_FILTER_WITH_RANGE_HIGH(id_lower, rtr_mask) \ - (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_EXT(rtr_mask) | ID_EXT(id_lower)) -/*! Extended ID filter element with two filters without masks low word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_TWO_FILTERS_LOW(id2, rtr2) \ - (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_EXT(rtr2) | ID_EXT(id2)) -/*! Extended ID filter element with two filters without masks high word. */ -#define FLEXCAN_ENHANCED_RX_FIFO_EXT_TWO_FILTERS_HIGH(id1, rtr1) \ - (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_EXT(rtr1) | ID_EXT(id1)) -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! @brief FlexCAN Pretended Networking ID Mask helper macro. */ -#define FLEXCAN_PN_STD_MASK(id, rtr) \ - ((uint32_t)((uint32_t)(rtr) << CAN_FLT_ID1_FLT_RTR_SHIFT) | \ - FLEXCAN_ID_STD(id)) /*!< Standard Rx Message Buffer Mask helper macro. */ -#define FLEXCAN_PN_EXT_MASK(id, rtr) \ - ((uint32_t)CAN_FLT_ID1_FLT_IDE_MASK | (uint32_t)((uint32_t)(rtr) << CAN_FLT_ID1_FLT_RTR_SHIFT) | \ - FLEXCAN_ID_EXT(id)) /*!< Extend Rx Message Buffer Mask helper macro. */ -#endif - -/*! @brief FlexCAN interrupt/status flag helper macro. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -#define FLEXCAN_PN_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0x3000000000000U) -#define FLEXCAN_PN_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0x00030000U) -#define FLEXCAN_PN_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 16)) & 0x300000000U) -#define FLEXCAN_PN_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 16)) & 0x00030000U) -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -#define FLEXCAN_EFIFO_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0xF000000000000000U) -#define FLEXCAN_EFIFO_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0xF0000000U) -#define FLEXCAN_EFIFO_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0xF003000000000000U) -#define FLEXCAN_EFIFO_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0xF0030000U) -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -#define FLEXCAN_MECR_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 16)) & 0xD00000000U) -#define FLEXCAN_MECR_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 16)) & 0x000D0000U) -#define FLEXCAN_MECR_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 34)) & 0x34003400000000U) -#define FLEXCAN_MECR_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 34)) & 0x000D000DU) -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -#define FLEXCAN_ERROR_AND_STATUS_INIT_FLAG \ - ((uint32_t)kFLEXCAN_ErrorOverrunFlag | (uint32_t)kFLEXCAN_FDErrorIntFlag | (uint32_t)kFLEXCAN_BusoffDoneIntFlag | \ - (uint32_t)kFLEXCAN_TxWarningIntFlag | (uint32_t)kFLEXCAN_RxWarningIntFlag | (uint32_t)kFLEXCAN_BusOffIntFlag | \ - (uint32_t)kFLEXCAN_ErrorIntFlag | FLEXCAN_MEMORY_ERROR_INIT_FLAG) -#else -#define FLEXCAN_ERROR_AND_STATUS_INIT_FLAG \ - ((uint32_t)kFLEXCAN_TxWarningIntFlag | (uint32_t)kFLEXCAN_RxWarningIntFlag | (uint32_t)kFLEXCAN_BusOffIntFlag | \ - (uint32_t)kFLEXCAN_ErrorIntFlag | FLEXCAN_MEMORY_ERROR_INIT_FLAG) -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -#define FLEXCAN_WAKE_UP_FLAG \ - ((uint32_t)kFLEXCAN_WakeUpIntFlag | (uint64_t)kFLEXCAN_PNMatchIntFlag | (uint64_t)kFLEXCAN_PNTimeoutIntFlag) -#else -#define FLEXCAN_WAKE_UP_FLAG ((uint32_t)kFLEXCAN_WakeUpIntFlag) -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -#define FLEXCAN_MEMORY_ERROR_INIT_FLAG ((uint64_t)kFLEXCAN_AllMemoryErrorFlag) -#else -#define FLEXCAN_MEMORY_ERROR_INIT_FLAG (0U) -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -#define FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG \ - ((uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag | (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag | \ - (uint64_t)kFLEXCAN_ERxFifoWatermarkIntFlag | (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag) -#define FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_MASK \ - (CAN_ERFIER_ERFUFWIE_MASK | CAN_ERFIER_ERFOVFIE_MASK | CAN_ERFIER_ERFWMIIE_MASK | CAN_ERFIER_ERFDAIE_MASK) -#endif - -/*! @brief FlexCAN Enhanced Rx FIFO base address helper macro. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -#define E_RX_FIFO(base) ((uint32_t)(base) + 0x2000U) -#endif -/*! @brief FlexCAN transfer status. */ -enum -{ - kStatus_FLEXCAN_TxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 0), /*!< Tx Message Buffer is Busy. */ - kStatus_FLEXCAN_TxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 1), /*!< Tx Message Buffer is Idle. */ - kStatus_FLEXCAN_TxSwitchToRx = MAKE_STATUS( - kStatusGroup_FLEXCAN, 2), /*!< Remote Message is send out and Message buffer changed to Receive one. */ - kStatus_FLEXCAN_RxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 3), /*!< Rx Message Buffer is Busy. */ - kStatus_FLEXCAN_RxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 4), /*!< Rx Message Buffer is Idle. */ - kStatus_FLEXCAN_RxOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 5), /*!< Rx Message Buffer is Overflowed. */ - kStatus_FLEXCAN_RxFifoBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 6), /*!< Rx Message FIFO is Busy. */ - kStatus_FLEXCAN_RxFifoIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 7), /*!< Rx Message FIFO is Idle. */ - kStatus_FLEXCAN_RxFifoOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 8), /*!< Rx Message FIFO is overflowed. */ - kStatus_FLEXCAN_RxFifoWarning = MAKE_STATUS(kStatusGroup_FLEXCAN, 9), /*!< Rx Message FIFO is almost overflowed. */ - kStatus_FLEXCAN_ErrorStatus = MAKE_STATUS(kStatusGroup_FLEXCAN, 10), /*!< FlexCAN Module Error and Status. */ - kStatus_FLEXCAN_WakeUp = MAKE_STATUS(kStatusGroup_FLEXCAN, 11), /*!< FlexCAN is waken up from STOP mode. */ - kStatus_FLEXCAN_UnHandled = MAKE_STATUS(kStatusGroup_FLEXCAN, 12), /*!< UnHadled Interrupt asserted. */ - kStatus_FLEXCAN_RxRemote = MAKE_STATUS(kStatusGroup_FLEXCAN, 13), /*!< Rx Remote Message Received in Mail box. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - kStatus_FLEXCAN_RxFifoUnderflow = - MAKE_STATUS(kStatusGroup_FLEXCAN, 14), /*!< Enhanced Rx Message FIFO is underflow. */ -#endif -}; - -/*! @brief FlexCAN frame format. */ -typedef enum _flexcan_frame_format -{ - kFLEXCAN_FrameFormatStandard = 0x0U, /*!< Standard frame format attribute. */ - kFLEXCAN_FrameFormatExtend = 0x1U, /*!< Extend frame format attribute. */ -} flexcan_frame_format_t; - -/*! @brief FlexCAN frame type. */ -typedef enum _flexcan_frame_type -{ - kFLEXCAN_FrameTypeData = 0x0U, /*!< Data frame type attribute. */ - kFLEXCAN_FrameTypeRemote = 0x1U, /*!< Remote frame type attribute. */ -} flexcan_frame_type_t; - -/*! @brief FlexCAN clock source. - * @deprecated Do not use the kFLEXCAN_ClkSrcOs. It has been superceded kFLEXCAN_ClkSrc0 - * @deprecated Do not use the kFLEXCAN_ClkSrcPeri. It has been superceded kFLEXCAN_ClkSrc1 - */ -typedef enum _flexcan_clock_source -{ - kFLEXCAN_ClkSrcOsc = 0x0U, /*!< FlexCAN Protocol Engine clock from Oscillator. */ - kFLEXCAN_ClkSrcPeri = 0x1U, /*!< FlexCAN Protocol Engine clock from Peripheral Clock. */ - kFLEXCAN_ClkSrc0 = 0x0U, /*!< FlexCAN Protocol Engine clock selected by user as SRC == 0. */ - kFLEXCAN_ClkSrc1 = 0x1U, /*!< FlexCAN Protocol Engine clock selected by user as SRC == 1. */ -} flexcan_clock_source_t; - -/*! @brief FlexCAN wake up source. */ -typedef enum _flexcan_wake_up_source -{ - kFLEXCAN_WakeupSrcUnfiltered = 0x0U, /*!< FlexCAN uses unfiltered Rx input to detect edge. */ - kFLEXCAN_WakeupSrcFiltered = 0x1U, /*!< FlexCAN uses filtered Rx input to detect edge. */ -} flexcan_wake_up_source_t; - -/*! @brief FlexCAN Rx Fifo Filter type. */ -typedef enum _flexcan_rx_fifo_filter_type -{ - kFLEXCAN_RxFifoFilterTypeA = 0x0U, /*!< One full ID (standard and extended) per ID Filter element. */ - kFLEXCAN_RxFifoFilterTypeB = - 0x1U, /*!< Two full standard IDs or two partial 14-bit ID slices per ID Filter Table element. */ - kFLEXCAN_RxFifoFilterTypeC = - 0x2U, /*!< Four partial 8-bit Standard or extended ID slices per ID Filter Table element. */ - kFLEXCAN_RxFifoFilterTypeD = 0x3U, /*!< All frames rejected. */ -} flexcan_rx_fifo_filter_type_t; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief FlexCAN Message Buffer Payload size. - */ -typedef enum _flexcan_mb_size -{ - kFLEXCAN_8BperMB = 0x0U, /*!< Selects 8 bytes per Message Buffer. */ - kFLEXCAN_16BperMB = 0x1U, /*!< Selects 16 bytes per Message Buffer. */ - kFLEXCAN_32BperMB = 0x2U, /*!< Selects 32 bytes per Message Buffer. */ - kFLEXCAN_64BperMB = 0x3U, /*!< Selects 64 bytes per Message Buffer. */ -} flexcan_mb_size_t; - -/*! - * @brief FlexCAN CAN FD frame supporting data length (available DLC values). - * - * For Tx, when the Data size corresponding to DLC value stored in the MB selected for transmission is larger than the - * MB Payload size, FlexCAN adds the necessary number of bytes with constant 0xCC pattern to complete the expected DLC. - * For Rx, when the Data size corresponding to DLC value received from the CAN bus is larger than the MB Payload size, - * the high order bytes that do not fit the Payload size will lose. - */ -enum _flexcan_fd_frame_length -{ - kFLEXCAN_0BperFrame = 0x0U, /*!< Frame contains 0 valid data bytes. */ - kFLEXCAN_1BperFrame, /*!< Frame contains 1 valid data bytes. */ - kFLEXCAN_2BperFrame, /*!< Frame contains 2 valid data bytes. */ - kFLEXCAN_3BperFrame, /*!< Frame contains 3 valid data bytes. */ - kFLEXCAN_4BperFrame, /*!< Frame contains 4 valid data bytes. */ - kFLEXCAN_5BperFrame, /*!< Frame contains 5 valid data bytes. */ - kFLEXCAN_6BperFrame, /*!< Frame contains 6 valid data bytes. */ - kFLEXCAN_7BperFrame, /*!< Frame contains 7 valid data bytes. */ - kFLEXCAN_8BperFrame, /*!< Frame contains 8 valid data bytes. */ - kFLEXCAN_12BperFrame, /*!< Frame contains 12 valid data bytes. */ - kFLEXCAN_16BperFrame, /*!< Frame contains 16 valid data bytes. */ - kFLEXCAN_20BperFrame, /*!< Frame contains 20 valid data bytes. */ - kFLEXCAN_24Bperrame, /*!< Frame contains 24 valid data bytes. */ - kFLEXCAN_32BperFrame, /*!< Frame contains 32 valid data bytes. */ - kFLEXCAN_48BperFrame, /*!< Frame contains 48 valid data bytes. */ - kFLEXCAN_64BperFrame, /*!< Frame contains 64 valid data bytes. */ -}; -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! @brief FlexCAN Enhanced Rx Fifo DMA transfer per read length enumerations. */ -typedef enum _flexcan_efifo_dma_per_read_length -{ - kFLEXCAN_1WordPerRead = 0x0U, /*!< Transfer 1 32-bit words (CS).*/ - kFLEXCAN_2WordPerRead, /*!< Transfer 2 32-bit words (CS + ID).*/ - kFLEXCAN_3WordPerRead, /*!< Transfer 3 32-bit words (CS + ID + 1~4 bytes data).*/ - kFLEXCAN_4WordPerRead, /*!< Transfer 4 32-bit words (CS + ID + 5~8 bytes data).*/ - kFLEXCAN_5WordPerRead, /*!< Transfer 5 32-bit words (CS + ID + 9~12 bytes data).*/ - kFLEXCAN_6WordPerRead, /*!< Transfer 6 32-bit words (CS + ID + 13~16 bytes data).*/ - kFLEXCAN_7WordPerRead, /*!< Transfer 7 32-bit words (CS + ID + 17~20 bytes data).*/ - kFLEXCAN_8WordPerRead, /*!< Transfer 8 32-bit words (CS + ID + 21~24 bytes data).*/ - kFLEXCAN_9WordPerRead, /*!< Transfer 9 32-bit words (CS + ID + 25~28 bytes data).*/ - kFLEXCAN_10WordPerRead, /*!< Transfer 10 32-bit words (CS + ID + 29~32 bytes data).*/ - kFLEXCAN_11WordPerRead, /*!< Transfer 11 32-bit words (CS + ID + 33~36 bytes data).*/ - kFLEXCAN_12WordPerRead, /*!< Transfer 12 32-bit words (CS + ID + 37~40 bytes data).*/ - kFLEXCAN_13WordPerRead, /*!< Transfer 13 32-bit words (CS + ID + 41~44 bytes data).*/ - kFLEXCAN_14WordPerRead, /*!< Transfer 14 32-bit words (CS + ID + 45~48 bytes data).*/ - kFLEXCAN_15WordPerRead, /*!< Transfer 15 32-bit words (CS + ID + 49~52 bytes data).*/ - kFLEXCAN_16WordPerRead, /*!< Transfer 16 32-bit words (CS + ID + 53~56 bytes data).*/ - kFLEXCAN_17WordPerRead, /*!< Transfer 17 32-bit words (CS + ID + 57~60 bytes data).*/ - kFLEXCAN_18WordPerRead, /*!< Transfer 18 32-bit words (CS + ID + 61~64 bytes data).*/ - kFLEXCAN_19WordPerRead /*!< Transfer 19 32-bit words (CS + ID + 64 bytes data + ID HIT).*/ -} flexcan_efifo_dma_per_read_length_t; -#endif - -/*! - * @brief FlexCAN Enhanced/Legacy Rx FIFO priority. - * - * The matching process starts from the Rx MB(or Enhanced/Legacy Rx FIFO) with higher priority. - * If no MB(or Enhanced/Legacy Rx FIFO filter) is satisfied, the matching process goes on with - * the Enhanced/Legacy Rx FIFO(or Rx MB) with lower priority. - */ -typedef enum _flexcan_rx_fifo_priority -{ - kFLEXCAN_RxFifoPrioLow = 0x0U, /*!< Matching process start from Rx Message Buffer first. */ - kFLEXCAN_RxFifoPrioHigh = 0x1U, /*!< Matching process start from Enhanced/Legacy Rx FIFO first. */ -} flexcan_rx_fifo_priority_t; - -/*! - * @brief FlexCAN interrupt enable enumerations. - * - * This provides constants for the FlexCAN interrupt enable enumerations for use in the FlexCAN functions. - * @note FlexCAN Message Buffers and Legacy Rx FIFO interrupts not included in. - */ -enum _flexcan_interrupt_enable -{ - kFLEXCAN_BusOffInterruptEnable = CAN_CTRL1_BOFFMSK_MASK, /*!< Bus Off interrupt, use bit 15. */ - kFLEXCAN_ErrorInterruptEnable = CAN_CTRL1_ERRMSK_MASK, /*!< CAN Error interrupt, use bit 14. */ - kFLEXCAN_TxWarningInterruptEnable = CAN_CTRL1_TWRNMSK_MASK, /*!< Tx Warning interrupt, use bit 11. */ - kFLEXCAN_RxWarningInterruptEnable = CAN_CTRL1_RWRNMSK_MASK, /*!< Rx Warning interrupt, use bit 10. */ - kFLEXCAN_WakeUpInterruptEnable = CAN_MCR_WAKMSK_MASK, /*!< Self Wake Up interrupt, use bit 22. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - kFLEXCAN_FDErrorInterruptEnable = CAN_CTRL2_ERRMSK_FAST_MASK, /*!< CAN FD Error interrupt, use bit 31. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /*! PN Match Wake Up interrupt, use high word bit 17. */ - kFLEXCAN_PNMatchWakeUpInterruptEnable = FLEXCAN_PN_INT_MASK(CAN_CTRL1_PN_WTOF_MSK_MASK), - /*! PN Timeout Wake Up interrupt, use high word bit 16. */ - kFLEXCAN_PNTimeoutWakeUpInterruptEnable = FLEXCAN_PN_INT_MASK(CAN_CTRL1_PN_WUMF_MSK_MASK), -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /*!< Enhanced Rx FIFO Underflow interrupt, use high word bit 31. */ - kFLEXCAN_ERxFifoUnderflowInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFUFWIE_MASK), - /*!< Enhanced Rx FIFO Overflow interrupt, use high word bit 30. */ - kFLEXCAN_ERxFifoOverflowInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFOVFIE_MASK), - /*!< Enhanced Rx FIFO Watermark interrupt, use high word bit 29. */ - kFLEXCAN_ERxFifoWatermarkInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFWMIIE_MASK), - /*!< Enhanced Rx FIFO Data Avilable interrupt, use high word bit 28. */ - kFLEXCAN_ERxFifoDataAvlInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFDAIE_MASK), -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /*! Host Access With Non-Correctable Errors interrupt, use high word bit 0. */ - kFLEXCAN_HostAccessNCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_HANCEI_MSK_MASK), - /*! FlexCAN Access With Non-Correctable Errors interrupt, use high word bit 2. */ - kFLEXCAN_FlexCanAccessNCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_FANCEI_MSK_MASK), - /*! Host or FlexCAN Access With Correctable Errors interrupt, use high word bit 3. */ - kFLEXCAN_HostOrFlexCanCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_CEI_MSK_MASK), -#endif -}; - -/*! - * @brief FlexCAN status flags. - * - * This provides constants for the FlexCAN status flags for use in the FlexCAN functions. - * @note The CPU read action clears the bits corresponding to the FlEXCAN_ErrorFlag macro, therefore user need to - * read status flags and distinguish which error is occur using @ref _flexcan_error_flags enumerations. - */ -enum _flexcan_flags -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - kFLEXCAN_ErrorOverrunFlag = CAN_ESR1_ERROVR_MASK, /*!< Error Overrun Status. */ - kFLEXCAN_FDErrorIntFlag = CAN_ESR1_ERRINT_FAST_MASK, /*!< CAN FD Error Interrupt Flag. */ - kFLEXCAN_BusoffDoneIntFlag = CAN_ESR1_BOFFDONEINT_MASK, /*!< Bus Off process completed Interrupt Flag. */ -#endif - kFLEXCAN_SynchFlag = CAN_ESR1_SYNCH_MASK, /*!< CAN Synchronization Status. */ - kFLEXCAN_TxWarningIntFlag = CAN_ESR1_TWRNINT_MASK, /*!< Tx Warning Interrupt Flag. */ - kFLEXCAN_RxWarningIntFlag = CAN_ESR1_RWRNINT_MASK, /*!< Rx Warning Interrupt Flag. */ - kFLEXCAN_IdleFlag = CAN_ESR1_IDLE_MASK, /*!< FlexCAN In IDLE Status. */ - kFLEXCAN_FaultConfinementFlag = CAN_ESR1_FLTCONF_MASK, /*!< FlexCAN Fault Confinement State. */ - kFLEXCAN_TransmittingFlag = CAN_ESR1_TX_MASK, /*!< FlexCAN In Transmission Status. */ - kFLEXCAN_ReceivingFlag = CAN_ESR1_RX_MASK, /*!< FlexCAN In Reception Status. */ - kFLEXCAN_BusOffIntFlag = CAN_ESR1_BOFFINT_MASK, /*!< Bus Off Interrupt Flag. */ - kFLEXCAN_ErrorIntFlag = CAN_ESR1_ERRINT_MASK, /*!< CAN Error Interrupt Flag. */ - kFLEXCAN_WakeUpIntFlag = CAN_ESR1_WAKINT_MASK, /*!< Self Wake-Up Interrupt Flag. */ - kFLEXCAN_ErrorFlag = - (uint32_t)(/*!< All FlexCAN Read Clear Error Status. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - CAN_ESR1_STFERR_FAST_MASK | CAN_ESR1_FRMERR_FAST_MASK | CAN_ESR1_CRCERR_FAST_MASK | - CAN_ESR1_BIT0ERR_FAST_MASK | CAN_ESR1_BIT1ERR_FAST_MASK | CAN_ESR1_ERROVR_MASK | -#endif - CAN_ESR1_TXWRN_MASK | CAN_ESR1_RXWRN_MASK | CAN_ESR1_BIT1ERR_MASK | CAN_ESR1_BIT0ERR_MASK | - CAN_ESR1_ACKERR_MASK | CAN_ESR1_CRCERR_MASK | CAN_ESR1_FRMERR_MASK | CAN_ESR1_STFERR_MASK), -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - kFLEXCAN_PNMatchIntFlag = FLEXCAN_PN_STATUS_MASK(CAN_WU_MTC_WUMF_MASK), /*!< PN Matching Event Interrupt Flag. */ - kFLEXCAN_PNTimeoutIntFlag = FLEXCAN_PN_STATUS_MASK(CAN_WU_MTC_WTOF_MASK), /*!< PN Timeout Event Interrupt Flag. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - kFLEXCAN_ERxFifoUnderflowIntFlag = - FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFUFW_MASK), /*!< Enhanced Rx FIFO underflow Interrupt Flag. */ - kFLEXCAN_ERxFifoOverflowIntFlag = - FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFOVF_MASK), /*!< Enhanced Rx FIFO overflow Interrupt Flag. */ - kFLEXCAN_ERxFifoWatermarkIntFlag = - FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFWMI_MASK), /*!< Enhanced Rx FIFO watermark Interrupt Flag. */ - kFLEXCAN_ERxFifoDataAvlIntFlag = - FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFDA_MASK), /*!< Enhanced Rx FIFO data available Interrupt Flag. */ - kFLEXCAN_ERxFifoEmptyFlag = FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFE_MASK), /*!< Enhanced Rx FIFO empty status. */ - kFLEXCAN_ERxFifoFullFlag = FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFF_MASK), /*!< Enhanced Rx FIFO full status. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /*! Host Access With Non-Correctable Error Interrupt Flag. */ - kFLEXCAN_HostAccessNonCorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_HANCEIF_MASK), - /*! FlexCAN Access With Non-Correctable Error Interrupt Flag. */ - kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_FANCEIF_MASK), - /*! Correctable Error Interrupt Flag. */ - kFLEXCAN_CorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_CEIF_MASK), - /*! Host Access With Non-Correctable Error Interrupt Overrun Flag. */ - kFLEXCAN_HostAccessNonCorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_HANCEIOF_MASK), - /*! FlexCAN Access With Non-Correctable Error Interrupt Overrun Flag. */ - kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_FANCEIOF_MASK), - /*! Correctable Error Interrupt Overrun Flag. */ - kFLEXCAN_CorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_CEIOF_MASK), - /*! All Memory Error Flags. */ - kFLEXCAN_AllMemoryErrorFlag = - (kFLEXCAN_HostAccessNonCorrectableErrorIntFlag | kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag | - kFLEXCAN_CorrectableErrorIntFlag | kFLEXCAN_HostAccessNonCorrectableErrorOverrunFlag | - kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag | kFLEXCAN_CorrectableErrorOverrunFlag) -#endif -}; - -/*! - * @brief FlexCAN error status flags. - * - * The FlexCAN Error Status enumerations is used to report current error of the FlexCAN bus. - * This enumerations should be used with KFLEXCAN_ErrorFlag in @ref _flexcan_flags enumerations - * to ditermine which error is generated. - */ -enum _flexcan_error_flags -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - kFLEXCAN_FDStuffingError = CAN_ESR1_STFERR_FAST_MASK, /*!< Stuffing Error. */ - kFLEXCAN_FDFormError = CAN_ESR1_FRMERR_FAST_MASK, /*!< Form Error. */ - kFLEXCAN_FDCrcError = CAN_ESR1_CRCERR_FAST_MASK, /*!< Cyclic Redundancy Check Error. */ - kFLEXCAN_FDBit0Error = CAN_ESR1_BIT0ERR_FAST_MASK, /*!< Unable to send dominant bit. */ - kFLEXCAN_FDBit1Error = (int)CAN_ESR1_BIT1ERR_FAST_MASK, /*!< Unable to send recessive bit. */ -#endif - kFLEXCAN_TxErrorWarningFlag = CAN_ESR1_TXWRN_MASK, /*!< Tx Error Warning Status. */ - kFLEXCAN_RxErrorWarningFlag = CAN_ESR1_RXWRN_MASK, /*!< Rx Error Warning Status. */ - kFLEXCAN_StuffingError = CAN_ESR1_STFERR_MASK, /*!< Stuffing Error. */ - kFLEXCAN_FormError = CAN_ESR1_FRMERR_MASK, /*!< Form Error. */ - kFLEXCAN_CrcError = CAN_ESR1_CRCERR_MASK, /*!< Cyclic Redundancy Check Error. */ - kFLEXCAN_AckError = CAN_ESR1_ACKERR_MASK, /*!< Received no ACK on transmission. */ - kFLEXCAN_Bit0Error = CAN_ESR1_BIT0ERR_MASK, /*!< Unable to send dominant bit. */ - kFLEXCAN_Bit1Error = CAN_ESR1_BIT1ERR_MASK, /*!< Unable to send recessive bit. */ -}; - -/*! - * @brief FlexCAN Legacy Rx FIFO status flags. - * - * The FlexCAN Legacy Rx FIFO Status enumerations are used to determine the status of the - * Rx FIFO. Because Rx FIFO occupy the MB0 ~ MB7 (Rx Fifo filter also occupies - * more Message Buffer space), Rx FIFO status flags are mapped to the corresponding - * Message Buffer status flags. - */ -enum -{ - kFLEXCAN_RxFifoOverflowFlag = CAN_IFLAG1_BUF7I_MASK, /*!< Rx FIFO overflow flag. */ - kFLEXCAN_RxFifoWarningFlag = CAN_IFLAG1_BUF6I_MASK, /*!< Rx FIFO almost full flag. */ - kFLEXCAN_RxFifoFrameAvlFlag = CAN_IFLAG1_BUF5I_MASK, /*!< Frames available in Rx FIFO flag. */ -}; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -/*! - * @brief FlexCAN Memory Error Type. - */ -typedef enum _flexcan_memory_error_type -{ - kFLEXCAN_CorrectableError = 0U, /*!< The memory error is correctable which means on bit error. */ - kFLEXCAN_NonCorrectableError /*!< The memory error is non-correctable which means two bit errors. */ -} flexcan_memory_error_type_t; - -/*! - * @brief FlexCAN Memory Access Type. - */ -typedef enum _flexcan_memory_access_type -{ - kFLEXCAN_MoveOutFlexCanAccess = 0U, /*!< The memory error was detected during move-out FlexCAN access. */ - kFLEXCAN_MoveInAccess, /*!< The memory error was detected during move-in FlexCAN access. */ - kFLEXCAN_TxArbitrationAccess, /*!< The memory error was detected during Tx Arbitration FlexCAN access. */ - kFLEXCAN_RxMatchingAccess, /*!< The memory error was detected during Rx Matching FlexCAN access. */ - kFLEXCAN_MoveOutHostAccess /*!< The memory error was detected during Rx Matching Host (CPU) access. */ -} flexcan_memory_access_type_t; - -/*! - * @brief FlexCAN Memory Error Byte Syndrome. - */ -typedef enum _flexcan_byte_error_syndrome -{ - kFLEXCAN_NoError = 0U, /*!< No bit error in this byte. */ - kFLEXCAN_ParityBits0Error = 1U, /*!< Parity bit 0 error in this byte. */ - kFLEXCAN_ParityBits1Error = 2U, /*!< Parity bit 1 error in this byte. */ - kFLEXCAN_ParityBits2Error = 4U, /*!< Parity bit 2 error in this byte. */ - kFLEXCAN_ParityBits3Error = 8U, /*!< Parity bit 3 error in this byte. */ - kFLEXCAN_ParityBits4Error = 16U, /*!< Parity bit 4 error in this byte. */ - kFLEXCAN_DataBits0Error = 28U, /*!< Data bit 0 error in this byte. */ - kFLEXCAN_DataBits1Error = 22U, /*!< Data bit 1 error in this byte. */ - kFLEXCAN_DataBits2Error = 19U, /*!< Data bit 2 error in this byte. */ - kFLEXCAN_DataBits3Error = 25U, /*!< Data bit 3 error in this byte. */ - kFLEXCAN_DataBits4Error = 26U, /*!< Data bit 4 error in this byte. */ - kFLEXCAN_DataBits5Error = 7U, /*!< Data bit 5 error in this byte. */ - kFLEXCAN_DataBits6Error = 21U, /*!< Data bit 6 error in this byte. */ - kFLEXCAN_DataBits7Error = 14U, /*!< Data bit 7 error in this byte. */ - kFLEXCAN_AllZeroError = 6U, /*!< All-zeros non-correctable error in this byte. */ - kFLEXCAN_AllOneError = 31U, /*!< All-ones non-correctable error in this byte. */ - kFLEXCAN_NonCorrectableErrors /*!< Non-correctable error in this byte. */ -} flexcan_byte_error_syndrome_t; - -/*! - * @brief FlexCAN memory error register status structure - * - * This structure contains the memory access properties that caused a memory error access. - * It is used as the parameter of FLEXCAN_GetMemoryErrorReportStatus() function. And user can - * use FLEXCAN_GetMemoryErrorReportStatus to get the status of the last memory error access. - */ -typedef struct _flexcan_memory_error_report_status -{ - flexcan_memory_error_type_t errorType; /*!< The type of memory error that giving rise to the report. */ - flexcan_memory_access_type_t accessType; /*!< The type of memory access that giving rise to the memory error. */ - uint16_t accessAddress; /*!< The address where memory error detected. */ - uint32_t errorData; /*!< The raw data word read from memory with error. */ - struct - { - bool byteIsRead; /*!< The byte n (0~3) was read or not. */ - /*!< The type of error and which bit in byte (n) is affected by the error. */ - flexcan_byte_error_syndrome_t bitAffected; - } byteStatus[4]; -} flexcan_memory_error_report_status_t; -#endif - -#if defined(__CC_ARM) -#pragma anon_unions -#endif -/*! @brief FlexCAN message frame structure. */ -typedef struct _flexcan_frame -{ - struct - { - uint32_t timestamp : 16; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ - uint32_t length : 4; /*!< CAN frame data length in bytes (Range: 0~8). */ - uint32_t type : 1; /*!< CAN Frame Type(DATA or REMOTE). */ - uint32_t format : 1; /*!< CAN Frame Identifier(STD or EXT format). */ - uint32_t : 1; /*!< Reserved. */ - uint32_t idhit : 9; /*!< CAN Rx FIFO filter hit id(This value is only used in Rx FIFO receive mode). */ - }; - struct - { - uint32_t id : 29; /*!< CAN Frame Identifier, should be set using FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ - uint32_t : 3; /*!< Reserved. */ - }; - union - { - struct - { - uint32_t dataWord0; /*!< CAN Frame payload word0. */ - uint32_t dataWord1; /*!< CAN Frame payload word1. */ - }; - struct - { - uint8_t dataByte3; /*!< CAN Frame payload byte3. */ - uint8_t dataByte2; /*!< CAN Frame payload byte2. */ - uint8_t dataByte1; /*!< CAN Frame payload byte1. */ - uint8_t dataByte0; /*!< CAN Frame payload byte0. */ - uint8_t dataByte7; /*!< CAN Frame payload byte7. */ - uint8_t dataByte6; /*!< CAN Frame payload byte6. */ - uint8_t dataByte5; /*!< CAN Frame payload byte5. */ - uint8_t dataByte4; /*!< CAN Frame payload byte4. */ - }; - }; -} flexcan_frame_t; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! @brief CAN FD message frame structure. - * - * The CAN FD message supporting up to sixty four bytes can be used for a data frame, depending on the length - * selected for the message buffers. The length should be a enumeration member, see @ref _flexcan_fd_frame_length. - */ -typedef struct _flexcan_fd_frame -{ - struct - { - uint32_t timestamp : 16; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ - uint32_t length : 4; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the - length <= 8, it equal to the data length, otherwise the number of valid frame data is - not equal to the length value. user can - use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ - uint32_t type : 1; /*!< CAN Frame Type(DATA or REMOTE). */ - uint32_t format : 1; /*!< CAN Frame Identifier(STD or EXT format). */ - uint32_t srr : 1; /*!< Substitute Remote request. */ - uint32_t : 6; - uint32_t esi : 1; /*!< Error State Indicator. */ - uint32_t brs : 1; /*!< Bit Rate Switch. */ - uint32_t edl : 1; /*!< Extended Data Length. */ - }; - struct - { - uint32_t id : 29; /*!< CAN Frame Identifier, should be set using FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ - uint32_t : 3; /*!< Reserved. */ - }; - union - { - struct - { - uint32_t dataWord[16]; /*!< CAN FD Frame payload, 16 double word maximum. */ - }; - /* Note: the maximum databyte* below is actually 64, user can add them if needed, - or just use dataWord[*] instead. */ - struct - { - uint8_t dataByte3; /*!< CAN Frame payload byte3. */ - uint8_t dataByte2; /*!< CAN Frame payload byte2. */ - uint8_t dataByte1; /*!< CAN Frame payload byte1. */ - uint8_t dataByte0; /*!< CAN Frame payload byte0. */ - uint8_t dataByte7; /*!< CAN Frame payload byte7. */ - uint8_t dataByte6; /*!< CAN Frame payload byte6. */ - uint8_t dataByte5; /*!< CAN Frame payload byte5. */ - uint8_t dataByte4; /*!< CAN Frame payload byte4. */ - }; - }; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /*! @note ID HIT offset is changed dynamically according to data length code (DLC), when DLC is 15, they will be - * located below. Using FLEXCAN_FixEnhancedRxFifoFrameIdHit API is recommended to ensure this idhit value is - * correct.*/ - uint32_t idhit; /*!< CAN Enhanced Rx FIFO filter hit id (This value is only used in Enhanced Rx FIFO receive - mode). */ -#endif -} flexcan_fd_frame_t; -#endif - -/*! @brief FlexCAN protocol timing characteristic configuration structure. */ -typedef struct _flexcan_timing_config -{ - uint16_t preDivider; /*!< Classic CAN or CAN FD nominal phase bit rate prescaler. */ - uint8_t rJumpwidth; /*!< Classic CAN or CAN FD nominal phase Re-sync Jump Width. */ - uint8_t phaseSeg1; /*!< Classic CAN or CAN FD nominal phase Segment 1. */ - uint8_t phaseSeg2; /*!< Classic CAN or CAN FD nominal phase Segment 2. */ - uint8_t propSeg; /*!< Classic CAN or CAN FD nominal phase Propagation Segment. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - uint16_t fpreDivider; /*!< CAN FD data phase bit rate prescaler. */ - uint8_t frJumpwidth; /*!< CAN FD data phase Re-sync Jump Width. */ - uint8_t fphaseSeg1; /*!< CAN FD data phase Phase Segment 1. */ - uint8_t fphaseSeg2; /*!< CAN FD data phase Phase Segment 2. */ - uint8_t fpropSeg; /*!< CAN FD data phase Propagation Segment. */ -#endif -} flexcan_timing_config_t; - -/*! @brief FlexCAN module configuration structure. - * @deprecated Do not use the baudRate. It has been superceded bitRate - * @deprecated Do not use the baudRateFD. It has been superceded bitRateFD - */ -typedef struct _flexcan_config -{ - union - { - struct - { - uint32_t baudRate; /*!< FlexCAN bit rate in bps, for classical CAN or CANFD nominal phase. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - uint32_t baudRateFD; /*!< FlexCAN FD bit rate in bps, for CANFD data phase. */ -#endif - }; - struct - { - uint32_t bitRate; /*!< FlexCAN bit rate in bps, for classical CAN or CANFD nominal phase. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - uint32_t bitRateFD; /*!< FlexCAN FD bit rate in bps, for CANFD data phase. */ -#endif - }; - }; - flexcan_clock_source_t clkSrc; /*!< Clock source for FlexCAN Protocol Engine. */ - flexcan_wake_up_source_t wakeupSrc; /*!< Wake up source selection. */ - uint8_t maxMbNum; /*!< The maximum number of Message Buffers used by user. */ - bool enableLoopBack; /*!< Enable or Disable Loop Back Self Test Mode. */ - bool enableTimerSync; /*!< Enable or Disable Timer Synchronization. */ - bool enableSelfWakeup; /*!< Enable or Disable Self Wakeup Mode. */ - bool enableIndividMask; /*!< Enable or Disable Rx Individual Mask and Queue feature. */ - bool disableSelfReception; /*!< Enable or Disable Self Reflection. */ - bool enableListenOnlyMode; /*!< Enable or Disable Listen Only Mode. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) - bool enableDoze; /*!< Enable or Disable Doze Mode. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - bool enablePretendedeNetworking; /*!< Enable or Disable the Pretended Networking mode. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - bool enableMemoryErrorControl; /*!< Enable or Disable the memory errors detection and correction mechanism. */ - bool enableNonCorrectableErrorEnterFreeze; /*!< Enable or Disable Non-Correctable Errors In FlexCAN Access Put - Device In Freeze Mode. */ -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - bool enableTransceiverDelayMeasure; /*!< Enable or Disable the transceiver delay measurement, when it is enabled, - then the secondary sample point position is determined by the sum of the - transceiver delay measurement plus the enhanced TDC offset. */ -#endif - flexcan_timing_config_t timingConfig; /* Protocol timing . */ -} flexcan_config_t; - -/*! - * @brief FlexCAN Receive Message Buffer configuration structure - * - * This structure is used as the parameter of FLEXCAN_SetRxMbConfig() function. - * The FLEXCAN_SetRxMbConfig() function is used to configure FlexCAN Receive - * Message Buffer. The function abort previous receiving process, clean the - * Message Buffer and activate the Rx Message Buffer using given Message Buffer - * setting. - */ -typedef struct _flexcan_rx_mb_config -{ - uint32_t id; /*!< CAN Message Buffer Frame Identifier, should be set using - FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ - flexcan_frame_format_t format; /*!< CAN Frame Identifier format(Standard of Extend). */ - flexcan_frame_type_t type; /*!< CAN Frame Type(Data or Remote). */ -} flexcan_rx_mb_config_t; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! @brief FlexCAN Pretended Networking match source selection. */ -typedef enum _flexcan_pn_match_source -{ - kFLEXCAN_PNMatSrcID = 0U, /*!< Message match with ID filtering. */ - kFLEXCAN_PNMatSrcIDAndData, /*!< Message match with ID filtering and payload filtering. */ -} flexcan_pn_match_source_t; - -/*! @brief FlexCAN Pretended Networking mode match type. */ -typedef enum _flexcan_pn_match_mode -{ - kFLEXCAN_PNMatModeEqual = 0x0U, /*!< Match upon ID/Payload contents against an exact target value. */ - kFLEXCAN_PNMatModeGreater, /*!< Match upon an ID/Payload value greater than or equal to a specified target value. - */ - kFLEXCAN_PNMatModeSmaller, /*!< Match upon an ID/Payload value smaller than or equal to a specified target value. - */ - kFLEXCAN_PNMatModeRange, /*!< Match upon an ID/Payload value inside a range, greater than or equal to a specified - lower limit, and smaller than or equal to a specified upper limit */ -} flexcan_pn_match_mode_t; - -/*! - * @brief FlexCAN Pretended Networking configuration structure - * - * This structure is used as the parameter of FLEXCAN_SetPNConfig() function. - * The FLEXCAN_SetPNConfig() function is used to configure FlexCAN Networking work mode. - */ -typedef struct _flexcan_pn_config -{ - bool enableTimeout; /*!< Enable or Disable timeout event trigger wakeup.*/ - uint16_t timeoutValue; /*!< The timeout value that generates a wakeup event, the counter timer is incremented based - on 64 times the CAN Bit Time unit. */ - bool enableMatch; /*!< Enable or Disable match event trigger wakeup.*/ - flexcan_pn_match_source_t matchSrc; /*!< Selects the match source (ID and/or data match) to trigger wakeup. */ - uint8_t matchNum; /*!< The number of times a given message must match the predefined ID and/or data before - generating a wakeup event, range in 0x1 ~ 0xFF. */ - flexcan_pn_match_mode_t idMatchMode; /*!< The ID match type. */ - flexcan_pn_match_mode_t dataMatchMode; /*!< The data match type. */ - uint32_t idLower; /*!< The ID target values 1 which used either for ID match "equal to", "smaller than", - "greater than" comparisons, or as the lower limit value in ID match "range detection". */ - uint32_t idUpper; /*!< The ID target values 2 which used only as the upper limit value in ID match "range - detection" or used to store the ID mask in "equal to". */ - uint8_t lengthLower; /*!< The lower limit for length of data bytes which used only in data match "range - detection". Range in 0x0 ~ 0x8.*/ - uint8_t lengthUpper; /*!< The upper limit for length of data bytes which used only in data match "range - detection". Range in 0x0 ~ 0x8.*/ - union - { - /*!< The data target values 1 which used either for data match "equal to", "smaller than", - "greater than" comparisons, or as the lower limit value in data match "range - detection". */ - struct - { - uint32_t lowerWord0; /*!< CAN Frame payload word0. */ - uint32_t lowerWord1; /*!< CAN Frame payload word1. */ - }; - struct - { - uint8_t lowerByte3; /*!< CAN Frame payload byte3. */ - uint8_t lowerByte2; /*!< CAN Frame payload byte2. */ - uint8_t lowerByte1; /*!< CAN Frame payload byte1. */ - uint8_t lowerByte0; /*!< CAN Frame payload byte0. */ - uint8_t lowerByte7; /*!< CAN Frame payload byte7. */ - uint8_t lowerByte6; /*!< CAN Frame payload byte6. */ - uint8_t lowerByte5; /*!< CAN Frame payload byte5. */ - uint8_t lowerByte4; /*!< CAN Frame payload byte4. */ - }; - }; - union - { - /*!< The data target values 2 which used only as the upper limit value in data match "range - detection" or used to store the data mask in "equal to". */ - struct - { - uint32_t upperWord0; /*!< CAN Frame payload word0. */ - uint32_t upperWord1; /*!< CAN Frame payload word1. */ - }; - struct - { - uint8_t upperByte3; /*!< CAN Frame payload byte3. */ - uint8_t upperByte2; /*!< CAN Frame payload byte2. */ - uint8_t upperByte1; /*!< CAN Frame payload byte1. */ - uint8_t upperByte0; /*!< CAN Frame payload byte0. */ - uint8_t upperByte7; /*!< CAN Frame payload byte7. */ - uint8_t upperByte6; /*!< CAN Frame payload byte6. */ - uint8_t upperByte5; /*!< CAN Frame payload byte5. */ - uint8_t upperByte4; /*!< CAN Frame payload byte4. */ - }; - }; -} flexcan_pn_config_t; -#endif - -/*! @brief FlexCAN Legacy Rx FIFO configuration structure. */ -typedef struct _flexcan_rx_fifo_config -{ - uint32_t *idFilterTable; /*!< Pointer to the FlexCAN Legacy Rx FIFO identifier filter table. */ - uint8_t idFilterNum; /*!< The FlexCAN Legacy Rx FIFO Filter elements quantity. */ - flexcan_rx_fifo_filter_type_t idFilterType; /*!< The FlexCAN Legacy Rx FIFO Filter type. */ - flexcan_rx_fifo_priority_t priority; /*!< The FlexCAN Legacy Rx FIFO receive priority. */ -} flexcan_rx_fifo_config_t; - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! @brief FlexCAN Enhanced Rx FIFO Standard ID filter element structure. */ -typedef struct _flexcan_enhanced_rx_fifo_std_id_filter -{ - uint32_t filterType : 2; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ - uint32_t : 2; - uint32_t rtr1 : 1; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the - length <= 8, it equal to the data length, otherwise the number of valid frame data is - not equal to the length value. user can - use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ - uint32_t std1 : 11; /*!< CAN Frame Type(DATA or REMOTE). */ - uint32_t : 4; - uint32_t rtr2 : 1; /*!< CAN Frame Identifier(STD or EXT format). */ - uint32_t std2 : 11; /*!< Substitute Remote request. */ -} flexcan_enhanced_rx_fifo_std_id_filter_t; - -/*! @brief FlexCAN Enhanced Rx FIFO Extended ID filter element structure. */ -typedef struct _flexcan_enhanced_rx_fifo_ext_id_filter -{ - uint32_t filterType : 2; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ - uint32_t rtr1 : 1; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the - length <= 8, it equal to the data length, otherwise the number of valid frame data is - not equal to the length value. user can - use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ - uint32_t std1 : 29; /*!< CAN Frame Type(DATA or REMOTE). */ - uint32_t : 2; - uint32_t rtr2 : 1; /*!< CAN Frame Identifier(STD or EXT format). */ - uint32_t std2 : 29; /*!< Substitute Remote request. */ -} flexcan_enhanced_rx_fifo_ext_id_filter_t; -/*! @brief FlexCAN Enhanced Rx FIFO configuration structure. */ -typedef struct _flexcan_enhanced_rx_fifo_config -{ - uint32_t *idFilterTable; /*!< Pointer to the FlexCAN Enhanced Rx FIFO identifier filter table, each table member - occupies 32 bit word, table size should be equal to idFilterNum. There are two types of - Enhanced Rx FIFO filter elements that can be stored in table : extended-ID filter element - (1 word, occupie 1 table members) and standard-ID filter element (2 words, occupies 2 table - members), the extended-ID filter element needs to be placed in front of the table. */ - uint8_t idFilterPairNum; /*!< (idFilterPairNum + 1) is the Enhanced Rx FIFO identifier filter element pair numbers, - each pair of filter elements occupies 2 words and can consist of one extended ID filter - element or two standard ID filter elements. */ - uint8_t extendIdFilterNum; /*!< The number of extended ID filter element items in the FlexCAN enhanced Rx FIFO - identifier filter table, each extended-ID filter element occupies 2 words, - extendIdFilterNum need less than or equal to (idFilterPairNum + 1). */ - uint8_t fifoWatermark; /*!< (fifoWatermark + 1) is the minimum number of CAN messages stored in the Enhanced RX FIFO - which can trigger FIFO watermark interrupt or a DMA request. */ - flexcan_efifo_dma_per_read_length_t dmaPerReadLength; /*!< Define the length of each read of the Enhanced RX FIFO - element by the DAM, see @ref _flexcan_fd_frame_length. */ - flexcan_rx_fifo_priority_t priority; /*!< The FlexCAN Enhanced Rx FIFO receive priority. */ -} flexcan_enhanced_rx_fifo_config_t; -#endif - -/*! @brief FlexCAN Message Buffer transfer. */ -typedef struct _flexcan_mb_transfer -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - flexcan_fd_frame_t *framefd; -#endif - flexcan_frame_t *frame; /*!< The buffer of CAN Message to be transfer. */ - uint8_t mbIdx; /*!< The index of Message buffer used to transfer Message. */ -} flexcan_mb_transfer_t; - -/*! @brief FlexCAN Rx FIFO transfer. */ -typedef struct _flexcan_fifo_transfer -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - flexcan_fd_frame_t *framefd; /*!< The buffer of CAN Message to be received from Enhanced Rx FIFO. */ - size_t frameNum; /*!< Number of CAN Message need to be received from Ehanced Rx FIFO. */ -#endif - flexcan_frame_t *frame; /*!< The buffer of CAN Message to be received from Rx FIFO. */ -} flexcan_fifo_transfer_t; - -/*! @brief FlexCAN handle structure definition. */ -typedef struct _flexcan_handle flexcan_handle_t; - -/*! @brief FlexCAN transfer callback function. - * - * The FlexCAN transfer callback returns a value from the underlying layer. - * If the status equals to kStatus_FLEXCAN_ErrorStatus, the result parameter is the Content of - * FlexCAN status register which can be used to get the working status(or error status) of FlexCAN module. - * If the status equals to other FlexCAN Message Buffer transfer status, the result is the index of - * Message Buffer that generate transfer event. - * If the status equals to other FlexCAN Message Buffer transfer status, the result is meaningless and should be - * Ignored. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -#define FLEXCAN_CALLBACK(x) \ - void(x)(CAN_Type * base, flexcan_handle_t * handle, status_t status, uint64_t result, void *userData) -typedef void (*flexcan_transfer_callback_t)( - CAN_Type *base, flexcan_handle_t *handle, status_t status, uint64_t result, void *userData); -#else -#define FLEXCAN_CALLBACK(x) \ - void(x)(CAN_Type * base, flexcan_handle_t * handle, status_t status, uint32_t result, void *userData) -typedef void (*flexcan_transfer_callback_t)( - CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData); -#endif - -/*! @brief FlexCAN handle structure. */ -struct _flexcan_handle -{ - flexcan_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< FlexCAN callback function parameter.*/ - flexcan_frame_t - *volatile mbFrameBuf[CAN_WORD1_COUNT]; /*!< The buffer for received CAN data from Message Buffers. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - flexcan_fd_frame_t - *volatile mbFDFrameBuf[CAN_WORD1_COUNT]; /*!< The buffer for received CAN FD data from Message Buffers. */ -#endif - flexcan_frame_t *volatile rxFifoFrameBuf; /*!< The buffer for received CAN data from Legacy Rx FIFO. */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - flexcan_fd_frame_t *volatile rxFifoFDFrameBuf; /*!< The buffer for received CAN FD data from Ehanced Rx FIFO. */ - size_t frameNum; /*!< The number of CAN messages remaining to be received. */ - size_t transferTotalNum; /*!< Total CAN Message number need to be received from Ehanced Rx FIFO. */ -#endif - volatile uint8_t mbState[CAN_WORD1_COUNT]; /*!< Message Buffer transfer state. */ - volatile uint8_t rxFifoState; /*!< Rx FIFO transfer state. */ - volatile uint32_t timestamp[CAN_WORD1_COUNT]; /*!< Mailbox transfer timestamp. */ -}; - -/****************************************************************************** - * API - *****************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Enter FlexCAN Freeze Mode. - * - * This function makes the FlexCAN work under Freeze Mode. - * - * @param base FlexCAN peripheral base address. - */ -void FLEXCAN_EnterFreezeMode(CAN_Type *base); - -/*! - * @brief Exit FlexCAN Freeze Mode. - * - * This function makes the FlexCAN leave Freeze Mode. - * - * @param base FlexCAN peripheral base address. - */ -void FLEXCAN_ExitFreezeMode(CAN_Type *base); - -/*! - * @brief Get the FlexCAN instance from peripheral base address. - * - * @param base FlexCAN peripheral base address. - * @return FlexCAN instance. - */ -uint32_t FLEXCAN_GetInstance(CAN_Type *base); - -/*! - * @brief Calculates the improved timing values by specific bit Rates for classical CAN. - * - * This function use to calculates the Classical CAN timing values according to the given bit rate. The Calculated - * timing values will be set in CTRL1/CBT/ENCBT register. The calculation is based on the recommendation of the CiA 301 - * v4.2.0 and previous version document. - * - * @param base FlexCAN peripheral base address. - * @param bitRate The classical CAN speed in bps defined by user, should be less than or equal to 1Mbps. - * @param sourceClock_Hz The Source clock frequency in Hz. - * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. - * - * @return TRUE if timing configuration found, FALSE if failed to find configuration. - */ -bool FLEXCAN_CalculateImprovedTimingValues(CAN_Type *base, - uint32_t bitRate, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig); - -/*! - * @brief Initializes a FlexCAN instance. - * - * This function initializes the FlexCAN module with user-defined settings. - * This example shows how to set up the flexcan_config_t parameters and how - * to call the FLEXCAN_Init function by passing in these parameters. - * @code - * flexcan_config_t flexcanConfig; - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig.bitRate = 1000000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.enableDoze = false; - * flexcanConfig.disableSelfReception = false; - * flexcanConfig.enableListenOnlyMode = false; - * flexcanConfig.timingConfig = timingConfig; - * FLEXCAN_Init(CAN0, &flexcanConfig, 40000000UL); - * @endcode - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the user-defined configuration structure. - * @param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. - */ -void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Calculates the improved timing values by specific bit rates for CANFD. - * - * This function use to calculates the CANFD timing values according to the given nominal phase bit rate and data phase - * bit rate. The Calculated timing values will be set in CBT/ENCBT and FDCBT/EDCBT registers. The calculation is based - * on the recommendation of the CiA 1301 v1.0.0 document. - * - * @param base FlexCAN peripheral base address. - * @param bitRate The CANFD bus control speed in bps defined by user. - * @param bitRateFD The CAN FD data phase speed in bps defined by user. Equal to bitRate means disable bit rate - * switching. - * @param sourceClock_Hz The Source clock frequency in Hz. - * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. - * - * @return TRUE if timing configuration found, FALSE if failed to find configuration - */ -bool FLEXCAN_FDCalculateImprovedTimingValues(CAN_Type *base, - uint32_t bitRate, - uint32_t bitRateFD, - uint32_t sourceClock_Hz, - flexcan_timing_config_t *pTimingConfig); -/*! - * @brief Initializes a FlexCAN instance. - * - * This function initializes the FlexCAN module with user-defined settings. - * This example shows how to set up the flexcan_config_t parameters and how - * to call the FLEXCAN_FDInit function by passing in these parameters. - * @code - * flexcan_config_t flexcanConfig; - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig.bitRate = 1000000U; - * flexcanConfig.bitRateFD = 2000000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.disableSelfReception = false; - * flexcanConfig.enableListenOnlyMode = false; - * flexcanConfig.enableDoze = false; - * flexcanConfig.timingConfig = timingConfig; - * FLEXCAN_FDInit(CAN0, &flexcanConfig, 80000000UL, kFLEXCAN_16BperMB, true); - * @endcode - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the user-defined configuration structure. - * @param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. - * @param dataSize FlexCAN Message Buffer payload size. The actual transmitted or received CAN FD frame data size needs - * to be less than or equal to this value. - * @param brs True if bit rate switch is enabled in FD mode. - */ -void FLEXCAN_FDInit( - CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz, flexcan_mb_size_t dataSize, bool brs); -#endif - -/*! - * @brief De-initializes a FlexCAN instance. - * - * This function disables the FlexCAN module clock and sets all register values - * to the reset value. - * - * @param base FlexCAN peripheral base address. - */ -void FLEXCAN_Deinit(CAN_Type *base); - -/*! - * @brief Gets the default configuration structure. - * - * This function initializes the FlexCAN configuration structure to default values. The default - * values are as follows. - * flexcanConfig->clkSrc = kFLEXCAN_ClkSrc0; - * flexcanConfig->bitRate = 1000000U; - * flexcanConfig->bitRateFD = 2000000U; - * flexcanConfig->maxMbNum = 16; - * flexcanConfig->enableLoopBack = false; - * flexcanConfig->enableSelfWakeup = false; - * flexcanConfig->enableIndividMask = false; - * flexcanConfig->disableSelfReception = false; - * flexcanConfig->enableListenOnlyMode = false; - * flexcanConfig->enableDoze = false; - * flexcanConfig->enableMemoryErrorControl = true; - * flexcanConfig->enableNonCorrectableErrorEnterFreeze = true; - * flexcanConfig.timingConfig = timingConfig; - * - * @param pConfig Pointer to the FlexCAN configuration structure. - */ -void FLEXCAN_GetDefaultConfig(flexcan_config_t *pConfig); - -/* @} */ - -/*! - * @name Configuration. - * @{ - */ - -/*! - * @brief Sets the FlexCAN protocol timing characteristic. - * - * This function gives user settings to classical CAN or CANFD nominal phase timing characteristic. - * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() - * and get the default timing characteristicsthe, then call FLEXCAN_Init() and fill the - * bit rate field. - * - * @note Calling FLEXCAN_SetTimingConfig() overrides the bit rate set in FLEXCAN_Init(). - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the timing configuration structure. - */ -void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Sets the FlexCAN CANFD data phase timing characteristic. - * - * This function gives user settings to CANFD data phase timing characteristic. - * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() - * and get the default timing characteristicsthe, then call FLEXCAN_FDInit() and fill the - * data phase bit rate field. - * - * @note Calling FLEXCAN_SetFDTimingConfig() overrides the bit rate set in FLEXCAN_FDInit(). - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the timing configuration structure. - */ -void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig); -#endif - -/*! - * @brief Sets the FlexCAN receive message buffer global mask. - * - * This function sets the global mask for the FlexCAN message buffer in a matching process. - * The configuration is only effective when the Rx individual mask is disabled in the FLEXCAN_Init(). - * - * @param base FlexCAN peripheral base address. - * @param mask Rx Message Buffer Global Mask value. - */ -void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask); - -/*! - * @brief Sets the FlexCAN receive FIFO global mask. - * - * This function sets the global mask for FlexCAN FIFO in a matching process. - * - * @param base FlexCAN peripheral base address. - * @param mask Rx Fifo Global Mask value. - */ -void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask); - -/*! - * @brief Sets the FlexCAN receive individual mask. - * - * This function sets the individual mask for the FlexCAN matching process. - * The configuration is only effective when the Rx individual mask is enabled in the FLEXCAN_Init(). - * If the Rx FIFO is disabled, the individual mask is applied to the corresponding Message Buffer. - * If the Rx FIFO is enabled, the individual mask for Rx FIFO occupied Message Buffer is applied to - * the Rx Filter with the same index. Note that only the first 32 - * individual masks can be used as the Rx FIFO filter mask. - * - * @param base FlexCAN peripheral base address. - * @param maskIdx The Index of individual Mask. - * @param mask Rx Individual Mask value. - */ -void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask); - -/*! - * @brief Configures a FlexCAN transmit message buffer. - * - * This function aborts the previous transmission, cleans the Message Buffer, and - * configures it as a Transmit Message Buffer. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The Message Buffer index. - * @param enable Enable/disable Tx Message Buffer. - * - true: Enable Tx Message Buffer. - * - false: Disable Tx Message Buffer. - */ -void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Configures a FlexCAN transmit message buffer. - * - * This function aborts the previous transmission, cleans the Message Buffer, and - * configures it as a Transmit Message Buffer. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The Message Buffer index. - * @param enable Enable/disable Tx Message Buffer. - * - true: Enable Tx Message Buffer. - * - false: Disable Tx Message Buffer. - */ -void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable); -#endif - -/*! - * @brief Configures a FlexCAN Receive Message Buffer. - * - * This function cleans a FlexCAN build-in Message Buffer and configures it - * as a Receive Message Buffer. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The Message Buffer index. - * @param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. - * @param enable Enable/disable Rx Message Buffer. - * - true: Enable Rx Message Buffer. - * - false: Disable Rx Message Buffer. - */ -void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Configures a FlexCAN Receive Message Buffer. - * - * This function cleans a FlexCAN build-in Message Buffer and configures it - * as a Receive Message Buffer. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The Message Buffer index. - * @param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. - * @param enable Enable/disable Rx Message Buffer. - * - true: Enable Rx Message Buffer. - * - false: Disable Rx Message Buffer. - */ -void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable); -#endif - -/*! - * @brief Configures the FlexCAN Legacy Rx FIFO. - * - * This function configures the FlexCAN Rx FIFO with given configuration. - * @note Legacy Rx FIFO only can receive classic CAN message. - * - * @param base FlexCAN peripheral base address. - * @param pRxFifoConfig Pointer to the FlexCAN Legacy Rx FIFO configuration structure. Can be NULL when enable parameter - * is false. - * @param enable Enable/disable Legacy Rx FIFO. - * - true: Enable Legacy Rx FIFO. - * - false: Disable Legacy Rx FIFO. - */ -void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *pRxFifoConfig, bool enable); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Configures the FlexCAN Enhanced Rx FIFO. - * - * This function configures the Enhanced Rx FIFO with given configuration. - * @note Enhanced Rx FIFO support receive classic CAN or CAN FD messages, Legacy Rx FIFO and Enhanced Rx FIFO - * cannot be enabled at the same time. - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the FlexCAN Enhanced Rx FIFO configuration structure. Can be NULL when enable parameter - * is false. - * @param enable Enable/disable Enhanced Rx FIFO. - * - true: Enable Enhanced Rx FIFO. - * - false: Disable Enhanced Rx FIFO. - */ -void FLEXCAN_SetEnhancedRxFifoConfig(CAN_Type *base, const flexcan_enhanced_rx_fifo_config_t *pConfig, bool enable); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! - * @brief Configures the FlexCAN Pretended Networking mode. - * - * This function configures the FlexCAN Pretended Networking mode with given configuration. - * - * @param base FlexCAN peripheral base address. - * @param pConfig Pointer to the FlexCAN Rx FIFO configuration structure. - */ -void FLEXCAN_SetPNConfig(CAN_Type *base, const flexcan_pn_config_t *pConfig); -#endif -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the FlexCAN module interrupt flags. - * - * This function gets all FlexCAN status flags. The flags are returned as the logical - * OR value of the enumerators @ref _flexcan_flags. To check the specific status, - * compare the return value with enumerators in @ref _flexcan_flags. - * - * @param base FlexCAN peripheral base address. - * @return FlexCAN status flags which are ORed by the enumerators in the _flexcan_flags. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -static inline uint64_t FLEXCAN_GetStatusFlags(CAN_Type *base) -{ - uint64_t tempflag = (uint64_t)base->ESR1; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Get PN Wake Up status. */ - tempflag |= FLEXCAN_PN_STATUS_MASK(base->WU_MTC); -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /* Get Enhanced Rx FIFO status. */ - tempflag |= FLEXCAN_EFIFO_STATUS_MASK(base->ERFSR); -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Get Memory Error status. */ - tempflag |= FLEXCAN_MECR_STATUS_MASK(base->ERRSR); -#endif - return tempflag; -} -#else -static inline uint32_t FLEXCAN_GetStatusFlags(CAN_Type *base) -{ - return base->ESR1; -} -#endif -/*! - * @brief Clears status flags with the provided mask. - * - * This function clears the FlexCAN status flags with a provided mask. An automatically cleared flag - * can't be cleared by this function. - * - * @param base FlexCAN peripheral base address. - * @param mask The status flags to be cleared, it is logical OR value of @ref _flexcan_flags. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint64_t mask) -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Clear PN Wake Up status. */ - base->WU_MTC = FLEXCAN_PN_STATUS_UNMASK(mask); -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /* Clear Enhanced Rx FIFO status. */ - base->ERFSR |= FLEXCAN_EFIFO_STATUS_UNMASK(mask); -#endif -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Clear Memory Error status. */ - base->ERRSR = FLEXCAN_MECR_STATUS_UNMASK(mask); -#endif - base->ESR1 = (uint32_t)(mask & 0xFFFFFFFFU); -} -#else -static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint32_t mask) -{ - /* Write 1 to clear status flag. */ - base->ESR1 = mask; -} -#endif -/*! - * @brief Gets the FlexCAN Bus Error Counter value. - * - * This function gets the FlexCAN Bus Error Counter value for both Tx and - * Rx direction. These values may be needed in the upper layer error handling. - * - * @param base FlexCAN peripheral base address. - * @param txErrBuf Buffer to store Tx Error Counter value. - * @param rxErrBuf Buffer to store Rx Error Counter value. - */ -static inline void FLEXCAN_GetBusErrCount(CAN_Type *base, uint8_t *txErrBuf, uint8_t *rxErrBuf) -{ - if (NULL != txErrBuf) - { - *txErrBuf = (uint8_t)((base->ECR & CAN_ECR_TXERRCNT_MASK) >> CAN_ECR_TXERRCNT_SHIFT); - } - - if (NULL != rxErrBuf) - { - *rxErrBuf = (uint8_t)((base->ECR & CAN_ECR_RXERRCNT_MASK) >> CAN_ECR_RXERRCNT_SHIFT); - } -} - -/*! - * @brief Gets the FlexCAN Message Buffer interrupt flags. - * - * This function gets the interrupt flags of a given Message Buffers. - * - * @param base FlexCAN peripheral base address. - * @param mask The ORed FlexCAN Message Buffer mask. - * @return The status of given Message Buffers. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) -static inline uint64_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint64_t mask) -#else -static inline uint32_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint32_t mask) -#endif -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - uint64_t tempflag = (uint64_t)base->IFLAG1; - return (tempflag | (((uint64_t)base->IFLAG2) << 32)) & mask; -#else - return (base->IFLAG1 & mask); -#endif -} - -/*! - * @brief Clears the FlexCAN Message Buffer interrupt flags. - * - * This function clears the interrupt flags of a given Message Buffers. - * - * @param base FlexCAN peripheral base address. - * @param mask The ORed FlexCAN Message Buffer mask. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) -static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint64_t mask) -#else -static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint32_t mask) -#endif -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IFLAG1 = (uint32_t)(mask & 0xFFFFFFFFU); - base->IFLAG2 = (uint32_t)(mask >> 32); -#else - base->IFLAG1 = mask; -#endif -} - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -/*! - * @brief Gets the FlexCAN Memory Error Report registers status. - * - * This function gets the FlexCAN Memory Error Report registers status. - * - * @param base FlexCAN peripheral base address. - * @param errorStatus Pointer to FlexCAN Memory Error Report registers status structure. - */ -void FLEXCAN_GetMemoryErrorReportStatus(CAN_Type *base, flexcan_memory_error_report_status_t *errorStatus); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! - * @brief Gets the FlexCAN Number of Matches when in Pretended Networking. - * - * This function gets the number of times a given message has matched the predefined filtering criteria for ID and/or PL - * before a wakeup event. - * - * @param base FlexCAN peripheral base address. - * @return The number of received wake up msessages. - */ -static inline uint8_t FLEXCAN_GetPNMatchCount(CAN_Type *base) -{ - return (uint8_t)((base->WU_MTC & CAN_WU_MTC_MCOUNTER_MASK) >> CAN_WU_MTC_MCOUNTER_SHIFT); -} -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Gets the number of FlexCAN Enhanced Rx FIFO available frames. - * - * This function gets the number of CAN messages stored in the Enhanced Rx FIFO. - * - * @param base FlexCAN peripheral base address. - * @return The number of available CAN messages stored in the Enhanced Rx FIFO. - */ -static inline uint32_t FLEXCAN_GetEnhancedFifoDataCount(CAN_Type *base) -{ - return (base->ERFSR & CAN_ERFSR_ERFEL_MASK); -} -#endif -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables FlexCAN interrupts according to the provided mask. - * - * This function enables the FlexCAN interrupts according to the provided mask. The mask - * is a logical OR of enumeration members, see @ref _flexcan_interrupt_enable. - * - * @param base FlexCAN peripheral base address. - * @param mask The interrupts to enable. Logical OR of @ref _flexcan_interrupt_enable. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint64_t mask) -#else -static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint32_t mask) -#endif -{ - /* Solve Self Wake Up interrupt. */ - base->MCR |= (uint32_t)(mask & (uint32_t)kFLEXCAN_WakeUpInterruptEnable); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { - /* Solve CAN FD frames data phase error interrupt. */ - base->CTRL2 |= (uint32_t)(mask & (uint32_t)kFLEXCAN_FDErrorInterruptEnable); - } -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Solve PN Wake Up interrupt. */ - base->CTRL1_PN |= FLEXCAN_PN_INT_UNMASK(mask); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /* Solve Enhanced Rx FIFO interrupt. */ - base->ERFIER |= FLEXCAN_EFIFO_INT_UNMASK(mask); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Solve Memory Error interrupt. */ - base->MECR |= FLEXCAN_MECR_INT_UNMASK(mask); -#endif - - /* Solve interrupt enable bits in CTRL1 register. */ - base->CTRL1 |= - (uint32_t)(mask & ((uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | - (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | - (uint32_t)kFLEXCAN_WakeUpInterruptEnable)); -} - -/*! - * @brief Disables FlexCAN interrupts according to the provided mask. - * - * This function disables the FlexCAN interrupts according to the provided mask. The mask - * is a logical OR of enumeration members, see @ref _flexcan_interrupt_enable. - * - * @param base FlexCAN peripheral base address. - * @param mask The interrupts to disable. Logical OR of @ref _flexcan_interrupt_enable. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ - (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) -static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint64_t mask) -#else -static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint32_t mask) -#endif -{ - /* Solve Wake Up Interrupt. */ - base->MCR &= ~(uint32_t)(mask & (uint32_t)kFLEXCAN_WakeUpInterruptEnable); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) - if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) - { - /* Solve CAN FD frames data phase error interrupt. */ - base->CTRL2 &= ~(uint32_t)(mask & (uint32_t)kFLEXCAN_FDErrorInterruptEnable); - } -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) - /* Solve PN Wake Up Interrupt. */ - base->CTRL1_PN &= ~FLEXCAN_PN_STATUS_UNMASK(mask); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) - /* Solve Enhanced Rx FIFO interrupt. */ - base->ERFIER &= ~FLEXCAN_EFIFO_INT_UNMASK(mask); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) - /* Solve Memory Error Interrupt. */ - base->MECR &= ~FLEXCAN_MECR_STATUS_UNMASK(mask); -#endif - - /* Solve interrupt enable bits in CTRL1 register. */ - base->CTRL1 &= - ~(uint32_t)(mask & ((uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | - (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | - (uint32_t)kFLEXCAN_WakeUpInterruptEnable)); -} - -/*! - * @brief Enables FlexCAN Message Buffer interrupts. - * - * This function enables the interrupts of given Message Buffers. - * - * @param base FlexCAN peripheral base address. - * @param mask The ORed FlexCAN Message Buffer mask. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) -static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint64_t mask) -#else -static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint32_t mask) -#endif -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IMASK1 |= (uint32_t)(mask & 0xFFFFFFFFU); - base->IMASK2 |= (uint32_t)(mask >> 32); -#else - base->IMASK1 |= mask; -#endif -} - -/*! - * @brief Disables FlexCAN Message Buffer interrupts. - * - * This function disables the interrupts of given Message Buffers. - * - * @param base FlexCAN peripheral base address. - * @param mask The ORed FlexCAN Message Buffer mask. - */ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) -static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint64_t mask) -#else -static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint32_t mask) -#endif -{ -#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) - base->IMASK1 &= ~((uint32_t)(mask & 0xFFFFFFFFU)); - base->IMASK2 &= ~((uint32_t)(mask >> 32)); -#else - base->IMASK1 &= ~mask; -#endif -} - -/* @} */ - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables or disables the FlexCAN Rx FIFO DMA request. - * - * This function enables or disables the DMA feature of FlexCAN build-in Rx FIFO. - * - * @param base FlexCAN peripheral base address. - * @param enable true to enable, false to disable. - */ -void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable); - -/*! - * @brief Gets the Rx FIFO Head address. - * - * This function returns the FlexCAN Rx FIFO Head address, which is mainly used for the DMA/eDMA use case. - * - * @param base FlexCAN peripheral base address. - * @return FlexCAN Rx FIFO Head address. - */ -static inline uint32_t FLEXCAN_GetRxFifoHeadAddr(CAN_Type *base) -{ - return (uint32_t) & (base->MB[0].CS); -} - -/* @} */ -#endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Enables or disables the FlexCAN module operation. - * - * This function enables or disables the FlexCAN module. - * - * @param base FlexCAN base pointer. - * @param enable true to enable, false to disable. - */ -static inline void FLEXCAN_Enable(CAN_Type *base, bool enable) -{ - if (enable) - { - base->MCR &= ~CAN_MCR_MDIS_MASK; - - /* Wait FlexCAN exit from low-power mode. */ - while (0U != (base->MCR & CAN_MCR_LPMACK_MASK)) - { - } - } - else - { - base->MCR |= CAN_MCR_MDIS_MASK; - - /* Wait FlexCAN enter low-power mode. */ - while (0U == (base->MCR & CAN_MCR_LPMACK_MASK)) - { - } - } -} - -/*! - * @brief Writes a FlexCAN Message to the Transmit Message Buffer. - * - * This function writes a CAN Message to the specified Transmit Message Buffer - * and changes the Message Buffer state to start CAN Message transmit. After - * that the function returns immediately. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN Message Buffer index. - * @param pTxFrame Pointer to CAN message frame to be sent. - * @retval kStatus_Success - Write Tx Message Buffer Successfully. - * @retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *pTxFrame); - -/*! - * @brief Reads a FlexCAN Message from Receive Message Buffer. - * - * This function reads a CAN message from a specified Receive Message Buffer. - * The function fills a receive CAN message frame structure with - * just received data and activates the Message Buffer again. - * The function returns immediately. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN Message Buffer index. - * @param pRxFrame Pointer to CAN message frame structure for reception. - * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * @retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Writes a FlexCAN FD Message to the Transmit Message Buffer. - * - * This function writes a CAN FD Message to the specified Transmit Message Buffer - * and changes the Message Buffer state to start CAN FD Message transmit. After - * that the function returns immediately. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN FD Message Buffer index. - * @param pTxFrame Pointer to CAN FD message frame to be sent. - * @retval kStatus_Success - Write Tx Message Buffer Successfully. - * @retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *pTxFrame); - -/*! - * @brief Reads a FlexCAN FD Message from Receive Message Buffer. - * - * This function reads a CAN FD message from a specified Receive Message Buffer. - * The function fills a receive CAN FD message frame structure with - * just received data and activates the Message Buffer again. - * The function returns immediately. - * - * @param base FlexCAN peripheral base address. - * @param mbIdx The FlexCAN FD Message Buffer index. - * @param pRxFrame Pointer to CAN FD message frame structure for reception. - * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * @retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame); -#endif - -/*! - * @brief Reads a FlexCAN Message from Legacy Rx FIFO. - * - * This function reads a CAN message from the FlexCAN Legacy Rx FIFO. - * - * @param base FlexCAN peripheral base address. - * @param pRxFrame Pointer to CAN message frame structure for reception. - * @retval kStatus_Success - Read Message from Rx FIFO successfully. - * @retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *pRxFrame); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Reads a FlexCAN Message from Enhanced Rx FIFO. - * - * This function reads a CAN or CAN FD message from the FlexCAN Enhanced Rx FIFO. - * - * @param base FlexCAN peripheral base address. - * @param pRxFrame Pointer to CAN FD message frame structure for reception. - * @retval kStatus_Success - Read Message from Rx FIFO successfully. - * @retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_ReadEnhancedRxFifo(CAN_Type *base, flexcan_fd_frame_t *pRxFrame); -#endif - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) -/*! - * @brief Reads a FlexCAN Message from Wake Up MB. - * - * This function reads a CAN message from the FlexCAN Wake up Message Buffers. There are four Wake up Message Buffers - * (WMBs) used to store incoming messages in Pretended Networking mode. The WMB index indicates the arrival order. The - * last message is stored in WMB3. - * - * @param base FlexCAN peripheral base address. - * @param pRxFrame Pointer to CAN message frame structure for reception. - * @param mbIdx The FlexCAN Wake up Message Buffer index. Range in 0x0 ~ 0x3. - * @retval kStatus_Success - Read Message from Wake up Message Buffer successfully. - * @retval kStatus_Fail - Wake up Message Buffer has no valid content. - */ -status_t FLEXCAN_ReadPNWakeUpMB(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); -#endif -/* @} */ - -/*! - * @name Transactional - * @{ - */ - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) -/*! - * @brief Performs a polling send transaction on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param mbIdx The FlexCAN FD Message Buffer index. - * @param pTxFrame Pointer to CAN FD message frame to be sent. - * @retval kStatus_Success - Write Tx Message Buffer Successfully. - * @retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pTxFrame); - -/*! - * @brief Performs a polling receive transaction on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param mbIdx The FlexCAN FD Message Buffer index. - * @param pRxFrame Pointer to CAN FD message frame structure for reception. - * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * @retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame); - -/*! - * @brief Sends a message using IRQ. - * - * This function sends a message using IRQ. This is a non-blocking function, which returns - * right away. When messages have been sent out, the send callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * @retval kStatus_Success Start Tx Message Buffer sending process successfully. - * @retval kStatus_Fail Write Tx Message Buffer failed. - * @retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. - */ -status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); - -/*! - * @brief Receives a message using IRQ. - * - * This function receives a message using IRQ. This is non-blocking function, which returns - * right away. When the message has been received, the receive callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * @retval kStatus_Success - Start Rx Message Buffer receiving process successfully. - * @retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. - */ -status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); - -/*! - * @brief Aborts the interrupt driven message send process. - * - * This function aborts the interrupt driven message send process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param mbIdx The FlexCAN FD Message Buffer index. - */ -void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); - -/*! - * @brief Aborts the interrupt driven message receive process. - * - * This function aborts the interrupt driven message receive process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param mbIdx The FlexCAN FD Message Buffer index. - */ -void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); -#endif - -/*! - * @brief Performs a polling send transaction on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param mbIdx The FlexCAN Message Buffer index. - * @param pTxFrame Pointer to CAN message frame to be sent. - * @retval kStatus_Success - Write Tx Message Buffer Successfully. - * @retval kStatus_Fail - Tx Message Buffer is currently in use. - */ -status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pTxFrame); - -/*! - * @brief Performs a polling receive transaction on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param mbIdx The FlexCAN Message Buffer index. - * @param pRxFrame Pointer to CAN message frame structure for reception. - * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. - * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. - * @retval kStatus_Fail - Rx Message Buffer is empty. - */ -status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); - -/*! - * @brief Performs a polling receive transaction from Legacy Rx FIFO on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param pRxFrame Pointer to CAN message frame structure for reception. - * @retval kStatus_Success - Read Message from Rx FIFO successfully. - * @retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *pRxFrame); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Performs a polling receive transaction from Enhanced Rx FIFO on the CAN bus. - * - * @note A transfer handle does not need to be created before calling this API. - * - * @param base FlexCAN peripheral base pointer. - * @param pRxFrame Pointer to CAN FD message frame structure for reception. - * @retval kStatus_Success - Read Message from Rx FIFO successfully. - * @retval kStatus_Fail - Rx FIFO is not enabled. - */ -status_t FLEXCAN_TransferReceiveEnhancedFifoBlocking(CAN_Type *base, flexcan_fd_frame_t *pRxFrame); -#endif - -/*! - * @brief Initializes the FlexCAN handle. - * - * This function initializes the FlexCAN handle, which can be used for other FlexCAN - * transactional APIs. Usually, for a specified FlexCAN instance, - * call this API once to get the initialized handle. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param callback The callback function. - * @param userData The parameter of the callback function. - */ -void FLEXCAN_TransferCreateHandle(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_transfer_callback_t callback, - void *userData); - -/*! - * @brief Sends a message using IRQ. - * - * This function sends a message using IRQ. This is a non-blocking function, which returns - * right away. When messages have been sent out, the send callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * @retval kStatus_Success Start Tx Message Buffer sending process successfully. - * @retval kStatus_Fail Write Tx Message Buffer failed. - * @retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. - */ -status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); - -/*! - * @brief Receives a message using IRQ. - * - * This function receives a message using IRQ. This is non-blocking function, which returns - * right away. When the message has been received, the receive callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. - * @retval kStatus_Success - Start Rx Message Buffer receiving process successfully. - * @retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. - */ -status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); - -/*! - * @brief Receives a message from Rx FIFO using IRQ. - * - * This function receives a message using IRQ. This is a non-blocking function, which returns - * right away. When all messages have been received, the receive callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pFifoXfer FlexCAN Rx FIFO transfer structure. See the @ref flexcan_fifo_transfer_t. - * @retval kStatus_Success - Start Rx FIFO receiving process successfully. - * @retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. - */ -status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_fifo_transfer_t *pFifoXfer); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Receives a message from Enhanced Rx FIFO using IRQ. - * - * This function receives a message using IRQ. This is a non-blocking function, which returns - * right away. When all messages have been received, the receive callback function is called. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t.@ - * @retval kStatus_Success - Start Rx FIFO receiving process successfully. - * @retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. - */ -status_t FLEXCAN_TransferReceiveEnhancedFifoNonBlocking(CAN_Type *base, - flexcan_handle_t *handle, - flexcan_fifo_transfer_t *pFifoXfer); - -/*! - * @brief Gets the Enhanced Rx Fifo transfer status during a interrupt non-blocking receive. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param count Number of CAN messages receive so far by the non-blocking transaction. - * @retval kStatus_InvalidArgument count is Invalid. - * @retval kStatus_Success Successfully return the count. - */ - -status_t FLEXCAN_TransferGetReceiveEnhancedFifoCount(CAN_Type *base, flexcan_handle_t *handle, size_t *count); -#endif - -/*! - * @brief Gets the detail index of Mailbox's Timestamp by handle. - * - * Then function can only be used when calling non-blocking Data transfer (TX/RX) API, - * After TX/RX data transfer done (User can get the status by handler's callback function), - * we can get the detail index of Mailbox's timestamp by handle, - * Detail non-blocking data transfer API (TX/RX) contain. - * -FLEXCAN_TransferSendNonBlocking - * -FLEXCAN_TransferFDSendNonBlocking - * -FLEXCAN_TransferReceiveNonBlocking - * -FLEXCAN_TransferFDReceiveNonBlocking - * -FLEXCAN_TransferReceiveFifoNonBlocking - * - * @param handle FlexCAN handle pointer. - * @param mbIdx The FlexCAN Message Buffer index. - * @retval the index of mailbox 's timestamp stored in the handle. - * - */ -uint32_t FLEXCAN_GetTimeStamp(flexcan_handle_t *handle, uint8_t mbIdx); - -/*! - * @brief Aborts the interrupt driven message send process. - * - * This function aborts the interrupt driven message send process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param mbIdx The FlexCAN Message Buffer index. - */ -void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); - -/*! - * @brief Aborts the interrupt driven message receive process. - * - * This function aborts the interrupt driven message receive process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - * @param mbIdx The FlexCAN Message Buffer index. - */ -void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); - -/*! - * @brief Aborts the interrupt driven message receive from Rx FIFO process. - * - * This function aborts the interrupt driven message receive from Rx FIFO process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle); - -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) -/*! - * @brief Aborts the interrupt driven message receive from Enhanced Rx FIFO process. - * - * This function aborts the interrupt driven message receive from Enhanced Rx FIFO process. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferAbortReceiveEnhancedFifo(CAN_Type *base, flexcan_handle_t *handle); -#endif - -/*! - * @brief FlexCAN IRQ handle function. - * - * This function handles the FlexCAN Error, the Message Buffer, and the Rx FIFO IRQ request. - * - * @param base FlexCAN peripheral base address. - * @param handle FlexCAN handle pointer. - */ -void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_FLEXCAN_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio.c b/devices/MIMXRT1052/drivers/fsl_flexio.c deleted file mode 100644 index 18531f7..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio" -#endif - -/*< @brief user configurable flexio handle count. */ -#define FLEXIO_HANDLE_COUNT 2 - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to flexio bases for each instance. */ -FLEXIO_Type *const s_flexioBases[] = FLEXIO_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to flexio clocks for each instance. */ -const clock_ip_name_t s_flexioClocks[] = FLEXIO_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*< @brief pointer to array of FLEXIO handle. */ -static void *s_flexioHandle[FLEXIO_HANDLE_COUNT]; - -/*< @brief pointer to array of FLEXIO IP types. */ -static void *s_flexioType[FLEXIO_HANDLE_COUNT]; - -/*< @brief pointer to array of FLEXIO Isr. */ -static flexio_isr_t s_flexioIsr[FLEXIO_HANDLE_COUNT]; - -/* FlexIO common IRQ Handler. */ -static void FLEXIO_CommonIRQHandler(void); - -/******************************************************************************* - * Codes - ******************************************************************************/ - -/*! - * brief Get instance number for FLEXIO module. - * - * param base FLEXIO peripheral base address. - */ -uint32_t FLEXIO_GetInstance(FLEXIO_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_flexioBases); instance++) - { - if (s_flexioBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_flexioBases)); - - return instance; -} - -/*! - * brief Configures the FlexIO with a FlexIO configuration. The configuration structure - * can be filled by the user or be set with default values by FLEXIO_GetDefaultConfig(). - * - * Example - code - flexio_config_t config = { - .enableFlexio = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false - }; - FLEXIO_Configure(base, &config); - endcode - * - * param base FlexIO peripheral base address - * param userConfig pointer to flexio_config_t structure -*/ -void FLEXIO_Init(FLEXIO_Type *base, const flexio_config_t *userConfig) -{ - uint32_t ctrlReg = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_EnableClock(s_flexioClocks[FLEXIO_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - FLEXIO_Reset(base); - - ctrlReg = base->CTRL; - ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(userConfig->enableFlexio)); - if (!userConfig->enableInDoze) - { - ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; - } - - base->CTRL = ctrlReg; -} - -/*! - * brief Gates the FlexIO clock. Call this API to stop the FlexIO clock. - * - * note After calling this API, call the FLEXO_Init to use the FlexIO module. - * - * param base FlexIO peripheral base address - */ -void FLEXIO_Deinit(FLEXIO_Type *base) -{ - FLEXIO_Enable(base, false); -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(s_flexioClocks[FLEXIO_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets the default configuration to configure the FlexIO module. The configuration - * can used directly to call the FLEXIO_Configure(). - * - * Example: - code - flexio_config_t config; - FLEXIO_GetDefaultConfig(&config); - endcode - * - * param userConfig pointer to flexio_config_t structure -*/ -void FLEXIO_GetDefaultConfig(flexio_config_t *userConfig) -{ - assert(userConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(userConfig, 0, sizeof(*userConfig)); - - userConfig->enableFlexio = true; - userConfig->enableInDoze = false; - userConfig->enableInDebug = true; - userConfig->enableFastAccess = false; -} - -/*! - * brief Resets the FlexIO module. - * - * param base FlexIO peripheral base address - */ -void FLEXIO_Reset(FLEXIO_Type *base) -{ - /*do software reset, software reset operation affect all other FLEXIO registers except CTRL*/ - base->CTRL |= FLEXIO_CTRL_SWRST_MASK; - base->CTRL = 0; -} - -/*! - * brief Gets the shifter buffer address for the DMA transfer usage. - * - * param base FlexIO peripheral base address - * param type Shifter type of flexio_shifter_buffer_type_t - * param index Shifter index - * return Corresponding shifter buffer index - */ -uint32_t FLEXIO_GetShifterBufferAddress(FLEXIO_Type *base, flexio_shifter_buffer_type_t type, uint8_t index) -{ - assert(index < FLEXIO_SHIFTBUF_COUNT); - - uint32_t address = 0; - - switch (type) - { - case kFLEXIO_ShifterBuffer: - address = (uint32_t) & (base->SHIFTBUF[index]); - break; - - case kFLEXIO_ShifterBufferBitSwapped: - address = (uint32_t) & (base->SHIFTBUFBIS[index]); - break; - - case kFLEXIO_ShifterBufferByteSwapped: - address = (uint32_t) & (base->SHIFTBUFBYS[index]); - break; - - case kFLEXIO_ShifterBufferBitByteSwapped: - address = (uint32_t) & (base->SHIFTBUFBBS[index]); - break; - -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP - case kFLEXIO_ShifterBufferNibbleByteSwapped: - address = (uint32_t) & (base->SHIFTBUFNBS[index]); - break; - -#endif -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP - case kFLEXIO_ShifterBufferHalfWordSwapped: - address = (uint32_t) & (base->SHIFTBUFHWS[index]); - break; - -#endif -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP - case kFLEXIO_ShifterBufferNibbleSwapped: - address = (uint32_t) & (base->SHIFTBUFNIS[index]); - break; - -#endif - default: - address = (uint32_t) & (base->SHIFTBUF[index]); - break; - } - return address; -} - -/*! - * brief Configures the shifter with the shifter configuration. The configuration structure - * covers both the SHIFTCTL and SHIFTCFG registers. To configure the shifter to the proper - * mode, select which timer controls the shifter to shift, whether to generate start bit/stop - * bit, and the polarity of start bit and stop bit. - * - * Example - code - flexio_shifter_config_t config = { - .timerSelect = 0, - .timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive, - .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, - .pinPolarity = kFLEXIO_PinActiveLow, - .shifterMode = kFLEXIO_ShifterModeTransmit, - .inputSource = kFLEXIO_ShifterInputFromPin, - .shifterStop = kFLEXIO_ShifterStopBitHigh, - .shifterStart = kFLEXIO_ShifterStartBitLow - }; - FLEXIO_SetShifterConfig(base, &config); - endcode - * - * param base FlexIO peripheral base address - * param index Shifter index - * param shifterConfig Pointer to flexio_shifter_config_t structure -*/ -void FLEXIO_SetShifterConfig(FLEXIO_Type *base, uint8_t index, const flexio_shifter_config_t *shifterConfig) -{ - base->SHIFTCFG[index] = FLEXIO_SHIFTCFG_INSRC(shifterConfig->inputSource) -#if FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH - | FLEXIO_SHIFTCFG_PWIDTH(shifterConfig->parallelWidth) -#endif /* FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH */ - | FLEXIO_SHIFTCFG_SSTOP(shifterConfig->shifterStop) | - FLEXIO_SHIFTCFG_SSTART(shifterConfig->shifterStart); - - base->SHIFTCTL[index] = - FLEXIO_SHIFTCTL_TIMSEL(shifterConfig->timerSelect) | FLEXIO_SHIFTCTL_TIMPOL(shifterConfig->timerPolarity) | - FLEXIO_SHIFTCTL_PINCFG(shifterConfig->pinConfig) | FLEXIO_SHIFTCTL_PINSEL(shifterConfig->pinSelect) | - FLEXIO_SHIFTCTL_PINPOL(shifterConfig->pinPolarity) | FLEXIO_SHIFTCTL_SMOD(shifterConfig->shifterMode); -} - -/*! - * brief Configures the timer with the timer configuration. The configuration structure - * covers both the TIMCTL and TIMCFG registers. To configure the timer to the proper - * mode, select trigger source for timer and the timer pin output and the timing for timer. - * - * Example - code - flexio_timer_config_t config = { - .triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(0), - .triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow, - .triggerSource = kFLEXIO_TimerTriggerSourceInternal, - .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, - .pinSelect = 0, - .pinPolarity = kFLEXIO_PinActiveHigh, - .timerMode = kFLEXIO_TimerModeDual8BitBaudBit, - .timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset, - .timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput, - .timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput, - .timerDisable = kFLEXIO_TimerDisableOnTimerCompare, - .timerEnable = kFLEXIO_TimerEnableOnTriggerHigh, - .timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable, - .timerStart = kFLEXIO_TimerStartBitEnabled - }; - FLEXIO_SetTimerConfig(base, &config); - endcode - * - * param base FlexIO peripheral base address - * param index Timer index - * param timerConfig Pointer to the flexio_timer_config_t structure -*/ -void FLEXIO_SetTimerConfig(FLEXIO_Type *base, uint8_t index, const flexio_timer_config_t *timerConfig) -{ - base->TIMCFG[index] = - FLEXIO_TIMCFG_TIMOUT(timerConfig->timerOutput) | FLEXIO_TIMCFG_TIMDEC(timerConfig->timerDecrement) | - FLEXIO_TIMCFG_TIMRST(timerConfig->timerReset) | FLEXIO_TIMCFG_TIMDIS(timerConfig->timerDisable) | - FLEXIO_TIMCFG_TIMENA(timerConfig->timerEnable) | FLEXIO_TIMCFG_TSTOP(timerConfig->timerStop) | - FLEXIO_TIMCFG_TSTART(timerConfig->timerStart); - - base->TIMCMP[index] = FLEXIO_TIMCMP_CMP(timerConfig->timerCompare); - - base->TIMCTL[index] = FLEXIO_TIMCTL_TRGSEL(timerConfig->triggerSelect) | - FLEXIO_TIMCTL_TRGPOL(timerConfig->triggerPolarity) | - FLEXIO_TIMCTL_TRGSRC(timerConfig->triggerSource) | - FLEXIO_TIMCTL_PINCFG(timerConfig->pinConfig) | FLEXIO_TIMCTL_PINSEL(timerConfig->pinSelect) | - FLEXIO_TIMCTL_PINPOL(timerConfig->pinPolarity) | FLEXIO_TIMCTL_TIMOD(timerConfig->timerMode); -} - -/*! - * brief Registers the handle and the interrupt handler for the FlexIO-simulated peripheral. - * - * param base Pointer to the FlexIO simulated peripheral type. - * param handle Pointer to the handler for FlexIO simulated peripheral. - * param isr FlexIO simulated peripheral interrupt handler. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_RegisterHandleIRQ(void *base, void *handle, flexio_isr_t isr) -{ - assert(base != NULL); - assert(handle != NULL); - assert(isr != NULL); - - uint8_t index; - - /* Find the an empty handle pointer to store the handle. */ - for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) - { - if (s_flexioHandle[index] == NULL) - { - /* Register FLEXIO simulated driver base, handle and isr. */ - s_flexioType[index] = base; - s_flexioHandle[index] = handle; - s_flexioIsr[index] = isr; - break; - } - } - - if (index == (uint8_t)FLEXIO_HANDLE_COUNT) - { - return kStatus_OutOfRange; - } - else - { - return kStatus_Success; - } -} - -/*! - * brief Unregisters the handle and the interrupt handler for the FlexIO-simulated peripheral. - * - * param base Pointer to the FlexIO simulated peripheral type. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_UnregisterHandleIRQ(void *base) -{ - assert(base != NULL); - - uint8_t index; - - /* Find the index from base address mappings. */ - for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) - { - if (s_flexioType[index] == base) - { - /* Unregister FLEXIO simulated driver handle and isr. */ - s_flexioType[index] = NULL; - s_flexioHandle[index] = NULL; - s_flexioIsr[index] = NULL; - break; - } - } - - if (index == (uint8_t)FLEXIO_HANDLE_COUNT) - { - return kStatus_OutOfRange; - } - else - { - return kStatus_Success; - } -} - -static void FLEXIO_CommonIRQHandler(void) -{ - uint8_t index; - - for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) - { - if (s_flexioHandle[index] != NULL) - { - s_flexioIsr[index](s_flexioType[index], s_flexioHandle[index]); - } - } - SDK_ISR_EXIT_BARRIER; -} - -void FLEXIO_DriverIRQHandler(void); -void FLEXIO_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} - -void FLEXIO0_DriverIRQHandler(void); -void FLEXIO0_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} - -void FLEXIO1_DriverIRQHandler(void); -void FLEXIO1_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} - -void UART2_FLEXIO_DriverIRQHandler(void); -void UART2_FLEXIO_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} - -void FLEXIO2_DriverIRQHandler(void); -void FLEXIO2_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} - -void FLEXIO3_DriverIRQHandler(void); -void FLEXIO3_DriverIRQHandler(void) -{ - FLEXIO_CommonIRQHandler(); -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio.h b/devices/MIMXRT1052/drivers/fsl_flexio.h deleted file mode 100644 index 9382738..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio.h +++ /dev/null @@ -1,700 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_H_ -#define _FSL_FLEXIO_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup flexio_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO driver version. */ -#define FSL_FLEXIO_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) -/*@}*/ - -/*! @brief Calculate FlexIO timer trigger.*/ -#define FLEXIO_TIMER_TRIGGER_SEL_PININPUT(x) ((uint32_t)(x) << 1U) -#define FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(x) (((uint32_t)(x) << 2U) | 0x1U) -#define FLEXIO_TIMER_TRIGGER_SEL_TIMn(x) (((uint32_t)(x) << 2U) | 0x3U) - -/*! @brief Define time of timer trigger polarity.*/ -typedef enum _flexio_timer_trigger_polarity -{ - kFLEXIO_TimerTriggerPolarityActiveHigh = 0x0U, /*!< Active high. */ - kFLEXIO_TimerTriggerPolarityActiveLow = 0x1U, /*!< Active low. */ -} flexio_timer_trigger_polarity_t; - -/*! @brief Define type of timer trigger source.*/ -typedef enum _flexio_timer_trigger_source -{ - kFLEXIO_TimerTriggerSourceExternal = 0x0U, /*!< External trigger selected. */ - kFLEXIO_TimerTriggerSourceInternal = 0x1U, /*!< Internal trigger selected. */ -} flexio_timer_trigger_source_t; - -/*! @brief Define type of timer/shifter pin configuration.*/ -typedef enum _flexio_pin_config -{ - kFLEXIO_PinConfigOutputDisabled = 0x0U, /*!< Pin output disabled. */ - kFLEXIO_PinConfigOpenDrainOrBidirection = 0x1U, /*!< Pin open drain or bidirectional output enable. */ - kFLEXIO_PinConfigBidirectionOutputData = 0x2U, /*!< Pin bidirectional output data. */ - kFLEXIO_PinConfigOutput = 0x3U, /*!< Pin output. */ -} flexio_pin_config_t; - -/*! @brief Definition of pin polarity.*/ -typedef enum _flexio_pin_polarity -{ - kFLEXIO_PinActiveHigh = 0x0U, /*!< Active high. */ - kFLEXIO_PinActiveLow = 0x1U, /*!< Active low. */ -} flexio_pin_polarity_t; - -/*! @brief Define type of timer work mode.*/ -typedef enum _flexio_timer_mode -{ - kFLEXIO_TimerModeDisabled = 0x0U, /*!< Timer Disabled. */ - kFLEXIO_TimerModeDual8BitBaudBit = 0x1U, /*!< Dual 8-bit counters baud/bit mode. */ - kFLEXIO_TimerModeDual8BitPWM = 0x2U, /*!< Dual 8-bit counters PWM mode. */ - kFLEXIO_TimerModeSingle16Bit = 0x3U, /*!< Single 16-bit counter mode. */ -} flexio_timer_mode_t; - -/*! @brief Define type of timer initial output or timer reset condition.*/ -typedef enum _flexio_timer_output -{ - kFLEXIO_TimerOutputOneNotAffectedByReset = 0x0U, /*!< Logic one when enabled and is not affected by timer - reset. */ - kFLEXIO_TimerOutputZeroNotAffectedByReset = 0x1U, /*!< Logic zero when enabled and is not affected by timer - reset. */ - kFLEXIO_TimerOutputOneAffectedByReset = 0x2U, /*!< Logic one when enabled and on timer reset. */ - kFLEXIO_TimerOutputZeroAffectedByReset = 0x3U, /*!< Logic zero when enabled and on timer reset. */ -} flexio_timer_output_t; - -/*! @brief Define type of timer decrement.*/ -typedef enum _flexio_timer_decrement_source -{ - kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput = 0x0U, /*!< Decrement counter on FlexIO clock, Shift clock - equals Timer output. */ - kFLEXIO_TimerDecSrcOnTriggerInputShiftTimerOutput = 0x1U, /*!< Decrement counter on Trigger input (both edges), - Shift clock equals Timer output. */ - kFLEXIO_TimerDecSrcOnPinInputShiftPinInput = 0x2U, /*!< Decrement counter on Pin input (both edges), - Shift clock equals Pin input. */ - kFLEXIO_TimerDecSrcOnTriggerInputShiftTriggerInput = 0x3U, /*!< Decrement counter on Trigger input (both edges), - Shift clock equals Trigger input. */ -} flexio_timer_decrement_source_t; - -/*! @brief Define type of timer reset condition.*/ -typedef enum _flexio_timer_reset_condition -{ - kFLEXIO_TimerResetNever = 0x0U, /*!< Timer never reset. */ - kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput = 0x2U, /*!< Timer reset on Timer Pin equal to Timer Output. */ - kFLEXIO_TimerResetOnTimerTriggerEqualToTimerOutput = 0x3U, /*!< Timer reset on Timer Trigger equal to - Timer Output. */ - kFLEXIO_TimerResetOnTimerPinRisingEdge = 0x4U, /*!< Timer reset on Timer Pin rising edge. */ - kFLEXIO_TimerResetOnTimerTriggerRisingEdge = 0x6U, /*!< Timer reset on Trigger rising edge. */ - kFLEXIO_TimerResetOnTimerTriggerBothEdge = 0x7U, /*!< Timer reset on Trigger rising or falling edge. */ -} flexio_timer_reset_condition_t; - -/*! @brief Define type of timer disable condition.*/ -typedef enum _flexio_timer_disable_condition -{ - kFLEXIO_TimerDisableNever = 0x0U, /*!< Timer never disabled. */ - kFLEXIO_TimerDisableOnPreTimerDisable = 0x1U, /*!< Timer disabled on Timer N-1 disable. */ - kFLEXIO_TimerDisableOnTimerCompare = 0x2U, /*!< Timer disabled on Timer compare. */ - kFLEXIO_TimerDisableOnTimerCompareTriggerLow = 0x3U, /*!< Timer disabled on Timer compare and Trigger Low. */ - kFLEXIO_TimerDisableOnPinBothEdge = 0x4U, /*!< Timer disabled on Pin rising or falling edge. */ - kFLEXIO_TimerDisableOnPinBothEdgeTriggerHigh = 0x5U, /*!< Timer disabled on Pin rising or falling edge provided - Trigger is high. */ - kFLEXIO_TimerDisableOnTriggerFallingEdge = 0x6U, /*!< Timer disabled on Trigger falling edge. */ -} flexio_timer_disable_condition_t; - -/*! @brief Define type of timer enable condition.*/ -typedef enum _flexio_timer_enable_condition -{ - kFLEXIO_TimerEnabledAlways = 0x0U, /*!< Timer always enabled. */ - kFLEXIO_TimerEnableOnPrevTimerEnable = 0x1U, /*!< Timer enabled on Timer N-1 enable. */ - kFLEXIO_TimerEnableOnTriggerHigh = 0x2U, /*!< Timer enabled on Trigger high. */ - kFLEXIO_TimerEnableOnTriggerHighPinHigh = 0x3U, /*!< Timer enabled on Trigger high and Pin high. */ - kFLEXIO_TimerEnableOnPinRisingEdge = 0x4U, /*!< Timer enabled on Pin rising edge. */ - kFLEXIO_TimerEnableOnPinRisingEdgeTriggerHigh = 0x5U, /*!< Timer enabled on Pin rising edge and Trigger high. */ - kFLEXIO_TimerEnableOnTriggerRisingEdge = 0x6U, /*!< Timer enabled on Trigger rising edge. */ - kFLEXIO_TimerEnableOnTriggerBothEdge = 0x7U, /*!< Timer enabled on Trigger rising or falling edge. */ -} flexio_timer_enable_condition_t; - -/*! @brief Define type of timer stop bit generate condition.*/ -typedef enum _flexio_timer_stop_bit_condition -{ - kFLEXIO_TimerStopBitDisabled = 0x0U, /*!< Stop bit disabled. */ - kFLEXIO_TimerStopBitEnableOnTimerCompare = 0x1U, /*!< Stop bit is enabled on timer compare. */ - kFLEXIO_TimerStopBitEnableOnTimerDisable = 0x2U, /*!< Stop bit is enabled on timer disable. */ - kFLEXIO_TimerStopBitEnableOnTimerCompareDisable = 0x3U, /*!< Stop bit is enabled on timer compare and timer - disable. */ -} flexio_timer_stop_bit_condition_t; - -/*! @brief Define type of timer start bit generate condition.*/ -typedef enum _flexio_timer_start_bit_condition -{ - kFLEXIO_TimerStartBitDisabled = 0x0U, /*!< Start bit disabled. */ - kFLEXIO_TimerStartBitEnabled = 0x1U, /*!< Start bit enabled. */ -} flexio_timer_start_bit_condition_t; - -/*! @brief Define type of timer polarity for shifter control. */ -typedef enum _flexio_shifter_timer_polarity -{ - kFLEXIO_ShifterTimerPolarityOnPositive = 0x0U, /*!< Shift on positive edge of shift clock. */ - kFLEXIO_ShifterTimerPolarityOnNegitive = 0x1U, /*!< Shift on negative edge of shift clock. */ -} flexio_shifter_timer_polarity_t; - -/*! @brief Define type of shifter working mode.*/ -typedef enum _flexio_shifter_mode -{ - kFLEXIO_ShifterDisabled = 0x0U, /*!< Shifter is disabled. */ - kFLEXIO_ShifterModeReceive = 0x1U, /*!< Receive mode. */ - kFLEXIO_ShifterModeTransmit = 0x2U, /*!< Transmit mode. */ - kFLEXIO_ShifterModeMatchStore = 0x4U, /*!< Match store mode. */ - kFLEXIO_ShifterModeMatchContinuous = 0x5U, /*!< Match continuous mode. */ -#if FSL_FEATURE_FLEXIO_HAS_STATE_MODE - kFLEXIO_ShifterModeState = 0x6U, /*!< SHIFTBUF contents are used for storing - programmable state attributes. */ -#endif /* FSL_FEATURE_FLEXIO_HAS_STATE_MODE */ -#if FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE - kFLEXIO_ShifterModeLogic = 0x7U, /*!< SHIFTBUF contents are used for implementing - programmable logic look up table. */ -#endif /* FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE */ -} flexio_shifter_mode_t; - -/*! @brief Define type of shifter input source.*/ -typedef enum _flexio_shifter_input_source -{ - kFLEXIO_ShifterInputFromPin = 0x0U, /*!< Shifter input from pin. */ - kFLEXIO_ShifterInputFromNextShifterOutput = 0x1U, /*!< Shifter input from Shifter N+1. */ -} flexio_shifter_input_source_t; - -/*! @brief Define of STOP bit configuration.*/ -typedef enum _flexio_shifter_stop_bit -{ - kFLEXIO_ShifterStopBitDisable = 0x0U, /*!< Disable shifter stop bit. */ - kFLEXIO_ShifterStopBitLow = 0x2U, /*!< Set shifter stop bit to logic low level. */ - kFLEXIO_ShifterStopBitHigh = 0x3U, /*!< Set shifter stop bit to logic high level. */ -} flexio_shifter_stop_bit_t; - -/*! @brief Define type of START bit configuration.*/ -typedef enum _flexio_shifter_start_bit -{ - kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable = 0x0U, /*!< Disable shifter start bit, transmitter loads - data on enable. */ - kFLEXIO_ShifterStartBitDisabledLoadDataOnShift = 0x1U, /*!< Disable shifter start bit, transmitter loads - data on first shift. */ - kFLEXIO_ShifterStartBitLow = 0x2U, /*!< Set shifter start bit to logic low level. */ - kFLEXIO_ShifterStartBitHigh = 0x3U, /*!< Set shifter start bit to logic high level. */ -} flexio_shifter_start_bit_t; - -/*! @brief Define FlexIO shifter buffer type*/ -typedef enum _flexio_shifter_buffer_type -{ - kFLEXIO_ShifterBuffer = 0x0U, /*!< Shifter Buffer N Register. */ - kFLEXIO_ShifterBufferBitSwapped = 0x1U, /*!< Shifter Buffer N Bit Byte Swapped Register. */ - kFLEXIO_ShifterBufferByteSwapped = 0x2U, /*!< Shifter Buffer N Byte Swapped Register. */ - kFLEXIO_ShifterBufferBitByteSwapped = 0x3U, /*!< Shifter Buffer N Bit Swapped Register. */ -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP - kFLEXIO_ShifterBufferNibbleByteSwapped = 0x4U, /*!< Shifter Buffer N Nibble Byte Swapped Register. */ -#endif /*FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP*/ -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP - kFLEXIO_ShifterBufferHalfWordSwapped = 0x5U, /*!< Shifter Buffer N Half Word Swapped Register. */ -#endif -#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP - kFLEXIO_ShifterBufferNibbleSwapped = 0x6U, /*!< Shifter Buffer N Nibble Swapped Register. */ -#endif -} flexio_shifter_buffer_type_t; - -/*! @brief Define FlexIO user configuration structure. */ -typedef struct _flexio_config_ -{ - bool enableFlexio; /*!< Enable/disable FlexIO module */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode */ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode */ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, fast access requires - the FlexIO clock to be at least twice the frequency of the bus clock. */ -} flexio_config_t; - -/*! @brief Define FlexIO timer configuration structure. */ -typedef struct _flexio_timer_config -{ - /* Trigger. */ - uint32_t triggerSelect; /*!< The internal trigger selection number using MACROs. */ - flexio_timer_trigger_polarity_t triggerPolarity; /*!< Trigger Polarity. */ - flexio_timer_trigger_source_t triggerSource; /*!< Trigger Source, internal (see 'trgsel') or external. */ - /* Pin. */ - flexio_pin_config_t pinConfig; /*!< Timer Pin Configuration. */ - uint32_t pinSelect; /*!< Timer Pin number Select. */ - flexio_pin_polarity_t pinPolarity; /*!< Timer Pin Polarity. */ - /* Timer. */ - flexio_timer_mode_t timerMode; /*!< Timer work Mode. */ - flexio_timer_output_t timerOutput; /*!< Configures the initial state of the Timer Output and - whether it is affected by the Timer reset. */ - flexio_timer_decrement_source_t timerDecrement; /*!< Configures the source of the Timer decrement and the - source of the Shift clock. */ - flexio_timer_reset_condition_t timerReset; /*!< Configures the condition that causes the timer counter - (and optionally the timer output) to be reset. */ - flexio_timer_disable_condition_t timerDisable; /*!< Configures the condition that causes the Timer to be - disabled and stop decrementing. */ - flexio_timer_enable_condition_t timerEnable; /*!< Configures the condition that causes the Timer to be - enabled and start decrementing. */ - flexio_timer_stop_bit_condition_t timerStop; /*!< Timer STOP Bit generation. */ - flexio_timer_start_bit_condition_t timerStart; /*!< Timer STRAT Bit generation. */ - uint32_t timerCompare; /*!< Value for Timer Compare N Register. */ -} flexio_timer_config_t; - -/*! @brief Define FlexIO shifter configuration structure. */ -typedef struct _flexio_shifter_config -{ - /* Timer. */ - uint32_t timerSelect; /*!< Selects which Timer is used for controlling the - logic/shift register and generating the Shift clock. */ - flexio_shifter_timer_polarity_t timerPolarity; /*!< Timer Polarity. */ - /* Pin. */ - flexio_pin_config_t pinConfig; /*!< Shifter Pin Configuration. */ - uint32_t pinSelect; /*!< Shifter Pin number Select. */ - flexio_pin_polarity_t pinPolarity; /*!< Shifter Pin Polarity. */ - /* Shifter. */ - flexio_shifter_mode_t shifterMode; /*!< Configures the mode of the Shifter. */ -#if FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH - uint32_t parallelWidth; /*!< Configures the parallel width when using parallel mode.*/ -#endif /* FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH */ - flexio_shifter_input_source_t inputSource; /*!< Selects the input source for the shifter. */ - flexio_shifter_stop_bit_t shifterStop; /*!< Shifter STOP bit. */ - flexio_shifter_start_bit_t shifterStart; /*!< Shifter START bit. */ -} flexio_shifter_config_t; - -/*! @brief typedef for FlexIO simulated driver interrupt handler.*/ -typedef void (*flexio_isr_t)(void *base, void *handle); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to flexio bases for each instance. */ -extern FLEXIO_Type *const s_flexioBases[]; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to flexio clocks for each instance. */ -extern const clock_ip_name_t s_flexioClocks[]; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name FlexIO Initialization and De-initialization - * @{ - */ - -/*! - * @brief Gets the default configuration to configure the FlexIO module. The configuration - * can used directly to call the FLEXIO_Configure(). - * - * Example: - @code - flexio_config_t config; - FLEXIO_GetDefaultConfig(&config); - @endcode - * - * @param userConfig pointer to flexio_config_t structure -*/ -void FLEXIO_GetDefaultConfig(flexio_config_t *userConfig); - -/*! - * @brief Configures the FlexIO with a FlexIO configuration. The configuration structure - * can be filled by the user or be set with default values by FLEXIO_GetDefaultConfig(). - * - * Example - @code - flexio_config_t config = { - .enableFlexio = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false - }; - FLEXIO_Configure(base, &config); - @endcode - * - * @param base FlexIO peripheral base address - * @param userConfig pointer to flexio_config_t structure -*/ -void FLEXIO_Init(FLEXIO_Type *base, const flexio_config_t *userConfig); - -/*! - * @brief Gates the FlexIO clock. Call this API to stop the FlexIO clock. - * - * @note After calling this API, call the FLEXO_Init to use the FlexIO module. - * - * @param base FlexIO peripheral base address - */ -void FLEXIO_Deinit(FLEXIO_Type *base); - -/*! - * @brief Get instance number for FLEXIO module. - * - * @param base FLEXIO peripheral base address. - */ -uint32_t FLEXIO_GetInstance(FLEXIO_Type *base); - -/* @} */ - -/*! - * @name FlexIO Basic Operation - * @{ - */ - -/*! - * @brief Resets the FlexIO module. - * - * @param base FlexIO peripheral base address - */ -void FLEXIO_Reset(FLEXIO_Type *base); - -/*! - * @brief Enables the FlexIO module operation. - * - * @param base FlexIO peripheral base address - * @param enable true to enable, false to disable. - */ -static inline void FLEXIO_Enable(FLEXIO_Type *base, bool enable) -{ - if (enable) - { - base->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } - else - { - base->CTRL &= ~FLEXIO_CTRL_FLEXEN_MASK; - } -} - -#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS -/*! - * @brief Reads the input data on each of the FlexIO pins. - * - * @param base FlexIO peripheral base address - * @return FlexIO pin input data - */ -static inline uint32_t FLEXIO_ReadPinInput(FLEXIO_Type *base) -{ - return base->PIN; -} -#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ - -#if defined(FSL_FEATURE_FLEXIO_HAS_STATE_MODE) && FSL_FEATURE_FLEXIO_HAS_STATE_MODE -/*! - * @brief Gets the current state pointer for state mode use. - * - * @param base FlexIO peripheral base address - * @return current State pointer - */ -static inline uint8_t FLEXIO_GetShifterState(FLEXIO_Type *base) -{ - return ((uint8_t)(base->SHIFTSTATE) & FLEXIO_SHIFTSTATE_STATE_MASK); -} -#endif /*FSL_FEATURE_FLEXIO_HAS_STATE_MODE*/ - -/*! - * @brief Configures the shifter with the shifter configuration. The configuration structure - * covers both the SHIFTCTL and SHIFTCFG registers. To configure the shifter to the proper - * mode, select which timer controls the shifter to shift, whether to generate start bit/stop - * bit, and the polarity of start bit and stop bit. - * - * Example - @code - flexio_shifter_config_t config = { - .timerSelect = 0, - .timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive, - .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, - .pinPolarity = kFLEXIO_PinActiveLow, - .shifterMode = kFLEXIO_ShifterModeTransmit, - .inputSource = kFLEXIO_ShifterInputFromPin, - .shifterStop = kFLEXIO_ShifterStopBitHigh, - .shifterStart = kFLEXIO_ShifterStartBitLow - }; - FLEXIO_SetShifterConfig(base, &config); - @endcode - * - * @param base FlexIO peripheral base address - * @param index Shifter index - * @param shifterConfig Pointer to flexio_shifter_config_t structure -*/ -void FLEXIO_SetShifterConfig(FLEXIO_Type *base, uint8_t index, const flexio_shifter_config_t *shifterConfig); -/*! - * @brief Configures the timer with the timer configuration. The configuration structure - * covers both the TIMCTL and TIMCFG registers. To configure the timer to the proper - * mode, select trigger source for timer and the timer pin output and the timing for timer. - * - * Example - @code - flexio_timer_config_t config = { - .triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(0), - .triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow, - .triggerSource = kFLEXIO_TimerTriggerSourceInternal, - .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, - .pinSelect = 0, - .pinPolarity = kFLEXIO_PinActiveHigh, - .timerMode = kFLEXIO_TimerModeDual8BitBaudBit, - .timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset, - .timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput, - .timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput, - .timerDisable = kFLEXIO_TimerDisableOnTimerCompare, - .timerEnable = kFLEXIO_TimerEnableOnTriggerHigh, - .timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable, - .timerStart = kFLEXIO_TimerStartBitEnabled - }; - FLEXIO_SetTimerConfig(base, &config); - @endcode - * - * @param base FlexIO peripheral base address - * @param index Timer index - * @param timerConfig Pointer to the flexio_timer_config_t structure -*/ -void FLEXIO_SetTimerConfig(FLEXIO_Type *base, uint8_t index, const flexio_timer_config_t *timerConfig); - -/* @} */ - -/*! - * @name FlexIO Interrupt Operation - * @{ - */ - -/*! - * @brief Enables the shifter status interrupt. The interrupt generates when the corresponding SSF is set. - * - * @param base FlexIO peripheral base address - * @param mask The shifter status mask which can be calculated by (1 << shifter index) - * @note For multiple shifter status interrupt enable, for example, two shifter status enable, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_EnableShifterStatusInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTSIEN |= mask; -} - -/*! - * @brief Disables the shifter status interrupt. The interrupt won't generate when the corresponding SSF is set. - * - * @param base FlexIO peripheral base address - * @param mask The shifter status mask which can be calculated by (1 << shifter index) - * @note For multiple shifter status interrupt enable, for example, two shifter status enable, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_DisableShifterStatusInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTSIEN &= ~mask; -} - -/*! - * @brief Enables the shifter error interrupt. The interrupt generates when the corresponding SEF is set. - * - * @param base FlexIO peripheral base address - * @param mask The shifter error mask which can be calculated by (1 << shifter index) - * @note For multiple shifter error interrupt enable, for example, two shifter error enable, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_EnableShifterErrorInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTEIEN |= mask; -} - -/*! - * @brief Disables the shifter error interrupt. The interrupt won't generate when the corresponding SEF is set. - * - * @param base FlexIO peripheral base address - * @param mask The shifter error mask which can be calculated by (1 << shifter index) - * @note For multiple shifter error interrupt enable, for example, two shifter error enable, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_DisableShifterErrorInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTEIEN &= ~mask; -} - -/*! - * @brief Enables the timer status interrupt. The interrupt generates when the corresponding SSF is set. - * - * @param base FlexIO peripheral base address - * @param mask The timer status mask which can be calculated by (1 << timer index) - * @note For multiple timer status interrupt enable, for example, two timer status enable, can calculate - * the mask by using ((1 << timer index0) | (1 << timer index1)) - */ -static inline void FLEXIO_EnableTimerStatusInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->TIMIEN |= mask; -} - -/*! - * @brief Disables the timer status interrupt. The interrupt won't generate when the corresponding SSF is set. - * - * @param base FlexIO peripheral base address - * @param mask The timer status mask which can be calculated by (1 << timer index) - * @note For multiple timer status interrupt enable, for example, two timer status enable, can calculate - * the mask by using ((1 << timer index0) | (1 << timer index1)) - */ -static inline void FLEXIO_DisableTimerStatusInterrupts(FLEXIO_Type *base, uint32_t mask) -{ - base->TIMIEN &= ~mask; -} - -/* @} */ - -/*! - * @name FlexIO Status Operation - * @{ - */ - -/*! - * @brief Gets the shifter status flags. - * - * @param base FlexIO peripheral base address - * @return Shifter status flags - */ -static inline uint32_t FLEXIO_GetShifterStatusFlags(FLEXIO_Type *base) -{ - return ((base->SHIFTSTAT) & FLEXIO_SHIFTSTAT_SSF_MASK); -} - -/*! - * @brief Clears the shifter status flags. - * - * @param base FlexIO peripheral base address - * @param mask The shifter status mask which can be calculated by (1 << shifter index) - * @note For clearing multiple shifter status flags, for example, two shifter status flags, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_ClearShifterStatusFlags(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTSTAT = mask; -} - -/*! - * @brief Gets the shifter error flags. - * - * @param base FlexIO peripheral base address - * @return Shifter error flags - */ -static inline uint32_t FLEXIO_GetShifterErrorFlags(FLEXIO_Type *base) -{ - return ((base->SHIFTERR) & FLEXIO_SHIFTERR_SEF_MASK); -} - -/*! - * @brief Clears the shifter error flags. - * - * @param base FlexIO peripheral base address - * @param mask The shifter error mask which can be calculated by (1 << shifter index) - * @note For clearing multiple shifter error flags, for example, two shifter error flags, can calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - */ -static inline void FLEXIO_ClearShifterErrorFlags(FLEXIO_Type *base, uint32_t mask) -{ - base->SHIFTERR = mask; -} - -/*! - * @brief Gets the timer status flags. - * - * @param base FlexIO peripheral base address - * @return Timer status flags - */ -static inline uint32_t FLEXIO_GetTimerStatusFlags(FLEXIO_Type *base) -{ - return ((base->TIMSTAT) & FLEXIO_TIMSTAT_TSF_MASK); -} - -/*! - * @brief Clears the timer status flags. - * - * @param base FlexIO peripheral base address - * @param mask The timer status mask which can be calculated by (1 << timer index) - * @note For clearing multiple timer status flags, for example, two timer status flags, can calculate - * the mask by using ((1 << timer index0) | (1 << timer index1)) - */ -static inline void FLEXIO_ClearTimerStatusFlags(FLEXIO_Type *base, uint32_t mask) -{ - base->TIMSTAT = mask; -} - -/* @} */ - -/*! - * @name FlexIO DMA Operation - * @{ - */ - -/*! - * @brief Enables/disables the shifter status DMA. The DMA request generates when the corresponding SSF is set. - * - * @note For multiple shifter status DMA enables, for example, calculate - * the mask by using ((1 << shifter index0) | (1 << shifter index1)) - * - * @param base FlexIO peripheral base address - * @param mask The shifter status mask which can be calculated by (1 << shifter index) - * @param enable True to enable, false to disable. - */ -static inline void FLEXIO_EnableShifterStatusDMA(FLEXIO_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->SHIFTSDEN |= mask; - } - else - { - base->SHIFTSDEN &= ~mask; - } -} - -/*! - * @brief Gets the shifter buffer address for the DMA transfer usage. - * - * @param base FlexIO peripheral base address - * @param type Shifter type of flexio_shifter_buffer_type_t - * @param index Shifter index - * @return Corresponding shifter buffer index - */ -uint32_t FLEXIO_GetShifterBufferAddress(FLEXIO_Type *base, flexio_shifter_buffer_type_t type, uint8_t index); - -/*! - * @brief Registers the handle and the interrupt handler for the FlexIO-simulated peripheral. - * - * @param base Pointer to the FlexIO simulated peripheral type. - * @param handle Pointer to the handler for FlexIO simulated peripheral. - * @param isr FlexIO simulated peripheral interrupt handler. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_RegisterHandleIRQ(void *base, void *handle, flexio_isr_t isr); - -/*! - * @brief Unregisters the handle and the interrupt handler for the FlexIO-simulated peripheral. - * - * @param base Pointer to the FlexIO simulated peripheral type. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_UnregisterHandleIRQ(void *base); -/* @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ -/*@}*/ - -#endif /*_FSL_FLEXIO_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_camera.c b/devices/MIMXRT1052/drivers/fsl_flexio_camera.c deleted file mode 100644 index 8126056..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_camera.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_camera.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_camera" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Codes - ******************************************************************************/ - -static uint32_t FLEXIO_CAMERA_GetInstance(FLEXIO_CAMERA_Type *base) -{ - return FLEXIO_GetInstance(base->flexioBase); -} - -/*! - * brief Gets the default configuration to configure the FlexIO Camera. The configuration - * can be used directly for calling the FLEXIO_CAMERA_Init(). - * Example: - code - flexio_camera_config_t config; - FLEXIO_CAMERA_GetDefaultConfig(&userConfig); - endcode - * param config Pointer to the flexio_camera_config_t structure -*/ -void FLEXIO_CAMERA_GetDefaultConfig(flexio_camera_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enablecamera = false; - config->enableInDoze = false; - config->enableInDebug = false; - config->enableFastAccess = false; -} - -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO Camera. - * - * param base Pointer to FLEXIO_CAMERA_Type structure - * param config Pointer to flexio_camera_config_t structure - */ -void FLEXIO_CAMERA_Init(FLEXIO_CAMERA_Type *base, const flexio_camera_config_t *config) -{ - assert((base != NULL) && (config != NULL)); - assert(base->shifterCount > 0U); - - uint32_t i = 0U; - volatile uint32_t controlVal = 0U; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_CAMERA_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - flexio_shifter_config_t shifterConfig; - flexio_timer_config_t timerConfig; - - /* Clear the shifterConfig & timerConfig struct. */ - (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); - (void)memset(&timerConfig, 0, sizeof(timerConfig)); - - /* Configure flexio camera */ - controlVal = base->flexioBase->CTRL; - controlVal &= - ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - controlVal |= (FLEXIO_CTRL_DBGE(config->enableInDebug) | FLEXIO_CTRL_FASTACC(config->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(config->enablecamera)); - if (!config->enableInDoze) - { - controlVal |= FLEXIO_CTRL_DOZEN_MASK; - } - base->flexioBase->CTRL = controlVal; - - /* FLEXIO_CAMERA shifter config */ - shifterConfig.timerSelect = base->timerIdx; - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinSelect = base->datPinStartIdx; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.parallelWidth = FLEXIO_CAMERA_PARALLEL_DATA_WIDTH - 1U; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromNextShifterOutput; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - /* Configure the shifters as FIFO buffer. */ - for (i = base->shifterStartIdx; i < (base->shifterStartIdx + base->shifterCount - 1U); i++) - { - FLEXIO_SetShifterConfig(base->flexioBase, (uint8_t)i, &shifterConfig); - } - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - FLEXIO_SetShifterConfig(base->flexioBase, (uint8_t)i, &shifterConfig); - - /* FLEXIO_CAMERA timer config, the PCLK's clk is source of timer to drive the shifter, the HREF is the selecting - * signal for available data. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->hrefPinIdx); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->pclkPinIdx; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; - timerConfig.timerReset = kFLEXIO_TimerResetOnTimerTriggerRisingEdge; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTriggerFallingEdge; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerRisingEdge; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - timerConfig.timerCompare = 8U * base->shifterCount - 1U; - - FLEXIO_SetTimerConfig(base->flexioBase, (uint8_t)base->timerIdx, &timerConfig); - /* Clear flags. */ - FLEXIO_ClearShifterErrorFlags(base->flexioBase, (((1UL << (base->shifterCount)) - 1U) << (base->shifterStartIdx))); - FLEXIO_ClearTimerStatusFlags(base->flexioBase, 1UL << (base->timerIdx)); -} - -/*! - * brief Resets the FLEXIO_CAMERA shifer and timer config. - * - * note After calling this API, call FLEXO_CAMERA_Init to use the FlexIO Camera module. - * - * param base Pointer to FLEXIO_CAMERA_Type structure - */ -void FLEXIO_CAMERA_Deinit(FLEXIO_CAMERA_Type *base) -{ - base->flexioBase->SHIFTCFG[base->shifterStartIdx] = 0; - base->flexioBase->SHIFTCTL[base->shifterStartIdx] = 0; - base->flexioBase->TIMCFG[base->timerIdx] = 0; - base->flexioBase->TIMCMP[base->timerIdx] = 0; - base->flexioBase->TIMCTL[base->timerIdx] = 0; - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = (1UL << base->shifterStartIdx); - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIdx); -} - -/*! - * brief Gets the FlexIO Camera status flags. - * - * param base Pointer to FLEXIO_CAMERA_Type structure - * return FlexIO shifter status flags - * arg FLEXIO_SHIFTSTAT_SSF_MASK - * arg 0 - */ -uint32_t FLEXIO_CAMERA_GetStatusFlags(FLEXIO_CAMERA_Type *base) -{ - uint32_t status = 0; - status = ((FLEXIO_GetShifterStatusFlags(base->flexioBase) >> (base->shifterStartIdx)) & - ((1U << (base->shifterCount)) - 1U)); - return status; -} - -/*! - * brief Clears the receive buffer full flag manually. - * - * param base Pointer to the device. - * param mask status flag - * The parameter can be any combination of the following values: - * arg kFLEXIO_CAMERA_RxDataRegFullFlag - * arg kFLEXIO_CAMERA_RxErrorFlag - */ -void FLEXIO_CAMERA_ClearStatusFlags(FLEXIO_CAMERA_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_CAMERA_RxDataRegFullFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, ((1UL << (base->shifterCount)) - 1U) - << (base->shifterStartIdx)); - } - if ((mask & (uint32_t)kFLEXIO_CAMERA_RxErrorFlag) != 0U) - { /* Clear error flags if they are asserted to make sure the buffer would be available. */ - FLEXIO_ClearShifterErrorFlags(base->flexioBase, ((1UL << (base->shifterCount)) - 1U) - << (base->shifterStartIdx)); - } -} - -/*! - * brief Switches on the interrupt for receive buffer full event. - * - * param base Pointer to the device. - */ -void FLEXIO_CAMERA_EnableInterrupt(FLEXIO_CAMERA_Type *base) -{ - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << (base->shifterStartIdx)); -} - -/*! - * brief Switches off the interrupt for receive buffer full event. - * - * param base Pointer to the device. - * - */ -void FLEXIO_CAMERA_DisableInterrupt(FLEXIO_CAMERA_Type *base) -{ - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << (base->shifterStartIdx)); -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_camera.h b/devices/MIMXRT1052/drivers/fsl_flexio_camera.h deleted file mode 100644 index 93612a7..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_camera.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXIO_CAMERA_H_ -#define _FSL_FLEXIO_CAMERA_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" -/*! - * @addtogroup flexio_camera - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO Camera driver version 2.1.3. */ -#define FSL_FLEXIO_CAMERA_DRIVER_VERSION (MAKE_VERSION(2, 1, 3)) -/*@}*/ - -/*! @brief Define the Camera CPI interface is constantly 8-bit width. */ -#define FLEXIO_CAMERA_PARALLEL_DATA_WIDTH (8U) - -/*! @brief Error codes for the Camera driver. */ -enum -{ - kStatus_FLEXIO_CAMERA_RxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_CAMERA, 0), /*!< Receiver is busy. */ - kStatus_FLEXIO_CAMERA_RxIdle = MAKE_STATUS(kStatusGroup_FLEXIO_CAMERA, 1), /*!< Camera receiver is idle. */ -}; - -/*! @brief Define FlexIO Camera status mask. */ -enum _flexio_camera_status_flags -{ - kFLEXIO_CAMERA_RxDataRegFullFlag = 0x1U, /*!< Receive buffer full flag. */ - kFLEXIO_CAMERA_RxErrorFlag = 0x2U, /*!< Receive buffer error flag. */ -}; - -/*! - * @brief Define structure of configuring the FlexIO Camera device. - */ -typedef struct _flexio_camera_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO module base address. */ - uint32_t datPinStartIdx; /*!< First data pin (D0) index for flexio_camera. - Then the successive following FLEXIO_CAMERA_DATA_WIDTH-1 pins - are used as D1-D7.*/ - uint32_t pclkPinIdx; /*!< Pixel clock pin (PCLK) index for flexio_camera. */ - uint32_t hrefPinIdx; /*!< Horizontal sync pin (HREF) index for flexio_camera. */ - - uint32_t shifterStartIdx; /*!< First shifter index used for flexio_camera data FIFO. */ - uint32_t shifterCount; /*!< The count of shifters that are used as flexio_camera data FIFO. */ - uint32_t timerIdx; /*!< Timer index used for flexio_camera in FlexIO. */ -} FLEXIO_CAMERA_Type; - -/*! @brief Define FlexIO Camera user configuration structure. */ -typedef struct _flexio_camera_config -{ - bool enablecamera; /*!< Enable/disable FlexIO Camera TX & RX. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode*/ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode*/ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, - fast access requires the FlexIO clock to be at least - twice the frequency of the bus clock. */ -} flexio_camera_config_t; - -/*! @brief Define FlexIO Camera transfer structure. */ -typedef struct _flexio_camera_transfer -{ - uint32_t dataAddress; /*!< Transfer buffer*/ - uint32_t dataNum; /*!< Transfer num*/ -} flexio_camera_transfer_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and configuration - * @{ - */ - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO Camera. - * - * @param base Pointer to FLEXIO_CAMERA_Type structure - * @param config Pointer to flexio_camera_config_t structure - */ -void FLEXIO_CAMERA_Init(FLEXIO_CAMERA_Type *base, const flexio_camera_config_t *config); - -/*! - * @brief Resets the FLEXIO_CAMERA shifer and timer config. - * - * @note After calling this API, call FLEXO_CAMERA_Init to use the FlexIO Camera module. - * - * @param base Pointer to FLEXIO_CAMERA_Type structure - */ -void FLEXIO_CAMERA_Deinit(FLEXIO_CAMERA_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO Camera. The configuration - * can be used directly for calling the FLEXIO_CAMERA_Init(). - * Example: - @code - flexio_camera_config_t config; - FLEXIO_CAMERA_GetDefaultConfig(&userConfig); - @endcode - * @param config Pointer to the flexio_camera_config_t structure -*/ -void FLEXIO_CAMERA_GetDefaultConfig(flexio_camera_config_t *config); - -/*! - * @brief Enables/disables the FlexIO Camera module operation. - * - * @param base Pointer to the FLEXIO_CAMERA_Type - * @param enable True to enable, false does not have any effect. - */ -static inline void FLEXIO_CAMERA_Enable(FLEXIO_CAMERA_Type *base, bool enable) -{ - if (enable) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/*! @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the FlexIO Camera status flags. - * - * @param base Pointer to FLEXIO_CAMERA_Type structure - * @return FlexIO shifter status flags - * @arg FLEXIO_SHIFTSTAT_SSF_MASK - * @arg 0 - */ -uint32_t FLEXIO_CAMERA_GetStatusFlags(FLEXIO_CAMERA_Type *base); - -/*! - * @brief Clears the receive buffer full flag manually. - * - * @param base Pointer to the device. - * @param mask status flag - * The parameter can be any combination of the following values: - * @arg kFLEXIO_CAMERA_RxDataRegFullFlag - * @arg kFLEXIO_CAMERA_RxErrorFlag - */ -void FLEXIO_CAMERA_ClearStatusFlags(FLEXIO_CAMERA_Type *base, uint32_t mask); - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Switches on the interrupt for receive buffer full event. - * - * @param base Pointer to the device. - */ -void FLEXIO_CAMERA_EnableInterrupt(FLEXIO_CAMERA_Type *base); - -/*! - * @brief Switches off the interrupt for receive buffer full event. - * - * @param base Pointer to the device. - * - */ -void FLEXIO_CAMERA_DisableInterrupt(FLEXIO_CAMERA_Type *base); - -/*! @} */ - -/*! - * @name DMA support - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO Camera receive DMA. - * - * @param base Pointer to FLEXIO_CAMERA_Type structure - * @param enable True to enable, false to disable. - * - * The FlexIO Camera mode can't work without the DMA or eDMA support, - * Usually, it needs at least two DMA or eDMA channels, one for transferring data from - * Camera, such as 0V7670 to FlexIO buffer, another is for transferring data from FlexIO - * buffer to LCD. - * - */ -static inline void FLEXIO_CAMERA_EnableRxDMA(FLEXIO_CAMERA_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterStartIdx, enable); -} - -/*! - * @brief Gets the data from the receive buffer. - * - * @param base Pointer to the device. - * @return data Pointer to the buffer that keeps the data with count of base->shifterCount . - */ -static inline uint32_t FLEXIO_CAMERA_GetRxBufferAddress(FLEXIO_CAMERA_Type *base) -{ - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, (uint8_t)base->shifterStartIdx); -} - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ - -/*@}*/ - -#endif /*_FSL_FLEXIO_CAMERA_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c b/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c deleted file mode 100644 index 12bb77b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_camera_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_camera_edma" -#endif - -/*base, cameraPrivateHandle->handle); - - if (cameraPrivateHandle->handle->callback != NULL) - { - cameraPrivateHandle->handle->callback(cameraPrivateHandle->base, cameraPrivateHandle->handle, - kStatus_FLEXIO_CAMERA_RxIdle, cameraPrivateHandle->handle->userData); - } - } -} -/*! - * brief Initializes the Camera handle, which is used in transactional functions. - * - * param base Pointer to the FLEXIO_CAMERA_Type. - * param handle Pointer to flexio_camera_edma_handle_t structure. - * param callback The callback function. - * param userData The parameter of the callback function. - * param rxEdmaHandle User requested DMA handle for RX DMA transfer. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO Camera eDMA type/handle table out of range. - */ -status_t FLEXIO_CAMERA_TransferCreateHandleEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - flexio_camera_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *rxEdmaHandle) -{ - assert(handle != NULL); - - uint8_t index; - - /* Find the an empty handle pointer to store the handle. */ - for (index = 0U; index < (uint8_t)FLEXIO_CAMERA_HANDLE_COUNT; index++) - { - if (s_edmaPrivateHandle[index].base == NULL) - { - s_edmaPrivateHandle[index].base = base; - s_edmaPrivateHandle[index].handle = handle; - break; - } - } - - if (index == (uint8_t)FLEXIO_CAMERA_HANDLE_COUNT) - { - return kStatus_OutOfRange; - } - - s_edmaPrivateHandle[index].base = base; - s_edmaPrivateHandle[index].handle = handle; - - (void)memset(handle, 0, sizeof(*handle)); - - handle->rxState = (uint8_t)kFLEXIO_CAMERA_RxIdle; - handle->rxEdmaHandle = rxEdmaHandle; - - handle->callback = callback; - handle->userData = userData; - - /* Configure RX. */ - if (rxEdmaHandle != NULL) - { - EDMA_SetCallback(handle->rxEdmaHandle, FLEXIO_CAMERA_TransferReceiveEDMACallback, &s_edmaPrivateHandle); - } - - return kStatus_Success; -} - -/*! - * brief Receives data using eDMA. - * - * This function receives data using eDMA. This is a non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * param base Pointer to the FLEXIO_CAMERA_Type. - * param handle Pointer to the flexio_camera_edma_handle_t structure. - * param xfer Camera eDMA transfer structure, see #flexio_camera_transfer_t. - * retval kStatus_Success if succeeded, others failed. - * retval kStatus_CAMERA_RxBusy Previous transfer on going. - */ -status_t FLEXIO_CAMERA_TransferReceiveEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - flexio_camera_transfer_t *xfer) -{ - assert(handle->rxEdmaHandle != NULL); - - edma_transfer_config_t xferConfig; - status_t status; - - /* If previous RX not finished. */ - if ((uint8_t)kFLEXIO_CAMERA_RxBusy == handle->rxState) - { - status = kStatus_FLEXIO_CAMERA_RxBusy; - } - else - { - handle->rxState = (uint8_t)kFLEXIO_CAMERA_RxBusy; - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, (uint32_t *)FLEXIO_CAMERA_GetRxBufferAddress(base), 32, - (uint32_t *)xfer->dataAddress, 32, 32, xfer->dataNum, kEDMA_PeripheralToMemory); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO CAMERA handle */ - handle->nbytes = 32; - - /* Submit transfer. */ - (void)EDMA_SubmitTransfer(handle->rxEdmaHandle, &xferConfig); - EDMA_StartTransfer(handle->rxEdmaHandle); - /* Enable CAMERA RX EDMA. */ - FLEXIO_CAMERA_EnableRxDMA(base, true); - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the receive data which used the eDMA. - * - * This function aborts the receive data which used the eDMA. - * - * param base Pointer to the FLEXIO_CAMERA_Type. - * param handle Pointer to the flexio_camera_edma_handle_t structure. - */ -void FLEXIO_CAMERA_TransferAbortReceiveEDMA(FLEXIO_CAMERA_Type *base, flexio_camera_edma_handle_t *handle) -{ - assert(handle->rxEdmaHandle != NULL); - - /* Disable CAMERA RX EDMA. */ - FLEXIO_CAMERA_EnableRxDMA(base, false); - - /* Stop transfer. */ - EDMA_StopTransfer(handle->rxEdmaHandle); - - handle->rxState = (uint8_t)kFLEXIO_CAMERA_RxIdle; -} - -/*! - * brief Gets the remaining bytes to be received. - * - * This function gets the number of bytes still not received. - * - * param base Pointer to the FLEXIO_CAMERA_Type. - * param handle Pointer to the flexio_camera_edma_handle_t structure. - * param count Number of bytes sent so far by the non-blocking transaction. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_InvalidArgument The count parameter is invalid. - */ -status_t FLEXIO_CAMERA_TransferGetReceiveCountEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - size_t *count) -{ - assert(handle->rxEdmaHandle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - if ((uint8_t)kFLEXIO_CAMERA_RxBusy == handle->rxState) - { - *count = (handle->rxSize - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->rxEdmaHandle->base, handle->rxEdmaHandle->channel)); - } - else - { - *count = handle->rxSize; - } - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.h b/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.h deleted file mode 100644 index ff71a44..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_camera_edma.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_CAMERA_EDMA_H_ -#define _FSL_FLEXIO_CAMERA_EDMA_H_ - -#include "fsl_flexio_camera.h" -#include "fsl_edma.h" - -/*! - * @addtogroup flexio_edma_camera - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO Camera EDMA driver version 2.1.3. */ -#define FSL_FLEXIO_CAMERA_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 1, 3)) -/*@}*/ - -/*! @brief Forward declaration of the handle typedef. */ -typedef struct _flexio_camera_edma_handle flexio_camera_edma_handle_t; - -/*! @brief Camera transfer callback function. */ -typedef void (*flexio_camera_edma_transfer_callback_t)(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - status_t status, - void *userData); - -/*! - * @brief Camera eDMA handle - */ -struct _flexio_camera_edma_handle -{ - flexio_camera_edma_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< Camera callback function parameter.*/ - size_t rxSize; /*!< Total bytes to be received. */ - edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - volatile uint8_t rxState; /*!< RX transfer state */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA transactional - * @{ - */ - -/*! - * @brief Initializes the Camera handle, which is used in transactional functions. - * - * @param base Pointer to the FLEXIO_CAMERA_Type. - * @param handle Pointer to flexio_camera_edma_handle_t structure. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @param rxEdmaHandle User requested DMA handle for RX DMA transfer. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO Camera eDMA type/handle table out of range. - */ -status_t FLEXIO_CAMERA_TransferCreateHandleEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - flexio_camera_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *rxEdmaHandle); - -/*! - * @brief Receives data using eDMA. - * - * This function receives data using eDMA. This is a non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * @param base Pointer to the FLEXIO_CAMERA_Type. - * @param handle Pointer to the flexio_camera_edma_handle_t structure. - * @param xfer Camera eDMA transfer structure, see #flexio_camera_transfer_t. - * @retval kStatus_Success if succeeded, others failed. - * @retval kStatus_CAMERA_RxBusy Previous transfer on going. - */ -status_t FLEXIO_CAMERA_TransferReceiveEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - flexio_camera_transfer_t *xfer); - -/*! - * @brief Aborts the receive data which used the eDMA. - * - * This function aborts the receive data which used the eDMA. - * - * @param base Pointer to the FLEXIO_CAMERA_Type. - * @param handle Pointer to the flexio_camera_edma_handle_t structure. - */ -void FLEXIO_CAMERA_TransferAbortReceiveEDMA(FLEXIO_CAMERA_Type *base, flexio_camera_edma_handle_t *handle); - -/*! - * @brief Gets the remaining bytes to be received. - * - * This function gets the number of bytes still not received. - * - * @param base Pointer to the FLEXIO_CAMERA_Type. - * @param handle Pointer to the flexio_camera_edma_handle_t structure. - * @param count Number of bytes sent so far by the non-blocking transaction. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_InvalidArgument The count parameter is invalid. - */ -status_t FLEXIO_CAMERA_TransferGetReceiveCountEDMA(FLEXIO_CAMERA_Type *base, - flexio_camera_edma_handle_t *handle, - size_t *count); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_CAMERA_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c b/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c deleted file mode 100644 index 9158236..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.c +++ /dev/null @@ -1,1260 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_i2c_master.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_i2c_master" -#endif - -/*! @brief FLEXIO I2C transfer state */ -enum _flexio_i2c_master_transfer_states -{ - kFLEXIO_I2C_Idle = 0x0U, /*!< I2C bus idle */ - kFLEXIO_I2C_Start = 0x1U, /*!< I2C start phase */ - kFLEXIO_I2C_SendCommand = 0x2U, /*!< Send command byte phase */ - kFLEXIO_I2C_SendData = 0x3U, /*!< Send data transfer phase*/ - kFLEXIO_I2C_ReceiveDataBegin = 0x4U, /*!< Receive data begin transfer phase*/ - kFLEXIO_I2C_ReceiveData = 0x5U, /*!< Receive data transfer phase*/ -}; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Set up master transfer, send slave address and decide the initial - * transfer state. - * - * @param base pointer to FLEXIO_I2C_Type structure - * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state - * @param transfer pointer to flexio_i2c_master_transfer_t structure - */ -static status_t FLEXIO_I2C_MasterTransferInitStateMachine(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_t *xfer); - -/*! - * @brief Master run transfer state machine to perform a byte of transfer. - * - * @param base pointer to FLEXIO_I2C_Type structure - * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state - * @param statusFlags flexio i2c hardware status - * @retval kStatus_Success Successfully run state machine - * @retval kStatus_FLEXIO_I2C_Nak Receive Nak during transfer - */ -static status_t FLEXIO_I2C_MasterTransferRunStateMachine(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - uint32_t statusFlags); - -/*! - * @brief Complete transfer, disable interrupt and call callback. - * - * @param base pointer to FLEXIO_I2C_Type structure - * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state - * @param status flexio transfer status - */ -static void FLEXIO_I2C_MasterTransferComplete(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - status_t status); - -/******************************************************************************* - * Codes - ******************************************************************************/ - -static uint32_t FLEXIO_I2C_GetInstance(FLEXIO_I2C_Type *base) -{ - return FLEXIO_GetInstance(base->flexioBase); -} - -static status_t FLEXIO_I2C_MasterTransferInitStateMachine(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_t *xfer) -{ - bool needRestart; - uint32_t byteCount; - - /* Init the handle member. */ - handle->transfer.slaveAddress = xfer->slaveAddress; - handle->transfer.direction = xfer->direction; - handle->transfer.subaddress = xfer->subaddress; - handle->transfer.subaddressSize = xfer->subaddressSize; - handle->transfer.data = xfer->data; - handle->transfer.dataSize = xfer->dataSize; - handle->transfer.flags = xfer->flags; - handle->transferSize = xfer->dataSize; - - /* Initial state, i2c start state. */ - handle->state = (uint8_t)kFLEXIO_I2C_Start; - - /* Clear all status before transfer. */ - FLEXIO_I2C_MasterClearStatusFlags(base, (uint32_t)kFLEXIO_I2C_ReceiveNakFlag); - - /* Calculate whether need to send re-start. */ - needRestart = (handle->transfer.subaddressSize != 0U) && (handle->transfer.direction == kFLEXIO_I2C_Read); - handle->needRestart = needRestart; - - /* Calculate total byte count in a frame. */ - byteCount = 1U; - - if (!needRestart) - { - byteCount += handle->transfer.dataSize; - } - - if (handle->transfer.subaddressSize != 0U) - { - byteCount += handle->transfer.subaddressSize; - } - - /* Configure data count. */ - if (FLEXIO_I2C_MasterSetTransferCount(base, (uint16_t)byteCount) != kStatus_Success) - { - return kStatus_InvalidArgument; - } - - /* Configure timer1 disable condition. */ - uint32_t tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[1]]; - tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; - tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPreTimerDisable); - base->flexioBase->TIMCFG[base->timerIndex[1]] = tmpConfig; - -#if I2C_RETRY_TIMES - uint32_t waitTimes = I2C_RETRY_TIMES; - while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) - { - } -#endif - - return kStatus_Success; -} - -static status_t FLEXIO_I2C_MasterTransferRunStateMachine(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - uint32_t statusFlags) -{ -#if I2C_RETRY_TIMES - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - if ((statusFlags & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) - { - /* Clear receive nak flag. */ - FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - - if ((!((handle->state == (uint8_t)kFLEXIO_I2C_SendData) && (handle->transfer.dataSize == 0U))) && - (!(((handle->state == (uint8_t)kFLEXIO_I2C_ReceiveData) || - (handle->state == (uint8_t)kFLEXIO_I2C_ReceiveDataBegin)) && - (handle->transfer.dataSize == 1U)))) - { - (void)FLEXIO_I2C_MasterReadByte(base); - - FLEXIO_I2C_MasterAbortStop(base); - - /* Delay one clk cycle to ensure the bus is idle. */ - SDK_DelayAtLeastUs(1000000UL / base->baudrate, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); - - handle->state = (uint8_t)kFLEXIO_I2C_Idle; - - return kStatus_FLEXIO_I2C_Nak; - } - } - - if (((statusFlags & (uint8_t)kFLEXIO_I2C_RxFullFlag) != 0U) && (handle->state != (uint8_t)kFLEXIO_I2C_ReceiveData)) - { - (void)FLEXIO_I2C_MasterReadByte(base); - } - - switch (handle->state) - { - /* Initial state, i2c start state. */ - case (uint8_t)kFLEXIO_I2C_Start: - /* Send address byte first. */ - if (handle->needRestart) - { - FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Write); - } - else - { - FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, handle->transfer.direction); - } - if (handle->transfer.subaddressSize == 0U) - { - if (handle->transfer.direction == kFLEXIO_I2C_Write) - { - /* Next state, send data. */ - handle->state = (uint8_t)kFLEXIO_I2C_SendData; - } - else - { - /* Next state, receive data begin. */ - handle->state = (uint8_t)kFLEXIO_I2C_ReceiveDataBegin; - } - } - else - { - /* Next state, send command byte. */ - handle->state = (uint8_t)kFLEXIO_I2C_SendCommand; - } - break; - - /* Check address only needed for transfer with subaddress */ - case (uint8_t)kFLEXIO_I2C_SendCommand: - if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) - { - if (handle->transfer.subaddressSize > 0U) - { - handle->transfer.subaddressSize--; - FLEXIO_I2C_MasterWriteByte( - base, ((handle->transfer.subaddress) >> (8U * handle->transfer.subaddressSize))); - - if (handle->transfer.subaddressSize == 0U) - { - /* Load re-start in advance. */ - if (handle->transfer.direction == kFLEXIO_I2C_Read) - { -#if I2C_RETRY_TIMES - while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & - (1UL << base->shifterIndex[0]))) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == - (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) - { - } -#endif - FLEXIO_I2C_MasterRepeatedStart(base); - } - } - } - else - { - if (handle->transfer.direction == kFLEXIO_I2C_Write) - { - /* Send first byte of data. */ - if (handle->transfer.dataSize > 0U) - { - /* Next state, send data. */ - handle->state = (uint8_t)kFLEXIO_I2C_SendData; - - FLEXIO_I2C_MasterWriteByte(base, *handle->transfer.data); - handle->transfer.data++; - handle->transfer.dataSize--; - } - else - { - FLEXIO_I2C_MasterStop(base); - -#if I2C_RETRY_TIMES - while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) - { - } -#endif - (void)FLEXIO_I2C_MasterReadByte(base); - - handle->state = (uint8_t)kFLEXIO_I2C_Idle; - } - } - else - { - (void)FLEXIO_I2C_MasterSetTransferCount(base, (uint16_t)(handle->transfer.dataSize + 1U)); - /* Delay at least one clock cycle so that the restart setup time is up to spec standard. */ - SDK_DelayAtLeastUs(1000000UL / base->baudrate, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); - FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Read); - - /* Next state, receive data begin. */ - handle->state = (uint8_t)kFLEXIO_I2C_ReceiveDataBegin; - } - } - } - break; - - /* Send command byte. */ - case (uint8_t)kFLEXIO_I2C_SendData: - if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) - { - /* Send one byte of data. */ - if (handle->transfer.dataSize > 0U) - { - FLEXIO_I2C_MasterWriteByte(base, *handle->transfer.data); - - handle->transfer.data++; - handle->transfer.dataSize--; - } - else - { - FLEXIO_I2C_MasterStop(base); - -#if I2C_RETRY_TIMES - while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) - { - } -#endif - (void)FLEXIO_I2C_MasterReadByte(base); - - handle->state = (uint8_t)kFLEXIO_I2C_Idle; - } - } - break; - - case (uint8_t)kFLEXIO_I2C_ReceiveDataBegin: - if ((statusFlags & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) - { - handle->state = (uint8_t)kFLEXIO_I2C_ReceiveData; - /* Send nak at the last receive byte. */ - if (handle->transfer.dataSize == 1U) - { - FLEXIO_I2C_MasterEnableAck(base, false); -#if I2C_RETRY_TIMES - while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) - { - } -#endif - FLEXIO_I2C_MasterStop(base); - } - else - { - FLEXIO_I2C_MasterEnableAck(base, true); - } - } - else if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) - { - /* Read one byte of data. */ - FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); - } - else - { - ; /* Avoid MISRA 2012 rule 15.7 */ - } - break; - - case (uint8_t)kFLEXIO_I2C_ReceiveData: - if ((statusFlags & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) - { - *handle->transfer.data = FLEXIO_I2C_MasterReadByte(base); - handle->transfer.data++; - if (0U != handle->transfer.dataSize--) - { - if (handle->transfer.dataSize == 0U) - { - FLEXIO_I2C_MasterDisableInterrupts(base, (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); - handle->state = (uint8_t)kFLEXIO_I2C_Idle; - /* Return nak if ReceiveNakFlag is not set */ - if ((statusFlags & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) == 0U) - { - return kStatus_FLEXIO_I2C_Nak; - } - } - - /* Send nak at the last receive byte. */ - if (handle->transfer.dataSize == 1U) - { - FLEXIO_I2C_MasterEnableAck(base, false); -#if I2C_RETRY_TIMES - while ( - (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) - { - } -#endif - FLEXIO_I2C_MasterStop(base); - } - } - } - else if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) - { - if (handle->transfer.dataSize > 1U) - { - FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); - } - } - else - { - ; /* Avoid MISRA 2012 rule 15.7 */ - } - break; - - default: - /* Add comment to avoid MISRA violation */ - break; - } - - return kStatus_Success; -} - -static void FLEXIO_I2C_MasterTransferComplete(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - status_t status) -{ - FLEXIO_I2C_MasterDisableInterrupts( - base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); - - if (handle->completionCallback != NULL) - { - handle->completionCallback(base, handle, status, handle->userData); - } -} - -#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS -/*! - * brief Make sure the bus isn't already pulled down. - * - * Check the FLEXIO pin status to see whether either of SDA and SCL pin is pulled down. - * - * param base Pointer to FLEXIO_I2C_Type structure.. - * retval kStatus_Success - * retval kStatus_FLEXIO_I2C_Busy - */ -status_t FLEXIO_I2C_CheckForBusyBus(FLEXIO_I2C_Type *base) -{ - uint32_t mask; - /* If in certain loops the SDA/SCL is continuously pulled down, then return bus busy status. */ - /* The loop count is determined by maximum CPU clock frequency */ - for (uint32_t i = 0U; i < SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY / 600000U; ++i) - { - mask = 1UL << base->SDAPinIndex | 1UL << base->SCLPinIndex; - if ((FLEXIO_ReadPinInput(base->flexioBase) & mask) == mask) - { - return kStatus_Success; - } - } - return kStatus_FLEXIO_I2C_Busy; -} -#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ - -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO I2C - * hardware configuration. - * - * Example - code - FLEXIO_I2C_Type base = { - .flexioBase = FLEXIO, - .SDAPinIndex = 0, - .SCLPinIndex = 1, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_i2c_master_config_t config = { - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 100000 - }; - FLEXIO_I2C_MasterInit(base, &config, srcClock_Hz); - endcode - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param masterConfig Pointer to flexio_i2c_master_config_t structure. - * param srcClock_Hz FlexIO source clock in Hz. - * retval kStatus_Success Initialization successful - * retval kStatus_InvalidArgument The source clock exceed upper range limitation -*/ -status_t FLEXIO_I2C_MasterInit(FLEXIO_I2C_Type *base, flexio_i2c_master_config_t *masterConfig, uint32_t srcClock_Hz) -{ - assert((base != NULL) && (masterConfig != NULL)); - - flexio_shifter_config_t shifterConfig; - flexio_timer_config_t timerConfig; - uint32_t controlVal = 0; - uint16_t timerDiv = 0; - status_t result = kStatus_Success; - - (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); - (void)memset(&timerConfig, 0, sizeof(timerConfig)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_I2C_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Do hardware configuration. */ - /* 1. Configure the shifter 0 for tx. */ - shifterConfig.timerSelect = base->timerIndex[2]; - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - shifterConfig.pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection; - shifterConfig.pinSelect = base->SDAPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveLow; - shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); - - /* 2. Configure the shifter 1 for rx. */ - shifterConfig.timerSelect = base->timerIndex[2]; - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinSelect = base->SDAPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitLow; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); - - /*3. Configure the timer 0 and timer 1 for generating bit clock. */ - /* timer 1 is used to config baudrate */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection; - timerConfig.pinSelect = base->SCLPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - - /* Set TIMCMP = (baud rate divider / 2) - 1. */ - timerDiv = (uint16_t)(srcClock_Hz / masterConfig->baudRate_Bps) / 2U - 1U; - /* Calculate and assign the actual baudrate. */ - base->baudrate = srcClock_Hz / (2U * ((uint32_t)timerDiv + 1U)); - - timerConfig.timerCompare = timerDiv; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); - - /* timer 0 is used to config total shift clock edges */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->SCLPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - - /* Set TIMCMP when confinguring transfer bytes. */ - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); - - /* 4. Configure the timer 2 for controlling shifters. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->SCLPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveLow; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPrevTimerEnable; - timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerCompare; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - - /* Set TIMCMP[15:0] = (number of bits x 2) - 1. */ - timerConfig.timerCompare = 8U * 2U - 1U; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[2], &timerConfig); - - /* Configure FLEXIO I2C Master. */ - controlVal = base->flexioBase->CTRL; - controlVal &= - ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - controlVal |= (FLEXIO_CTRL_DBGE(masterConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(masterConfig->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(masterConfig->enableMaster)); - if (!masterConfig->enableInDoze) - { - controlVal |= FLEXIO_CTRL_DOZEN_MASK; - } - - base->flexioBase->CTRL = controlVal; - /* Disable internal IRQs. */ - FLEXIO_I2C_MasterDisableInterrupts( - base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); - return result; -} - -/*! - * brief De-initializes the FlexIO I2C master peripheral. Calling this API Resets the FlexIO I2C master - * shifer and timer config, module can't work unless the FLEXIO_I2C_MasterInit is called. - * - * param base pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterDeinit(FLEXIO_I2C_Type *base) -{ - base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[2]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[2]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[2]] = 0; - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[0]); - base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[1]); - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex[0]); - base->flexioBase->TIMSTAT = (1UL << base->timerIndex[1]); - base->flexioBase->TIMSTAT = (1UL << base->timerIndex[2]); -} - -/*! - * brief Gets the default configuration to configure the FlexIO module. The configuration - * can be used directly for calling the FLEXIO_I2C_MasterInit(). - * - * Example: - code - flexio_i2c_master_config_t config; - FLEXIO_I2C_MasterGetDefaultConfig(&config); - endcode - * param masterConfig Pointer to flexio_i2c_master_config_t structure. -*/ -void FLEXIO_I2C_MasterGetDefaultConfig(flexio_i2c_master_config_t *masterConfig) -{ - assert(masterConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(masterConfig, 0, sizeof(*masterConfig)); - - masterConfig->enableMaster = true; - masterConfig->enableInDoze = false; - masterConfig->enableInDebug = true; - masterConfig->enableFastAccess = false; - - /* Default baud rate at 100kbps. */ - masterConfig->baudRate_Bps = 100000U; -} - -/*! - * brief Gets the FlexIO I2C master status flags. - * - * param base Pointer to FLEXIO_I2C_Type structure - * return Status flag, use status flag to AND #_flexio_i2c_master_status_flags can get the related status. - */ - -uint32_t FLEXIO_I2C_MasterGetStatusFlags(FLEXIO_I2C_Type *base) -{ - uint32_t status = 0; - - status = - ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); - status |= - (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) - << 1U); - status |= - (((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) - << 2U); - - return status; -} - -/*! - * brief Clears the FlexIO I2C master status flags. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param mask Status flag. - * The parameter can be any combination of the following values: - * arg kFLEXIO_I2C_RxFullFlag - * arg kFLEXIO_I2C_ReceiveNakFlag - */ - -void FLEXIO_I2C_MasterClearStatusFlags(FLEXIO_I2C_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); - } - - if ((mask & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - } - - if ((mask & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) - { - FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Enables the FlexIO i2c master interrupt requests. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param mask Interrupt source. - * Currently only one interrupt request source: - * arg kFLEXIO_I2C_TransferCompleteInterruptEnable - */ -void FLEXIO_I2C_MasterEnableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Disables the FlexIO I2C master interrupt requests. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param mask Interrupt source. - */ -void FLEXIO_I2C_MasterDisableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Sets the FlexIO I2C master transfer baudrate. - * - * param base Pointer to FLEXIO_I2C_Type structure - * param baudRate_Bps the baud rate value in HZ - * param srcClock_Hz source clock in HZ - */ -void FLEXIO_I2C_MasterSetBaudRate(FLEXIO_I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) -{ - uint16_t timerDiv = 0; - FLEXIO_Type *flexioBase = base->flexioBase; - - /* Set TIMCMP = (baud rate divider / 2) - 1.*/ - timerDiv = (uint16_t)((srcClock_Hz / baudRate_Bps) / 2U - 1U); - - flexioBase->TIMCMP[base->timerIndex[1]] = timerDiv; - - /* Calculate and assign the actual baudrate. */ - base->baudrate = srcClock_Hz / (2U * ((uint32_t)timerDiv + 1U)); -} - -/*! - * brief Sets the number of bytes to be transferred from a start signal to a stop signal. - * - * note Call this API before a transfer begins because the timer generates a number of clocks according - * to the number of bytes that need to be transferred. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param count Number of bytes need to be transferred from a start signal to a re-start/stop signal - * retval kStatus_Success Successfully configured the count. - * retval kStatus_InvalidArgument Input argument is invalid. - */ -status_t FLEXIO_I2C_MasterSetTransferCount(FLEXIO_I2C_Type *base, uint16_t count) -{ - /* Calculate whether the transfer count is larger than the max value compare register can achieve */ - if (count > ((0xFFFFUL - 1UL) / (16UL + 1UL + 1UL))) - { - return kStatus_InvalidArgument; - } - - uint32_t timerConfig = 0U; - FLEXIO_Type *flexioBase = base->flexioBase; - - flexioBase->TIMCMP[base->timerIndex[0]] = (uint32_t)count * 18U + 1U; - timerConfig = flexioBase->TIMCFG[base->timerIndex[0]]; - timerConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; - timerConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare); - flexioBase->TIMCFG[base->timerIndex[0]] = timerConfig; - - return kStatus_Success; -} - -/*! - * brief Sends START + 7-bit address to the bus. - * - * note This API should be called when the transfer configuration is ready to send a START signal - * and 7-bit address to the bus. This is a non-blocking API, which returns directly after the address - * is put into the data register but the address transfer is not finished on the bus. Ensure that - * the kFLEXIO_I2C_RxFullFlag status is asserted before calling this API. - * param base Pointer to FLEXIO_I2C_Type structure. - * param address 7-bit address. - * param direction transfer direction. - * This parameter is one of the values in flexio_i2c_direction_t: - * arg kFLEXIO_I2C_Write: Transmit - * arg kFLEXIO_I2C_Read: Receive - */ - -void FLEXIO_I2C_MasterStart(FLEXIO_I2C_Type *base, uint8_t address, flexio_i2c_direction_t direction) -{ - uint32_t data; - - data = ((uint32_t)address) << 1U | ((direction == kFLEXIO_I2C_Read) ? 1U : 0U); - - FLEXIO_I2C_MasterWriteByte(base, data); -} - -/*! - * brief Sends the repeated start signal on the bus. - * - * param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterRepeatedStart(FLEXIO_I2C_Type *base) -{ - /* Prepare for RESTART condition, no stop.*/ - FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); -} - -/*! - * brief Sends the stop signal on the bus. - * - * param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterStop(FLEXIO_I2C_Type *base) -{ - /* Prepare normal stop. */ - (void)FLEXIO_I2C_MasterSetTransferCount(base, 0x0U); - FLEXIO_I2C_MasterWriteByte(base, 0x0U); -} - -/*! - * brief Sends the stop signal when transfer is still on-going. - * - * param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterAbortStop(FLEXIO_I2C_Type *base) -{ - uint32_t tmpConfig; - - /* Prepare abort stop. */ - /* Disable timer 0. */ - tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[0]]; - tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; - tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPinBothEdge); - base->flexioBase->TIMCFG[base->timerIndex[0]] = tmpConfig; - - /* Disable timer 1. */ - tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[1]]; - tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; - tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPinBothEdge); - base->flexioBase->TIMCFG[base->timerIndex[1]] = tmpConfig; -} - -/*! - * brief Configures the sent ACK/NAK for the following byte. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param enable True to configure send ACK, false configure to send NAK. - */ -void FLEXIO_I2C_MasterEnableAck(FLEXIO_I2C_Type *base, bool enable) -{ - uint32_t tmpConfig = 0; - - tmpConfig = base->flexioBase->SHIFTCFG[base->shifterIndex[0]]; - tmpConfig &= ~FLEXIO_SHIFTCFG_SSTOP_MASK; - if (enable) - { - tmpConfig |= FLEXIO_SHIFTCFG_SSTOP(kFLEXIO_ShifterStopBitLow); - } - else - { - tmpConfig |= FLEXIO_SHIFTCFG_SSTOP(kFLEXIO_ShifterStopBitHigh); - } - base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = tmpConfig; -} - -/*! - * brief Sends a buffer of data in bytes. - * - * note This function blocks via polling until all bytes have been sent. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param txBuff The data bytes to send. - * param txSize The number of data bytes to send. - * retval kStatus_Success Successfully write data. - * retval kStatus_FLEXIO_I2C_Nak Receive NAK during writing data. - * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2C_MasterWriteBlocking(FLEXIO_I2C_Type *base, const uint8_t *txBuff, uint8_t txSize) -{ - assert(txBuff != NULL); - assert(txSize != 0U); - - uint32_t status; -#if I2C_RETRY_TIMES - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - while (0U != txSize--) - { - FLEXIO_I2C_MasterWriteByte(base, *txBuff++); - - /* Wait until data transfer complete. */ -#if I2C_RETRY_TIMES - waitTimes = I2C_RETRY_TIMES; - while ((0U == ((status = FLEXIO_I2C_MasterGetStatusFlags(base)) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == ((status = FLEXIO_I2C_MasterGetStatusFlags(base)) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) - { - } -#endif - - if ((status & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) - { - FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - return kStatus_FLEXIO_I2C_Nak; - } - } - return kStatus_Success; -} - -/*! - * brief Receives a buffer of bytes. - * - * note This function blocks via polling until all bytes have been received. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param rxBuff The buffer to store the received bytes. - * param rxSize The number of data bytes to be received. - * retval kStatus_Success Successfully read data. - * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2C_MasterReadBlocking(FLEXIO_I2C_Type *base, uint8_t *rxBuff, uint8_t rxSize) -{ - assert(rxBuff != NULL); - assert(rxSize != 0U); - -#if I2C_RETRY_TIMES - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - while (0U != rxSize--) - { - /* Wait until data transfer complete. */ -#if I2C_RETRY_TIMES - waitTimes = I2C_RETRY_TIMES; - while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) - { - } -#endif - *rxBuff++ = FLEXIO_I2C_MasterReadByte(base); - } - return kStatus_Success; -} - -/*! - * brief Performs a master polling transfer on the I2C bus. - * - * note The API does not return until the transfer succeeds or fails due - * to receiving NAK. - * - * param base pointer to FLEXIO_I2C_Type structure. - * param xfer pointer to flexio_i2c_master_transfer_t structure. - * return status of status_t. - */ -status_t FLEXIO_I2C_MasterTransferBlocking(FLEXIO_I2C_Type *base, flexio_i2c_master_transfer_t *xfer) -{ - assert(xfer != NULL); - -#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS - /* Return an error if the bus is already in use not by us.*/ - status_t status = FLEXIO_I2C_CheckForBusyBus(base); - if (status != kStatus_Success) - { - return status; - } -#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ - - flexio_i2c_master_handle_t tmpHandle; - uint32_t statusFlags; - status_t result = kStatus_Success; -#if I2C_RETRY_TIMES - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - /* Zero the handle. */ - (void)memset(&tmpHandle, 0, sizeof(tmpHandle)); - - /* Set up transfer machine. */ - result = FLEXIO_I2C_MasterTransferInitStateMachine(base, &tmpHandle, xfer); - if (result != kStatus_Success) - { - return result; - } - - do - { - /* Wait either tx empty or rx full flag is asserted. */ -#if I2C_RETRY_TIMES - waitTimes = I2C_RETRY_TIMES; - while ((0U == ((statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base)) & - ((uint32_t)kFLEXIO_I2C_TxEmptyFlag | (uint32_t)kFLEXIO_I2C_RxFullFlag))) && - (0U != --waitTimes)) - { - } - if (0U == waitTimes) - { - return kStatus_FLEXIO_I2C_Timeout; - } -#else - while (0U == ((statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base)) & - ((uint32_t)kFLEXIO_I2C_TxEmptyFlag | (uint32_t)kFLEXIO_I2C_RxFullFlag))) - { - } -#endif - FLEXIO_ClearTimerStatusFlags(base->flexioBase, ((1UL << base->timerIndex[0]) | (1UL << base->timerIndex[1]))); - result = FLEXIO_I2C_MasterTransferRunStateMachine(base, &tmpHandle, statusFlags); - - } while ((tmpHandle.state != (uint8_t)kFLEXIO_I2C_Idle) && (result == kStatus_Success)); - - /* Timer disable on timer compare, wait until bit clock TSF set, which means timer disable and stop has been sent. - */ - while (0U == (FLEXIO_GetTimerStatusFlags(base->flexioBase) & (1UL << base->timerIndex[1]))) - { - } - - return result; -} - -/*! - * brief Initializes the I2C handle which is used in transactional functions. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param handle Pointer to flexio_i2c_master_handle_t structure to store the transfer state. - * param callback Pointer to user callback function. - * param userData User param passed to the callback function. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/isr table out of range. - */ -status_t FLEXIO_I2C_MasterTransferCreateHandle(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Register callback and userData. */ - handle->completionCallback = callback; - handle->userData = userData; - - /* Clear pending NVIC IRQ before enable NVIC IRQ. */ - NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_I2C_GetInstance(base)]); - (void)EnableIRQ(flexio_irqs[FLEXIO_I2C_GetInstance(base)]); - - /* Save the context in global variables to support the double weak mechanism. */ - return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_I2C_MasterTransferHandleIRQ); -} - -/*! - * brief Performs a master interrupt non-blocking transfer on the I2C bus. - * - * note The API returns immediately after the transfer initiates. - * Call FLEXIO_I2C_MasterTransferGetCount to poll the transfer status to check whether - * the transfer is finished. If the return status is not kStatus_FLEXIO_I2C_Busy, the transfer - * is finished. - * - * param base Pointer to FLEXIO_I2C_Type structure - * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state - * param xfer pointer to flexio_i2c_master_transfer_t structure - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_FLEXIO_I2C_Busy FlexIO I2C is not idle, is running another transfer. - */ -status_t FLEXIO_I2C_MasterTransferNonBlocking(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - status_t result = kStatus_Success; - -#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS - /* Return an error if the bus is already in use not by us.*/ - result = FLEXIO_I2C_CheckForBusyBus(base); - if (result != kStatus_Success) - { - return result; - } -#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ - - if (handle->state != (uint8_t)kFLEXIO_I2C_Idle) - { - return kStatus_FLEXIO_I2C_Busy; - } - else - { - /* Set up transfer machine. */ - result = FLEXIO_I2C_MasterTransferInitStateMachine(base, handle, xfer); - if (result != kStatus_Success) - { - return result; - } - - /* Enable both tx empty and rxfull interrupt. */ - FLEXIO_I2C_MasterEnableInterrupts( - base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); - - return kStatus_Success; - } -} - -/*! - * brief Aborts an interrupt non-blocking transfer early. - * - * note This API can be called at any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base Pointer to FLEXIO_I2C_Type structure - * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state - */ -void FLEXIO_I2C_MasterTransferAbort(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable interrupts. */ - FLEXIO_I2C_MasterDisableInterrupts( - base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); - - /* Reset to idle state. */ - handle->state = (uint8_t)kFLEXIO_I2C_Idle; -} - -/*! - * brief Gets the master transfer status during a interrupt non-blocking transfer. - * - * param base Pointer to FLEXIO_I2C_Type structure. - * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the non-blocking transaction. - * retval kStatus_InvalidArgument count is Invalid. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_I2C_MasterTransferGetCount(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, size_t *count) -{ - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (handle->state == (uint8_t)kFLEXIO_I2C_Idle) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - *count = handle->transferSize - handle->transfer.dataSize; - - return kStatus_Success; -} - -/*! - * brief Master interrupt handler. - * - * param i2cType Pointer to FLEXIO_I2C_Type structure - * param i2cHandle Pointer to flexio_i2c_master_transfer_t structure - */ -void FLEXIO_I2C_MasterTransferHandleIRQ(void *i2cType, void *i2cHandle) -{ - FLEXIO_I2C_Type *base = (FLEXIO_I2C_Type *)i2cType; - flexio_i2c_master_handle_t *handle = (flexio_i2c_master_handle_t *)i2cHandle; - uint32_t statusFlags; - status_t result; - - statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base); - - result = FLEXIO_I2C_MasterTransferRunStateMachine(base, handle, statusFlags); - - if (handle->state == (uint8_t)kFLEXIO_I2C_Idle) - { - FLEXIO_I2C_MasterTransferComplete(base, handle, result); - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.h b/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.h deleted file mode 100644 index 7855f95..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2c_master.h +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_I2C_MASTER_H_ -#define _FSL_FLEXIO_I2C_MASTER_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" - -/*! - * @addtogroup flexio_i2c_master - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_FLEXIO_I2C_MASTER_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) -/*@}*/ - -/*! @brief Retry times for waiting flag. */ -#ifndef I2C_RETRY_TIMES -#define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ -#endif - -/*! @brief FlexIO I2C transfer status*/ -enum -{ - kStatus_FLEXIO_I2C_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 0), /*!< I2C is busy doing transfer. */ - kStatus_FLEXIO_I2C_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 1), /*!< I2C is busy doing transfer. */ - kStatus_FLEXIO_I2C_Nak = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 2), /*!< NAK received during transfer. */ - kStatus_FLEXIO_I2C_Timeout = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 3), /*!< Timeout polling status flags. */ -}; - -/*! @brief Define FlexIO I2C master interrupt mask. */ -enum _flexio_i2c_master_interrupt -{ - kFLEXIO_I2C_TxEmptyInterruptEnable = 0x1U, /*!< Tx buffer empty interrupt enable. */ - kFLEXIO_I2C_RxFullInterruptEnable = 0x2U, /*!< Rx buffer full interrupt enable. */ -}; - -/*! @brief Define FlexIO I2C master status mask. */ -enum _flexio_i2c_master_status_flags -{ - kFLEXIO_I2C_TxEmptyFlag = 0x1U, /*!< Tx shifter empty flag. */ - kFLEXIO_I2C_RxFullFlag = 0x2U, /*!< Rx shifter full/Transfer complete flag. */ - kFLEXIO_I2C_ReceiveNakFlag = 0x4U, /*!< Receive NAK flag. */ -}; - -/*! @brief Direction of master transfer.*/ -typedef enum _flexio_i2c_direction -{ - kFLEXIO_I2C_Write = 0x0U, /*!< Master send to slave. */ - kFLEXIO_I2C_Read = 0x1U, /*!< Master receive from slave. */ -} flexio_i2c_direction_t; - -/*! @brief Define FlexIO I2C master access structure typedef. */ -typedef struct _flexio_i2c_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ - uint8_t SDAPinIndex; /*!< Pin select for I2C SDA. */ - uint8_t SCLPinIndex; /*!< Pin select for I2C SCL. */ - uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO I2C. */ - uint8_t timerIndex[3]; /*!< Timer index used in FlexIO I2C. */ - uint32_t baudrate; /*!< Master transfer baudrate, used to calculate delay time. */ -} FLEXIO_I2C_Type; - -/*! @brief Define FlexIO I2C master user configuration structure. */ -typedef struct _flexio_i2c_master_config -{ - bool enableMaster; /*!< Enables the FlexIO I2C peripheral at initialization time. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, fast access requires - the FlexIO clock to be at least twice the frequency of the bus clock. */ - uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ -} flexio_i2c_master_config_t; - -/*! @brief Define FlexIO I2C master transfer structure. */ -typedef struct _flexio_i2c_master_transfer -{ - uint32_t flags; /*!< Transfer flag which controls the transfer, reserved for FlexIO I2C. */ - uint8_t slaveAddress; /*!< 7-bit slave address. */ - flexio_i2c_direction_t direction; /*!< Transfer direction, read or write. */ - uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ - uint8_t subaddressSize; /*!< Size of command buffer. */ - uint8_t volatile *data; /*!< Transfer buffer. */ - volatile size_t dataSize; /*!< Transfer size. */ -} flexio_i2c_master_transfer_t; - -/*! @brief FlexIO I2C master handle typedef. */ -typedef struct _flexio_i2c_master_handle flexio_i2c_master_handle_t; - -/*! @brief FlexIO I2C master transfer callback typedef. */ -typedef void (*flexio_i2c_master_transfer_callback_t)(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Define FlexIO I2C master handle structure. */ -struct _flexio_i2c_master_handle -{ - flexio_i2c_master_transfer_t transfer; /*!< FlexIO I2C master transfer copy. */ - size_t transferSize; /*!< Total bytes to be transferred. */ - uint8_t state; /*!< Transfer state maintained during transfer. */ - flexio_i2c_master_transfer_callback_t completionCallback; /*!< Callback function called at transfer event. */ - /*!< Callback function called at transfer event. */ - void *userData; /*!< Callback parameter passed to callback function. */ - bool needRestart; /*!< Whether master needs to send re-start signal. */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS -/*! - * @brief Make sure the bus isn't already pulled down. - * - * Check the FLEXIO pin status to see whether either of SDA and SCL pin is pulled down. - * - * @param base Pointer to FLEXIO_I2C_Type structure.. - * @retval kStatus_Success - * @retval kStatus_FLEXIO_I2C_Busy - */ -status_t FLEXIO_I2C_CheckForBusyBus(FLEXIO_I2C_Type *base); -#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO I2C - * hardware configuration. - * - * Example - @code - FLEXIO_I2C_Type base = { - .flexioBase = FLEXIO, - .SDAPinIndex = 0, - .SCLPinIndex = 1, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_i2c_master_config_t config = { - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 100000 - }; - FLEXIO_I2C_MasterInit(base, &config, srcClock_Hz); - @endcode - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param masterConfig Pointer to flexio_i2c_master_config_t structure. - * @param srcClock_Hz FlexIO source clock in Hz. - * @retval kStatus_Success Initialization successful - * @retval kStatus_InvalidArgument The source clock exceed upper range limitation -*/ -status_t FLEXIO_I2C_MasterInit(FLEXIO_I2C_Type *base, flexio_i2c_master_config_t *masterConfig, uint32_t srcClock_Hz); - -/*! - * @brief De-initializes the FlexIO I2C master peripheral. Calling this API Resets the FlexIO I2C master - * shifer and timer config, module can't work unless the FLEXIO_I2C_MasterInit is called. - * - * @param base pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterDeinit(FLEXIO_I2C_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO module. The configuration - * can be used directly for calling the FLEXIO_I2C_MasterInit(). - * - * Example: - @code - flexio_i2c_master_config_t config; - FLEXIO_I2C_MasterGetDefaultConfig(&config); - @endcode - * @param masterConfig Pointer to flexio_i2c_master_config_t structure. -*/ -void FLEXIO_I2C_MasterGetDefaultConfig(flexio_i2c_master_config_t *masterConfig); - -/*! - * @brief Enables/disables the FlexIO module operation. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param enable Pass true to enable module, false does not have any effect. - */ -static inline void FLEXIO_I2C_MasterEnable(FLEXIO_I2C_Type *base, bool enable) -{ - if (enable) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the FlexIO I2C master status flags. - * - * @param base Pointer to FLEXIO_I2C_Type structure - * @return Status flag, use status flag to AND #_flexio_i2c_master_status_flags can get the related status. - */ - -uint32_t FLEXIO_I2C_MasterGetStatusFlags(FLEXIO_I2C_Type *base); - -/*! - * @brief Clears the FlexIO I2C master status flags. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param mask Status flag. - * The parameter can be any combination of the following values: - * @arg kFLEXIO_I2C_RxFullFlag - * @arg kFLEXIO_I2C_ReceiveNakFlag - */ - -void FLEXIO_I2C_MasterClearStatusFlags(FLEXIO_I2C_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the FlexIO i2c master interrupt requests. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param mask Interrupt source. - * Currently only one interrupt request source: - * @arg kFLEXIO_I2C_TransferCompleteInterruptEnable - */ -void FLEXIO_I2C_MasterEnableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask); - -/*! - * @brief Disables the FlexIO I2C master interrupt requests. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param mask Interrupt source. - */ -void FLEXIO_I2C_MasterDisableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Sets the FlexIO I2C master transfer baudrate. - * - * @param base Pointer to FLEXIO_I2C_Type structure - * @param baudRate_Bps the baud rate value in HZ - * @param srcClock_Hz source clock in HZ - */ -void FLEXIO_I2C_MasterSetBaudRate(FLEXIO_I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); - -/*! - * @brief Sends START + 7-bit address to the bus. - * - * @note This API should be called when the transfer configuration is ready to send a START signal - * and 7-bit address to the bus. This is a non-blocking API, which returns directly after the address - * is put into the data register but the address transfer is not finished on the bus. Ensure that - * the kFLEXIO_I2C_RxFullFlag status is asserted before calling this API. - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param address 7-bit address. - * @param direction transfer direction. - * This parameter is one of the values in flexio_i2c_direction_t: - * @arg kFLEXIO_I2C_Write: Transmit - * @arg kFLEXIO_I2C_Read: Receive - */ - -void FLEXIO_I2C_MasterStart(FLEXIO_I2C_Type *base, uint8_t address, flexio_i2c_direction_t direction); - -/*! - * @brief Sends the stop signal on the bus. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterStop(FLEXIO_I2C_Type *base); - -/*! - * @brief Sends the repeated start signal on the bus. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterRepeatedStart(FLEXIO_I2C_Type *base); - -/*! - * @brief Sends the stop signal when transfer is still on-going. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - */ -void FLEXIO_I2C_MasterAbortStop(FLEXIO_I2C_Type *base); - -/*! - * @brief Configures the sent ACK/NAK for the following byte. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param enable True to configure send ACK, false configure to send NAK. - */ -void FLEXIO_I2C_MasterEnableAck(FLEXIO_I2C_Type *base, bool enable); - -/*! - * @brief Sets the number of bytes to be transferred from a start signal to a stop signal. - * - * @note Call this API before a transfer begins because the timer generates a number of clocks according - * to the number of bytes that need to be transferred. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param count Number of bytes need to be transferred from a start signal to a re-start/stop signal - * @retval kStatus_Success Successfully configured the count. - * @retval kStatus_InvalidArgument Input argument is invalid. - */ -status_t FLEXIO_I2C_MasterSetTransferCount(FLEXIO_I2C_Type *base, uint16_t count); - -/*! - * @brief Writes one byte of data to the I2C bus. - * - * @note This is a non-blocking API, which returns directly after the data is put into the - * data register but the data transfer is not finished on the bus. Ensure that - * the TxEmptyFlag is asserted before calling this API. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param data a byte of data. - */ -static inline void FLEXIO_I2C_MasterWriteByte(FLEXIO_I2C_Type *base, uint32_t data) -{ - base->flexioBase->SHIFTBUFBBS[base->shifterIndex[0]] = data; -} - -/*! - * @brief Reads one byte of data from the I2C bus. - * - * @note This is a non-blocking API, which returns directly after the data is read from the - * data register. Ensure that the data is ready in the register. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @return data byte read. - */ -static inline uint8_t FLEXIO_I2C_MasterReadByte(FLEXIO_I2C_Type *base) -{ - return (uint8_t)(base->flexioBase->SHIFTBUFBIS[base->shifterIndex[1]]); -} - -/*! - * @brief Sends a buffer of data in bytes. - * - * @note This function blocks via polling until all bytes have been sent. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param txBuff The data bytes to send. - * @param txSize The number of data bytes to send. - * @retval kStatus_Success Successfully write data. - * @retval kStatus_FLEXIO_I2C_Nak Receive NAK during writing data. - * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2C_MasterWriteBlocking(FLEXIO_I2C_Type *base, const uint8_t *txBuff, uint8_t txSize); - -/*! - * @brief Receives a buffer of bytes. - * - * @note This function blocks via polling until all bytes have been received. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param rxBuff The buffer to store the received bytes. - * @param rxSize The number of data bytes to be received. - * @retval kStatus_Success Successfully read data. - * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2C_MasterReadBlocking(FLEXIO_I2C_Type *base, uint8_t *rxBuff, uint8_t rxSize); - -/*! - * @brief Performs a master polling transfer on the I2C bus. - * - * @note The API does not return until the transfer succeeds or fails due - * to receiving NAK. - * - * @param base pointer to FLEXIO_I2C_Type structure. - * @param xfer pointer to flexio_i2c_master_transfer_t structure. - * @return status of status_t. - */ -status_t FLEXIO_I2C_MasterTransferBlocking(FLEXIO_I2C_Type *base, flexio_i2c_master_transfer_t *xfer); -/*@}*/ - -/*Transactional APIs*/ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the I2C handle which is used in transactional functions. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param handle Pointer to flexio_i2c_master_handle_t structure to store the transfer state. - * @param callback Pointer to user callback function. - * @param userData User param passed to the callback function. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/isr table out of range. - */ -status_t FLEXIO_I2C_MasterTransferCreateHandle(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_callback_t callback, - void *userData); - -/*! - * @brief Performs a master interrupt non-blocking transfer on the I2C bus. - * - * @note The API returns immediately after the transfer initiates. - * Call FLEXIO_I2C_MasterTransferGetCount to poll the transfer status to check whether - * the transfer is finished. If the return status is not kStatus_FLEXIO_I2C_Busy, the transfer - * is finished. - * - * @param base Pointer to FLEXIO_I2C_Type structure - * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state - * @param xfer pointer to flexio_i2c_master_transfer_t structure - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_FLEXIO_I2C_Busy FlexIO I2C is not idle, is running another transfer. - */ -status_t FLEXIO_I2C_MasterTransferNonBlocking(FLEXIO_I2C_Type *base, - flexio_i2c_master_handle_t *handle, - flexio_i2c_master_transfer_t *xfer); - -/*! - * @brief Gets the master transfer status during a interrupt non-blocking transfer. - * - * @param base Pointer to FLEXIO_I2C_Type structure. - * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_InvalidArgument count is Invalid. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_I2C_MasterTransferGetCount(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, size_t *count); - -/*! - * @brief Aborts an interrupt non-blocking transfer early. - * - * @note This API can be called at any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base Pointer to FLEXIO_I2C_Type structure - * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state - */ -void FLEXIO_I2C_MasterTransferAbort(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle); - -/*! - * @brief Master interrupt handler. - * - * @param i2cType Pointer to FLEXIO_I2C_Type structure - * @param i2cHandle Pointer to flexio_i2c_master_transfer_t structure - */ -void FLEXIO_I2C_MasterTransferHandleIRQ(void *i2cType, void *i2cHandle); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ -/*@}*/ - -#endif /*_FSL_FLEXIO_I2C_MASTER_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2s.c b/devices/MIMXRT1052/drivers/fsl_flexio_i2s.c deleted file mode 100644 index 087e0d6..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2s.c +++ /dev/null @@ -1,903 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_i2s.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_i2s" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ -/*!@brief _sai_transfer_state*/ -enum -{ - kFLEXIO_I2S_Busy = 0x0U, /*!< FLEXIO_I2S is busy */ - kFLEXIO_I2S_Idle, /*!< Transfer is done. */ -}; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Receive a piece of data in non-blocking way. - * - * @param base FLEXIO I2S base pointer - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be read. - * @param size Bytes to be read. - */ -static void FLEXIO_I2S_ReadNonBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *rxData, size_t size); - -/*! - * @brief sends a piece of data in non-blocking way. - * - * @param base FLEXIO I2S base pointer - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be written. - * @param size Bytes to be written. - */ -static void FLEXIO_I2S_WriteNonBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *txData, size_t size); -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t FLEXIO_I2S_GetInstance(FLEXIO_I2S_Type *base) -{ - return FLEXIO_GetInstance(base->flexioBase); -} - -static void FLEXIO_I2S_WriteNonBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *txData, size_t size) -{ - uint32_t i = 0; - uint8_t j = 0; - uint8_t bytesPerWord = bitWidth / 8U; - uint32_t data = 0; - uint32_t temp = 0; - - for (i = 0; i < size / bytesPerWord; i++) - { - for (j = 0; j < bytesPerWord; j++) - { - temp = (uint32_t)(*txData); - data |= (temp << (8U * j)); - txData++; - } - base->flexioBase->SHIFTBUFBIS[base->txShifterIndex] = data << (32U - bitWidth); - data = 0; - } -} - -static void FLEXIO_I2S_ReadNonBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *rxData, size_t size) -{ - uint32_t i = 0; - uint8_t j = 0; - uint8_t bytesPerWord = bitWidth / 8U; - uint32_t data = 0; - - for (i = 0; i < size / bytesPerWord; i++) - { - data = (base->flexioBase->SHIFTBUFBIS[base->rxShifterIndex]); - for (j = 0; j < bytesPerWord; j++) - { - *rxData = (uint8_t)((data >> (8U * j)) & 0xFFU); - rxData++; - } - } -} - -/*! - * brief Initializes the FlexIO I2S. - * - * This API configures FlexIO pins and shifter to I2S and configures the FlexIO I2S with a configuration structure. - * The configuration structure can be filled by the user, or be set with default values by - * FLEXIO_I2S_GetDefaultConfig(). - * - * note This API should be called at the beginning of the application to use - * the FlexIO I2S driver. Otherwise, any access to the FlexIO I2S module can cause hard fault - * because the clock is not enabled. - * - * param base FlexIO I2S base pointer - * param config FlexIO I2S configure structure. - */ -void FLEXIO_I2S_Init(FLEXIO_I2S_Type *base, const flexio_i2s_config_t *config) -{ - assert((base != NULL) && (config != NULL)); - - flexio_shifter_config_t shifterConfig = {0}; - flexio_timer_config_t timerConfig = {0}; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_I2S_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* reset Flexio */ - FLEXIO_Reset(base->flexioBase); - - /* Set shifter for I2S Tx data */ - shifterConfig.timerSelect = base->bclkTimerIndex; - shifterConfig.pinSelect = base->txPinIndex; - shifterConfig.timerPolarity = config->txTimerPolarity; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; - shifterConfig.pinPolarity = config->txPinPolarity; - shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - if (config->masterSlave == kFLEXIO_I2S_Master) - { - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnShift; - } - else - { - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - } - - FLEXIO_SetShifterConfig(base->flexioBase, base->txShifterIndex, &shifterConfig); - - /* Set shifter for I2S Rx Data */ - shifterConfig.timerSelect = base->bclkTimerIndex; - shifterConfig.pinSelect = base->rxPinIndex; - shifterConfig.timerPolarity = config->rxTimerPolarity; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinPolarity = config->rxPinPolarity; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - - FLEXIO_SetShifterConfig(base->flexioBase, base->rxShifterIndex, &shifterConfig); - - /* Set Timer to I2S frame sync */ - if (config->masterSlave == kFLEXIO_I2S_Master) - { - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->txPinIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceExternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutput; - timerConfig.pinSelect = base->fsPinIndex; - timerConfig.pinPolarity = config->fsPinPolarity; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableNever; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPrevTimerEnable; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - } - else - { - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->bclkPinIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->fsPinIndex; - timerConfig.pinPolarity = config->fsPinPolarity; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnTriggerInputShiftTriggerInput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPinRisingEdge; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - } - FLEXIO_SetTimerConfig(base->flexioBase, base->fsTimerIndex, &timerConfig); - - /* Set Timer to I2S bit clock */ - if (config->masterSlave == kFLEXIO_I2S_Master) - { - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->txShifterIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinSelect = base->bclkPinIndex; - timerConfig.pinConfig = kFLEXIO_PinConfigOutput; - timerConfig.pinPolarity = config->bclkPinPolarity; - timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableNever; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - } - else - { - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_TIMn(base->fsTimerIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinSelect = base->bclkPinIndex; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinPolarity = config->bclkPinPolarity; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompareTriggerLow; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPinRisingEdgeTriggerHigh; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - } - FLEXIO_SetTimerConfig(base->flexioBase, base->bclkTimerIndex, &timerConfig); - - /* If enable flexio I2S */ - if (config->enableI2S) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } - else - { - base->flexioBase->CTRL &= ~FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/*! - * brief Sets the FlexIO I2S configuration structure to default values. - * - * The purpose of this API is to get the configuration structure initialized for use in FLEXIO_I2S_Init(). - * Users may use the initialized structure unchanged in FLEXIO_I2S_Init() or modify - * some fields of the structure before calling FLEXIO_I2S_Init(). - * - * param config pointer to master configuration structure - */ -void FLEXIO_I2S_GetDefaultConfig(flexio_i2s_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->masterSlave = kFLEXIO_I2S_Master; - config->enableI2S = true; - config->txPinPolarity = kFLEXIO_PinActiveHigh; - config->rxPinPolarity = kFLEXIO_PinActiveHigh; - config->bclkPinPolarity = kFLEXIO_PinActiveHigh; - config->fsPinPolarity = kFLEXIO_PinActiveLow; - config->txTimerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - config->rxTimerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; -} - -/*! - * brief De-initializes the FlexIO I2S. - * - * Calling this API resets the FlexIO I2S shifter and timer config. After calling this API, - * call the FLEXO_I2S_Init to use the FlexIO I2S module. - * - * param base FlexIO I2S base pointer - */ -void FLEXIO_I2S_Deinit(FLEXIO_I2S_Type *base) -{ - base->flexioBase->SHIFTCFG[base->txShifterIndex] = 0; - base->flexioBase->SHIFTCTL[base->txShifterIndex] = 0; - base->flexioBase->SHIFTCFG[base->rxShifterIndex] = 0; - base->flexioBase->SHIFTCTL[base->rxShifterIndex] = 0; - base->flexioBase->TIMCFG[base->fsTimerIndex] = 0; - base->flexioBase->TIMCMP[base->fsTimerIndex] = 0; - base->flexioBase->TIMCTL[base->fsTimerIndex] = 0; - base->flexioBase->TIMCFG[base->bclkTimerIndex] = 0; - base->flexioBase->TIMCMP[base->bclkTimerIndex] = 0; - base->flexioBase->TIMCTL[base->bclkTimerIndex] = 0; -} - -/*! - * brief Enables the FlexIO I2S interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * param base Pointer to FLEXIO_I2S_Type structure - * param mask interrupt source - */ -void FLEXIO_I2S_EnableInterrupts(FLEXIO_I2S_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyInterruptEnable) != 0UL) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->txShifterIndex); - } - if ((mask & (uint32_t)kFLEXIO_I2S_RxDataRegFullInterruptEnable) != 0UL) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->rxShifterIndex); - } -} - -/*! - * brief Gets the FlexIO I2S status flags. - * - * param base Pointer to FLEXIO_I2S_Type structure - * return Status flag, which are ORed by the enumerators in the _flexio_i2s_status_flags. - */ -uint32_t FLEXIO_I2S_GetStatusFlags(FLEXIO_I2S_Type *base) -{ - uint32_t status = 0; - status = ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->txShifterIndex)) >> base->txShifterIndex); - status |= - (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->rxShifterIndex)) >> (base->rxShifterIndex)) - << 1U); - return status; -} - -/*! - * brief Disables the FlexIO I2S interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * param base pointer to FLEXIO_I2S_Type structure - * param mask interrupt source - */ -void FLEXIO_I2S_DisableInterrupts(FLEXIO_I2S_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyInterruptEnable) != 0UL) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->txShifterIndex); - } - if ((mask & (uint32_t)kFLEXIO_I2S_RxDataRegFullInterruptEnable) != 0UL) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->rxShifterIndex); - } -} - -/*! - * brief Configures the FlexIO I2S audio format in master mode. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * param base Pointer to FLEXIO_I2S_Type structure - * param format Pointer to FlexIO I2S audio data format structure. - * param srcClock_Hz I2S master clock source frequency in Hz. - */ -void FLEXIO_I2S_MasterSetFormat(FLEXIO_I2S_Type *base, flexio_i2s_format_t *format, uint32_t srcClock_Hz) -{ - uint32_t timDiv = srcClock_Hz / (format->sampleRate_Hz * format->bitWidth * 2U); - uint32_t bclkDiv = 0; - - /* Shall keep bclk and fs div an integer */ - if ((timDiv % 2UL) != 0UL) - { - timDiv += 1U; - } - /* Set Frame sync timer cmp */ - base->flexioBase->TIMCMP[base->fsTimerIndex] = FLEXIO_TIMCMP_CMP(format->bitWidth * timDiv - 1U); - - /* Set bit clock timer cmp */ - bclkDiv = ((timDiv / 2U - 1U) | ((format->bitWidth * 2UL - 1UL) << 8U)); - base->flexioBase->TIMCMP[base->bclkTimerIndex] = FLEXIO_TIMCMP_CMP(bclkDiv); -} - -/*! - * brief Configures the FlexIO I2S audio format in slave mode. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * param base Pointer to FLEXIO_I2S_Type structure - * param format Pointer to FlexIO I2S audio data format structure. - */ -void FLEXIO_I2S_SlaveSetFormat(FLEXIO_I2S_Type *base, flexio_i2s_format_t *format) -{ - /* Set Frame sync timer cmp */ - base->flexioBase->TIMCMP[base->fsTimerIndex] = FLEXIO_TIMCMP_CMP(format->bitWidth * 4UL - 3UL); - - /* Set bit clock timer cmp */ - base->flexioBase->TIMCMP[base->bclkTimerIndex] = FLEXIO_TIMCMP_CMP(format->bitWidth * 2UL - 1UL); -} - -/*! - * brief Sends data using a blocking method. - * - * note This function blocks via polling until data is ready to be sent. - * - * param base FlexIO I2S base pointer. - * param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * param txData Pointer to the data to be written. - * param size Bytes to be written. - * retval kStatus_Success Successfully write data. - * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2S_WriteBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *txData, size_t size) -{ - uint32_t i = 0; - uint8_t bytesPerWord = bitWidth / 8U; -#if I2S_RETRY_TIMES - uint32_t waitTimes = I2S_RETRY_TIMES; -#endif - - for (i = 0; i < size / bytesPerWord; i++) - { - /* Wait until it can write data */ -#if I2S_RETRY_TIMES - waitTimes = I2S_RETRY_TIMES; - while (((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyFlag) == 0UL) && - (--waitTimes != 0U)) - { - } - if (waitTimes == 0U) - { - return kStatus_FLEXIO_I2S_Timeout; - } -#else - while ((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyFlag) == 0UL) - { - } -#endif - - FLEXIO_I2S_WriteNonBlocking(base, bitWidth, txData, bytesPerWord); - txData = (uint8_t *)((uint32_t)txData + bytesPerWord); - } - - /* Wait until the last data is sent */ -#if I2S_RETRY_TIMES - waitTimes = I2S_RETRY_TIMES; - while (((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyFlag) == 0UL) && (--waitTimes != 0U)) - { - } - if (waitTimes == 0U) - { - return kStatus_FLEXIO_I2S_Timeout; - } -#else - while ((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyFlag) == 0UL) - { - } -#endif - - return kStatus_Success; -} - -/*! - * brief Receives a piece of data using a blocking method. - * - * note This function blocks via polling until data is ready to be sent. - * - * param base FlexIO I2S base pointer - * param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * param rxData Pointer to the data to be read. - * param size Bytes to be read. - * retval kStatus_Success Successfully read data. - * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2S_ReadBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *rxData, size_t size) -{ - uint32_t i = 0; - uint8_t bytesPerWord = bitWidth / 8U; -#if I2S_RETRY_TIMES - uint32_t waitTimes = I2S_RETRY_TIMES; -#endif - - for (i = 0; i < size / bytesPerWord; i++) - { - /* Wait until data is received */ -#if I2S_RETRY_TIMES - waitTimes = I2S_RETRY_TIMES; - while ((!((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->rxShifterIndex)) != 0UL)) && - (--waitTimes != 0U)) - { - } - if (waitTimes == 0U) - { - return kStatus_FLEXIO_I2S_Timeout; - } -#else - while (!((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->rxShifterIndex)) != 0UL)) - { - } -#endif - - FLEXIO_I2S_ReadNonBlocking(base, bitWidth, rxData, bytesPerWord); - rxData = (uint8_t *)((uint32_t)rxData + bytesPerWord); - } - return kStatus_Success; -} - -/*! - * brief Initializes the FlexIO I2S handle. - * - * This function initializes the FlexIO I2S handle which can be used for other - * FlexIO I2S transactional APIs. Call this API once to get the - * initialized handle. - * - * param base Pointer to FLEXIO_I2S_Type structure - * param handle Pointer to flexio_i2s_handle_t structure to store the transfer state. - * param callback FlexIO I2S callback function, which is called while finished a block. - * param userData User parameter for the FlexIO I2S callback. - */ -void FLEXIO_I2S_TransferTxCreateHandle(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Store callback and user data. */ - handle->callback = callback; - handle->userData = userData; - - /* Save the context in global variables to support the double weak mechanism. */ - (void)FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_I2S_TransferTxHandleIRQ); - - /* Set the TX/RX state. */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_I2S_GetInstance(base)]); -} - -/*! - * brief Initializes the FlexIO I2S receive handle. - * - * This function initializes the FlexIO I2S handle which can be used for other - * FlexIO I2S transactional APIs. Call this API once to get the - * initialized handle. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure to store the transfer state. - * param callback FlexIO I2S callback function, which is called while finished a block. - * param userData User parameter for the FlexIO I2S callback. - */ -void FLEXIO_I2S_TransferRxCreateHandle(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Store callback and user data. */ - handle->callback = callback; - handle->userData = userData; - - /* Save the context in global variables to support the double weak mechanism. */ - (void)FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_I2S_TransferRxHandleIRQ); - - /* Set the TX/RX state. */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_I2S_GetInstance(base)]); -} - -/*! - * brief Configures the FlexIO I2S audio format. - * - * Audio format can be changed at run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle FlexIO I2S handle pointer. - * param format Pointer to audio data format structure. - * param srcClock_Hz FlexIO I2S bit clock source frequency in Hz. This parameter should be 0 while in slave mode. - */ -void FLEXIO_I2S_TransferSetFormat(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_format_t *format, - uint32_t srcClock_Hz) -{ - assert((handle != NULL) && (format != NULL)); - - /* Set the bitWidth to handle */ - handle->bitWidth = format->bitWidth; - - /* Set sample rate */ - if (srcClock_Hz != 0UL) - { - /* It is master */ - FLEXIO_I2S_MasterSetFormat(base, format, srcClock_Hz); - } - else - { - FLEXIO_I2S_SlaveSetFormat(base, format); - } -} - -/*! - * brief Performs an interrupt non-blocking send transfer on FlexIO I2S. - * - * note The API returns immediately after transfer initiates. - * Call FLEXIO_I2S_GetRemainingBytes to poll the transfer status and check whether - * the transfer is finished. If the return status is 0, the transfer is finished. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * param xfer Pointer to flexio_i2s_transfer_t structure - * retval kStatus_Success Successfully start the data transmission. - * retval kStatus_FLEXIO_I2S_TxBusy Previous transmission still not finished, data not all written to TX register yet. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t FLEXIO_I2S_TransferSendNonBlocking(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_transfer_t *xfer) -{ - assert(handle != NULL); - - /* Check if the queue is full */ - if (handle->queue[handle->queueUser].data != NULL) - { - return kStatus_FLEXIO_I2S_QueueFull; - } - if ((xfer->dataSize == 0U) || (xfer->data == NULL)) - { - return kStatus_InvalidArgument; - } - - /* Add into queue */ - handle->queue[handle->queueUser].data = xfer->data; - handle->queue[handle->queueUser].dataSize = xfer->dataSize; - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - - /* Set the state to busy */ - handle->state = (uint32_t)kFLEXIO_I2S_Busy; - - FLEXIO_I2S_EnableInterrupts(base, kFLEXIO_I2S_TxDataRegEmptyInterruptEnable); - - /* Enable Tx transfer */ - FLEXIO_I2S_Enable(base, true); - - return kStatus_Success; -} - -/*! - * brief Performs an interrupt non-blocking receive transfer on FlexIO I2S. - * - * note The API returns immediately after transfer initiates. - * Call FLEXIO_I2S_GetRemainingBytes to poll the transfer status to check whether - * the transfer is finished. If the return status is 0, the transfer is finished. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * param xfer Pointer to flexio_i2s_transfer_t structure - * retval kStatus_Success Successfully start the data receive. - * retval kStatus_FLEXIO_I2S_RxBusy Previous receive still not finished. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t FLEXIO_I2S_TransferReceiveNonBlocking(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_transfer_t *xfer) -{ - assert(handle != NULL); - - /* Check if the queue is full */ - if (handle->queue[handle->queueUser].data != NULL) - { - return kStatus_FLEXIO_I2S_QueueFull; - } - - if ((xfer->dataSize == 0U) || (xfer->data == NULL)) - { - return kStatus_InvalidArgument; - } - - /* Add into queue */ - handle->queue[handle->queueUser].data = xfer->data; - handle->queue[handle->queueUser].dataSize = xfer->dataSize; - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - - /* Set state to busy */ - handle->state = (uint32_t)kFLEXIO_I2S_Busy; - - /* Enable interrupt */ - FLEXIO_I2S_EnableInterrupts(base, kFLEXIO_I2S_RxDataRegFullInterruptEnable); - - /* Enable Rx transfer */ - FLEXIO_I2S_Enable(base, true); - - return kStatus_Success; -} - -/*! - * brief Aborts the current send. - * - * note This API can be called at any time when interrupt non-blocking transfer initiates - * to abort the transfer in a early time. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - */ -void FLEXIO_I2S_TransferAbortSend(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle) -{ - assert(handle != NULL); - - /* Stop Tx transfer and disable interrupt */ - FLEXIO_I2S_DisableInterrupts(base, kFLEXIO_I2S_TxDataRegEmptyInterruptEnable); - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - /* Clear the queue */ - (void)memset(handle->queue, 0, sizeof(flexio_i2s_transfer_t) * FLEXIO_I2S_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Aborts the current receive. - * - * note This API can be called at any time when interrupt non-blocking transfer initiates - * to abort the transfer in a early time. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - */ -void FLEXIO_I2S_TransferAbortReceive(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle) -{ - assert(handle != NULL); - - /* Stop rx transfer and disable interrupt */ - FLEXIO_I2S_DisableInterrupts(base, kFLEXIO_I2S_RxDataRegFullInterruptEnable); - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - /* Clear the queue */ - (void)memset(handle->queue, 0, sizeof(flexio_i2s_transfer_t) * FLEXIO_I2S_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Gets the remaining bytes to be sent. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * param count Bytes sent. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetSendCount(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint8_t queueDriver = handle->queueDriver; - - if (handle->state != (uint32_t)kFLEXIO_I2S_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriver] - handle->queue[queueDriver].dataSize); - } - - return status; -} - -/*! - * brief Gets the remaining bytes to be received. - * - * param base Pointer to FLEXIO_I2S_Type structure. - * param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * return count Bytes received. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetReceiveCount(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint8_t queueDriver = handle->queueDriver; - - if (handle->state != (uint32_t)kFLEXIO_I2S_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriver] - handle->queue[queueDriver].dataSize); - } - - return status; -} - -/*! - * brief Tx interrupt handler. - * - * param i2sBase Pointer to FLEXIO_I2S_Type structure. - * param i2sHandle Pointer to flexio_i2s_handle_t structure - */ -void FLEXIO_I2S_TransferTxHandleIRQ(void *i2sBase, void *i2sHandle) -{ - assert(i2sHandle != NULL); - - flexio_i2s_handle_t *handle = (flexio_i2s_handle_t *)i2sHandle; - FLEXIO_I2S_Type *base = (FLEXIO_I2S_Type *)i2sBase; - uint8_t *buffer = handle->queue[handle->queueDriver].data; - uint8_t dataSize = handle->bitWidth / 8U; - - /* Handle error */ - if ((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->txShifterIndex)) != 0UL) - { - FLEXIO_ClearShifterErrorFlags(base->flexioBase, (1UL << base->txShifterIndex)); - } - /* Handle transfer */ - if (((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_TxDataRegEmptyFlag) != 0UL) && - (handle->queue[handle->queueDriver].data != NULL)) - { - FLEXIO_I2S_WriteNonBlocking(base, handle->bitWidth, buffer, dataSize); - - /* Update internal counter */ - handle->queue[handle->queueDriver].dataSize -= dataSize; - handle->queue[handle->queueDriver].data = - (uint8_t *)((uint32_t)handle->queue[handle->queueDriver].data + dataSize); - } - - /* If finished a block, call the callback function */ - if ((handle->queue[handle->queueDriver].dataSize == 0U) && (handle->queue[handle->queueDriver].data != NULL)) - { - (void)memset(&handle->queue[handle->queueDriver], 0, sizeof(flexio_i2s_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_Success, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->queue[handle->queueDriver].data == NULL) - { - FLEXIO_I2S_TransferAbortSend(base, handle); - } -} - -/*! - * brief Rx interrupt handler. - * - * param i2sBase Pointer to FLEXIO_I2S_Type structure. - * param i2sHandle Pointer to flexio_i2s_handle_t structure. - */ -void FLEXIO_I2S_TransferRxHandleIRQ(void *i2sBase, void *i2sHandle) -{ - assert(i2sHandle != NULL); - - flexio_i2s_handle_t *handle = (flexio_i2s_handle_t *)i2sHandle; - FLEXIO_I2S_Type *base = (FLEXIO_I2S_Type *)i2sBase; - uint8_t *buffer = handle->queue[handle->queueDriver].data; - uint8_t dataSize = handle->bitWidth / 8U; - - /* Handle transfer */ - if (((FLEXIO_I2S_GetStatusFlags(base) & (uint32_t)kFLEXIO_I2S_RxDataRegFullFlag) != 0UL) && - (handle->queue[handle->queueDriver].data != NULL)) - { - FLEXIO_I2S_ReadNonBlocking(base, handle->bitWidth, buffer, dataSize); - - /* Update internal state */ - handle->queue[handle->queueDriver].dataSize -= dataSize; - handle->queue[handle->queueDriver].data = - (uint8_t *)((uint32_t)handle->queue[handle->queueDriver].data + dataSize); - } - - /* If finished a block, call the callback function */ - if ((handle->queue[handle->queueDriver].dataSize == 0U) && (handle->queue[handle->queueDriver].data != NULL)) - { - (void)memset(&handle->queue[handle->queueDriver], 0, sizeof(flexio_i2s_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_Success, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->queue[handle->queueDriver].data == NULL) - { - FLEXIO_I2S_TransferAbortReceive(base, handle); - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2s.h b/devices/MIMXRT1052/drivers/fsl_flexio_i2s.h deleted file mode 100644 index 3497d7c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2s.h +++ /dev/null @@ -1,560 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_I2S_H_ -#define _FSL_FLEXIO_I2S_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" - -/*! - * @addtogroup flexio_i2s - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO I2S driver version 2.2.0. */ -#define FSL_FLEXIO_I2S_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) -/*@}*/ - -/*! @brief Retry times for waiting flag. */ -#ifndef I2S_RETRY_TIMES -#define I2S_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ -#endif - -/*! @brief FlexIO I2S transfer status */ -enum -{ - kStatus_FLEXIO_I2S_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 0), /*!< FlexIO I2S is in idle state */ - kStatus_FLEXIO_I2S_TxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 1), /*!< FlexIO I2S Tx is busy */ - kStatus_FLEXIO_I2S_RxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 2), /*!< FlexIO I2S Tx is busy */ - kStatus_FLEXIO_I2S_Error = MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 3), /*!< FlexIO I2S error occurred */ - kStatus_FLEXIO_I2S_QueueFull = MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 4), /*!< FlexIO I2S transfer queue is full. */ - kStatus_FLEXIO_I2S_Timeout = - MAKE_STATUS(kStatusGroup_FLEXIO_I2S, 5), /*!< FlexIO I2S timeout polling status flags. */ -}; - -/*! @brief Define FlexIO I2S access structure typedef */ -typedef struct _flexio_i2s_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO base pointer */ - uint8_t txPinIndex; /*!< Tx data pin index in FlexIO pins */ - uint8_t rxPinIndex; /*!< Rx data pin index */ - uint8_t bclkPinIndex; /*!< Bit clock pin index */ - uint8_t fsPinIndex; /*!< Frame sync pin index */ - uint8_t txShifterIndex; /*!< Tx data shifter index */ - uint8_t rxShifterIndex; /*!< Rx data shifter index */ - uint8_t bclkTimerIndex; /*!< Bit clock timer index */ - uint8_t fsTimerIndex; /*!< Frame sync timer index */ -} FLEXIO_I2S_Type; - -/*! @brief Master or slave mode */ -typedef enum _flexio_i2s_master_slave -{ - kFLEXIO_I2S_Master = 0x0U, /*!< Master mode */ - kFLEXIO_I2S_Slave = 0x1U /*!< Slave mode */ -} flexio_i2s_master_slave_t; - -/*! @brief _flexio_i2s_interrupt_enable Define FlexIO FlexIO I2S interrupt mask. */ -enum -{ - kFLEXIO_I2S_TxDataRegEmptyInterruptEnable = 0x1U, /*!< Transmit buffer empty interrupt enable. */ - kFLEXIO_I2S_RxDataRegFullInterruptEnable = 0x2U, /*!< Receive buffer full interrupt enable. */ -}; - -/*! @brief _flexio_i2s_status_flags Define FlexIO FlexIO I2S status mask. */ -enum -{ - kFLEXIO_I2S_TxDataRegEmptyFlag = 0x1U, /*!< Transmit buffer empty flag. */ - kFLEXIO_I2S_RxDataRegFullFlag = 0x2U, /*!< Receive buffer full flag. */ -}; - -/*! @brief FlexIO I2S configure structure */ -typedef struct _flexio_i2s_config -{ - bool enableI2S; /*!< Enable FlexIO I2S */ - flexio_i2s_master_slave_t masterSlave; /*!< Master or slave */ - flexio_pin_polarity_t txPinPolarity; /*!< Tx data pin polarity, active high or low */ - flexio_pin_polarity_t rxPinPolarity; /*!< Rx data pin polarity */ - flexio_pin_polarity_t bclkPinPolarity; /*!< Bit clock pin polarity */ - flexio_pin_polarity_t fsPinPolarity; /*!< Frame sync pin polarity */ - flexio_shifter_timer_polarity_t txTimerPolarity; /*!< Tx data valid on bclk rising or falling edge */ - flexio_shifter_timer_polarity_t rxTimerPolarity; /*!< Rx data valid on bclk rising or falling edge */ -} flexio_i2s_config_t; - -/*! @brief FlexIO I2S audio format, FlexIO I2S only support the same format in Tx and Rx */ -typedef struct _flexio_i2s_format -{ - uint8_t bitWidth; /*!< Bit width of audio data, always 8/16/24/32 bits */ - uint32_t sampleRate_Hz; /*!< Sample rate of the audio data */ -} flexio_i2s_format_t; - -/*!@brief FlexIO I2S transfer queue size, user can refine it according to use case. */ -#define FLEXIO_I2S_XFER_QUEUE_SIZE (4U) - -/*! @brief Audio sample rate */ -typedef enum _flexio_i2s_sample_rate -{ - kFLEXIO_I2S_SampleRate8KHz = 8000U, /*!< Sample rate 8000Hz */ - kFLEXIO_I2S_SampleRate11025Hz = 11025U, /*!< Sample rate 11025Hz */ - kFLEXIO_I2S_SampleRate12KHz = 12000U, /*!< Sample rate 12000Hz */ - kFLEXIO_I2S_SampleRate16KHz = 16000U, /*!< Sample rate 16000Hz */ - kFLEXIO_I2S_SampleRate22050Hz = 22050U, /*!< Sample rate 22050Hz */ - kFLEXIO_I2S_SampleRate24KHz = 24000U, /*!< Sample rate 24000Hz */ - kFLEXIO_I2S_SampleRate32KHz = 32000U, /*!< Sample rate 32000Hz */ - kFLEXIO_I2S_SampleRate44100Hz = 44100U, /*!< Sample rate 44100Hz */ - kFLEXIO_I2S_SampleRate48KHz = 48000U, /*!< Sample rate 48000Hz */ - kFLEXIO_I2S_SampleRate96KHz = 96000U /*!< Sample rate 96000Hz */ -} flexio_i2s_sample_rate_t; - -/*! @brief Audio word width */ -typedef enum _flexio_i2s_word_width -{ - kFLEXIO_I2S_WordWidth8bits = 8U, /*!< Audio data width 8 bits */ - kFLEXIO_I2S_WordWidth16bits = 16U, /*!< Audio data width 16 bits */ - kFLEXIO_I2S_WordWidth24bits = 24U, /*!< Audio data width 24 bits */ - kFLEXIO_I2S_WordWidth32bits = 32U /*!< Audio data width 32 bits */ -} flexio_i2s_word_width_t; - -/*! @brief Define FlexIO I2S transfer structure. */ -typedef struct _flexio_i2s_transfer -{ - uint8_t *data; /*!< Data buffer start pointer */ - size_t dataSize; /*!< Bytes to be transferred. */ -} flexio_i2s_transfer_t; - -typedef struct _flexio_i2s_handle flexio_i2s_handle_t; - -/*! @brief FlexIO I2S xfer callback prototype */ -typedef void (*flexio_i2s_callback_t)(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Define FlexIO I2S handle structure. */ -struct _flexio_i2s_handle -{ - uint32_t state; /*!< Internal state */ - flexio_i2s_callback_t callback; /*!< Callback function called at transfer event*/ - void *userData; /*!< Callback parameter passed to callback function*/ - uint8_t bitWidth; /*!< Bit width for transfer, 8/16/24/32bits */ - flexio_i2s_transfer_t queue[FLEXIO_I2S_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */ - size_t transferSize[FLEXIO_I2S_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initializes the FlexIO I2S. - * - * This API configures FlexIO pins and shifter to I2S and configures the FlexIO I2S with a configuration structure. - * The configuration structure can be filled by the user, or be set with default values by - * FLEXIO_I2S_GetDefaultConfig(). - * - * @note This API should be called at the beginning of the application to use - * the FlexIO I2S driver. Otherwise, any access to the FlexIO I2S module can cause hard fault - * because the clock is not enabled. - * - * @param base FlexIO I2S base pointer - * @param config FlexIO I2S configure structure. - */ -void FLEXIO_I2S_Init(FLEXIO_I2S_Type *base, const flexio_i2s_config_t *config); - -/*! - * @brief Sets the FlexIO I2S configuration structure to default values. - * - * The purpose of this API is to get the configuration structure initialized for use in FLEXIO_I2S_Init(). - * Users may use the initialized structure unchanged in FLEXIO_I2S_Init() or modify - * some fields of the structure before calling FLEXIO_I2S_Init(). - * - * @param config pointer to master configuration structure - */ -void FLEXIO_I2S_GetDefaultConfig(flexio_i2s_config_t *config); - -/*! - * @brief De-initializes the FlexIO I2S. - * - * Calling this API resets the FlexIO I2S shifter and timer config. After calling this API, - * call the FLEXO_I2S_Init to use the FlexIO I2S module. - * - * @param base FlexIO I2S base pointer - */ -void FLEXIO_I2S_Deinit(FLEXIO_I2S_Type *base); - -/*! - * @brief Enables/disables the FlexIO I2S module operation. - * - * @param base Pointer to FLEXIO_I2S_Type - * @param enable True to enable, false dose not have any effect. - */ -static inline void FLEXIO_I2S_Enable(FLEXIO_I2S_Type *base, bool enable) -{ - if (enable) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/*! @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the FlexIO I2S status flags. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @return Status flag, which are ORed by the enumerators in the _flexio_i2s_status_flags. - */ -uint32_t FLEXIO_I2S_GetStatusFlags(FLEXIO_I2S_Type *base); - -/*! @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the FlexIO I2S interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @param mask interrupt source - */ -void FLEXIO_I2S_EnableInterrupts(FLEXIO_I2S_Type *base, uint32_t mask); - -/*! - * @brief Disables the FlexIO I2S interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * @param base pointer to FLEXIO_I2S_Type structure - * @param mask interrupt source - */ -void FLEXIO_I2S_DisableInterrupts(FLEXIO_I2S_Type *base, uint32_t mask); - -/*! @} */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO I2S Tx DMA requests. - * - * @param base FlexIO I2S base pointer - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void FLEXIO_I2S_TxEnableDMA(FLEXIO_I2S_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->txShifterIndex, enable); -} - -/*! - * @brief Enables/disables the FlexIO I2S Rx DMA requests. - * - * @param base FlexIO I2S base pointer - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void FLEXIO_I2S_RxEnableDMA(FLEXIO_I2S_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->rxShifterIndex, enable); -} - -/*! - * @brief Gets the FlexIO I2S send data register address. - * - * This function returns the I2S data register address, mainly used by DMA/eDMA. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @return FlexIO i2s send data register address. - */ -static inline uint32_t FLEXIO_I2S_TxGetDataRegisterAddress(FLEXIO_I2S_Type *base) -{ - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, base->txShifterIndex); -} - -/*! - * @brief Gets the FlexIO I2S receive data register address. - * - * This function returns the I2S data register address, mainly used by DMA/eDMA. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @return FlexIO i2s receive data register address. - */ -static inline uint32_t FLEXIO_I2S_RxGetDataRegisterAddress(FLEXIO_I2S_Type *base) -{ - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, base->rxShifterIndex); -} - -/*! @} */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Configures the FlexIO I2S audio format in master mode. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @param format Pointer to FlexIO I2S audio data format structure. - * @param srcClock_Hz I2S master clock source frequency in Hz. - */ -void FLEXIO_I2S_MasterSetFormat(FLEXIO_I2S_Type *base, flexio_i2s_format_t *format, uint32_t srcClock_Hz); - -/*! - * @brief Configures the FlexIO I2S audio format in slave mode. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @param format Pointer to FlexIO I2S audio data format structure. - */ -void FLEXIO_I2S_SlaveSetFormat(FLEXIO_I2S_Type *base, flexio_i2s_format_t *format); - -/*! - * @brief Sends data using a blocking method. - * - * @note This function blocks via polling until data is ready to be sent. - * - * @param base FlexIO I2S base pointer. - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param txData Pointer to the data to be written. - * @param size Bytes to be written. - * @retval kStatus_Success Successfully write data. - * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2S_WriteBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *txData, size_t size); - -/*! - * @brief Writes data into a data register. - * - * @param base FlexIO I2S base pointer. - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param data Data to be written. - */ -static inline void FLEXIO_I2S_WriteData(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint32_t data) -{ - base->flexioBase->SHIFTBUFBIS[base->txShifterIndex] = (data << (32U - bitWidth)); -} - -/*! - * @brief Receives a piece of data using a blocking method. - * - * @note This function blocks via polling until data is ready to be sent. - * - * @param base FlexIO I2S base pointer - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param rxData Pointer to the data to be read. - * @param size Bytes to be read. - * @retval kStatus_Success Successfully read data. - * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. - */ -status_t FLEXIO_I2S_ReadBlocking(FLEXIO_I2S_Type *base, uint8_t bitWidth, uint8_t *rxData, size_t size); - -/*! - * @brief Reads a data from the data register. - * - * @param base FlexIO I2S base pointer - * @return Data read from data register. - */ -static inline uint32_t FLEXIO_I2S_ReadData(FLEXIO_I2S_Type *base) -{ - return base->flexioBase->SHIFTBUFBIS[base->rxShifterIndex]; -} - -/*! @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the FlexIO I2S handle. - * - * This function initializes the FlexIO I2S handle which can be used for other - * FlexIO I2S transactional APIs. Call this API once to get the - * initialized handle. - * - * @param base Pointer to FLEXIO_I2S_Type structure - * @param handle Pointer to flexio_i2s_handle_t structure to store the transfer state. - * @param callback FlexIO I2S callback function, which is called while finished a block. - * @param userData User parameter for the FlexIO I2S callback. - */ -void FLEXIO_I2S_TransferTxCreateHandle(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_callback_t callback, - void *userData); - -/*! - * @brief Configures the FlexIO I2S audio format. - * - * Audio format can be changed at run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle FlexIO I2S handle pointer. - * @param format Pointer to audio data format structure. - * @param srcClock_Hz FlexIO I2S bit clock source frequency in Hz. This parameter should be 0 while in slave mode. - */ -void FLEXIO_I2S_TransferSetFormat(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_format_t *format, - uint32_t srcClock_Hz); - -/*! - * @brief Initializes the FlexIO I2S receive handle. - * - * This function initializes the FlexIO I2S handle which can be used for other - * FlexIO I2S transactional APIs. Call this API once to get the - * initialized handle. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure to store the transfer state. - * @param callback FlexIO I2S callback function, which is called while finished a block. - * @param userData User parameter for the FlexIO I2S callback. - */ -void FLEXIO_I2S_TransferRxCreateHandle(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_callback_t callback, - void *userData); - -/*! - * @brief Performs an interrupt non-blocking send transfer on FlexIO I2S. - * - * @note The API returns immediately after transfer initiates. - * Call FLEXIO_I2S_GetRemainingBytes to poll the transfer status and check whether - * the transfer is finished. If the return status is 0, the transfer is finished. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * @param xfer Pointer to flexio_i2s_transfer_t structure - * @retval kStatus_Success Successfully start the data transmission. - * @retval kStatus_FLEXIO_I2S_TxBusy Previous transmission still not finished, data not all written to TX register yet. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t FLEXIO_I2S_TransferSendNonBlocking(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_transfer_t *xfer); - -/*! - * @brief Performs an interrupt non-blocking receive transfer on FlexIO I2S. - * - * @note The API returns immediately after transfer initiates. - * Call FLEXIO_I2S_GetRemainingBytes to poll the transfer status to check whether - * the transfer is finished. If the return status is 0, the transfer is finished. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * @param xfer Pointer to flexio_i2s_transfer_t structure - * @retval kStatus_Success Successfully start the data receive. - * @retval kStatus_FLEXIO_I2S_RxBusy Previous receive still not finished. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t FLEXIO_I2S_TransferReceiveNonBlocking(FLEXIO_I2S_Type *base, - flexio_i2s_handle_t *handle, - flexio_i2s_transfer_t *xfer); - -/*! - * @brief Aborts the current send. - * - * @note This API can be called at any time when interrupt non-blocking transfer initiates - * to abort the transfer in a early time. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - */ -void FLEXIO_I2S_TransferAbortSend(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle); - -/*! - * @brief Aborts the current receive. - * - * @note This API can be called at any time when interrupt non-blocking transfer initiates - * to abort the transfer in a early time. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - */ -void FLEXIO_I2S_TransferAbortReceive(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle); - -/*! - * @brief Gets the remaining bytes to be sent. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * @param count Bytes sent. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetSendCount(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle, size_t *count); - -/*! - * @brief Gets the remaining bytes to be received. - * - * @param base Pointer to FLEXIO_I2S_Type structure. - * @param handle Pointer to flexio_i2s_handle_t structure which stores the transfer state - * @param count Bytes recieved. - * @return count Bytes received. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetReceiveCount(FLEXIO_I2S_Type *base, flexio_i2s_handle_t *handle, size_t *count); - -/*! - * @brief Tx interrupt handler. - * - * @param i2sBase Pointer to FLEXIO_I2S_Type structure. - * @param i2sHandle Pointer to flexio_i2s_handle_t structure - */ -void FLEXIO_I2S_TransferTxHandleIRQ(void *i2sBase, void *i2sHandle); - -/*! - * @brief Rx interrupt handler. - * - * @param i2sBase Pointer to FLEXIO_I2S_Type structure. - * @param i2sHandle Pointer to flexio_i2s_handle_t structure. - */ -void FLEXIO_I2S_TransferRxHandleIRQ(void *i2sBase, void *i2sHandle); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ - -/*! @} */ - -#endif /* _FSL_FLEXIO_I2S_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c b/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c deleted file mode 100644 index faa1541..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.c +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_i2s_edma.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_i2s_edma" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ -/* Used for 32byte aligned */ -#define STCD_ADDR(address) (edma_tcd_t *)(((uint32_t)(address) + 32U) & ~0x1FU) - -/*handle; - - /* If finished a block, call the callback function */ - (void)memset(&flexio_i2sHandle->queue[flexio_i2sHandle->queueDriver], 0, sizeof(flexio_i2s_transfer_t)); - flexio_i2sHandle->queueDriver = (flexio_i2sHandle->queueDriver + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - if (flexio_i2sHandle->callback != NULL) - { - (flexio_i2sHandle->callback)(privHandle->base, flexio_i2sHandle, kStatus_Success, flexio_i2sHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (flexio_i2sHandle->queue[flexio_i2sHandle->queueDriver].data == NULL) - { - FLEXIO_I2S_TransferAbortSendEDMA(privHandle->base, flexio_i2sHandle); - } -} - -static void FLEXIO_I2S_RxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds) -{ - flexio_i2s_edma_private_handle_t *privHandle = (flexio_i2s_edma_private_handle_t *)userData; - flexio_i2s_edma_handle_t *flexio_i2sHandle = privHandle->handle; - - /* If finished a block, call the callback function */ - (void)memset(&flexio_i2sHandle->queue[flexio_i2sHandle->queueDriver], 0, sizeof(flexio_i2s_transfer_t)); - flexio_i2sHandle->queueDriver = (flexio_i2sHandle->queueDriver + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - if (flexio_i2sHandle->callback != NULL) - { - (flexio_i2sHandle->callback)(privHandle->base, flexio_i2sHandle, kStatus_Success, flexio_i2sHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (flexio_i2sHandle->queue[flexio_i2sHandle->queueDriver].data == NULL) - { - FLEXIO_I2S_TransferAbortReceiveEDMA(privHandle->base, flexio_i2sHandle); - } -} - -/*! - * brief Initializes the FlexIO I2S eDMA handle. - * - * This function initializes the FlexIO I2S master DMA handle which can be used for other FlexIO I2S master - * transactional APIs. - * Usually, for a specified FlexIO I2S instance, call this API once to get the initialized handle. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S eDMA handle pointer. - * param callback FlexIO I2S eDMA callback function called while finished a block. - * param userData User parameter for callback. - * param dmaHandle eDMA handle for FlexIO I2S. This handle is a static value allocated by users. - */ -void FLEXIO_I2S_TransferTxCreateHandleEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_edma_callback_t callback, - void *userData, - edma_handle_t *dmaHandle) -{ - assert((handle != NULL) && (dmaHandle != NULL)); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set flexio_i2s base to handle */ - handle->dmaHandle = dmaHandle; - handle->callback = callback; - handle->userData = userData; - - /* Set FLEXIO I2S state to idle */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - s_edmaPrivateHandle[0].base = base; - s_edmaPrivateHandle[0].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), FLEXIO_I2S_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel */ - EDMA_SetCallback(dmaHandle, FLEXIO_I2S_TxEDMACallback, &s_edmaPrivateHandle[0]); -} - -/*! - * brief Initializes the FlexIO I2S Rx eDMA handle. - * - * This function initializes the FlexIO I2S slave DMA handle which can be used for other FlexIO I2S master transactional - * APIs. - * Usually, for a specified FlexIO I2S instance, call this API once to get the initialized handle. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S eDMA handle pointer. - * param callback FlexIO I2S eDMA callback function called while finished a block. - * param userData User parameter for callback. - * param dmaHandle eDMA handle for FlexIO I2S. This handle is a static value allocated by users. - */ -void FLEXIO_I2S_TransferRxCreateHandleEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_edma_callback_t callback, - void *userData, - edma_handle_t *dmaHandle) -{ - assert((handle != NULL) && (dmaHandle != NULL)); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set flexio_i2s base to handle */ - handle->dmaHandle = dmaHandle; - handle->callback = callback; - handle->userData = userData; - - /* Set FLEXIO I2S state to idle */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; - - s_edmaPrivateHandle[1].base = base; - s_edmaPrivateHandle[1].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(dmaHandle, STCD_ADDR(handle->tcd), FLEXIO_I2S_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel */ - EDMA_SetCallback(dmaHandle, FLEXIO_I2S_RxEDMACallback, &s_edmaPrivateHandle[1]); -} - -/*! - * brief Configures the FlexIO I2S Tx audio format. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to format. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S eDMA handle pointer - * param format Pointer to FlexIO I2S audio data format structure. - * param srcClock_Hz FlexIO I2S clock source frequency in Hz, it should be 0 while in slave mode. - */ -void FLEXIO_I2S_TransferSetFormatEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_format_t *format, - uint32_t srcClock_Hz) -{ - assert((handle != NULL) && (format != NULL)); - - /* Configure the audio format to FLEXIO I2S registers */ - if (srcClock_Hz != 0UL) - { - /* It is master */ - FLEXIO_I2S_MasterSetFormat(base, format, srcClock_Hz); - } - else - { - FLEXIO_I2S_SlaveSetFormat(base, format); - } - - /* Get the transfer size from format, this should be used in EDMA configuration */ - handle->bytesPerFrame = format->bitWidth / 8U; -} - -/*! - * brief Performs a non-blocking FlexIO I2S transfer using DMA. - * - * note This interface returned immediately after transfer initiates. Users should call - * FLEXIO_I2S_GetTransferStatus to poll the transfer status and check whether the FlexIO I2S transfer is finished. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - * param xfer Pointer to DMA transfer structure. - * retval kStatus_Success Start a FlexIO I2S eDMA send successfully. - * retval kStatus_InvalidArgument The input arguments is invalid. - * retval kStatus_TxBusy FlexIO I2S is busy sending data. - */ -status_t FLEXIO_I2S_TransferSendEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_transfer_t *xfer) -{ - assert((handle != NULL) && (xfer != NULL)); - - edma_transfer_config_t config = {0}; - uint32_t destAddr = FLEXIO_I2S_TxGetDataRegisterAddress(base) + (4UL - handle->bytesPerFrame); - - /* Check if input parameter invalid */ - if ((xfer->data == NULL) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - if (handle->queue[handle->queueUser].data != NULL) - { - return kStatus_FLEXIO_I2S_QueueFull; - } - - /* Change the state of handle */ - handle->state = (uint32_t)kFLEXIO_I2S_Busy; - - /* Update the queue state */ - handle->queue[handle->queueUser].data = xfer->data; - handle->queue[handle->queueUser].dataSize = xfer->dataSize; - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, xfer->data, handle->bytesPerFrame, (uint32_t *)destAddr, handle->bytesPerFrame, - handle->bytesPerFrame, xfer->dataSize, kEDMA_MemoryToPeripheral); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO I2S handle */ - handle->nbytes = handle->bytesPerFrame; - - (void)EDMA_SubmitTransfer(handle->dmaHandle, &config); - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaHandle); - - /* Enable DMA enable bit */ - FLEXIO_I2S_TxEnableDMA(base, true); - - /* Enable FLEXIO I2S Tx clock */ - FLEXIO_I2S_Enable(base, true); - - return kStatus_Success; -} - -/*! - * brief Performs a non-blocking FlexIO I2S receive using eDMA. - * - * note This interface returned immediately after transfer initiates. Users should call - * FLEXIO_I2S_GetReceiveRemainingBytes to poll the transfer status and check whether the FlexIO I2S transfer is - * finished. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - * param xfer Pointer to DMA transfer structure. - * retval kStatus_Success Start a FlexIO I2S eDMA receive successfully. - * retval kStatus_InvalidArgument The input arguments is invalid. - * retval kStatus_RxBusy FlexIO I2S is busy receiving data. - */ -status_t FLEXIO_I2S_TransferReceiveEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_transfer_t *xfer) -{ - assert((handle != NULL) && (xfer != NULL)); - - edma_transfer_config_t config = {0}; - uint32_t srcAddr = FLEXIO_I2S_RxGetDataRegisterAddress(base); - - /* Check if input parameter invalid */ - if ((xfer->data == NULL) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - if (handle->queue[handle->queueUser].data != NULL) - { - return kStatus_FLEXIO_I2S_QueueFull; - } - - /* Change the state of handle */ - handle->state = (uint32_t)kFLEXIO_I2S_Busy; - - /* Update queue state */ - handle->queue[handle->queueUser].data = xfer->data; - handle->queue[handle->queueUser].dataSize = xfer->dataSize; - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % FLEXIO_I2S_XFER_QUEUE_SIZE; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, (uint32_t *)srcAddr, handle->bytesPerFrame, xfer->data, handle->bytesPerFrame, - handle->bytesPerFrame, xfer->dataSize, kEDMA_PeripheralToMemory); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO I2S handle */ - handle->nbytes = handle->bytesPerFrame; - - (void)EDMA_SubmitTransfer(handle->dmaHandle, &config); - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaHandle); - - /* Enable DMA enable bit */ - FLEXIO_I2S_RxEnableDMA(base, true); - - /* Enable FLEXIO I2S Rx clock */ - FLEXIO_I2S_Enable(base, true); - - return kStatus_Success; -} - -/*! - * brief Aborts a FlexIO I2S transfer using eDMA. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - */ -void FLEXIO_I2S_TransferAbortSendEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaHandle); - - /* Disable DMA enable bit */ - FLEXIO_I2S_TxEnableDMA(base, false); - - /* Set the handle state */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; -} - -/*! - * brief Aborts a FlexIO I2S receive using eDMA. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - */ -void FLEXIO_I2S_TransferAbortReceiveEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaHandle); - - /* Disable DMA enable bit */ - FLEXIO_I2S_RxEnableDMA(base, false); - - /* Set the handle state */ - handle->state = (uint32_t)kFLEXIO_I2S_Idle; -} - -/*! - * brief Gets the remaining bytes to be sent. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - * param count Bytes sent. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetSendCountEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kFLEXIO_I2S_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel); - } - - return status; -} - -/*! - * brief Get the remaining bytes to be received. - * - * param base FlexIO I2S peripheral base address. - * param handle FlexIO I2S DMA handle pointer. - * param count Bytes received. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetReceiveCountEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kFLEXIO_I2S_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel); - } - - return status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.h b/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.h deleted file mode 100644 index a3a0ef1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_i2s_edma.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_I2S_EDMA_H_ -#define _FSL_FLEXIO_I2S_EDMA_H_ - -#include "fsl_flexio_i2s.h" -#include "fsl_edma.h" - -/*! - * @addtogroup flexio_edma_i2s - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO I2S EDMA driver version 2.1.7. */ -#define FSL_FLEXIO_I2S_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 1, 7)) -/*@}*/ - -typedef struct _flexio_i2s_edma_handle flexio_i2s_edma_handle_t; - -/*! @brief FlexIO I2S eDMA transfer callback function for finish and error */ -typedef void (*flexio_i2s_edma_callback_t)(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief FlexIO I2S DMA transfer handle, users should not touch the content of the handle.*/ -struct _flexio_i2s_edma_handle -{ - edma_handle_t *dmaHandle; /*!< DMA handler for FlexIO I2S send */ - uint8_t bytesPerFrame; /*!< Bytes in a frame */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - uint32_t state; /*!< Internal state for FlexIO I2S eDMA transfer */ - flexio_i2s_edma_callback_t callback; /*!< Callback for users while transfer finish or error occurred */ - void *userData; /*!< User callback parameter */ - edma_tcd_t tcd[FLEXIO_I2S_XFER_QUEUE_SIZE + 1U]; /*!< TCD pool for eDMA transfer. */ - flexio_i2s_transfer_t queue[FLEXIO_I2S_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ - size_t transferSize[FLEXIO_I2S_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer. */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the FlexIO I2S eDMA handle. - * - * This function initializes the FlexIO I2S master DMA handle which can be used for other FlexIO I2S master - * transactional APIs. - * Usually, for a specified FlexIO I2S instance, call this API once to get the initialized handle. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S eDMA handle pointer. - * @param callback FlexIO I2S eDMA callback function called while finished a block. - * @param userData User parameter for callback. - * @param dmaHandle eDMA handle for FlexIO I2S. This handle is a static value allocated by users. - */ -void FLEXIO_I2S_TransferTxCreateHandleEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_edma_callback_t callback, - void *userData, - edma_handle_t *dmaHandle); - -/*! - * @brief Initializes the FlexIO I2S Rx eDMA handle. - * - * This function initializes the FlexIO I2S slave DMA handle which can be used for other FlexIO I2S master transactional - * APIs. - * Usually, for a specified FlexIO I2S instance, call this API once to get the initialized handle. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S eDMA handle pointer. - * @param callback FlexIO I2S eDMA callback function called while finished a block. - * @param userData User parameter for callback. - * @param dmaHandle eDMA handle for FlexIO I2S. This handle is a static value allocated by users. - */ -void FLEXIO_I2S_TransferRxCreateHandleEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_edma_callback_t callback, - void *userData, - edma_handle_t *dmaHandle); - -/*! - * @brief Configures the FlexIO I2S Tx audio format. - * - * Audio format can be changed in run-time of FlexIO I2S. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to format. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S eDMA handle pointer - * @param format Pointer to FlexIO I2S audio data format structure. - * @param srcClock_Hz FlexIO I2S clock source frequency in Hz, it should be 0 while in slave mode. - */ -void FLEXIO_I2S_TransferSetFormatEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_format_t *format, - uint32_t srcClock_Hz); - -/*! - * @brief Performs a non-blocking FlexIO I2S transfer using DMA. - * - * @note This interface returned immediately after transfer initiates. Users should call - * FLEXIO_I2S_GetTransferStatus to poll the transfer status and check whether the FlexIO I2S transfer is finished. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - * @param xfer Pointer to DMA transfer structure. - * @retval kStatus_Success Start a FlexIO I2S eDMA send successfully. - * @retval kStatus_InvalidArgument The input arguments is invalid. - * @retval kStatus_TxBusy FlexIO I2S is busy sending data. - */ -status_t FLEXIO_I2S_TransferSendEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_transfer_t *xfer); - -/*! - * @brief Performs a non-blocking FlexIO I2S receive using eDMA. - * - * @note This interface returned immediately after transfer initiates. Users should call - * FLEXIO_I2S_GetReceiveRemainingBytes to poll the transfer status and check whether the FlexIO I2S transfer is - * finished. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - * @param xfer Pointer to DMA transfer structure. - * @retval kStatus_Success Start a FlexIO I2S eDMA receive successfully. - * @retval kStatus_InvalidArgument The input arguments is invalid. - * @retval kStatus_RxBusy FlexIO I2S is busy receiving data. - */ -status_t FLEXIO_I2S_TransferReceiveEDMA(FLEXIO_I2S_Type *base, - flexio_i2s_edma_handle_t *handle, - flexio_i2s_transfer_t *xfer); - -/*! - * @brief Aborts a FlexIO I2S transfer using eDMA. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - */ -void FLEXIO_I2S_TransferAbortSendEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle); - -/*! - * @brief Aborts a FlexIO I2S receive using eDMA. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - */ -void FLEXIO_I2S_TransferAbortReceiveEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle); - -/*! - * @brief Gets the remaining bytes to be sent. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - * @param count Bytes sent. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetSendCountEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle, size_t *count); - -/*! - * @brief Get the remaining bytes to be received. - * - * @param base FlexIO I2S peripheral base address. - * @param handle FlexIO I2S DMA handle pointer. - * @param count Bytes received. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXIO_I2S_TransferGetReceiveCountEDMA(FLEXIO_I2S_Type *base, flexio_i2s_edma_handle_t *handle, size_t *count); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c b/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c deleted file mode 100644 index 5db3141..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.c +++ /dev/null @@ -1,1295 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_mculcd.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_mculcd" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ - -enum _mculcd_transfer_state -{ - kFLEXIO_MCULCD_StateIdle, /*!< No transfer in progress. */ - kFLEXIO_MCULCD_StateReadArray, /*!< Reading array in progress. */ - kFLEXIO_MCULCD_StateWriteArray, /*!< Writing array in progress. */ - kFLEXIO_MCULCD_StateWriteSameValue, /*!< Writing the same value in progress. */ -}; - -/* The TIMCFG[0:7] is used for baud rate divider in dual 8-bit counters baud/bit mode. */ -#define FLEXIO_BAUDRATE_DIV_MASK 0xFFU - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, configures the - * FlexIO MCULCD hardware, and configures the FlexIO MCULCD with FlexIO MCULCD - * configuration. - * The configuration structure can be filled by the user, or be set with default - * values - * by the ref FLEXIO_MCULCD_GetDefaultConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param config Pointer to the flexio_mculcd_config_t structure. - * param srcClock_Hz FlexIO source clock in Hz. - * retval kStatus_Success Initialization success. - * retval kStatus_InvalidArgument Initialization failed because of invalid - * argument. - */ -status_t FLEXIO_MCULCD_Init(FLEXIO_MCULCD_Type *base, flexio_mculcd_config_t *config, uint32_t srcClock_Hz) -{ - assert(NULL != config); - - flexio_config_t flexioConfig = {config->enable, config->enableInDoze, config->enableInDebug, - config->enableFastAccess}; - - FLEXIO_Init(base->flexioBase, &flexioConfig); - - if (kStatus_Success != FLEXIO_MCULCD_SetBaudRate(base, config->baudRate_Bps, srcClock_Hz)) - { - return kStatus_Success; - } - - base->setCSPin(true); - base->setRSPin(true); - - return kStatus_Success; -} - -/*! - * brief Resets the FLEXIO_MCULCD timer and shifter configuration. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - */ -void FLEXIO_MCULCD_Deinit(FLEXIO_MCULCD_Type *base) -{ - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); - FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); -} - -/*! - * brief Gets the default configuration to configure the FlexIO MCULCD. - * - * The default configuration value is: - * code - * config->enable = true; - * config->enableInDoze = false; - * config->enableInDebug = true; - * config->enableFastAccess = true; - * config->baudRate_Bps = 96000000U; - * endcode - * param Config Pointer to the flexio_mculcd_config_t structure. - */ -void FLEXIO_MCULCD_GetDefaultConfig(flexio_mculcd_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enable = true; - config->enableInDoze = false; - config->enableInDebug = true; - config->enableFastAccess = true; - config->baudRate_Bps = 96000000U; -} - -/*! - * brief Set desired baud rate. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param baudRate_Bps Desired baud rate. - * param srcClock_Hz FLEXIO clock frequency in Hz. - * retval kStatus_Success Set successfully. - * retval kStatus_InvalidArgument Could not set the baud rate. - */ -status_t FLEXIO_MCULCD_SetBaudRate(FLEXIO_MCULCD_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) -{ - uint32_t baudRateDiv; - uint32_t baudRatePerDataLine; - uint32_t timerCompare; - status_t status; - - baudRatePerDataLine = baudRate_Bps / (uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH; - - baudRateDiv = (srcClock_Hz + baudRatePerDataLine) / (baudRatePerDataLine * 2U); - - if ((0U == baudRateDiv) || (baudRateDiv > (FLEXIO_BAUDRATE_DIV_MASK + 1U))) - { - status = kStatus_InvalidArgument; - } - else - { - baudRateDiv--; - - timerCompare = base->flexioBase->TIMCMP[base->timerIndex]; - - timerCompare = (timerCompare & ~FLEXIO_BAUDRATE_DIV_MASK) | baudRateDiv; - - base->flexioBase->TIMCMP[base->timerIndex] = timerCompare; - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Gets FlexIO MCULCD status flags. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * return status flag; OR'ed value or the ref _flexio_mculcd_status_flags. - * - * note Don't use this function with DMA APIs. - */ -uint32_t FLEXIO_MCULCD_GetStatusFlags(FLEXIO_MCULCD_Type *base) -{ - uint32_t ret = 0U; - uint32_t flags; - - /* Get shifter status. */ - flags = FLEXIO_GetShifterStatusFlags(base->flexioBase); - - if (0U != (flags & (1UL << base->rxShifterEndIndex))) - { - ret |= (uint32_t)kFLEXIO_MCULCD_RxFullFlag; - } - - if (0U != (flags & (1UL << base->txShifterStartIndex))) - { - ret |= (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag; - } - - return ret; -} - -/*! - * brief Clears FlexIO MCULCD status flags. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param mask Status to clear, it is the OR'ed value of ref - * _flexio_mculcd_status_flags. - * - * note Don't use this function with DMA APIs. - */ -void FLEXIO_MCULCD_ClearStatusFlags(FLEXIO_MCULCD_Type *base, uint32_t mask) -{ - uint32_t flags = 0U; - - /* Clear the shifter flags. */ - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) - { - flags |= (1UL << base->rxShifterEndIndex); - } - - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) - { - flags |= (1UL << base->txShifterStartIndex); - } - - FLEXIO_ClearShifterStatusFlags(base->flexioBase, flags); -} - -/*! - * brief Enables the FlexIO MCULCD interrupt. - * - * This function enables the FlexIO MCULCD interrupt. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param mask Interrupts to enable, it is the OR'ed value of ref - * _flexio_mculcd_interrupt_enable. - */ -void FLEXIO_MCULCD_EnableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask) -{ - uint32_t interrupts = 0U; - - /* Enable shifter interrupts. */ - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) - { - interrupts |= (1UL << base->rxShifterEndIndex); - } - - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) - { - interrupts |= (1UL << base->txShifterStartIndex); - } - - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, interrupts); -} - -/*! - * brief Disables the FlexIO MCULCD interrupt. - * - * This function disables the FlexIO MCULCD interrupt. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param mask Interrupts to disable, it is the OR'ed value of ref - * _flexio_mculcd_interrupt_enable. - */ -void FLEXIO_MCULCD_DisableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask) -{ - uint32_t interrupts = 0U; - - /* Disable shifter interrupts. */ - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) - { - interrupts |= (1UL << base->rxShifterEndIndex); - } - - if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) - { - interrupts |= (1UL << base->txShifterStartIndex); - } - - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, interrupts); -} - -/*! - * brief Read data from the FLEXIO MCULCD RX shifter buffer. - * - * Read data from the RX shift buffer directly, it does no check whether the - * buffer is empty or not. - * - * If the data bus width is 8-bit: - * code - * uint8_t value; - * value = (uint8_t)FLEXIO_MCULCD_ReadData(base); - * endcode - * - * If the data bus width is 16-bit: - * code - * uint16_t value; - * value = (uint16_t)FLEXIO_MCULCD_ReadData(base); - * endcode - * - * note This function returns the RX shifter buffer value (32-bit) directly. - * The return value should be converted according to data bus width. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * return The data read out. - * - * note Don't use this function with DMA APIs. - */ -uint32_t FLEXIO_MCULCD_ReadData(FLEXIO_MCULCD_Type *base) -{ -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - return base->flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; -#else - return base->flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; -#endif -} - -/*! - * brief Configures the FLEXIO MCULCD to multiple beats write mode. - * - * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to - * multiple beats write mode using this function. After write operation, the configuration - * is cleared by ref FLEXIO_MCULCD_ClearSingleBeatWriteConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base) -{ - /* - * This function will be called at the beginning of every data writing. For - * performance consideration, it access the FlexIO registers directly, but not - * call FlexIO driver APIs. - */ - - uint32_t timerCompare; - - /* Enable the TX Shifter output. */ - base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = - FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | - FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); - - base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutput) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); - - timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; - - /* - * TIMCMP[15:8] = (number of beats x 2) - 1. Because the number of beat is 1, - * so the TIMCMP[15:8] is 1. - */ - base->flexioBase->TIMCMP[base->timerIndex] = (1UL << 8U) | timerCompare; - - /* Use TX shifter flag as the inverted timer trigger. Timer output to WR/EN pin. */ - base->flexioBase->TIMCFG[base->timerIndex] = - FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | - FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | - FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | - FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled) | - FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); - - base->flexioBase->TIMCTL[base->timerIndex] = - FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->txShifterStartIndex)) | - FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | - FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | - FLEXIO_TIMCTL_PINSEL(base->ENWRPinIndex) | FLEXIO_TIMCTL_PINPOL(kFLEXIO_PinActiveLow) | - FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); -} - -/*! - * brief Clear the FLEXIO MCULCD multiple beats write mode configuration. - * - * Clear the write configuration set by ref FLEXIO_MCULCD_SetSingleBeatWriteConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base) -{ - /* Disable the timer. */ - base->flexioBase->TIMCTL[base->timerIndex] = 0U; - base->flexioBase->TIMCFG[base->timerIndex] = 0U; - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex); - /* Stop the TX shifter. */ - base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = 0U; - base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = 0U; - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = (1UL << base->txShifterStartIndex); -} - -/*! - * brief Configures the FLEXIO MCULCD to multiple beats read mode. - * - * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured - * to multiple beats read mode using this function. After read operation, the configuration - * is cleared by ref FLEXIO_MCULCD_ClearSingleBeatReadConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetSingleBeatReadConfig(FLEXIO_MCULCD_Type *base) -{ - /* - * This function will be called at the beginning of every data reading. For - * performance consideration, it access the FlexIO registers directly, but not - * call FlexIO driver APIs. - */ - - uint8_t timerPin; - uint32_t timerCompare; - flexio_pin_polarity_t timerPinPolarity; - - /* Timer output to RD pin (8080 mode), to WR/EN pin in 6800 mode. */ - if (kFLEXIO_MCULCD_8080 == base->busType) - { - timerPin = base->RDPinIndex; - timerPinPolarity = kFLEXIO_PinActiveLow; - } - else - { - timerPin = base->ENWRPinIndex; - timerPinPolarity = kFLEXIO_PinActiveHigh; - } - - /* Enable the RX Shifter input. */ - base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = - FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U); - - base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); - - /* Use RX shifter flag as the inverted timer trigger. */ - base->flexioBase->TIMCFG[base->timerIndex] = - FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | - FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | - FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | - FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | - FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable) | - FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); - - timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; - - /* - * TIMCMP[15:8] = (number of beats x 2) - 1. Because the number of beat is 1, - * so the TIMCMP[15:8] is 1. - */ - base->flexioBase->TIMCMP[base->timerIndex] = (1UL << 8U) | timerCompare; - - base->flexioBase->TIMCTL[base->timerIndex] |= - FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->rxShifterEndIndex)) | - FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | - FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | - FLEXIO_TIMCTL_PINSEL(timerPin) | FLEXIO_TIMCTL_PINPOL(timerPinPolarity) | - FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); -} - -/*! - * brief Clear the FLEXIO MCULCD multiple beats read mode configuration. - * - * Clear the read configuration set by ref FLEXIO_MCULCD_SetSingleBeatReadConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearSingleBeatReadConfig(FLEXIO_MCULCD_Type *base) -{ - /* Disable the timer. */ - base->flexioBase->TIMCTL[base->timerIndex] = 0U; - base->flexioBase->TIMCFG[base->timerIndex] = 0U; - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex); - /* Stop the RX shifter. */ - base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = 0U; - base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = 0U; - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = (1UL << base->rxShifterEndIndex); -} - -/*! - * brief Configures the FLEXIO MCULCD to multiple beats write mode. - * - * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to - * multiple beats write mode using this function. After write operation, the configuration - * is cleared by ref FLEXIO_MCULCD_ClearMultBeatsWriteConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base) -{ - /* - * This function will be called at the beginning of every data writing. For - * performance consideration, it access the FlexIO registers directly, but not - * call FlexIO driver APIs. - */ - - uint32_t timerCompare; - uint8_t beats; - uint8_t i; - - /* Enable the TX Shifter output. */ - base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = - FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | - FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); - - base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutput) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); - - for (i = base->txShifterStartIndex + 1U; i <= base->txShifterEndIndex; i++) - { - base->flexioBase->SHIFTCFG[i] = FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | - FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); - - base->flexioBase->SHIFTCTL[i] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(0) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); - } - - timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; - -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - beats = 4U * (base->txShifterEndIndex - base->txShifterStartIndex + 1U); -#else - beats = 2U * (base->txShifterEndIndex - base->txShifterStartIndex + 1U); -#endif - - /* - * TIMCMP[15:8] = (number of beats x 2) - 1. - */ - base->flexioBase->TIMCMP[base->timerIndex] = ((beats * 2UL - 1UL) << 8U) | timerCompare; - - /* Use TX shifter flag as the inverted timer trigger. Timer output to WR/EN pin. */ - base->flexioBase->TIMCFG[base->timerIndex] = - FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | - FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | - FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | - FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled) | - FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); - - base->flexioBase->TIMCTL[base->timerIndex] = - FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->txShifterEndIndex)) | - FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | - FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | - FLEXIO_TIMCTL_PINSEL(base->ENWRPinIndex) | FLEXIO_TIMCTL_PINPOL(kFLEXIO_PinActiveLow) | - FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); -} - -/*! - * brief Clear the FLEXIO MCULCD multiple beats write mode configuration. - * - * Clear the write configuration set by ref FLEXIO_MCULCD_SetMultBeatsWriteConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base) -{ - uint8_t i; - uint32_t statusFlags = 0U; - - /* Disable the timer. */ - base->flexioBase->TIMCTL[base->timerIndex] = 0U; - base->flexioBase->TIMCFG[base->timerIndex] = 0U; - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex); - - /* Stop the TX shifter. */ - for (i = base->txShifterStartIndex; i <= base->txShifterEndIndex; i++) - { - base->flexioBase->SHIFTCFG[i] = 0U; - base->flexioBase->SHIFTCTL[i] = 0U; - statusFlags |= (1UL << i); - } - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = statusFlags; -} - -/*! - * brief Configures the FLEXIO MCULCD to multiple beats read mode. - * - * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured - * to multiple beats read mode using this function. After read operation, the configuration - * is cleared by ref FLEXIO_MCULCD_ClearMultBeatsReadConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base) -{ - /* - * This function will be called at the beginning of every data reading. For - * performance consideration, it access the FlexIO registers directly, but not - * call FlexIO driver APIs. - */ - - uint8_t timerPin; - uint8_t beats; - uint8_t i; - uint32_t timerCompare; - flexio_pin_polarity_t timerPinPolarity; - - /* Timer output to RD pin (8080 mode), to WR/EN pin in 6800 mode. */ - if (kFLEXIO_MCULCD_8080 == base->busType) - { - timerPin = base->RDPinIndex; - timerPinPolarity = kFLEXIO_PinActiveLow; - } - else - { - timerPin = base->ENWRPinIndex; - timerPinPolarity = kFLEXIO_PinActiveHigh; - } - - /* Enable the RX Shifter input. */ - for (i = base->rxShifterStartIndex; i < base->rxShifterEndIndex; i++) - { - base->flexioBase->SHIFTCFG[i] = FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | - FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); - - base->flexioBase->SHIFTCTL[i] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); - } - - base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = - FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U); - base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = - FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | - FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | - FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); - - timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; - -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - beats = 4U * (base->rxShifterEndIndex - base->rxShifterStartIndex + 1U); -#else - beats = 2U * (base->rxShifterEndIndex - base->rxShifterStartIndex + 1U); -#endif - - /* - * TIMCMP[15:8] = (number of beats x 2) - 1. - */ - base->flexioBase->TIMCMP[base->timerIndex] = ((beats * 2UL - 1UL) << 8U) | timerCompare; - - /* Use RX shifter flag as the inverted timer trigger. */ - base->flexioBase->TIMCFG[base->timerIndex] = - FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | - FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | - FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | - FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | - FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable) | - FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); - - base->flexioBase->TIMCTL[base->timerIndex] |= - FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->rxShifterEndIndex)) | - FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | - FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | - FLEXIO_TIMCTL_PINSEL(timerPin) | FLEXIO_TIMCTL_PINPOL(timerPinPolarity) | - FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); -} - -/*! - * brief Clear the FLEXIO MCULCD multiple beats read mode configuration. - * - * Clear the read configuration set by ref FLEXIO_MCULCD_SetMultBeatsReadConfig. - * - * param base Pointer to the FLEXIO_MCULCD_Type. - * - * note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base) -{ - uint8_t i; - uint32_t statusFlags = 0U; - - /* Disable the timer. */ - base->flexioBase->TIMCTL[base->timerIndex] = 0U; - base->flexioBase->TIMCFG[base->timerIndex] = 0U; - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex); - /* Stop the RX shifter. */ - for (i = base->rxShifterStartIndex; i <= base->rxShifterEndIndex; i++) - { - base->flexioBase->SHIFTCTL[i] = 0U; - base->flexioBase->SHIFTCFG[i] = 0U; - statusFlags |= (1UL << i); - } - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = statusFlags; -} - -/*! - * brief Wait for transmit data send out finished. - * - * Currently there is no effective method to wait for the data send out - * from the shiter, so here use a while loop to wait. - * - * note This is an internal used function. - */ -void FLEXIO_MCULCD_WaitTransmitComplete(void) -{ - uint32_t i = FLEXIO_MCULCD_WAIT_COMPLETE_TIME; - - while (0U != (i--)) - { - __NOP(); - } -} - -/*! - * brief Send command in blocking way. - * - * This function sends the command and returns when the command has been sent - * out. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param command The command to send. - */ -void FLEXIO_MCULCD_WriteCommandBlocking(FLEXIO_MCULCD_Type *base, uint32_t command) -{ - FLEXIO_Type *flexioBase = base->flexioBase; - - /* De-assert the RS pin. */ - base->setRSPin(false); - - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - - /* Configure the timer and TX shifter. */ - FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); - - /* Write command to shifter buffer. */ - flexioBase->SHIFTBUF[base->txShifterStartIndex] = command; - - /* Wait for command send out. */ - while (0U == ((1UL << base->timerIndex) & FLEXIO_GetTimerStatusFlags(flexioBase))) - { - } - - /* Stop the timer and TX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); - - /* Assert the RS pin. */ - base->setRSPin(true); - /* For 6800, assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(true); - } -} - -/*! - * brief Send data array in blocking way. - * - * This function sends the data array and returns when the data sent out. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param data The data array to send. - * param size How many bytes to write. - */ -void FLEXIO_MCULCD_WriteDataArrayBlocking(FLEXIO_MCULCD_Type *base, const void *data, size_t size) -{ - assert(size > 0U); - - uint32_t i; -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - const uint8_t *data8Bit; -#else - const uint16_t *data16Bit; -#endif - FLEXIO_Type *flexioBase = base->flexioBase; - - /* Assert the RS pin. */ - base->setRSPin(true); - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - - /* Configure the timer and TX shifter. */ - FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); - -/* If data bus width is 8. */ -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - data8Bit = (const uint8_t *)data; - - for (i = 0; i < size; i++) - { - flexioBase->SHIFTBUF[base->txShifterStartIndex] = data8Bit[i]; - - /* Wait for the data send out. */ - while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) - { - } - - /* Clear the timer stat. */ - flexioBase->TIMSTAT = 1UL << base->timerIndex; - } -#else - data16Bit = (const uint16_t *)data; - size /= 2U; - - for (i = 0; i < size; i++) - { - flexioBase->SHIFTBUF[base->txShifterStartIndex] = data16Bit[i]; - - /* Wait for the data send out. */ - while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) - { - } - - /* Clear the timer stat. */ - flexioBase->TIMSTAT = 1UL << base->timerIndex; - } -#endif - - /* Stop the timer and TX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); -} - -/*! - * brief Read data into array in blocking way. - * - * This function reads the data into array and returns when the data read - * finished. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param data The array to save the data. - * param size How many bytes to read. - */ -void FLEXIO_MCULCD_ReadDataArrayBlocking(FLEXIO_MCULCD_Type *base, void *data, size_t size) -{ - assert(size > 0U); - - uint32_t i; - -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - uint8_t *data8Bit = (uint8_t *)data; -#else - uint16_t *data16Bit = (uint16_t *)data; -#endif - FLEXIO_Type *flexioBase = base->flexioBase; - - /* Assert the RS pin. */ - base->setRSPin(true); - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - - /* Enable the timer and RX shifter. */ - FLEXIO_MCULCD_SetSingleBeatReadConfig(base); - -/* If data bus width is 8. */ -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - for (i = 0; i < (size - 1U); i++) - { - /* Wait for shifter buffer full. */ - while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) - { - } - - data8Bit[i] = (uint8_t)flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; - } -#else - /* Data bus width is 16. */ - size /= 2U; - - for (i = 0; i < (size - 1U); i++) - { - /* Wait for shifter buffer full. */ - while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) - { - } - - data16Bit[i] = (uint16_t)flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; - } -#endif - - /* Wait for shifter buffer full. */ - while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) - { - } - - /* Stop the timer and disable the RX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); - -/* Read out the last data. */ -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - data8Bit[i] = (uint8_t)flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; -#else - data16Bit[i] = (uint16_t)flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; -#endif -} - -/*! - * brief Send the same value many times in blocking way. - * - * This function sends the same value many times. It could be used to clear the - * LCD screen. If the data bus width is 8, this function will send LSB 8 bits of - * p sameValue for p size times. If the data bus is 16, this function will send - * LSB 16 bits of p sameValue for p size / 2 times. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param sameValue The same value to send. - * param size How many bytes to send. - */ -void FLEXIO_MCULCD_WriteSameValueBlocking(FLEXIO_MCULCD_Type *base, uint32_t sameValue, size_t size) -{ - assert(size > 0U); - - uint32_t i; - FLEXIO_Type *flexioBase = base->flexioBase; - -#if (16 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - size /= 2U; -#endif - - /* Assert the RS pin. */ - base->setRSPin(true); - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - - /* Configure the timer and TX shifter. */ - FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); - - for (i = 0; i < size; i++) - { - flexioBase->SHIFTBUF[base->txShifterStartIndex] = sameValue; - - /* Wait for the data send out. */ - while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) - { - } - - /* Clear the timer stat. */ - flexioBase->TIMSTAT = 1UL << base->timerIndex; - } - - /* Stop the timer and TX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); -} - -/*! - * brief Performs a polling transfer. - * - * note The API does not return until the transfer finished. - * - * param base pointer to FLEXIO_MCULCD_Type structure. - * param xfer pointer to flexio_mculcd_transfer_t structure. - */ -void FLEXIO_MCULCD_TransferBlocking(FLEXIO_MCULCD_Type *base, flexio_mculcd_transfer_t *xfer) -{ - FLEXIO_MCULCD_StartTransfer(base); - - FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); - - if (xfer->dataSize > 0U) - { - if (kFLEXIO_MCULCD_ReadArray == xfer->mode) - { - FLEXIO_MCULCD_ReadDataArrayBlocking(base, (uint8_t *)(xfer->dataAddrOrSameValue), xfer->dataSize); - } - else if (kFLEXIO_MCULCD_WriteArray == xfer->mode) - { - FLEXIO_MCULCD_WriteDataArrayBlocking(base, (uint8_t *)(xfer->dataAddrOrSameValue), xfer->dataSize); - } - else - { - FLEXIO_MCULCD_WriteSameValueBlocking(base, xfer->dataAddrOrSameValue, xfer->dataSize); - } - } - - FLEXIO_MCULCD_StopTransfer(base); -} - -/*! - * brief Initializes the FlexIO MCULCD handle, which is used in transactional - * functions. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * param callback The callback function. - * param userData The parameter of the callback function. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_MCULCD_TransferCreateHandle(FLEXIO_MCULCD_Type *base, - flexio_mculcd_handle_t *handle, - flexio_mculcd_transfer_callback_t callback, - void *userData) -{ - assert(NULL != handle); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - /* Register callback and userData. */ - handle->completionCallback = callback; - handle->userData = userData; - - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_GetInstance(base->flexioBase)]); - - /* Save the context in global variables to support the double weak mechanism. - */ - return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_MCULCD_TransferHandleIRQ); -} - -/*! - * brief Transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which - * returns right away. When all data is sent out/received, the callback - * function is called. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * param xfer FlexIO MCULCD transfer structure. See #flexio_mculcd_transfer_t. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_MCULCD_Busy MCULCD is busy with another transfer. - */ -status_t FLEXIO_MCULCD_TransferNonBlocking(FLEXIO_MCULCD_Type *base, - flexio_mculcd_handle_t *handle, - flexio_mculcd_transfer_t *xfer) -{ - /* If previous transfer is in progress. */ - if ((uint32_t)kFLEXIO_MCULCD_StateIdle != handle->state) - { - return kStatus_FLEXIO_MCULCD_Busy; - } - - /* Set the state in handle. */ - if (kFLEXIO_MCULCD_ReadArray == xfer->mode) - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateReadArray; - } - else if (kFLEXIO_MCULCD_WriteArray == xfer->mode) - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteArray; - } - else - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteSameValue; - } - - /* Assert the nCS. */ - FLEXIO_MCULCD_StartTransfer(base); - - /* Send the command. */ - FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); - - /* If transfer count is 0 (only to send command), return directly. */ - if (0U == xfer->dataSize) - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - /* De-assert the nCS. */ - FLEXIO_MCULCD_StopTransfer(base); - - if (NULL != handle->completionCallback) - { - handle->completionCallback(base, handle, kStatus_FLEXIO_MCULCD_Idle, handle->userData); - } - } - else - { -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - handle->dataCount = xfer->dataSize; -#else - handle->dataCount = xfer->dataSize / 2U; -#endif - - handle->remainingCount = handle->dataCount; - - handle->dataAddrOrSameValue = xfer->dataAddrOrSameValue; - - /* Enable interrupt. */ - if (kFLEXIO_MCULCD_ReadArray == xfer->mode) - { - /* For 6800, assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(true); - } - FLEXIO_MCULCD_SetSingleBeatReadConfig(base); - FLEXIO_MCULCD_EnableInterrupts(base, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable); - } - else - { - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); - FLEXIO_MCULCD_EnableInterrupts(base, (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); - } - } - - return kStatus_Success; -} - -/*! - * brief Aborts the data transfer, which used IRQ. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - */ -void FLEXIO_MCULCD_TransferAbort(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle) -{ - /* If no transfer in process, return directly. */ - if ((uint32_t)kFLEXIO_MCULCD_StateIdle == handle->state) - { - return; - } - - /* Disable the interrupt. */ - FLEXIO_MCULCD_DisableInterrupts( - base, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable | (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); - - if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) - { - /* Stop the timer and disable the RX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); - } - else - { - /* Stop the timer and disable the TX shifter. */ - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); - } - - /* Clean the flags. */ - FLEXIO_MCULCD_ClearStatusFlags(base, (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag | (uint32_t)kFLEXIO_MCULCD_RxFullFlag); - - /* De-assert the nCS. */ - FLEXIO_MCULCD_StopTransfer(base); - - handle->dataCount = 0; - handle->remainingCount = 0; - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; -} - -/*! - * brief Gets the data transfer status which used IRQ. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * param count How many bytes transferred so far by the non-blocking transaction. - * retval kStatus_Success Get the transferred count Successfully. - * retval kStatus_NoTransferInProgress No transfer in process. - */ -status_t FLEXIO_MCULCD_TransferGetCount(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle, size_t *count) -{ - assert(NULL != count); - - if ((uint32_t)kFLEXIO_MCULCD_StateIdle == handle->state) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->dataCount - handle->remainingCount; - -#if (16 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - *count *= 2U; -#endif - - return kStatus_Success; -} - -/*! - * brief FlexIO MCULCD IRQ handler function. - * - * param base Pointer to the FLEXIO_MCULCD_Type structure. - * param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - */ -void FLEXIO_MCULCD_TransferHandleIRQ(void *base, void *handle) -{ - FLEXIO_MCULCD_Type *flexioLcdMcuBase = (FLEXIO_MCULCD_Type *)base; - flexio_mculcd_handle_t *flexioLcdMcuHandle = (flexio_mculcd_handle_t *)handle; - uint32_t statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); - uint32_t data; - - if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == flexioLcdMcuHandle->state) - { - /* Handle the reading process. */ - while ((0U != ((uint32_t)kFLEXIO_MCULCD_RxFullFlag & statusFlags)) && (flexioLcdMcuHandle->remainingCount > 0U)) - { - if (1U == flexioLcdMcuHandle->remainingCount) - { - /* If this is the last data, stop the RX shifter and timer. */ - FLEXIO_MCULCD_DisableInterrupts(flexioLcdMcuBase, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable); - FLEXIO_MCULCD_ClearSingleBeatReadConfig(flexioLcdMcuBase); - FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); - } - - /* Read out the data. */ - data = FLEXIO_MCULCD_ReadData(flexioLcdMcuBase); - -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - *(uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue) = (uint8_t)data; - flexioLcdMcuHandle->dataAddrOrSameValue++; -#else - *(uint16_t *)(flexioLcdMcuHandle->dataAddrOrSameValue) = (uint16_t)data; - flexioLcdMcuHandle->dataAddrOrSameValue += 2U; -#endif - - flexioLcdMcuHandle->remainingCount--; - - /* Transfer finished, call the callback. */ - if (0U == flexioLcdMcuHandle->remainingCount) - { - flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - if (NULL != flexioLcdMcuHandle->completionCallback) - { - flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, - kStatus_FLEXIO_MCULCD_Idle, flexioLcdMcuHandle->userData); - } - } - - /* Is the shifter buffer ready to send the next data? */ - statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); - } - } - else - { - /* Handle the writing process. */ - while ((0U != ((uint32_t)kFLEXIO_MCULCD_TxEmptyFlag & statusFlags)) && - (flexioLcdMcuHandle->remainingCount > 0U)) - { - /* Send the data. */ - if ((uint32_t)kFLEXIO_MCULCD_StateWriteSameValue == flexioLcdMcuHandle->state) - { - data = flexioLcdMcuHandle->dataAddrOrSameValue; - } - else - { -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - data = *(uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue); - flexioLcdMcuHandle->dataAddrOrSameValue++; -#else - data = *(uint16_t *)(flexioLcdMcuHandle->dataAddrOrSameValue); - flexioLcdMcuHandle->dataAddrOrSameValue += 2U; -#endif - } - - /* If this is the last data to send, delay to wait for the data shift out. */ - if (1U == flexioLcdMcuHandle->remainingCount) - { - FLEXIO_MCULCD_DisableInterrupts(flexioLcdMcuBase, (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); - - /* Write the last data. */ - FLEXIO_MCULCD_WriteData(flexioLcdMcuBase, data); - - /* Wait for the last data send finished. */ - FLEXIO_MCULCD_WaitTransmitComplete(); - flexioLcdMcuHandle->remainingCount = 0; - - FLEXIO_MCULCD_ClearSingleBeatWriteConfig(flexioLcdMcuBase); - FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); - flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - if (NULL != flexioLcdMcuHandle->completionCallback) - { - flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, - kStatus_FLEXIO_MCULCD_Idle, flexioLcdMcuHandle->userData); - } - } - else - { - FLEXIO_MCULCD_WriteData(flexioLcdMcuBase, data); - flexioLcdMcuHandle->remainingCount--; - } - /* Is the shifter buffer ready to send the next data? */ - statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); - } - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.h b/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.h deleted file mode 100644 index 046b98c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd.h +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXIO_MCULCD_H_ -#define _FSL_FLEXIO_MCULCD_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" - -/*! - * @addtogroup flexio_mculcd - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO MCULCD driver version. */ -#define FSL_FLEXIO_MCULCD_DRIVER_VERSION (MAKE_VERSION(2, 0, 6)) -/*@}*/ - -#ifndef FLEXIO_MCULCD_WAIT_COMPLETE_TIME -/*! - * @brief The delay time to wait for FLEXIO transmit complete. - * - * Currently there is no method to detect whether the data has been - * sent out from the shifter, so the driver use a software delay for this. When - * the data is written to shifter buffer, the driver call the delay - * function to wait for the data shift out. - * If this value is too small, then the last few bytes might be lost when writing - * data using interrupt method or DMA method. - */ -#define FLEXIO_MCULCD_WAIT_COMPLETE_TIME 512 -#endif - -#ifndef FLEXIO_MCULCD_DATA_BUS_WIDTH -/*! - * @brief The data bus width, must be 8 or 16. - */ -#define FLEXIO_MCULCD_DATA_BUS_WIDTH 16UL -#endif - -#if (16UL != FLEXIO_MCULCD_DATA_BUS_WIDTH) && (8UL != FLEXIO_MCULCD_DATA_BUS_WIDTH) -#error Only support data bus 8-bit or 16-bit -#endif - -/*! @brief FlexIO LCD transfer status */ -enum -{ - kStatus_FLEXIO_MCULCD_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 0), /*!< FlexIO LCD is idle. */ - kStatus_FLEXIO_MCULCD_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 1), /*!< FlexIO LCD is busy */ - kStatus_FLEXIO_MCULCD_Error = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 2), /*!< FlexIO LCD error occurred */ -}; - -/*! @brief Define FlexIO MCULCD pixel format. */ -typedef enum _flexio_mculcd_pixel_format -{ - kFLEXIO_MCULCD_RGB565 = 0, /*!< RGB565, 16-bit. */ - kFLEXIO_MCULCD_BGR565, /*!< BGR565, 16-bit. */ - kFLEXIO_MCULCD_RGB888, /*!< RGB888, 24-bit. */ - kFLEXIO_MCULCD_BGR888, /*!< BGR888, 24-bit. */ -} flexio_mculcd_pixel_format_t; - -/*! @brief Define FlexIO MCULCD bus type. */ -typedef enum _flexio_mculcd_bus -{ - kFLEXIO_MCULCD_8080, /*!< Using Intel 8080 bus. */ - kFLEXIO_MCULCD_6800, /*!< Using Motorola 6800 bus. */ -} flexio_mculcd_bus_t; - -/*! @brief Define FlexIO MCULCD interrupt mask. */ -enum _flexio_mculcd_interrupt_enable -{ - kFLEXIO_MCULCD_TxEmptyInterruptEnable = (1U << 0U), /*!< Transmit buffer empty interrupt enable. */ - kFLEXIO_MCULCD_RxFullInterruptEnable = (1U << 1U), /*!< Receive buffer full interrupt enable. */ -}; - -/*! @brief Define FlexIO MCULCD status mask. */ -enum _flexio_mculcd_status_flags -{ - kFLEXIO_MCULCD_TxEmptyFlag = (1U << 0U), /*!< Transmit buffer empty flag. */ - kFLEXIO_MCULCD_RxFullFlag = (1U << 1U), /*!< Receive buffer full flag. */ -}; - -/*! @brief Define FlexIO MCULCD DMA mask. */ -enum _flexio_mculcd_dma_enable -{ - kFLEXIO_MCULCD_TxDmaEnable = 0x1U, /*!< Tx DMA request source */ - kFLEXIO_MCULCD_RxDmaEnable = 0x2U, /*!< Rx DMA request source */ -}; - -/*! @brief Function to set or clear the CS and RS pin. */ -typedef void (*flexio_mculcd_pin_func_t)(bool set); - -/*! @brief Define FlexIO MCULCD access structure typedef. */ -typedef struct _flexio_mculcd_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ - flexio_mculcd_bus_t busType; /*!< The bus type, 8080 or 6800. */ - uint8_t dataPinStartIndex; /*!< Start index of the data pin, the FlexIO pin dataPinStartIndex - to (dataPinStartIndex + FLEXIO_MCULCD_DATA_BUS_WIDTH -1) - will be used for data transfer. Only support data bus width 8 and 16. */ - uint8_t ENWRPinIndex; /*!< Pin select for WR(8080 mode), EN(6800 mode). */ - uint8_t RDPinIndex; /*!< Pin select for RD(8080 mode), not used in 6800 mode. */ - uint8_t txShifterStartIndex; /*!< Start index of shifters used for data write, it must be 0 or 4. */ - uint8_t txShifterEndIndex; /*!< End index of shifters used for data write. */ - uint8_t rxShifterStartIndex; /*!< Start index of shifters used for data read. */ - uint8_t rxShifterEndIndex; /*!< End index of shifters used for data read, it must be 3 or 7. */ - uint8_t timerIndex; /*!< Timer index used in FlexIO MCULCD. */ - flexio_mculcd_pin_func_t setCSPin; /*!< Function to set or clear the CS pin. */ - flexio_mculcd_pin_func_t setRSPin; /*!< Function to set or clear the RS pin. */ - flexio_mculcd_pin_func_t setRDWRPin; /*!< Function to set or clear the RD/WR pin, only used in 6800 mode. */ -} FLEXIO_MCULCD_Type; - -/*! @brief Define FlexIO MCULCD configuration structure. */ -typedef struct _flexio_mculcd_config -{ - bool enable; /*!< Enable/disable FlexIO MCULCD after configuration. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, - fast access requires the FlexIO clock to be at least - twice the frequency of the bus clock. */ - uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ -} flexio_mculcd_config_t; - -/*! @brief Transfer mode.*/ -typedef enum _flexio_mculcd_transfer_mode -{ - kFLEXIO_MCULCD_ReadArray, /*!< Read data into an array. */ - kFLEXIO_MCULCD_WriteArray, /*!< Write data from an array. */ - kFLEXIO_MCULCD_WriteSameValue, /*!< Write the same value many times. */ -} flexio_mculcd_transfer_mode_t; - -/*! @brief Define FlexIO MCULCD transfer structure. */ -typedef struct _flexio_mculcd_transfer -{ - uint32_t command; /*!< Command to send. */ - flexio_mculcd_transfer_mode_t mode; /*!< Transfer mode. */ - uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, - this is the value to send. When writing or reading array, - this is the address of the data array. */ - size_t dataSize; /*!< How many bytes to transfer. */ -} flexio_mculcd_transfer_t; - -/*! @brief typedef for flexio_mculcd_handle_t in advance. */ -typedef struct _flexio_mculcd_handle flexio_mculcd_handle_t; - -/*! @brief FlexIO MCULCD callback for finished transfer. - * - * When transfer finished, the callback function is called and returns the - * @p status as kStatus_FLEXIO_MCULCD_Idle. - */ -typedef void (*flexio_mculcd_transfer_callback_t)(FLEXIO_MCULCD_Type *base, - flexio_mculcd_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Define FlexIO MCULCD handle structure. */ -struct _flexio_mculcd_handle -{ - uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, - this is the value to send. When writing or reading array, - this is the address of the data array. */ - size_t dataCount; /*!< Total count to be transferred. */ - volatile size_t remainingCount; /*!< Remaining count to transfer. */ - volatile uint32_t state; /*!< FlexIO MCULCD internal state. */ - flexio_mculcd_transfer_callback_t completionCallback; /*!< FlexIO MCULCD transfer completed callback. */ - void *userData; /*!< Callback parameter. */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name FlexIO MCULCD Configuration - * @{ - */ - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the - * FlexIO MCULCD hardware, and configures the FlexIO MCULCD with FlexIO MCULCD - * configuration. - * The configuration structure can be filled by the user, or be set with default - * values - * by the @ref FLEXIO_MCULCD_GetDefaultConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param config Pointer to the flexio_mculcd_config_t structure. - * @param srcClock_Hz FlexIO source clock in Hz. - * @retval kStatus_Success Initialization success. - * @retval kStatus_InvalidArgument Initialization failed because of invalid - * argument. - */ -status_t FLEXIO_MCULCD_Init(FLEXIO_MCULCD_Type *base, flexio_mculcd_config_t *config, uint32_t srcClock_Hz); - -/*! - * @brief Resets the FLEXIO_MCULCD timer and shifter configuration. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - */ -void FLEXIO_MCULCD_Deinit(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO MCULCD. - * - * The default configuration value is: - * @code - * config->enable = true; - * config->enableInDoze = false; - * config->enableInDebug = true; - * config->enableFastAccess = true; - * config->baudRate_Bps = 96000000U; - * @endcode - * @param config Pointer to the flexio_mculcd_config_t structure. - */ -void FLEXIO_MCULCD_GetDefaultConfig(flexio_mculcd_config_t *config); - -/*@}*/ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets FlexIO MCULCD status flags. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @return status flag; OR'ed value or the @ref _flexio_mculcd_status_flags. - * - * @note Don't use this function with DMA APIs. - */ -uint32_t FLEXIO_MCULCD_GetStatusFlags(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Clears FlexIO MCULCD status flags. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param mask Status to clear, it is the OR'ed value of @ref - * _flexio_mculcd_status_flags. - * - * @note Don't use this function with DMA APIs. - */ -void FLEXIO_MCULCD_ClearStatusFlags(FLEXIO_MCULCD_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the FlexIO MCULCD interrupt. - * - * This function enables the FlexIO MCULCD interrupt. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param mask Interrupts to enable, it is the OR'ed value of @ref - * _flexio_mculcd_interrupt_enable. - */ -void FLEXIO_MCULCD_EnableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask); - -/*! - * @brief Disables the FlexIO MCULCD interrupt. - * - * This function disables the FlexIO MCULCD interrupt. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param mask Interrupts to disable, it is the OR'ed value of @ref - * _flexio_mculcd_interrupt_enable. - */ -void FLEXIO_MCULCD_DisableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO MCULCD transmit DMA. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void FLEXIO_MCULCD_EnableTxDMA(FLEXIO_MCULCD_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, (1UL << base->txShifterStartIndex), enable); -} - -/*! - * @brief Enables/disables the FlexIO MCULCD receive DMA. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void FLEXIO_MCULCD_EnableRxDMA(FLEXIO_MCULCD_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, (1UL << base->rxShifterEndIndex), enable); -} - -/*! - * @brief Gets the FlexIO MCULCD transmit data register address. - * - * This function returns the MCULCD data register address, which is mainly used - * by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @return FlexIO MCULCD transmit data register address. - */ -static inline uint32_t FLEXIO_MCULCD_GetTxDataRegisterAddress(FLEXIO_MCULCD_Type *base) -{ - return (uint32_t) & (base->flexioBase->SHIFTBUF[base->txShifterStartIndex]); -} - -/*! - * @brief Gets the FlexIO MCULCD receive data register address. - * - * This function returns the MCULCD data register address, which is mainly used - * by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @return FlexIO MCULCD receive data register address. - */ -static inline uint32_t FLEXIO_MCULCD_GetRxDataRegisterAddress(FLEXIO_MCULCD_Type *base) -{ - return (uint32_t) & (base->flexioBase->SHIFTBUF[base->rxShifterStartIndex]); -} - -/*@}*/ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Set desired baud rate. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param baudRate_Bps Desired baud rate. - * @param srcClock_Hz FLEXIO clock frequency in Hz. - * @retval kStatus_Success Set successfully. - * @retval kStatus_InvalidArgument Could not set the baud rate. - */ -status_t FLEXIO_MCULCD_SetBaudRate(FLEXIO_MCULCD_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); - -/*! - * @brief Configures the FLEXIO MCULCD to multiple beats write mode. - * - * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to - * multiple beats write mode using this function. After write operation, the configuration - * is cleared by @ref FLEXIO_MCULCD_ClearSingleBeatWriteConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Clear the FLEXIO MCULCD multiple beats write mode configuration. - * - * Clear the write configuration set by @ref FLEXIO_MCULCD_SetSingleBeatWriteConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Configures the FLEXIO MCULCD to multiple beats read mode. - * - * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured - * to multiple beats read mode using this function. After read operation, the configuration - * is cleared by @ref FLEXIO_MCULCD_ClearSingleBeatReadConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetSingleBeatReadConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Clear the FLEXIO MCULCD multiple beats read mode configuration. - * - * Clear the read configuration set by @ref FLEXIO_MCULCD_SetSingleBeatReadConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearSingleBeatReadConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Configures the FLEXIO MCULCD to multiple beats write mode. - * - * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to - * multiple beats write mode using this function. After write operation, the configuration - * is cleared by FLEXIO_MCULCD_ClearMultBeatsWriteConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Clear the FLEXIO MCULCD multiple beats write mode configuration. - * - * Clear the write configuration set by FLEXIO_MCULCD_SetMultBeatsWriteConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Configures the FLEXIO MCULCD to multiple beats read mode. - * - * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured - * to multiple beats read mode using this function. After read operation, the configuration - * is cleared by FLEXIO_MCULCD_ClearMultBeatsReadConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_SetMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Clear the FLEXIO MCULCD multiple beats read mode configuration. - * - * Clear the read configuration set by FLEXIO_MCULCD_SetMultBeatsReadConfig. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * - * @note This is an internal used function, upper layer should not use. - */ -void FLEXIO_MCULCD_ClearMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Enables/disables the FlexIO MCULCD module operation. - * - * @param base Pointer to the FLEXIO_MCULCD_Type. - * @param enable True to enable, false does not have any effect. - */ -static inline void FLEXIO_MCULCD_Enable(FLEXIO_MCULCD_Type *base, bool enable) -{ - if (enable) - { - FLEXIO_Enable(base->flexioBase, enable); - } -} - -/*! - * @brief Read data from the FLEXIO MCULCD RX shifter buffer. - * - * Read data from the RX shift buffer directly, it does no check whether the - * buffer is empty or not. - * - * If the data bus width is 8-bit: - * @code - * uint8_t value; - * value = (uint8_t)FLEXIO_MCULCD_ReadData(base); - * @endcode - * - * If the data bus width is 16-bit: - * @code - * uint16_t value; - * value = (uint16_t)FLEXIO_MCULCD_ReadData(base); - * @endcode - * - * @note This function returns the RX shifter buffer value (32-bit) directly. - * The return value should be converted according to data bus width. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @return The data read out. - * - * @note Don't use this function with DMA APIs. - */ -uint32_t FLEXIO_MCULCD_ReadData(FLEXIO_MCULCD_Type *base); - -/*! - * @brief Write data into the FLEXIO MCULCD TX shifter buffer. - * - * Write data into the TX shift buffer directly, it does no check whether the - * buffer is full or not. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param data The data to write. - * - * @note Don't use this function with DMA APIs. - */ -static inline void FLEXIO_MCULCD_WriteData(FLEXIO_MCULCD_Type *base, uint32_t data) -{ - base->flexioBase->SHIFTBUF[base->txShifterStartIndex] = data; -} - -/*! - * @brief Assert the nCS to start transfer. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - */ -static inline void FLEXIO_MCULCD_StartTransfer(FLEXIO_MCULCD_Type *base) -{ - base->setCSPin(false); -} - -/*! - * @brief De-assert the nCS to stop transfer. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - */ -static inline void FLEXIO_MCULCD_StopTransfer(FLEXIO_MCULCD_Type *base) -{ - base->setCSPin(true); -} - -/*! - * @brief Wait for transmit data send out finished. - * - * Currently there is no effective method to wait for the data send out - * from the shiter, so here use a while loop to wait. - * - * @note This is an internal used function. - */ -void FLEXIO_MCULCD_WaitTransmitComplete(void); - -/*! - * @brief Send command in blocking way. - * - * This function sends the command and returns when the command has been sent - * out. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param command The command to send. - */ -void FLEXIO_MCULCD_WriteCommandBlocking(FLEXIO_MCULCD_Type *base, uint32_t command); - -/*! - * @brief Send data array in blocking way. - * - * This function sends the data array and returns when the data sent out. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param data The data array to send. - * @param size How many bytes to write. - */ -void FLEXIO_MCULCD_WriteDataArrayBlocking(FLEXIO_MCULCD_Type *base, const void *data, size_t size); - -/*! - * @brief Read data into array in blocking way. - * - * This function reads the data into array and returns when the data read - * finished. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param data The array to save the data. - * @param size How many bytes to read. - */ -void FLEXIO_MCULCD_ReadDataArrayBlocking(FLEXIO_MCULCD_Type *base, void *data, size_t size); - -/*! - * @brief Send the same value many times in blocking way. - * - * This function sends the same value many times. It could be used to clear the - * LCD screen. If the data bus width is 8, this function will send LSB 8 bits of - * @p sameValue for @p size times. If the data bus is 16, this function will send - * LSB 16 bits of @p sameValue for @p size / 2 times. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param sameValue The same value to send. - * @param size How many bytes to send. - */ -void FLEXIO_MCULCD_WriteSameValueBlocking(FLEXIO_MCULCD_Type *base, uint32_t sameValue, size_t size); - -/*! - * @brief Performs a polling transfer. - * - * @note The API does not return until the transfer finished. - * - * @param base pointer to FLEXIO_MCULCD_Type structure. - * @param xfer pointer to flexio_mculcd_transfer_t structure. - */ -void FLEXIO_MCULCD_TransferBlocking(FLEXIO_MCULCD_Type *base, flexio_mculcd_transfer_t *xfer); -/*@}*/ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the FlexIO MCULCD handle, which is used in transactional - * functions. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_MCULCD_TransferCreateHandle(FLEXIO_MCULCD_Type *base, - flexio_mculcd_handle_t *handle, - flexio_mculcd_transfer_callback_t callback, - void *userData); - -/*! - * @brief Transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which - * returns right away. When all data is sent out/received, the callback - * function is called. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * @param xfer FlexIO MCULCD transfer structure. See #flexio_mculcd_transfer_t. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_MCULCD_Busy MCULCD is busy with another transfer. - */ -status_t FLEXIO_MCULCD_TransferNonBlocking(FLEXIO_MCULCD_Type *base, - flexio_mculcd_handle_t *handle, - flexio_mculcd_transfer_t *xfer); - -/*! - * @brief Aborts the data transfer, which used IRQ. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - */ -void FLEXIO_MCULCD_TransferAbort(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle); - -/*! - * @brief Gets the data transfer status which used IRQ. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - * @param count How many bytes transferred so far by the non-blocking transaction. - * @retval kStatus_Success Get the transferred count Successfully. - * @retval kStatus_NoTransferInProgress No transfer in process. - */ -status_t FLEXIO_MCULCD_TransferGetCount(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle, size_t *count); - -/*! - * @brief FlexIO MCULCD IRQ handler function. - * - * @param base Pointer to the FLEXIO_MCULCD_Type structure. - * @param handle Pointer to the flexio_mculcd_handle_t structure to store the - * transfer state. - */ -void FLEXIO_MCULCD_TransferHandleIRQ(void *base, void *handle); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ -/*@}*/ - -#endif /*_FSL_FLEXIO_MCULCD_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c b/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c deleted file mode 100644 index 458ad8e..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_mculcd_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_mculcd_edma" -#endif - -#define EDMA_MAX_MAJOR_COUNT (DMA_CITER_ELINKNO_CITER_MASK >> DMA_CITER_ELINKNO_CITER_SHIFT) - -enum -{ - kFLEXIO_MCULCD_StateIdle, /*!< No transfer in progress. */ - kFLEXIO_MCULCD_StateReadArray, /*!< Reading array in progress. */ - kFLEXIO_MCULCD_StateWriteArray, /*!< Writing array in progress. */ - kFLEXIO_MCULCD_StateWriteSameValue, /*!< Writing the same value in progress. - */ -}; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief EDMA callback function for FLEXIO MCULCD TX. - * - * For details, see @ref edma_callback. - */ -static void FLEXIO_MCULCD_TxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds); - -/*! - * @brief EDMA callback function for FLEXIO MCULCD RX. - * - * For details, see @ref edma_callback. - */ -static void FLEXIO_MCULCD_RxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds); - -/*! - * @brief Set EDMA config for FLEXIO MCULCD transfer. - * - * @param base pointer to FLEXIO_MCULCD_Type structure. - * @param handle pointer to flexio_mculcd_edma_handle_t structure to store the - * transfer state. - */ -static void FLEXIO_MCULCD_EDMAConfig(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle); - -/*! - * @brief Convert the FlexIO shifter number to eDMA modulo. - * - * @param shifterNum The FlexIO shifter number. - * @param modulo The modulo number. - * @retval Get the modulo successfully. - * @retval Could not get the modulo for the shifter number. - */ -static bool FLEXIO_MCULCD_GetEDMAModulo(uint8_t shifterNum, edma_modulo_t *modulo); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ - -static void FLEXIO_MCULCD_TxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds) -{ - tcds = tcds; - flexio_mculcd_edma_handle_t *flexioLcdMcuHandle = (flexio_mculcd_edma_handle_t *)param; - FLEXIO_MCULCD_Type *flexioLcdMcuBase = flexioLcdMcuHandle->base; - - if (transferDone) - { - if (flexioLcdMcuHandle->remainingCount >= flexioLcdMcuHandle->minorLoopBytes) - { - FLEXIO_MCULCD_EDMAConfig(flexioLcdMcuBase, flexioLcdMcuHandle); - EDMA_StartTransfer(flexioLcdMcuHandle->txDmaHandle); - } - else - { - FLEXIO_MCULCD_EnableTxDMA(flexioLcdMcuBase, false); - - /* Now the data are in shifter, wait for the data send out from the shifter. */ - FLEXIO_MCULCD_WaitTransmitComplete(); - - /* Disable the TX shifter and the timer. */ - FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(flexioLcdMcuBase); - - /* Send the remaining data. */ - if (0U != flexioLcdMcuHandle->remainingCount) - { - if ((uint32_t)kFLEXIO_MCULCD_StateWriteSameValue == flexioLcdMcuHandle->state) - { - FLEXIO_MCULCD_WriteSameValueBlocking(flexioLcdMcuBase, flexioLcdMcuHandle->dataAddrOrSameValue, - flexioLcdMcuHandle->remainingCount); - } - else - { - FLEXIO_MCULCD_WriteDataArrayBlocking(flexioLcdMcuBase, - (uint8_t *)flexioLcdMcuHandle->dataAddrOrSameValue, - flexioLcdMcuHandle->remainingCount); - } - } - - /* De-assert nCS. */ - FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); - - /* Change the state. */ - flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - flexioLcdMcuHandle->dataCount = 0; - flexioLcdMcuHandle->remainingCount = 0; - - /* Callback to inform upper layer. */ - if (NULL != flexioLcdMcuHandle->completionCallback) - { - flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, kStatus_FLEXIO_MCULCD_Idle, - flexioLcdMcuHandle->userData); - } - } - } -} - -static void FLEXIO_MCULCD_RxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds) -{ - tcds = tcds; - uint32_t i; - uint32_t rxBufAddr; - flexio_mculcd_edma_handle_t *flexioLcdMcuHandle = (flexio_mculcd_edma_handle_t *)param; - FLEXIO_MCULCD_Type *flexioLcdMcuBase = flexioLcdMcuHandle->base; - FLEXIO_Type *flexioBase = flexioLcdMcuBase->flexioBase; - - if (transferDone) - { - if (flexioLcdMcuHandle->remainingCount >= (2U * flexioLcdMcuHandle->minorLoopBytes)) - { - FLEXIO_MCULCD_EDMAConfig(flexioLcdMcuBase, flexioLcdMcuHandle); - EDMA_StartTransfer(flexioLcdMcuHandle->rxDmaHandle); - } - else - { - FLEXIO_MCULCD_EnableRxDMA(flexioLcdMcuBase, false); - - /* Wait the data saved to the shifter buffer. */ - while (0U == ((1UL << flexioLcdMcuBase->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) - { - } - - /* Disable the RX shifter and the timer. */ - FLEXIO_MCULCD_ClearMultiBeatsReadConfig(flexioLcdMcuBase); - - rxBufAddr = FLEXIO_MCULCD_GetRxDataRegisterAddress(flexioLcdMcuBase); - -/* Read out the data. */ -#if (defined(__CORTEX_M) && (__CORTEX_M == 0)) - /* Cortex M0 and M0+ only support aligned access. */ - for (i = 0; i < flexioLcdMcuHandle->rxShifterNum * 4; i++) - { - ((uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue))[i] = ((volatile uint8_t *)rxBufAddr)[i]; - } -#else - for (i = 0; i < flexioLcdMcuHandle->rxShifterNum; i++) - { - ((uint32_t *)(flexioLcdMcuHandle->dataAddrOrSameValue))[i] = ((volatile uint32_t *)rxBufAddr)[i]; - } -#endif - flexioLcdMcuHandle->remainingCount -= flexioLcdMcuHandle->minorLoopBytes; - - if (0U != flexioLcdMcuHandle->remainingCount) - { - FLEXIO_MCULCD_ReadDataArrayBlocking( - flexioLcdMcuBase, - (uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue + flexioLcdMcuHandle->minorLoopBytes), - flexioLcdMcuHandle->remainingCount); - } - - /* De-assert nCS. */ - FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); - - /* Change the state. */ - flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - flexioLcdMcuHandle->dataCount = 0; - flexioLcdMcuHandle->remainingCount = 0; - - /* Callback to inform upper layer. */ - if (NULL != flexioLcdMcuHandle->completionCallback) - { - flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, kStatus_FLEXIO_MCULCD_Idle, - flexioLcdMcuHandle->userData); - } - } - } -} - -static void FLEXIO_MCULCD_EDMAConfig(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle) -{ - edma_transfer_config_t xferConfig = {0}; - edma_transfer_size_t transferSize = kEDMA_TransferSize1Bytes; - int16_t offset; - uint32_t majorLoopCounts; - uint32_t transferCount; - -#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) - transferSize = kEDMA_TransferSize1Bytes; - offset = 1; -#else - transferSize = kEDMA_TransferSize2Bytes; - offset = 2; -#endif - - majorLoopCounts = handle->remainingCount / handle->minorLoopBytes; - - /* For reading, the last minor loop data is not tranfered by DMA. */ - if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) - { - majorLoopCounts--; - } - - if (majorLoopCounts > EDMA_MAX_MAJOR_COUNT) - { - majorLoopCounts = EDMA_MAX_MAJOR_COUNT; - } - - transferCount = majorLoopCounts * handle->minorLoopBytes; - - if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) - { - xferConfig.srcAddr = FLEXIO_MCULCD_GetRxDataRegisterAddress(base); - xferConfig.destAddr = handle->dataAddrOrSameValue; - xferConfig.srcTransferSize = kEDMA_TransferSize4Bytes; - xferConfig.destTransferSize = transferSize; - xferConfig.srcOffset = 4; - xferConfig.destOffset = offset; - xferConfig.minorLoopBytes = handle->minorLoopBytes; - xferConfig.majorLoopCounts = majorLoopCounts; - handle->remainingCount -= transferCount; - handle->dataAddrOrSameValue += transferCount; - (void)EDMA_SubmitTransfer(handle->rxDmaHandle, &xferConfig); - EDMA_SetModulo(handle->rxDmaHandle->base, handle->rxDmaHandle->channel, handle->rxEdmaModulo, - kEDMA_ModuloDisable); - } - else - { - if ((uint32_t)kFLEXIO_MCULCD_StateWriteArray == handle->state) - { - xferConfig.srcAddr = handle->dataAddrOrSameValue; - xferConfig.srcOffset = offset; - handle->dataAddrOrSameValue += transferCount; - } - else - { - xferConfig.srcAddr = (uint32_t)(&(handle->dataAddrOrSameValue)); - xferConfig.srcOffset = 0; - } - xferConfig.destAddr = FLEXIO_MCULCD_GetTxDataRegisterAddress(base); - xferConfig.srcTransferSize = transferSize; - xferConfig.destTransferSize = kEDMA_TransferSize4Bytes; - xferConfig.destOffset = 4; - xferConfig.minorLoopBytes = handle->minorLoopBytes; - xferConfig.majorLoopCounts = majorLoopCounts; - handle->remainingCount -= transferCount; - (void)EDMA_SubmitTransfer(handle->txDmaHandle, &xferConfig); - EDMA_SetModulo(handle->txDmaHandle->base, handle->txDmaHandle->channel, kEDMA_ModuloDisable, - handle->txEdmaModulo); - } -} - -static bool FLEXIO_MCULCD_GetEDMAModulo(uint8_t shifterNum, edma_modulo_t *modulo) -{ - bool ret = true; - - switch (shifterNum) - { - case 1U: - *modulo = kEDMA_Modulo4bytes; - break; - case 2U: - *modulo = kEDMA_Modulo8bytes; - break; - case 4U: - *modulo = kEDMA_Modulo16bytes; - break; - case 8U: - *modulo = kEDMA_Modulo32bytes; - break; - default: - ret = false; - break; - } - - return ret; -} - -/*! - * brief Initializes the FLEXO MCULCD master eDMA handle. - * - * This function initializes the FLEXO MCULCD master eDMA handle which can be - * used for other FLEXO MCULCD transactional APIs. For a specified FLEXO MCULCD - * instance, call this API once to get the initialized handle. - * - * param base Pointer to FLEXIO_MCULCD_Type structure. - * param handle Pointer to flexio_mculcd_edma_handle_t structure to store the - * transfer state. - * param callback MCULCD transfer complete callback, NULL means no callback. - * param userData callback function parameter. - * param txDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA TX, - * the DMA request source of this handle should be the first of TX shifters. - * param rxDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA RX, - * the DMA request source of this handle should be the last of RX shifters. - * retval kStatus_Success Successfully create the handle. - */ -status_t FLEXIO_MCULCD_TransferCreateHandleEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - flexio_mculcd_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txDmaHandle, - edma_handle_t *rxDmaHandle) -{ - assert(NULL != handle); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Initialize the state. */ - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - /* Register callback and userData. */ - handle->completionCallback = callback; - handle->userData = userData; - - handle->base = base; - handle->txShifterNum = base->txShifterEndIndex - base->txShifterStartIndex + 1U; - handle->rxShifterNum = base->rxShifterEndIndex - base->rxShifterStartIndex + 1U; - - if (NULL != rxDmaHandle) - { - if (!FLEXIO_MCULCD_GetEDMAModulo(handle->rxShifterNum, &handle->rxEdmaModulo)) - { - return kStatus_InvalidArgument; - } - - handle->rxDmaHandle = rxDmaHandle; - EDMA_SetCallback(rxDmaHandle, FLEXIO_MCULCD_RxEDMACallback, handle); - } - - if (NULL != txDmaHandle) - { - if (!FLEXIO_MCULCD_GetEDMAModulo(handle->txShifterNum, &handle->txEdmaModulo)) - { - return kStatus_InvalidArgument; - } - - handle->txDmaHandle = txDmaHandle; - EDMA_SetCallback(txDmaHandle, FLEXIO_MCULCD_TxEDMACallback, handle); - } - - return kStatus_Success; -} - -/*! - * brief Performs a non-blocking FlexIO MCULCD transfer using eDMA. - * - * This function returns immediately after transfer initiates. To check whether - * the transfer is completed, user could: - * 1. Use the transfer completed callback; - * 2. Polling function ref FLEXIO_MCULCD_GetTransferCountEDMA - * - * param base pointer to FLEXIO_MCULCD_Type structure. - * param handle pointer to flexio_mculcd_edma_handle_t structure to store the - * transfer state. - * param xfer Pointer to FlexIO MCULCD transfer structure. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_MCULCD_Busy FlexIO MCULCD is not idle, it is running another - * transfer. - */ -status_t FLEXIO_MCULCD_TransferEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - flexio_mculcd_transfer_t *xfer) -{ - assert(NULL != handle); - assert(NULL != xfer); - - /* - * The data transfer mechanism: - * - * Read: - * Assume the data length is Lr = (n1 * minorLoopBytes + n2), where - * n2 < minorLoopBytes. - * If (n1 <= 1), then all data are sent using blocking method. - * If (n1 > 1), then the beginning ((n1-1) * minorLoopBytes) are read - * using DMA, the left (minorLoopBytes + n2) are read using blocking method. - * - * Write: - * Assume the data length is Lw = (n1 * minorLoopBytes + n2), where - * n2 < minorLoopBytes. - * If (n1 = 0), then all data are sent using blocking method. - * If (n1 >= 1), then the beginning (n1 * minorLoopBytes) are sent - * using DMA, the left n2 are sent using blocking method. - */ - - /* Check if the device is busy. */ - if ((uint32_t)kFLEXIO_MCULCD_StateIdle != handle->state) - { - return kStatus_FLEXIO_MCULCD_Busy; - } - - /* Set the state in handle. */ - if (kFLEXIO_MCULCD_ReadArray == xfer->mode) - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateReadArray; - handle->minorLoopBytes = handle->rxShifterNum * 4UL; - } - else - { - handle->minorLoopBytes = handle->txShifterNum * 4UL; - - if (kFLEXIO_MCULCD_WriteArray == xfer->mode) - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteArray; - } - else - { - handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteSameValue; - } - } - - /* - * For TX, if data is less than one minor loop, then use polling method. - * For RX, if data is less than two minor loop, then use polling method. - */ - if ((xfer->dataSize < handle->minorLoopBytes) || - ((kFLEXIO_MCULCD_ReadArray == xfer->mode) && (xfer->dataSize < 2U * (handle->minorLoopBytes)))) - { - FLEXIO_MCULCD_TransferBlocking(base, xfer); - - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - - /* Callback to inform upper layer. */ - if (NULL != handle->completionCallback) - { - handle->completionCallback(base, handle, kStatus_FLEXIO_MCULCD_Idle, handle->userData); - } - } - else - { - handle->dataCount = xfer->dataSize; - handle->remainingCount = xfer->dataSize; - handle->dataAddrOrSameValue = xfer->dataAddrOrSameValue; - - /* Setup DMA to transfer data. */ - /* Assert the nCS. */ - FLEXIO_MCULCD_StartTransfer(base); - /* Send the command. */ - FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); - - /* Setup the DMA configuration. */ - FLEXIO_MCULCD_EDMAConfig(base, handle); - - /* Start the transfer. */ - if (kFLEXIO_MCULCD_ReadArray == xfer->mode) - { - /* For 6800, assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(true); - } - FLEXIO_MCULCD_SetMultiBeatsReadConfig(base); - FLEXIO_MCULCD_EnableRxDMA(base, true); - EDMA_StartTransfer(handle->rxDmaHandle); - } - else - { - /* For 6800, de-assert the RDWR pin. */ - if (kFLEXIO_MCULCD_6800 == base->busType) - { - base->setRDWRPin(false); - } - FLEXIO_MCULCD_SetMultiBeatsWriteConfig(base); - FLEXIO_MCULCD_EnableTxDMA(base, true); - EDMA_StartTransfer(handle->txDmaHandle); - } - } - - return kStatus_Success; -} - -/*! - * brief Aborts a FlexIO MCULCD transfer using eDMA. - * - * param base pointer to FLEXIO_MCULCD_Type structure. - * param handle FlexIO MCULCD eDMA handle pointer. - */ -void FLEXIO_MCULCD_TransferAbortEDMA(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle) -{ - assert(NULL != handle); - - /* Disable dma. */ - if (NULL != handle->txDmaHandle) - { - EDMA_AbortTransfer(handle->txDmaHandle); - } - if (NULL != handle->rxDmaHandle) - { - EDMA_AbortTransfer(handle->rxDmaHandle); - } - - /* Disable DMA enable bit. */ - FLEXIO_MCULCD_EnableTxDMA(handle->base, false); - FLEXIO_MCULCD_EnableRxDMA(handle->base, false); - - /* Set the handle state. */ - handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; - handle->dataCount = 0; -} - -/*! - * brief Gets the remaining bytes for FlexIO MCULCD eDMA transfer. - * - * param base pointer to FLEXIO_MCULCD_Type structure. - * param handle FlexIO MCULCD eDMA handle pointer. - * param count Number of count transferred so far by the eDMA transaction. - * retval kStatus_Success Get the transferred count Successfully. - * retval kStatus_NoTransferInProgress No transfer in process. - */ -status_t FLEXIO_MCULCD_TransferGetCountEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - size_t *count) -{ - assert(NULL != handle); - assert(NULL != count); - uint32_t state = handle->state; - - if ((uint32_t)kFLEXIO_MCULCD_StateIdle == state) - { - return kStatus_NoTransferInProgress; - } - else - { - *count = handle->dataCount - handle->remainingCount; - - if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == state) - { - *count -= handle->minorLoopBytes * - EDMA_GetRemainingMajorLoopCount(handle->rxDmaHandle->base, handle->rxDmaHandle->channel); - } - else - { - *count -= handle->minorLoopBytes * - EDMA_GetRemainingMajorLoopCount(handle->txDmaHandle->base, handle->txDmaHandle->channel); - } - } - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.h b/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.h deleted file mode 100644 index 200440b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_mculcd_edma.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXIO_MCULCD_EDMA_H_ -#define _FSL_FLEXIO_MCULCD_EDMA_H_ - -#include "fsl_edma.h" -#include "fsl_flexio_mculcd.h" - -/*! - * @addtogroup flexio_edma_mculcd - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*@{*/ -/*! @brief FlexIO MCULCD EDMA driver version. */ -#define FSL_FLEXIO_MCULCD_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) -/*@}*/ - -/*! @brief typedef for flexio_mculcd_edma_handle_t in advance. */ -typedef struct _flexio_mculcd_edma_handle flexio_mculcd_edma_handle_t; - -/*! @brief FlexIO MCULCD master callback for transfer complete. - * - * When transfer finished, the callback function is called and returns the - * @p status as kStatus_FLEXIO_MCULCD_Idle. - */ -typedef void (*flexio_mculcd_edma_transfer_callback_t)(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief FlexIO MCULCD eDMA transfer handle, users should not touch the - * content of the handle.*/ -struct _flexio_mculcd_edma_handle -{ - FLEXIO_MCULCD_Type *base; /*!< Pointer to the FLEXIO_MCULCD_Type. */ - uint8_t txShifterNum; /*!< Number of shifters used for TX. */ - uint8_t rxShifterNum; /*!< Number of shifters used for RX. */ - uint32_t minorLoopBytes; /*!< eDMA transfer minor loop bytes. */ - edma_modulo_t txEdmaModulo; /*!< Modulo value for the FlexIO shifter buffer access. */ - edma_modulo_t rxEdmaModulo; /*!< Modulo value for the FlexIO shifter buffer access. */ - uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, - this is the value to send. When writing or - reading array, this is the address of the - data array. */ - size_t dataCount; /*!< Total count to be transferred. */ - volatile size_t remainingCount; /*!< Remaining count still not transfered. */ - volatile uint32_t state; /*!< FlexIO MCULCD driver internal state. */ - edma_handle_t *txDmaHandle; /*!< DMA handle for MCULCD TX */ - edma_handle_t *rxDmaHandle; /*!< DMA handle for MCULCD RX */ - flexio_mculcd_edma_transfer_callback_t completionCallback; /*!< Callback for MCULCD DMA transfer */ - void *userData; /*!< User Data for MCULCD DMA callback */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the FLEXO MCULCD master eDMA handle. - * - * This function initializes the FLEXO MCULCD master eDMA handle which can be - * used for other FLEXO MCULCD transactional APIs. For a specified FLEXO MCULCD - * instance, call this API once to get the initialized handle. - * - * @param base Pointer to FLEXIO_MCULCD_Type structure. - * @param handle Pointer to flexio_mculcd_edma_handle_t structure to store the - * transfer state. - * @param callback MCULCD transfer complete callback, NULL means no callback. - * @param userData callback function parameter. - * @param txDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA TX, - * the DMA request source of this handle should be the first of TX shifters. - * @param rxDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA RX, - * the DMA request source of this handle should be the last of RX shifters. - * @retval kStatus_Success Successfully create the handle. - */ -status_t FLEXIO_MCULCD_TransferCreateHandleEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - flexio_mculcd_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txDmaHandle, - edma_handle_t *rxDmaHandle); - -/*! - * @brief Performs a non-blocking FlexIO MCULCD transfer using eDMA. - * - * This function returns immediately after transfer initiates. To check whether - * the transfer is completed, user could: - * 1. Use the transfer completed callback; - * 2. Polling function FLEXIO_MCULCD_GetTransferCountEDMA - * - * @param base pointer to FLEXIO_MCULCD_Type structure. - * @param handle pointer to flexio_mculcd_edma_handle_t structure to store the - * transfer state. - * @param xfer Pointer to FlexIO MCULCD transfer structure. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_MCULCD_Busy FlexIO MCULCD is not idle, it is running another - * transfer. - */ -status_t FLEXIO_MCULCD_TransferEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - flexio_mculcd_transfer_t *xfer); - -/*! - * @brief Aborts a FlexIO MCULCD transfer using eDMA. - * - * @param base pointer to FLEXIO_MCULCD_Type structure. - * @param handle FlexIO MCULCD eDMA handle pointer. - */ -void FLEXIO_MCULCD_TransferAbortEDMA(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle); - -/*! - * @brief Gets the remaining bytes for FlexIO MCULCD eDMA transfer. - * - * @param base pointer to FLEXIO_MCULCD_Type structure. - * @param handle FlexIO MCULCD eDMA handle pointer. - * @param count Number of count transferred so far by the eDMA transaction. - * @retval kStatus_Success Get the transferred count Successfully. - * @retval kStatus_NoTransferInProgress No transfer in process. - */ -status_t FLEXIO_MCULCD_TransferGetCountEDMA(FLEXIO_MCULCD_Type *base, - flexio_mculcd_edma_handle_t *handle, - size_t *count); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ -#endif /* _FSL_FLEXIO_MCULCD_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_spi.c b/devices/MIMXRT1052/drivers/fsl_flexio_spi.c deleted file mode 100644 index ef6053c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_spi.c +++ /dev/null @@ -1,1330 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_spi.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_spi" -#endif - -/*! @brief FLEXIO SPI transfer state, which is used for SPI transactiaonl APIs' internal state. */ -enum _flexio_spi_transfer_states -{ - kFLEXIO_SPI_Idle = 0x0U, /*!< Nothing in the transmitter/receiver's queue. */ - kFLEXIO_SPI_Busy, /*!< Transmiter/Receive's queue is not finished. */ -}; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Send a piece of data for SPI. - * - * This function computes the number of data to be written into D register or Tx FIFO, - * and write the data into it. At the same time, this function updates the values in - * master handle structure. - * - * @param base pointer to FLEXIO_SPI_Type structure - * @param handle Pointer to SPI master handle structure. - */ -static void FLEXIO_SPI_TransferSendTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); - -/*! - * @brief Receive a piece of data for SPI master. - * - * This function computes the number of data to receive from D register or Rx FIFO, - * and write the data to destination address. At the same time, this function updates - * the values in master handle structure. - * - * @param base pointer to FLEXIO_SPI_Type structure - * @param handle Pointer to SPI master handle structure. - */ -static void FLEXIO_SPI_TransferReceiveTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Codes - ******************************************************************************/ - -static uint32_t FLEXIO_SPI_GetInstance(FLEXIO_SPI_Type *base) -{ - return FLEXIO_GetInstance(base->flexioBase); -} - -static void FLEXIO_SPI_TransferSendTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) -{ - uint16_t tmpData = FLEXIO_SPI_DUMMYDATA; - - if (handle->txData != NULL) - { - /* Transmit data and update tx size/buff. */ - if (handle->bytePerFrame == 1U) - { - tmpData = *(handle->txData); - handle->txData++; - } - else - { - if (handle->direction == kFLEXIO_SPI_MsbFirst) - { - tmpData = (uint16_t)(handle->txData[0]) << 8U; - tmpData += handle->txData[1]; - } - else - { - tmpData = (uint16_t)(handle->txData[1]) << 8U; - tmpData += handle->txData[0]; - } - handle->txData += 2U; - } - } - else - { - tmpData = FLEXIO_SPI_DUMMYDATA; - } - - handle->txRemainingBytes -= handle->bytePerFrame; - - FLEXIO_SPI_WriteData(base, handle->direction, tmpData); - - if (0U == handle->txRemainingBytes) - { - FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); - } -} - -static void FLEXIO_SPI_TransferReceiveTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) -{ - uint16_t tmpData; - - tmpData = FLEXIO_SPI_ReadData(base, handle->direction); - - if (handle->rxData != NULL) - { - if (handle->bytePerFrame == 1U) - { - *handle->rxData = (uint8_t)tmpData; - handle->rxData++; - } - else - { - if (handle->direction == kFLEXIO_SPI_MsbFirst) - { - *handle->rxData = (uint8_t)(tmpData >> 8); - handle->rxData++; - *handle->rxData = (uint8_t)tmpData; - } - else - { - *handle->rxData = (uint8_t)tmpData; - handle->rxData++; - *handle->rxData = (uint8_t)(tmpData >> 8); - } - handle->rxData++; - } - } - handle->rxRemainingBytes -= handle->bytePerFrame; -} - -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI master hardware, - * and configures the FlexIO SPI with FlexIO SPI master configuration. The - * configuration structure can be filled by the user, or be set with default values - * by the FLEXIO_SPI_MasterGetDefaultConfig(). - * - * note 1.FlexIO SPI master only support CPOL = 0, which means clock inactive low. - * 2.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time - * is 2.5 clock cycles. So if FlexIO SPI master communicates with other spi IPs, the maximum baud - * rate is FlexIO clock frequency divided by 2*2=4. If FlexIO SPI master communicates with FlexIO - * SPI slave, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. - * - * Example - code - FLEXIO_SPI_Type spiDev = { - .flexioBase = FLEXIO, - .SDOPinIndex = 0, - .SDIPinIndex = 1, - .SCKPinIndex = 2, - .CSnPinIndex = 3, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_spi_master_config_t config = { - .enableMaster = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 500000, - .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, - .direction = kFLEXIO_SPI_MsbFirst, - .dataMode = kFLEXIO_SPI_8BitMode - }; - FLEXIO_SPI_MasterInit(&spiDev, &config, srcClock_Hz); - endcode - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param masterConfig Pointer to the flexio_spi_master_config_t structure. - * param srcClock_Hz FlexIO source clock in Hz. -*/ -void FLEXIO_SPI_MasterInit(FLEXIO_SPI_Type *base, flexio_spi_master_config_t *masterConfig, uint32_t srcClock_Hz) -{ - assert(base != NULL); - assert(masterConfig != NULL); - - flexio_shifter_config_t shifterConfig; - flexio_timer_config_t timerConfig; - uint32_t ctrlReg = 0; - uint16_t timerDiv = 0; - uint16_t timerCmp = 0; - - /* Clear the shifterConfig & timerConfig struct. */ - (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); - (void)memset(&timerConfig, 0, sizeof(timerConfig)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_SPI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Configure FLEXIO SPI Master */ - ctrlReg = base->flexioBase->CTRL; - ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - ctrlReg |= (FLEXIO_CTRL_DBGE(masterConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(masterConfig->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(masterConfig->enableMaster)); - if (!masterConfig->enableInDoze) - { - ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; - } - - base->flexioBase->CTRL = ctrlReg; - - /* Do hardware configuration. */ - /* 1. Configure the shifter 0 for tx. */ - shifterConfig.timerSelect = base->timerIndex[0]; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; - shifterConfig.pinSelect = base->SDOPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - if (masterConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - } - else - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitLow; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnShift; - } - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); - - /* 2. Configure the shifter 1 for rx. */ - shifterConfig.timerSelect = base->timerIndex[0]; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinSelect = base->SDIPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - if (masterConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - } - else - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - } - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); - - /*3. Configure the timer 0 for SCK. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutput; - timerConfig.pinSelect = base->SCKPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; - timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; - timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - - timerDiv = (uint16_t)(srcClock_Hz / masterConfig->baudRate_Bps); - timerDiv = timerDiv / 2U - 1U; - - timerCmp = ((uint16_t)masterConfig->dataMode * 2U - 1U) << 8U; - timerCmp |= timerDiv; - - timerConfig.timerCompare = timerCmp; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); - - /* 4. Configure the timer 1 for CSn. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_TIMn(base->timerIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutput; - timerConfig.pinSelect = base->CSnPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveLow; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPrevTimerEnable; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - - timerConfig.timerCompare = 0xFFFFU; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); -} - -/*! - * brief Resets the FlexIO SPI timer and shifter config. - * - * param base Pointer to the FLEXIO_SPI_Type. - */ -void FLEXIO_SPI_MasterDeinit(FLEXIO_SPI_Type *base) -{ - base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; -} - -/*! - * brief Gets the default configuration to configure the FlexIO SPI master. The configuration - * can be used directly by calling the FLEXIO_SPI_MasterConfigure(). - * Example: - code - flexio_spi_master_config_t masterConfig; - FLEXIO_SPI_MasterGetDefaultConfig(&masterConfig); - endcode - * param masterConfig Pointer to the flexio_spi_master_config_t structure. -*/ -void FLEXIO_SPI_MasterGetDefaultConfig(flexio_spi_master_config_t *masterConfig) -{ - assert(masterConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(masterConfig, 0, sizeof(*masterConfig)); - - masterConfig->enableMaster = true; - masterConfig->enableInDoze = false; - masterConfig->enableInDebug = true; - masterConfig->enableFastAccess = false; - /* Default baud rate 500kbps. */ - masterConfig->baudRate_Bps = 500000U; - /* Default CPHA = 0. */ - masterConfig->phase = kFLEXIO_SPI_ClockPhaseFirstEdge; - /* Default bit count at 8. */ - masterConfig->dataMode = kFLEXIO_SPI_8BitMode; -} - -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI slave hardware - * configuration, and configures the FlexIO SPI with FlexIO SPI slave configuration. The - * configuration structure can be filled by the user, or be set with default values - * by the FLEXIO_SPI_SlaveGetDefaultConfig(). - * - * note 1.Only one timer is needed in the FlexIO SPI slave. As a result, the second timer index is ignored. - * 2.FlexIO SPI slave only support CPOL = 0, which means clock inactive low. - * 3.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time - * is 2.5 clock cycles. So if FlexIO SPI slave communicates with other spi IPs, the maximum baud - * rate is FlexIO clock frequency divided by 3*2=6. If FlexIO SPI slave communicates with FlexIO - * SPI master, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. - * Example - code - FLEXIO_SPI_Type spiDev = { - .flexioBase = FLEXIO, - .SDOPinIndex = 0, - .SDIPinIndex = 1, - .SCKPinIndex = 2, - .CSnPinIndex = 3, - .shifterIndex = {0,1}, - .timerIndex = {0} - }; - flexio_spi_slave_config_t config = { - .enableSlave = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, - .direction = kFLEXIO_SPI_MsbFirst, - .dataMode = kFLEXIO_SPI_8BitMode - }; - FLEXIO_SPI_SlaveInit(&spiDev, &config); - endcode - * param base Pointer to the FLEXIO_SPI_Type structure. - * param slaveConfig Pointer to the flexio_spi_slave_config_t structure. -*/ -void FLEXIO_SPI_SlaveInit(FLEXIO_SPI_Type *base, flexio_spi_slave_config_t *slaveConfig) -{ - assert((base != NULL) && (slaveConfig != NULL)); - - flexio_shifter_config_t shifterConfig; - flexio_timer_config_t timerConfig; - uint32_t ctrlReg = 0; - - /* Clear the shifterConfig & timerConfig struct. */ - (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); - (void)memset(&timerConfig, 0, sizeof(timerConfig)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_SPI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Configure FLEXIO SPI Slave */ - ctrlReg = base->flexioBase->CTRL; - ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - ctrlReg |= (FLEXIO_CTRL_DBGE(slaveConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(slaveConfig->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(slaveConfig->enableSlave)); - if (!slaveConfig->enableInDoze) - { - ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; - } - - base->flexioBase->CTRL = ctrlReg; - - /* Do hardware configuration. */ - /* 1. Configure the shifter 0 for tx. */ - shifterConfig.timerSelect = base->timerIndex[0]; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; - shifterConfig.pinSelect = base->SDOPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - } - else - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnShift; - } - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); - - /* 2. Configure the shifter 1 for rx. */ - shifterConfig.timerSelect = base->timerIndex[0]; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinSelect = base->SDIPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; - if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - } - else - { - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - } - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); - - /*3. Configure the timer 0 for shift clock. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->CSnPinIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->SCKPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; - timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerRisingEdge; - timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; - if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) - { - /* The configuration kFLEXIO_TimerDisableOnTimerCompare only support continuous - PCS access, change to kFLEXIO_TimerDisableNever to enable discontinuous PCS access. */ - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; - } - else - { - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTriggerFallingEdge; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - } - - timerConfig.timerCompare = (uint32_t)slaveConfig->dataMode * 2U - 1U; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); -} - -/*! - * brief Gates the FlexIO clock. - * - * param base Pointer to the FLEXIO_SPI_Type. - */ -void FLEXIO_SPI_SlaveDeinit(FLEXIO_SPI_Type *base) -{ - FLEXIO_SPI_MasterDeinit(base); -} - -/*! - * brief Gets the default configuration to configure the FlexIO SPI slave. The configuration - * can be used directly for calling the FLEXIO_SPI_SlaveConfigure(). - * Example: - code - flexio_spi_slave_config_t slaveConfig; - FLEXIO_SPI_SlaveGetDefaultConfig(&slaveConfig); - endcode - * param slaveConfig Pointer to the flexio_spi_slave_config_t structure. -*/ -void FLEXIO_SPI_SlaveGetDefaultConfig(flexio_spi_slave_config_t *slaveConfig) -{ - assert(slaveConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); - - slaveConfig->enableSlave = true; - slaveConfig->enableInDoze = false; - slaveConfig->enableInDebug = true; - slaveConfig->enableFastAccess = false; - /* Default CPHA = 0. */ - slaveConfig->phase = kFLEXIO_SPI_ClockPhaseFirstEdge; - /* Default bit count at 8. */ - slaveConfig->dataMode = kFLEXIO_SPI_8BitMode; -} - -/*! - * brief Enables the FlexIO SPI interrupt. - * - * This function enables the FlexIO SPI interrupt. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param mask interrupt source. The parameter can be any combination of the following values: - * arg kFLEXIO_SPI_RxFullInterruptEnable - * arg kFLEXIO_SPI_TxEmptyInterruptEnable - */ -void FLEXIO_SPI_EnableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Disables the FlexIO SPI interrupt. - * - * This function disables the FlexIO SPI interrupt. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param mask interrupt source The parameter can be any combination of the following values: - * arg kFLEXIO_SPI_RxFullInterruptEnable - * arg kFLEXIO_SPI_TxEmptyInterruptEnable - */ -void FLEXIO_SPI_DisableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Enables/disables the FlexIO SPI transmit DMA. This function enables/disables the FlexIO SPI Tx DMA, - * which means that asserting the kFLEXIO_SPI_TxEmptyFlag does/doesn't trigger the DMA request. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param mask SPI DMA source. - * param enable True means enable DMA, false means disable DMA. - */ -void FLEXIO_SPI_EnableDMA(FLEXIO_SPI_Type *base, uint32_t mask, bool enable) -{ - if ((mask & (uint32_t)kFLEXIO_SPI_TxDmaEnable) != 0U) - { - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[0], enable); - } - - if ((mask & (uint32_t)kFLEXIO_SPI_RxDmaEnable) != 0U) - { - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[1], enable); - } -} - -/*! - * brief Gets FlexIO SPI status flags. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * return status flag; Use the status flag to AND the following flag mask and get the status. - * arg kFLEXIO_SPI_TxEmptyFlag - * arg kFLEXIO_SPI_RxEmptyFlag - */ - -uint32_t FLEXIO_SPI_GetStatusFlags(FLEXIO_SPI_Type *base) -{ - uint32_t shifterStatus = FLEXIO_GetShifterStatusFlags(base->flexioBase); - uint32_t status = 0; - - status = ((shifterStatus & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); - status |= (((shifterStatus & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) << 1U); - - return status; -} - -/*! - * brief Clears FlexIO SPI status flags. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param mask status flag - * The parameter can be any combination of the following values: - * arg kFLEXIO_SPI_TxEmptyFlag - * arg kFLEXIO_SPI_RxEmptyFlag - */ - -void FLEXIO_SPI_ClearStatusFlags(FLEXIO_SPI_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Sets baud rate for the FlexIO SPI transfer, which is only used for the master. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param baudRate_Bps Baud Rate needed in Hz. - * param srcClockHz SPI source clock frequency in Hz. - */ -void FLEXIO_SPI_MasterSetBaudRate(FLEXIO_SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClockHz) -{ - uint16_t timerDiv = 0; - uint16_t timerCmp = 0; - FLEXIO_Type *flexioBase = base->flexioBase; - - /* Set TIMCMP[7:0] = (baud rate divider / 2) - 1.*/ - timerDiv = (uint16_t)(srcClockHz / baudRate_Bps); - timerDiv = timerDiv / 2U - 1U; - - timerCmp = (uint16_t)(flexioBase->TIMCMP[base->timerIndex[0]]); - timerCmp &= 0xFF00U; - timerCmp |= timerDiv; - - flexioBase->TIMCMP[base->timerIndex[0]] = timerCmp; -} - -/*! - * brief Sends a buffer of data bytes. - * - * note This function blocks using the polling method until all bytes have been sent. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param direction Shift direction of MSB first or LSB first. - * param buffer The data bytes to send. - * param size The number of data bytes to send. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_WriteBlocking(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction, - const uint8_t *buffer, - size_t size) -{ - assert(buffer != NULL); - assert(size != 0U); - -#if SPI_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != size--) - { - /* Wait until data transfer complete. */ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_FLEXIO_SPI_Timeout; - } -#endif - FLEXIO_SPI_WriteData(base, direction, *buffer++); - } - - return kStatus_Success; -} - -/*! - * brief Receives a buffer of bytes. - * - * note This function blocks using the polling method until all bytes have been received. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param direction Shift direction of MSB first or LSB first. - * param buffer The buffer to store the received bytes. - * param size The number of data bytes to be received. - * param direction Shift direction of MSB first or LSB first. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_ReadBlocking(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction, - uint8_t *buffer, - size_t size) -{ - assert(buffer != NULL); - assert(size != 0U); - -#if SPI_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != size--) - { - /* Wait until data transfer complete. */ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_FLEXIO_SPI_Timeout; - } -#endif - *buffer++ = (uint8_t)FLEXIO_SPI_ReadData(base, direction); - } - - return kStatus_Success; -} - -/*! - * brief Receives a buffer of bytes. - * - * note This function blocks via polling until all bytes have been received. - * - * param base pointer to FLEXIO_SPI_Type structure - * param xfer FlexIO SPI transfer structure, see #flexio_spi_transfer_t. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_MasterTransferBlocking(FLEXIO_SPI_Type *base, flexio_spi_transfer_t *xfer) -{ - flexio_spi_shift_direction_t direction; - uint8_t bytesPerFrame; - uint32_t dataMode = 0; - uint16_t timerCmp = (uint16_t)(base->flexioBase->TIMCMP[base->timerIndex[0]]); - uint16_t tmpData = FLEXIO_SPI_DUMMYDATA; -#if SPI_RETRY_TIMES - uint32_t waitTimes; -#endif - - timerCmp &= 0x00FFU; - /* Configure the values in handle. */ - switch (xfer->flags) - { - case (uint8_t)kFLEXIO_SPI_8bitMsb: - dataMode = (8UL * 2UL - 1UL) << 8U; - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_MsbFirst; - break; - - case (uint8_t)kFLEXIO_SPI_8bitLsb: - dataMode = (8UL * 2UL - 1UL) << 8U; - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_LsbFirst; - break; - - case (uint8_t)kFLEXIO_SPI_16bitMsb: - dataMode = (16UL * 2UL - 1UL) << 8U; - bytesPerFrame = 2U; - direction = kFLEXIO_SPI_MsbFirst; - break; - - case (uint8_t)kFLEXIO_SPI_16bitLsb: - dataMode = (16UL * 2UL - 1UL) << 8U; - bytesPerFrame = 2U; - direction = kFLEXIO_SPI_LsbFirst; - break; - - default: - dataMode = (8UL * 2UL - 1UL) << 8U; - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_MsbFirst; - assert(true); - break; - } - - dataMode |= timerCmp; - - /* Configure transfer size. */ - base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; - - while (xfer->dataSize != 0U) - { - /* Wait until data transfer complete. */ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_FLEXIO_SPI_Timeout; - } -#endif - if (xfer->txData != NULL) - { - /* Transmit data and update tx size/buff. */ - if (bytesPerFrame == 1U) - { - tmpData = *(xfer->txData); - xfer->txData++; - } - else - { - if (direction == kFLEXIO_SPI_MsbFirst) - { - tmpData = (uint16_t)(xfer->txData[0]) << 8U; - tmpData += xfer->txData[1]; - } - else - { - tmpData = (uint16_t)(xfer->txData[1]) << 8U; - tmpData += xfer->txData[0]; - } - xfer->txData += 2U; - } - } - else - { - tmpData = FLEXIO_SPI_DUMMYDATA; - } - - xfer->dataSize -= bytesPerFrame; - - FLEXIO_SPI_WriteData(base, direction, tmpData); - -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_FLEXIO_SPI_Timeout; - } -#endif - tmpData = FLEXIO_SPI_ReadData(base, direction); - - if (xfer->rxData != NULL) - { - if (bytesPerFrame == 1U) - { - *xfer->rxData = (uint8_t)tmpData; - xfer->rxData++; - } - else - { - if (direction == kFLEXIO_SPI_MsbFirst) - { - *xfer->rxData = (uint8_t)(tmpData >> 8); - xfer->rxData++; - *xfer->rxData = (uint8_t)tmpData; - } - else - { - *xfer->rxData = (uint8_t)tmpData; - xfer->rxData++; - *xfer->rxData = (uint8_t)(tmpData >> 8); - } - xfer->rxData++; - } - } - } - - return kStatus_Success; -} - -/*! - * brief Initializes the FlexIO SPI Master handle, which is used in transactional functions. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * param callback The callback function. - * param userData The parameter of the callback function. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_SPI_MasterTransferCreateHandle(FLEXIO_SPI_Type *base, - flexio_spi_master_handle_t *handle, - flexio_spi_master_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Register callback and userData. */ - handle->callback = callback; - handle->userData = userData; - - /* Clear pending NVIC IRQ before enable NVIC IRQ. */ - NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); - - /* Save the context in global variables to support the double weak mechanism. */ - return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_SPI_MasterTransferHandleIRQ); -} - -/*! - * brief Master transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which returns - * right away. When all data is sent out/received, the callback function is called. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_SPI_Busy SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_MasterTransferNonBlocking(FLEXIO_SPI_Type *base, - flexio_spi_master_handle_t *handle, - flexio_spi_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - uint32_t dataMode = 0; - uint16_t timerCmp = (uint16_t)base->flexioBase->TIMCMP[base->timerIndex[0]]; - uint16_t tmpData = FLEXIO_SPI_DUMMYDATA; - - timerCmp &= 0x00FFU; - - /* Check if SPI is busy. */ - if (handle->state == (uint32_t)kFLEXIO_SPI_Busy) - { - return kStatus_FLEXIO_SPI_Busy; - } - - /* Check if the argument is legal. */ - if ((xfer->txData == NULL) && (xfer->rxData == NULL)) - { - return kStatus_InvalidArgument; - } - - /* Configure the values in handle */ - switch (xfer->flags) - { - case (uint8_t)kFLEXIO_SPI_8bitMsb: - dataMode = (8UL * 2UL - 1UL) << 8U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_8bitLsb: - dataMode = (8UL * 2UL - 1UL) << 8U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_LsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitMsb: - dataMode = (16UL * 2UL - 1UL) << 8U; - handle->bytePerFrame = 2U; - handle->direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitLsb: - dataMode = (16UL * 2UL - 1UL) << 8U; - handle->bytePerFrame = 2U; - handle->direction = kFLEXIO_SPI_LsbFirst; - break; - default: - dataMode = (8UL * 2UL - 1UL) << 8U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_MsbFirst; - assert(true); - break; - } - - dataMode |= timerCmp; - - /* Configure transfer size. */ - base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; - - handle->state = (uint32_t)kFLEXIO_SPI_Busy; - handle->txData = xfer->txData; - handle->rxData = xfer->rxData; - handle->rxRemainingBytes = xfer->dataSize; - - /* Save total transfer size. */ - handle->transferSize = xfer->dataSize; - - /* Send first byte of data to trigger the rx interrupt. */ - if (handle->txData != NULL) - { - /* Transmit data and update tx size/buff. */ - if (handle->bytePerFrame == 1U) - { - tmpData = *(handle->txData); - handle->txData++; - } - else - { - if (handle->direction == kFLEXIO_SPI_MsbFirst) - { - tmpData = (uint16_t)(handle->txData[0]) << 8U; - tmpData += handle->txData[1]; - } - else - { - tmpData = (uint16_t)(handle->txData[1]) << 8U; - tmpData += handle->txData[0]; - } - handle->txData += 2U; - } - } - else - { - tmpData = FLEXIO_SPI_DUMMYDATA; - } - - handle->txRemainingBytes = xfer->dataSize - handle->bytePerFrame; - - FLEXIO_SPI_WriteData(base, handle->direction, tmpData); - - /* Enable transmit and receive interrupt to handle rx. */ - FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); - - return kStatus_Success; -} - -/*! - * brief Gets the data transfer status which used IRQ. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * param count Number of bytes transferred so far by the non-blocking transaction. - * retval kStatus_InvalidArgument count is Invalid. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_SPI_MasterTransferGetCount(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Return remaing bytes in different cases. */ - if (handle->rxData != NULL) - { - *count = handle->transferSize - handle->rxRemainingBytes; - } - else - { - *count = handle->transferSize - handle->txRemainingBytes; - } - - return kStatus_Success; -} - -/*! - * brief Aborts the master data transfer, which used IRQ. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_MasterTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) -{ - assert(handle != NULL); - - FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); - FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); - - /* Transfer finished, set the state to idle. */ - handle->state = (uint32_t)kFLEXIO_SPI_Idle; - - /* Clear the internal state. */ - handle->rxRemainingBytes = 0; - handle->txRemainingBytes = 0; -} - -/*! - * brief FlexIO SPI master IRQ handler function. - * - * param spiType Pointer to the FLEXIO_SPI_Type structure. - * param spiHandle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_MasterTransferHandleIRQ(void *spiType, void *spiHandle) -{ - assert(spiHandle != NULL); - - flexio_spi_master_handle_t *handle = (flexio_spi_master_handle_t *)spiHandle; - FLEXIO_SPI_Type *base; - uint32_t status; - - if (handle->state == (uint32_t)kFLEXIO_SPI_Idle) - { - return; - } - - base = (FLEXIO_SPI_Type *)spiType; - status = FLEXIO_SPI_GetStatusFlags(base); - - /* Handle rx. */ - if (((status & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) != 0U) && (handle->rxRemainingBytes != 0U)) - { - FLEXIO_SPI_TransferReceiveTransaction(base, handle); - } - - /* Handle tx. */ - if (((status & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) && (handle->txRemainingBytes != 0U)) - { - FLEXIO_SPI_TransferSendTransaction(base, handle); - } - - /* All the transfer finished. */ - if ((handle->txRemainingBytes == 0U) && (handle->rxRemainingBytes == 0U)) - { - FLEXIO_SPI_MasterTransferAbort(base, handle); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_FLEXIO_SPI_Idle, handle->userData); - } - } -} - -/*! - * brief Initializes the FlexIO SPI Slave handle, which is used in transactional functions. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - * param callback The callback function. - * param userData The parameter of the callback function. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_SPI_SlaveTransferCreateHandle(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - flexio_spi_slave_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Register callback and userData. */ - handle->callback = callback; - handle->userData = userData; - - /* Clear pending NVIC IRQ before enable NVIC IRQ. */ - NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); - - /* Save the context in global variables to support the double weak mechanism. */ - return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_SPI_SlaveTransferHandleIRQ); -} - -/*! - * brief Slave transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which returns - * right away. When all data is sent out/received, the callback function is called. - * param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - * - * param base Pointer to the FLEXIO_SPI_Type structure. - * param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_SPI_Busy SPI is not idle; it is running another transfer. - */ -status_t FLEXIO_SPI_SlaveTransferNonBlocking(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - flexio_spi_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - uint32_t dataMode = 0; - - /* Check if SPI is busy. */ - if (handle->state == (uint32_t)kFLEXIO_SPI_Busy) - { - return kStatus_FLEXIO_SPI_Busy; - } - - /* Check if the argument is legal. */ - if ((xfer->txData == NULL) && (xfer->rxData == NULL)) - { - return kStatus_InvalidArgument; - } - - /* Configure the values in handle */ - switch (xfer->flags) - { - case (uint8_t)kFLEXIO_SPI_8bitMsb: - dataMode = 8U * 2U - 1U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_8bitLsb: - dataMode = 8U * 2U - 1U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_LsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitMsb: - dataMode = 16U * 2U - 1U; - handle->bytePerFrame = 2U; - handle->direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitLsb: - dataMode = 16U * 2U - 1U; - handle->bytePerFrame = 2U; - handle->direction = kFLEXIO_SPI_LsbFirst; - break; - default: - dataMode = 8U * 2U - 1U; - handle->bytePerFrame = 1U; - handle->direction = kFLEXIO_SPI_MsbFirst; - assert(true); - break; - } - - /* Configure transfer size. */ - base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; - - handle->state = (uint32_t)kFLEXIO_SPI_Busy; - handle->txData = xfer->txData; - handle->rxData = xfer->rxData; - handle->txRemainingBytes = xfer->dataSize; - handle->rxRemainingBytes = xfer->dataSize; - - /* Save total transfer size. */ - handle->transferSize = xfer->dataSize; - - /* Enable transmit and receive interrupt to handle tx and rx. */ - FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); - FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); - - return kStatus_Success; -} - -/*! - * brief FlexIO SPI slave IRQ handler function. - * - * param spiType Pointer to the FLEXIO_SPI_Type structure. - * param spiHandle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_SlaveTransferHandleIRQ(void *spiType, void *spiHandle) -{ - assert(spiHandle != NULL); - - flexio_spi_master_handle_t *handle = (flexio_spi_master_handle_t *)spiHandle; - FLEXIO_SPI_Type *base; - uint32_t status; - - if (handle->state == (uint32_t)kFLEXIO_SPI_Idle) - { - return; - } - - base = (FLEXIO_SPI_Type *)spiType; - status = FLEXIO_SPI_GetStatusFlags(base); - - /* Handle tx. */ - if (((status & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) && (handle->txRemainingBytes != 0U)) - { - FLEXIO_SPI_TransferSendTransaction(base, handle); - } - - /* Handle rx. */ - if (((status & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) != 0U) && (handle->rxRemainingBytes != 0U)) - { - FLEXIO_SPI_TransferReceiveTransaction(base, handle); - } - - /* All the transfer finished. */ - if ((handle->txRemainingBytes == 0U) && (handle->rxRemainingBytes == 0U)) - { - FLEXIO_SPI_SlaveTransferAbort(base, handle); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_FLEXIO_SPI_Idle, handle->userData); - } - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_spi.h b/devices/MIMXRT1052/drivers/fsl_flexio_spi.h deleted file mode 100644 index ecefe93..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_spi.h +++ /dev/null @@ -1,702 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXIO_SPI_H_ -#define _FSL_FLEXIO_SPI_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" - -/*! - * @addtogroup flexio_spi - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO SPI driver version 2.2.0. */ -#define FSL_FLEXIO_SPI_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) -/*@}*/ - -#ifndef FLEXIO_SPI_DUMMYDATA -/*! @brief FlexIO SPI dummy transfer data, the data is sent while txData is NULL. */ -#define FLEXIO_SPI_DUMMYDATA (0xFFFFU) -#endif - -/*! @brief Retry times for waiting flag. */ -#ifndef SPI_RETRY_TIMES -#define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ -#endif - -/*! @brief Error codes for the FlexIO SPI driver. */ -enum -{ - kStatus_FLEXIO_SPI_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 1), /*!< FlexIO SPI is busy. */ - kStatus_FLEXIO_SPI_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 2), /*!< SPI is idle */ - kStatus_FLEXIO_SPI_Error = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 3), /*!< FlexIO SPI error. */ - kStatus_FLEXIO_SPI_Timeout = - MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 4), /*!< FlexIO SPI timeout polling status flags. */ -}; - -/*! @brief FlexIO SPI clock phase configuration. */ -typedef enum _flexio_spi_clock_phase -{ - kFLEXIO_SPI_ClockPhaseFirstEdge = 0x0U, /*!< First edge on SPSCK occurs at the middle of the first - * cycle of a data transfer. */ - kFLEXIO_SPI_ClockPhaseSecondEdge = 0x1U, /*!< First edge on SPSCK occurs at the start of the - * first cycle of a data transfer. */ -} flexio_spi_clock_phase_t; - -/*! @brief FlexIO SPI data shifter direction options. */ -typedef enum _flexio_spi_shift_direction -{ - kFLEXIO_SPI_MsbFirst = 0, /*!< Data transfers start with most significant bit. */ - kFLEXIO_SPI_LsbFirst = 1, /*!< Data transfers start with least significant bit. */ -} flexio_spi_shift_direction_t; - -/*! @brief FlexIO SPI data length mode options. */ -typedef enum _flexio_spi_data_bitcount_mode -{ - kFLEXIO_SPI_8BitMode = 0x08U, /*!< 8-bit data transmission mode. */ - kFLEXIO_SPI_16BitMode = 0x10U, /*!< 16-bit data transmission mode. */ -} flexio_spi_data_bitcount_mode_t; - -/*! @brief Define FlexIO SPI interrupt mask. */ -enum _flexio_spi_interrupt_enable -{ - kFLEXIO_SPI_TxEmptyInterruptEnable = 0x1U, /*!< Transmit buffer empty interrupt enable. */ - kFLEXIO_SPI_RxFullInterruptEnable = 0x2U, /*!< Receive buffer full interrupt enable. */ -}; - -/*! @brief Define FlexIO SPI status mask. */ -enum _flexio_spi_status_flags -{ - kFLEXIO_SPI_TxBufferEmptyFlag = 0x1U, /*!< Transmit buffer empty flag. */ - kFLEXIO_SPI_RxBufferFullFlag = 0x2U, /*!< Receive buffer full flag. */ -}; - -/*! @brief Define FlexIO SPI DMA mask. */ -enum _flexio_spi_dma_enable -{ - kFLEXIO_SPI_TxDmaEnable = 0x1U, /*!< Tx DMA request source */ - kFLEXIO_SPI_RxDmaEnable = 0x2U, /*!< Rx DMA request source */ - kFLEXIO_SPI_DmaAllEnable = 0x3U, /*!< All DMA request source*/ -}; - -/*! @brief Define FlexIO SPI transfer flags. */ -enum _flexio_spi_transfer_flags -{ - kFLEXIO_SPI_8bitMsb = 0x1U, /*!< FlexIO SPI 8-bit MSB first */ - kFLEXIO_SPI_8bitLsb = 0x2U, /*!< FlexIO SPI 8-bit LSB first */ - kFLEXIO_SPI_16bitMsb = 0x9U, /*!< FlexIO SPI 16-bit MSB first */ - kFLEXIO_SPI_16bitLsb = 0xaU, /*!< FlexIO SPI 16-bit LSB first */ -}; - -/*! @brief Define FlexIO SPI access structure typedef. */ -typedef struct _flexio_spi_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ - uint8_t SDOPinIndex; /*!< Pin select for data output. */ - uint8_t SDIPinIndex; /*!< Pin select for data input. */ - uint8_t SCKPinIndex; /*!< Pin select for clock. */ - uint8_t CSnPinIndex; /*!< Pin select for enable. */ - uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO SPI. */ - uint8_t timerIndex[2]; /*!< Timer index used in FlexIO SPI. */ -} FLEXIO_SPI_Type; - -/*! @brief Define FlexIO SPI master configuration structure. */ -typedef struct _flexio_spi_master_config -{ - bool enableMaster; /*!< Enable/disable FlexIO SPI master after configuration. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, - fast access requires the FlexIO clock to be at least - twice the frequency of the bus clock. */ - uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ - flexio_spi_clock_phase_t phase; /*!< Clock phase. */ - flexio_spi_data_bitcount_mode_t dataMode; /*!< 8bit or 16bit mode. */ -} flexio_spi_master_config_t; - -/*! @brief Define FlexIO SPI slave configuration structure. */ -typedef struct _flexio_spi_slave_config -{ - bool enableSlave; /*!< Enable/disable FlexIO SPI slave after configuration. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, - fast access requires the FlexIO clock to be at least - twice the frequency of the bus clock. */ - flexio_spi_clock_phase_t phase; /*!< Clock phase. */ - flexio_spi_data_bitcount_mode_t dataMode; /*!< 8bit or 16bit mode. */ -} flexio_spi_slave_config_t; - -/*! @brief Define FlexIO SPI transfer structure. */ -typedef struct _flexio_spi_transfer -{ - uint8_t *txData; /*!< Send buffer. */ - uint8_t *rxData; /*!< Receive buffer. */ - size_t dataSize; /*!< Transfer bytes. */ - uint8_t flags; /*!< FlexIO SPI control flag, MSB first or LSB first. */ -} flexio_spi_transfer_t; - -/*! @brief typedef for flexio_spi_master_handle_t in advance. */ -typedef struct _flexio_spi_master_handle flexio_spi_master_handle_t; - -/*! @brief Slave handle is the same with master handle. */ -typedef flexio_spi_master_handle_t flexio_spi_slave_handle_t; - -/*! @brief FlexIO SPI master callback for finished transmit */ -typedef void (*flexio_spi_master_transfer_callback_t)(FLEXIO_SPI_Type *base, - flexio_spi_master_handle_t *handle, - status_t status, - void *userData); - -/*! @brief FlexIO SPI slave callback for finished transmit */ -typedef void (*flexio_spi_slave_transfer_callback_t)(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Define FlexIO SPI handle structure. */ -struct _flexio_spi_master_handle -{ - uint8_t *txData; /*!< Transfer buffer. */ - uint8_t *rxData; /*!< Receive buffer. */ - size_t transferSize; /*!< Total bytes to be transferred. */ - volatile size_t txRemainingBytes; /*!< Send data remaining in bytes. */ - volatile size_t rxRemainingBytes; /*!< Receive data remaining in bytes. */ - volatile uint32_t state; /*!< FlexIO SPI internal state. */ - uint8_t bytePerFrame; /*!< SPI mode, 2bytes or 1byte in a frame */ - flexio_spi_shift_direction_t direction; /*!< Shift direction. */ - flexio_spi_master_transfer_callback_t callback; /*!< FlexIO SPI callback. */ - void *userData; /*!< Callback parameter. */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name FlexIO SPI Configuration - * @{ - */ - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI master hardware, - * and configures the FlexIO SPI with FlexIO SPI master configuration. The - * configuration structure can be filled by the user, or be set with default values - * by the FLEXIO_SPI_MasterGetDefaultConfig(). - * - * @note 1.FlexIO SPI master only support CPOL = 0, which means clock inactive low. - * 2.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time - * is 2.5 clock cycles. So if FlexIO SPI master communicates with other spi IPs, the maximum baud - * rate is FlexIO clock frequency divided by 2*2=4. If FlexIO SPI master communicates with FlexIO - * SPI slave, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. - * - * Example - @code - FLEXIO_SPI_Type spiDev = { - .flexioBase = FLEXIO, - .SDOPinIndex = 0, - .SDIPinIndex = 1, - .SCKPinIndex = 2, - .CSnPinIndex = 3, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_spi_master_config_t config = { - .enableMaster = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 500000, - .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, - .direction = kFLEXIO_SPI_MsbFirst, - .dataMode = kFLEXIO_SPI_8BitMode - }; - FLEXIO_SPI_MasterInit(&spiDev, &config, srcClock_Hz); - @endcode - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param masterConfig Pointer to the flexio_spi_master_config_t structure. - * @param srcClock_Hz FlexIO source clock in Hz. -*/ -void FLEXIO_SPI_MasterInit(FLEXIO_SPI_Type *base, flexio_spi_master_config_t *masterConfig, uint32_t srcClock_Hz); - -/*! - * @brief Resets the FlexIO SPI timer and shifter config. - * - * @param base Pointer to the FLEXIO_SPI_Type. - */ -void FLEXIO_SPI_MasterDeinit(FLEXIO_SPI_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO SPI master. The configuration - * can be used directly by calling the FLEXIO_SPI_MasterConfigure(). - * Example: - @code - flexio_spi_master_config_t masterConfig; - FLEXIO_SPI_MasterGetDefaultConfig(&masterConfig); - @endcode - * @param masterConfig Pointer to the flexio_spi_master_config_t structure. -*/ -void FLEXIO_SPI_MasterGetDefaultConfig(flexio_spi_master_config_t *masterConfig); - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI slave hardware - * configuration, and configures the FlexIO SPI with FlexIO SPI slave configuration. The - * configuration structure can be filled by the user, or be set with default values - * by the FLEXIO_SPI_SlaveGetDefaultConfig(). - * - * @note 1.Only one timer is needed in the FlexIO SPI slave. As a result, the second timer index is ignored. - * 2.FlexIO SPI slave only support CPOL = 0, which means clock inactive low. - * 3.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time - * is 2.5 clock cycles. So if FlexIO SPI slave communicates with other spi IPs, the maximum baud - * rate is FlexIO clock frequency divided by 3*2=6. If FlexIO SPI slave communicates with FlexIO - * SPI master, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. - * Example - @code - FLEXIO_SPI_Type spiDev = { - .flexioBase = FLEXIO, - .SDOPinIndex = 0, - .SDIPinIndex = 1, - .SCKPinIndex = 2, - .CSnPinIndex = 3, - .shifterIndex = {0,1}, - .timerIndex = {0} - }; - flexio_spi_slave_config_t config = { - .enableSlave = true, - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, - .direction = kFLEXIO_SPI_MsbFirst, - .dataMode = kFLEXIO_SPI_8BitMode - }; - FLEXIO_SPI_SlaveInit(&spiDev, &config); - @endcode - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param slaveConfig Pointer to the flexio_spi_slave_config_t structure. -*/ -void FLEXIO_SPI_SlaveInit(FLEXIO_SPI_Type *base, flexio_spi_slave_config_t *slaveConfig); - -/*! - * @brief Gates the FlexIO clock. - * - * @param base Pointer to the FLEXIO_SPI_Type. - */ -void FLEXIO_SPI_SlaveDeinit(FLEXIO_SPI_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO SPI slave. The configuration - * can be used directly for calling the FLEXIO_SPI_SlaveConfigure(). - * Example: - @code - flexio_spi_slave_config_t slaveConfig; - FLEXIO_SPI_SlaveGetDefaultConfig(&slaveConfig); - @endcode - * @param slaveConfig Pointer to the flexio_spi_slave_config_t structure. -*/ -void FLEXIO_SPI_SlaveGetDefaultConfig(flexio_spi_slave_config_t *slaveConfig); - -/*@}*/ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets FlexIO SPI status flags. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @return status flag; Use the status flag to AND the following flag mask and get the status. - * @arg kFLEXIO_SPI_TxEmptyFlag - * @arg kFLEXIO_SPI_RxEmptyFlag - */ - -uint32_t FLEXIO_SPI_GetStatusFlags(FLEXIO_SPI_Type *base); - -/*! - * @brief Clears FlexIO SPI status flags. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param mask status flag - * The parameter can be any combination of the following values: - * @arg kFLEXIO_SPI_TxEmptyFlag - * @arg kFLEXIO_SPI_RxEmptyFlag - */ - -void FLEXIO_SPI_ClearStatusFlags(FLEXIO_SPI_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the FlexIO SPI interrupt. - * - * This function enables the FlexIO SPI interrupt. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param mask interrupt source. The parameter can be any combination of the following values: - * @arg kFLEXIO_SPI_RxFullInterruptEnable - * @arg kFLEXIO_SPI_TxEmptyInterruptEnable - */ -void FLEXIO_SPI_EnableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask); - -/*! - * @brief Disables the FlexIO SPI interrupt. - * - * This function disables the FlexIO SPI interrupt. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param mask interrupt source The parameter can be any combination of the following values: - * @arg kFLEXIO_SPI_RxFullInterruptEnable - * @arg kFLEXIO_SPI_TxEmptyInterruptEnable - */ -void FLEXIO_SPI_DisableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask); - -/*@}*/ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO SPI transmit DMA. This function enables/disables the FlexIO SPI Tx DMA, - * which means that asserting the kFLEXIO_SPI_TxEmptyFlag does/doesn't trigger the DMA request. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param mask SPI DMA source. - * @param enable True means enable DMA, false means disable DMA. - */ -void FLEXIO_SPI_EnableDMA(FLEXIO_SPI_Type *base, uint32_t mask, bool enable); - -/*! - * @brief Gets the FlexIO SPI transmit data register address for MSB first transfer. - * - * This function returns the SPI data register address, which is mainly used by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @return FlexIO SPI transmit data register address. - */ -static inline uint32_t FLEXIO_SPI_GetTxDataRegisterAddress(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction) -{ - if (direction == kFLEXIO_SPI_MsbFirst) - { - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, - base->shifterIndex[0]) + - 3U; - } - else - { - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[0]); - } -} - -/*! - * @brief Gets the FlexIO SPI receive data register address for the MSB first transfer. - * - * This function returns the SPI data register address, which is mainly used by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @return FlexIO SPI receive data register address. - */ -static inline uint32_t FLEXIO_SPI_GetRxDataRegisterAddress(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction) -{ - if (direction == kFLEXIO_SPI_MsbFirst) - { - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, base->shifterIndex[1]); - } - else - { - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[1]) + 3U; - } -} - -/*@}*/ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO SPI module operation. - * - * @param base Pointer to the FLEXIO_SPI_Type. - * @param enable True to enable, false does not have any effect. - */ -static inline void FLEXIO_SPI_Enable(FLEXIO_SPI_Type *base, bool enable) -{ - if (enable) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/*! - * @brief Sets baud rate for the FlexIO SPI transfer, which is only used for the master. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param baudRate_Bps Baud Rate needed in Hz. - * @param srcClockHz SPI source clock frequency in Hz. - */ -void FLEXIO_SPI_MasterSetBaudRate(FLEXIO_SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClockHz); - -/*! - * @brief Writes one byte of data, which is sent using the MSB method. - * - * @note This is a non-blocking API, which returns directly after the data is put into the - * data register but the data transfer is not finished on the bus. Ensure that - * the TxEmptyFlag is asserted before calling this API. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @param data 8 bit/16 bit data. - */ -static inline void FLEXIO_SPI_WriteData(FLEXIO_SPI_Type *base, flexio_spi_shift_direction_t direction, uint16_t data) -{ - if (direction == kFLEXIO_SPI_MsbFirst) - { - base->flexioBase->SHIFTBUFBBS[base->shifterIndex[0]] = data; - } - else - { - base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = data; - } -} - -/*! - * @brief Reads 8 bit/16 bit data. - * - * @note This is a non-blocking API, which returns directly after the data is read from the - * data register. Ensure that the RxFullFlag is asserted before calling this API. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @return 8 bit/16 bit data received. - */ -static inline uint16_t FLEXIO_SPI_ReadData(FLEXIO_SPI_Type *base, flexio_spi_shift_direction_t direction) -{ - if (direction == kFLEXIO_SPI_MsbFirst) - { - return (uint16_t)(base->flexioBase->SHIFTBUFBIS[base->shifterIndex[1]]); - } - else - { - return (uint16_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); - } -} - -/*! - * @brief Sends a buffer of data bytes. - * - * @note This function blocks using the polling method until all bytes have been sent. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @param buffer The data bytes to send. - * @param size The number of data bytes to send. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_WriteBlocking(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction, - const uint8_t *buffer, - size_t size); - -/*! - * @brief Receives a buffer of bytes. - * - * @note This function blocks using the polling method until all bytes have been received. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param direction Shift direction of MSB first or LSB first. - * @param buffer The buffer to store the received bytes. - * @param size The number of data bytes to be received. - * @param direction Shift direction of MSB first or LSB first. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_ReadBlocking(FLEXIO_SPI_Type *base, - flexio_spi_shift_direction_t direction, - uint8_t *buffer, - size_t size); - -/*! - * @brief Receives a buffer of bytes. - * - * @note This function blocks via polling until all bytes have been received. - * - * @param base pointer to FLEXIO_SPI_Type structure - * @param xfer FlexIO SPI transfer structure, see #flexio_spi_transfer_t. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. - */ -status_t FLEXIO_SPI_MasterTransferBlocking(FLEXIO_SPI_Type *base, flexio_spi_transfer_t *xfer); - -/*Transactional APIs*/ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the FlexIO SPI Master handle, which is used in transactional functions. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_SPI_MasterTransferCreateHandle(FLEXIO_SPI_Type *base, - flexio_spi_master_handle_t *handle, - flexio_spi_master_transfer_callback_t callback, - void *userData); - -/*! - * @brief Master transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which returns - * right away. When all data is sent out/received, the callback function is called. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * @param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_SPI_Busy SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_MasterTransferNonBlocking(FLEXIO_SPI_Type *base, - flexio_spi_master_handle_t *handle, - flexio_spi_transfer_t *xfer); - -/*! - * @brief Aborts the master data transfer, which used IRQ. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_MasterTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); - -/*! - * @brief Gets the data transfer status which used IRQ. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_InvalidArgument count is Invalid. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_SPI_MasterTransferGetCount(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle, size_t *count); - -/*! - * @brief FlexIO SPI master IRQ handler function. - * - * @param spiType Pointer to the FLEXIO_SPI_Type structure. - * @param spiHandle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_MasterTransferHandleIRQ(void *spiType, void *spiHandle); - -/*! - * @brief Initializes the FlexIO SPI Slave handle, which is used in transactional functions. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_SPI_SlaveTransferCreateHandle(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - flexio_spi_slave_transfer_callback_t callback, - void *userData); - -/*! - * @brief Slave transfer data using IRQ. - * - * This function sends data using IRQ. This is a non-blocking function, which returns - * right away. When all data is sent out/received, the callback function is called. - * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_SPI_Busy SPI is not idle; it is running another transfer. - */ -status_t FLEXIO_SPI_SlaveTransferNonBlocking(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - flexio_spi_transfer_t *xfer); - -/*! - * @brief Aborts the slave data transfer which used IRQ, share same API with master. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - */ -static inline void FLEXIO_SPI_SlaveTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_slave_handle_t *handle) -{ - FLEXIO_SPI_MasterTransferAbort(base, handle); -} -/*! - * @brief Gets the data transfer status which used IRQ, share same API with master. - * - * @param base Pointer to the FLEXIO_SPI_Type structure. - * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_InvalidArgument count is Invalid. - * @retval kStatus_Success Successfully return the count. - */ -static inline status_t FLEXIO_SPI_SlaveTransferGetCount(FLEXIO_SPI_Type *base, - flexio_spi_slave_handle_t *handle, - size_t *count) -{ - return FLEXIO_SPI_MasterTransferGetCount(base, handle, count); -} - -/*! - * @brief FlexIO SPI slave IRQ handler function. - * - * @param spiType Pointer to the FLEXIO_SPI_Type structure. - * @param spiHandle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. - */ -void FLEXIO_SPI_SlaveTransferHandleIRQ(void *spiType, void *spiHandle); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ -/*@}*/ - -#endif /*_FSL_FLEXIO_SPI_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c b/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c deleted file mode 100644 index 3adf92d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_spi_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_spi_edma" -#endif - -/*base, (uint32_t)kFLEXIO_SPI_TxDmaEnable, false); - - /* change the state */ - spiPrivateHandle->handle->txInProgress = false; - - /* All finished, call the callback */ - if ((spiPrivateHandle->handle->txInProgress == false) && (spiPrivateHandle->handle->rxInProgress == false)) - { - if (spiPrivateHandle->handle->callback != NULL) - { - (spiPrivateHandle->handle->callback)(spiPrivateHandle->base, spiPrivateHandle->handle, kStatus_Success, - spiPrivateHandle->handle->userData); - } - } - } -} - -static void FLEXIO_SPI_RxEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) -{ - tcds = tcds; - flexio_spi_master_edma_private_handle_t *spiPrivateHandle = (flexio_spi_master_edma_private_handle_t *)param; - - if (transferDone) - { - /* Disable Rx dma */ - FLEXIO_SPI_EnableDMA(spiPrivateHandle->base, (uint32_t)kFLEXIO_SPI_RxDmaEnable, false); - - /* change the state */ - spiPrivateHandle->handle->rxInProgress = false; - - /* All finished, call the callback */ - if ((spiPrivateHandle->handle->txInProgress == false) && (spiPrivateHandle->handle->rxInProgress == false)) - { - if (spiPrivateHandle->handle->callback != NULL) - { - (spiPrivateHandle->handle->callback)(spiPrivateHandle->base, spiPrivateHandle->handle, kStatus_Success, - spiPrivateHandle->handle->userData); - } - } - } -} - -static void FLEXIO_SPI_EDMAConfig(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - flexio_spi_transfer_t *xfer) -{ - edma_transfer_config_t xferConfig = {0}; - flexio_spi_shift_direction_t direction = kFLEXIO_SPI_MsbFirst; - uint8_t bytesPerFrame; - - /* Configure the values in handle. */ - switch (xfer->flags) - { - case (uint8_t)kFLEXIO_SPI_8bitMsb: - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_8bitLsb: - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_LsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitMsb: - bytesPerFrame = 2U; - direction = kFLEXIO_SPI_MsbFirst; - break; - case (uint8_t)kFLEXIO_SPI_16bitLsb: - bytesPerFrame = 2U; - direction = kFLEXIO_SPI_LsbFirst; - break; - default: - bytesPerFrame = 1U; - direction = kFLEXIO_SPI_MsbFirst; - assert(true); - break; - } - - /* Save total transfer size. */ - handle->transferSize = xfer->dataSize; - - /* Configure tx transfer EDMA. */ - xferConfig.destAddr = FLEXIO_SPI_GetTxDataRegisterAddress(base, direction); - xferConfig.destOffset = 0; - if (bytesPerFrame == 1U) - { - xferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; - xferConfig.destTransferSize = kEDMA_TransferSize1Bytes; - xferConfig.minorLoopBytes = 1U; - } - else - { - if (direction == kFLEXIO_SPI_MsbFirst) - { - xferConfig.destAddr -= 1U; - } - xferConfig.srcTransferSize = kEDMA_TransferSize2Bytes; - xferConfig.destTransferSize = kEDMA_TransferSize2Bytes; - xferConfig.minorLoopBytes = 2U; - } - - /* Configure DMA channel. */ - if (xfer->txData != NULL) - { - xferConfig.srcOffset = (int16_t)bytesPerFrame; - xferConfig.srcAddr = (uint32_t)(xfer->txData); - } - else - { - /* Disable the source increasement and source set to dummyData. */ - xferConfig.srcOffset = 0; - xferConfig.srcAddr = (uint32_t)(&s_dummyData); - } - - xferConfig.majorLoopCounts = (xfer->dataSize / xferConfig.minorLoopBytes); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO SPI handle */ - handle->nbytes = (uint8_t)xferConfig.minorLoopBytes; - - if (handle->txHandle != NULL) - { - (void)EDMA_SubmitTransfer(handle->txHandle, &xferConfig); - } - - /* Configure rx transfer EDMA. */ - if (xfer->rxData != NULL) - { - xferConfig.srcAddr = FLEXIO_SPI_GetRxDataRegisterAddress(base, direction); - if (bytesPerFrame == 2U) - { - if (direction == kFLEXIO_SPI_LsbFirst) - { - xferConfig.srcAddr -= 1U; - } - } - xferConfig.srcOffset = 0; - xferConfig.destAddr = (uint32_t)(xfer->rxData); - xferConfig.destOffset = (int16_t)bytesPerFrame; - (void)EDMA_SubmitTransfer(handle->rxHandle, &xferConfig); - handle->rxInProgress = true; - FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_RxDmaEnable, true); - EDMA_StartTransfer(handle->rxHandle); - } - - /* Always start tx transfer. */ - if (handle->txHandle != NULL) - { - handle->txInProgress = true; - FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_TxDmaEnable, true); - EDMA_StartTransfer(handle->txHandle); - } -} - -/*! - * brief Initializes the FlexIO SPI master eDMA handle. - * - * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master - * transactional - * APIs. - * For a specified FlexIO SPI instance, call this API once to get the initialized handle. - * - * param base Pointer to FLEXIO_SPI_Type structure. - * param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. - * param callback SPI callback, NULL means no callback. - * param userData callback function parameter. - * param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. - * param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. - */ -status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - flexio_spi_master_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txHandle, - edma_handle_t *rxHandle) -{ - assert(handle != NULL); - - uint8_t index = 0; - - /* Find the an empty handle pointer to store the handle. */ - for (index = 0U; index < (uint8_t)FLEXIO_SPI_HANDLE_COUNT; index++) - { - if (s_edmaPrivateHandle[index].base == NULL) - { - s_edmaPrivateHandle[index].base = base; - s_edmaPrivateHandle[index].handle = handle; - break; - } - } - - if (index == (uint16_t)FLEXIO_SPI_HANDLE_COUNT) - { - return kStatus_OutOfRange; - } - - /* Set spi base to handle. */ - handle->txHandle = txHandle; - handle->rxHandle = rxHandle; - - /* Register callback and userData. */ - handle->callback = callback; - handle->userData = userData; - - /* Set SPI state to idle. */ - handle->txInProgress = false; - handle->rxInProgress = false; - - /* Install callback for Tx/Rx dma channel. */ - if (handle->txHandle != NULL) - { - EDMA_SetCallback(handle->txHandle, FLEXIO_SPI_TxEDMACallback, &s_edmaPrivateHandle[index]); - } - if (handle->rxHandle != NULL) - { - EDMA_SetCallback(handle->rxHandle, FLEXIO_SPI_RxEDMACallback, &s_edmaPrivateHandle[index]); - } - - return kStatus_Success; -} - -/*! - * brief Performs a non-blocking FlexIO SPI transfer using eDMA. - * - * note This interface returns immediately after transfer initiates. Call - * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check - * whether the FlexIO SPI transfer is finished. - * - * param base Pointer to FLEXIO_SPI_Type structure. - * param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. - * param xfer Pointer to FlexIO SPI transfer structure. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - flexio_spi_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - uint32_t dataMode = 0; - uint16_t timerCmp = (uint16_t)base->flexioBase->TIMCMP[base->timerIndex[0]]; - - timerCmp &= 0x00FFU; - - /* Check if the device is busy. */ - if ((handle->txInProgress) || (handle->rxInProgress)) - { - return kStatus_FLEXIO_SPI_Busy; - } - - /* Check if input parameter invalid. */ - if (((xfer->txData == NULL) && (xfer->rxData == NULL)) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - /* configure data mode. */ - if ((xfer->flags == (uint8_t)kFLEXIO_SPI_8bitMsb) || (xfer->flags == (uint8_t)kFLEXIO_SPI_8bitLsb)) - { - dataMode = (8UL * 2UL - 1UL) << 8U; - } - else if ((xfer->flags == (uint8_t)kFLEXIO_SPI_16bitMsb) || (xfer->flags == (uint8_t)kFLEXIO_SPI_16bitLsb)) - { - dataMode = (16UL * 2UL - 1UL) << 8U; - } - else - { - dataMode = 8UL * 2UL - 1UL; - } - - dataMode |= timerCmp; - - base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; - - FLEXIO_SPI_EDMAConfig(base, handle, xfer); - - return kStatus_Success; -} - -/*! - * brief Gets the remaining bytes for FlexIO SPI eDMA transfer. - * - * param base Pointer to FLEXIO_SPI_Type structure. - * param handle FlexIO SPI eDMA handle pointer. - * param count Number of bytes transferred so far by the non-blocking transaction. - */ -status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - if (handle->rxInProgress) - { - *count = - (handle->transferSize - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount( - handle->rxHandle->base, handle->rxHandle->channel)); - } - else - { - *count = - (handle->transferSize - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount( - handle->txHandle->base, handle->txHandle->channel)); - } - - return kStatus_Success; -} - -/*! - * brief Aborts a FlexIO SPI transfer using eDMA. - * - * param base Pointer to FLEXIO_SPI_Type structure. - * param handle FlexIO SPI eDMA handle pointer. - */ -void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma. */ - EDMA_StopTransfer(handle->txHandle); - EDMA_StopTransfer(handle->rxHandle); - - /* Disable DMA enable bit. */ - FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_DmaAllEnable, false); - - /* Set the handle state. */ - handle->txInProgress = false; - handle->rxInProgress = false; -} - -/*! - * brief Performs a non-blocking FlexIO SPI transfer using eDMA. - * - * note This interface returns immediately after transfer initiates. Call - * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and - * check whether the FlexIO SPI transfer is finished. - * - * param base Pointer to FLEXIO_SPI_Type structure. - * param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. - * param xfer Pointer to FlexIO SPI transfer structure. - * retval kStatus_Success Successfully start a transfer. - * retval kStatus_InvalidArgument Input argument is invalid. - * retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base, - flexio_spi_slave_edma_handle_t *handle, - flexio_spi_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - uint32_t dataMode = 0U; - - /* Check if the device is busy. */ - if ((handle->txInProgress) || (handle->rxInProgress)) - { - return kStatus_FLEXIO_SPI_Busy; - } - - /* Check if input parameter invalid. */ - if (((xfer->txData == NULL) && (xfer->rxData == NULL)) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - /* configure data mode. */ - if ((xfer->flags == (uint8_t)kFLEXIO_SPI_8bitMsb) || (xfer->flags == (uint8_t)kFLEXIO_SPI_8bitLsb)) - { - dataMode = 8U * 2U - 1U; - } - else if ((xfer->flags == (uint8_t)kFLEXIO_SPI_16bitMsb) || (xfer->flags == (uint8_t)kFLEXIO_SPI_16bitLsb)) - { - dataMode = 16U * 2U - 1U; - } - else - { - dataMode = 8U * 2U - 1U; - } - - base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; - - FLEXIO_SPI_EDMAConfig(base, handle, xfer); - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.h b/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.h deleted file mode 100644 index 2ec58f0..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_spi_edma.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_SPI_EDMA_H_ -#define _FSL_FLEXIO_SPI_EDMA_H_ - -#include "fsl_flexio_spi.h" -#include "fsl_edma.h" - -/*! - * @addtogroup flexio_edma_spi - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO SPI EDMA driver version 2.2.0. */ -#define FSL_FLEXIO_SPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) -/*@}*/ - -/*! @brief typedef for flexio_spi_master_edma_handle_t in advance. */ -typedef struct _flexio_spi_master_edma_handle flexio_spi_master_edma_handle_t; - -/*! @brief Slave handle is the same with master handle. */ -typedef flexio_spi_master_edma_handle_t flexio_spi_slave_edma_handle_t; - -/*! @brief FlexIO SPI master callback for finished transmit */ -typedef void (*flexio_spi_master_edma_transfer_callback_t)(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief FlexIO SPI slave callback for finished transmit */ -typedef void (*flexio_spi_slave_edma_transfer_callback_t)(FLEXIO_SPI_Type *base, - flexio_spi_slave_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief FlexIO SPI eDMA transfer handle, users should not touch the content of the handle.*/ -struct _flexio_spi_master_edma_handle -{ - size_t transferSize; /*!< Total bytes to be transferred. */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - bool txInProgress; /*!< Send transfer in progress */ - bool rxInProgress; /*!< Receive transfer in progress */ - edma_handle_t *txHandle; /*!< DMA handler for SPI send */ - edma_handle_t *rxHandle; /*!< DMA handler for SPI receive */ - flexio_spi_master_edma_transfer_callback_t callback; /*!< Callback for SPI DMA transfer */ - void *userData; /*!< User Data for SPI DMA callback */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the FlexIO SPI master eDMA handle. - * - * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master - * transactional - * APIs. - * For a specified FlexIO SPI instance, call this API once to get the initialized handle. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. - * @param callback SPI callback, NULL means no callback. - * @param userData callback function parameter. - * @param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. - * @param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. - */ -status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - flexio_spi_master_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txHandle, - edma_handle_t *rxHandle); - -/*! - * @brief Performs a non-blocking FlexIO SPI transfer using eDMA. - * - * @note This interface returns immediately after transfer initiates. Call - * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check - * whether the FlexIO SPI transfer is finished. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. - * @param xfer Pointer to FlexIO SPI transfer structure. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - flexio_spi_transfer_t *xfer); - -/*! - * @brief Aborts a FlexIO SPI transfer using eDMA. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle FlexIO SPI eDMA handle pointer. - */ -void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle); - -/*! - * @brief Gets the remaining bytes for FlexIO SPI eDMA transfer. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle FlexIO SPI eDMA handle pointer. - * @param count Number of bytes transferred so far by the non-blocking transaction. - */ -status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base, - flexio_spi_master_edma_handle_t *handle, - size_t *count); - -/*! - * @brief Initializes the FlexIO SPI slave eDMA handle. - * - * This function initializes the FlexIO SPI slave eDMA handle. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. - * @param callback SPI callback, NULL means no callback. - * @param userData callback function parameter. - * @param txHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. - * @param rxHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. - */ -static inline void FLEXIO_SPI_SlaveTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, - flexio_spi_slave_edma_handle_t *handle, - flexio_spi_slave_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txHandle, - edma_handle_t *rxHandle) -{ - (void)FLEXIO_SPI_MasterTransferCreateHandleEDMA(base, handle, callback, userData, txHandle, rxHandle); -} - -/*! - * @brief Performs a non-blocking FlexIO SPI transfer using eDMA. - * - * @note This interface returns immediately after transfer initiates. Call - * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and - * check whether the FlexIO SPI transfer is finished. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. - * @param xfer Pointer to FlexIO SPI transfer structure. - * @retval kStatus_Success Successfully start a transfer. - * @retval kStatus_InvalidArgument Input argument is invalid. - * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. - */ -status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base, - flexio_spi_slave_edma_handle_t *handle, - flexio_spi_transfer_t *xfer); - -/*! - * @brief Aborts a FlexIO SPI transfer using eDMA. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. - */ -static inline void FLEXIO_SPI_SlaveTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_slave_edma_handle_t *handle) -{ - FLEXIO_SPI_MasterTransferAbortEDMA(base, handle); -} - -/*! - * @brief Gets the remaining bytes to be transferred for FlexIO SPI eDMA. - * - * @param base Pointer to FLEXIO_SPI_Type structure. - * @param handle FlexIO SPI eDMA handle pointer. - * @param count Number of bytes transferred so far by the non-blocking transaction. - */ -static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base, - flexio_spi_slave_edma_handle_t *handle, - size_t *count) -{ - return FLEXIO_SPI_MasterTransferGetCountEDMA(base, handle, count); -} - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_uart.c b/devices/MIMXRT1052/drivers/fsl_flexio_uart.c deleted file mode 100644 index 0d308b1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_uart.c +++ /dev/null @@ -1,1009 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_uart.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_uart" -#endif - -/*flexioBase); -} - -static size_t FLEXIO_UART_TransferGetRxRingBufferLength(flexio_uart_handle_t *handle) -{ - size_t size; - uint16_t rxRingBufferHead = handle->rxRingBufferHead; - uint16_t rxRingBufferTail = handle->rxRingBufferTail; - - if (rxRingBufferTail > rxRingBufferHead) - { - size = (size_t)rxRingBufferHead + handle->rxRingBufferSize - (size_t)rxRingBufferTail; - } - else - { - size = (size_t)rxRingBufferHead - (size_t)rxRingBufferTail; - } - - return size; -} - -static bool FLEXIO_UART_TransferIsRxRingBufferFull(flexio_uart_handle_t *handle) -{ - bool full; - - if (FLEXIO_UART_TransferGetRxRingBufferLength(handle) == (handle->rxRingBufferSize - 1U)) - { - full = true; - } - else - { - full = false; - } - - return full; -} - -/*! - * brief Ungates the FlexIO clock, resets the FlexIO module, configures FlexIO UART - * hardware, and configures the FlexIO UART with FlexIO UART configuration. - * The configuration structure can be filled by the user or be set with - * default values by FLEXIO_UART_GetDefaultConfig(). - * - * Example - code - FLEXIO_UART_Type base = { - .flexioBase = FLEXIO, - .TxPinIndex = 0, - .RxPinIndex = 1, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_uart_config_t config = { - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 115200U, - .bitCountPerChar = 8 - }; - FLEXIO_UART_Init(base, &config, srcClock_Hz); - endcode - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param userConfig Pointer to the flexio_uart_config_t structure. - * param srcClock_Hz FlexIO source clock in Hz. - * retval kStatus_Success Configuration success. - * retval kStatus_FLEXIO_UART_BaudrateNotSupport Baudrate is not supported for current clock source frequency. -*/ -status_t FLEXIO_UART_Init(FLEXIO_UART_Type *base, const flexio_uart_config_t *userConfig, uint32_t srcClock_Hz) -{ - assert((base != NULL) && (userConfig != NULL)); - - flexio_shifter_config_t shifterConfig; - flexio_timer_config_t timerConfig; - uint32_t ctrlReg = 0; - uint16_t timerDiv = 0; - uint16_t timerCmp = 0; - uint32_t calculatedBaud; - uint32_t diff; - status_t result = kStatus_Success; - - /* Clear the shifterConfig & timerConfig struct. */ - (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); - (void)memset(&timerConfig, 0, sizeof(timerConfig)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate flexio clock. */ - CLOCK_EnableClock(s_flexioClocks[FLEXIO_UART_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Configure FLEXIO UART */ - ctrlReg = base->flexioBase->CTRL; - ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); - ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) | - FLEXIO_CTRL_FLEXEN(userConfig->enableUart)); - if (!userConfig->enableInDoze) - { - ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; - } - - base->flexioBase->CTRL = ctrlReg; - - /* Do hardware configuration. */ - /* 1. Configure the shifter 0 for tx. */ - shifterConfig.timerSelect = base->timerIndex[0]; - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; - shifterConfig.pinSelect = base->TxPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); - - /*2. Configure the timer 0 for tx. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->TxPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; - timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetNever; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; - timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - - timerDiv = (uint16_t)(srcClock_Hz / userConfig->baudRate_Bps); - timerDiv = timerDiv / 2U - 1U; - - if (timerDiv > 0xFFU) - { - /* Check whether the calculated timerDiv is within allowed range. */ - return kStatus_FLEXIO_UART_BaudrateNotSupport; - } - else - { - /* Check to see if actual baud rate is within 3% of desired baud rate - * based on the best calculated timerDiv value */ - calculatedBaud = srcClock_Hz / (((uint32_t)timerDiv + 1U) * 2U); - /* timerDiv cannot be larger than the ideal divider, so calculatedBaud is definitely larger - than configured baud */ - diff = calculatedBaud - userConfig->baudRate_Bps; - if (diff > ((userConfig->baudRate_Bps / 100U) * 3U)) - { - return kStatus_FLEXIO_UART_BaudrateNotSupport; - } - } - - timerCmp = ((uint16_t)userConfig->bitCountPerChar * 2U - 1U) << 8U; - timerCmp |= timerDiv; - - timerConfig.timerCompare = timerCmp; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); - - /* 3. Configure the shifter 1 for rx. */ - shifterConfig.timerSelect = base->timerIndex[1]; - shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; - shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - shifterConfig.pinSelect = base->RxPinIndex; - shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; - shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; - shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; - shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; - shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; - - FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); - - /* 4. Configure the timer 1 for rx. */ - timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->RxPinIndex); - timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; - timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceExternal; - timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; - timerConfig.pinSelect = base->RxPinIndex; - timerConfig.pinPolarity = kFLEXIO_PinActiveLow; - timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; - timerConfig.timerOutput = kFLEXIO_TimerOutputOneAffectedByReset; - timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; - timerConfig.timerReset = kFLEXIO_TimerResetOnTimerPinRisingEdge; - timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; - timerConfig.timerEnable = kFLEXIO_TimerEnableOnPinRisingEdge; - timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; - timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; - - timerConfig.timerCompare = timerCmp; - - FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); - - return result; -} - -/*! - * brief Resets the FlexIO UART shifter and timer config. - * - * note After calling this API, call the FLEXO_UART_Init to use the FlexIO UART module. - * - * param base Pointer to FLEXIO_UART_Type structure - */ -void FLEXIO_UART_Deinit(FLEXIO_UART_Type *base) -{ - base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; - base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; - base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; - base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; - base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; - base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; - /* Clear the shifter flag. */ - base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[0]); - base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[1]); - /* Clear the timer flag. */ - base->flexioBase->TIMSTAT = (1UL << base->timerIndex[0]); - base->flexioBase->TIMSTAT = (1UL << base->timerIndex[1]); -} - -/*! - * brief Gets the default configuration to configure the FlexIO UART. The configuration - * can be used directly for calling the FLEXIO_UART_Init(). - * Example: - code - flexio_uart_config_t config; - FLEXIO_UART_GetDefaultConfig(&userConfig); - endcode - * param userConfig Pointer to the flexio_uart_config_t structure. -*/ -void FLEXIO_UART_GetDefaultConfig(flexio_uart_config_t *userConfig) -{ - assert(userConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(userConfig, 0, sizeof(*userConfig)); - - userConfig->enableUart = true; - userConfig->enableInDoze = false; - userConfig->enableInDebug = true; - userConfig->enableFastAccess = false; - /* Default baud rate 115200. */ - userConfig->baudRate_Bps = 115200U; - /* Default bit count at 8. */ - userConfig->bitCountPerChar = kFLEXIO_UART_8BitsPerChar; -} - -/*! - * brief Enables the FlexIO UART interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param mask Interrupt source. - */ -void FLEXIO_UART_EnableInterrupts(FLEXIO_UART_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U) - { - FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Disables the FlexIO UART interrupt. - * - * This function disables the FlexIO UART interrupt. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param mask Interrupt source. - */ -void FLEXIO_UART_DisableInterrupts(FLEXIO_UART_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U) - { - FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Gets the FlexIO UART status flags. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * return FlexIO UART status flags. - */ - -uint32_t FLEXIO_UART_GetStatusFlags(FLEXIO_UART_Type *base) -{ - uint32_t status = 0U; - status = - ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); - status |= - (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) - << 1U); - status |= - (((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) - << 2U); - return status; -} - -/*! - * brief Gets the FlexIO UART status flags. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param mask Status flag. - * The parameter can be any combination of the following values: - * arg kFLEXIO_UART_TxDataRegEmptyFlag - * arg kFLEXIO_UART_RxEmptyFlag - * arg kFLEXIO_UART_RxOverRunFlag - */ - -void FLEXIO_UART_ClearStatusFlags(FLEXIO_UART_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); - } - if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag) != 0U) - { - FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - } - if ((mask & (uint32_t)kFLEXIO_UART_RxOverRunFlag) != 0U) - { - FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); - } -} - -/*! - * brief Sends a buffer of data bytes. - * - * note This function blocks using the polling method until all bytes have been sent. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param txData The data bytes to send. - * param txSize The number of data bytes to send. - * retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. - * retval kStatus_Success Successfully wrote all data. - */ -status_t FLEXIO_UART_WriteBlocking(FLEXIO_UART_Type *base, const uint8_t *txData, size_t txSize) -{ - assert(txData != NULL); - assert(txSize != 0U); -#if UART_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != txSize--) - { - /* Wait until data transfer complete. */ -#if UART_RETRY_TIMES - waitTimes = UART_RETRY_TIMES; - while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) -#endif - { - } -#if UART_RETRY_TIMES - if (0U == waitTimes) - { - return kStatus_FLEXIO_UART_Timeout; - } -#endif - - base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = *txData++; - } - return kStatus_Success; -} - -/*! - * brief Receives a buffer of bytes. - * - * note This function blocks using the polling method until all bytes have been received. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param rxData The buffer to store the received bytes. - * param rxSize The number of data bytes to be received. - * retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. - * retval kStatus_Success Successfully received all data. - */ -status_t FLEXIO_UART_ReadBlocking(FLEXIO_UART_Type *base, uint8_t *rxData, size_t rxSize) -{ - assert(rxData != NULL); - assert(rxSize != 0U); -#if UART_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != rxSize--) - { - /* Wait until data transfer complete. */ -#if UART_RETRY_TIMES - waitTimes = UART_RETRY_TIMES; - while ((0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag)) && - (0U != --waitTimes)) -#else - while (0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag)) -#endif - { - } -#if UART_RETRY_TIMES - if (0U == waitTimes) - { - return kStatus_FLEXIO_UART_Timeout; - } -#endif - - *rxData++ = (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); - } - return kStatus_Success; -} - -/*! - * brief Initializes the UART handle. - * - * This function initializes the FlexIO UART handle, which can be used for other FlexIO - * UART transactional APIs. Call this API once to get the - * initialized handle. - * - * The UART driver supports the "background" receiving, which means that users can set up - * a RX ring buffer optionally. Data received is stored into the ring buffer even when - * the user doesn't call the FLEXIO_UART_TransferReceiveNonBlocking() API. If there is already data - * received in the ring buffer, users can get the received data from the ring buffer - * directly. The ring buffer is disabled if passing NULL as p ringBuffer. - * - * param base to FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param callback The callback function. - * param userData The parameter of the callback function. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_UART_TransferCreateHandle(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - IRQn_Type flexio_irqs[] = FLEXIO_IRQS; - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set the TX/RX state. */ - handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; - handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; - - /* Set the callback and user data. */ - handle->callback = callback; - handle->userData = userData; - - /* Clear pending NVIC IRQ before enable NVIC IRQ. */ - NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]); - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]); - - /* Save the context in global variables to support the double weak mechanism. */ - return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_UART_TransferHandleIRQ); -} - -/*! - * brief Sets up the RX ring buffer. - * - * This function sets up the RX ring buffer to a specific UART handle. - * - * When the RX ring buffer is used, data received is stored into the ring buffer even when - * the user doesn't call the UART_ReceiveNonBlocking() API. If there is already data received - * in the ring buffer, users 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 p ringBufferSize is 32, only 31 bytes are used for saving data. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. - * param ringBufferSize Size of the ring buffer. - */ -void FLEXIO_UART_TransferStartRingBuffer(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - uint8_t *ringBuffer, - size_t ringBufferSize) -{ - assert(handle != NULL); - - /* Setup the ringbuffer address */ - if (ringBuffer != NULL) - { - handle->rxRingBuffer = ringBuffer; - handle->rxRingBufferSize = ringBufferSize; - handle->rxRingBufferHead = 0U; - handle->rxRingBufferTail = 0U; - - /* Enable the interrupt to accept the data when user need the ring buffer. */ - FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - } -} - -/*! - * brief Aborts the background transfer and uninstalls the ring buffer. - * - * This function aborts the background transfer and uninstalls the ring buffer. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferStopRingBuffer(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) -{ - assert(handle != NULL); - - if (handle->rxState == (uint8_t)kFLEXIO_UART_RxIdle) - { - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - } - - handle->rxRingBuffer = NULL; - handle->rxRingBufferSize = 0U; - handle->rxRingBufferHead = 0U; - handle->rxRingBufferTail = 0U; -} - -/*! - * brief Transmits a buffer of data using the interrupt method. - * - * 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 ISR, the FlexIO UART driver calls the callback - * function and passes the ref kStatus_FLEXIO_UART_TxIdle as status parameter. - * - * note The kStatus_FLEXIO_UART_TxIdle is passed to the upper layer when all data is written - * to the TX register. However, it does not ensure that all data is sent out. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param xfer FlexIO UART transfer structure. See #flexio_uart_transfer_t. - * retval kStatus_Success Successfully starts the data transmission. - * retval kStatus_UART_TxBusy Previous transmission still not finished, data not written to the TX register. - */ -status_t FLEXIO_UART_TransferSendNonBlocking(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_t *xfer) -{ - status_t status; - - /* Return error if xfer invalid. */ - if ((0U == xfer->dataSize) || (NULL == xfer->txData)) - { - return kStatus_InvalidArgument; - } - - /* Return error if current TX busy. */ - if ((uint8_t)kFLEXIO_UART_TxBusy == handle->txState) - { - status = kStatus_FLEXIO_UART_TxBusy; - } - else - { - handle->txData = xfer->txData; - handle->txDataSize = xfer->dataSize; - handle->txDataSizeAll = xfer->dataSize; - handle->txState = (uint8_t)kFLEXIO_UART_TxBusy; - - /* Enable transmiter interrupt. */ - FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the interrupt-driven data transmit. - * - * This function aborts the interrupt-driven data sending. Get the remainBytes to find out - * how many bytes are still not sent out. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferAbortSend(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) -{ - /* Disable the transmitter and disable the interrupt. */ - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); - - handle->txDataSize = 0U; - handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; -} - -/*! - * brief Gets the number of bytes sent. - * - * This function gets the number of bytes sent driven by interrupt. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param count Number of bytes sent so far by the non-blocking transaction. - * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetSendCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - assert(count != NULL); - - if ((uint8_t)kFLEXIO_UART_TxIdle == handle->txState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->txDataSizeAll - handle->txDataSize; - - return kStatus_Success; -} - -/*! - * brief Receives a buffer of data using the interrupt method. - * - * This function receives data using the 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 ring buffer is copied and - * the parameter p receivedBytes shows how many bytes are copied from the ring buffer. - * After copying, if the data in ring buffer is not enough to read, the receive - * request is saved by the UART driver. When new data arrives, the receive request - * is serviced first. When all data is received, the UART driver notifies the upper layer - * through a callback function and passes the status parameter ref kStatus_UART_RxIdle. - * For example, if the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer, - * the 5 bytes are copied to xfer->data. This function returns with the - * parameter p receivedBytes set to 5. For the last 5 bytes, newly arrived data is - * saved from the xfer->data[5]. When 5 bytes are received, the UART driver notifies upper layer. - * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt - * to receive data to xfer->data. When all data is received, the upper layer is notified. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param xfer UART transfer structure. See #flexio_uart_transfer_t. - * param receivedBytes Bytes received from the ring buffer directly. - * retval kStatus_Success Successfully queue the transfer into the transmit queue. - * retval kStatus_FLEXIO_UART_RxBusy Previous receive request is not finished. - */ -status_t FLEXIO_UART_TransferReceiveNonBlocking(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_t *xfer, - size_t *receivedBytes) -{ - uint32_t i; - status_t status; - /* How many bytes to copy from ring buffer to user memory. */ - size_t bytesToCopy = 0U; - /* How many bytes to receive. */ - size_t bytesToReceive; - /* How many bytes currently have received. */ - size_t bytesCurrentReceived; - - /* Return error if xfer invalid. */ - if ((0U == xfer->dataSize) || (NULL == xfer->rxData)) - { - return kStatus_InvalidArgument; - } - - /* How to get data: - 1. If RX ring buffer is not enabled, then save xfer->data and xfer->dataSize - to uart handle, enable interrupt to store received data to xfer->data. When - all data received, trigger callback. - 2. If RX ring buffer is enabled and not empty, get data from ring buffer first. - If there are enough data in ring buffer, copy them to xfer->data and return. - If there are not enough data in ring buffer, copy all of them to xfer->data, - save the xfer->data remained empty space to uart handle, receive data - to this empty space and trigger callback when finished. */ - - if ((uint8_t)kFLEXIO_UART_RxBusy == handle->rxState) - { - status = kStatus_FLEXIO_UART_RxBusy; - } - else - { - bytesToReceive = xfer->dataSize; - bytesCurrentReceived = 0U; - - /* If RX ring buffer is used. */ - if (handle->rxRingBuffer != NULL) - { - /* Disable FLEXIO_UART RX IRQ, protect ring buffer. */ - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - - /* How many bytes in RX ring buffer currently. */ - bytesToCopy = FLEXIO_UART_TransferGetRxRingBufferLength(handle); - - if (bytesToCopy != 0U) - { - bytesToCopy = MIN(bytesToReceive, bytesToCopy); - - bytesToReceive -= bytesToCopy; - - /* Copy data from ring buffer to user memory. */ - for (i = 0U; i < bytesToCopy; i++) - { - xfer->rxData[bytesCurrentReceived++] = handle->rxRingBuffer[handle->rxRingBufferTail]; - - /* Wrap to 0. Not use modulo (%) because it might be large and slow. */ - if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize) - { - handle->rxRingBufferTail = 0U; - } - else - { - handle->rxRingBufferTail++; - } - } - } - - /* If ring buffer does not have enough data, still need to read more data. */ - if (bytesToReceive != 0U) - { - /* No data in ring buffer, save the request to UART handle. */ - handle->rxData = xfer->rxData + bytesCurrentReceived; - handle->rxDataSize = bytesToReceive; - handle->rxDataSizeAll = xfer->dataSize; - handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; - } - - /* Enable FLEXIO_UART RX IRQ if previously enabled. */ - FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - - /* Call user callback since all data are received. */ - if (0U == bytesToReceive) - { - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData); - } - } - } - /* Ring buffer not used. */ - else - { - handle->rxData = xfer->rxData + bytesCurrentReceived; - handle->rxDataSize = bytesToReceive; - handle->rxDataSizeAll = bytesToReceive; - handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; - - /* Enable RX interrupt. */ - FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - } - - /* Return the how many bytes have read. */ - if (receivedBytes != NULL) - { - *receivedBytes = bytesCurrentReceived; - } - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the receive data which was using IRQ. - * - * This function aborts the receive data which was using IRQ. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferAbortReceive(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) -{ - /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */ - if (NULL == handle->rxRingBuffer) - { - /* Disable RX interrupt. */ - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - } - - handle->rxDataSize = 0U; - handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; -} - -/*! - * brief Gets the number of bytes received. - * - * This function gets the number of bytes received driven by interrupt. - * - * param base Pointer to the FLEXIO_UART_Type structure. - * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * param count Number of bytes received so far by the non-blocking transaction. - * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetReceiveCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - assert(count != NULL); - - if ((uint8_t)kFLEXIO_UART_RxIdle == handle->rxState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->rxDataSizeAll - handle->rxDataSize; - - return kStatus_Success; -} - -/*! - * brief FlexIO UART IRQ handler function. - * - * This function processes the FlexIO UART transmit and receives the IRQ request. - * - * param uartType Pointer to the FLEXIO_UART_Type structure. - * param uartHandle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferHandleIRQ(void *uartType, void *uartHandle) -{ - uint8_t count = 1; - FLEXIO_UART_Type *base = (FLEXIO_UART_Type *)uartType; - flexio_uart_handle_t *handle = (flexio_uart_handle_t *)uartHandle; - uint16_t rxRingBufferHead; - - /* Read the status back. */ - uint32_t status = FLEXIO_UART_GetStatusFlags(base); - - /* If RX overrun. */ - if (((uint32_t)kFLEXIO_UART_RxOverRunFlag & status) != 0U) - { - /* Clear Overrun flag. */ - FLEXIO_UART_ClearStatusFlags(base, (uint32_t)kFLEXIO_UART_RxOverRunFlag); - - /* Trigger callback. */ - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_FLEXIO_UART_RxHardwareOverrun, handle->userData); - } - } - - /* Receive data register full */ - if ((((uint32_t)kFLEXIO_UART_RxDataRegFullFlag & status) != 0U) && - ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[1])) != 0U)) - { - /* If handle->rxDataSize is not 0, first save data to handle->rxData. */ - if (handle->rxDataSize != 0U) - { - /* Using non block API to read the data from the registers. */ - FLEXIO_UART_ReadByte(base, handle->rxData); - handle->rxDataSize--; - handle->rxData++; - count--; - - /* If all the data required for upper layer is ready, trigger callback. */ - if (0U == handle->rxDataSize) - { - handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; - - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData); - } - } - } - - if (handle->rxRingBuffer != NULL) - { - if (count != 0U) - { - /* If RX ring buffer is full, trigger callback to notify over run. */ - if (FLEXIO_UART_TransferIsRxRingBufferFull(handle)) - { - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_FLEXIO_UART_RxRingBufferOverrun, handle->userData); - } - } - - /* If ring buffer is still full after callback function, the oldest data is overridden. */ - if (FLEXIO_UART_TransferIsRxRingBufferFull(handle)) - { - /* Increase handle->rxRingBufferTail to make room for new data. */ - if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize) - { - handle->rxRingBufferTail = 0U; - } - else - { - handle->rxRingBufferTail++; - } - } - - /* Read data. */ - rxRingBufferHead = handle->rxRingBufferHead; - handle->rxRingBuffer[rxRingBufferHead] = - (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); - - /* Increase handle->rxRingBufferHead. */ - if ((uint32_t)handle->rxRingBufferHead + 1U == handle->rxRingBufferSize) - { - handle->rxRingBufferHead = 0U; - } - else - { - handle->rxRingBufferHead++; - } - } - } - /* If no receive requst pending, stop RX interrupt. */ - else if (0U == handle->rxDataSize) - { - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); - } - else - { - } - } - - /* Send data register empty and the interrupt is enabled. */ - if ((((uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag & status) != 0U) && - ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[0])) != 0U)) - { - if (handle->txDataSize != 0U) - { - /* Using non block API to write the data to the registers. */ - FLEXIO_UART_WriteByte(base, handle->txData); - handle->txData++; - handle->txDataSize--; - - /* If all the data are written to data register, TX finished. */ - if (0U == handle->txDataSize) - { - handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; - - /* Disable TX register empty interrupt. */ - FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); - - /* Trigger callback. */ - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_FLEXIO_UART_TxIdle, handle->userData); - } - } - } - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_uart.h b/devices/MIMXRT1052/drivers/fsl_flexio_uart.h deleted file mode 100644 index 783c318..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_uart.h +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXIO_UART_H_ -#define _FSL_FLEXIO_UART_H_ - -#include "fsl_common.h" -#include "fsl_flexio.h" - -/*! - * @addtogroup flexio_uart - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO UART driver version. */ -#define FSL_FLEXIO_UART_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) -/*@}*/ - -/*! @brief Retry times for waiting flag. */ -#ifndef UART_RETRY_TIMES -#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */ -#endif - -/*! @brief Error codes for the UART driver. */ -enum -{ - kStatus_FLEXIO_UART_TxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 0), /*!< Transmitter is busy. */ - kStatus_FLEXIO_UART_RxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 1), /*!< Receiver is busy. */ - kStatus_FLEXIO_UART_TxIdle = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 2), /*!< UART transmitter is idle. */ - kStatus_FLEXIO_UART_RxIdle = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 3), /*!< UART receiver is idle. */ - kStatus_FLEXIO_UART_ERROR = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 4), /*!< ERROR happens on UART. */ - kStatus_FLEXIO_UART_RxRingBufferOverrun = - MAKE_STATUS(kStatusGroup_FLEXIO_UART, 5), /*!< UART RX software ring buffer overrun. */ - kStatus_FLEXIO_UART_RxHardwareOverrun = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 6), /*!< UART RX receiver overrun. */ - kStatus_FLEXIO_UART_Timeout = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 7), /*!< UART times out. */ - kStatus_FLEXIO_UART_BaudrateNotSupport = - MAKE_STATUS(kStatusGroup_FLEXIO_UART, 8) /*!< Baudrate is not supported in current clock source */ -}; - -/*! @brief FlexIO UART bit count per char. */ -typedef enum _flexio_uart_bit_count_per_char -{ - kFLEXIO_UART_7BitsPerChar = 7U, /*!< 7-bit data characters */ - kFLEXIO_UART_8BitsPerChar = 8U, /*!< 8-bit data characters */ - kFLEXIO_UART_9BitsPerChar = 9U, /*!< 9-bit data characters */ -} flexio_uart_bit_count_per_char_t; - -/*! @brief Define FlexIO UART interrupt mask. */ -enum _flexio_uart_interrupt_enable -{ - kFLEXIO_UART_TxDataRegEmptyInterruptEnable = 0x1U, /*!< Transmit buffer empty interrupt enable. */ - kFLEXIO_UART_RxDataRegFullInterruptEnable = 0x2U, /*!< Receive buffer full interrupt enable. */ -}; - -/*! @brief Define FlexIO UART status mask. */ -enum _flexio_uart_status_flags -{ - kFLEXIO_UART_TxDataRegEmptyFlag = 0x1U, /*!< Transmit buffer empty flag. */ - kFLEXIO_UART_RxDataRegFullFlag = 0x2U, /*!< Receive buffer full flag. */ - kFLEXIO_UART_RxOverRunFlag = 0x4U, /*!< Receive buffer over run flag. */ -}; - -/*! @brief Define FlexIO UART access structure typedef. */ -typedef struct _flexio_uart_type -{ - FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ - uint8_t TxPinIndex; /*!< Pin select for UART_Tx. */ - uint8_t RxPinIndex; /*!< Pin select for UART_Rx. */ - uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO UART. */ - uint8_t timerIndex[2]; /*!< Timer index used in FlexIO UART. */ -} FLEXIO_UART_Type; - -/*! @brief Define FlexIO UART user configuration structure. */ -typedef struct _flexio_uart_config -{ - bool enableUart; /*!< Enable/disable FlexIO UART TX & RX. */ - bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode*/ - bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode*/ - bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, - fast access requires the FlexIO clock to be at least - twice the frequency of the bus clock. */ - uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ - flexio_uart_bit_count_per_char_t bitCountPerChar; /*!< number of bits, 7/8/9 -bit */ -} flexio_uart_config_t; - -/*! @brief Define FlexIO UART transfer structure. */ -typedef struct _flexio_uart_transfer -{ - /* - * Use separate TX and RX data pointer, because TX data is const data. - * The member data is kept for backward compatibility. - */ - union - { - uint8_t *data; /*!< The buffer of data to be transfer.*/ - uint8_t *rxData; /*!< The buffer to receive data. */ - const uint8_t *txData; /*!< The buffer of data to be sent. */ - }; - size_t dataSize; /*!< Transfer size*/ -} flexio_uart_transfer_t; - -/* Forward declaration of the handle typedef. */ -typedef struct _flexio_uart_handle flexio_uart_handle_t; - -/*! @brief FlexIO UART transfer callback function. */ -typedef void (*flexio_uart_transfer_callback_t)(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Define FLEXIO UART handle structure*/ -struct _flexio_uart_handle -{ - const uint8_t *volatile txData; /*!< Address of remaining data to send. */ - volatile size_t txDataSize; /*!< Size of the remaining data to send. */ - uint8_t *volatile rxData; /*!< Address of remaining data to receive. */ - volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */ - size_t txDataSizeAll; /*!< Total bytes to be sent. */ - size_t rxDataSizeAll; /*!< Total bytes to be received. */ - - uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */ - size_t rxRingBufferSize; /*!< Size of the ring buffer. */ - volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */ - volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */ - - flexio_uart_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< UART callback function parameter.*/ - - volatile uint8_t txState; /*!< TX transfer state. */ - volatile uint8_t rxState; /*!< RX transfer state */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Ungates the FlexIO clock, resets the FlexIO module, configures FlexIO UART - * hardware, and configures the FlexIO UART with FlexIO UART configuration. - * The configuration structure can be filled by the user or be set with - * default values by FLEXIO_UART_GetDefaultConfig(). - * - * Example - @code - FLEXIO_UART_Type base = { - .flexioBase = FLEXIO, - .TxPinIndex = 0, - .RxPinIndex = 1, - .shifterIndex = {0,1}, - .timerIndex = {0,1} - }; - flexio_uart_config_t config = { - .enableInDoze = false, - .enableInDebug = true, - .enableFastAccess = false, - .baudRate_Bps = 115200U, - .bitCountPerChar = 8 - }; - FLEXIO_UART_Init(base, &config, srcClock_Hz); - @endcode - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param userConfig Pointer to the flexio_uart_config_t structure. - * @param srcClock_Hz FlexIO source clock in Hz. - * @retval kStatus_Success Configuration success. - * @retval kStatus_FLEXIO_UART_BaudrateNotSupport Baudrate is not supported for current clock source frequency. -*/ -status_t FLEXIO_UART_Init(FLEXIO_UART_Type *base, const flexio_uart_config_t *userConfig, uint32_t srcClock_Hz); - -/*! - * @brief Resets the FlexIO UART shifter and timer config. - * - * @note After calling this API, call the FLEXO_UART_Init to use the FlexIO UART module. - * - * @param base Pointer to FLEXIO_UART_Type structure - */ -void FLEXIO_UART_Deinit(FLEXIO_UART_Type *base); - -/*! - * @brief Gets the default configuration to configure the FlexIO UART. The configuration - * can be used directly for calling the FLEXIO_UART_Init(). - * Example: - @code - flexio_uart_config_t config; - FLEXIO_UART_GetDefaultConfig(&userConfig); - @endcode - * @param userConfig Pointer to the flexio_uart_config_t structure. -*/ -void FLEXIO_UART_GetDefaultConfig(flexio_uart_config_t *userConfig); - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the FlexIO UART status flags. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @return FlexIO UART status flags. - */ - -uint32_t FLEXIO_UART_GetStatusFlags(FLEXIO_UART_Type *base); - -/*! - * @brief Gets the FlexIO UART status flags. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param mask Status flag. - * The parameter can be any combination of the following values: - * @arg kFLEXIO_UART_TxDataRegEmptyFlag - * @arg kFLEXIO_UART_RxEmptyFlag - * @arg kFLEXIO_UART_RxOverRunFlag - */ - -void FLEXIO_UART_ClearStatusFlags(FLEXIO_UART_Type *base, uint32_t mask); - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the FlexIO UART interrupt. - * - * This function enables the FlexIO UART interrupt. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param mask Interrupt source. - */ -void FLEXIO_UART_EnableInterrupts(FLEXIO_UART_Type *base, uint32_t mask); - -/*! - * @brief Disables the FlexIO UART interrupt. - * - * This function disables the FlexIO UART interrupt. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param mask Interrupt source. - */ -void FLEXIO_UART_DisableInterrupts(FLEXIO_UART_Type *base, uint32_t mask); - -/* @} */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Gets the FlexIO UARt transmit data register address. - * - * This function returns the UART data register address, which is mainly used by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @return FlexIO UART transmit data register address. - */ -static inline uint32_t FLEXIO_UART_GetTxDataRegisterAddress(FLEXIO_UART_Type *base) -{ - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[0]); -} - -/*! - * @brief Gets the FlexIO UART receive data register address. - * - * This function returns the UART data register address, which is mainly used by DMA/eDMA. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @return FlexIO UART receive data register address. - */ -static inline uint32_t FLEXIO_UART_GetRxDataRegisterAddress(FLEXIO_UART_Type *base) -{ - return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferByteSwapped, base->shifterIndex[1]); -} - -/*! - * @brief Enables/disables the FlexIO UART transmit DMA. - * This function enables/disables the FlexIO UART Tx DMA, - * which means asserting the kFLEXIO_UART_TxDataRegEmptyFlag does/doesn't trigger the DMA request. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param enable True to enable, false to disable. - */ -static inline void FLEXIO_UART_EnableTxDMA(FLEXIO_UART_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[0], enable); -} - -/*! - * @brief Enables/disables the FlexIO UART receive DMA. - * This function enables/disables the FlexIO UART Rx DMA, - * which means asserting kFLEXIO_UART_RxDataRegFullFlag does/doesn't trigger the DMA request. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param enable True to enable, false to disable. - */ -static inline void FLEXIO_UART_EnableRxDMA(FLEXIO_UART_Type *base, bool enable) -{ - FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[1], enable); -} - -/* @} */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Enables/disables the FlexIO UART module operation. - * - * @param base Pointer to the FLEXIO_UART_Type. - * @param enable True to enable, false does not have any effect. - */ -static inline void FLEXIO_UART_Enable(FLEXIO_UART_Type *base, bool enable) -{ - if (enable) - { - base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; - } -} - -/*! - * @brief Writes one byte of data. - * - * @note This is a non-blocking API, which returns directly after the data is put into the - * data register. Ensure that the TxEmptyFlag is asserted before calling - * this API. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param buffer The data bytes to send. - */ -static inline void FLEXIO_UART_WriteByte(FLEXIO_UART_Type *base, const uint8_t *buffer) -{ - base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = *buffer; -} - -/*! - * @brief Reads one byte of data. - * - * @note This is a non-blocking API, which returns directly after the data is read from the - * data register. Ensure that the RxFullFlag is asserted before calling this API. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param buffer The buffer to store the received bytes. - */ -static inline void FLEXIO_UART_ReadByte(FLEXIO_UART_Type *base, uint8_t *buffer) -{ - *buffer = (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); -} - -/*! - * @brief Sends a buffer of data bytes. - * - * @note This function blocks using the polling method until all bytes have been sent. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param txData The data bytes to send. - * @param txSize The number of data bytes to send. - * @retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. - * @retval kStatus_Success Successfully wrote all data. - */ -status_t FLEXIO_UART_WriteBlocking(FLEXIO_UART_Type *base, const uint8_t *txData, size_t txSize); - -/*! - * @brief Receives a buffer of bytes. - * - * @note This function blocks using the polling method until all bytes have been received. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param rxData The buffer to store the received bytes. - * @param rxSize The number of data bytes to be received. - * @retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. - * @retval kStatus_Success Successfully received all data. - */ -status_t FLEXIO_UART_ReadBlocking(FLEXIO_UART_Type *base, uint8_t *rxData, size_t rxSize); - -/* @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the UART handle. - * - * This function initializes the FlexIO UART handle, which can be used for other FlexIO - * UART transactional APIs. Call this API once to get the - * initialized handle. - * - * The UART driver supports the "background" receiving, which means that users can set up - * a RX ring buffer optionally. Data received is stored into the ring buffer even when - * the user doesn't call the FLEXIO_UART_TransferReceiveNonBlocking() API. If there is already data - * received in the ring buffer, users can get the received data from the ring buffer - * directly. The ring buffer is disabled if passing NULL as @p ringBuffer. - * - * @param base to FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. - */ -status_t FLEXIO_UART_TransferCreateHandle(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_callback_t callback, - void *userData); - -/*! - * @brief Sets up the RX ring buffer. - * - * This function sets up the RX ring buffer to a specific UART handle. - * - * When the RX ring buffer is used, data received is stored into the ring buffer even when - * the user doesn't call the UART_ReceiveNonBlocking() API. If there is already data received - * in the ring buffer, users 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 @p ringBufferSize is 32, only 31 bytes are used for saving data. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. - * @param ringBufferSize Size of the ring buffer. - */ -void FLEXIO_UART_TransferStartRingBuffer(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - uint8_t *ringBuffer, - size_t ringBufferSize); - -/*! - * @brief Aborts the background transfer and uninstalls the ring buffer. - * - * This function aborts the background transfer and uninstalls the ring buffer. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferStopRingBuffer(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); - -/*! - * @brief Transmits a buffer of data using the interrupt method. - * - * 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 ISR, the FlexIO UART driver calls the callback - * function and passes the @ref kStatus_FLEXIO_UART_TxIdle as status parameter. - * - * @note The kStatus_FLEXIO_UART_TxIdle is passed to the upper layer when all data is written - * to the TX register. However, it does not ensure that all data is sent out. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param xfer FlexIO UART transfer structure. See #flexio_uart_transfer_t. - * @retval kStatus_Success Successfully starts the data transmission. - * @retval kStatus_UART_TxBusy Previous transmission still not finished, data not written to the TX register. - */ -status_t FLEXIO_UART_TransferSendNonBlocking(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_t *xfer); - -/*! - * @brief Aborts the interrupt-driven data transmit. - * - * This function aborts the interrupt-driven data sending. Get the remainBytes to find out - * how many bytes are still not sent out. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferAbortSend(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); - -/*! - * @brief Gets the number of bytes sent. - * - * This function gets the number of bytes sent driven by interrupt. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param count Number of bytes sent so far by the non-blocking transaction. - * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetSendCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count); - -/*! - * @brief Receives a buffer of data using the interrupt method. - * - * This function receives data using the 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 ring buffer is copied and - * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer. - * After copying, if the data in ring buffer is not enough to read, the receive - * request is saved by the UART driver. When new data arrives, the receive request - * is serviced first. When all data is received, the UART driver notifies the upper layer - * through a callback function and passes the status parameter kStatus_UART_RxIdle. - * For example, if the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer, - * the 5 bytes are copied to xfer->data. This function returns with the - * parameter @p receivedBytes set to 5. For the last 5 bytes, newly arrived data is - * saved from the xfer->data[5]. When 5 bytes are received, the UART driver notifies upper layer. - * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt - * to receive data to xfer->data. When all data is received, the upper layer is notified. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param xfer UART transfer structure. See #flexio_uart_transfer_t. - * @param receivedBytes Bytes received from the ring buffer directly. - * @retval kStatus_Success Successfully queue the transfer into the transmit queue. - * @retval kStatus_FLEXIO_UART_RxBusy Previous receive request is not finished. - */ -status_t FLEXIO_UART_TransferReceiveNonBlocking(FLEXIO_UART_Type *base, - flexio_uart_handle_t *handle, - flexio_uart_transfer_t *xfer, - size_t *receivedBytes); - -/*! - * @brief Aborts the receive data which was using IRQ. - * - * This function aborts the receive data which was using IRQ. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferAbortReceive(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); - -/*! - * @brief Gets the number of bytes received. - * - * This function gets the number of bytes received driven by interrupt. - * - * @param base Pointer to the FLEXIO_UART_Type structure. - * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. - * @param count Number of bytes received so far by the non-blocking transaction. - * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetReceiveCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count); - -/*! - * @brief FlexIO UART IRQ handler function. - * - * This function processes the FlexIO UART transmit and receives the IRQ request. - * - * @param uartType Pointer to the FLEXIO_UART_Type structure. - * @param uartHandle Pointer to the flexio_uart_handle_t structure to store the transfer state. - */ -void FLEXIO_UART_TransferHandleIRQ(void *uartType, void *uartHandle); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ -/*@}*/ - -#endif /*_FSL_FLEXIO_UART_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c b/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c deleted file mode 100644 index 522cbe8..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexio_uart_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexio_uart_edma" -#endif - -/*handle != NULL); - - /* Avoid the warning for unused variables. */ - handle = handle; - tcds = tcds; - - if (transferDone) - { - FLEXIO_UART_TransferAbortSendEDMA(uartPrivateHandle->base, uartPrivateHandle->handle); - - if (uartPrivateHandle->handle->callback != NULL) - { - uartPrivateHandle->handle->callback(uartPrivateHandle->base, uartPrivateHandle->handle, - kStatus_FLEXIO_UART_TxIdle, uartPrivateHandle->handle->userData); - } - } -} - -static void FLEXIO_UART_TransferReceiveEDMACallback(edma_handle_t *handle, - void *param, - bool transferDone, - uint32_t tcds) -{ - flexio_uart_edma_private_handle_t *uartPrivateHandle = (flexio_uart_edma_private_handle_t *)param; - - assert(uartPrivateHandle->handle != NULL); - - /* Avoid the warning for unused variables. */ - handle = handle; - tcds = tcds; - - if (transferDone) - { - /* Disable transfer. */ - FLEXIO_UART_TransferAbortReceiveEDMA(uartPrivateHandle->base, uartPrivateHandle->handle); - - if (uartPrivateHandle->handle->callback != NULL) - { - uartPrivateHandle->handle->callback(uartPrivateHandle->base, uartPrivateHandle->handle, - kStatus_FLEXIO_UART_RxIdle, uartPrivateHandle->handle->userData); - } - } -} - -/*! - * brief Initializes the UART handle which is used in transactional functions. - * - * param base Pointer to FLEXIO_UART_Type. - * param handle Pointer to flexio_uart_edma_handle_t structure. - * param callback The callback function. - * param userData The parameter of the callback function. - * param rxEdmaHandle User requested DMA handle for RX DMA transfer. - * param txEdmaHandle User requested DMA handle for TX DMA transfer. - * retval kStatus_Success Successfully create the handle. - * retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. - */ -status_t FLEXIO_UART_TransferCreateHandleEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txEdmaHandle, - edma_handle_t *rxEdmaHandle) -{ - assert(handle != NULL); - - uint8_t index = 0U; - - /* Find the an empty handle pointer to store the handle. */ - for (index = 0U; index < (uint8_t)FLEXIO_UART_HANDLE_COUNT; index++) - { - if (s_edmaPrivateHandle[index].base == NULL) - { - s_edmaPrivateHandle[index].base = base; - s_edmaPrivateHandle[index].handle = handle; - break; - } - } - - if (index == (uint8_t)FLEXIO_UART_HANDLE_COUNT) - { - return kStatus_OutOfRange; - } - - (void)memset(handle, 0, sizeof(*handle)); - - handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; - handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; - - handle->rxEdmaHandle = rxEdmaHandle; - handle->txEdmaHandle = txEdmaHandle; - - handle->callback = callback; - handle->userData = userData; - - /* Configure TX. */ - if (txEdmaHandle != NULL) - { - EDMA_SetCallback(handle->txEdmaHandle, FLEXIO_UART_TransferSendEDMACallback, &s_edmaPrivateHandle); - } - - /* Configure RX. */ - if (rxEdmaHandle != NULL) - { - EDMA_SetCallback(handle->rxEdmaHandle, FLEXIO_UART_TransferReceiveEDMACallback, &s_edmaPrivateHandle); - } - - return kStatus_Success; -} - -/*! - * brief Sends data using eDMA. - * - * This function sends data using eDMA. This is a non-blocking function, which returns - * right away. When all data is sent out, the send callback function is called. - * - * param base Pointer to FLEXIO_UART_Type - * param handle UART handle pointer. - * param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. - * retval kStatus_Success if succeed, others failed. - * retval kStatus_FLEXIO_UART_TxBusy Previous transfer on going. - */ -status_t FLEXIO_UART_TransferSendEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_transfer_t *xfer) -{ - assert(handle->txEdmaHandle != NULL); - - edma_transfer_config_t xferConfig; - status_t status; - - /* Return error if xfer invalid. */ - if ((0U == xfer->dataSize) || (NULL == xfer->data)) - { - return kStatus_InvalidArgument; - } - - /* If previous TX not finished. */ - if ((uint8_t)kFLEXIO_UART_TxBusy == handle->txState) - { - status = kStatus_FLEXIO_UART_TxBusy; - } - else - { - handle->txState = (uint8_t)kFLEXIO_UART_TxBusy; - handle->txDataSizeAll = xfer->dataSize; - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, xfer->data, sizeof(uint8_t), - (uint32_t *)FLEXIO_UART_GetTxDataRegisterAddress(base), sizeof(uint8_t), sizeof(uint8_t), - xfer->dataSize, kEDMA_MemoryToPeripheral); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO UART handle */ - handle->nbytes = sizeof(uint8_t); - - /* Submit transfer. */ - (void)EDMA_SubmitTransfer(handle->txEdmaHandle, &xferConfig); - EDMA_StartTransfer(handle->txEdmaHandle); - - /* Enable UART TX EDMA. */ - FLEXIO_UART_EnableTxDMA(base, true); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Receives data using eDMA. - * - * This function receives data using eDMA. This is a non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * param base Pointer to FLEXIO_UART_Type - * param handle Pointer to flexio_uart_edma_handle_t structure - * param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. - * retval kStatus_Success if succeed, others failed. - * retval kStatus_UART_RxBusy Previous transfer on going. - */ -status_t FLEXIO_UART_TransferReceiveEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_transfer_t *xfer) -{ - assert(handle->rxEdmaHandle != NULL); - - edma_transfer_config_t xferConfig; - status_t status; - - /* Return error if xfer invalid. */ - if ((0U == xfer->dataSize) || (NULL == xfer->data)) - { - return kStatus_InvalidArgument; - } - - /* If previous RX not finished. */ - if ((uint8_t)kFLEXIO_UART_RxBusy == handle->rxState) - { - status = kStatus_FLEXIO_UART_RxBusy; - } - else - { - handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; - handle->rxDataSizeAll = xfer->dataSize; - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, (uint32_t *)FLEXIO_UART_GetRxDataRegisterAddress(base), sizeof(uint8_t), - xfer->data, sizeof(uint8_t), sizeof(uint8_t), xfer->dataSize, kEDMA_PeripheralToMemory); - - /* Store the initially configured eDMA minor byte transfer count into the FLEXIO UART handle */ - handle->nbytes = sizeof(uint8_t); - - /* Submit transfer. */ - (void)EDMA_SubmitTransfer(handle->rxEdmaHandle, &xferConfig); - EDMA_StartTransfer(handle->rxEdmaHandle); - - /* Enable UART RX EDMA. */ - FLEXIO_UART_EnableRxDMA(base, true); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the sent data which using eDMA. - * - * This function aborts sent data which using eDMA. - * - * param base Pointer to FLEXIO_UART_Type - * param handle Pointer to flexio_uart_edma_handle_t structure - */ -void FLEXIO_UART_TransferAbortSendEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle) -{ - assert(handle->txEdmaHandle != NULL); - - /* Disable UART TX EDMA. */ - FLEXIO_UART_EnableTxDMA(base, false); - - /* Stop transfer. */ - EDMA_StopTransfer(handle->txEdmaHandle); - - handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; -} - -/*! - * brief Aborts the receive data which using eDMA. - * - * This function aborts the receive data which using eDMA. - * - * param base Pointer to FLEXIO_UART_Type - * param handle Pointer to flexio_uart_edma_handle_t structure - */ -void FLEXIO_UART_TransferAbortReceiveEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle) -{ - assert(handle->rxEdmaHandle != NULL); - - /* Disable UART RX EDMA. */ - FLEXIO_UART_EnableRxDMA(base, false); - - /* Stop transfer. */ - EDMA_StopTransfer(handle->rxEdmaHandle); - - handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; -} - -/*! - * brief Gets the number of bytes received. - * - * This function gets the number of bytes received. - * - * param base Pointer to FLEXIO_UART_Type - * param handle Pointer to flexio_uart_edma_handle_t structure - * param count Number of bytes received so far by the non-blocking transaction. - * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetReceiveCountEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - size_t *count) -{ - assert(handle != NULL); - assert(handle->rxEdmaHandle != NULL); - assert(count != NULL); - - if ((uint8_t)kFLEXIO_UART_RxIdle == handle->rxState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->rxDataSizeAll - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->rxEdmaHandle->base, handle->rxEdmaHandle->channel); - - return kStatus_Success; -} - -/*! - * brief Gets the number of bytes sent out. - * - * This function gets the number of bytes sent out. - * - * param base Pointer to FLEXIO_UART_Type - * param handle Pointer to flexio_uart_edma_handle_t structure - * param count Number of bytes sent so far by the non-blocking transaction. - * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetSendCountEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - assert(handle->txEdmaHandle != NULL); - assert(count != NULL); - - if ((uint8_t)kFLEXIO_UART_TxIdle == handle->txState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->txDataSizeAll - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->txEdmaHandle->base, handle->txEdmaHandle->channel); - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.h b/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.h deleted file mode 100644 index a51104b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexio_uart_edma.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_FLEXIO_UART_EDMA_H_ -#define _FSL_FLEXIO_UART_EDMA_H_ - -#include "fsl_flexio_uart.h" -#include "fsl_edma.h" - -/*! - * @addtogroup flexio_edma_uart - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FlexIO UART EDMA driver version. */ -#define FSL_FLEXIO_UART_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) -/*@}*/ - -/* Forward declaration of the handle typedef. */ -typedef struct _flexio_uart_edma_handle flexio_uart_edma_handle_t; - -/*! @brief UART transfer callback function. */ -typedef void (*flexio_uart_edma_transfer_callback_t)(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - status_t status, - void *userData); - -/*! - * @brief UART eDMA handle - */ -struct _flexio_uart_edma_handle -{ - flexio_uart_edma_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< UART callback function parameter.*/ - - size_t txDataSizeAll; /*!< Total bytes to be sent. */ - size_t rxDataSizeAll; /*!< Total bytes to be received. */ - - edma_handle_t *txEdmaHandle; /*!< The eDMA TX channel used. */ - edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */ - - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - - volatile uint8_t txState; /*!< TX transfer state. */ - volatile uint8_t rxState; /*!< RX transfer state */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA transactional - * @{ - */ - -/*! - * @brief Initializes the UART handle which is used in transactional functions. - * - * @param base Pointer to FLEXIO_UART_Type. - * @param handle Pointer to flexio_uart_edma_handle_t structure. - * @param callback The callback function. - * @param userData The parameter of the callback function. - * @param rxEdmaHandle User requested DMA handle for RX DMA transfer. - * @param txEdmaHandle User requested DMA handle for TX DMA transfer. - * @retval kStatus_Success Successfully create the handle. - * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. - */ -status_t FLEXIO_UART_TransferCreateHandleEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txEdmaHandle, - edma_handle_t *rxEdmaHandle); - -/*! - * @brief Sends data using eDMA. - * - * This function sends data using eDMA. This is a non-blocking function, which returns - * right away. When all data is sent out, the send callback function is called. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle UART handle pointer. - * @param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. - * @retval kStatus_Success if succeed, others failed. - * @retval kStatus_FLEXIO_UART_TxBusy Previous transfer on going. - */ -status_t FLEXIO_UART_TransferSendEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_transfer_t *xfer); - -/*! - * @brief Receives data using eDMA. - * - * This function receives data using eDMA. This is a non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle Pointer to flexio_uart_edma_handle_t structure - * @param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. - * @retval kStatus_Success if succeed, others failed. - * @retval kStatus_UART_RxBusy Previous transfer on going. - */ -status_t FLEXIO_UART_TransferReceiveEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - flexio_uart_transfer_t *xfer); - -/*! - * @brief Aborts the sent data which using eDMA. - * - * This function aborts sent data which using eDMA. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle Pointer to flexio_uart_edma_handle_t structure - */ -void FLEXIO_UART_TransferAbortSendEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle); - -/*! - * @brief Aborts the receive data which using eDMA. - * - * This function aborts the receive data which using eDMA. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle Pointer to flexio_uart_edma_handle_t structure - */ -void FLEXIO_UART_TransferAbortReceiveEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle); - -/*! - * @brief Gets the number of bytes sent out. - * - * This function gets the number of bytes sent out. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle Pointer to flexio_uart_edma_handle_t structure - * @param count Number of bytes sent so far by the non-blocking transaction. - * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetSendCountEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle, size_t *count); - -/*! - * @brief Gets the number of bytes received. - * - * This function gets the number of bytes received. - * - * @param base Pointer to FLEXIO_UART_Type - * @param handle Pointer to flexio_uart_edma_handle_t structure - * @param count Number of bytes received so far by the non-blocking transaction. - * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXIO_UART_TransferGetReceiveCountEDMA(FLEXIO_UART_Type *base, - flexio_uart_edma_handle_t *handle, - size_t *count); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_UART_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexram.c b/devices/MIMXRT1052/drivers/fsl_flexram.c deleted file mode 100644 index 7f2db85..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexram.c +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexram.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexram" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Gets the instance from the base address to be used to gate or ungate the module clock - * - * @param base FLEXRAM base address - * - * @return The FLEXRAM instance - */ -static uint32_t FLEXRAM_GetInstance(FLEXRAM_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to FLEXRAM bases for each instance. */ -static FLEXRAM_Type *const s_flexramBases[] = FLEXRAM_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to FLEXRAM clocks for each instance. */ -static const clock_ip_name_t s_flexramClocks[] = FLEXRAM_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO -/*! Look-up table to calculate single-bit error bit position for ITCM. */ -static const uint8_t ItcmLookUpTable[64] = { - 0xC1, 0x43, 0x9E, 0x83, 0x15, 0x4C, 0x4A, 0x8C, 0x31, 0x1C, 0xA2, 0xE0, 0x51, 0x2C, 0xC2, 0xD0, - 0x19, 0x1A, 0x26, 0xEA, 0x29, 0x94, 0x16, 0x64, 0x37, 0xA4, 0x0D, 0xC4, 0x75, 0x38, 0x4F, 0x58, - 0x46, 0x91, 0x86, 0x61, 0x49, 0x98, 0x89, 0x68, 0x32, 0x34, 0x07, 0xC8, 0x92, 0xA8, 0xA7, 0x54, - 0xA1, 0xD9, 0x25, 0xF8, 0x0E, 0x0B, 0x8A, 0x2A, 0x52, 0x45, 0x13, 0x85, 0x62, 0x70, 0x23, 0xB0}; -/*! Look-up table to calculate single-bit error bit position for DTCM. */ -static const uint8_t DtcmLookUpTable[32] = {0x61, 0x51, 0x19, 0x45, 0x43, 0x31, 0x29, 0x13, 0x62, 0x52, 0x4A, - 0x46, 0x32, 0x2A, 0x23, 0x1A, 0x2C, 0x64, 0x26, 0x25, 0x34, 0x16, - 0x15, 0x54, 0x0B, 0x58, 0x1C, 0x4C, 0x38, 0x0E, 0x0D, 0x49}; -#endif /* FLEXRAM_ECC_ERROR_DETAILED_INFO */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t FLEXRAM_GetInstance(FLEXRAM_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_flexramBases); instance++) - { - if (s_flexramBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_flexramBases)); - - return instance; -} - -/*! - * brief FLEXRAM module initialization function. - * - * param base FLEXRAM base address. - */ -void FLEXRAM_Init(FLEXRAM_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate ENET clock. */ - CLOCK_EnableClock(s_flexramClocks[FLEXRAM_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* enable all the interrupt status */ - base->INT_STAT_EN |= (uint32_t)kFLEXRAM_InterruptStatusAll; - /* clear all the interrupt status */ - base->INT_STATUS |= (uint32_t)kFLEXRAM_InterruptStatusAll; - /* disable all the interrpt */ - base->INT_SIG_EN = 0U; -} - -/*! - * brief Deinitializes the FLEXRAM. - * - */ -void FLEXRAM_Deinit(FLEXRAM_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate ENET clock. */ - CLOCK_DisableClock(s_flexramClocks[FLEXRAM_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -#if (defined(FSL_FEATURE_FLEXRAM_HAS_ECC) && FSL_FEATURE_FLEXRAM_HAS_ECC) -void FLEXRAM_EnableECC(FLEXRAM_Type *base, bool OcramECCEnable, bool TcmECCEnable) -{ - if (true == OcramECCEnable) - { - base->FLEXRAM_CTRL |= FLEXRAM_FLEXRAM_CTRL_OCRAM_ECC_EN_MASK; - } - else - { - base->FLEXRAM_CTRL &= ~FLEXRAM_FLEXRAM_CTRL_OCRAM_ECC_EN_MASK; - } - - if (true == TcmECCEnable) - { - base->FLEXRAM_CTRL |= FLEXRAM_FLEXRAM_CTRL_TCM_ECC_EN_MASK; - } - else - { - base->FLEXRAM_CTRL &= ~FLEXRAM_FLEXRAM_CTRL_TCM_ECC_EN_MASK; - } -} - -void FLEXRAM_GetOcramSingleErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_single_error_info_t *info) -{ - assert(NULL != info); - -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - info->OcramSingleErrorECCCipher = - (uint8_t)((base->OCRAM_ECC_SINGLE_ERROR_INFO & FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_ECC_MASK) >> - FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_ECC_SHIFT); - info->OcramSingleErrorECCSyndrome = - (uint8_t)((base->OCRAM_ECC_SINGLE_ERROR_INFO & FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_SYN_MASK) >> - FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_SYN_SHIFT); -#else - info->OcramSingleErrorInfo = base->OCRAM_ECC_SINGLE_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->OcramSingleErrorAddr = base->OCRAM_ECC_SINGLE_ERROR_ADDR; - info->OcramSingleErrorDataLSB = base->OCRAM_ECC_SINGLE_ERROR_DATA_LSB; - info->OcramSingleErrorDataMSB = base->OCRAM_ECC_SINGLE_ERROR_DATA_MSB; -} - -void FLEXRAM_GetOcramMultiErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_multi_error_info_t *info) -{ - assert(NULL != info); - -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - info->OcramMultiErrorECCCipher = - (uint8_t)((base->OCRAM_ECC_MULTI_ERROR_INFO & FLEXRAM_OCRAM_ECC_MULTI_ERROR_INFO_OCRAM_ECCM_ERRED_ECC_MASK) >> - FLEXRAM_OCRAM_ECC_MULTI_ERROR_INFO_OCRAM_ECCM_ERRED_ECC_SHIFT); -#else - info->OcramMultiErrorInfo = base->OCRAM_ECC_MULTI_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - info->OcramMultiErrorAddr = base->OCRAM_ECC_MULTI_ERROR_ADDR; - info->OcramMultiErrorDataLSB = base->OCRAM_ECC_MULTI_ERROR_DATA_LSB; - info->OcramMultiErrorDataMSB = base->OCRAM_ECC_MULTI_ERROR_DATA_MSB; -} - -void FLEXRAM_GetItcmSingleErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_single_error_info_t *info) -{ - assert(NULL != info); - -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */ - uint8_t singleErrorECCSyndrome = 0x00U; - - info->ItcmSingleErrorTCMWriteRead = - (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFW_MASK) >> - FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFW_SHIFT); - info->ItcmSingleErrorTCMAccessSize = - (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSIZ_SHIFT); - info->ItcmSingleErrorTCMMaster = - (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >> - FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFMST_SHIFT); - info->ItcmSingleErrorTCMPrivilege = - (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >> - FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFPRT_SHIFT); - singleErrorECCSyndrome = - (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >> - FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSYN_SHIFT); - - for (uint8_t i = 0x00U; i < sizeof(ItcmLookUpTable) / sizeof(ItcmLookUpTable[0]); i++) - { - if (singleErrorECCSyndrome == ItcmLookUpTable[i]) - { - info->ItcmSingleErrorBitPostion = i; - break; - } - } -#else - info->ItcmSingleErrorInfo = base->ITCM_ECC_SINGLE_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->ItcmSingleErrorAddr = base->ITCM_ECC_SINGLE_ERROR_ADDR; - info->ItcmSingleErrorDataLSB = base->ITCM_ECC_SINGLE_ERROR_DATA_LSB; - info->ItcmSingleErrorDataMSB = base->ITCM_ECC_SINGLE_ERROR_DATA_MSB; -} - -void FLEXRAM_GetItcmMultiErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_multi_error_info_t *info) -{ - assert(NULL != info); - -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - info->ItcmMultiErrorTCMWriteRead = - (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_MASK) >> - FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_SHIFT); - info->ItcmMultiErrorTCMAccessSize = - (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_SHIFT); - info->ItcmMultiErrorTCMMaster = - (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >> - FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_SHIFT); - info->ItcmMultiErrorTCMPrivilege = - (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >> - FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_SHIFT); - info->ItcmMultiErrorECCSyndrome = - (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >> - FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_SHIFT); -#else - info->ItcmMultiErrorInfo = base->ITCM_ECC_MULTI_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->ItcmMultiErrorAddr = base->ITCM_ECC_MULTI_ERROR_ADDR; - info->ItcmMultiErrorDataLSB = base->ITCM_ECC_MULTI_ERROR_DATA_LSB; - info->ItcmMultiErrorDataMSB = base->ITCM_ECC_MULTI_ERROR_DATA_MSB; -} - -void FLEXRAM_GetDtcmSingleErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_single_error_info_t *info, uint8_t bank) -{ - assert(NULL != info); - assert((0x00U == bank) || (0x01U == bank)); - - if (0x00U == bank) - { -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */ - uint8_t singleErrorECCSyndrome = 0x00U; - - info->DtcmSingleErrorTCMWriteRead = - (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFW_MASK) >> - FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFW_SHIFT); - info->DtcmSingleErrorTCMAccessSize = - (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSIZ_SHIFT); - info->DtcmSingleErrorTCMMaster = - (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFMST_MASK) >> - FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFMST_SHIFT); - info->DtcmSingleErrorTCMPrivilege = - (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFPRT_MASK) >> - FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFPRT_SHIFT); - singleErrorECCSyndrome = - (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSYN_MASK) >> - FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSYN_SHIFT); - - for (uint8_t i = 0x00U; i < sizeof(ItcmLookUpTable) / sizeof(ItcmLookUpTable[0]); i++) - { - if (singleErrorECCSyndrome == ItcmLookUpTable[i]) - { - info->DtcmSingleErrorBitPostion = i; - break; - } - } -#else - info->DtcmSingleErrorInfo = base->D0TCM_ECC_SINGLE_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->DtcmSingleErrorAddr = base->D0TCM_ECC_SINGLE_ERROR_ADDR; - info->DtcmSingleErrorData = base->D0TCM_ECC_SINGLE_ERROR_DATA; - } - else - { -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */ - uint8_t singleErrorECCSyndrome = 0x00U; - - info->DtcmSingleErrorTCMWriteRead = - (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFW_MASK) >> - FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFW_SHIFT); - info->DtcmSingleErrorTCMAccessSize = - (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSIZ_SHIFT); - info->DtcmSingleErrorTCMMaster = - (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFMST_MASK) >> - FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFMST_SHIFT); - info->DtcmSingleErrorTCMPrivilege = - (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFPRT_MASK) >> - FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFPRT_SHIFT); - singleErrorECCSyndrome = - (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSYN_MASK) >> - FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSYN_SHIFT); - - for (uint8_t i = 0x00U; i < sizeof(DtcmLookUpTable) / sizeof(DtcmLookUpTable[0]); i++) - { - if (singleErrorECCSyndrome == DtcmLookUpTable[i]) - { - info->DtcmSingleErrorBitPostion = i; - break; - } - } -#else - info->DtcmSingleErrorInfo = base->D1TCM_ECC_SINGLE_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->DtcmSingleErrorAddr = base->D1TCM_ECC_SINGLE_ERROR_ADDR; - info->DtcmSingleErrorData = base->D1TCM_ECC_SINGLE_ERROR_DATA; - } -} - -void FLEXRAM_GetDtcmMultiErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_multi_error_info_t *info, uint8_t bank) -{ - assert(NULL != info); - assert((0x00U == bank) || (0x01U == bank)); - - if (0x00U == bank) - { -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - info->DtcmMultiErrorTCMWriteRead = - (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFW_MASK) >> - FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFW_SHIFT); - info->DtcmMultiErrorTCMAccessSize = - (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSIZ_SHIFT); - info->DtcmMultiErrorTCMMaster = - (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFMST_MASK) >> - FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFMST_SHIFT); - info->DtcmMultiErrorTCMPrivilege = - (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFPRT_MASK) >> - FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFPRT_SHIFT); - info->DtcmMultiErrorECCSyndrome = - (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSYN_MASK) >> - FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSYN_SHIFT); -#else - info->DtcmMultiErrorInfo = base->D0TCM_ECC_MULTI_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->DtcmMultiErrorAddr = base->D0TCM_ECC_MULTI_ERROR_ADDR; - info->DtcmMultiErrorData = base->D0TCM_ECC_MULTI_ERROR_DATA; - } - else - { -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - info->DtcmMultiErrorTCMWriteRead = - (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_MASK) >> - FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFW_SHIFT); - info->DtcmMultiErrorTCMAccessSize = - (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >> - FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFSIZ_SHIFT); - info->DtcmMultiErrorTCMMaster = - (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >> - FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFMST_SHIFT); - info->DtcmMultiErrorTCMPrivilege = - (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >> - FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFPRT_SHIFT); - info->DtcmMultiErrorECCSyndrome = - (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >> - FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFSYN_SHIFT); -#else - info->DtcmMultiErrorInfo = base->D1TCM_ECC_MULTI_ERROR_INFO; -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - - info->DtcmMultiErrorAddr = base->D1TCM_ECC_MULTI_ERROR_ADDR; - info->DtcmMultiErrorData = base->D1TCM_ECC_MULTI_ERROR_DATA; - } -} -#endif /* FSL_FEATURE_FLEXRAM_HAS_ECC */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexram.h b/devices/MIMXRT1052/drivers/fsl_flexram.h deleted file mode 100644 index 73f4ecc..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexram.h +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXRAM_H_ -#define _FSL_FLEXRAM_H_ - -#include "fsl_common.h" -#include "fsl_flexram_allocate.h" - -/*! - * @addtogroup flexram - * @{ - */ - -/****************************************************************************** - * Definitions. - *****************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief Driver version 2.1.0. */ -#define FSL_FLEXRAM_DRIVER_VERSION (MAKE_VERSION(2U, 1U, 0U)) -/*@}*/ - -/*! @brief Get ECC error detailed information. */ -#ifndef FLEXRAM_ECC_ERROR_DETAILED_INFO -#define FLEXRAM_ECC_ERROR_DETAILED_INFO \ - 0U /* Define to zero means get raw ECC error information, which needs parse it by user. */ -#endif - -/*! @brief Flexram write/read selection. */ -enum -{ - kFLEXRAM_Read = 0U, /*!< read */ - kFLEXRAM_Write = 1U, /*!< write */ -}; - -/*! @brief Interrupt status flag mask */ -enum -{ - kFLEXRAM_OCRAMAccessError = FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK, /*!< OCRAM accesses unallocated address */ - kFLEXRAM_DTCMAccessError = FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK, /*!< DTCM accesses unallocated address */ - kFLEXRAM_ITCMAccessError = FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK, /*!< ITCM accesses unallocated address */ - -#if defined(FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR) && FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR - kFLEXRAM_OCRAMMagicAddrMatch = FLEXRAM_INT_STATUS_OCRAM_MAM_STATUS_MASK, /*!< OCRAM magic address match */ - kFLEXRAM_DTCMMagicAddrMatch = FLEXRAM_INT_STATUS_DTCM_MAM_STATUS_MASK, /*!< DTCM magic address match */ - kFLEXRAM_ITCMMagicAddrMatch = FLEXRAM_INT_STATUS_ITCM_MAM_STATUS_MASK, /*!< ITCM magic address match */ - -#if defined(FSL_FEATURE_FLEXRAM_HAS_ECC) && FSL_FEATURE_FLEXRAM_HAS_ECC - kFLEXRAM_OCRAMECCMultiError = FLEXRAM_INT_STATUS_OCRAM_ECC_ERRM_INT_MASK, - kFLEXRAM_OCRAMECCSingleError = FLEXRAM_INT_STATUS_OCRAM_ECC_ERRS_INT_MASK, - kFLEXRAM_ITCMECCMultiError = FLEXRAM_INT_STATUS_ITCM_ECC_ERRM_INT_MASK, - kFLEXRAM_ITCMECCSingleError = FLEXRAM_INT_STATUS_ITCM_ECC_ERRS_INT_MASK, - kFLEXRAM_D0TCMECCMultiError = FLEXRAM_INT_STATUS_D0TCM_ECC_ERRM_INT_MASK, - kFLEXRAM_D0TCMECCSingleError = FLEXRAM_INT_STATUS_D0TCM_ECC_ERRS_INT_MASK, - kFLEXRAM_D1TCMECCMultiError = FLEXRAM_INT_STATUS_D1TCM_ECC_ERRM_INT_MASK, - kFLEXRAM_D1TCMECCSingleError = FLEXRAM_INT_STATUS_D1TCM_ECC_ERRS_INT_MASK, - - kFLEXRAM_InterruptStatusAll = - FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK | FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK | - FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK | FLEXRAM_INT_STATUS_OCRAM_MAM_STATUS_MASK | - FLEXRAM_INT_STATUS_DTCM_MAM_STATUS_MASK | FLEXRAM_INT_STATUS_ITCM_MAM_STATUS_MASK | - FLEXRAM_INT_STATUS_OCRAM_ECC_ERRM_INT_MASK | FLEXRAM_INT_STATUS_OCRAM_ECC_ERRS_INT_MASK | - FLEXRAM_INT_STATUS_ITCM_ECC_ERRM_INT_MASK | FLEXRAM_INT_STATUS_ITCM_ECC_ERRS_INT_MASK | - FLEXRAM_INT_STATUS_D0TCM_ECC_ERRM_INT_MASK | FLEXRAM_INT_STATUS_D0TCM_ECC_ERRS_INT_MASK | - FLEXRAM_INT_STATUS_D1TCM_ECC_ERRM_INT_MASK | FLEXRAM_INT_STATUS_D1TCM_ECC_ERRS_INT_MASK, -#else - kFLEXRAM_InterruptStatusAll = FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK | FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK | - FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK | FLEXRAM_INT_STATUS_OCRAM_MAM_STATUS_MASK | - FLEXRAM_INT_STATUS_DTCM_MAM_STATUS_MASK | FLEXRAM_INT_STATUS_ITCM_MAM_STATUS_MASK, -#endif /* FSL_FEATURE_FLEXRAM_HAS_ECC */ - -/*!< all the interrupt status mask */ -#else - kFLEXRAM_InterruptStatusAll = FLEXRAM_INT_STATUS_OCRAM_ERR_STATUS_MASK | FLEXRAM_INT_STATUS_DTCM_ERR_STATUS_MASK | - FLEXRAM_INT_STATUS_ITCM_ERR_STATUS_MASK, /*!< all the interrupt status mask */ -#endif /* FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR */ - -}; - -/*! @brief FLEXRAM TCM access mode. - * Fast access mode expected to be finished in 1-cycle; - * Wait access mode expected to be finished in 2-cycle. - * Wait access mode is a feature of the flexram and it should be used when - * the CPU clock is too fast to finish TCM access in 1-cycle. - * Normally, fast mode is the default mode, the efficiency of the TCM access will better. - */ -typedef enum _flexram_tcm_access_mode -{ - kFLEXRAM_TCMAccessFastMode = 0U, /*!< fast access mode */ - kFLEXRAM_TCMAccessWaitMode = 1U, /*!< wait access mode */ -} flexram_tcm_access_mode_t; - -/*! @brief FLEXRAM TCM support size */ -enum -{ - kFLEXRAM_TCMSize32KB = 32 * 1024U, /*!< TCM total size be 32KB */ - kFLEXRAM_TCMSize64KB = 64 * 1024U, /*!< TCM total size be 64KB */ - kFLEXRAM_TCMSize128KB = 128 * 1024U, /*!< TCM total size be 128KB */ - kFLEXRAM_TCMSize256KB = 256 * 1024U, /*!< TCM total size be 256KB */ - kFLEXRAM_TCMSize512KB = 512 * 1024U, /*!< TCM total size be 512KB */ -}; - -#if (defined(FSL_FEATURE_FLEXRAM_HAS_ECC) && FSL_FEATURE_FLEXRAM_HAS_ECC) -/*! @brief FLEXRAM ocram ecc single error information, including single error information, error address, error data */ -typedef struct _flexram_ocram_ecc_single_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t OcramSingleErrorECCCipher; /*!< OCRAM corresponding ECC cipher of OCRAM single-bit ECC error. */ - uint8_t OcramSingleErrorECCSyndrome; /*!< OCRAM corresponding ECC syndrome of OCRAM single-bit ECC error, - which can be used to locate the Error bit using a look-up table. */ -#else - uint32_t OcramSingleErrorInfo; /*!< Ocram single error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t OcramSingleErrorAddr; /*!< Ocram single error address */ - uint32_t OcramSingleErrorDataLSB; /*!< Ocram single error data LSB */ - uint32_t OcramSingleErrorDataMSB; /*!< Ocram single error data MSB */ -} flexram_ocram_ecc_single_error_info_t; - -/*! @brief FLEXRAM ocram ecc multiple error information, including multiple error information, error address, error data - */ -typedef struct _flexram_ocram_ecc_multi_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t OcramMultiErrorECCCipher; /*!< OCRAM corresponding ECC cipher of OCRAM multi-bit ECC error. */ -#else - uint32_t OcramMultiErrorInfo; /*!< Ocram single error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t OcramMultiErrorAddr; /*!< Ocram multiple error address */ - uint32_t OcramMultiErrorDataLSB; /*!< Ocram multiple error data LSB */ - uint32_t OcramMultiErrorDataMSB; /*!< Ocram multiple error data MSB */ -} flexram_ocram_ecc_multi_error_info_t; - -/*! @brief FLEXRAM itcm ecc single error information, including single error information, error address, error data */ -typedef struct _flexram_itcm_ecc_single_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t ItcmSingleErrorTCMWriteRead; /*!< itcm single-bit ECC error corresponding tcm_wr value, which is to tell - whether it is a write access(0x01) or a read access(0x00). */ - uint8_t ItcmSingleErrorTCMAccessSize; /*!< itcm single-bit ECC error corresponding tcm access size, - which should be 3 (64bit). */ - uint8_t ItcmSingleErrorTCMMaster; /*!< itcm single-bit ECC error corresponding tcm_master, - which is to tell the requester of the current access. */ - uint8_t ItcmSingleErrorTCMPrivilege; /*!< itcm single-bit ECC error corresponding tcm_priv, - which is to tell the privilege level of access. */ - uint8_t ItcmSingleErrorBitPostion; /*!< itcm single-bit ECC error corresponding bit postion. */ -#else - uint32_t ItcmSingleErrorInfo; /*!< itcm single error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t ItcmSingleErrorAddr; /*!< itcm single error address */ - uint32_t ItcmSingleErrorDataLSB; /*!< itcm single error data LSB */ - uint32_t ItcmSingleErrorDataMSB; /*!< itcm single error data MSB */ -} flexram_itcm_ecc_single_error_info_t; - -/*! @brief FLEXRAM itcm ecc multiple error information, including multiple error information, error address, error data - */ -typedef struct _flexram_itcm_ecc_multi_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t ItcmMultiErrorTCMWriteRead; /*!< itcm multiple-bit ECC error corresponding tcm_wr value, which is to tell - whether it is a write access(0x01) or a read access(0x00). */ - uint8_t ItcmMultiErrorTCMAccessSize; /*!< itcm multiple-bit ECC error corresponding tcm access size, - which should be 3 (64bit). */ - uint8_t ItcmMultiErrorTCMMaster; /*!< itcm multiple-bit ECC error corresponding tcm_master, - which is to tell the requester of the current access. */ - uint8_t ItcmMultiErrorTCMPrivilege; /*!< itcm multiple-bit ECC error corresponding tcm_priv, - which is to tell the privilege level of access. */ - uint8_t ItcmMultiErrorECCSyndrome; /*!< itcm multiple-bit ECC error corresponding syndrome, - which can not be used to locate the Error bit using a look-up table. */ -#else - uint32_t ItcmMultiErrorInfo; /*!< itcm multiple error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t ItcmMultiErrorAddr; /*!< itcm multiple error address */ - uint32_t ItcmMultiErrorDataLSB; /*!< itcm multiple error data LSB */ - uint32_t ItcmMultiErrorDataMSB; /*!< itcm multiple error data MSB */ -} flexram_itcm_ecc_multi_error_info_t; - -/*! @brief FLEXRAM dtcm ecc single error information, including single error information, error address, error data */ -typedef struct _flexram_dtcm_ecc_single_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t DtcmSingleErrorTCMWriteRead; /*!< dtcm single-bit ECC error corresponding tcm_wr value, which is to tell - whether it is a write access(0x01) or a read access(0x00). */ - uint8_t DtcmSingleErrorTCMAccessSize; /*!< dtcm single-bit ECC error corresponding tcm access size, - which should be 2 (32bit). */ - uint8_t DtcmSingleErrorTCMMaster; /*!< dtcm single-bit ECC error corresponding tcm_master, - which is to tell the requester of the current access. */ - uint8_t DtcmSingleErrorTCMPrivilege; /*!< dtcm single-bit ECC error corresponding tcm_priv, - which is to tell the privilege level of access. */ - uint8_t DtcmSingleErrorBitPostion; /*!< dtcm single-bit ECC error corresponding bit postion. */ -#else - uint32_t DtcmSingleErrorInfo; /*!< dtcm single error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t DtcmSingleErrorAddr; /*!< dtcm single error address */ - uint32_t DtcmSingleErrorData; /*!< dtcm single error data */ -} flexram_dtcm_ecc_single_error_info_t; - -/*! @brief FLEXRAM dtcm ecc multiple error information, including multiple error information, error address, error data - */ -typedef struct _flexram_dtcm_ecc_multi_error_info -{ -#if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO - uint8_t DtcmMultiErrorTCMWriteRead; /*!< dtcm multiple-bit ECC error corresponding tcm_wr value, which is to tell - whether it is a write access(0x01) or a read access(0x00). */ - uint8_t DtcmMultiErrorTCMAccessSize; /*!< dtcm multiple-bit ECC error corresponding tcm access size, - which should be 3 (64bit). */ - uint8_t DtcmMultiErrorTCMMaster; /*!< dtcm multiple-bit ECC error corresponding tcm_master, - which is to tell the requester of the current access. */ - uint8_t DtcmMultiErrorTCMPrivilege; /*!< dtcm multiple-bit ECC error corresponding tcm_priv, - which is to tell the privilege level of access. */ - uint8_t DtcmMultiErrorECCSyndrome; /*!< dtcm multiple-bit ECC error corresponding syndrome, - which can not be used to locate the Error bit using a look-up table. */ -#else - uint32_t DtcmMultiErrorInfo; /*!< dtcm multiple error information, user should parse it by themself. */ -#endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/ - uint32_t DtcmMultiErrorAddr; /*!< dtcm multiple error address */ - uint32_t DtcmMultiErrorData; /*!< dtcm multiple error data */ -} flexram_dtcm_ecc_multi_error_info_t; - -#endif /* FSL_FEATURE_FLEXRAM_HAS_ECC */ - -/******************************************************************************* - * APIs - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and de-initialization - * @{ - */ - -/*! - * @brief FLEXRAM module initialization function. - * - * @param base FLEXRAM base address. - */ -void FLEXRAM_Init(FLEXRAM_Type *base); - -/*! - * @brief De-initializes the FLEXRAM. - * - */ -void FLEXRAM_Deinit(FLEXRAM_Type *base); - -/* @} */ - -/*! - * @name Status - * @{ - */ -/*! - * @brief FLEXRAM module gets interrupt status. - * - * @param base FLEXRAM base address. - */ -static inline uint32_t FLEXRAM_GetInterruptStatus(FLEXRAM_Type *base) -{ - return base->INT_STATUS & (uint32_t)kFLEXRAM_InterruptStatusAll; -} - -/*! - * @brief FLEXRAM module clears interrupt status. - * - * @param base FLEXRAM base address. - * @param status Status to be cleared. - */ -static inline void FLEXRAM_ClearInterruptStatus(FLEXRAM_Type *base, uint32_t status) -{ - base->INT_STATUS |= status; -} - -/*! - * @brief FLEXRAM module enables interrupt status. - * - * @param base FLEXRAM base address. - * @param status Status to be enabled. - */ -static inline void FLEXRAM_EnableInterruptStatus(FLEXRAM_Type *base, uint32_t status) -{ - base->INT_STAT_EN |= status; -} - -/*! - * @brief FLEXRAM module disable interrupt status. - * - * @param base FLEXRAM base address. - * @param status Status to be disabled. - */ -static inline void FLEXRAM_DisableInterruptStatus(FLEXRAM_Type *base, uint32_t status) -{ - base->INT_STAT_EN &= ~status; -} - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief FLEXRAM module enables interrupt. - * - * @param base FLEXRAM base address. - * @param status Status interrupt to be enabled. - */ -static inline void FLEXRAM_EnableInterruptSignal(FLEXRAM_Type *base, uint32_t status) -{ - base->INT_SIG_EN |= status; -} - -/*! - * @brief FLEXRAM module disables interrupt. - * - * @param base FLEXRAM base address. - * @param status Status interrupt to be disabled. - */ -static inline void FLEXRAM_DisableInterruptSignal(FLEXRAM_Type *base, uint32_t status) -{ - base->INT_SIG_EN &= ~status; -} -/* @} */ - -/*! - * @brief FLEXRAM module sets TCM read access mode - * - * @param base FLEXRAM base address. - * @param mode Access mode. - */ -static inline void FLEXRAM_SetTCMReadAccessMode(FLEXRAM_Type *base, flexram_tcm_access_mode_t mode) -{ - base->TCM_CTRL &= ~FLEXRAM_TCM_CTRL_TCM_RWAIT_EN_MASK; - base->TCM_CTRL |= (uint32_t)mode; -} - -/*! - * @brief FLEXRAM module set TCM write access mode - * - * @param base FLEXRAM base address. - * @param mode Access mode. - */ -static inline void FLEXRAM_SetTCMWriteAccessMode(FLEXRAM_Type *base, flexram_tcm_access_mode_t mode) -{ - base->TCM_CTRL &= ~FLEXRAM_TCM_CTRL_TCM_WWAIT_EN_MASK; - base->TCM_CTRL |= (uint32_t)mode; -} - -/*! - * @brief FLEXRAM module force ram clock on - * - * @param base FLEXRAM base address. - * @param enable Enable or disable clock force on. - */ -static inline void FLEXRAM_EnableForceRamClockOn(FLEXRAM_Type *base, bool enable) -{ - if (enable) - { - base->TCM_CTRL |= FLEXRAM_TCM_CTRL_FORCE_CLK_ON_MASK; - } - else - { - base->TCM_CTRL &= ~FLEXRAM_TCM_CTRL_FORCE_CLK_ON_MASK; - } -} - -#if defined(FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR) && FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR -/*! - * @brief FLEXRAM OCRAM magic addr configuration. - * When read/write access hit magic address, it will generate interrupt. - * @param base FLEXRAM base address. - * @param magicAddr Magic address, the actual address bits [18:3] is corresponding to the register field [16:1]. - * @param rwSel Read/write selection. 0 for read access while 1 for write access. - */ -static inline void FLEXRAM_SetOCRAMMagicAddr(FLEXRAM_Type *base, uint16_t magicAddr, uint32_t rwSel) -{ - base->OCRAM_MAGIC_ADDR = FLEXRAM_OCRAM_MAGIC_ADDR_OCRAM_WR_RD_SEL(rwSel) | - FLEXRAM_OCRAM_MAGIC_ADDR_OCRAM_MAGIC_ADDR((uint32_t)magicAddr >> 3); -} - -/*! - * @brief FLEXRAM DTCM magic addr configuration. - * When read/write access hits magic address, it will generate interrupt. - * @param base FLEXRAM base address. - * @param magicAddr Magic address, the actual address bits [18:3] is corresponding to the register field [16:1]. - * @param rwSel Read/write selection. 0 for read access while 1 write access. - */ -static inline void FLEXRAM_SetDTCMMagicAddr(FLEXRAM_Type *base, uint16_t magicAddr, uint32_t rwSel) -{ - base->DTCM_MAGIC_ADDR = FLEXRAM_DTCM_MAGIC_ADDR_DTCM_WR_RD_SEL(rwSel) | - FLEXRAM_DTCM_MAGIC_ADDR_DTCM_MAGIC_ADDR((uint32_t)magicAddr >> 3); -} - -/*! - * @brief FLEXRAM ITCM magic addr configuration. - * When read/write access hits magic address, it will generate interrupt. - * @param base FLEXRAM base address. - * @param magicAddr Magic address, the actual address bits [18:3] is corresponding to the register field [16:1]. - * @param rwSel Read/write selection. 0 for read access while 1 for write access. - */ -static inline void FLEXRAM_SetITCMMagicAddr(FLEXRAM_Type *base, uint16_t magicAddr, uint32_t rwSel) -{ - base->ITCM_MAGIC_ADDR = FLEXRAM_ITCM_MAGIC_ADDR_ITCM_WR_RD_SEL(rwSel) | - FLEXRAM_ITCM_MAGIC_ADDR_ITCM_MAGIC_ADDR((uint32_t)magicAddr >> 3); -} -#endif /* FSL_FEATURE_FLEXRAM_HAS_MAGIC_ADDR */ - -#if (defined(FSL_FEATURE_FLEXRAM_HAS_ECC) && FSL_FEATURE_FLEXRAM_HAS_ECC) -/*! - * @brief FLEXRAM get ocram ecc single error information. - * @param base FLEXRAM base address. - * @param OcramECCEnable ocram ecc enablement. - * @param TcmECCEnable tcm(itcm/d0tcm/d1tcm) ecc enablement. - */ -void FLEXRAM_EnableECC(FLEXRAM_Type *base, bool OcramECCEnable, bool TcmECCEnable); - -/*! - * @brief FLEXRAM get ocram ecc single error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - */ -void FLEXRAM_GetOcramSingleErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_single_error_info_t *info); - -/*! - * @brief FLEXRAM get ocram ecc multiple error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - */ -void FLEXRAM_GetOcramMultiErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_multi_error_info_t *info); - -/*! - * @brief FLEXRAM get itcm ecc single error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - */ -void FLEXRAM_GetItcmSingleErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_single_error_info_t *info); - -/*! - * @brief FLEXRAM get itcm ecc multiple error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - */ -void FLEXRAM_GetItcmMultiErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_multi_error_info_t *info); - -/*! - * @brief FLEXRAM get d0tcm ecc single error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - * @param bank DTCM bank, 0 is D0TCM, 1 is D1TCM. - */ -void FLEXRAM_GetDtcmSingleErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_single_error_info_t *info, uint8_t bank); - -/*! - * @brief FLEXRAM get d0tcm ecc multiple error information. - * @param base FLEXRAM base address. - * @param info ecc error information. - * @param bank DTCM bank, 0 is D0TCM, 1 is D1TCM. - */ -void FLEXRAM_GetDtcmMultiErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_multi_error_info_t *info, uint8_t bank); - -#endif /* FSL_FEATURE_FLEXRAM_HAS_ECC */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexram_allocate.c b/devices/MIMXRT1052/drivers/fsl_flexram_allocate.c deleted file mode 100644 index 2cc0fd7..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexram_allocate.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2019-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexram_allocate.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "driver.soc_flexram_allocate" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ -/*! - * brief FLEXRAM allocate on-chip ram for OCRAM,ITCM,DTCM - * This function is independent of FLEXRAM_Init, it can be called directly if ram re-allocate - * is needed. - * param config allocate configuration. - * retval kStatus_InvalidArgument the argument is invalid - * kStatus_Success allocate success - */ -status_t FLEXRAM_AllocateRam(flexram_allocate_ram_t *config) -{ - assert(config != NULL); - - uint8_t dtcmBankNum = config->dtcmBankNum; - uint8_t itcmBankNum = config->itcmBankNum; - uint8_t ocramBankNum = config->ocramBankNum; - uint8_t i = 0U; - uint32_t bankCfg = 0U; - status_t status = kStatus_Success; - - /* check the arguments */ - if ((uint8_t)FSL_FEATURE_FLEXRAM_INTERNAL_RAM_TOTAL_BANK_NUMBERS < (dtcmBankNum + itcmBankNum + ocramBankNum)) - { - status = kStatus_InvalidArgument; - } - else - { - /* flexram bank config value */ - for (i = 0U; i < (uint8_t)FSL_FEATURE_FLEXRAM_INTERNAL_RAM_TOTAL_BANK_NUMBERS; i++) - { - if (i < ocramBankNum) - { - bankCfg |= ((uint32_t)kFLEXRAM_BankOCRAM) << (i * 2U); - continue; - } - - if (i < (dtcmBankNum + ocramBankNum)) - { - bankCfg |= ((uint32_t)kFLEXRAM_BankDTCM) << (i * 2U); - continue; - } - - if (i < (dtcmBankNum + ocramBankNum + itcmBankNum)) - { - bankCfg |= ((uint32_t)kFLEXRAM_BankITCM) << (i * 2U); - continue; - } - } - - IOMUXC_GPR->GPR17 = bankCfg; - - /* select ram allocate source from FLEXRAM_BANK_CFG */ - FLEXRAM_SetAllocateRamSrc(kFLEXRAM_BankAllocateThroughBankCfg); - } - - return status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexram_allocate.h b/devices/MIMXRT1052/drivers/fsl_flexram_allocate.h deleted file mode 100644 index 47448af..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexram_allocate.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2019-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXRAM_ALLOCATE_H_ -#define _FSL_FLEXRAM_ALLOCATE_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup flexram - * @{ - */ - -/****************************************************************************** - * Definitions. - *****************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief SOC_FLEXRAM_ALLOCATE driver version 2.0.2. */ -#define FSL_SOC_FLEXRAM_ALLOCATE_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) -/*@}*/ - -/*! @brief FLEXRAM bank type */ -enum -{ - kFLEXRAM_BankNotUsed = 0U, /*!< bank is not used */ - kFLEXRAM_BankOCRAM = 1U, /*!< bank is OCRAM */ - kFLEXRAM_BankDTCM = 2U, /*!< bank is DTCM */ - kFLEXRAM_BankITCM = 3U, /*!< bank is ITCM */ -}; - -/*! @brief FLEXRAM bank allocate source */ -typedef enum _flexram_bank_allocate_src -{ - kFLEXRAM_BankAllocateThroughHardwareFuse = 0U, /*!< allocate ram through hardware fuse value */ - kFLEXRAM_BankAllocateThroughBankCfg = 1U, /*!< allocate ram through FLEXRAM_BANK_CFG */ -} flexram_bank_allocate_src_t; - -/*! @brief FLEXRAM allocate ocram, itcm, dtcm size */ -typedef struct _flexram_allocate_ram -{ - const uint8_t ocramBankNum; /*!< ocram banknumber which the SOC support */ - const uint8_t dtcmBankNum; /*!< dtcm bank number to allocate, the number should be power of 2 */ - const uint8_t itcmBankNum; /*!< itcm bank number to allocate, the number should be power of 2 */ -} flexram_allocate_ram_t; - -/******************************************************************************* - * APIs - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief FLEXRAM allocate on-chip ram for OCRAM,ITCM,DTCM - * This function is independent of FLEXRAM_Init, it can be called directly if ram re-allocate - * is needed. - * @param config allocate configuration. - * @retval kStatus_InvalidArgument the argument is invalid - * kStatus_Success allocate success - */ -status_t FLEXRAM_AllocateRam(flexram_allocate_ram_t *config); - -/*! - * @brief FLEXRAM set allocate on-chip ram source - * @param src bank config source select value. - */ -static inline void FLEXRAM_SetAllocateRamSrc(flexram_bank_allocate_src_t src) -{ - IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK; - IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL(src); -} - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexspi.c b/devices/MIMXRT1052/drivers/fsl_flexspi.c deleted file mode 100644 index ef72d37..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexspi.c +++ /dev/null @@ -1,1157 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexspi.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexspi" -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -#define FREQ_1MHz (1000000UL) -#define FLEXSPI_DLLCR_DEFAULT (0x100UL) -#define FLEXSPI_LUT_KEY_VAL (0x5AF05AF0UL) - -enum -{ - kFLEXSPI_DelayCellUnitMin = 75, /* 75ps. */ - kFLEXSPI_DelayCellUnitMax = 225, /* 225ps. */ -}; - -enum -{ - kFLEXSPI_FlashASampleClockSlaveDelayLocked = - FLEXSPI_STS2_ASLVLOCK_MASK, /* Flash A sample clock slave delay line locked. */ - kFLEXSPI_FlashASampleClockRefDelayLocked = - FLEXSPI_STS2_AREFLOCK_MASK, /* Flash A sample clock reference delay line locked. */ - kFLEXSPI_FlashBSampleClockSlaveDelayLocked = - FLEXSPI_STS2_BSLVLOCK_MASK, /* Flash B sample clock slave delay line locked. */ - kFLEXSPI_FlashBSampleClockRefDelayLocked = - FLEXSPI_STS2_BREFLOCK_MASK, /* Flash B sample clock reference delay line locked. */ -}; - -/*! @brief Common sets of flags used by the driver, _flexspi_flag_constants. */ -enum -{ - /*! IRQ sources enabled by the non-blocking transactional API. */ - kIrqFlags = kFLEXSPI_IpTxFifoWatermarkEmptyFlag | kFLEXSPI_IpRxFifoWatermarkAvailableFlag | - kFLEXSPI_SequenceExecutionTimeoutFlag | kFLEXSPI_IpCommandSequenceErrorFlag | - kFLEXSPI_IpCommandGrantTimeoutFlag | kFLEXSPI_IpCommandExecutionDoneFlag, - - /*! Errors to check for. */ - kErrorFlags = kFLEXSPI_SequenceExecutionTimeoutFlag | kFLEXSPI_IpCommandSequenceErrorFlag | - kFLEXSPI_IpCommandGrantTimeoutFlag, -}; - -/* FLEXSPI transfer state, _flexspi_transfer_state. */ -enum -{ - kFLEXSPI_Idle = 0x0U, /*!< Transfer is done. */ - kFLEXSPI_BusyWrite = 0x1U, /*!< FLEXSPI is busy write transfer. */ - kFLEXSPI_BusyRead = 0x2U, /*!< FLEXSPI is busy write transfer. */ -}; - -/*! @brief Typedef for interrupt handler. */ -typedef void (*flexspi_isr_t)(FLEXSPI_Type *base, flexspi_handle_t *handle); - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -static void FLEXSPI_Memset(void *src, uint8_t value, size_t length); - -/*! - * @brief Calculate flash A/B sample clock DLL. - * - * @param base FLEXSPI base pointer. - * @param config Flash configuration parameters. - */ -static uint32_t FLEXSPI_CalculateDll(FLEXSPI_Type *base, flexspi_device_config_t *config); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to flexspi bases for each instance. */ -static FLEXSPI_Type *const s_flexspiBases[] = FLEXSPI_BASE_PTRS; - -/*! @brief Pointers to flexspi IRQ number for each instance. */ -static const IRQn_Type s_flexspiIrqs[] = FLEXSPI_IRQS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Clock name array */ -static const clock_ip_name_t s_flexspiClock[] = FLEXSPI_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ -/*! @brief Pointers to flexspi handles for each instance. */ -static flexspi_handle_t *s_flexspiHandle[ARRAY_SIZE(s_flexspiBases)]; -#endif - -#if defined(FSL_FEATURE_FLEXSPI_HAS_RESET) && FSL_FEATURE_FLEXSPI_HAS_RESET -/*! @brief Pointers to FLEXSPI resets for each instance. */ -static const reset_ip_name_t s_flexspiResets[] = FLEXSPI_RSTS; -#endif - -#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ -/*! @brief Pointer to flexspi IRQ handler. */ -static flexspi_isr_t s_flexspiIsr; -#endif -/******************************************************************************* - * Code - ******************************************************************************/ -/* To avoid compiler opitimizing this API into memset() in library. */ -#if defined(__ICCARM__) -#pragma optimize = none -#endif /* defined(__ICCARM__) */ -static void FLEXSPI_Memset(void *src, uint8_t value, size_t length) -{ - assert(src != NULL); - uint8_t *p = src; - - for (uint32_t i = 0U; i < length; i++) - { - *p = value; - p++; - } -} - -uint32_t FLEXSPI_GetInstance(FLEXSPI_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_flexspiBases); instance++) - { - if (s_flexspiBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_flexspiBases)); - - return instance; -} - -static uint32_t FLEXSPI_CalculateDll(FLEXSPI_Type *base, flexspi_device_config_t *config) -{ - bool isUnifiedConfig = true; - uint32_t flexspiDllValue; - uint32_t dllValue; - uint32_t temp; -#if defined(FSL_FEATURE_FLEXSPI_DQS_DELAY_PS) && FSL_FEATURE_FLEXSPI_DQS_DELAY_PS - uint32_t internalDqsDelayPs = FSL_FEATURE_FLEXSPI_DQS_DELAY_PS; -#endif - uint32_t rxSampleClock = (base->MCR0 & FLEXSPI_MCR0_RXCLKSRC_MASK) >> FLEXSPI_MCR0_RXCLKSRC_SHIFT; - switch (rxSampleClock) - { - case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackInternally: - case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackFromDqsPad: - case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackFromSckPad: - isUnifiedConfig = true; - break; - case (uint32_t)kFLEXSPI_ReadSampleClkExternalInputFromDqsPad: - if (config->isSck2Enabled) - { - isUnifiedConfig = true; - } - else - { - isUnifiedConfig = false; - } - break; - default: - assert(false); - break; - } - - if (isUnifiedConfig) - { - flexspiDllValue = FLEXSPI_DLLCR_DEFAULT; /* 1 fixed delay cells in DLL delay chain) */ - } - else - { - if (config->flexspiRootClk >= 100U * FREQ_1MHz) - { -#if defined(FSL_FEATURE_FLEXSPI_DQS_DELAY_MIN) && FSL_FEATURE_FLEXSPI_DQS_DELAY_MIN - /* DLLEN = 1, SLVDLYTARGET = 0x0, */ - flexspiDllValue = FLEXSPI_DLLCR_DLLEN(1) | FLEXSPI_DLLCR_SLVDLYTARGET(0x00); -#else - /* DLLEN = 1, SLVDLYTARGET = 0xF, */ - flexspiDllValue = FLEXSPI_DLLCR_DLLEN(1) | FLEXSPI_DLLCR_SLVDLYTARGET(0x0F); -#endif - } - else - { - temp = (uint32_t)config->dataValidTime * 1000U; /* Convert data valid time in ns to ps. */ - dllValue = temp / (uint32_t)kFLEXSPI_DelayCellUnitMin; - if (dllValue * (uint32_t)kFLEXSPI_DelayCellUnitMin < temp) - { - dllValue++; - } - flexspiDllValue = FLEXSPI_DLLCR_OVRDEN(1) | FLEXSPI_DLLCR_OVRDVAL(dllValue); - } - } - return flexspiDllValue; -} - -status_t FLEXSPI_CheckAndClearError(FLEXSPI_Type *base, uint32_t status) -{ - status_t result = kStatus_Success; - - /* Check for error. */ - status &= (uint32_t)kErrorFlags; - if (0U != status) - { - /* Select the correct error code.. */ - if (0U != (status & (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag)) - { - result = kStatus_FLEXSPI_SequenceExecutionTimeout; - } - else if (0U != (status & (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag)) - { - result = kStatus_FLEXSPI_IpCommandSequenceError; - } - else if (0U != (status & (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag)) - { - result = kStatus_FLEXSPI_IpCommandGrantTimeout; - } - else - { - assert(false); - } - - /* Clear the flags. */ - FLEXSPI_ClearInterruptStatusFlags(base, status); - - /* Reset fifos. These flags clear automatically. */ - base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK; - base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK; - } - - return result; -} - -/*! - * brief Initializes the FLEXSPI module and internal state. - * - * This function enables the clock for FLEXSPI and also configures the FLEXSPI with the - * input configure parameters. Users should call this function before any FLEXSPI operations. - * - * param base FLEXSPI peripheral base address. - * param config FLEXSPI configure structure. - */ -void FLEXSPI_Init(FLEXSPI_Type *base, const flexspi_config_t *config) -{ - uint32_t configValue = 0; - uint8_t i = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the flexspi clock */ - (void)CLOCK_EnableClock(s_flexspiClock[FLEXSPI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_FLEXSPI_HAS_RESET) && FSL_FEATURE_FLEXSPI_HAS_RESET - /* Reset the FLEXSPI module */ - RESET_PeripheralReset(s_flexspiResets[FLEXSPI_GetInstance(base)]); -#endif - - /* Reset peripheral before configuring it. */ - base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK; - FLEXSPI_SoftwareReset(base); - - /* Configure MCR0 configuration items. */ - configValue = FLEXSPI_MCR0_RXCLKSRC(config->rxSampleClock) | FLEXSPI_MCR0_DOZEEN(config->enableDoze) | - FLEXSPI_MCR0_IPGRANTWAIT(config->ipGrantTimeoutCycle) | - FLEXSPI_MCR0_AHBGRANTWAIT(config->ahbConfig.ahbGrantTimeoutCycle) | - FLEXSPI_MCR0_SCKFREERUNEN(config->enableSckFreeRunning) | - FLEXSPI_MCR0_HSEN(config->enableHalfSpeedAccess) | -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) - FLEXSPI_MCR0_COMBINATIONEN(config->enableCombination) | -#endif -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) - FLEXSPI_MCR0_ATDFEN(config->ahbConfig.enableAHBWriteIpTxFifo) | -#endif -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) - FLEXSPI_MCR0_ARDFEN(config->ahbConfig.enableAHBWriteIpRxFifo) | -#endif - FLEXSPI_MCR0_MDIS_MASK; - base->MCR0 = configValue; - - /* Configure MCR1 configurations. */ - configValue = - FLEXSPI_MCR1_SEQWAIT(config->seqTimeoutCycle) | FLEXSPI_MCR1_AHBBUSWAIT(config->ahbConfig.ahbBusTimeoutCycle); - base->MCR1 = configValue; - - /* Configure MCR2 configurations. */ - configValue = base->MCR2; - configValue &= ~(FLEXSPI_MCR2_RESUMEWAIT_MASK | FLEXSPI_MCR2_SCKBDIFFOPT_MASK | FLEXSPI_MCR2_SAMEDEVICEEN_MASK | - FLEXSPI_MCR2_CLRAHBBUFOPT_MASK); - configValue |= FLEXSPI_MCR2_RESUMEWAIT(config->ahbConfig.resumeWaitCycle) | - FLEXSPI_MCR2_SCKBDIFFOPT(config->enableSckBDiffOpt) | - FLEXSPI_MCR2_SAMEDEVICEEN(config->enableSameConfigForAll) | - FLEXSPI_MCR2_CLRAHBBUFOPT(config->ahbConfig.enableClearAHBBufferOpt); - - base->MCR2 = configValue; - - /* Configure AHB control items. */ - configValue = base->AHBCR; - configValue &= ~(FLEXSPI_AHBCR_READADDROPT_MASK | FLEXSPI_AHBCR_PREFETCHEN_MASK | FLEXSPI_AHBCR_BUFFERABLEEN_MASK | - FLEXSPI_AHBCR_CACHABLEEN_MASK); - configValue |= FLEXSPI_AHBCR_READADDROPT(config->ahbConfig.enableReadAddressOpt) | - FLEXSPI_AHBCR_PREFETCHEN(config->ahbConfig.enableAHBPrefetch) | - FLEXSPI_AHBCR_BUFFERABLEEN(config->ahbConfig.enableAHBBufferable) | - FLEXSPI_AHBCR_CACHABLEEN(config->ahbConfig.enableAHBCachable); - base->AHBCR = configValue; - - /* Configure AHB rx buffers. */ - for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT; i++) - { - configValue = base->AHBRXBUFCR0[i]; - - configValue &= ~(FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK | FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK | - FLEXSPI_AHBRXBUFCR0_MSTRID_MASK | FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK); - configValue |= FLEXSPI_AHBRXBUFCR0_PREFETCHEN(config->ahbConfig.buffer[i].enablePrefetch) | - FLEXSPI_AHBRXBUFCR0_PRIORITY(config->ahbConfig.buffer[i].priority) | - FLEXSPI_AHBRXBUFCR0_MSTRID(config->ahbConfig.buffer[i].masterIndex) | - FLEXSPI_AHBRXBUFCR0_BUFSZ((uint32_t)config->ahbConfig.buffer[i].bufferSize / 8U); - base->AHBRXBUFCR0[i] = configValue; - } - - /* Configure IP Fifo watermarks. */ - base->IPRXFCR &= ~FLEXSPI_IPRXFCR_RXWMRK_MASK; - base->IPRXFCR |= FLEXSPI_IPRXFCR_RXWMRK((uint32_t)config->rxWatermark / 8U - 1U); - base->IPTXFCR &= ~FLEXSPI_IPTXFCR_TXWMRK_MASK; - base->IPTXFCR |= FLEXSPI_IPTXFCR_TXWMRK((uint32_t)config->txWatermark / 8U - 1U); - - /* Reset flash size on all ports */ - for (i = 0; i < (uint32_t)kFLEXSPI_PortCount; i++) - { - base->FLSHCR0[i] = 0; - } -} - -/*! - * brief Gets default settings for FLEXSPI. - * - * param config FLEXSPI configuration structure. - */ -void FLEXSPI_GetDefaultConfig(flexspi_config_t *config) -{ - /* Initializes the configure structure to zero. */ - FLEXSPI_Memset(config, 0, sizeof(*config)); - - config->rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackInternally; - config->enableSckFreeRunning = false; -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) - config->enableCombination = false; -#endif - config->enableDoze = true; - config->enableHalfSpeedAccess = false; - config->enableSckBDiffOpt = false; - config->enableSameConfigForAll = false; - config->seqTimeoutCycle = 0xFFFFU; - config->ipGrantTimeoutCycle = 0xFFU; - config->txWatermark = 8; - config->rxWatermark = 8; -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) - config->ahbConfig.enableAHBWriteIpTxFifo = false; -#endif -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) - config->ahbConfig.enableAHBWriteIpRxFifo = false; -#endif - config->ahbConfig.ahbGrantTimeoutCycle = 0xFFU; - config->ahbConfig.ahbBusTimeoutCycle = 0xFFFFU; - config->ahbConfig.resumeWaitCycle = 0x20U; - FLEXSPI_Memset(config->ahbConfig.buffer, 0, sizeof(config->ahbConfig.buffer)); - /* Use invalid master ID 0xF and buffer size 0 for the first several buffers. */ - for (uint8_t i = 0; i < ((uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 2U); i++) - { - config->ahbConfig.buffer[i].enablePrefetch = true; /* Default enable AHB prefetch. */ - config->ahbConfig.buffer[i].masterIndex = 0xFU; /* Invalid master index which is not used, so will never hit. */ - config->ahbConfig.buffer[i].bufferSize = - 0; /* Default buffer size 0 for buffer0 to buffer(FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 3U)*/ - } - - for (uint8_t i = ((uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 2U); - i < (uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT; i++) - { - config->ahbConfig.buffer[i].enablePrefetch = true; /* Default enable AHB prefetch. */ - config->ahbConfig.buffer[i].bufferSize = 256U; /* Default buffer size 256 bytes. */ - } - config->ahbConfig.enableClearAHBBufferOpt = false; - config->ahbConfig.enableReadAddressOpt = false; - config->ahbConfig.enableAHBPrefetch = false; - config->ahbConfig.enableAHBBufferable = false; - config->ahbConfig.enableAHBCachable = false; -} - -/*! - * brief Deinitializes the FLEXSPI module. - * - * Clears the FLEXSPI state and FLEXSPI module registers. - * param base FLEXSPI peripheral base address. - */ -void FLEXSPI_Deinit(FLEXSPI_Type *base) -{ - /* Reset peripheral. */ - FLEXSPI_SoftwareReset(base); -} - -/*! - * brief Update FLEXSPI DLL value depending on currently flexspi root clock. - * - * param base FLEXSPI peripheral base address. - * param config Flash configuration parameters. - * param port FLEXSPI Operation port. - */ -void FLEXSPI_UpdateDllValue(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port) -{ - uint32_t configValue = 0; - uint32_t statusValue = 0; - uint8_t index = (uint8_t)port >> 1U; /* PortA with index 0, PortB with index 1. */ - - /* Wait for bus to be idle before changing flash configuration. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - - /* Configure DLL. */ - configValue = FLEXSPI_CalculateDll(base, config); - base->DLLCR[index] = configValue; - - /* Exit stop mode. */ - base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK; - - /* According to ERR011377, need to delay at least 100 NOPs to ensure the DLL is locked. */ - statusValue = - (index == 0U) ? - ((uint32_t)kFLEXSPI_FlashASampleClockSlaveDelayLocked | - (uint32_t)kFLEXSPI_FlashASampleClockRefDelayLocked) : - ((uint32_t)kFLEXSPI_FlashBSampleClockSlaveDelayLocked | (uint32_t)kFLEXSPI_FlashBSampleClockRefDelayLocked); - - if (0U != (configValue & FLEXSPI_DLLCR_DLLEN_MASK)) - { - /* Wait slave delay line locked and slave reference delay line locked. */ - while ((base->STS2 & statusValue) != statusValue) - { - } - - /* Wait at least 100 NOPs*/ - for (uint8_t delay = 100U; delay > 0U; delay--) - { - __NOP(); - } - } -} - -/*! - * brief Configures the connected device parameter. - * - * This function configures the connected device relevant parameters, such as the size, command, and so on. - * The flash configuration value cannot have a default value. The user needs to configure it according to the - * connected device. - * - * param base FLEXSPI peripheral base address. - * param config Flash configuration parameters. - * param port FLEXSPI Operation port. - */ -void FLEXSPI_SetFlashConfig(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port) -{ - uint32_t configValue = 0; - uint8_t index = (uint8_t)port >> 1U; /* PortA with index 0, PortB with index 1. */ - - /* Wait for bus to be idle before changing flash configuration. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - - /* Configure flash size. */ - base->FLSHCR0[port] = config->flashSize; - - /* Configure flash parameters. */ - base->FLSHCR1[port] = FLEXSPI_FLSHCR1_CSINTERVAL(config->CSInterval) | - FLEXSPI_FLSHCR1_CSINTERVALUNIT(config->CSIntervalUnit) | - FLEXSPI_FLSHCR1_TCSH(config->CSHoldTime) | FLEXSPI_FLSHCR1_TCSS(config->CSSetupTime) | - FLEXSPI_FLSHCR1_CAS(config->columnspace) | FLEXSPI_FLSHCR1_WA(config->enableWordAddress); - - /* Configure AHB operation items. */ - configValue = base->FLSHCR2[port]; - - configValue &= ~(FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK | FLEXSPI_FLSHCR2_AWRWAIT_MASK | FLEXSPI_FLSHCR2_AWRSEQNUM_MASK | - FLEXSPI_FLSHCR2_AWRSEQID_MASK | FLEXSPI_FLSHCR2_ARDSEQNUM_MASK | FLEXSPI_FLSHCR2_ARDSEQID_MASK); - - configValue |= - FLEXSPI_FLSHCR2_AWRWAITUNIT(config->AHBWriteWaitUnit) | FLEXSPI_FLSHCR2_AWRWAIT(config->AHBWriteWaitInterval); - - if (config->AWRSeqNumber > 0U) - { - configValue |= FLEXSPI_FLSHCR2_AWRSEQID((uint32_t)config->AWRSeqIndex) | - FLEXSPI_FLSHCR2_AWRSEQNUM((uint32_t)config->AWRSeqNumber - 1U); - } - - if (config->ARDSeqNumber > 0U) - { - configValue |= FLEXSPI_FLSHCR2_ARDSEQID((uint32_t)config->ARDSeqIndex) | - FLEXSPI_FLSHCR2_ARDSEQNUM((uint32_t)config->ARDSeqNumber - 1U); - } - - base->FLSHCR2[port] = configValue; - - /* Configure DLL. */ - FLEXSPI_UpdateDllValue(base, config, port); - - /* Step into stop mode. */ - base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK; - - /* Configure write mask. */ - if (config->enableWriteMask) - { - base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMOPT1_MASK; - } - else - { - base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMOPT1_MASK; - } - - if (index == 0U) /*PortA*/ - { - base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMENA_MASK; - base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMENA(config->enableWriteMask); - } - else - { - base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMENB_MASK; - base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMENB(config->enableWriteMask); - } - - /* Exit stop mode. */ - base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK; - - /* Wait for bus to be idle before use it access to external flash. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } -} - -/*! brief Updates the LUT table. - * - * param base FLEXSPI peripheral base address. - * param index From which index start to update. It could be any index of the LUT table, which - * also allows user to update command content inside a command. Each command consists of up to - * 8 instructions and occupy 4*32-bit memory. - * param cmd Command sequence array. - * param count Number of sequences. - */ -void FLEXSPI_UpdateLUT(FLEXSPI_Type *base, uint32_t index, const uint32_t *cmd, uint32_t count) -{ - assert(index < 64U); - - uint32_t i = 0; - volatile uint32_t *lutBase; - - /* Wait for bus to be idle before changing flash configuration. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - - /* Unlock LUT for update. */ - base->LUTKEY = FLEXSPI_LUT_KEY_VAL; - base->LUTCR = 0x02; - - lutBase = &base->LUT[index]; - for (i = 0; i < count; i++) - { - *lutBase++ = *cmd++; - } - - /* Lock LUT. */ - base->LUTKEY = FLEXSPI_LUT_KEY_VAL; - base->LUTCR = 0x01; -} - -/*! brief Update read sample clock source - * - * param base FLEXSPI peripheral base address. - * param clockSource clockSource of type #flexspi_read_sample_clock_t - */ -void FLEXSPI_UpdateRxSampleClock(FLEXSPI_Type *base, flexspi_read_sample_clock_t clockSource) -{ - uint32_t mcr0Val; - - /* Wait for bus to be idle before changing flash configuration. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - - mcr0Val = base->MCR0; - mcr0Val &= ~FLEXSPI_MCR0_RXCLKSRC_MASK; - mcr0Val |= FLEXSPI_MCR0_RXCLKSRC(clockSource); - base->MCR0 = mcr0Val; - - /* Reset peripheral. */ - FLEXSPI_SoftwareReset(base); -} - -/*! - * brief Sends a buffer of data bytes using blocking method. - * note This function blocks via polling until all bytes have been sent. - * param base FLEXSPI peripheral base address - * param buffer The data bytes to send - * param size The number of data bytes to send - * retval kStatus_Success write success without error - * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected - * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_WriteBlocking(FLEXSPI_Type *base, uint32_t *buffer, size_t size) -{ - uint32_t txWatermark = ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXWMRK_MASK) >> FLEXSPI_IPTXFCR_TXWMRK_SHIFT) + 1U; - uint32_t status; - status_t result = kStatus_Success; - uint32_t i = 0; - - /* Send data buffer */ - while (0U != size) - { - /* Wait until there is room in the fifo. This also checks for errors. */ - while (0U == ((status = base->INTR) & (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag)) - { - } - - result = FLEXSPI_CheckAndClearError(base, status); - - if (kStatus_Success != result) - { - return result; - } - - /* Write watermark level data into tx fifo . */ - if (size >= 8U * txWatermark) - { - for (i = 0U; i < 2U * txWatermark; i++) - { - base->TFDR[i] = *buffer++; - } - - size = size - 8U * txWatermark; - } - else - { - for (i = 0U; i < ((size + 3U) / 4U); i++) - { - base->TFDR[i] = *buffer++; - } - size = 0U; - } - - /* Push a watermark level data into IP TX FIFO. */ - base->INTR |= (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag; - } - - return result; -} - -/*! - * brief Receives a buffer of data bytes using a blocking method. - * note This function blocks via polling until all bytes have been sent. - * param base FLEXSPI peripheral base address - * param buffer The data bytes to send - * param size The number of data bytes to receive - * retval kStatus_Success read success without error - * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected - * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_ReadBlocking(FLEXSPI_Type *base, uint32_t *buffer, size_t size) -{ - uint32_t rxWatermark = ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXWMRK_MASK) >> FLEXSPI_IPRXFCR_RXWMRK_SHIFT) + 1U; - uint32_t status; - status_t result = kStatus_Success; - uint32_t i = 0; - bool isReturn = false; - - /* Send data buffer */ - while (0U != size) - { - if (size >= 8U * rxWatermark) - { - /* Wait until there is room in the fifo. This also checks for errors. */ - while (0U == ((status = base->INTR) & (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag)) - { - result = FLEXSPI_CheckAndClearError(base, status); - - if (kStatus_Success != result) - { - isReturn = true; - break; - } - } - } - else - { - /* Wait fill level. This also checks for errors. */ - while (size > ((((base->IPRXFSTS) & FLEXSPI_IPRXFSTS_FILL_MASK) >> FLEXSPI_IPRXFSTS_FILL_SHIFT) * 8U)) - { - result = FLEXSPI_CheckAndClearError(base, base->INTR); - - if (kStatus_Success != result) - { - isReturn = true; - break; - } - } - } - - if (isReturn) - { - break; - } - - result = FLEXSPI_CheckAndClearError(base, base->INTR); - - if (kStatus_Success != result) - { - break; - } - - /* Read watermark level data from rx fifo . */ - if (size >= 8U * rxWatermark) - { - for (i = 0U; i < 2U * rxWatermark; i++) - { - *buffer++ = base->RFDR[i]; - } - - size = size - 8U * rxWatermark; - } - else - { - for (i = 0U; i < ((size + 3U) / 4U); i++) - { - *buffer++ = base->RFDR[i]; - } - size = 0; - } - - /* Pop out a watermark level datas from IP RX FIFO. */ - base->INTR |= (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag; - } - - return result; -} - -/*! - * brief Execute command to transfer a buffer data bytes using a blocking method. - * param base FLEXSPI peripheral base address - * param xfer pointer to the transfer structure. - * retval kStatus_Success command transfer success without error - * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected - * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer) -{ - uint32_t configValue = 0; - status_t result = kStatus_Success; - - /* Clear sequence pointer before sending data to external devices. */ - base->FLSHCR2[xfer->port] |= FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK; - - /* Clear former pending status before start this transfer. */ - base->INTR |= FLEXSPI_INTR_AHBCMDERR_MASK | FLEXSPI_INTR_IPCMDERR_MASK | FLEXSPI_INTR_AHBCMDGE_MASK | - FLEXSPI_INTR_IPCMDGE_MASK; - - /* Configure base address. */ - base->IPCR0 = xfer->deviceAddress; - - /* Reset fifos. */ - base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK; - base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK; - - /* Configure data size. */ - if ((xfer->cmdType == kFLEXSPI_Read) || (xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config)) - { - configValue = FLEXSPI_IPCR1_IDATSZ(xfer->dataSize); - } - - /* Configure sequence ID. */ - configValue |= - FLEXSPI_IPCR1_ISEQID((uint32_t)xfer->seqIndex) | FLEXSPI_IPCR1_ISEQNUM((uint32_t)xfer->SeqNumber - 1U); - base->IPCR1 = configValue; - - /* Start Transfer. */ - base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK; - - if ((xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config)) - { - result = FLEXSPI_WriteBlocking(base, xfer->data, xfer->dataSize); - } - else if (xfer->cmdType == kFLEXSPI_Read) - { - result = FLEXSPI_ReadBlocking(base, xfer->data, xfer->dataSize); - } - else - { - /* Empty else. */ - } - - /* Wait for bus to be idle before changing flash configuration. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - - if (xfer->cmdType == kFLEXSPI_Command) - { - result = FLEXSPI_CheckAndClearError(base, base->INTR); - } - - return result; -} - -/*! - * brief Initializes the FLEXSPI handle which is used in transactional functions. - * - * param base FLEXSPI peripheral base address. - * param handle pointer to flexspi_handle_t structure to store the transfer state. - * param callback pointer to user callback function. - * param userData user parameter passed to the callback function. - */ -void FLEXSPI_TransferCreateHandle(FLEXSPI_Type *base, - flexspi_handle_t *handle, - flexspi_transfer_callback_t callback, - void *userData) -{ - assert(NULL != handle); - - uint32_t instance = FLEXSPI_GetInstance(base); - - /* Zero handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set callback and userData. */ - handle->completionCallback = callback; - handle->userData = userData; - -#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ - /* Save the context in global variables to support the double weak mechanism. */ - s_flexspiHandle[instance] = handle; - s_flexspiIsr = FLEXSPI_TransferHandleIRQ; -#endif - - /* Enable NVIC interrupt. */ - (void)EnableIRQ(s_flexspiIrqs[instance]); -} - -/*! - * brief Performs a interrupt non-blocking transfer on the FLEXSPI bus. - * - * note Calling the API returns immediately after transfer initiates. The user needs - * to call FLEXSPI_GetTransferCount to poll the transfer status to check whether - * the transfer is finished. If the return status is not kStatus_FLEXSPI_Busy, the transfer - * is finished. For FLEXSPI_Read, the dataSize should be multiple of rx watermark level, or - * FLEXSPI could not read data properly. - * - * param base FLEXSPI peripheral base address. - * param handle pointer to flexspi_handle_t structure which stores the transfer state. - * param xfer pointer to flexspi_transfer_t structure. - * retval kStatus_Success Successfully start the data transmission. - * retval kStatus_FLEXSPI_Busy Previous transmission still not finished. - */ -status_t FLEXSPI_TransferNonBlocking(FLEXSPI_Type *base, flexspi_handle_t *handle, flexspi_transfer_t *xfer) -{ - uint32_t configValue = 0; - status_t result = kStatus_Success; - - assert(NULL != handle); - assert(NULL != xfer); - - /* Check if the I2C bus is idle - if not return busy status. */ - if (handle->state != (uint32_t)kFLEXSPI_Idle) - { - result = kStatus_FLEXSPI_Busy; - } - else - { - handle->data = xfer->data; - handle->dataSize = xfer->dataSize; - handle->transferTotalSize = xfer->dataSize; - handle->state = (xfer->cmdType == kFLEXSPI_Read) ? (uint32_t)kFLEXSPI_BusyRead : (uint32_t)kFLEXSPI_BusyWrite; - - /* Clear sequence pointer before sending data to external devices. */ - base->FLSHCR2[xfer->port] |= FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK; - - /* Clear former pending status before start this transfer. */ - base->INTR |= FLEXSPI_INTR_AHBCMDERR_MASK | FLEXSPI_INTR_IPCMDERR_MASK | FLEXSPI_INTR_AHBCMDGE_MASK | - FLEXSPI_INTR_IPCMDGE_MASK; - - /* Configure base address. */ - base->IPCR0 = xfer->deviceAddress; - - /* Reset fifos. */ - base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK; - base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK; - - /* Configure data size. */ - if ((xfer->cmdType == kFLEXSPI_Read) || (xfer->cmdType == kFLEXSPI_Write)) - { - configValue = FLEXSPI_IPCR1_IDATSZ(xfer->dataSize); - } - - /* Configure sequence ID. */ - configValue |= - FLEXSPI_IPCR1_ISEQID((uint32_t)xfer->seqIndex) | FLEXSPI_IPCR1_ISEQNUM((uint32_t)xfer->SeqNumber - 1U); - base->IPCR1 = configValue; - - /* Start Transfer. */ - base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK; - - if (handle->state == (uint32_t)kFLEXSPI_BusyRead) - { - FLEXSPI_EnableInterrupts(base, (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag | - (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag | - (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag | - (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag | - (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag); - } - else - { - FLEXSPI_EnableInterrupts( - base, (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag | (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag | - (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag | (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag | - (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag); - } - } - - return result; -} - -/*! - * brief Gets the master transfer status during a interrupt non-blocking transfer. - * - * param base FLEXSPI peripheral base address. - * param handle pointer to flexspi_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the non-blocking transaction. - * retval kStatus_InvalidArgument count is Invalid. - * retval kStatus_Success Successfully return the count. - */ -status_t FLEXSPI_TransferGetCount(FLEXSPI_Type *base, flexspi_handle_t *handle, size_t *count) -{ - assert(NULL != handle); - - status_t result = kStatus_Success; - - if (handle->state == (uint32_t)kFLEXSPI_Idle) - { - result = kStatus_NoTransferInProgress; - } - else - { - *count = handle->transferTotalSize - handle->dataSize; - } - - return result; -} - -/*! - * brief Aborts an interrupt non-blocking transfer early. - * - * note This API can be called at any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base FLEXSPI peripheral base address. - * param handle pointer to flexspi_handle_t structure which stores the transfer state - */ -void FLEXSPI_TransferAbort(FLEXSPI_Type *base, flexspi_handle_t *handle) -{ - assert(NULL != handle); - - FLEXSPI_DisableInterrupts(base, (uint32_t)kIrqFlags); - handle->state = (uint32_t)kFLEXSPI_Idle; -} - -/*! - * brief Master interrupt handler. - * - * param base FLEXSPI peripheral base address. - * param handle pointer to flexspi_handle_t structure. - */ -void FLEXSPI_TransferHandleIRQ(FLEXSPI_Type *base, flexspi_handle_t *handle) -{ - uint32_t status; - status_t result; - uint32_t intEnableStatus; - uint32_t txWatermark; - uint32_t rxWatermark; - uint8_t i = 0; - - status = base->INTR; - intEnableStatus = base->INTEN; - - /* Check if interrupt is enabled and status is alerted. */ - if ((status & intEnableStatus) != 0U) - { - result = FLEXSPI_CheckAndClearError(base, status); - - if ((result != kStatus_Success) && (handle->completionCallback != NULL)) - { - FLEXSPI_TransferAbort(base, handle); - if (NULL != handle->completionCallback) - { - handle->completionCallback(base, handle, result, handle->userData); - } - } - else - { - if ((0U != (status & (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag)) && - (handle->state == (uint32_t)kFLEXSPI_BusyRead)) - { - rxWatermark = ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXWMRK_MASK) >> FLEXSPI_IPRXFCR_RXWMRK_SHIFT) + 1U; - - /* Read watermark level data from rx fifo . */ - if (handle->dataSize >= 8U * rxWatermark) - { - /* Read watermark level data from rx fifo . */ - for (i = 0U; i < 2U * rxWatermark; i++) - { - *handle->data++ = base->RFDR[i]; - } - - handle->dataSize = handle->dataSize - 8U * rxWatermark; - } - else - { - for (i = 0; i < (handle->dataSize + 3U) / 4U; i++) - { - *handle->data++ = base->RFDR[i]; - } - handle->dataSize = 0; - } - /* Pop out a watermark level data from IP RX FIFO. */ - base->INTR |= (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag; - } - - if (0U != (status & (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag)) - { - base->INTR |= (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag; - - FLEXSPI_TransferAbort(base, handle); - - if (NULL != handle->completionCallback) - { - handle->completionCallback(base, handle, kStatus_Success, handle->userData); - } - } - - /* TX FIFO empty interrupt, push watermark level data into tx FIFO. */ - if ((0U != (status & (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag)) && - (handle->state == (uint32_t)kFLEXSPI_BusyWrite)) - { - if (0U != handle->dataSize) - { - txWatermark = ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXWMRK_MASK) >> FLEXSPI_IPTXFCR_TXWMRK_SHIFT) + 1U; - /* Write watermark level data into tx fifo . */ - if (handle->dataSize >= 8U * txWatermark) - { - for (i = 0; i < 2U * txWatermark; i++) - { - base->TFDR[i] = *handle->data++; - } - - handle->dataSize = handle->dataSize - 8U * txWatermark; - } - else - { - for (i = 0; i < (handle->dataSize + 3U) / 4U; i++) - { - base->TFDR[i] = *handle->data++; - } - handle->dataSize = 0; - } - - /* Push a watermark level data into IP TX FIFO. */ - base->INTR |= (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag; - } - } - else - { - /* Empty else */ - } - } - } - else - { - /* Empty else */ - } -} - -#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ -#if defined(FLEXSPI) -void FLEXSPI_DriverIRQHandler(void); -void FLEXSPI_DriverIRQHandler(void) -{ - s_flexspiIsr(FLEXSPI, s_flexspiHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(FLEXSPI0) -void FLEXSPI0_DriverIRQHandler(void); -void FLEXSPI0_DriverIRQHandler(void) -{ - s_flexspiIsr(FLEXSPI0, s_flexspiHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#if defined(FLEXSPI1) -void FLEXSPI1_DriverIRQHandler(void); -void FLEXSPI1_DriverIRQHandler(void) -{ - s_flexspiIsr(FLEXSPI1, s_flexspiHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(LSIO__FLEXSPI0) -void LSIO_OCTASPI0_INT_DriverIRQHandler(void); -void LSIO_OCTASPI0_INT_DriverIRQHandler(void) -{ - s_flexspiIsr(LSIO__FLEXSPI0, s_flexspiHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#if defined(LSIO__FLEXSPI1) -void LSIO_OCTASPI1_INT_DriverIRQHandler(void); -void LSIO_OCTASPI1_INT_DriverIRQHandler(void) -{ - s_flexspiIsr(LSIO__FLEXSPI1, s_flexspiHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(FSL_FEATURE_FLEXSPI_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_FLEXSPI_HAS_SHARED_IRQ0_IRQ1 - -void FLEXSPI0_FLEXSPI1_DriverIRQHandler(void); -void FLEXSPI0_FLEXSPI1_DriverIRQHandler(void) -{ - /* If handle is registered, treat the transfer function is enabled. */ - if (NULL != s_flexspiHandle[0]) - { - s_flexspiIsr(FLEXSPI0, s_flexspiHandle[0]); - } - if (NULL != s_flexspiHandle[1]) - { - s_flexspiIsr(FLEXSPI1, s_flexspiHandle[1]); - } -} -#endif - -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_flexspi.h b/devices/MIMXRT1052/drivers/fsl_flexspi.h deleted file mode 100644 index e009fec..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexspi.h +++ /dev/null @@ -1,864 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef __FSL_FLEXSPI_H_ -#define __FSL_FLEXSPI_H_ - -#include -#include "fsl_device_registers.h" -#include "fsl_common.h" - -/*! - * @addtogroup flexspi - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FLEXSPI driver version 2.3.5. */ -#define FSL_FLEXSPI_DRIVER_VERSION (MAKE_VERSION(2, 3, 5)) -/*@}*/ - -#define FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNTn(0) - -/*! @brief Formula to form FLEXSPI instructions in LUT table. */ -#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ - (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \ - FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1)) - -/*! @brief Status structure of FLEXSPI.*/ -enum -{ - kStatus_FLEXSPI_Busy = MAKE_STATUS(kStatusGroup_FLEXSPI, 0), /*!< FLEXSPI is busy */ - kStatus_FLEXSPI_SequenceExecutionTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 1), /*!< Sequence execution timeout - error occurred during FLEXSPI transfer. */ - kStatus_FLEXSPI_IpCommandSequenceError = MAKE_STATUS(kStatusGroup_FLEXSPI, 2), /*!< IP command Sequence execution - timeout error occurred during FLEXSPI transfer. */ - kStatus_FLEXSPI_IpCommandGrantTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 3), /*!< IP command grant timeout error - occurred during FLEXSPI transfer. */ -}; - -/*! @brief CMD definition of FLEXSPI, use to form LUT instruction, _flexspi_command. */ -enum -{ - kFLEXSPI_Command_STOP = 0x00U, /*!< Stop execution, deassert CS. */ - kFLEXSPI_Command_SDR = 0x01U, /*!< Transmit Command code to Flash, using SDR mode. */ - kFLEXSPI_Command_RADDR_SDR = 0x02U, /*!< Transmit Row Address to Flash, using SDR mode. */ - kFLEXSPI_Command_CADDR_SDR = 0x03U, /*!< Transmit Column Address to Flash, using SDR mode. */ - kFLEXSPI_Command_MODE1_SDR = 0x04U, /*!< Transmit 1-bit Mode bits to Flash, using SDR mode. */ - kFLEXSPI_Command_MODE2_SDR = 0x05U, /*!< Transmit 2-bit Mode bits to Flash, using SDR mode. */ - kFLEXSPI_Command_MODE4_SDR = 0x06U, /*!< Transmit 4-bit Mode bits to Flash, using SDR mode. */ - kFLEXSPI_Command_MODE8_SDR = 0x07U, /*!< Transmit 8-bit Mode bits to Flash, using SDR mode. */ - kFLEXSPI_Command_WRITE_SDR = 0x08U, /*!< Transmit Programming Data to Flash, using SDR mode. */ - kFLEXSPI_Command_READ_SDR = 0x09U, /*!< Receive Read Data from Flash, using SDR mode. */ - kFLEXSPI_Command_LEARN_SDR = 0x0AU, /*!< Receive Read Data or Preamble bit from Flash, SDR mode. */ - kFLEXSPI_Command_DATSZ_SDR = 0x0BU, /*!< Transmit Read/Program Data size (byte) to Flash, SDR mode. */ - kFLEXSPI_Command_DUMMY_SDR = 0x0CU, /*!< Leave data lines undriven by FlexSPI controller.*/ - kFLEXSPI_Command_DUMMY_RWDS_SDR = 0x0DU, /*!< Leave data lines undriven by FlexSPI controller, - dummy cycles decided by RWDS. */ - kFLEXSPI_Command_DDR = 0x21U, /*!< Transmit Command code to Flash, using DDR mode. */ - kFLEXSPI_Command_RADDR_DDR = 0x22U, /*!< Transmit Row Address to Flash, using DDR mode. */ - kFLEXSPI_Command_CADDR_DDR = 0x23U, /*!< Transmit Column Address to Flash, using DDR mode. */ - kFLEXSPI_Command_MODE1_DDR = 0x24U, /*!< Transmit 1-bit Mode bits to Flash, using DDR mode. */ - kFLEXSPI_Command_MODE2_DDR = 0x25U, /*!< Transmit 2-bit Mode bits to Flash, using DDR mode. */ - kFLEXSPI_Command_MODE4_DDR = 0x26U, /*!< Transmit 4-bit Mode bits to Flash, using DDR mode. */ - kFLEXSPI_Command_MODE8_DDR = 0x27U, /*!< Transmit 8-bit Mode bits to Flash, using DDR mode. */ - kFLEXSPI_Command_WRITE_DDR = 0x28U, /*!< Transmit Programming Data to Flash, using DDR mode. */ - kFLEXSPI_Command_READ_DDR = 0x29U, /*!< Receive Read Data from Flash, using DDR mode. */ - kFLEXSPI_Command_LEARN_DDR = 0x2AU, /*!< Receive Read Data or Preamble bit from Flash, DDR mode. */ - kFLEXSPI_Command_DATSZ_DDR = 0x2BU, /*!< Transmit Read/Program Data size (byte) to Flash, DDR mode. */ - kFLEXSPI_Command_DUMMY_DDR = 0x2CU, /*!< Leave data lines undriven by FlexSPI controller.*/ - kFLEXSPI_Command_DUMMY_RWDS_DDR = 0x2DU, /*!< Leave data lines undriven by FlexSPI controller, - dummy cycles decided by RWDS. */ - kFLEXSPI_Command_JUMP_ON_CS = 0x1FU, /*!< Stop execution, deassert CS and save operand[7:0] as the - instruction start pointer for next sequence */ -}; - -/*! @brief pad definition of FLEXSPI, use to form LUT instruction. */ -typedef enum _flexspi_pad -{ - kFLEXSPI_1PAD = 0x00U, /*!< Transmit command/address and transmit/receive data only through DATA0/DATA1. */ - kFLEXSPI_2PAD = 0x01U, /*!< Transmit command/address and transmit/receive data only through DATA[1:0]. */ - kFLEXSPI_4PAD = 0x02U, /*!< Transmit command/address and transmit/receive data only through DATA[3:0]. */ - kFLEXSPI_8PAD = 0x03U, /*!< Transmit command/address and transmit/receive data only through DATA[7:0]. */ -} flexspi_pad_t; - -/*! @brief FLEXSPI interrupt status flags.*/ -typedef enum _flexspi_flags -{ - kFLEXSPI_SequenceExecutionTimeoutFlag = FLEXSPI_INTEN_SEQTIMEOUTEN_MASK, /*!< Sequence execution timeout. */ -#if defined(FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN) && FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN - kFLEXSPI_AhbBusErrorFlag = FLEXSPI_INTEN_AHBBUSERROREN_MASK, /*!< AHB Bus error flag. */ -#else - kFLEXSPI_AhbBusTimeoutFlag = FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK, /*!< AHB Bus timeout. */ -#endif - kFLEXSPI_SckStoppedBecauseTxEmptyFlag = - FLEXSPI_INTEN_SCKSTOPBYWREN_MASK, /*!< SCK is stopped during command - sequence because Async TX FIFO empty. */ - kFLEXSPI_SckStoppedBecauseRxFullFlag = - FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK, /*!< SCK is stopped during command - sequence because Async RX FIFO full. */ -#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) - kFLEXSPI_DataLearningFailedFlag = FLEXSPI_INTEN_DATALEARNFAILEN_MASK, /*!< Data learning failed. */ -#endif - kFLEXSPI_IpTxFifoWatermarkEmptyFlag = FLEXSPI_INTEN_IPTXWEEN_MASK, /*!< IP TX FIFO WaterMark empty. */ - kFLEXSPI_IpRxFifoWatermarkAvailableFlag = FLEXSPI_INTEN_IPRXWAEN_MASK, /*!< IP RX FIFO WaterMark available. */ - kFLEXSPI_AhbCommandSequenceErrorFlag = - FLEXSPI_INTEN_AHBCMDERREN_MASK, /*!< AHB triggered Command Sequences Error. */ - kFLEXSPI_IpCommandSequenceErrorFlag = FLEXSPI_INTEN_IPCMDERREN_MASK, /*!< IP triggered Command Sequences Error. */ - kFLEXSPI_AhbCommandGrantTimeoutFlag = - FLEXSPI_INTEN_AHBCMDGEEN_MASK, /*!< AHB triggered Command Sequences Grant Timeout. */ - kFLEXSPI_IpCommandGrantTimeoutFlag = - FLEXSPI_INTEN_IPCMDGEEN_MASK, /*!< IP triggered Command Sequences Grant Timeout. */ - kFLEXSPI_IpCommandExecutionDoneFlag = - FLEXSPI_INTEN_IPCMDDONEEN_MASK, /*!< IP triggered Command Sequences Execution finished. */ - kFLEXSPI_AllInterruptFlags = 0xFFFU, /*!< All flags. */ -} flexspi_flags_t; - -/*! @brief FLEXSPI sample clock source selection for Flash Reading.*/ -typedef enum _flexspi_read_sample_clock -{ - kFLEXSPI_ReadSampleClkLoopbackInternally = 0x0U, /*!< Dummy Read strobe generated by FlexSPI Controller - and loopback internally. */ - kFLEXSPI_ReadSampleClkLoopbackFromDqsPad = 0x1U, /*!< Dummy Read strobe generated by FlexSPI Controller - and loopback from DQS pad. */ - kFLEXSPI_ReadSampleClkLoopbackFromSckPad = 0x2U, /*!< SCK output clock and loopback from SCK pad. */ - kFLEXSPI_ReadSampleClkExternalInputFromDqsPad = 0x3U, /*!< Flash provided Read strobe and input from DQS pad. */ -} flexspi_read_sample_clock_t; - -/*! @brief FLEXSPI interval unit for flash device select.*/ -typedef enum _flexspi_cs_interval_cycle_unit -{ - kFLEXSPI_CsIntervalUnit1SckCycle = 0x0U, /*!< Chip selection interval: CSINTERVAL * 1 serial clock cycle. */ - kFLEXSPI_CsIntervalUnit256SckCycle = 0x1U, /*!< Chip selection interval: CSINTERVAL * 256 serial clock cycle. */ -} flexspi_cs_interval_cycle_unit_t; - -/*! @brief FLEXSPI AHB wait interval unit for writing.*/ -typedef enum _flexspi_ahb_write_wait_unit -{ - kFLEXSPI_AhbWriteWaitUnit2AhbCycle = 0x0U, /*!< AWRWAIT unit is 2 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit8AhbCycle = 0x1U, /*!< AWRWAIT unit is 8 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit32AhbCycle = 0x2U, /*!< AWRWAIT unit is 32 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit128AhbCycle = 0x3U, /*!< AWRWAIT unit is 128 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit512AhbCycle = 0x4U, /*!< AWRWAIT unit is 512 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit2048AhbCycle = 0x5U, /*!< AWRWAIT unit is 2048 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit8192AhbCycle = 0x6U, /*!< AWRWAIT unit is 8192 ahb clock cycle. */ - kFLEXSPI_AhbWriteWaitUnit32768AhbCycle = 0x7U, /*!< AWRWAIT unit is 32768 ahb clock cycle. */ -} flexspi_ahb_write_wait_unit_t; - -/*! @brief Error Code when IP command Error detected.*/ -typedef enum _flexspi_ip_error_code -{ - kFLEXSPI_IpCmdErrorNoError = 0x0U, /*!< No error. */ - kFLEXSPI_IpCmdErrorJumpOnCsInIpCmd = 0x2U, /*!< IP command with JMP_ON_CS instruction used. */ - kFLEXSPI_IpCmdErrorUnknownOpCode = 0x3U, /*!< Unknown instruction opcode in the sequence. */ - kFLEXSPI_IpCmdErrorSdrDummyInDdrSequence = 0x4U, /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR - used in DDR sequence. */ - kFLEXSPI_IpCmdErrorDdrDummyInSdrSequence = 0x5U, /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR - used in SDR sequence. */ - kFLEXSPI_IpCmdErrorInvalidAddress = 0x6U, /*!< Flash access start address exceed the whole - flash address range (A1/A2/B1/B2). */ - kFLEXSPI_IpCmdErrorSequenceExecutionTimeout = 0xEU, /*!< Sequence execution timeout. */ - kFLEXSPI_IpCmdErrorFlashBoundaryAcrosss = 0xFU, /*!< Flash boundary crossed. */ -} flexspi_ip_error_code_t; - -/*! @brief Error Code when AHB command Error detected.*/ -typedef enum _flexspi_ahb_error_code -{ - kFLEXSPI_AhbCmdErrorNoError = 0x0U, /*!< No error. */ - kFLEXSPI_AhbCmdErrorJumpOnCsInWriteCmd = 0x2U, /*!< AHB Write command with JMP_ON_CS instruction - used in the sequence. */ - kFLEXSPI_AhbCmdErrorUnknownOpCode = 0x3U, /*!< Unknown instruction opcode in the sequence. */ - kFLEXSPI_AhbCmdErrorSdrDummyInDdrSequence = 0x4U, /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR used - in DDR sequence. */ - kFLEXSPI_AhbCmdErrorDdrDummyInSdrSequence = 0x5U, /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR - used in SDR sequence. */ - kFLEXSPI_AhbCmdSequenceExecutionTimeout = 0x6U, /*!< Sequence execution timeout. */ -} flexspi_ahb_error_code_t; - -/*! @brief FLEXSPI operation port select.*/ -typedef enum _flexspi_port -{ - kFLEXSPI_PortA1 = 0x0U, /*!< Access flash on A1 port. */ - kFLEXSPI_PortA2, /*!< Access flash on A2 port. */ - kFLEXSPI_PortB1, /*!< Access flash on B1 port. */ - kFLEXSPI_PortB2, /*!< Access flash on B2 port. */ - kFLEXSPI_PortCount -} flexspi_port_t; - -/*! @brief Trigger source of current command sequence granted by arbitrator.*/ -typedef enum _flexspi_arb_command_source -{ - kFLEXSPI_AhbReadCommand = 0x0U, - kFLEXSPI_AhbWriteCommand = 0x1U, - kFLEXSPI_IpCommand = 0x2U, - kFLEXSPI_SuspendedCommand = 0x3U, -} flexspi_arb_command_source_t; - -/*! @brief Command type. */ -typedef enum _flexspi_command_type -{ - kFLEXSPI_Command, /*!< FlexSPI operation: Only command, both TX and Rx buffer are ignored. */ - kFLEXSPI_Config, /*!< FlexSPI operation: Configure device mode, the TX fifo size is fixed in LUT. */ - kFLEXSPI_Read, /* /!< FlexSPI operation: Read, only Rx Buffer is effective. */ - kFLEXSPI_Write, /* /!< FlexSPI operation: Read, only Tx Buffer is effective. */ -} flexspi_command_type_t; - -typedef struct _flexspi_ahbBuffer_config -{ - uint8_t priority; /*!< This priority for AHB Master Read which this AHB RX Buffer is assigned. */ - uint8_t masterIndex; /*!< AHB Master ID the AHB RX Buffer is assigned. */ - uint16_t bufferSize; /*!< AHB buffer size in byte. */ - bool enablePrefetch; /*!< AHB Read Prefetch Enable for current AHB RX Buffer corresponding Master, allows - prefetch disable/enable separately for each master. */ -} flexspi_ahbBuffer_config_t; - -/*! @brief FLEXSPI configuration structure. */ -typedef struct _flexspi_config -{ - flexspi_read_sample_clock_t rxSampleClock; /*!< Sample Clock source selection for Flash Reading. */ - bool enableSckFreeRunning; /*!< Enable/disable SCK output free-running. */ -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) - bool enableCombination; /*!< Enable/disable combining PORT A and B Data Pins - (SIOA[3:0] and SIOB[3:0]) to support Flash Octal mode. */ -#endif - bool enableDoze; /*!< Enable/disable doze mode support. */ - bool enableHalfSpeedAccess; /*!< Enable/disable divide by 2 of the clock for half - speed commands. */ - bool enableSckBDiffOpt; /*!< Enable/disable SCKB pad use as SCKA differential clock - output, when enable, Port B flash access is not available. */ - bool enableSameConfigForAll; /*!< Enable/disable same configuration for all connected devices - when enabled, same configuration in FLASHA1CRx is applied to all. */ - uint16_t seqTimeoutCycle; /*!< Timeout wait cycle for command sequence execution, - timeout after ahbGrantTimeoutCyle*1024 serial root clock cycles. */ - uint8_t ipGrantTimeoutCycle; /*!< Timeout wait cycle for IP command grant, timeout after - ipGrantTimeoutCycle*1024 AHB clock cycles. */ - uint8_t txWatermark; /*!< FLEXSPI IP transmit watermark value. */ - uint8_t rxWatermark; /*!< FLEXSPI receive watermark value. */ - struct - { -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) - bool enableAHBWriteIpTxFifo; /*!< Enable AHB bus write access to IP TX FIFO. */ -#endif -#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) - bool enableAHBWriteIpRxFifo; /*!< Enable AHB bus write access to IP RX FIFO. */ -#endif - uint8_t ahbGrantTimeoutCycle; /*!< Timeout wait cycle for AHB command grant, - timeout after ahbGrantTimeoutCyle*1024 AHB clock cycles. */ - uint16_t ahbBusTimeoutCycle; /*!< Timeout wait cycle for AHB read/write access, - timeout after ahbBusTimeoutCycle*1024 AHB clock cycles. */ - uint8_t resumeWaitCycle; /*!< Wait cycle for idle state before suspended command sequence - resume, timeout after ahbBusTimeoutCycle AHB clock cycles. */ - flexspi_ahbBuffer_config_t buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT]; /*!< AHB buffer size. */ - bool enableClearAHBBufferOpt; /*!< Enable/disable automatically clean AHB RX Buffer and TX Buffer - when FLEXSPI returns STOP mode ACK. */ - bool enableReadAddressOpt; /*!< Enable/disable remove AHB read burst start address alignment limitation. - when enable, there is no AHB read burst start address alignment limitation. */ - bool enableAHBPrefetch; /*!< Enable/disable AHB read prefetch feature, when enabled, FLEXSPI - will fetch more data than current AHB burst. */ - bool enableAHBBufferable; /*!< Enable/disable AHB bufferable write access support, when enabled, - FLEXSPI return before waiting for command execution finished. */ - bool enableAHBCachable; /*!< Enable AHB bus cachable read access support. */ - } ahbConfig; -} flexspi_config_t; - -/*! @brief External device configuration items. */ -typedef struct _flexspi_device_config -{ - uint32_t flexspiRootClk; /*!< FLEXSPI serial root clock. */ - bool isSck2Enabled; /*!< FLEXSPI use SCK2. */ - uint32_t flashSize; /*!< Flash size in KByte. */ - flexspi_cs_interval_cycle_unit_t CSIntervalUnit; /*!< CS interval unit, 1 or 256 cycle. */ - uint16_t CSInterval; /*!< CS line assert interval, multiply CS interval unit to - get the CS line assert interval cycles. */ - uint8_t CSHoldTime; /*!< CS line hold time. */ - uint8_t CSSetupTime; /*!< CS line setup time. */ - uint8_t dataValidTime; /*!< Data valid time for external device. */ - uint8_t columnspace; /*!< Column space size. */ - bool enableWordAddress; /*!< If enable word address.*/ - uint8_t AWRSeqIndex; /*!< Sequence ID for AHB write command. */ - uint8_t AWRSeqNumber; /*!< Sequence number for AHB write command. */ - uint8_t ARDSeqIndex; /*!< Sequence ID for AHB read command. */ - uint8_t ARDSeqNumber; /*!< Sequence number for AHB read command. */ - flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit; /*!< AHB write wait unit. */ - uint16_t AHBWriteWaitInterval; /*!< AHB write wait interval, multiply AHB write interval - unit to get the AHB write wait cycles. */ - bool enableWriteMask; /*!< Enable/Disable FLEXSPI drive DQS pin as write mask - when writing to external device. */ -} flexspi_device_config_t; - -/*! @brief Transfer structure for FLEXSPI. */ -typedef struct _flexspi_transfer -{ - uint32_t deviceAddress; /*!< Operation device address. */ - flexspi_port_t port; /*!< Operation port. */ - flexspi_command_type_t cmdType; /*!< Execution command type. */ - uint8_t seqIndex; /*!< Sequence ID for command. */ - uint8_t SeqNumber; /*!< Sequence number for command. */ - uint32_t *data; /*!< Data buffer. */ - size_t dataSize; /*!< Data size in bytes. */ -} flexspi_transfer_t; - -/* Forward declaration of the handle typedef. */ -typedef struct _flexspi_handle flexspi_handle_t; - -/*! @brief FLEXSPI transfer callback function. */ -typedef void (*flexspi_transfer_callback_t)(FLEXSPI_Type *base, - flexspi_handle_t *handle, - status_t status, - void *userData); - -/*! @brief Transfer handle structure for FLEXSPI. */ -struct _flexspi_handle -{ - uint32_t state; /*!< Internal state for FLEXSPI transfer */ - uint32_t *data; /*!< Data buffer. */ - size_t dataSize; /*!< Remaining Data size in bytes. */ - size_t transferTotalSize; /*!< Total Data size in bytes. */ - flexspi_transfer_callback_t completionCallback; /*!< Callback for users while transfer finish or error occurred */ - void *userData; /*!< FLEXSPI callback function parameter.*/ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus. */ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Get the instance number for FLEXSPI. - * - * @param base FLEXSPI base pointer. - */ -uint32_t FLEXSPI_GetInstance(FLEXSPI_Type *base); - -/*! - * @brief Check and clear IP command execution errors. - * - * @param base FLEXSPI base pointer. - * @param status interrupt status. - */ -status_t FLEXSPI_CheckAndClearError(FLEXSPI_Type *base, uint32_t status); - -/*! - * @brief Initializes the FLEXSPI module and internal state. - * - * This function enables the clock for FLEXSPI and also configures the FLEXSPI with the - * input configure parameters. Users should call this function before any FLEXSPI operations. - * - * @param base FLEXSPI peripheral base address. - * @param config FLEXSPI configure structure. - */ -void FLEXSPI_Init(FLEXSPI_Type *base, const flexspi_config_t *config); - -/*! - * @brief Gets default settings for FLEXSPI. - * - * @param config FLEXSPI configuration structure. - */ -void FLEXSPI_GetDefaultConfig(flexspi_config_t *config); - -/*! - * @brief Deinitializes the FLEXSPI module. - * - * Clears the FLEXSPI state and FLEXSPI module registers. - * @param base FLEXSPI peripheral base address. - */ -void FLEXSPI_Deinit(FLEXSPI_Type *base); - -/*! - * @brief Update FLEXSPI DLL value depending on currently flexspi root clock. - * - * @param base FLEXSPI peripheral base address. - * @param config Flash configuration parameters. - * @param port FLEXSPI Operation port. - */ -void FLEXSPI_UpdateDllValue(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port); - -/*! - * @brief Configures the connected device parameter. - * - * This function configures the connected device relevant parameters, such as the size, command, and so on. - * The flash configuration value cannot have a default value. The user needs to configure it according to the - * connected device. - * - * @param base FLEXSPI peripheral base address. - * @param config Flash configuration parameters. - * @param port FLEXSPI Operation port. - */ -void FLEXSPI_SetFlashConfig(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port); - -/*! - * @brief Software reset for the FLEXSPI logic. - * - * This function sets the software reset flags for both AHB and buffer domain and - * resets both AHB buffer and also IP FIFOs. - * - * @param base FLEXSPI peripheral base address. - */ -static inline void FLEXSPI_SoftwareReset(FLEXSPI_Type *base) -{ - base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK; - while (0U != (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK)) - { - } -} - -/*! - * @brief Enables or disables the FLEXSPI module. - * - * @param base FLEXSPI peripheral base address. - * @param enable True means enable FLEXSPI, false means disable. - */ -static inline void FLEXSPI_Enable(FLEXSPI_Type *base, bool enable) -{ - if (enable) - { - base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK; - } - else - { - base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK; - } -} - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ -/*! - * @brief Enables the FLEXSPI interrupts. - * - * @param base FLEXSPI peripheral base address. - * @param mask FLEXSPI interrupt source. - */ -static inline void FLEXSPI_EnableInterrupts(FLEXSPI_Type *base, uint32_t mask) -{ - base->INTEN |= mask; -} - -/*! - * @brief Disable the FLEXSPI interrupts. - * - * @param base FLEXSPI peripheral base address. - * @param mask FLEXSPI interrupt source. - */ -static inline void FLEXSPI_DisableInterrupts(FLEXSPI_Type *base, uint32_t mask) -{ - base->INTEN &= ~mask; -} - -/* @} */ - -/*! @name DMA control */ -/*@{*/ - -/*! - * @brief Enables or disables FLEXSPI IP Tx FIFO DMA requests. - * - * @param base FLEXSPI peripheral base address. - * @param enable Enable flag for transmit DMA request. Pass true for enable, false for disable. - */ -static inline void FLEXSPI_EnableTxDMA(FLEXSPI_Type *base, bool enable) -{ - if (enable) - { - base->IPTXFCR |= FLEXSPI_IPTXFCR_TXDMAEN_MASK; - } - else - { - base->IPTXFCR &= ~FLEXSPI_IPTXFCR_TXDMAEN_MASK; - } -} - -/*! - * @brief Enables or disables FLEXSPI IP Rx FIFO DMA requests. - * - * @param base FLEXSPI peripheral base address. - * @param enable Enable flag for receive DMA request. Pass true for enable, false for disable. - */ -static inline void FLEXSPI_EnableRxDMA(FLEXSPI_Type *base, bool enable) -{ - if (enable) - { - base->IPRXFCR |= FLEXSPI_IPRXFCR_RXDMAEN_MASK; - } - else - { - base->IPRXFCR &= ~FLEXSPI_IPRXFCR_RXDMAEN_MASK; - } -} - -/*! - * @brief Gets FLEXSPI IP tx fifo address for DMA transfer. - * - * @param base FLEXSPI peripheral base address. - * @retval The tx fifo address. - */ -static inline uint32_t FLEXSPI_GetTxFifoAddress(FLEXSPI_Type *base) -{ - return (uint32_t)&base->TFDR[0]; -} - -/*! - * @brief Gets FLEXSPI IP rx fifo address for DMA transfer. - * - * @param base FLEXSPI peripheral base address. - * @retval The rx fifo address. - */ -static inline uint32_t FLEXSPI_GetRxFifoAddress(FLEXSPI_Type *base) -{ - return (uint32_t)&base->RFDR[0]; -} - -/*@}*/ - -/*! @name FIFO control */ -/*@{*/ - -/*! @brief Clears the FLEXSPI IP FIFO logic. - * - * @param base FLEXSPI peripheral base address. - * @param txFifo Pass true to reset TX FIFO. - * @param rxFifo Pass true to reset RX FIFO. - */ -static inline void FLEXSPI_ResetFifos(FLEXSPI_Type *base, bool txFifo, bool rxFifo) -{ - if (txFifo) - { - base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK; - } - if (rxFifo) - { - base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK; - } -} - -/*! - * @brief Gets the valid data entries in the FLEXSPI FIFOs. - * - * @param base FLEXSPI peripheral base address. - * @param[out] txCount Pointer through which the current number of bytes in the transmit FIFO is returned. - * Pass NULL if this value is not required. - * @param[out] rxCount Pointer through which the current number of bytes in the receive FIFO is returned. - * Pass NULL if this value is not required. - */ -static inline void FLEXSPI_GetFifoCounts(FLEXSPI_Type *base, size_t *txCount, size_t *rxCount) -{ - if (NULL != txCount) - { - *txCount = (((base->IPTXFSTS) & FLEXSPI_IPTXFSTS_FILL_MASK) >> FLEXSPI_IPTXFSTS_FILL_SHIFT) * 8U; - } - if (NULL != rxCount) - { - *rxCount = (((base->IPRXFSTS) & FLEXSPI_IPRXFSTS_FILL_MASK) >> FLEXSPI_IPRXFSTS_FILL_SHIFT) * 8U; - } -} - -/*@}*/ - -/*! - * @name Status - * @{ - */ -/*! - * @brief Get the FLEXSPI interrupt status flags. - * - * @param base FLEXSPI peripheral base address. - * @retval interrupt status flag, use status flag to AND #flexspi_flags_t could get the related status. - */ -static inline uint32_t FLEXSPI_GetInterruptStatusFlags(FLEXSPI_Type *base) -{ - return base->INTR; -} - -/*! - * @brief Get the FLEXSPI interrupt status flags. - * - * @param base FLEXSPI peripheral base address. - * @param mask FLEXSPI interrupt source. - */ -static inline void FLEXSPI_ClearInterruptStatusFlags(FLEXSPI_Type *base, uint32_t mask) -{ - base->INTR |= mask; -} - -#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) -/*! @brief Gets the sampling clock phase selection after Data Learning. - * - * @param base FLEXSPI peripheral base address. - * @param portAPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTA. - * @param portBPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTB. - */ -static inline void FLEXSPI_GetDataLearningPhase(FLEXSPI_Type *base, uint8_t *portAPhase, uint8_t *portBPhase) -{ - if (portAPhase != NULL) - { - *portAPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEA_MASK) >> FLEXSPI_STS0_DATALEARNPHASEA_SHIFT); - } - - if (portBPhase != NULL) - { - *portBPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEB_MASK) >> FLEXSPI_STS0_DATALEARNPHASEB_SHIFT); - } -} -#endif - -/*! @brief Gets the trigger source of current command sequence granted by arbitrator. - * - * @param base FLEXSPI peripheral base address. - * @retval trigger source of current command sequence. - */ -static inline flexspi_arb_command_source_t FLEXSPI_GetArbitratorCommandSource(FLEXSPI_Type *base) -{ - return (flexspi_arb_command_source_t)( - (uint32_t)((base->STS0 & FLEXSPI_STS0_ARBCMDSRC_MASK) >> FLEXSPI_STS0_ARBCMDSRC_SHIFT)); -} - -/*! @brief Gets the error code when IP command error detected. - * - * @param base FLEXSPI peripheral base address. - * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected. - * @retval error code when IP command error detected. - */ -static inline flexspi_ip_error_code_t FLEXSPI_GetIPCommandErrorCode(FLEXSPI_Type *base, uint8_t *index) -{ - *index = (uint8_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRID_MASK) >> FLEXSPI_STS1_IPCMDERRID_SHIFT); - return (flexspi_ip_error_code_t)( - (uint32_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRCODE_MASK) >> FLEXSPI_STS1_IPCMDERRCODE_SHIFT)); -} - -/*! @brief Gets the error code when AHB command error detected. - * - * @param base FLEXSPI peripheral base address. - * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected. - * @retval error code when AHB command error detected. - */ -static inline flexspi_ahb_error_code_t FLEXSPI_GetAHBCommandErrorCode(FLEXSPI_Type *base, uint8_t *index) -{ - *index = (uint8_t)(base->STS1 & FLEXSPI_STS1_AHBCMDERRID_MASK) >> FLEXSPI_STS1_AHBCMDERRID_SHIFT; - return (flexspi_ahb_error_code_t)( - (uint32_t)((base->STS1 & FLEXSPI_STS1_AHBCMDERRCODE_MASK) >> FLEXSPI_STS1_AHBCMDERRCODE_SHIFT)); -} - -/*! @brief Returns whether the bus is idle. - * - * @param base FLEXSPI peripheral base address. - * @retval true Bus is idle. - * @retval false Bus is busy. - */ -static inline bool FLEXSPI_GetBusIdleStatus(FLEXSPI_Type *base) -{ - return (0U != (base->STS0 & FLEXSPI_STS0_ARBIDLE_MASK)) && (0U != (base->STS0 & FLEXSPI_STS0_SEQIDLE_MASK)); -} -/*@}*/ - -/*! - * @name Bus Operations - * @{ - */ - -/*! @brief Update read sample clock source - * - * @param base FLEXSPI peripheral base address. - * @param clockSource clockSource of type #flexspi_read_sample_clock_t - */ -void FLEXSPI_UpdateRxSampleClock(FLEXSPI_Type *base, flexspi_read_sample_clock_t clockSource); - -/*! @brief Enables/disables the FLEXSPI IP command parallel mode. - * - * @param base FLEXSPI peripheral base address. - * @param enable True means enable parallel mode, false means disable parallel mode. - */ -static inline void FLEXSPI_EnableIPParallelMode(FLEXSPI_Type *base, bool enable) -{ - if (enable) - { - base->IPCR1 |= FLEXSPI_IPCR1_IPAREN_MASK; - } - else - { - base->IPCR1 &= ~FLEXSPI_IPCR1_IPAREN_MASK; - } -} - -/*! @brief Enables/disables the FLEXSPI AHB command parallel mode. - * - * @param base FLEXSPI peripheral base address. - * @param enable True means enable parallel mode, false means disable parallel mode. - */ -static inline void FLEXSPI_EnableAHBParallelMode(FLEXSPI_Type *base, bool enable) -{ - if (enable) - { - base->AHBCR |= FLEXSPI_AHBCR_APAREN_MASK; - } - else - { - base->AHBCR &= ~FLEXSPI_AHBCR_APAREN_MASK; - } -} - -/*! @brief Updates the LUT table. - * - * @param base FLEXSPI peripheral base address. - * @param index From which index start to update. It could be any index of the LUT table, which - * also allows user to update command content inside a command. Each command consists of up to - * 8 instructions and occupy 4*32-bit memory. - * @param cmd Command sequence array. - * @param count Number of sequences. - */ -void FLEXSPI_UpdateLUT(FLEXSPI_Type *base, uint32_t index, const uint32_t *cmd, uint32_t count); - -/*! - * @brief Writes data into FIFO. - * - * @param base FLEXSPI peripheral base address - * @param data The data bytes to send - * @param fifoIndex Destination fifo index. - */ -static inline void FLEXSPI_WriteData(FLEXSPI_Type *base, uint32_t data, uint8_t fifoIndex) -{ - base->TFDR[fifoIndex] = data; -} - -/*! - * @brief Receives data from data FIFO. - * - * @param base FLEXSPI peripheral base address - * @param fifoIndex Source fifo index. - * @return The data in the FIFO. - */ -static inline uint32_t FLEXSPI_ReadData(FLEXSPI_Type *base, uint8_t fifoIndex) -{ - return base->RFDR[fifoIndex]; -} - -/*! - * @brief Sends a buffer of data bytes using blocking method. - * @note This function blocks via polling until all bytes have been sent. - * @param base FLEXSPI peripheral base address - * @param buffer The data bytes to send - * @param size The number of data bytes to send - * @retval kStatus_Success write success without error - * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected - * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_WriteBlocking(FLEXSPI_Type *base, uint32_t *buffer, size_t size); - -/*! - * @brief Receives a buffer of data bytes using a blocking method. - * @note This function blocks via polling until all bytes have been sent. - * @param base FLEXSPI peripheral base address - * @param buffer The data bytes to send - * @param size The number of data bytes to receive - * @retval kStatus_Success read success without error - * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequencen error detected - * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_ReadBlocking(FLEXSPI_Type *base, uint32_t *buffer, size_t size); - -/*! - * @brief Execute command to transfer a buffer data bytes using a blocking method. - * @param base FLEXSPI peripheral base address - * @param xfer pointer to the transfer structure. - * @retval kStatus_Success command transfer success without error - * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout - * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected - * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected - */ -status_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer); -/*! @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the FLEXSPI handle which is used in transactional functions. - * - * @param base FLEXSPI peripheral base address. - * @param handle pointer to flexspi_handle_t structure to store the transfer state. - * @param callback pointer to user callback function. - * @param userData user parameter passed to the callback function. - */ -void FLEXSPI_TransferCreateHandle(FLEXSPI_Type *base, - flexspi_handle_t *handle, - flexspi_transfer_callback_t callback, - void *userData); - -/*! - * @brief Performs a interrupt non-blocking transfer on the FLEXSPI bus. - * - * @note Calling the API returns immediately after transfer initiates. The user needs - * to call FLEXSPI_GetTransferCount to poll the transfer status to check whether - * the transfer is finished. If the return status is not kStatus_FLEXSPI_Busy, the transfer - * is finished. For FLEXSPI_Read, the dataSize should be multiple of rx watermark level, or - * FLEXSPI could not read data properly. - * - * @param base FLEXSPI peripheral base address. - * @param handle pointer to flexspi_handle_t structure which stores the transfer state. - * @param xfer pointer to flexspi_transfer_t structure. - * @retval kStatus_Success Successfully start the data transmission. - * @retval kStatus_FLEXSPI_Busy Previous transmission still not finished. - */ -status_t FLEXSPI_TransferNonBlocking(FLEXSPI_Type *base, flexspi_handle_t *handle, flexspi_transfer_t *xfer); - -/*! - * @brief Gets the master transfer status during a interrupt non-blocking transfer. - * - * @param base FLEXSPI peripheral base address. - * @param handle pointer to flexspi_handle_t structure which stores the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_InvalidArgument count is Invalid. - * @retval kStatus_Success Successfully return the count. - */ -status_t FLEXSPI_TransferGetCount(FLEXSPI_Type *base, flexspi_handle_t *handle, size_t *count); - -/*! - * @brief Aborts an interrupt non-blocking transfer early. - * - * @note This API can be called at any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base FLEXSPI peripheral base address. - * @param handle pointer to flexspi_handle_t structure which stores the transfer state - */ -void FLEXSPI_TransferAbort(FLEXSPI_Type *base, flexspi_handle_t *handle); - -/*! - * @brief Master interrupt handler. - * - * @param base FLEXSPI peripheral base address. - * @param handle pointer to flexspi_handle_t structure. - */ -void FLEXSPI_TransferHandleIRQ(FLEXSPI_Type *base, flexspi_handle_t *handle); -/*! @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus. */ -/*@}*/ - -#endif /* __FSL_FLEXSPI_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_flexspi_edma.c b/devices/MIMXRT1052/drivers/fsl_flexspi_edma.c deleted file mode 100644 index 6947e21..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexspi_edma.c +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexspi_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.flexspi_edma" -#endif - -/*> 1 != 0U) - { - power++; - value = value >> 1; - } - - return power; -} -static void FLEXSPI_TransferEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) -{ - flexspi_edma_private_handle_t *flexspiPrivateHandle = (flexspi_edma_private_handle_t *)param; - - /* Avoid warning for unused parameters. */ - handle = handle; - tcds = tcds; - - if (transferDone) - { - /* Wait for bus idle. */ - while (!FLEXSPI_GetBusIdleStatus(flexspiPrivateHandle->base)) - { - } - /* Disable transfer. */ - FLEXSPI_TransferAbortEDMA(flexspiPrivateHandle->base, flexspiPrivateHandle->handle); - - if (flexspiPrivateHandle->handle->completionCallback != NULL) - { - flexspiPrivateHandle->handle->completionCallback(flexspiPrivateHandle->base, flexspiPrivateHandle->handle, - kStatus_Success, flexspiPrivateHandle->handle->userData); - } - } -} - -/*! - * brief Initializes the FLEXSPI handle for transfer which is used in transactional functions and set the callback. - * - * param base FLEXSPI peripheral base address - * param handle Pointer to flexspi_edma_handle_t structure - * param callback FLEXSPI callback, NULL means no callback. - * param userData User callback function data. - * param txDmaHandle User requested DMA handle for TX DMA transfer. - * param rxDmaHandle User requested DMA handle for RX DMA transfer. - */ -void FLEXSPI_TransferCreateHandleEDMA(FLEXSPI_Type *base, - flexspi_edma_handle_t *handle, - flexspi_edma_callback_t callback, - void *userData, - edma_handle_t *txDmaHandle, - edma_handle_t *rxDmaHandle) -{ - assert(handle); - - uint32_t instance = FLEXSPI_GetInstance(base); - - s_edmaPrivateHandle[instance].base = base; - s_edmaPrivateHandle[instance].handle = handle; - - (void)memset(handle, 0, sizeof(*handle)); - - handle->state = kFLEXSPI_Idle; - handle->txDmaHandle = txDmaHandle; - handle->rxDmaHandle = rxDmaHandle; - handle->nsize = kFLEXPSI_EDMAnSize1Bytes; - - handle->completionCallback = callback; - handle->userData = userData; -} - -/*! - * brief Update FLEXSPI EDMA transfer source data transfer size(SSIZE) and destination data transfer size(DSIZE). - * - * param base FLEXSPI peripheral base address - * param handle Pointer to flexspi_edma_handle_t structure - * param nsize FLEXSPI DMA transfer data transfer size(SSIZE/DSIZE), by default the size is - * kFLEXPSI_EDMAnSize1Bytes(one byte). - * see flexspi_edma_transfer_nsize_t . - */ -void FLEXSPI_TransferUpdateSizeEDMA(FLEXSPI_Type *base, - flexspi_edma_handle_t *handle, - flexspi_edma_transfer_nsize_t nsize) -{ - handle->nsize = nsize; -} - -/*! - * brief Transfers FLEXSPI data using an eDMA non-blocking method. - * - * This function writes/receives data to/from the FLEXSPI transmit/receive FIFO. This function is non-blocking. - * param base FLEXSPI peripheral base address. - * param handle Pointer to flexspi_edma_handle_t structure - * param xfer FLEXSPI transfer structure. - * retval kStatus_FLEXSPI_Busy FLEXSPI is busy transfer. - * retval kStatus_InvalidArgument The watermark configuration is invalid, the watermark should be power of - 2 to do successfully EDMA transfer. - * retval kStatus_Success FLEXSPI successfully start edma transfer. - */ -status_t FLEXSPI_TransferEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, flexspi_transfer_t *xfer) -{ - uint32_t configValue = 0; - status_t result = kStatus_Success; - edma_transfer_config_t xferConfig; - uint32_t instance = FLEXSPI_GetInstance(base); - uint8_t power = 0; - - assert(handle); - assert(xfer); - - /* Check if the FLEXSPI bus is idle - if not return busy status. */ - if (handle->state != (uint32_t)kFLEXSPI_Idle) - { - result = kStatus_FLEXSPI_Busy; - } - else - { - handle->transferSize = xfer->dataSize; - handle->state = kFLEXSPI_Busy; - - /* Clear sequence pointer before sending data to external devices. */ - base->FLSHCR2[xfer->port] |= FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK; - - /* Clear former pending status before start this transfer. */ - base->INTR |= FLEXSPI_INTR_AHBCMDERR_MASK | FLEXSPI_INTR_IPCMDERR_MASK | FLEXSPI_INTR_AHBCMDGE_MASK | - FLEXSPI_INTR_IPCMDGE_MASK; - - /* Configure base address. */ - base->IPCR0 = xfer->deviceAddress; - - /* Reset fifos. */ - base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK; - base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK; - - /* Configure data size. */ - if ((xfer->cmdType == kFLEXSPI_Read) || (xfer->cmdType == kFLEXSPI_Write)) - { - configValue = FLEXSPI_IPCR1_IDATSZ(xfer->dataSize); - } - - /* Configure sequence ID. */ - configValue |= FLEXSPI_IPCR1_ISEQID(xfer->seqIndex) | FLEXSPI_IPCR1_ISEQNUM((uint32_t)xfer->SeqNumber - 1U); - base->IPCR1 = configValue; - } - - if ((xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config)) - { - handle->count = (uint8_t)((base->IPTXFCR & FLEXSPI_IPTXFCR_TXWMRK_MASK) >> FLEXSPI_IPTXFCR_TXWMRK_SHIFT) + 1U; - - if (xfer->dataSize < 8U * (uint32_t)handle->count) - { - handle->nbytes = (uint8_t)xfer->dataSize; - } - else - { - /* Check the handle->count is power of 2 */ - if (((handle->count) & (handle->count - 1U)) != 0U) - { - return kStatus_InvalidArgument; - } - /* Store the initially configured eDMA minor byte transfer count into the FLEXSPI handle */ - handle->nbytes = (8U * handle->count); - } - - power = FLEXSPI_CalculatePower(8U * handle->count); - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, xfer->data, (uint32_t)handle->nsize, - (void *)(uint32_t *)FLEXSPI_GetTxFifoAddress(base), (uint32_t)handle->nsize, - (uint32_t)handle->nbytes, xfer->dataSize, kEDMA_MemoryToMemory); - - /* Submit transfer. */ - (void)EDMA_SubmitTransfer(handle->txDmaHandle, &xferConfig); - handle->txDmaHandle->base->TCD[handle->txDmaHandle->channel].ATTR |= DMA_ATTR_DMOD(power); - EDMA_SetCallback(handle->txDmaHandle, FLEXSPI_TransferEDMACallback, - &s_edmaPrivateHandle[FLEXSPI_GetInstance(base)]); - EDMA_StartTransfer(handle->txDmaHandle); - - /* Enable FLEXSPI TX EDMA. */ - FLEXSPI_EnableTxDMA(base, true); - - /* Start Transfer. */ - base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK; - } - else if (xfer->cmdType == kFLEXSPI_Read) - { - handle->count = (uint8_t)((base->IPRXFCR & FLEXSPI_IPRXFCR_RXWMRK_MASK) >> FLEXSPI_IPRXFCR_RXWMRK_SHIFT) + 1U; - - if (xfer->dataSize < 8U * (uint32_t)handle->count) - { - handle->nbytes = (uint8_t)xfer->dataSize; - } - else - { - /* Check the handle->count is power of 2 */ - if (((handle->count) & (handle->count - 1U)) != 0U) - { - return kStatus_InvalidArgument; - } - /* Store the initially configured eDMA minor byte transfer count into the FLEXSPI handle */ - handle->nbytes = (8U * handle->count); - } - - power = FLEXSPI_CalculatePower(8U * handle->count); - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, (void *)(uint32_t *)FLEXSPI_GetRxFifoAddress(base), (uint32_t)handle->nsize, - xfer->data, (uint32_t)handle->nsize, (uint32_t)handle->nbytes, xfer->dataSize, - kEDMA_MemoryToMemory); - - /* Submit transfer. */ - (void)EDMA_SubmitTransfer(handle->rxDmaHandle, &xferConfig); - handle->rxDmaHandle->base->TCD[handle->rxDmaHandle->channel].ATTR |= DMA_ATTR_SMOD(power); - EDMA_SetCallback(handle->rxDmaHandle, FLEXSPI_TransferEDMACallback, &s_edmaPrivateHandle[instance]); - EDMA_StartTransfer(handle->rxDmaHandle); - - /* Enable FLEXSPI RX EDMA. */ - FLEXSPI_EnableRxDMA(base, true); - - /* Start Transfer. */ - base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK; - } - else - { - /* Start Transfer. */ - base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK; - /* Wait for bus idle. */ - while (!FLEXSPI_GetBusIdleStatus(base)) - { - } - result = FLEXSPI_CheckAndClearError(base, base->INTR); - - handle->state = kFLEXSPI_Idle; - - if (handle->completionCallback != NULL) - { - handle->completionCallback(base, handle, result, handle->userData); - } - } - - return result; -} - -/*! - * brief Aborts the transfer data using eDMA. - * - * This function aborts the transfer data using eDMA. - * - * param base FLEXSPI peripheral base address. - * param handle Pointer to flexspi_edma_handle_t structure - */ -void FLEXSPI_TransferAbortEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle) -{ - assert(handle); - - if ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXDMAEN_MASK) != 0x00U) - { - FLEXSPI_EnableTxDMA(base, false); - EDMA_AbortTransfer(handle->txDmaHandle); - } - - if ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXDMAEN_MASK) != 0x00U) - { - FLEXSPI_EnableRxDMA(base, false); - EDMA_AbortTransfer(handle->rxDmaHandle); - } - - handle->state = kFLEXSPI_Idle; -} - -status_t FLEXSPI_TransferGetTransferCountEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, size_t *count) -{ - assert(handle); - assert(count); - - status_t result = kStatus_Success; - - if (handle->state != (uint32_t)kFLEXSPI_Busy) - { - result = kStatus_NoTransferInProgress; - } - else - { - if ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXDMAEN_MASK) != 0x00U) - { - *count = (handle->transferSize - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->rxDmaHandle->base, handle->rxDmaHandle->channel)); - } - else if ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXDMAEN_MASK) != 0x00U) - { - *count = (handle->transferSize - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->txDmaHandle->base, handle->txDmaHandle->channel)); - } - else - { - ; /* Intentional empty for MISRA C-2012 rule 15.7. */ - } - } - - return result; -} diff --git a/devices/MIMXRT1052/drivers/fsl_flexspi_edma.h b/devices/MIMXRT1052/drivers/fsl_flexspi_edma.h deleted file mode 100644 index 6a57d27..0000000 --- a/devices/MIMXRT1052/drivers/fsl_flexspi_edma.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_FLEXSPI_EDMA_H_ -#define _FSL_FLEXSPI_EDMA_H_ - -#include "fsl_flexspi.h" -#include "fsl_dmamux.h" -#include "fsl_edma.h" - -/*! - * @addtogroup flexspi_edma - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief FLEXSPI EDMA driver version 2.3.2. */ -#define FSL_FLEXSPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 3, 2)) -/*@}*/ - -typedef struct _flexspi_edma_handle flexspi_edma_handle_t; - -/*! @brief FLEXSPI eDMA transfer callback function for finish and error */ -typedef void (*flexspi_edma_callback_t)(FLEXSPI_Type *base, - flexspi_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief eDMA transfer configuration */ -typedef enum _flexspi_edma_ntransfer_size -{ - kFLEXPSI_EDMAnSize1Bytes = 0x1U, /*!< Source/Destination data transfer size is 1 byte every time */ - kFLEXPSI_EDMAnSize2Bytes = 0x2U, /*!< Source/Destination data transfer size is 2 bytes every time */ - kFLEXPSI_EDMAnSize4Bytes = 0x4U, /*!< Source/Destination data transfer size is 4 bytes every time */ - kFLEXPSI_EDMAnSize8Bytes = 0x8U, /*!< Source/Destination data transfer size is 8 bytes every time */ - kFLEXPSI_EDMAnSize32Bytes = 0x20U, /*!< Source/Destination data transfer size is 32 bytes every time */ -} flexspi_edma_transfer_nsize_t; - -/*! @brief FLEXSPI DMA transfer handle, users should not touch the content of the handle.*/ -struct _flexspi_edma_handle -{ - edma_handle_t *txDmaHandle; /*!< eDMA handler for FLEXSPI Tx. */ - edma_handle_t *rxDmaHandle; /*!< eDMA handler for FLEXSPI Rx. */ - size_t transferSize; /*!< Bytes need to transfer. */ - flexspi_edma_transfer_nsize_t nsize; /*!< eDMA SSIZE/DSIZE in each transfer. */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - uint8_t count; /*!< The transfer data count in a DMA request. */ - uint32_t state; /*!< Internal state for FLEXSPI eDMA transfer. */ - flexspi_edma_callback_t completionCallback; /*!< A callback function called after the eDMA transfer is finished. */ - void *userData; /*!< User callback parameter */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name FLEXSPI eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the FLEXSPI handle for transfer which is used in transactional functions and set the callback. - * - * @param base FLEXSPI peripheral base address - * @param handle Pointer to flexspi_edma_handle_t structure - * @param callback FLEXSPI callback, NULL means no callback. - * @param userData User callback function data. - * @param txDmaHandle User requested DMA handle for TX DMA transfer. - * @param rxDmaHandle User requested DMA handle for RX DMA transfer. - */ -void FLEXSPI_TransferCreateHandleEDMA(FLEXSPI_Type *base, - flexspi_edma_handle_t *handle, - flexspi_edma_callback_t callback, - void *userData, - edma_handle_t *txDmaHandle, - edma_handle_t *rxDmaHandle); - -/*! - * @brief Update FLEXSPI EDMA transfer source data transfer size(SSIZE) and destination data transfer size(DSIZE). - * - * @param base FLEXSPI peripheral base address - * @param handle Pointer to flexspi_edma_handle_t structure - * @param nsize FLEXSPI DMA transfer data transfer size(SSIZE/DSIZE), by default the size is - * kFLEXPSI_EDMAnSize1Bytes(one byte). - * @see flexspi_edma_transfer_nsize_t . - */ -void FLEXSPI_TransferUpdateSizeEDMA(FLEXSPI_Type *base, - flexspi_edma_handle_t *handle, - flexspi_edma_transfer_nsize_t nsize); - -/*! - * @brief Transfers FLEXSPI data using an eDMA non-blocking method. - * - * This function writes/receives data to/from the FLEXSPI transmit/receive FIFO. This function is non-blocking. - * @param base FLEXSPI peripheral base address. - * @param handle Pointer to flexspi_edma_handle_t structure - * @param xfer FLEXSPI transfer structure. - * @retval kStatus_FLEXSPI_Busy FLEXSPI is busy transfer. - * @retval kStatus_InvalidArgument The watermark configuration is invalid, the watermark should be power of - 2 to do successfully EDMA transfer. - * @retval kStatus_Success FLEXSPI successfully start edma transfer. - */ -status_t FLEXSPI_TransferEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, flexspi_transfer_t *xfer); - -/*! - * @brief Aborts the transfer data using eDMA. - * - * This function aborts the transfer data using eDMA. - * - * @param base FLEXSPI peripheral base address. - * @param handle Pointer to flexspi_edma_handle_t structure - */ -void FLEXSPI_TransferAbortEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle); - -/*! - * @brief Gets the transferred counts of transfer. - * - * @param base FLEXSPI peripheral base address. - * @param handle Pointer to flexspi_edma_handle_t structure. - * @param count Bytes transfer. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t FLEXSPI_TransferGetTransferCountEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, size_t *count); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/* @} */ - -#endif /* _FSL_FLEXSPI_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_gpc.c b/devices/MIMXRT1052/drivers/fsl_gpc.c deleted file mode 100644 index e5cef48..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpc.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_gpc.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.gpc_1" -#endif - -/*! - * brief Enable the IRQ. - * - * param base GPC peripheral base address. - * param irqId ID number of IRQ to be enabled, available range is 32-159. 0-31 is available in some platforms. - */ -void GPC_EnableIRQ(GPC_Type *base, uint32_t irqId) -{ - uint32_t irqRegNum = irqId / 32U; - uint32_t irqRegShiftNum = irqId % 32U; - - assert(irqRegNum <= GPC_IMR_COUNT); - -#if ((defined FSL_FEATURE_GPC_HAS_IRQ_0_31) && FSL_FEATURE_GPC_HAS_IRQ_0_31) - if (irqRegNum == GPC_IMR_COUNT) - { - base->IMR5 &= ~(1UL << irqRegShiftNum); - } - else - { - base->IMR[irqRegNum] &= ~(1UL << irqRegShiftNum); - } -#else - assert(irqRegNum > 0U); - base->IMR[irqRegNum - 1UL] &= ~(1UL << irqRegShiftNum); -#endif /* FSL_FEATURE_GPC_HAS_IRQ_0_31 */ -} - -/*! - * brief Disable the IRQ. - * - * param base GPC peripheral base address. - * param irqId ID number of IRQ to be disabled, available range is 32-159. 0-31 is available in some platforms. - */ -void GPC_DisableIRQ(GPC_Type *base, uint32_t irqId) -{ - uint32_t irqRegNum = irqId / 32U; - uint32_t irqRegShiftNum = irqId % 32U; - - assert(irqRegNum <= GPC_IMR_COUNT); - -#if ((defined FSL_FEATURE_GPC_HAS_IRQ_0_31) && FSL_FEATURE_GPC_HAS_IRQ_0_31) - if (irqRegNum == GPC_IMR_COUNT) - { - base->IMR5 |= (1UL << irqRegShiftNum); - } - else - { - base->IMR[irqRegNum] |= (1UL << irqRegShiftNum); - } -#else - assert(irqRegNum > 0U); - base->IMR[irqRegNum - 1UL] |= (1UL << irqRegShiftNum); -#endif /* FSL_FEATURE_GPC_HAS_IRQ_0_31 */ -} - -/*! - * brief Get the IRQ/Event flag. - * - * param base GPC peripheral base address. - * param irqId ID number of IRQ to be enabled, available range is 32-159. 0-31 is available in some platforms. - * return Indicated IRQ/Event is asserted or not. - */ -bool GPC_GetIRQStatusFlag(GPC_Type *base, uint32_t irqId) -{ - uint32_t irqRegNum = irqId / 32U; - uint32_t irqRegShiftNum = irqId % 32U; - uint32_t ret; - - assert(irqRegNum <= GPC_IMR_COUNT); - -#if ((defined FSL_FEATURE_GPC_HAS_IRQ_0_31) && FSL_FEATURE_GPC_HAS_IRQ_0_31) - if (irqRegNum == GPC_IMR_COUNT) - { - ret = base->ISR5 & (1UL << irqRegShiftNum); - } - else - { - ret = base->ISR[irqRegNum] & (1UL << irqRegShiftNum); - } -#else - assert(irqRegNum > 0U); - ret = base->ISR[irqRegNum - 1UL] & (1UL << irqRegShiftNum); -#endif /* FSL_FEATURE_GPC_HAS_IRQ_0_31 */ - - return (1UL << irqRegShiftNum) == ret; -} diff --git a/devices/MIMXRT1052/drivers/fsl_gpc.h b/devices/MIMXRT1052/drivers/fsl_gpc.h deleted file mode 100644 index 3137522..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpc.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_GPC_H_ -#define _FSL_GPC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup gpc - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief GPC driver version 2.1.1. */ -#define FSL_GPC_DRIVER_VERSION (MAKE_VERSION(2, 1, 1)) -/*@}*/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_GPCIRQM) && FSL_FEATURE_GPC_HAS_CNTR_GPCIRQM) -/*! - * @brief Allow all the IRQ/Events within the charge of GPC. - * - * @param base GPC peripheral base address. - */ -static inline void GPC_AllowIRQs(GPC_Type *base) -{ - base->CNTR &= ~GPC_CNTR_GPCIRQM_MASK; /* Events would not be masked. */ -} - -/*! - * @brief Disallow all the IRQ/Events within the charge of GPC. - * - * @param base GPC peripheral base address. - */ -static inline void GPC_DisallowIRQs(GPC_Type *base) -{ - base->CNTR |= GPC_CNTR_GPCIRQM_MASK; /* Mask all the events. */ -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_GPCIRQM */ - -/*! - * @brief Enable the IRQ. - * - * @param base GPC peripheral base address. - * @param irqId ID number of IRQ to be enabled, available range is 32-159. 0-31 is available in some platforms. - */ -void GPC_EnableIRQ(GPC_Type *base, uint32_t irqId); - -/*! - * @brief Disable the IRQ. - * - * @param base GPC peripheral base address. - * @param irqId ID number of IRQ to be disabled, available range is 32-159. 0-31 is available in some platforms. - */ -void GPC_DisableIRQ(GPC_Type *base, uint32_t irqId); - -/*! - * @brief Get the IRQ/Event flag. - * - * @param base GPC peripheral base address. - * @param irqId ID number of IRQ to be enabled, available range is 32-159. 0-31 is available in some platforms. - * @return Indicated IRQ/Event is asserted or not. - */ -bool GPC_GetIRQStatusFlag(GPC_Type *base, uint32_t irqId); - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_L2PGE) && FSL_FEATURE_GPC_HAS_CNTR_L2PGE) -/*! - * @brief L2 Cache Power Gate Enable - * - * This function configures the L2 cache if it will keep power when in low power mode. - * When the L2 cache power is OFF, L2 cache will be power down once when CPU core is power down - * and will be hardware invalidated automatically when CPU core is re-power up. - * When the L2 cache power is ON, L2 cache will keep power on even if CPU core is power down and - * will not be hardware invalidated. - * When CPU core is re-power up, the default setting is OFF. - * - * @param base GPC peripheral base address. - * @param enable Enable the request or not. - */ -static inline void GPC_RequestL2CachePowerDown(GPC_Type *base, bool enable) -{ - if (enable) - { - base->CNTR |= GPC_CNTR_L2_PGE_MASK; /* OFF. */ - } - else - { - base->CNTR &= ~GPC_CNTR_L2_PGE_MASK; /* ON. */ - } -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_L2PGE */ - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_PDRAM0PGE) && FSL_FEATURE_GPC_HAS_CNTR_PDRAM0PGE) -/*! - * @brief FLEXRAM PDRAM0 Power Gate Enable - * - * This function configures the FLEXRAM PDRAM0 if it will keep power when cpu core is power down. - * When the PDRAM0 Power is 1, PDRAM0 will be power down once when CPU core is power down. - * When the PDRAM0 Power is 0, PDRAM0 will keep power on even if CPU core is power down. - * When CPU core is re-power up, the default setting is 1. - * - * @param base GPC peripheral base address. - * @param enable Enable the request or not. - */ -static inline void GPC_RequestPdram0PowerDown(GPC_Type *base, bool enable) -{ - if (enable) - { - base->CNTR |= GPC_CNTR_PDRAM0_PGE_MASK; /* OFF. */ - } - else - { - base->CNTR &= ~GPC_CNTR_PDRAM0_PGE_MASK; /* ON. */ - } -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_PDRAM0PGE */ - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_VADC) && FSL_FEATURE_GPC_HAS_CNTR_VADC) -/*! - * @brief VADC power down. - * - * This function requests the VADC power down. - * - * @param base GPC peripheral base address. - * @param enable Enable the request or not. - */ -static inline void GPC_RequestVADCPowerDown(GPC_Type *base, bool enable) -{ - if (enable) - { - base->CNTR &= ~GPC_CNTR_VADC_EXT_PWD_N_MASK; /* VADC power down. */ - } - else - { - base->CNTR |= GPC_CNTR_VADC_EXT_PWD_N_MASK; /* VADC not power down. */ - } -} - -/*! - * @brief Checks if the VADC is power off. - * - * @param base GPC peripheral base address. - * @return Whether the VADC is power off or not. - */ -static inline bool GPC_GetVADCPowerDownFlag(GPC_Type *base) -{ - return (GPC_CNTR_VADC_ANALOG_OFF_MASK == (GPC_CNTR_VADC_ANALOG_OFF_MASK & base->CNTR)); -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_VADC */ - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_DVFS0CR) && FSL_FEATURE_GPC_HAS_CNTR_DVFS0CR) -/*! - * @brief Checks if the DVFS0 is requesting for frequency/voltage update. - * - * @param base GPC peripheral base address. - * @return Whether the DVFS0 is requesting for frequency/voltage update. - */ -static inline bool GPC_HasDVFS0ChangeRequest(GPC_Type *base) -{ - return (GPC_CNTR_DVFS0CR_MASK == (GPC_CNTR_DVFS0CR_MASK & base->CNTR)); -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_DVFS0CR */ - -#if (defined(FSL_FEATURE_GPC_HAS_CNTR_DISPLAY) && FSL_FEATURE_GPC_HAS_CNTR_DISPLAY) -/*! - * @brief Requests the display power switch sequence. - * - * @param base GPC peripheral base address. - * @param enable Enable the power on sequence, or the power down sequence. - */ -static inline void GPC_RequestDisplayPowerOn(GPC_Type *base, bool enable) -{ - if (enable) - { - base->CNTR |= GPC_CNTR_DISPLAY_PUP_REQ_MASK; /* Power on sequence. */ - } - else - { - base->CNTR |= GPC_CNTR_DISPLAY_PDN_REQ_MASK; /* Power down sequence. */ - } -} -#endif /* FSL_FEATURE_GPC_HAS_CNTR_DISPLAY */ - -/*! - * @brief Requests the MEGA power switch sequence. - * - * @param base GPC peripheral base address. - * @param enable Enable the power on sequence, or the power down sequence. - */ -static inline void GPC_RequestMEGAPowerOn(GPC_Type *base, bool enable) -{ - if (enable) - { - base->CNTR |= GPC_CNTR_MEGA_PUP_REQ_MASK; /* Power on sequence. */ - } - else - { - base->CNTR |= GPC_CNTR_MEGA_PDN_REQ_MASK; /* Power down sequence. */ - } -} - -/*! - * @} - */ - -#if defined(__cplusplus) -} -#endif -/*! - * @} - */ -#endif /* _FSL_GPC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_gpio.c b/devices/MIMXRT1052/drivers/fsl_gpio.c deleted file mode 100644 index 341757d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpio.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2017, 2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_gpio.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.igpio" -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* Array of GPIO peripheral base address. */ -static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of GPIO clock name. */ -static const clock_ip_name_t s_gpioClock[] = GPIO_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Gets the GPIO instance according to the GPIO base - * - * @param base GPIO peripheral base pointer(PTA, PTB, PTC, etc.) - * @retval GPIO instance - */ -static uint32_t GPIO_GetInstance(GPIO_Type *base); - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t GPIO_GetInstance(GPIO_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0U; instance < ARRAY_SIZE(s_gpioBases); instance++) - { - if (s_gpioBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_gpioBases)); - - return instance; -} - -/*! - * brief Initializes the GPIO peripheral according to the specified - * parameters in the initConfig. - * - * param base GPIO base pointer. - * param pin Specifies the pin number - * param initConfig pointer to a ref gpio_pin_config_t structure that - * contains the configuration information. - */ -void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable GPIO clock. */ - uint32_t instance = GPIO_GetInstance(base); - - /* If The clock IP is valid, enable the clock gate. */ - if ((instance < ARRAY_SIZE(s_gpioClock)) && (kCLOCK_IpInvalid != s_gpioClock[instance])) - { - (void)CLOCK_EnableClock(s_gpioClock[instance]); - } -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Register reset to default value */ - base->IMR &= ~(1UL << pin); - - /* Configure GPIO pin direction */ - if (Config->direction == kGPIO_DigitalInput) - { - base->GDIR &= ~(1UL << pin); - } - else - { - GPIO_PinWrite(base, pin, Config->outputLogic); - base->GDIR |= (1UL << pin); - } - - /* Configure GPIO pin interrupt mode */ - GPIO_SetPinInterruptConfig(base, pin, Config->interruptMode); -} - -/*! - * brief Sets the output level of the individual GPIO pin to logic 1 or 0. - * - * param base GPIO base pointer. - * param pin GPIO port pin number. - * param output GPIOpin output logic level. - * - 0: corresponding pin output low-logic level. - * - 1: corresponding pin output high-logic level. - */ -void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output) -{ - assert(pin < 32U); - if (output == 0U) - { -#if (defined(FSL_FEATURE_IGPIO_HAS_DR_CLEAR) && FSL_FEATURE_IGPIO_HAS_DR_CLEAR) - base->DR_CLEAR = (1UL << pin); -#else - base->DR &= ~(1UL << pin); /* Set pin output to low level.*/ -#endif - } - else - { -#if (defined(FSL_FEATURE_IGPIO_HAS_DR_SET) && FSL_FEATURE_IGPIO_HAS_DR_SET) - base->DR_SET = (1UL << pin); -#else - base->DR |= (1UL << pin); /* Set pin output to high level.*/ -#endif - } -} - -/*! - * brief Sets the current pin interrupt mode. - * - * param base GPIO base pointer. - * param pin GPIO port pin number. - * param pininterruptMode pointer to a ref gpio_interrupt_mode_t structure - * that contains the interrupt mode information. - */ -void GPIO_PinSetInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t pinInterruptMode) -{ - volatile uint32_t *icr; - uint32_t icrShift; - - icrShift = pin; - - /* Register reset to default value */ - base->EDGE_SEL &= ~(1UL << pin); - - if (pin < 16U) - { - icr = &(base->ICR1); - } - else - { - icr = &(base->ICR2); - icrShift -= 16U; - } - switch (pinInterruptMode) - { - case (kGPIO_IntLowLevel): - *icr &= ~(3UL << (2UL * icrShift)); - break; - case (kGPIO_IntHighLevel): - *icr = (*icr & (~(3UL << (2UL * icrShift)))) | (1UL << (2UL * icrShift)); - break; - case (kGPIO_IntRisingEdge): - *icr = (*icr & (~(3UL << (2UL * icrShift)))) | (2UL << (2UL * icrShift)); - break; - case (kGPIO_IntFallingEdge): - *icr |= (3UL << (2UL * icrShift)); - break; - case (kGPIO_IntRisingOrFallingEdge): - base->EDGE_SEL |= (1UL << pin); - break; - default:; /* Intentional empty default */ - break; - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_gpio.h b/devices/MIMXRT1052/drivers/fsl_gpio.h deleted file mode 100644 index bfbda25..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpio.h +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_GPIO_H_ -#define _FSL_GPIO_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup gpio_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief GPIO driver version. */ -#define FSL_GPIO_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) -/*@}*/ - -/*! @brief GPIO direction definition. */ -typedef enum _gpio_pin_direction -{ - kGPIO_DigitalInput = 0U, /*!< Set current pin as digital input.*/ - kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output.*/ -} gpio_pin_direction_t; - -/*! @brief GPIO interrupt mode definition. */ -typedef enum _gpio_interrupt_mode -{ - kGPIO_NoIntmode = 0U, /*!< Set current pin general IO functionality.*/ - kGPIO_IntLowLevel = 1U, /*!< Set current pin interrupt is low-level sensitive.*/ - kGPIO_IntHighLevel = 2U, /*!< Set current pin interrupt is high-level sensitive.*/ - kGPIO_IntRisingEdge = 3U, /*!< Set current pin interrupt is rising-edge sensitive.*/ - kGPIO_IntFallingEdge = 4U, /*!< Set current pin interrupt is falling-edge sensitive.*/ - kGPIO_IntRisingOrFallingEdge = 5U, /*!< Enable the edge select bit to override the ICR register's configuration.*/ -} gpio_interrupt_mode_t; - -/*! @brief GPIO Init structure definition. */ -typedef struct _gpio_pin_config -{ - gpio_pin_direction_t direction; /*!< Specifies the pin direction. */ - uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */ - gpio_interrupt_mode_t - interruptMode; /*!< Specifies the pin interrupt mode, a value of @ref gpio_interrupt_mode_t. */ -} gpio_pin_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name GPIO Initialization and Configuration functions - * @{ - */ - -/*! - * @brief Initializes the GPIO peripheral according to the specified - * parameters in the initConfig. - * - * @param base GPIO base pointer. - * @param pin Specifies the pin number - * @param Config pointer to a @ref gpio_pin_config_t structure that - * contains the configuration information. - */ -void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config); -/*@}*/ - -/*! - * @name GPIO Reads and Write Functions - * @{ - */ - -/*! - * @brief Sets the output level of the individual GPIO pin to logic 1 or 0. - * - * @param base GPIO base pointer. - * @param pin GPIO port pin number. - * @param output GPIOpin output logic level. - * - 0: corresponding pin output low-logic level. - * - 1: corresponding pin output high-logic level. - */ -void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output); - -/*! - * @brief Sets the output level of the individual GPIO pin to logic 1 or 0. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinWrite. - */ -static inline void GPIO_WritePinOutput(GPIO_Type *base, uint32_t pin, uint8_t output) -{ - GPIO_PinWrite(base, pin, output); -} - -/*! - * @brief Sets the output level of the multiple GPIO pins to the logic 1. - * - * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) - * @param mask GPIO pin number macro - */ -static inline void GPIO_PortSet(GPIO_Type *base, uint32_t mask) -{ -#if (defined(FSL_FEATURE_IGPIO_HAS_DR_SET) && (FSL_FEATURE_IGPIO_HAS_DR_SET == 1)) - base->DR_SET = mask; -#else - base->DR |= mask; -#endif /* FSL_FEATURE_IGPIO_HAS_DR_SET */ -} - -/*! - * @brief Sets the output level of the multiple GPIO pins to the logic 1. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortSet. - */ -static inline void GPIO_SetPinsOutput(GPIO_Type *base, uint32_t mask) -{ - GPIO_PortSet(base, mask); -} - -/*! - * @brief Sets the output level of the multiple GPIO pins to the logic 0. - * - * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) - * @param mask GPIO pin number macro - */ -static inline void GPIO_PortClear(GPIO_Type *base, uint32_t mask) -{ -#if (defined(FSL_FEATURE_IGPIO_HAS_DR_CLEAR) && (FSL_FEATURE_IGPIO_HAS_DR_CLEAR == 1)) - base->DR_CLEAR = mask; -#else - base->DR &= ~mask; -#endif /* FSL_FEATURE_IGPIO_HAS_DR_CLEAR */ -} - -/*! - * @brief Sets the output level of the multiple GPIO pins to the logic 0. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortClear. - */ -static inline void GPIO_ClearPinsOutput(GPIO_Type *base, uint32_t mask) -{ - GPIO_PortClear(base, mask); -} - -/*! - * @brief Reverses the current output logic of the multiple GPIO pins. - * - * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) - * @param mask GPIO pin number macro - */ -static inline void GPIO_PortToggle(GPIO_Type *base, uint32_t mask) -{ -#if (defined(FSL_FEATURE_IGPIO_HAS_DR_TOGGLE) && (FSL_FEATURE_IGPIO_HAS_DR_TOGGLE == 1)) - base->DR_TOGGLE = mask; -#else - base->DR ^= mask; -#endif /* FSL_FEATURE_IGPIO_HAS_DR_TOGGLE */ -} - -/*! - * @brief Reads the current input value of the GPIO port. - * - * @param base GPIO base pointer. - * @param pin GPIO port pin number. - * @retval GPIO port input value. - */ -static inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t pin) -{ - assert(pin < 32U); - - return (((base->DR) >> pin) & 0x1U); -} - -/*! - * @brief Reads the current input value of the GPIO port. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinRead. - */ -static inline uint32_t GPIO_ReadPinInput(GPIO_Type *base, uint32_t pin) -{ - return GPIO_PinRead(base, pin); -} -/*@}*/ - -/*! - * @name GPIO Reads Pad Status Functions - * @{ - */ - -/*! - * @brief Reads the current GPIO pin pad status. - * - * @param base GPIO base pointer. - * @param pin GPIO port pin number. - * @retval GPIO pin pad status value. - */ -static inline uint8_t GPIO_PinReadPadStatus(GPIO_Type *base, uint32_t pin) -{ - assert(pin < 32U); - - return (uint8_t)(((base->PSR) >> pin) & 0x1U); -} - -/*! - * @brief Reads the current GPIO pin pad status. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinReadPadStatus. - */ -static inline uint8_t GPIO_ReadPadStatus(GPIO_Type *base, uint32_t pin) -{ - return GPIO_PinReadPadStatus(base, pin); -} - -/*@}*/ - -/*! - * @name Interrupts and flags management functions - * @{ - */ - -/*! - * @brief Sets the current pin interrupt mode. - * - * @param base GPIO base pointer. - * @param pin GPIO port pin number. - * @param pinInterruptMode pointer to a @ref gpio_interrupt_mode_t structure - * that contains the interrupt mode information. - */ -void GPIO_PinSetInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t pinInterruptMode); - -/*! - * @brief Sets the current pin interrupt mode. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinSetInterruptConfig. - */ -static inline void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t pinInterruptMode) -{ - GPIO_PinSetInterruptConfig(base, pin, pinInterruptMode); -} - -/*! - * @brief Enables the specific pin interrupt. - * - * @param base GPIO base pointer. - * @param mask GPIO pin number macro. - */ -static inline void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t mask) -{ - base->IMR |= mask; -} - -/*! - * @brief Enables the specific pin interrupt. - * - * @param base GPIO base pointer. - * @param mask GPIO pin number macro. - */ -static inline void GPIO_EnableInterrupts(GPIO_Type *base, uint32_t mask) -{ - GPIO_PortEnableInterrupts(base, mask); -} - -/*! - * @brief Disables the specific pin interrupt. - * - * @param base GPIO base pointer. - * @param mask GPIO pin number macro. - */ -static inline void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t mask) -{ - base->IMR &= ~mask; -} - -/*! - * @brief Disables the specific pin interrupt. - * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortDisableInterrupts. - */ -static inline void GPIO_DisableInterrupts(GPIO_Type *base, uint32_t mask) -{ - GPIO_PortDisableInterrupts(base, mask); -} - -/*! - * @brief Reads individual pin interrupt status. - * - * @param base GPIO base pointer. - * @retval current pin interrupt status flag. - */ -static inline uint32_t GPIO_PortGetInterruptFlags(GPIO_Type *base) -{ - return base->ISR; -} - -/*! - * @brief Reads individual pin interrupt status. - * - * @param base GPIO base pointer. - * @retval current pin interrupt status flag. - */ -static inline uint32_t GPIO_GetPinsInterruptFlags(GPIO_Type *base) -{ - return GPIO_PortGetInterruptFlags(base); -} - -/*! - * @brief Clears pin interrupt flag. Status flags are cleared by - * writing a 1 to the corresponding bit position. - * - * @param base GPIO base pointer. - * @param mask GPIO pin number macro. - */ -static inline void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t mask) -{ - base->ISR = mask; -} - -/*! - * @brief Clears pin interrupt flag. Status flags are cleared by - * writing a 1 to the corresponding bit position. - * - * @param base GPIO base pointer. - * @param mask GPIO pin number macro. - */ -static inline void GPIO_ClearPinsInterruptFlags(GPIO_Type *base, uint32_t mask) -{ - GPIO_PortClearInterruptFlags(base, mask); -} -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ - -#endif /* _FSL_GPIO_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_gpt.c b/devices/MIMXRT1052/drivers/fsl_gpt.c deleted file mode 100644 index 050ebf1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpt.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_gpt.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.gpt" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to GPT bases for each instance. */ -static GPT_Type *const s_gptBases[] = GPT_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to GPT clocks for each instance. */ -static const clock_ip_name_t s_gptClocks[] = GPT_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t GPT_GetInstance(GPT_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0U; instance < ARRAY_SIZE(s_gptBases); instance++) - { - if (s_gptBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_gptBases)); - - return instance; -} - -/*! - * brief Initialize GPT to reset state and initialize running mode. - * - * param base GPT peripheral base address. - * param initConfig GPT mode setting configuration. - */ -void GPT_Init(GPT_Type *base, const gpt_config_t *initConfig) -{ - assert(NULL != initConfig); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate the GPT clock*/ - (void)CLOCK_EnableClock(s_gptClocks[GPT_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - base->CR = 0U; - - GPT_SoftwareReset(base); - - base->CR = - (initConfig->enableFreeRun ? GPT_CR_FRR_MASK : 0UL) | (initConfig->enableRunInWait ? GPT_CR_WAITEN_MASK : 0UL) | - (initConfig->enableRunInStop ? GPT_CR_STOPEN_MASK : 0UL) | - (initConfig->enableRunInDoze ? GPT_CR_DOZEEN_MASK : 0UL) | - (initConfig->enableRunInDbg ? GPT_CR_DBGEN_MASK : 0UL) | (initConfig->enableMode ? GPT_CR_ENMOD_MASK : 0UL); - - GPT_SetClockSource(base, initConfig->clockSource); - GPT_SetClockDivider(base, initConfig->divider); -} - -/*! - * brief Disables the module and gates the GPT clock. - * - * param base GPT peripheral base address. - */ -void GPT_Deinit(GPT_Type *base) -{ - /* Disable GPT timers */ - base->CR = 0U; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Gate the GPT clock*/ - (void)CLOCK_DisableClock(s_gptClocks[GPT_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Fills in the GPT configuration structure with default settings. - * - * The default values are: - * code - * config->clockSource = kGPT_ClockSource_Periph; - * config->divider = 1U; - * config->enableRunInStop = true; - * config->enableRunInWait = true; - * config->enableRunInDoze = false; - * config->enableRunInDbg = false; - * config->enableFreeRun = false; - * config->enableMode = true; - * endcode - * param config Pointer to the user configuration structure. - */ -void GPT_GetDefaultConfig(gpt_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->clockSource = kGPT_ClockSource_Periph; - config->divider = 1U; - config->enableRunInStop = true; - config->enableRunInWait = true; - config->enableRunInDoze = false; - config->enableRunInDbg = false; - config->enableFreeRun = false; - config->enableMode = true; -} diff --git a/devices/MIMXRT1052/drivers/fsl_gpt.h b/devices/MIMXRT1052/drivers/fsl_gpt.h deleted file mode 100644 index 0cf070a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_gpt.h +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_GPT_H_ -#define _FSL_GPT_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup gpt - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_GPT_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) -/*@}*/ - -/*! - * @brief List of clock sources - * @note Actual number of clock sources is SoC dependent - */ -typedef enum _gpt_clock_source -{ - kGPT_ClockSource_Off = 0U, /*!< GPT Clock Source Off.*/ - kGPT_ClockSource_Periph = 1U, /*!< GPT Clock Source from Peripheral Clock.*/ - kGPT_ClockSource_HighFreq = 2U, /*!< GPT Clock Source from High Frequency Reference Clock.*/ - kGPT_ClockSource_Ext = 3U, /*!< GPT Clock Source from external pin.*/ - kGPT_ClockSource_LowFreq = 4U, /*!< GPT Clock Source from Low Frequency Reference Clock.*/ - kGPT_ClockSource_Osc = 5U, /*!< GPT Clock Source from Crystal oscillator.*/ -} gpt_clock_source_t; - -/*! @brief List of input capture channel number. */ -typedef enum _gpt_input_capture_channel -{ - kGPT_InputCapture_Channel1 = 0U, /*!< GPT Input Capture Channel1.*/ - kGPT_InputCapture_Channel2 = 1U, /*!< GPT Input Capture Channel2.*/ -} gpt_input_capture_channel_t; - -/*! @brief List of input capture operation mode. */ -typedef enum _gpt_input_operation_mode -{ - kGPT_InputOperation_Disabled = 0U, /*!< Don't capture.*/ - kGPT_InputOperation_RiseEdge = 1U, /*!< Capture on rising edge of input pin.*/ - kGPT_InputOperation_FallEdge = 2U, /*!< Capture on falling edge of input pin.*/ - kGPT_InputOperation_BothEdge = 3U, /*!< Capture on both edges of input pin.*/ -} gpt_input_operation_mode_t; - -/*! @brief List of output compare channel number. */ -typedef enum _gpt_output_compare_channel -{ - kGPT_OutputCompare_Channel1 = 0U, /*!< Output Compare Channel1.*/ - kGPT_OutputCompare_Channel2 = 1U, /*!< Output Compare Channel2.*/ - kGPT_OutputCompare_Channel3 = 2U, /*!< Output Compare Channel3.*/ -} gpt_output_compare_channel_t; - -/*! @brief List of output compare operation mode. */ -typedef enum _gpt_output_operation_mode -{ - kGPT_OutputOperation_Disconnected = 0U, /*!< Don't change output pin.*/ - kGPT_OutputOperation_Toggle = 1U, /*!< Toggle output pin.*/ - kGPT_OutputOperation_Clear = 2U, /*!< Set output pin low.*/ - kGPT_OutputOperation_Set = 3U, /*!< Set output pin high.*/ - kGPT_OutputOperation_Activelow = 4U, /*!< Generate a active low pulse on output pin.*/ -} gpt_output_operation_mode_t; - -/*! @brief List of GPT interrupts */ -typedef enum _gpt_interrupt_enable -{ - kGPT_OutputCompare1InterruptEnable = GPT_IR_OF1IE_MASK, /*!< Output Compare Channel1 interrupt enable*/ - kGPT_OutputCompare2InterruptEnable = GPT_IR_OF2IE_MASK, /*!< Output Compare Channel2 interrupt enable*/ - kGPT_OutputCompare3InterruptEnable = GPT_IR_OF3IE_MASK, /*!< Output Compare Channel3 interrupt enable*/ - kGPT_InputCapture1InterruptEnable = GPT_IR_IF1IE_MASK, /*!< Input Capture Channel1 interrupt enable*/ - kGPT_InputCapture2InterruptEnable = GPT_IR_IF2IE_MASK, /*!< Input Capture Channel1 interrupt enable*/ - kGPT_RollOverFlagInterruptEnable = GPT_IR_ROVIE_MASK, /*!< Counter rolled over interrupt enable*/ -} gpt_interrupt_enable_t; - -/*! @brief Status flag. */ -typedef enum _gpt_status_flag -{ - kGPT_OutputCompare1Flag = GPT_SR_OF1_MASK, /*!< Output compare channel 1 event.*/ - kGPT_OutputCompare2Flag = GPT_SR_OF2_MASK, /*!< Output compare channel 2 event.*/ - kGPT_OutputCompare3Flag = GPT_SR_OF3_MASK, /*!< Output compare channel 3 event.*/ - kGPT_InputCapture1Flag = GPT_SR_IF1_MASK, /*!< Input Capture channel 1 event.*/ - kGPT_InputCapture2Flag = GPT_SR_IF2_MASK, /*!< Input Capture channel 2 event.*/ - kGPT_RollOverFlag = GPT_SR_ROV_MASK, /*!< Counter reaches maximum value and rolled over to 0 event.*/ -} gpt_status_flag_t; - -/*! @brief Structure to configure the running mode. */ -typedef struct _gpt_init_config -{ - gpt_clock_source_t clockSource; /*!< clock source for GPT module. */ - uint32_t divider; /*!< clock divider (prescaler+1) from clock source to counter. */ - bool enableFreeRun; /*!< true: FreeRun mode, false: Restart mode. */ - bool enableRunInWait; /*!< GPT enabled in wait mode. */ - bool enableRunInStop; /*!< GPT enabled in stop mode. */ - bool enableRunInDoze; /*!< GPT enabled in doze mode. */ - bool enableRunInDbg; /*!< GPT enabled in debug mode. */ - bool enableMode; /*!< true: counter reset to 0 when enabled; - false: counter retain its value when enabled. */ -} gpt_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initialize GPT to reset state and initialize running mode. - * - * @param base GPT peripheral base address. - * @param initConfig GPT mode setting configuration. - */ -void GPT_Init(GPT_Type *base, const gpt_config_t *initConfig); - -/*! - * @brief Disables the module and gates the GPT clock. - * - * @param base GPT peripheral base address. - */ -void GPT_Deinit(GPT_Type *base); - -/*! - * @brief Fills in the GPT configuration structure with default settings. - * - * The default values are: - * @code - * config->clockSource = kGPT_ClockSource_Periph; - * config->divider = 1U; - * config->enableRunInStop = true; - * config->enableRunInWait = true; - * config->enableRunInDoze = false; - * config->enableRunInDbg = false; - * config->enableFreeRun = false; - * config->enableMode = true; - * @endcode - * @param config Pointer to the user configuration structure. - */ -void GPT_GetDefaultConfig(gpt_config_t *config); - -/*! - * @name Software Reset - * @{ - */ - -/*! - * @brief Software reset of GPT module. - * - * @param base GPT peripheral base address. - */ -static inline void GPT_SoftwareReset(GPT_Type *base) -{ - base->CR |= GPT_CR_SWR_MASK; - /* Wait reset finished. */ - while ((base->CR & GPT_CR_SWR_MASK) == GPT_CR_SWR_MASK) - { - } -} - -/*! - * @name Clock source and frequency control - * @{ - */ - -/*! - * @brief Set clock source of GPT. - * - * @param base GPT peripheral base address. - * @param gptClkSource Clock source (see @ref gpt_clock_source_t typedef enumeration). - */ -static inline void GPT_SetClockSource(GPT_Type *base, gpt_clock_source_t gptClkSource) -{ - if (gptClkSource == kGPT_ClockSource_Osc) - { - base->CR = (base->CR & ~GPT_CR_CLKSRC_MASK) | GPT_CR_EN_24M_MASK | GPT_CR_CLKSRC(gptClkSource); - } - else - { - base->CR = (base->CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK)) | GPT_CR_CLKSRC(gptClkSource); - } -} - -/*! - * @brief Get clock source of GPT. - * - * @param base GPT peripheral base address. - * @return clock source (see @ref gpt_clock_source_t typedef enumeration). - */ -static inline gpt_clock_source_t GPT_GetClockSource(GPT_Type *base) -{ - return (gpt_clock_source_t)(uint8_t)((base->CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT); -} - -/*! - * @brief Set pre scaler of GPT. - * - * @param base GPT peripheral base address. - * @param divider Divider of GPT (1-4096). - */ -static inline void GPT_SetClockDivider(GPT_Type *base, uint32_t divider) -{ - assert(divider - 1U <= GPT_PR_PRESCALER_MASK); - - base->PR = (base->PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(divider - 1U); -} - -/*! - * @brief Get clock divider in GPT module. - * - * @param base GPT peripheral base address. - * @return clock divider in GPT module (1-4096). - */ -static inline uint32_t GPT_GetClockDivider(GPT_Type *base) -{ - return ((base->PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U; -} - -/*! - * @brief OSC 24M pre-scaler before selected by clock source. - * - * @param base GPT peripheral base address. - * @param divider OSC Divider(1-16). - */ -static inline void GPT_SetOscClockDivider(GPT_Type *base, uint32_t divider) -{ - assert(divider - 1U <= (GPT_PR_PRESCALER24M_MASK >> GPT_PR_PRESCALER24M_SHIFT)); - - base->PR = (base->PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U); -} - -/*! - * @brief Get OSC 24M clock divider in GPT module. - * - * @param base GPT peripheral base address. - * @return OSC clock divider in GPT module (1-16). - */ -static inline uint32_t GPT_GetOscClockDivider(GPT_Type *base) -{ - return ((base->PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U; -} - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ -/*! - * @brief Start GPT timer. - * - * @param base GPT peripheral base address. - */ -static inline void GPT_StartTimer(GPT_Type *base) -{ - base->CR |= GPT_CR_EN_MASK; -} - -/*! - * @brief Stop GPT timer. - * - * @param base GPT peripheral base address. - */ -static inline void GPT_StopTimer(GPT_Type *base) -{ - base->CR &= ~GPT_CR_EN_MASK; -} - -/*! - * @name Read the timer period - * @{ - */ - -/*! - * @brief Reads the current GPT counting value. - * - * @param base GPT peripheral base address. - * @return Current GPT counter value. - */ -static inline uint32_t GPT_GetCurrentTimerCount(GPT_Type *base) -{ - return base->CNT; -} - -/*@}*/ - -/*! - * @name GPT Input/Output Signal Control - * @{ - */ - -/*! - * @brief Set GPT operation mode of input capture channel. - * - * @param base GPT peripheral base address. - * @param channel GPT capture channel (see @ref gpt_input_capture_channel_t typedef enumeration). - * @param mode GPT input capture operation mode (see @ref gpt_input_operation_mode_t typedef enumeration). - */ -static inline void GPT_SetInputOperationMode(GPT_Type *base, - gpt_input_capture_channel_t channel, - gpt_input_operation_mode_t mode) -{ - assert(channel <= kGPT_InputCapture_Channel2); - - base->CR = - (base->CR & ~(GPT_CR_IM1_MASK << ((uint32_t)channel * 2UL))) | (GPT_CR_IM1(mode) << ((uint32_t)channel * 2UL)); -} - -/*! - * @brief Get GPT operation mode of input capture channel. - * - * @param base GPT peripheral base address. - * @param channel GPT capture channel (see @ref gpt_input_capture_channel_t typedef enumeration). - * @return GPT input capture operation mode (see @ref gpt_input_operation_mode_t typedef enumeration). - */ -static inline gpt_input_operation_mode_t GPT_GetInputOperationMode(GPT_Type *base, gpt_input_capture_channel_t channel) -{ - assert(channel <= kGPT_InputCapture_Channel2); - - return (gpt_input_operation_mode_t)(uint8_t)((base->CR >> (GPT_CR_IM1_SHIFT + (uint32_t)channel * 2UL)) & - (GPT_CR_IM1_MASK >> GPT_CR_IM1_SHIFT)); -} - -/*! - * @brief Get GPT input capture value of certain channel. - * - * @param base GPT peripheral base address. - * @param channel GPT capture channel (see @ref gpt_input_capture_channel_t typedef enumeration). - * @return GPT input capture value. - */ -static inline uint32_t GPT_GetInputCaptureValue(GPT_Type *base, gpt_input_capture_channel_t channel) -{ - assert(channel <= kGPT_InputCapture_Channel2); - - return base->ICR[(uint32_t)channel]; -} - -/*! - * @brief Set GPT operation mode of output compare channel. - * - * @param base GPT peripheral base address. - * @param channel GPT output compare channel (see @ref gpt_output_compare_channel_t typedef enumeration). - * @param mode GPT output operation mode (see @ref gpt_output_operation_mode_t typedef enumeration). - */ -static inline void GPT_SetOutputOperationMode(GPT_Type *base, - gpt_output_compare_channel_t channel, - gpt_output_operation_mode_t mode) -{ - assert(channel <= kGPT_OutputCompare_Channel3); - - base->CR = - (base->CR & ~(GPT_CR_OM1_MASK << ((uint32_t)channel * 3UL))) | (GPT_CR_OM1(mode) << ((uint32_t)channel * 3UL)); -} - -/*! - * @brief Get GPT operation mode of output compare channel. - * - * @param base GPT peripheral base address. - * @param channel GPT output compare channel (see @ref gpt_output_compare_channel_t typedef enumeration). - * @return GPT output operation mode (see @ref gpt_output_operation_mode_t typedef enumeration). - */ -static inline gpt_output_operation_mode_t GPT_GetOutputOperationMode(GPT_Type *base, - gpt_output_compare_channel_t channel) -{ - assert(channel <= kGPT_OutputCompare_Channel3); - - return (gpt_output_operation_mode_t)(uint8_t)((base->CR >> (GPT_CR_OM1_SHIFT + (uint32_t)channel * 3UL)) & - (GPT_CR_OM1_MASK >> GPT_CR_OM1_SHIFT)); -} - -/*! - * @brief Set GPT output compare value of output compare channel. - * - * @param base GPT peripheral base address. - * @param channel GPT output compare channel (see @ref gpt_output_compare_channel_t typedef enumeration). - * @param value GPT output compare value. - */ -static inline void GPT_SetOutputCompareValue(GPT_Type *base, gpt_output_compare_channel_t channel, uint32_t value) -{ - assert(channel <= kGPT_OutputCompare_Channel3); - - base->OCR[(uint32_t)channel] = value; -} - -/*! - * @brief Get GPT output compare value of output compare channel. - * - * @param base GPT peripheral base address. - * @param channel GPT output compare channel (see @ref gpt_output_compare_channel_t typedef enumeration). - * @return GPT output compare value. - */ -static inline uint32_t GPT_GetOutputCompareValue(GPT_Type *base, gpt_output_compare_channel_t channel) -{ - assert(channel <= kGPT_OutputCompare_Channel3); - - return base->OCR[(uint32_t)channel]; -} - -/*! - * @brief Force GPT output action on output compare channel, ignoring comparator. - * - * @param base GPT peripheral base address. - * @param channel GPT output compare channel (see @ref gpt_output_compare_channel_t typedef enumeration). - */ -static inline void GPT_ForceOutput(GPT_Type *base, gpt_output_compare_channel_t channel) -{ - assert(channel <= kGPT_OutputCompare_Channel3); - - base->CR |= (GPT_CR_FO1_MASK << (uint32_t)channel); -} - -/*@}*/ - -/*! - * @name GPT Interrupt and Status Interface - * @{ - */ - -/*! - * @brief Enables the selected GPT interrupts. - * - * @param base GPT peripheral base address. - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::gpt_interrupt_enable_t - */ -static inline void GPT_EnableInterrupts(GPT_Type *base, uint32_t mask) -{ - base->IR |= mask; -} - -/*! - * @brief Disables the selected GPT interrupts. - * - * @param base GPT peripheral base address - * @param mask The interrupts to disable. This is a logical OR of members of the - * enumeration ::gpt_interrupt_enable_t - */ -static inline void GPT_DisableInterrupts(GPT_Type *base, uint32_t mask) -{ - base->IR &= ~mask; -} - -/*! - * @brief Gets the enabled GPT interrupts. - * - * @param base GPT peripheral base address - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration ::gpt_interrupt_enable_t - */ -static inline uint32_t GPT_GetEnabledInterrupts(GPT_Type *base) -{ - return (base->IR & (GPT_IR_OF1IE_MASK | GPT_IR_OF2IE_MASK | GPT_IR_OF3IE_MASK | GPT_IR_IF1IE_MASK | - GPT_IR_IF2IE_MASK | GPT_IR_ROVIE_MASK)); -} - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Get GPT status flags. - * - * @param base GPT peripheral base address. - * @param flags GPT status flag mask (see @ref gpt_status_flag_t for bit definition). - * @return GPT status, each bit represents one status flag. - */ -static inline uint32_t GPT_GetStatusFlags(GPT_Type *base, gpt_status_flag_t flags) -{ - return base->SR & (uint32_t)flags; -} - -/*! - * @brief Clears the GPT status flags. - * - * @param base GPT peripheral base address. - * @param flags GPT status flag mask (see @ref gpt_status_flag_t for bit definition). - */ -static inline void GPT_ClearStatusFlags(GPT_Type *base, gpt_status_flag_t flags) -{ - base->SR = (uint32_t)flags; -} - -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_GPT_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_iomuxc.h b/devices/MIMXRT1052/drivers/fsl_iomuxc.h deleted file mode 100644 index 4e5e717..0000000 --- a/devices/MIMXRT1052/drivers/fsl_iomuxc.h +++ /dev/null @@ -1,1242 +0,0 @@ -/* - * Copyright 2016 Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_IOMUXC_H_ -#define _FSL_IOMUXC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup iomuxc_driver - * @{ - */ - -/*! @file */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.iomuxc" -#endif - -/*! @name Driver version */ -/*@{*/ -/*! @brief IOMUXC driver version 2.0.2. */ -#define FSL_IOMUXC_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) -/*@}*/ - -/*! - * @name Pin function ID - * The pin function ID is a tuple of \ - * - * @{ - */ -#define IOMUXC_SNVS_WAKEUP_GPIO5_IO00 0x400A8000U, 0x5U, 0, 0, 0x400A8018U -#define IOMUXC_SNVS_WAKEUP_NMI_GLUE_NMI 0x400A8000U, 0x7U, 0x401F8568U, 0x1U, 0x400A8018U - -#define IOMUXC_SNVS_PMIC_ON_REQ_SNVS_LP_PMIC_ON_REQ 0x400A8004U, 0x0U, 0, 0, 0x400A801CU -#define IOMUXC_SNVS_PMIC_ON_REQ_GPIO5_IO01 0x400A8004U, 0x5U, 0, 0, 0x400A801CU - -#define IOMUXC_SNVS_PMIC_STBY_REQ_CCM_PMIC_VSTBY_REQ 0x400A8008U, 0x0U, 0, 0, 0x400A8020U -#define IOMUXC_SNVS_PMIC_STBY_REQ_GPIO5_IO02 0x400A8008U, 0x5U, 0, 0, 0x400A8020U - -#define IOMUXC_SNVS_TEST_MODE 0, 0, 0, 0, 0x400A800CU - -#define IOMUXC_SNVS_POR_B 0, 0, 0, 0, 0x400A8010U - -#define IOMUXC_SNVS_ONOFF 0, 0, 0, 0, 0x400A8014U - -#define IOMUXC_GPIO_EMC_00_SEMC_DATA00 0x401F8014U, 0x0U, 0, 0, 0x401F8204U -#define IOMUXC_GPIO_EMC_00_FLEXPWM4_PWMA00 0x401F8014U, 0x1U, 0x401F8494U, 0x0U, 0x401F8204U -#define IOMUXC_GPIO_EMC_00_LPSPI2_SCK 0x401F8014U, 0x2U, 0x401F8500U, 0x1U, 0x401F8204U -#define IOMUXC_GPIO_EMC_00_XBAR1_XBAR_IN02 0x401F8014U, 0x3U, 0x401F860CU, 0x0U, 0x401F8204U -#define IOMUXC_GPIO_EMC_00_FLEXIO1_FLEXIO00 0x401F8014U, 0x4U, 0, 0, 0x401F8204U -#define IOMUXC_GPIO_EMC_00_GPIO4_IO00 0x401F8014U, 0x5U, 0, 0, 0x401F8204U - -#define IOMUXC_GPIO_EMC_01_SEMC_DATA01 0x401F8018U, 0x0U, 0, 0, 0x401F8208U -#define IOMUXC_GPIO_EMC_01_FLEXPWM4_PWMB00 0x401F8018U, 0x1U, 0, 0, 0x401F8208U -#define IOMUXC_GPIO_EMC_01_LPSPI2_PCS0 0x401F8018U, 0x2U, 0x401F84FCU, 0x1U, 0x401F8208U -#define IOMUXC_GPIO_EMC_01_XBAR1_IN03 0x401F8018U, 0x3U, 0x401F8610U, 0x0U, 0x401F8208U -#define IOMUXC_GPIO_EMC_01_FLEXIO1_FLEXIO01 0x401F8018U, 0x4U, 0, 0, 0x401F8208U -#define IOMUXC_GPIO_EMC_01_GPIO4_IO01 0x401F8018U, 0x5U, 0, 0, 0x401F8208U - -#define IOMUXC_GPIO_EMC_02_SEMC_DATA02 0x401F801CU, 0x0U, 0, 0, 0x401F820CU -#define IOMUXC_GPIO_EMC_02_FLEXPWM4_PWMA01 0x401F801CU, 0x1U, 0x401F8498U, 0x0U, 0x401F820CU -#define IOMUXC_GPIO_EMC_02_LPSPI2_SDO 0x401F801CU, 0x2U, 0x401F8508U, 0x1U, 0x401F820CU -#define IOMUXC_GPIO_EMC_02_XBAR1_INOUT04 0x401F801CU, 0x3U, 0x401F8614U, 0x0U, 0x401F820CU -#define IOMUXC_GPIO_EMC_02_FLEXIO1_FLEXIO02 0x401F801CU, 0x4U, 0, 0, 0x401F820CU -#define IOMUXC_GPIO_EMC_02_GPIO4_IO02 0x401F801CU, 0x5U, 0, 0, 0x401F820CU - -#define IOMUXC_GPIO_EMC_03_SEMC_DATA03 0x401F8020U, 0x0U, 0, 0, 0x401F8210U -#define IOMUXC_GPIO_EMC_03_FLEXPWM4_PWMB01 0x401F8020U, 0x1U, 0, 0, 0x401F8210U -#define IOMUXC_GPIO_EMC_03_LPSPI2_SDI 0x401F8020U, 0x2U, 0x401F8504U, 0x1U, 0x401F8210U -#define IOMUXC_GPIO_EMC_03_XBAR1_INOUT05 0x401F8020U, 0x3U, 0x401F8618U, 0x0U, 0x401F8210U -#define IOMUXC_GPIO_EMC_03_FLEXIO1_FLEXIO03 0x401F8020U, 0x4U, 0, 0, 0x401F8210U -#define IOMUXC_GPIO_EMC_03_GPIO4_IO03 0x401F8020U, 0x5U, 0, 0, 0x401F8210U - -#define IOMUXC_GPIO_EMC_04_SEMC_DATA04 0x401F8024U, 0x0U, 0, 0, 0x401F8214U -#define IOMUXC_GPIO_EMC_04_FLEXPWM4_PWMA02 0x401F8024U, 0x1U, 0x401F849CU, 0x0U, 0x401F8214U -#define IOMUXC_GPIO_EMC_04_SAI2_TX_DATA 0x401F8024U, 0x2U, 0, 0, 0x401F8214U -#define IOMUXC_GPIO_EMC_04_XBAR1_INOUT06 0x401F8024U, 0x3U, 0x401F861CU, 0x0U, 0x401F8214U -#define IOMUXC_GPIO_EMC_04_FLEXIO1_FLEXIO04 0x401F8024U, 0x4U, 0, 0, 0x401F8214U -#define IOMUXC_GPIO_EMC_04_GPIO4_IO04 0x401F8024U, 0x5U, 0, 0, 0x401F8214U - -#define IOMUXC_GPIO_EMC_05_SEMC_DATA05 0x401F8028U, 0x0U, 0, 0, 0x401F8218U -#define IOMUXC_GPIO_EMC_05_FLEXPWM4_PWMB02 0x401F8028U, 0x1U, 0, 0, 0x401F8218U -#define IOMUXC_GPIO_EMC_05_SAI2_TX_SYNC 0x401F8028U, 0x2U, 0x401F85C4U, 0x0U, 0x401F8218U -#define IOMUXC_GPIO_EMC_05_XBAR1_INOUT07 0x401F8028U, 0x3U, 0x401F8620U, 0x0U, 0x401F8218U -#define IOMUXC_GPIO_EMC_05_FLEXIO1_FLEXIO05 0x401F8028U, 0x4U, 0, 0, 0x401F8218U -#define IOMUXC_GPIO_EMC_05_GPIO4_IO05 0x401F8028U, 0x5U, 0, 0, 0x401F8218U - -#define IOMUXC_GPIO_EMC_06_SEMC_DATA06 0x401F802CU, 0x0U, 0, 0, 0x401F821CU -#define IOMUXC_GPIO_EMC_06_FLEXPWM2_PWMA00 0x401F802CU, 0x1U, 0x401F8478U, 0x0U, 0x401F821CU -#define IOMUXC_GPIO_EMC_06_SAI2_TX_BCLK 0x401F802CU, 0x2U, 0x401F85C0U, 0x0U, 0x401F821CU -#define IOMUXC_GPIO_EMC_06_XBAR1_INOUT08 0x401F802CU, 0x3U, 0x401F8624U, 0x0U, 0x401F821CU -#define IOMUXC_GPIO_EMC_06_FLEXIO1_FLEXIO06 0x401F802CU, 0x4U, 0, 0, 0x401F821CU -#define IOMUXC_GPIO_EMC_06_GPIO4_IO06 0x401F802CU, 0x5U, 0, 0, 0x401F821CU - -#define IOMUXC_GPIO_EMC_07_SEMC_DATA07 0x401F8030U, 0x0U, 0, 0, 0x401F8220U -#define IOMUXC_GPIO_EMC_07_FLEXPWM2_PWMB00 0x401F8030U, 0x1U, 0x401F8488U, 0x0U, 0x401F8220U -#define IOMUXC_GPIO_EMC_07_SAI2_MCLK 0x401F8030U, 0x2U, 0x401F85B0U, 0x0U, 0x401F8220U -#define IOMUXC_GPIO_EMC_07_XBAR1_INOUT09 0x401F8030U, 0x3U, 0x401F8628U, 0x0U, 0x401F8220U -#define IOMUXC_GPIO_EMC_07_FLEXIO1_FLEXIO07 0x401F8030U, 0x4U, 0, 0, 0x401F8220U -#define IOMUXC_GPIO_EMC_07_GPIO4_IO07 0x401F8030U, 0x5U, 0, 0, 0x401F8220U - -#define IOMUXC_GPIO_EMC_08_SEMC_DM00 0x401F8034U, 0x0U, 0, 0, 0x401F8224U -#define IOMUXC_GPIO_EMC_08_FLEXPWM2_PWMA01 0x401F8034U, 0x1U, 0x401F847CU, 0x0U, 0x401F8224U -#define IOMUXC_GPIO_EMC_08_SAI2_RX_DATA 0x401F8034U, 0x2U, 0x401F85B8U, 0x0U, 0x401F8224U -#define IOMUXC_GPIO_EMC_08_XBAR1_INOUT17 0x401F8034U, 0x3U, 0x401F862CU, 0x0U, 0x401F8224U -#define IOMUXC_GPIO_EMC_08_FLEXIO1_FLEXIO08 0x401F8034U, 0x4U, 0, 0, 0x401F8224U -#define IOMUXC_GPIO_EMC_08_GPIO4_IO08 0x401F8034U, 0x5U, 0, 0, 0x401F8224U - -#define IOMUXC_GPIO_EMC_09_SEMC_ADDR00 0x401F8038U, 0x0U, 0, 0, 0x401F8228U -#define IOMUXC_GPIO_EMC_09_FLEXPWM2_PWMB01 0x401F8038U, 0x1U, 0x401F848CU, 0x0U, 0x401F8228U -#define IOMUXC_GPIO_EMC_09_SAI2_RX_SYNC 0x401F8038U, 0x2U, 0x401F85BCU, 0x0U, 0x401F8228U -#define IOMUXC_GPIO_EMC_09_FLEXCAN2_TX 0x401F8038U, 0x3U, 0, 0, 0x401F8228U -#define IOMUXC_GPIO_EMC_09_FLEXIO1_FLEXIO09 0x401F8038U, 0x4U, 0, 0, 0x401F8228U -#define IOMUXC_GPIO_EMC_09_GPIO4_IO09 0x401F8038U, 0x5U, 0, 0, 0x401F8228U - -#define IOMUXC_GPIO_EMC_10_SEMC_ADDR01 0x401F803CU, 0x0U, 0, 0, 0x401F822CU -#define IOMUXC_GPIO_EMC_10_FLEXPWM2_PWMA02 0x401F803CU, 0x1U, 0x401F8480U, 0x0U, 0x401F822CU -#define IOMUXC_GPIO_EMC_10_SAI2_RX_BCLK 0x401F803CU, 0x2U, 0x401F85B4U, 0x0U, 0x401F822CU -#define IOMUXC_GPIO_EMC_10_FLEXCAN2_RX 0x401F803CU, 0x3U, 0x401F8450U, 0x0U, 0x401F822CU -#define IOMUXC_GPIO_EMC_10_FLEXIO1_FLEXIO10 0x401F803CU, 0x4U, 0, 0, 0x401F822CU -#define IOMUXC_GPIO_EMC_10_GPIO4_IO10 0x401F803CU, 0x5U, 0, 0, 0x401F822CU - -#define IOMUXC_GPIO_EMC_11_SEMC_ADDR02 0x401F8040U, 0x0U, 0, 0, 0x401F8230U -#define IOMUXC_GPIO_EMC_11_FLEXPWM2_PWMB02 0x401F8040U, 0x1U, 0x401F8490U, 0x0U, 0x401F8230U -#define IOMUXC_GPIO_EMC_11_LPI2C4_SDA 0x401F8040U, 0x2U, 0x401F84E8U, 0x0U, 0x401F8230U -#define IOMUXC_GPIO_EMC_11_USDHC2_RESET_B 0x401F8040U, 0x3U, 0, 0, 0x401F8230U -#define IOMUXC_GPIO_EMC_11_FLEXIO1_FLEXIO11 0x401F8040U, 0x4U, 0, 0, 0x401F8230U -#define IOMUXC_GPIO_EMC_11_GPIO4_IO11 0x401F8040U, 0x5U, 0, 0, 0x401F8230U - -#define IOMUXC_GPIO_EMC_12_SEMC_ADDR03 0x401F8044U, 0x0U, 0, 0, 0x401F8234U -#define IOMUXC_GPIO_EMC_12_XBAR1_IN24 0x401F8044U, 0x1U, 0x401F8640U, 0x0U, 0x401F8234U -#define IOMUXC_GPIO_EMC_12_LPI2C4_SCL 0x401F8044U, 0x2U, 0x401F84E4U, 0x0U, 0x401F8234U -#define IOMUXC_GPIO_EMC_12_USDHC1_WP 0x401F8044U, 0x3U, 0x401F85D8U, 0x0U, 0x401F8234U -#define IOMUXC_GPIO_EMC_12_FLEXPWM1_PWMA03 0x401F8044U, 0x4U, 0x401F8454U, 0x1U, 0x401F8234U -#define IOMUXC_GPIO_EMC_12_GPIO4_IO12 0x401F8044U, 0x5U, 0, 0, 0x401F8234U - -#define IOMUXC_GPIO_EMC_13_SEMC_ADDR04 0x401F8048U, 0x0U, 0, 0, 0x401F8238U -#define IOMUXC_GPIO_EMC_13_XBAR1_IN25 0x401F8048U, 0x1U, 0x401F8650U, 0x1U, 0x401F8238U -#define IOMUXC_GPIO_EMC_13_LPUART3_TX 0x401F8048U, 0x2U, 0x401F853CU, 0x1U, 0x401F8238U -#define IOMUXC_GPIO_EMC_13_MQS_RIGHT 0x401F8048U, 0x3U, 0, 0, 0x401F8238U -#define IOMUXC_GPIO_EMC_13_FLEXPWM1_PWMB03 0x401F8048U, 0x4U, 0x401F8464U, 0x1U, 0x401F8238U -#define IOMUXC_GPIO_EMC_13_GPIO4_IO13 0x401F8048U, 0x5U, 0, 0, 0x401F8238U - -#define IOMUXC_GPIO_EMC_14_SEMC_ADDR05 0x401F804CU, 0x0U, 0, 0, 0x401F823CU -#define IOMUXC_GPIO_EMC_14_XBAR1_INOUT19 0x401F804CU, 0x1U, 0x401F8654U, 0x0U, 0x401F823CU -#define IOMUXC_GPIO_EMC_14_LPUART3_RX 0x401F804CU, 0x2U, 0x401F8538U, 0x1U, 0x401F823CU -#define IOMUXC_GPIO_EMC_14_MQS_LEFT 0x401F804CU, 0x3U, 0, 0, 0x401F823CU -#define IOMUXC_GPIO_EMC_14_LPSPI2_PCS1 0x401F804CU, 0x4U, 0, 0, 0x401F823CU -#define IOMUXC_GPIO_EMC_14_GPIO4_IO14 0x401F804CU, 0x5U, 0, 0, 0x401F823CU - -#define IOMUXC_GPIO_EMC_15_SEMC_ADDR06 0x401F8050U, 0x0U, 0, 0, 0x401F8240U -#define IOMUXC_GPIO_EMC_15_XBAR1_IN20 0x401F8050U, 0x1U, 0x401F8634U, 0x0U, 0x401F8240U -#define IOMUXC_GPIO_EMC_15_LPUART3_CTS_B 0x401F8050U, 0x2U, 0x401F8534U, 0x0U, 0x401F8240U -#define IOMUXC_GPIO_EMC_15_SPDIF_OUT 0x401F8050U, 0x3U, 0, 0, 0x401F8240U -#define IOMUXC_GPIO_EMC_15_QTIMER3_TIMER0 0x401F8050U, 0x4U, 0x401F857CU, 0x0U, 0x401F8240U -#define IOMUXC_GPIO_EMC_15_GPIO4_IO15 0x401F8050U, 0x5U, 0, 0, 0x401F8240U - -#define IOMUXC_GPIO_EMC_16_SEMC_ADDR07 0x401F8054U, 0x0U, 0, 0, 0x401F8244U -#define IOMUXC_GPIO_EMC_16_XBAR1_IN21 0x401F8054U, 0x1U, 0x401F8658U, 0x0U, 0x401F8244U -#define IOMUXC_GPIO_EMC_16_LPUART3_RTS_B 0x401F8054U, 0x2U, 0, 0, 0x401F8244U -#define IOMUXC_GPIO_EMC_16_SPDIF_IN 0x401F8054U, 0x3U, 0x401F85C8U, 0x1U, 0x401F8244U -#define IOMUXC_GPIO_EMC_16_QTIMER3_TIMER1 0x401F8054U, 0x4U, 0x401F8580U, 0x1U, 0x401F8244U -#define IOMUXC_GPIO_EMC_16_GPIO4_IO16 0x401F8054U, 0x5U, 0, 0, 0x401F8244U - -#define IOMUXC_GPIO_EMC_17_SEMC_ADDR08 0x401F8058U, 0x0U, 0, 0, 0x401F8248U -#define IOMUXC_GPIO_EMC_17_FLEXPWM4_PWMA03 0x401F8058U, 0x1U, 0x401F84A0U, 0x0U, 0x401F8248U -#define IOMUXC_GPIO_EMC_17_LPUART4_CTS_B 0x401F8058U, 0x2U, 0, 0, 0x401F8248U -#define IOMUXC_GPIO_EMC_17_FLEXCAN1_TX 0x401F8058U, 0x3U, 0, 0, 0x401F8248U -#define IOMUXC_GPIO_EMC_17_QTIMER3_TIMER2 0x401F8058U, 0x4U, 0x401F8584U, 0x0U, 0x401F8248U -#define IOMUXC_GPIO_EMC_17_GPIO4_IO17 0x401F8058U, 0x5U, 0, 0, 0x401F8248U - -#define IOMUXC_GPIO_EMC_18_SEMC_ADDR09 0x401F805CU, 0x0U, 0, 0, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_FLEXPWM4_PWMB03 0x401F805CU, 0x1U, 0, 0, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_LPUART4_RTS_B 0x401F805CU, 0x2U, 0, 0, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_FLEXCAN1_RX 0x401F805CU, 0x3U, 0x401F844CU, 0x1U, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_QTIMER3_TIMER3 0x401F805CU, 0x4U, 0x401F8588U, 0x0U, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_GPIO4_IO18 0x401F805CU, 0x5U, 0, 0, 0x401F824CU -#define IOMUXC_GPIO_EMC_18_SNVS_VIO_5_CTL 0x401F805CU, 0x6U, 0, 0, 0x401F824CU - -#define IOMUXC_GPIO_EMC_19_SEMC_ADDR11 0x401F8060U, 0x0U, 0, 0, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_FLEXPWM2_PWMA03 0x401F8060U, 0x1U, 0x401F8474U, 0x1U, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_LPUART4_TX 0x401F8060U, 0x2U, 0x401F8544U, 0x1U, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_ENET_RDATA01 0x401F8060U, 0x3U, 0x401F8438U, 0x0U, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_QTIMER2_TIMER0 0x401F8060U, 0x4U, 0x401F856CU, 0x0U, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_GPIO4_IO19 0x401F8060U, 0x5U, 0, 0, 0x401F8250U -#define IOMUXC_GPIO_EMC_19_SNVS_VIO_5 0x401F8060U, 0x6U, 0, 0, 0x401F8250U - -#define IOMUXC_GPIO_EMC_20_SEMC_ADDR12 0x401F8064U, 0x0U, 0, 0, 0x401F8254U -#define IOMUXC_GPIO_EMC_20_FLEXPWM2_PWMB03 0x401F8064U, 0x1U, 0x401F8484U, 0x1U, 0x401F8254U -#define IOMUXC_GPIO_EMC_20_LPUART4_RX 0x401F8064U, 0x2U, 0x401F8540U, 0x1U, 0x401F8254U -#define IOMUXC_GPIO_EMC_20_ENET_RDATA00 0x401F8064U, 0x3U, 0x401F8434U, 0x0U, 0x401F8254U -#define IOMUXC_GPIO_EMC_20_QTIMER2_TIMER1 0x401F8064U, 0x4U, 0x401F8570U, 0x0U, 0x401F8254U -#define IOMUXC_GPIO_EMC_20_GPIO4_IO20 0x401F8064U, 0x5U, 0, 0, 0x401F8254U - -#define IOMUXC_GPIO_EMC_21_SEMC_BA0 0x401F8068U, 0x0U, 0, 0, 0x401F8258U -#define IOMUXC_GPIO_EMC_21_FLEXPWM3_PWMA03 0x401F8068U, 0x1U, 0, 0, 0x401F8258U -#define IOMUXC_GPIO_EMC_21_LPI2C3_SDA 0x401F8068U, 0x2U, 0x401F84E0U, 0x0U, 0x401F8258U -#define IOMUXC_GPIO_EMC_21_ENET_TDATA01 0x401F8068U, 0x3U, 0, 0, 0x401F8258U -#define IOMUXC_GPIO_EMC_21_QTIMER2_TIMER2 0x401F8068U, 0x4U, 0x401F8574U, 0x0U, 0x401F8258U -#define IOMUXC_GPIO_EMC_21_GPIO4_IO21 0x401F8068U, 0x5U, 0, 0, 0x401F8258U - -#define IOMUXC_GPIO_EMC_22_SEMC_BA1 0x401F806CU, 0x0U, 0, 0, 0x401F825CU -#define IOMUXC_GPIO_EMC_22_FLEXPWM3_PWMB03 0x401F806CU, 0x1U, 0, 0, 0x401F825CU -#define IOMUXC_GPIO_EMC_22_LPI2C3_SCL 0x401F806CU, 0x2U, 0x401F84DCU, 0x0U, 0x401F825CU -#define IOMUXC_GPIO_EMC_22_ENET_TDATA00 0x401F806CU, 0x3U, 0, 0, 0x401F825CU -#define IOMUXC_GPIO_EMC_22_QTIMER2_TIMER3 0x401F806CU, 0x4U, 0x401F8578U, 0x0U, 0x401F825CU -#define IOMUXC_GPIO_EMC_22_GPIO4_IO22 0x401F806CU, 0x5U, 0, 0, 0x401F825CU - -#define IOMUXC_GPIO_EMC_23_SEMC_ADDR10 0x401F8070U, 0x0U, 0, 0, 0x401F8260U -#define IOMUXC_GPIO_EMC_23_FLEXPWM1_PWMA00 0x401F8070U, 0x1U, 0x401F8458U, 0x0U, 0x401F8260U -#define IOMUXC_GPIO_EMC_23_LPUART5_TX 0x401F8070U, 0x2U, 0x401F854CU, 0x0U, 0x401F8260U -#define IOMUXC_GPIO_EMC_23_ENET_RX_EN 0x401F8070U, 0x3U, 0x401F843CU, 0x0U, 0x401F8260U -#define IOMUXC_GPIO_EMC_23_GPT1_CAPTURE2 0x401F8070U, 0x4U, 0, 0, 0x401F8260U -#define IOMUXC_GPIO_EMC_23_GPIO4_IO23 0x401F8070U, 0x5U, 0, 0, 0x401F8260U - -#define IOMUXC_GPIO_EMC_24_SEMC_CAS 0x401F8074U, 0x0U, 0, 0, 0x401F8264U -#define IOMUXC_GPIO_EMC_24_FLEXPWM1_PWMB00 0x401F8074U, 0x1U, 0x401F8468U, 0x0U, 0x401F8264U -#define IOMUXC_GPIO_EMC_24_LPUART5_RX 0x401F8074U, 0x2U, 0x401F8548U, 0x0U, 0x401F8264U -#define IOMUXC_GPIO_EMC_24_ENET_TX_EN 0x401F8074U, 0x3U, 0, 0, 0x401F8264U -#define IOMUXC_GPIO_EMC_24_GPT1_CAPTURE1 0x401F8074U, 0x4U, 0, 0, 0x401F8264U -#define IOMUXC_GPIO_EMC_24_GPIO4_IO24 0x401F8074U, 0x5U, 0, 0, 0x401F8264U - -#define IOMUXC_GPIO_EMC_25_SEMC_RAS 0x401F8078U, 0x0U, 0, 0, 0x401F8268U -#define IOMUXC_GPIO_EMC_25_FLEXPWM1_PWMA01 0x401F8078U, 0x1U, 0x401F845CU, 0x0U, 0x401F8268U -#define IOMUXC_GPIO_EMC_25_LPUART6_TX 0x401F8078U, 0x2U, 0x401F8554U, 0x0U, 0x401F8268U -#define IOMUXC_GPIO_EMC_25_ENET_TX_CLK 0x401F8078U, 0x3U, 0x401F8448U, 0x0U, 0x401F8268U -#define IOMUXC_GPIO_EMC_25_ENET_REF_CLK 0x401F8078U, 0x4U, 0x401F842CU, 0x0U, 0x401F8268U -#define IOMUXC_GPIO_EMC_25_GPIO4_IO25 0x401F8078U, 0x5U, 0, 0, 0x401F8268U - -#define IOMUXC_GPIO_EMC_26_SEMC_CLK 0x401F807CU, 0x0U, 0, 0, 0x401F826CU -#define IOMUXC_GPIO_EMC_26_FLEXPWM1_PWMB01 0x401F807CU, 0x1U, 0x401F846CU, 0x0U, 0x401F826CU -#define IOMUXC_GPIO_EMC_26_LPUART6_RX 0x401F807CU, 0x2U, 0x401F8550U, 0x0U, 0x401F826CU -#define IOMUXC_GPIO_EMC_26_ENET_RX_ER 0x401F807CU, 0x3U, 0x401F8440U, 0x0U, 0x401F826CU -#define IOMUXC_GPIO_EMC_26_FLEXIO1_FLEXIO12 0x401F807CU, 0x4U, 0, 0, 0x401F826CU -#define IOMUXC_GPIO_EMC_26_GPIO4_IO26 0x401F807CU, 0x5U, 0, 0, 0x401F826CU - -#define IOMUXC_GPIO_EMC_27_SEMC_CKE 0x401F8080U, 0x0U, 0, 0, 0x401F8270U -#define IOMUXC_GPIO_EMC_27_FLEXPWM1_PWMA02 0x401F8080U, 0x1U, 0x401F8460U, 0x0U, 0x401F8270U -#define IOMUXC_GPIO_EMC_27_LPUART5_RTS_B 0x401F8080U, 0x2U, 0, 0, 0x401F8270U -#define IOMUXC_GPIO_EMC_27_LPSPI1_SCK 0x401F8080U, 0x3U, 0x401F84F0U, 0x0U, 0x401F8270U -#define IOMUXC_GPIO_EMC_27_FLEXIO1_FLEXIO13 0x401F8080U, 0x4U, 0, 0, 0x401F8270U -#define IOMUXC_GPIO_EMC_27_GPIO4_IO27 0x401F8080U, 0x5U, 0, 0, 0x401F8270U - -#define IOMUXC_GPIO_EMC_28_SEMC_WE 0x401F8084U, 0x0U, 0, 0, 0x401F8274U -#define IOMUXC_GPIO_EMC_28_FLEXPWM1_PWMB02 0x401F8084U, 0x1U, 0x401F8470U, 0x0U, 0x401F8274U -#define IOMUXC_GPIO_EMC_28_LPUART5_CTS_B 0x401F8084U, 0x2U, 0, 0, 0x401F8274U -#define IOMUXC_GPIO_EMC_28_LPSPI1_SDO 0x401F8084U, 0x3U, 0x401F84F8U, 0x0U, 0x401F8274U -#define IOMUXC_GPIO_EMC_28_FLEXIO1_FLEXIO14 0x401F8084U, 0x4U, 0, 0, 0x401F8274U -#define IOMUXC_GPIO_EMC_28_GPIO4_IO28 0x401F8084U, 0x5U, 0, 0, 0x401F8274U - -#define IOMUXC_GPIO_EMC_29_SEMC_CS0 0x401F8088U, 0x0U, 0, 0, 0x401F8278U -#define IOMUXC_GPIO_EMC_29_FLEXPWM3_PWMA00 0x401F8088U, 0x1U, 0, 0, 0x401F8278U -#define IOMUXC_GPIO_EMC_29_LPUART6_RTS_B 0x401F8088U, 0x2U, 0, 0, 0x401F8278U -#define IOMUXC_GPIO_EMC_29_LPSPI1_SDI 0x401F8088U, 0x3U, 0x401F84F4U, 0x0U, 0x401F8278U -#define IOMUXC_GPIO_EMC_29_FLEXIO1_FLEXIO15 0x401F8088U, 0x4U, 0, 0, 0x401F8278U -#define IOMUXC_GPIO_EMC_29_GPIO4_IO29 0x401F8088U, 0x5U, 0, 0, 0x401F8278U - -#define IOMUXC_GPIO_EMC_30_SEMC_DATA08 0x401F808CU, 0x0U, 0, 0, 0x401F827CU -#define IOMUXC_GPIO_EMC_30_FLEXPWM3_PWMB00 0x401F808CU, 0x1U, 0, 0, 0x401F827CU -#define IOMUXC_GPIO_EMC_30_LPUART6_CTS_B 0x401F808CU, 0x2U, 0, 0, 0x401F827CU -#define IOMUXC_GPIO_EMC_30_LPSPI1_PCS0 0x401F808CU, 0x3U, 0x401F84ECU, 0x1U, 0x401F827CU -#define IOMUXC_GPIO_EMC_30_CSI_DATA23 0x401F808CU, 0x4U, 0, 0, 0x401F827CU -#define IOMUXC_GPIO_EMC_30_GPIO4_IO30 0x401F808CU, 0x5U, 0, 0, 0x401F827CU - -#define IOMUXC_GPIO_EMC_31_SEMC_DATA09 0x401F8090U, 0x0U, 0, 0, 0x401F8280U -#define IOMUXC_GPIO_EMC_31_FLEXPWM3_PWMA01 0x401F8090U, 0x1U, 0, 0, 0x401F8280U -#define IOMUXC_GPIO_EMC_31_LPUART7_TX 0x401F8090U, 0x2U, 0x401F855CU, 0x1U, 0x401F8280U -#define IOMUXC_GPIO_EMC_31_LPSPI1_PCS1 0x401F8090U, 0x3U, 0, 0, 0x401F8280U -#define IOMUXC_GPIO_EMC_31_CSI_DATA22 0x401F8090U, 0x4U, 0, 0, 0x401F8280U -#define IOMUXC_GPIO_EMC_31_GPIO4_IO31 0x401F8090U, 0x5U, 0, 0, 0x401F8280U - -#define IOMUXC_GPIO_EMC_32_SEMC_DATA10 0x401F8094U, 0x0U, 0, 0, 0x401F8284U -#define IOMUXC_GPIO_EMC_32_FLEXPWM3_PWMB01 0x401F8094U, 0x1U, 0, 0, 0x401F8284U -#define IOMUXC_GPIO_EMC_32_LPUART7_RX 0x401F8094U, 0x2U, 0x401F8558U, 0x1U, 0x401F8284U -#define IOMUXC_GPIO_EMC_32_CCM_PMIC_RDY 0x401F8094U, 0x3U, 0x401F83FCU, 0x4U, 0x401F8284U -#define IOMUXC_GPIO_EMC_32_CSI_DATA21 0x401F8094U, 0x4U, 0, 0, 0x401F8284U -#define IOMUXC_GPIO_EMC_32_GPIO3_IO18 0x401F8094U, 0x5U, 0, 0, 0x401F8284U - -#define IOMUXC_GPIO_EMC_33_SEMC_DATA11 0x401F8098U, 0x0U, 0, 0, 0x401F8288U -#define IOMUXC_GPIO_EMC_33_FLEXPWM3_PWMA02 0x401F8098U, 0x1U, 0, 0, 0x401F8288U -#define IOMUXC_GPIO_EMC_33_USDHC1_RESET_B 0x401F8098U, 0x2U, 0, 0, 0x401F8288U -#define IOMUXC_GPIO_EMC_33_SAI3_RX_DATA 0x401F8098U, 0x3U, 0, 0, 0x401F8288U -#define IOMUXC_GPIO_EMC_33_CSI_DATA20 0x401F8098U, 0x4U, 0, 0, 0x401F8288U -#define IOMUXC_GPIO_EMC_33_GPIO3_IO19 0x401F8098U, 0x5U, 0, 0, 0x401F8288U - -#define IOMUXC_GPIO_EMC_34_SEMC_DATA12 0x401F809CU, 0x0U, 0, 0, 0x401F828CU -#define IOMUXC_GPIO_EMC_34_FLEXPWM3_PWMB02 0x401F809CU, 0x1U, 0, 0, 0x401F828CU -#define IOMUXC_GPIO_EMC_34_USDHC1_VSELECT 0x401F809CU, 0x2U, 0, 0, 0x401F828CU -#define IOMUXC_GPIO_EMC_34_SAI3_RX_SYNC 0x401F809CU, 0x3U, 0, 0, 0x401F828CU -#define IOMUXC_GPIO_EMC_34_CSI_DATA19 0x401F809CU, 0x4U, 0, 0, 0x401F828CU -#define IOMUXC_GPIO_EMC_34_GPIO3_IO20 0x401F809CU, 0x5U, 0, 0, 0x401F828CU - -#define IOMUXC_GPIO_EMC_35_SEMC_DATA13 0x401F80A0U, 0x0U, 0, 0, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_XBAR1_INOUT18 0x401F80A0U, 0x1U, 0x401F8630U, 0x0U, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_GPT1_COMPARE1 0x401F80A0U, 0x2U, 0, 0, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_SAI3_RX_BCLK 0x401F80A0U, 0x3U, 0, 0, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_CSI_DATA18 0x401F80A0U, 0x4U, 0, 0, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_GPIO3_IO21 0x401F80A0U, 0x5U, 0, 0, 0x401F8290U -#define IOMUXC_GPIO_EMC_35_USDHC1_CD_B 0x401F80A0U, 0x6U, 0x401F85D4U, 0x0U, 0x401F8290U - -#define IOMUXC_GPIO_EMC_36_SEMC_DATA14 0x401F80A4U, 0x0U, 0, 0, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_XBAR1_IN22 0x401F80A4U, 0x1U, 0x401F8638U, 0x0U, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_GPT1_COMPARE2 0x401F80A4U, 0x2U, 0, 0, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_SAI3_TX_DATA 0x401F80A4U, 0x3U, 0, 0, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_CSI_DATA17 0x401F80A4U, 0x4U, 0, 0, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_GPIO3_IO22 0x401F80A4U, 0x5U, 0, 0, 0x401F8294U -#define IOMUXC_GPIO_EMC_36_USDHC1_WP 0x401F80A4U, 0x6U, 0x401F85D8U, 0x1U, 0x401F8294U - -#define IOMUXC_GPIO_EMC_37_SEMC_DATA15 0x401F80A8U, 0x0U, 0, 0, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_XBAR1_IN23 0x401F80A8U, 0x1U, 0x401F863CU, 0x0U, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_GPT1_COMPARE3 0x401F80A8U, 0x2U, 0, 0, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_SAI3_MCLK 0x401F80A8U, 0x3U, 0, 0, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_CSI_DATA16 0x401F80A8U, 0x4U, 0, 0, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_GPIO3_IO23 0x401F80A8U, 0x5U, 0, 0, 0x401F8298U -#define IOMUXC_GPIO_EMC_37_USDHC2_WP 0x401F80A8U, 0x6U, 0x401F8608U, 0x0U, 0x401F8298U - -#define IOMUXC_GPIO_EMC_38_SEMC_DM01 0x401F80ACU, 0x0U, 0, 0, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_FLEXPWM1_PWMA03 0x401F80ACU, 0x1U, 0x401F8454U, 0x2U, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_LPUART8_TX 0x401F80ACU, 0x2U, 0x401F8564U, 0x2U, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_SAI3_TX_BCLK 0x401F80ACU, 0x3U, 0, 0, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_CSI_FIELD 0x401F80ACU, 0x4U, 0, 0, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_GPIO3_IO24 0x401F80ACU, 0x5U, 0, 0, 0x401F829CU -#define IOMUXC_GPIO_EMC_38_USDHC2_VSELECT 0x401F80ACU, 0x6U, 0, 0, 0x401F829CU - -#define IOMUXC_GPIO_EMC_39_SEMC_DQS 0x401F80B0U, 0x0U, 0, 0, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_FLEXPWM1_PWMB03 0x401F80B0U, 0x1U, 0x401F8464U, 0x2U, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_LPUART8_RX 0x401F80B0U, 0x2U, 0x401F8560U, 0x2U, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_SAI3_TX_SYNC 0x401F80B0U, 0x3U, 0, 0, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_WDOG1_WDOG_B 0x401F80B0U, 0x4U, 0, 0, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_GPIO3_IO25 0x401F80B0U, 0x5U, 0, 0, 0x401F82A0U -#define IOMUXC_GPIO_EMC_39_USDHC2_CD_B 0x401F80B0U, 0x6U, 0x401F85E0U, 0x1U, 0x401F82A0U - -#define IOMUXC_GPIO_EMC_40_SEMC_RDY 0x401F80B4U, 0x0U, 0, 0, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_GPT2_CAPTURE2 0x401F80B4U, 0x1U, 0, 0, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_LPSPI1_PCS2 0x401F80B4U, 0x2U, 0, 0, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_USB_OTG2_OC 0x401F80B4U, 0x3U, 0x401F85CCU, 0x1U, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_ENET_MDC 0x401F80B4U, 0x4U, 0, 0, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_GPIO3_IO26 0x401F80B4U, 0x5U, 0, 0, 0x401F82A4U -#define IOMUXC_GPIO_EMC_40_USDHC2_RESET_B 0x401F80B4U, 0x6U, 0, 0, 0x401F82A4U - -#define IOMUXC_GPIO_EMC_41_SEMC_CSX00 0x401F80B8U, 0x0U, 0, 0, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_GPT2_CAPTURE1 0x401F80B8U, 0x1U, 0, 0, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_LPSPI1_PCS3 0x401F80B8U, 0x2U, 0, 0, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_USB_OTG2_PWR 0x401F80B8U, 0x3U, 0, 0, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_ENET_MDIO 0x401F80B8U, 0x4U, 0x401F8430U, 0x1U, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_GPIO3_IO27 0x401F80B8U, 0x5U, 0, 0, 0x401F82A8U -#define IOMUXC_GPIO_EMC_41_USDHC1_VSELECT 0x401F80B8U, 0x6U, 0, 0, 0x401F82A8U - -#define IOMUXC_GPIO_AD_B0_00_FLEXPWM2_PWMA03 0x401F80BCU, 0x0U, 0x401F8474U, 0x2U, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_XBAR1_INOUT14 0x401F80BCU, 0x1U, 0x401F8644U, 0x0U, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_REF_CLK_32K 0x401F80BCU, 0x2U, 0, 0, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_USB_OTG2_ID 0x401F80BCU, 0x3U, 0x401F83F8U, 0x0U, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_LPI2C1_SCLS 0x401F80BCU, 0x4U, 0, 0, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_GPIO1_IO00 0x401F80BCU, 0x5U, 0, 0, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_USDHC1_RESET_B 0x401F80BCU, 0x6U, 0, 0, 0x401F82ACU -#define IOMUXC_GPIO_AD_B0_00_LPSPI3_SCK 0x401F80BCU, 0x7U, 0x401F8510U, 0x0U, 0x401F82ACU - -#define IOMUXC_GPIO_AD_B0_01_FLEXPWM2_PWMB03 0x401F80C0U, 0x0U, 0x401F8484U, 0x2U, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_XBAR1_INOUT15 0x401F80C0U, 0x1U, 0x401F8648U, 0x0U, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_REF_CLK_24M 0x401F80C0U, 0x2U, 0, 0, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_USB_OTG1_ID 0x401F80C0U, 0x3U, 0x401F83F4U, 0x0U, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_LPI2C1_SDAS 0x401F80C0U, 0x4U, 0, 0, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_GPIO1_IO01 0x401F80C0U, 0x5U, 0, 0, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_EWM_OUT_B 0x401F80C0U, 0x6U, 0, 0, 0x401F82B0U -#define IOMUXC_GPIO_AD_B0_01_LPSPI3_SDO 0x401F80C0U, 0x7U, 0x401F8518U, 0x0U, 0x401F82B0U - -#define IOMUXC_GPIO_AD_B0_02_FLEXCAN2_TX 0x401F80C4U, 0x0U, 0, 0, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_XBAR1_INOUT16 0x401F80C4U, 0x1U, 0x401F864CU, 0x0U, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_LPUART6_TX 0x401F80C4U, 0x2U, 0x401F8554U, 0x1U, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_USB_OTG1_PWR 0x401F80C4U, 0x3U, 0, 0, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_FLEXPWM1_PWMX00 0x401F80C4U, 0x4U, 0, 0, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_GPIO1_IO02 0x401F80C4U, 0x5U, 0, 0, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_LPI2C1_HREQ 0x401F80C4U, 0x6U, 0, 0, 0x401F82B4U -#define IOMUXC_GPIO_AD_B0_02_LPSPI3_SDI 0x401F80C4U, 0x7U, 0x401F8514U, 0x0U, 0x401F82B4U - -#define IOMUXC_GPIO_AD_B0_03_FLEXCAN2_RX 0x401F80C8U, 0x0U, 0x401F8450U, 0x1U, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_XBAR1_INOUT17 0x401F80C8U, 0x1U, 0x401F862CU, 0x1U, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_LPUART6_RX 0x401F80C8U, 0x2U, 0x401F8550U, 0x1U, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_USB_OTG1_OC 0x401F80C8U, 0x3U, 0x401F85D0U, 0x0U, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_FLEXPWM1_PWMX01 0x401F80C8U, 0x4U, 0, 0, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_GPIO1_IO03 0x401F80C8U, 0x5U, 0, 0, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_REF_CLK_24M 0x401F80C8U, 0x6U, 0, 0, 0x401F82B8U -#define IOMUXC_GPIO_AD_B0_03_LPSPI3_PCS0 0x401F80C8U, 0x7U, 0x401F850CU, 0x0U, 0x401F82B8U - -#define IOMUXC_GPIO_AD_B0_04_SRC_BOOT_MODE00 0x401F80CCU, 0x0U, 0, 0, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_MQS_RIGHT 0x401F80CCU, 0x1U, 0, 0, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_ENET_TX_DATA03 0x401F80CCU, 0x2U, 0, 0, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_SAI2_TX_SYNC 0x401F80CCU, 0x3U, 0x401F85C4U, 0x1U, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_CSI_DATA09 0x401F80CCU, 0x4U, 0x401F841CU, 0x1U, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_GPIO1_IO04 0x401F80CCU, 0x5U, 0, 0, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_PIT_TRIGGER00 0x401F80CCU, 0x6U, 0, 0, 0x401F82BCU -#define IOMUXC_GPIO_AD_B0_04_LPSPI3_PCS1 0x401F80CCU, 0x7U, 0, 0, 0x401F82BCU - -#define IOMUXC_GPIO_AD_B0_05_SRC_BOOT_MODE01 0x401F80D0U, 0x0U, 0, 0, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_MQS_LEFT 0x401F80D0U, 0x1U, 0, 0, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_ENET_TX_DATA02 0x401F80D0U, 0x2U, 0, 0, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_SAI2_TX_BCLK 0x401F80D0U, 0x3U, 0x401F85C0U, 0x1U, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_CSI_DATA08 0x401F80D0U, 0x4U, 0x401F8418U, 0x1U, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_GPIO1_IO05 0x401F80D0U, 0x5U, 0, 0, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_XBAR1_INOUT17 0x401F80D0U, 0x6U, 0x401F862CU, 0x2U, 0x401F82C0U -#define IOMUXC_GPIO_AD_B0_05_LPSPI3_PCS2 0x401F80D0U, 0x7U, 0, 0, 0x401F82C0U - -#define IOMUXC_GPIO_AD_B0_06_JTAG_TMS 0x401F80D4U, 0x0U, 0, 0, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_GPT2_COMPARE1 0x401F80D4U, 0x1U, 0, 0, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_ENET_RX_CLK 0x401F80D4U, 0x2U, 0, 0, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_SAI2_RX_BCLK 0x401F80D4U, 0x3U, 0x401F85B4U, 0x1U, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_CSI_DATA07 0x401F80D4U, 0x4U, 0x401F8414U, 0x1U, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_GPIO1_IO06 0x401F80D4U, 0x5U, 0, 0, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_XBAR1_INOUT18 0x401F80D4U, 0x6U, 0x401F8630U, 0x1U, 0x401F82C4U -#define IOMUXC_GPIO_AD_B0_06_LPSPI3_PCS3 0x401F80D4U, 0x7U, 0, 0, 0x401F82C4U - -#define IOMUXC_GPIO_AD_B0_07_JTAG_TCK 0x401F80D8U, 0x0U, 0, 0, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_GPT2_COMPARE2 0x401F80D8U, 0x1U, 0, 0, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_ENET_TX_ER 0x401F80D8U, 0x2U, 0, 0, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_SAI2_RX_SYNC 0x401F80D8U, 0x3U, 0x401F85BCU, 0x1U, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_CSI_DATA06 0x401F80D8U, 0x4U, 0x401F8410U, 0x1U, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_GPIO1_IO07 0x401F80D8U, 0x5U, 0, 0, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_XBAR1_INOUT19 0x401F80D8U, 0x6U, 0x401F8654U, 0x1U, 0x401F82C8U -#define IOMUXC_GPIO_AD_B0_07_ENET_1588_EVENT3_OUT 0x401F80D8U, 0x7U, 0, 0, 0x401F82C8U - -#define IOMUXC_GPIO_AD_B0_08_JTAG_MOD 0x401F80DCU, 0x0U, 0, 0, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_GPT2_COMPARE3 0x401F80DCU, 0x1U, 0, 0, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_ENET_RX_DATA03 0x401F80DCU, 0x2U, 0, 0, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_SAI2_RX_DATA 0x401F80DCU, 0x3U, 0x401F85B8U, 0x1U, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_CSI_DATA05 0x401F80DCU, 0x4U, 0x401F840CU, 0x1U, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_GPIO1_IO08 0x401F80DCU, 0x5U, 0, 0, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_XBAR1_IN20 0x401F80DCU, 0x6U, 0x401F8634U, 0x1U, 0x401F82CCU -#define IOMUXC_GPIO_AD_B0_08_ENET_1588_EVENT3_IN 0x401F80DCU, 0x7U, 0, 0, 0x401F82CCU - -#define IOMUXC_GPIO_AD_B0_09_JTAG_TDI 0x401F80E0U, 0x0U, 0, 0, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_FLEXPWM2_PWMA03 0x401F80E0U, 0x1U, 0x401F8474U, 0x3U, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_ENET_RX_DATA02 0x401F80E0U, 0x2U, 0, 0, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_SAI2_TX_DATA 0x401F80E0U, 0x3U, 0, 0, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_CSI_DATA04 0x401F80E0U, 0x4U, 0x401F8408U, 0x1U, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_GPIO1_IO09 0x401F80E0U, 0x5U, 0, 0, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_XBAR1_IN21 0x401F80E0U, 0x6U, 0x401F8658U, 0x1U, 0x401F82D0U -#define IOMUXC_GPIO_AD_B0_09_GPT2_CLK 0x401F80E0U, 0x7U, 0, 0, 0x401F82D0U - -#define IOMUXC_GPIO_AD_B0_10_JTAG_TDO 0x401F80E4U, 0x0U, 0, 0, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_FLEXPWM1_PWMA03 0x401F80E4U, 0x1U, 0x401F8454U, 0x3U, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_ENET_CRS 0x401F80E4U, 0x2U, 0, 0, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_SAI2_MCLK 0x401F80E4U, 0x3U, 0x401F85B0U, 0x1U, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_CSI_DATA03 0x401F80E4U, 0x4U, 0x401F8404U, 0x1U, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_GPIO1_IO10 0x401F80E4U, 0x5U, 0, 0, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_XBAR1_IN22 0x401F80E4U, 0x6U, 0x401F8638U, 0x1U, 0x401F82D4U -#define IOMUXC_GPIO_AD_B0_10_ENET_1588_EVENT0_OUT 0x401F80E4U, 0x7U, 0, 0, 0x401F82D4U - -#define IOMUXC_GPIO_AD_B0_11_JTAG_TRSTB 0x401F80E8U, 0x0U, 0, 0, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_FLEXPWM1_PWMB03 0x401F80E8U, 0x1U, 0x401F8464U, 0x3U, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_ENET_COL 0x401F80E8U, 0x2U, 0, 0, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_WDOG1_WDOG_B 0x401F80E8U, 0x3U, 0, 0, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_CSI_DATA02 0x401F80E8U, 0x4U, 0x401F8400U, 0x1U, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_GPIO1_IO11 0x401F80E8U, 0x5U, 0, 0, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_XBAR1_IN23 0x401F80E8U, 0x6U, 0x401F863CU, 0x1U, 0x401F82D8U -#define IOMUXC_GPIO_AD_B0_11_ENET_1588_EVENT0_IN 0x401F80E8U, 0x7U, 0x401F8444U, 0x1U, 0x401F82D8U - -#define IOMUXC_GPIO_AD_B0_12_LPI2C4_SCL 0x401F80ECU, 0x0U, 0x401F84E4U, 0x1U, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_CCM_PMIC_READY 0x401F80ECU, 0x1U, 0x401F83FCU, 0x1U, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_LPUART1_TX 0x401F80ECU, 0x2U, 0, 0, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_WDOG2_WDOG_B 0x401F80ECU, 0x3U, 0, 0, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_FLEXPWM1_PWMX02 0x401F80ECU, 0x4U, 0, 0, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_GPIO1_IO12 0x401F80ECU, 0x5U, 0, 0, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_ENET_1588_EVENT1_OUT 0x401F80ECU, 0x6U, 0, 0, 0x401F82DCU -#define IOMUXC_GPIO_AD_B0_12_NMI_GLUE_NMI 0x401F80ECU, 0x7U, 0x401F8568U, 0x0U, 0x401F82DCU - -#define IOMUXC_GPIO_AD_B0_13_LPI2C4_SDA 0x401F80F0U, 0x0U, 0x401F84E8U, 0x1U, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_GPT1_CLK 0x401F80F0U, 0x1U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_LPUART1_RX 0x401F80F0U, 0x2U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_EWM_OUT_B 0x401F80F0U, 0x3U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_FLEXPWM1_PWMX03 0x401F80F0U, 0x4U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_GPIO1_IO13 0x401F80F0U, 0x5U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_ENET_1588_EVENT1_IN 0x401F80F0U, 0x6U, 0, 0, 0x401F82E0U -#define IOMUXC_GPIO_AD_B0_13_REF_CLK_24M 0x401F80F0U, 0x7U, 0, 0, 0x401F82E0U - -#define IOMUXC_GPIO_AD_B0_14_USB_OTG2_OC 0x401F80F4U, 0x0U, 0x401F85CCU, 0x0U, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_XBAR1_IN24 0x401F80F4U, 0x1U, 0x401F8640U, 0x1U, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_LPUART1_CTS_B 0x401F80F4U, 0x2U, 0, 0, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_ENET_1588_EVENT0_OUT 0x401F80F4U, 0x3U, 0, 0, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_CSI_VSYNC 0x401F80F4U, 0x4U, 0x401F8428U, 0x0U, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_GPIO1_IO14 0x401F80F4U, 0x5U, 0, 0, 0x401F82E4U -#define IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX 0x401F80F4U, 0x6U, 0, 0, 0x401F82E4U - -#define IOMUXC_GPIO_AD_B0_15_USB_OTG2_PWR 0x401F80F8U, 0x0U, 0, 0, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_XBAR1_IN25 0x401F80F8U, 0x1U, 0x401F8650U, 0x0U, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_LPUART1_RTS_B 0x401F80F8U, 0x2U, 0, 0, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_ENET_1588_EVENT0_IN 0x401F80F8U, 0x3U, 0x401F8444U, 0x0U, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_CSI_HSYNC 0x401F80F8U, 0x4U, 0x401F8420U, 0x0U, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_GPIO1_IO15 0x401F80F8U, 0x5U, 0, 0, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX 0x401F80F8U, 0x6U, 0x401F8450U, 0x2U, 0x401F82E8U -#define IOMUXC_GPIO_AD_B0_15_WDOG1_WDOG_RST_B_DEB 0x401F80F8U, 0x7U, 0, 0, 0x401F82E8U - -#define IOMUXC_GPIO_AD_B1_00_USB_OTG2_ID 0x401F80FCU, 0x0U, 0x401F83F8U, 0x1U, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_QTIMER3_TIMER0 0x401F80FCU, 0x1U, 0x401F857CU, 0x1U, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_LPUART2_CTS_B 0x401F80FCU, 0x2U, 0, 0, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL 0x401F80FCU, 0x3U, 0x401F84CCU, 0x1U, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_WDOG1_B 0x401F80FCU, 0x4U, 0, 0, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_GPIO1_IO16 0x401F80FCU, 0x5U, 0, 0, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_USDHC1_WP 0x401F80FCU, 0x6U, 0x401F85D8U, 0x2U, 0x401F82ECU -#define IOMUXC_GPIO_AD_B1_00_KPP_ROW07 0x401F80FCU, 0x7U, 0, 0, 0x401F82ECU - -#define IOMUXC_GPIO_AD_B1_01_USB_OTG1_PWR 0x401F8100U, 0x0U, 0, 0, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_QTIMER3_TIMER1 0x401F8100U, 0x1U, 0x401F8580U, 0x0U, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_LPUART2_RTS_B 0x401F8100U, 0x2U, 0, 0, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA 0x401F8100U, 0x3U, 0x401F84D0U, 0x1U, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_CCM_PMIC_READY 0x401F8100U, 0x4U, 0x401F83FCU, 0x2U, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_GPIO1_IO17 0x401F8100U, 0x5U, 0, 0, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_USDHC1_VSELECT 0x401F8100U, 0x6U, 0, 0, 0x401F82F0U -#define IOMUXC_GPIO_AD_B1_01_KPP_COL07 0x401F8100U, 0x7U, 0, 0, 0x401F82F0U - -#define IOMUXC_GPIO_AD_B1_02_USB_OTG1_ID 0x401F8104U, 0x0U, 0x401F83F4U, 0x1U, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_QTIMER3_TIMER2 0x401F8104U, 0x1U, 0x401F8584U, 0x1U, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_LPUART2_TX 0x401F8104U, 0x2U, 0x401F8530U, 0x1U, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_SPDIF_OUT 0x401F8104U, 0x3U, 0, 0, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_ENET_1588_EVENT2_OUT 0x401F8104U, 0x4U, 0, 0, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_GPIO1_IO18 0x401F8104U, 0x5U, 0, 0, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_USDHC1_CD_B 0x401F8104U, 0x6U, 0x401F85D4U, 0x1U, 0x401F82F4U -#define IOMUXC_GPIO_AD_B1_02_KPP_ROW06 0x401F8104U, 0x7U, 0, 0, 0x401F82F4U - -#define IOMUXC_GPIO_AD_B1_03_USB_OTG1_OC 0x401F8108U, 0x0U, 0x401F85D0U, 0x1U, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_QTIMER3_TIMER3 0x401F8108U, 0x1U, 0x401F8588U, 0x1U, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_LPUART2_RX 0x401F8108U, 0x2U, 0x401F852CU, 0x1U, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_SPDIF_IN 0x401F8108U, 0x3U, 0x401F85C8U, 0x0U, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_ENET_1588_EVENT2_IN 0x401F8108U, 0x4U, 0, 0, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_GPIO1_IO19 0x401F8108U, 0x5U, 0, 0, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_USDHC2_CD_B 0x401F8108U, 0x6U, 0x401F85E0U, 0x0U, 0x401F82F8U -#define IOMUXC_GPIO_AD_B1_03_KPP_COL06 0x401F8108U, 0x7U, 0, 0, 0x401F82F8U - -#define IOMUXC_GPIO_AD_B1_04_FLEXSPIB_DATA03 0x401F810CU, 0x0U, 0x401F84C4U, 0x1U, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_ENET_MDC 0x401F810CU, 0x1U, 0, 0, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_LPUART3_CTS_B 0x401F810CU, 0x2U, 0x401F8534U, 0x1U, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_SPDIF_SR_CLK 0x401F810CU, 0x3U, 0, 0, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_CSI_PIXCLK 0x401F810CU, 0x4U, 0x401F8424U, 0x0U, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_GPIO1_IO20 0x401F810CU, 0x5U, 0, 0, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_USDHC2_DATA0 0x401F810CU, 0x6U, 0x401F85E8U, 0x1U, 0x401F82FCU -#define IOMUXC_GPIO_AD_B1_04_KPP_ROW05 0x401F810CU, 0x7U, 0, 0, 0x401F82FCU - -#define IOMUXC_GPIO_AD_B1_05_FLEXSPIB_DATA02 0x401F8110U, 0x0U, 0x401F84C0U, 0x1U, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_ENET_MDIO 0x401F8110U, 0x1U, 0x401F8430U, 0x0U, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_LPUART3_RTS_B 0x401F8110U, 0x2U, 0, 0, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_SPDIF_OUT 0x401F8110U, 0x3U, 0, 0, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_CSI_MCLK 0x401F8110U, 0x4U, 0, 0, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_GPIO1_IO21 0x401F8110U, 0x5U, 0, 0, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_USDHC2_DATA1 0x401F8110U, 0x6U, 0x401F85ECU, 0x1U, 0x401F8300U -#define IOMUXC_GPIO_AD_B1_05_KPP_COL05 0x401F8110U, 0x7U, 0, 0, 0x401F8300U - -#define IOMUXC_GPIO_AD_B1_06_FLEXSPIB_DATA01 0x401F8114U, 0x0U, 0x401F84BCU, 0x1U, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA 0x401F8114U, 0x1U, 0x401F84E0U, 0x2U, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_LPUART3_TX 0x401F8114U, 0x2U, 0x401F853CU, 0x0U, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_SPDIF_LOCK 0x401F8114U, 0x3U, 0, 0, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_CSI_VSYNC 0x401F8114U, 0x4U, 0x401F8428U, 0x1U, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_GPIO1_IO22 0x401F8114U, 0x5U, 0, 0, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_USDHC2_DATA2 0x401F8114U, 0x6U, 0x401F85F0U, 0x1U, 0x401F8304U -#define IOMUXC_GPIO_AD_B1_06_KPP_ROW04 0x401F8114U, 0x7U, 0, 0, 0x401F8304U - -#define IOMUXC_GPIO_AD_B1_07_FLEXSPIB_DATA00 0x401F8118U, 0x0U, 0x401F84B8U, 0x1U, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL 0x401F8118U, 0x1U, 0x401F84DCU, 0x2U, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_LPUART3_RX 0x401F8118U, 0x2U, 0x401F8538U, 0x0U, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_SPDIF_EXT_CLK 0x401F8118U, 0x3U, 0, 0, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_CSI_HSYNC 0x401F8118U, 0x4U, 0x401F8420U, 0x1U, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_GPIO1_IO23 0x401F8118U, 0x5U, 0, 0, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_USDHC2_DATA3 0x401F8118U, 0x6U, 0x401F85F4U, 0x1U, 0x401F8308U -#define IOMUXC_GPIO_AD_B1_07_KPP_COL04 0x401F8118U, 0x7U, 0, 0, 0x401F8308U - -#define IOMUXC_GPIO_AD_B1_08_FLEXSPIA_SS1_B 0x401F811CU, 0x0U, 0, 0, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_FLEXPWM4_PWMA00 0x401F811CU, 0x1U, 0x401F8494U, 0x1U, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_FLEXCAN1_TX 0x401F811CU, 0x2U, 0, 0, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_CCM_PMIC_READY 0x401F811CU, 0x3U, 0x401F83FCU, 0x3U, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_CSI_DATA09 0x401F811CU, 0x4U, 0x401F841CU, 0x0U, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_GPIO1_IO24 0x401F811CU, 0x5U, 0, 0, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_USDHC2_CMD 0x401F811CU, 0x6U, 0x401F85E4U, 0x1U, 0x401F830CU -#define IOMUXC_GPIO_AD_B1_08_KPP_ROW03 0x401F811CU, 0x7U, 0, 0, 0x401F830CU - -#define IOMUXC_GPIO_AD_B1_09_FLEXSPIA_DQS 0x401F8120U, 0x0U, 0x401F84A4U, 0x1U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_FLEXPWM4_PWMA01 0x401F8120U, 0x1U, 0x401F8498U, 0x1U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_FLEXCAN1_RX 0x401F8120U, 0x2U, 0x401F844CU, 0x2U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_SAI1_MCLK 0x401F8120U, 0x3U, 0x401F858CU, 0x1U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_CSI_DATA08 0x401F8120U, 0x4U, 0x401F8418U, 0x0U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_GPIO1_IO25 0x401F8120U, 0x5U, 0, 0, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_USDHC2_CLK 0x401F8120U, 0x6U, 0x401F85DCU, 0x1U, 0x401F8310U -#define IOMUXC_GPIO_AD_B1_09_KPP_COL03 0x401F8120U, 0x7U, 0, 0, 0x401F8310U - -#define IOMUXC_GPIO_AD_B1_10_FLEXSPIA_DATA03 0x401F8124U, 0x0U, 0x401F84B4U, 0x1U, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_WDOG1_B 0x401F8124U, 0x1U, 0, 0, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_LPUART8_TX 0x401F8124U, 0x2U, 0x401F8564U, 0x1U, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_SAI1_RX_SYNC 0x401F8124U, 0x3U, 0x401F85A4U, 0x1U, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_CSI_DATA07 0x401F8124U, 0x4U, 0x401F8414U, 0x0U, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_GPIO1_IO26 0x401F8124U, 0x5U, 0, 0, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_USDHC2_WP 0x401F8124U, 0x6U, 0x401F8608U, 0x1U, 0x401F8314U -#define IOMUXC_GPIO_AD_B1_10_KPP_ROW02 0x401F8124U, 0x7U, 0, 0, 0x401F8314U - -#define IOMUXC_GPIO_AD_B1_11_FLEXSPIA_DATA02 0x401F8128U, 0x0U, 0x401F84B0U, 0x1U, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_EWM_OUT_B 0x401F8128U, 0x1U, 0, 0, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_LPUART8_RX 0x401F8128U, 0x2U, 0x401F8560U, 0x1U, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_SAI1_RX_BCLK 0x401F8128U, 0x3U, 0x401F8590U, 0x1U, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_CSI_DATA06 0x401F8128U, 0x4U, 0x401F8410U, 0x0U, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_GPIO1_IO27 0x401F8128U, 0x5U, 0, 0, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_USDHC2_RESET_B 0x401F8128U, 0x6U, 0, 0, 0x401F8318U -#define IOMUXC_GPIO_AD_B1_11_KPP_COL02 0x401F8128U, 0x7U, 0, 0, 0x401F8318U - -#define IOMUXC_GPIO_AD_B1_12_FLEXSPIA_DATA01 0x401F812CU, 0x0U, 0x401F84ACU, 0x1U, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_ACMP_OUT00 0x401F812CU, 0x1U, 0, 0, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_LPSPI3_PCS0 0x401F812CU, 0x2U, 0x401F850CU, 0x1U, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_SAI1_RX_DATA00 0x401F812CU, 0x3U, 0x401F8594U, 0x1U, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_CSI_DATA05 0x401F812CU, 0x4U, 0x401F840CU, 0x0U, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_GPIO1_IO28 0x401F812CU, 0x5U, 0, 0, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_USDHC2_DATA4 0x401F812CU, 0x6U, 0x401F85F8U, 0x1U, 0x401F831CU -#define IOMUXC_GPIO_AD_B1_12_KPP_ROW01 0x401F812CU, 0x7U, 0, 0, 0x401F831CU - -#define IOMUXC_GPIO_AD_B1_13_FLEXSPIA_DATA00 0x401F8130U, 0x0U, 0x401F84A8U, 0x1U, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_ACMP_OUT01 0x401F8130U, 0x1U, 0, 0, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_LPSPI3_SDI 0x401F8130U, 0x2U, 0x401F8514U, 0x1U, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_SAI1_TX_DATA00 0x401F8130U, 0x3U, 0, 0, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_CSI_DATA04 0x401F8130U, 0x4U, 0x401F8408U, 0x0U, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_GPIO1_IO29 0x401F8130U, 0x5U, 0, 0, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_USDHC2_DATA5 0x401F8130U, 0x6U, 0x401F85FCU, 0x1U, 0x401F8320U -#define IOMUXC_GPIO_AD_B1_13_KPP_COL01 0x401F8130U, 0x7U, 0, 0, 0x401F8320U - -#define IOMUXC_GPIO_AD_B1_14_FLEXSPIA_SCLK 0x401F8134U, 0x0U, 0x401F84C8U, 0x1U, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_ACMP_OUT02 0x401F8134U, 0x1U, 0, 0, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_LPSPI3_SDO 0x401F8134U, 0x2U, 0x401F8518U, 0x1U, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_SAI1_TX_BCLK 0x401F8134U, 0x3U, 0x401F85A8U, 0x1U, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_CSI_DATA03 0x401F8134U, 0x4U, 0x401F8404U, 0x0U, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_GPIO1_IO30 0x401F8134U, 0x5U, 0, 0, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_USDHC2_DATA6 0x401F8134U, 0x6U, 0x401F8600U, 0x1U, 0x401F8324U -#define IOMUXC_GPIO_AD_B1_14_KPP_ROW00 0x401F8134U, 0x7U, 0, 0, 0x401F8324U - -#define IOMUXC_GPIO_AD_B1_15_FLEXSPIA_SS0_B 0x401F8138U, 0x0U, 0, 0, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_ACMP_OUT03 0x401F8138U, 0x1U, 0, 0, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_LPSPI3_SCK 0x401F8138U, 0x2U, 0, 0, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_SAI1_TX_SYNC 0x401F8138U, 0x3U, 0x401F85ACU, 0x1U, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_CSI_DATA02 0x401F8138U, 0x4U, 0x401F8400U, 0x0U, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_GPIO1_IO31 0x401F8138U, 0x5U, 0, 0, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_USDHC2_DATA7 0x401F8138U, 0x6U, 0x401F8604U, 0x1U, 0x401F8328U -#define IOMUXC_GPIO_AD_B1_15_KPP_COL00 0x401F8138U, 0x7U, 0, 0, 0x401F8328U - -#define IOMUXC_GPIO_B0_00_LCD_CLK 0x401F813CU, 0x0U, 0, 0, 0x401F832CU -#define IOMUXC_GPIO_B0_00_QTIMER1_TIMER0 0x401F813CU, 0x1U, 0, 0, 0x401F832CU -#define IOMUXC_GPIO_B0_00_MQS_RIGHT 0x401F813CU, 0x2U, 0, 0, 0x401F832CU -#define IOMUXC_GPIO_B0_00_LPSPI4_PCS0 0x401F813CU, 0x3U, 0x401F851CU, 0x0U, 0x401F832CU -#define IOMUXC_GPIO_B0_00_FLEXIO2_FLEXIO00 0x401F813CU, 0x4U, 0, 0, 0x401F832CU -#define IOMUXC_GPIO_B0_00_GPIO2_IO00 0x401F813CU, 0x5U, 0, 0, 0x401F832CU -#define IOMUXC_GPIO_B0_00_SEMC_CSX01 0x401F813CU, 0x6U, 0, 0, 0x401F832CU - -#define IOMUXC_GPIO_B0_01_LCD_ENABLE 0x401F8140U, 0x0U, 0, 0, 0x401F8330U -#define IOMUXC_GPIO_B0_01_QTIMER1_TIMER1 0x401F8140U, 0x1U, 0, 0, 0x401F8330U -#define IOMUXC_GPIO_B0_01_MQS_LEFT 0x401F8140U, 0x2U, 0, 0, 0x401F8330U -#define IOMUXC_GPIO_B0_01_LPSPI4_SDI 0x401F8140U, 0x3U, 0x401F8524U, 0x0U, 0x401F8330U -#define IOMUXC_GPIO_B0_01_FLEXIO2_FLEXIO01 0x401F8140U, 0x4U, 0, 0, 0x401F8330U -#define IOMUXC_GPIO_B0_01_GPIO2_IO01 0x401F8140U, 0x5U, 0, 0, 0x401F8330U -#define IOMUXC_GPIO_B0_01_SEMC_CSX02 0x401F8140U, 0x6U, 0, 0, 0x401F8330U - -#define IOMUXC_GPIO_B0_02_LCD_HSYNC 0x401F8144U, 0x0U, 0, 0, 0x401F8334U -#define IOMUXC_GPIO_B0_02_QTIMER1_TIMER2 0x401F8144U, 0x1U, 0, 0, 0x401F8334U -#define IOMUXC_GPIO_B0_02_FLEXCAN1_TX 0x401F8144U, 0x2U, 0, 0, 0x401F8334U -#define IOMUXC_GPIO_B0_02_LPSPI4_SDO 0x401F8144U, 0x3U, 0x401F8528U, 0x0U, 0x401F8334U -#define IOMUXC_GPIO_B0_02_FLEXIO2_FLEXIO02 0x401F8144U, 0x4U, 0, 0, 0x401F8334U -#define IOMUXC_GPIO_B0_02_GPIO2_IO02 0x401F8144U, 0x5U, 0, 0, 0x401F8334U -#define IOMUXC_GPIO_B0_02_SEMC_CSX03 0x401F8144U, 0x6U, 0, 0, 0x401F8334U - -#define IOMUXC_GPIO_B0_03_LCD_VSYNC 0x401F8148U, 0x0U, 0, 0, 0x401F8338U -#define IOMUXC_GPIO_B0_03_QTIMER2_TIMER0 0x401F8148U, 0x1U, 0x401F856CU, 0x1U, 0x401F8338U -#define IOMUXC_GPIO_B0_03_FLEXCAN1_RX 0x401F8148U, 0x2U, 0x401F844CU, 0x3U, 0x401F8338U -#define IOMUXC_GPIO_B0_03_LPSPI4_SCK 0x401F8148U, 0x3U, 0x401F8520U, 0x0U, 0x401F8338U -#define IOMUXC_GPIO_B0_03_FLEXIO2_FLEXIO03 0x401F8148U, 0x4U, 0, 0, 0x401F8338U -#define IOMUXC_GPIO_B0_03_GPIO2_IO03 0x401F8148U, 0x5U, 0, 0, 0x401F8338U -#define IOMUXC_GPIO_B0_03_WDOG2_RESET_B_DEB 0x401F8148U, 0x6U, 0, 0, 0x401F8338U - -#define IOMUXC_GPIO_B0_04_LCD_DATA00 0x401F814CU, 0x0U, 0, 0, 0x401F833CU -#define IOMUXC_GPIO_B0_04_QTIMER2_TIMER1 0x401F814CU, 0x1U, 0x401F8570U, 0x1U, 0x401F833CU -#define IOMUXC_GPIO_B0_04_LPI2C2_SCL 0x401F814CU, 0x2U, 0x401F84D4U, 0x1U, 0x401F833CU -#define IOMUXC_GPIO_B0_04_ARM_CM7_TRACE00 0x401F814CU, 0x3U, 0, 0, 0x401F833CU -#define IOMUXC_GPIO_B0_04_FLEXIO2_FLEXIO04 0x401F814CU, 0x4U, 0, 0, 0x401F833CU -#define IOMUXC_GPIO_B0_04_GPIO2_IO04 0x401F814CU, 0x5U, 0, 0, 0x401F833CU -#define IOMUXC_GPIO_B0_04_SRC_BOOT_CFG00 0x401F814CU, 0x6U, 0, 0, 0x401F833CU - -#define IOMUXC_GPIO_B0_05_LCD_DATA01 0x401F8150U, 0x0U, 0, 0, 0x401F8340U -#define IOMUXC_GPIO_B0_05_QTIMER2_TIMER2 0x401F8150U, 0x1U, 0x401F8574U, 0x1U, 0x401F8340U -#define IOMUXC_GPIO_B0_05_LPI2C2_SDA 0x401F8150U, 0x2U, 0x401F84D8U, 0x1U, 0x401F8340U -#define IOMUXC_GPIO_B0_05_ARM_CM7_TRACE01 0x401F8150U, 0x3U, 0, 0, 0x401F8340U -#define IOMUXC_GPIO_B0_05_FLEXIO2_FLEXIO05 0x401F8150U, 0x4U, 0, 0, 0x401F8340U -#define IOMUXC_GPIO_B0_05_GPIO2_IO05 0x401F8150U, 0x5U, 0, 0, 0x401F8340U -#define IOMUXC_GPIO_B0_05_SRC_BOOT_CFG01 0x401F8150U, 0x6U, 0, 0, 0x401F8340U - -#define IOMUXC_GPIO_B0_06_LCD_DATA02 0x401F8154U, 0x0U, 0, 0, 0x401F8344U -#define IOMUXC_GPIO_B0_06_QTIMER3_TIMER0 0x401F8154U, 0x1U, 0x401F857CU, 0x2U, 0x401F8344U -#define IOMUXC_GPIO_B0_06_FLEXPWM2_PWMA00 0x401F8154U, 0x2U, 0x401F8478U, 0x1U, 0x401F8344U -#define IOMUXC_GPIO_B0_06_ARM_CM7_TRACE02 0x401F8154U, 0x3U, 0, 0, 0x401F8344U -#define IOMUXC_GPIO_B0_06_FLEXIO2_FLEXIO06 0x401F8154U, 0x4U, 0, 0, 0x401F8344U -#define IOMUXC_GPIO_B0_06_GPIO2_IO06 0x401F8154U, 0x5U, 0, 0, 0x401F8344U -#define IOMUXC_GPIO_B0_06_SRC_BOOT_CFG02 0x401F8154U, 0x6U, 0, 0, 0x401F8344U - -#define IOMUXC_GPIO_B0_07_LCD_DATA03 0x401F8158U, 0x0U, 0, 0, 0x401F8348U -#define IOMUXC_GPIO_B0_07_QTIMER3_TIMER1 0x401F8158U, 0x1U, 0x401F8580U, 0x2U, 0x401F8348U -#define IOMUXC_GPIO_B0_07_FLEXPWM2_PWMB00 0x401F8158U, 0x2U, 0x401F8488U, 0x1U, 0x401F8348U -#define IOMUXC_GPIO_B0_07_ARM_CM7_TRACE03 0x401F8158U, 0x3U, 0, 0, 0x401F8348U -#define IOMUXC_GPIO_B0_07_FLEXIO2_FLEXIO07 0x401F8158U, 0x4U, 0, 0, 0x401F8348U -#define IOMUXC_GPIO_B0_07_GPIO2_IO07 0x401F8158U, 0x5U, 0, 0, 0x401F8348U -#define IOMUXC_GPIO_B0_07_SRC_BOOT_CFG03 0x401F8158U, 0x6U, 0, 0, 0x401F8348U - -#define IOMUXC_GPIO_B0_08_LCD_DATA04 0x401F815CU, 0x0U, 0, 0, 0x401F834CU -#define IOMUXC_GPIO_B0_08_QTIMER3_TIMER2 0x401F815CU, 0x1U, 0x401F8584U, 0x2U, 0x401F834CU -#define IOMUXC_GPIO_B0_08_FLEXPWM2_PWMA01 0x401F815CU, 0x2U, 0x401F847CU, 0x1U, 0x401F834CU -#define IOMUXC_GPIO_B0_08_LPUART3_TX 0x401F815CU, 0x3U, 0x401F853CU, 0x2U, 0x401F834CU -#define IOMUXC_GPIO_B0_08_FLEXIO2_FLEXIO08 0x401F815CU, 0x4U, 0, 0, 0x401F834CU -#define IOMUXC_GPIO_B0_08_GPIO2_IO08 0x401F815CU, 0x5U, 0, 0, 0x401F834CU -#define IOMUXC_GPIO_B0_08_SRC_BOOT_CFG04 0x401F815CU, 0x6U, 0, 0, 0x401F834CU - -#define IOMUXC_GPIO_B0_09_LCD_DATA05 0x401F8160U, 0x0U, 0, 0, 0x401F8350U -#define IOMUXC_GPIO_B0_09_QTIMER4_TIMER0 0x401F8160U, 0x1U, 0, 0, 0x401F8350U -#define IOMUXC_GPIO_B0_09_FLEXPWM2_PWMB01 0x401F8160U, 0x2U, 0x401F848CU, 0x1U, 0x401F8350U -#define IOMUXC_GPIO_B0_09_LPUART3_RX 0x401F8160U, 0x3U, 0x401F8538U, 0x2U, 0x401F8350U -#define IOMUXC_GPIO_B0_09_FLEXIO2_FLEXIO09 0x401F8160U, 0x4U, 0, 0, 0x401F8350U -#define IOMUXC_GPIO_B0_09_GPIO2_IO09 0x401F8160U, 0x5U, 0, 0, 0x401F8350U -#define IOMUXC_GPIO_B0_09_SRC_BOOT_CFG05 0x401F8160U, 0x6U, 0, 0, 0x401F8350U - -#define IOMUXC_GPIO_B0_10_LCD_DATA06 0x401F8164U, 0x0U, 0, 0, 0x401F8354U -#define IOMUXC_GPIO_B0_10_QTIMER4_TIMER1 0x401F8164U, 0x1U, 0, 0, 0x401F8354U -#define IOMUXC_GPIO_B0_10_FLEXPWM2_PWMA02 0x401F8164U, 0x2U, 0x401F8480U, 0x1U, 0x401F8354U -#define IOMUXC_GPIO_B0_10_SAI1_TX_DATA03 0x401F8164U, 0x3U, 0x401F8598U, 0x1U, 0x401F8354U -#define IOMUXC_GPIO_B0_10_FLEXIO2_FLEXIO10 0x401F8164U, 0x4U, 0, 0, 0x401F8354U -#define IOMUXC_GPIO_B0_10_GPIO2_IO10 0x401F8164U, 0x5U, 0, 0, 0x401F8354U -#define IOMUXC_GPIO_B0_10_SRC_BOOT_CFG06 0x401F8164U, 0x6U, 0, 0, 0x401F8354U - -#define IOMUXC_GPIO_B0_11_LCD_DATA07 0x401F8168U, 0x0U, 0, 0, 0x401F8358U -#define IOMUXC_GPIO_B0_11_QTIMER4_TIMER2 0x401F8168U, 0x1U, 0, 0, 0x401F8358U -#define IOMUXC_GPIO_B0_11_FLEXPWM2_PWMB02 0x401F8168U, 0x2U, 0x401F8490U, 0x1U, 0x401F8358U -#define IOMUXC_GPIO_B0_11_SAI1_TX_DATA02 0x401F8168U, 0x3U, 0x401F859CU, 0x1U, 0x401F8358U -#define IOMUXC_GPIO_B0_11_FLEXIO2_FLEXIO11 0x401F8168U, 0x4U, 0, 0, 0x401F8358U -#define IOMUXC_GPIO_B0_11_GPIO2_IO11 0x401F8168U, 0x5U, 0, 0, 0x401F8358U -#define IOMUXC_GPIO_B0_11_SRC_BOOT_CFG07 0x401F8168U, 0x6U, 0, 0, 0x401F8358U - -#define IOMUXC_GPIO_B0_12_LCD_DATA08 0x401F816CU, 0x0U, 0, 0, 0x401F835CU -#define IOMUXC_GPIO_B0_12_XBAR1_INOUT10 0x401F816CU, 0x1U, 0, 0, 0x401F835CU -#define IOMUXC_GPIO_B0_12_ARM_CM7_TRACE_CLK 0x401F816CU, 0x2U, 0, 0, 0x401F835CU -#define IOMUXC_GPIO_B0_12_SAI1_TX_DATA01 0x401F816CU, 0x3U, 0x401F85A0U, 0x1U, 0x401F835CU -#define IOMUXC_GPIO_B0_12_FLEXIO2_FLEXIO12 0x401F816CU, 0x4U, 0, 0, 0x401F835CU -#define IOMUXC_GPIO_B0_12_GPIO2_IO12 0x401F816CU, 0x5U, 0, 0, 0x401F835CU -#define IOMUXC_GPIO_B0_12_SRC_BOOT_CFG08 0x401F816CU, 0x6U, 0, 0, 0x401F835CU - -#define IOMUXC_GPIO_B0_13_LCD_DATA09 0x401F8170U, 0x0U, 0, 0, 0x401F8360U -#define IOMUXC_GPIO_B0_13_XBAR1_INOUT11 0x401F8170U, 0x1U, 0, 0, 0x401F8360U -#define IOMUXC_GPIO_B0_13_ARM_CM7_TRACE_SWO 0x401F8170U, 0x2U, 0, 0, 0x401F8360U -#define IOMUXC_GPIO_B0_13_SAI1_MCLK 0x401F8170U, 0x3U, 0x401F858CU, 0x2U, 0x401F8360U -#define IOMUXC_GPIO_B0_13_FLEXIO2_FLEXIO13 0x401F8170U, 0x4U, 0, 0, 0x401F8360U -#define IOMUXC_GPIO_B0_13_GPIO2_IO13 0x401F8170U, 0x5U, 0, 0, 0x401F8360U -#define IOMUXC_GPIO_B0_13_SRC_BOOT_CFG09 0x401F8170U, 0x6U, 0, 0, 0x401F8360U - -#define IOMUXC_GPIO_B0_14_LCD_DATA10 0x401F8174U, 0x0U, 0, 0, 0x401F8364U -#define IOMUXC_GPIO_B0_14_XBAR1_INOUT12 0x401F8174U, 0x1U, 0, 0, 0x401F8364U -#define IOMUXC_GPIO_B0_14_ARM_CM7_TXEV 0x401F8174U, 0x2U, 0, 0, 0x401F8364U -#define IOMUXC_GPIO_B0_14_SAI1_RX_SYNC 0x401F8174U, 0x3U, 0x401F85A4U, 0x2U, 0x401F8364U -#define IOMUXC_GPIO_B0_14_FLEXIO2_FLEXIO14 0x401F8174U, 0x4U, 0, 0, 0x401F8364U -#define IOMUXC_GPIO_B0_14_GPIO2_IO14 0x401F8174U, 0x5U, 0, 0, 0x401F8364U -#define IOMUXC_GPIO_B0_14_SRC_BOOT_CFG10 0x401F8174U, 0x6U, 0, 0, 0x401F8364U - -#define IOMUXC_GPIO_B0_15_LCD_DATA11 0x401F8178U, 0x0U, 0, 0, 0x401F8368U -#define IOMUXC_GPIO_B0_15_XBAR1_INOUT13 0x401F8178U, 0x1U, 0, 0, 0x401F8368U -#define IOMUXC_GPIO_B0_15_ARM_CM7_RXEV 0x401F8178U, 0x2U, 0, 0, 0x401F8368U -#define IOMUXC_GPIO_B0_15_SAI1_RX_BCLK 0x401F8178U, 0x3U, 0x401F8590U, 0x2U, 0x401F8368U -#define IOMUXC_GPIO_B0_15_FLEXIO2_FLEXIO15 0x401F8178U, 0x4U, 0, 0, 0x401F8368U -#define IOMUXC_GPIO_B0_15_GPIO2_IO15 0x401F8178U, 0x5U, 0, 0, 0x401F8368U -#define IOMUXC_GPIO_B0_15_SRC_BOOT_CFG11 0x401F8178U, 0x6U, 0, 0, 0x401F8368U - -#define IOMUXC_GPIO_B1_00_LCD_DATA12 0x401F817CU, 0x0U, 0, 0, 0x401F836CU -#define IOMUXC_GPIO_B1_00_XBAR1_INOUT14 0x401F817CU, 0x1U, 0x401F8644U, 0x1U, 0x401F836CU -#define IOMUXC_GPIO_B1_00_LPUART4_TX 0x401F817CU, 0x2U, 0x401F8544U, 0x2U, 0x401F836CU -#define IOMUXC_GPIO_B1_00_SAI1_RX_DATA00 0x401F817CU, 0x3U, 0x401F8594U, 0x2U, 0x401F836CU -#define IOMUXC_GPIO_B1_00_FLEXIO2_FLEXIO16 0x401F817CU, 0x4U, 0, 0, 0x401F836CU -#define IOMUXC_GPIO_B1_00_GPIO2_IO16 0x401F817CU, 0x5U, 0, 0, 0x401F836CU -#define IOMUXC_GPIO_B1_00_FLEXPWM1_PWMA03 0x401F817CU, 0x6U, 0x401F8454U, 0x4U, 0x401F836CU - -#define IOMUXC_GPIO_B1_01_LCD_DATA13 0x401F8180U, 0x0U, 0, 0, 0x401F8370U -#define IOMUXC_GPIO_B1_01_XBAR1_INOUT15 0x401F8180U, 0x1U, 0x401F8648U, 0x1U, 0x401F8370U -#define IOMUXC_GPIO_B1_01_LPUART4_RX 0x401F8180U, 0x2U, 0x401F8540U, 0x2U, 0x401F8370U -#define IOMUXC_GPIO_B1_01_SAI1_TX_DATA00 0x401F8180U, 0x3U, 0, 0, 0x401F8370U -#define IOMUXC_GPIO_B1_01_FLEXIO2_FLEXIO17 0x401F8180U, 0x4U, 0, 0, 0x401F8370U -#define IOMUXC_GPIO_B1_01_GPIO2_IO17 0x401F8180U, 0x5U, 0, 0, 0x401F8370U -#define IOMUXC_GPIO_B1_01_FLEXPWM1_PWMB03 0x401F8180U, 0x6U, 0x401F8464U, 0x4U, 0x401F8370U - -#define IOMUXC_GPIO_B1_02_LCD_DATA14 0x401F8184U, 0x0U, 0, 0, 0x401F8374U -#define IOMUXC_GPIO_B1_02_XBAR1_INOUT16 0x401F8184U, 0x1U, 0x401F864CU, 0x1U, 0x401F8374U -#define IOMUXC_GPIO_B1_02_LPSPI4_PCS2 0x401F8184U, 0x2U, 0, 0, 0x401F8374U -#define IOMUXC_GPIO_B1_02_SAI1_TX_BCLK 0x401F8184U, 0x3U, 0x401F85A8U, 0x2U, 0x401F8374U -#define IOMUXC_GPIO_B1_02_FLEXIO2_FLEXIO18 0x401F8184U, 0x4U, 0, 0, 0x401F8374U -#define IOMUXC_GPIO_B1_02_GPIO2_IO18 0x401F8184U, 0x5U, 0, 0, 0x401F8374U -#define IOMUXC_GPIO_B1_02_FLEXPWM2_PWMA03 0x401F8184U, 0x6U, 0x401F8474U, 0x4U, 0x401F8374U - -#define IOMUXC_GPIO_B1_03_LCD_DATA15 0x401F8188U, 0x0U, 0, 0, 0x401F8378U -#define IOMUXC_GPIO_B1_03_XBAR1_INOUT17 0x401F8188U, 0x1U, 0x401F862CU, 0x3U, 0x401F8378U -#define IOMUXC_GPIO_B1_03_LPSPI4_PCS1 0x401F8188U, 0x2U, 0, 0, 0x401F8378U -#define IOMUXC_GPIO_B1_03_SAI1_TX_SYNC 0x401F8188U, 0x3U, 0x401F85ACU, 0x2U, 0x401F8378U -#define IOMUXC_GPIO_B1_03_FLEXIO2_FLEXIO19 0x401F8188U, 0x4U, 0, 0, 0x401F8378U -#define IOMUXC_GPIO_B1_03_GPIO2_IO19 0x401F8188U, 0x5U, 0, 0, 0x401F8378U -#define IOMUXC_GPIO_B1_03_FLEXPWM2_PWMB03 0x401F8188U, 0x6U, 0x401F8484U, 0x3U, 0x401F8378U - -#define IOMUXC_GPIO_B1_04_LCD_DATA16 0x401F818CU, 0x0U, 0, 0, 0x401F837CU -#define IOMUXC_GPIO_B1_04_LPSPI4_PCS0 0x401F818CU, 0x1U, 0x401F851CU, 0x1U, 0x401F837CU -#define IOMUXC_GPIO_B1_04_CSI_DATA15 0x401F818CU, 0x2U, 0, 0, 0x401F837CU -#define IOMUXC_GPIO_B1_04_ENET_RX_DATA00 0x401F818CU, 0x3U, 0x401F8434U, 0x1U, 0x401F837CU -#define IOMUXC_GPIO_B1_04_FLEXIO2_FLEXIO20 0x401F818CU, 0x4U, 0, 0, 0x401F837CU -#define IOMUXC_GPIO_B1_04_GPIO2_IO20 0x401F818CU, 0x5U, 0, 0, 0x401F837CU - -#define IOMUXC_GPIO_B1_05_LCD_DATA17 0x401F8190U, 0x0U, 0, 0, 0x401F8380U -#define IOMUXC_GPIO_B1_05_LPSPI4_SDI 0x401F8190U, 0x1U, 0x401F8524U, 0x1U, 0x401F8380U -#define IOMUXC_GPIO_B1_05_CSI_DATA14 0x401F8190U, 0x2U, 0, 0, 0x401F8380U -#define IOMUXC_GPIO_B1_05_ENET_RX_DATA01 0x401F8190U, 0x3U, 0x401F8438U, 0x1U, 0x401F8380U -#define IOMUXC_GPIO_B1_05_FLEXIO2_FLEXIO21 0x401F8190U, 0x4U, 0, 0, 0x401F8380U -#define IOMUXC_GPIO_B1_05_GPIO2_IO21 0x401F8190U, 0x5U, 0, 0, 0x401F8380U - -#define IOMUXC_GPIO_B1_06_LCD_DATA18 0x401F8194U, 0x0U, 0, 0, 0x401F8384U -#define IOMUXC_GPIO_B1_06_LPSPI4_SDO 0x401F8194U, 0x1U, 0x401F8528U, 0x1U, 0x401F8384U -#define IOMUXC_GPIO_B1_06_CSI_DATA13 0x401F8194U, 0x2U, 0, 0, 0x401F8384U -#define IOMUXC_GPIO_B1_06_ENET_RX_EN 0x401F8194U, 0x3U, 0x401F843CU, 0x1U, 0x401F8384U -#define IOMUXC_GPIO_B1_06_FLEXIO2_FLEXIO22 0x401F8194U, 0x4U, 0, 0, 0x401F8384U -#define IOMUXC_GPIO_B1_06_GPIO2_IO22 0x401F8194U, 0x5U, 0, 0, 0x401F8384U - -#define IOMUXC_GPIO_B1_07_LCD_DATA19 0x401F8198U, 0x0U, 0, 0, 0x401F8388U -#define IOMUXC_GPIO_B1_07_LPSPI4_SCK 0x401F8198U, 0x1U, 0x401F8520U, 0x1U, 0x401F8388U -#define IOMUXC_GPIO_B1_07_CSI_DATA12 0x401F8198U, 0x2U, 0, 0, 0x401F8388U -#define IOMUXC_GPIO_B1_07_ENET_TX_DATA00 0x401F8198U, 0x3U, 0, 0, 0x401F8388U -#define IOMUXC_GPIO_B1_07_FLEXIO2_FLEXIO23 0x401F8198U, 0x4U, 0, 0, 0x401F8388U -#define IOMUXC_GPIO_B1_07_GPIO2_IO23 0x401F8198U, 0x5U, 0, 0, 0x401F8388U - -#define IOMUXC_GPIO_B1_08_LCD_DATA20 0x401F819CU, 0x0U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_QTIMER1_TIMER3 0x401F819CU, 0x1U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_CSI_DATA11 0x401F819CU, 0x2U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_ENET_TX_DATA01 0x401F819CU, 0x3U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_FLEXIO2_FLEXIO24 0x401F819CU, 0x4U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_GPIO2_IO24 0x401F819CU, 0x5U, 0, 0, 0x401F838CU -#define IOMUXC_GPIO_B1_08_FLEXCAN2_TX 0x401F819CU, 0x6U, 0, 0, 0x401F838CU - -#define IOMUXC_GPIO_B1_09_LCD_DATA21 0x401F81A0U, 0x0U, 0, 0, 0x401F8390U -#define IOMUXC_GPIO_B1_09_QTIMER2_TIMER3 0x401F81A0U, 0x1U, 0x401F8578U, 0x1U, 0x401F8390U -#define IOMUXC_GPIO_B1_09_CSI_DATA10 0x401F81A0U, 0x2U, 0, 0, 0x401F8390U -#define IOMUXC_GPIO_B1_09_ENET_TX_EN 0x401F81A0U, 0x3U, 0, 0, 0x401F8390U -#define IOMUXC_GPIO_B1_09_FLEXIO2_FLEXIO25 0x401F81A0U, 0x4U, 0, 0, 0x401F8390U -#define IOMUXC_GPIO_B1_09_GPIO2_IO25 0x401F81A0U, 0x5U, 0, 0, 0x401F8390U -#define IOMUXC_GPIO_B1_09_FLEXCAN2_RX 0x401F81A0U, 0x6U, 0x401F8450U, 0x3U, 0x401F8390U - -#define IOMUXC_GPIO_B1_10_LCD_DATA22 0x401F81A4U, 0x0U, 0, 0, 0x401F8394U -#define IOMUXC_GPIO_B1_10_QTIMER3_TIMER3 0x401F81A4U, 0x1U, 0x401F8588U, 0x2U, 0x401F8394U -#define IOMUXC_GPIO_B1_10_CSI_DATA00 0x401F81A4U, 0x2U, 0, 0, 0x401F8394U -#define IOMUXC_GPIO_B1_10_ENET_TX_CLK 0x401F81A4U, 0x3U, 0x401F8448U, 0x1U, 0x401F8394U -#define IOMUXC_GPIO_B1_10_FLEXIO2_FLEXIO26 0x401F81A4U, 0x4U, 0, 0, 0x401F8394U -#define IOMUXC_GPIO_B1_10_GPIO2_IO26 0x401F81A4U, 0x5U, 0, 0, 0x401F8394U -#define IOMUXC_GPIO_B1_10_ENET_REF_CLK 0x401F81A4U, 0x6U, 0x401F842CU, 0x1U, 0x401F8394U - -#define IOMUXC_GPIO_B1_11_LCD_DATA23 0x401F81A8U, 0x0U, 0, 0, 0x401F8398U -#define IOMUXC_GPIO_B1_11_QTIMER4_TIMER3 0x401F81A8U, 0x1U, 0, 0, 0x401F8398U -#define IOMUXC_GPIO_B1_11_CSI_DATA01 0x401F81A8U, 0x2U, 0, 0, 0x401F8398U -#define IOMUXC_GPIO_B1_11_ENET_RX_ER 0x401F81A8U, 0x3U, 0x401F8440U, 0x1U, 0x401F8398U -#define IOMUXC_GPIO_B1_11_FLEXIO2_FLEXIO27 0x401F81A8U, 0x4U, 0, 0, 0x401F8398U -#define IOMUXC_GPIO_B1_11_GPIO2_IO27 0x401F81A8U, 0x5U, 0, 0, 0x401F8398U -#define IOMUXC_GPIO_B1_11_LPSPI4_PCS3 0x401F81A8U, 0x6U, 0, 0, 0x401F8398U - -#define IOMUXC_GPIO_B1_12_LPUART5_TX 0x401F81ACU, 0x1U, 0x401F854CU, 0x1U, 0x401F839CU -#define IOMUXC_GPIO_B1_12_CSI_PIXCLK 0x401F81ACU, 0x2U, 0x401F8424U, 0x1U, 0x401F839CU -#define IOMUXC_GPIO_B1_12_ENET_1588_EVENT0_IN 0x401F81ACU, 0x3U, 0x401F8444U, 0x2U, 0x401F839CU -#define IOMUXC_GPIO_B1_12_FLEXIO2_FLEXIO28 0x401F81ACU, 0x4U, 0, 0, 0x401F839CU -#define IOMUXC_GPIO_B1_12_GPIO2_IO28 0x401F81ACU, 0x5U, 0, 0, 0x401F839CU -#define IOMUXC_GPIO_B1_12_USDHC1_CD_B 0x401F81ACU, 0x6U, 0x401F85D4U, 0x2U, 0x401F839CU - -#define IOMUXC_GPIO_B1_13_WDOG1_B 0x401F81B0U, 0x0U, 0, 0, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_LPUART5_RX 0x401F81B0U, 0x1U, 0x401F8548U, 0x1U, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_CSI_VSYNC 0x401F81B0U, 0x2U, 0x401F8428U, 0x2U, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_ENET_1588_EVENT0_OUT 0x401F81B0U, 0x3U, 0, 0, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_FLEXIO2_FLEXIO29 0x401F81B0U, 0x4U, 0, 0, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_GPIO2_IO29 0x401F81B0U, 0x5U, 0, 0, 0x401F83A0U -#define IOMUXC_GPIO_B1_13_USDHC1_WP 0x401F81B0U, 0x6U, 0x401F85D8U, 0x3U, 0x401F83A0U - -#define IOMUXC_GPIO_B1_14_ENET_MDC 0x401F81B4U, 0x0U, 0, 0, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_FLEXPWM4_PWMA02 0x401F81B4U, 0x1U, 0x401F849CU, 0x1U, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_CSI_HSYNC 0x401F81B4U, 0x2U, 0x401F8420U, 0x2U, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_XBAR1_IN02 0x401F81B4U, 0x3U, 0x401F860CU, 0x1U, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_FLEXIO2_FLEXIO30 0x401F81B4U, 0x4U, 0, 0, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_GPIO2_IO30 0x401F81B4U, 0x5U, 0, 0, 0x401F83A4U -#define IOMUXC_GPIO_B1_14_USDHC1_VSELECT 0x401F81B4U, 0x6U, 0, 0, 0x401F83A4U - -#define IOMUXC_GPIO_B1_15_ENET_MDIO 0x401F81B8U, 0x0U, 0x401F8430U, 0x2U, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_FLEXPWM4_PWMA03 0x401F81B8U, 0x1U, 0x401F84A0U, 0x1U, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_CSI_MCLK 0x401F81B8U, 0x2U, 0, 0, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_XBAR1_IN03 0x401F81B8U, 0x3U, 0x401F8610U, 0x1U, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_FLEXIO2_FLEXIO31 0x401F81B8U, 0x4U, 0, 0, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_GPIO2_IO31 0x401F81B8U, 0x5U, 0, 0, 0x401F83A8U -#define IOMUXC_GPIO_B1_15_USDHC1_RESET_B 0x401F81B8U, 0x6U, 0, 0, 0x401F83A8U - -#define IOMUXC_GPIO_SD_B0_00_USDHC1_CMD 0x401F81BCU, 0x0U, 0, 0, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_FLEXPWM1_PWMA00 0x401F81BCU, 0x1U, 0x401F8458U, 0x1U, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_LPI2C3_SCL 0x401F81BCU, 0x2U, 0x401F84DCU, 0x1U, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_XBAR1_INOUT04 0x401F81BCU, 0x3U, 0x401F8614U, 0x1U, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_LPSPI1_SCK 0x401F81BCU, 0x4U, 0x401F84F0U, 0x1U, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_GPIO3_IO12 0x401F81BCU, 0x5U, 0, 0, 0x401F83ACU -#define IOMUXC_GPIO_SD_B0_00_FLEXSPIA_SS1_B 0x401F81BCU, 0x6U, 0, 0, 0x401F83ACU - -#define IOMUXC_GPIO_SD_B0_01_USDHC1_CLK 0x401F81C0U, 0x0U, 0, 0, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_FLEXPWM1_PWMB00 0x401F81C0U, 0x1U, 0x401F8468U, 0x1U, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_LPI2C3_SDA 0x401F81C0U, 0x2U, 0x401F84E0U, 0x1U, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_XBAR1_INOUT05 0x401F81C0U, 0x3U, 0x401F8618U, 0x1U, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_LPSPI1_PCS0 0x401F81C0U, 0x4U, 0x401F84ECU, 0x0U, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_GPIO3_IO13 0x401F81C0U, 0x5U, 0, 0, 0x401F83B0U -#define IOMUXC_GPIO_SD_B0_01_FLEXSPIB_SS1_B 0x401F81C0U, 0x6U, 0, 0, 0x401F83B0U - -#define IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0 0x401F81C4U, 0x0U, 0, 0, 0x401F83B4U -#define IOMUXC_GPIO_SD_B0_02_FLEXPWM1_PWMA01 0x401F81C4U, 0x1U, 0x401F845CU, 0x1U, 0x401F83B4U -#define IOMUXC_GPIO_SD_B0_02_LPUART8_CTS_B 0x401F81C4U, 0x2U, 0, 0, 0x401F83B4U -#define IOMUXC_GPIO_SD_B0_02_XBAR1_INOUT06 0x401F81C4U, 0x3U, 0x401F861CU, 0x1U, 0x401F83B4U -#define IOMUXC_GPIO_SD_B0_02_LPSPI1_SDO 0x401F81C4U, 0x4U, 0x401F84F8U, 0x1U, 0x401F83B4U -#define IOMUXC_GPIO_SD_B0_02_GPIO3_IO14 0x401F81C4U, 0x5U, 0, 0, 0x401F83B4U - -#define IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1 0x401F81C8U, 0x0U, 0, 0, 0x401F83B8U -#define IOMUXC_GPIO_SD_B0_03_FLEXPWM1_PWMB01 0x401F81C8U, 0x1U, 0x401F846CU, 0x1U, 0x401F83B8U -#define IOMUXC_GPIO_SD_B0_03_LPUART8_RTS_B 0x401F81C8U, 0x2U, 0, 0, 0x401F83B8U -#define IOMUXC_GPIO_SD_B0_03_XBAR1_INOUT07 0x401F81C8U, 0x3U, 0x401F8620U, 0x1U, 0x401F83B8U -#define IOMUXC_GPIO_SD_B0_03_LPSPI1_SDI 0x401F81C8U, 0x4U, 0x401F84F4U, 0x1U, 0x401F83B8U -#define IOMUXC_GPIO_SD_B0_03_GPIO3_IO15 0x401F81C8U, 0x5U, 0, 0, 0x401F83B8U - -#define IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2 0x401F81CCU, 0x0U, 0, 0, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_FLEXPWM1_PWMA02 0x401F81CCU, 0x1U, 0x401F8460U, 0x1U, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_LPUART8_TX 0x401F81CCU, 0x2U, 0x401F8564U, 0x0U, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_XBAR1_INOUT08 0x401F81CCU, 0x3U, 0x401F8624U, 0x1U, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_FLEXSPIB_SS0_B 0x401F81CCU, 0x4U, 0, 0, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_GPIO3_IO16 0x401F81CCU, 0x5U, 0, 0, 0x401F83BCU -#define IOMUXC_GPIO_SD_B0_04_CCM_CLKO1 0x401F81CCU, 0x6U, 0, 0, 0x401F83BCU - -#define IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3 0x401F81D0U, 0x0U, 0, 0, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_FLEXPWM1_PWMB02 0x401F81D0U, 0x1U, 0x401F8470U, 0x1U, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_LPUART8_RX 0x401F81D0U, 0x2U, 0x401F8560U, 0x0U, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_XBAR1_INOUT09 0x401F81D0U, 0x3U, 0x401F8628U, 0x1U, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_FLEXSPIB_DQS 0x401F81D0U, 0x4U, 0, 0, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_GPIO3_IO17 0x401F81D0U, 0x5U, 0, 0, 0x401F83C0U -#define IOMUXC_GPIO_SD_B0_05_CCM_CLKO2 0x401F81D0U, 0x6U, 0, 0, 0x401F83C0U - -#define IOMUXC_GPIO_SD_B1_00_USDHC2_DATA3 0x401F81D4U, 0x0U, 0x401F85F4U, 0x0U, 0x401F83C4U -#define IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03 0x401F81D4U, 0x1U, 0x401F84C4U, 0x0U, 0x401F83C4U -#define IOMUXC_GPIO_SD_B1_00_FLEXPWM1_PWMA03 0x401F81D4U, 0x2U, 0x401F8454U, 0x0U, 0x401F83C4U -#define IOMUXC_GPIO_SD_B1_00_SAI1_TX_DATA03 0x401F81D4U, 0x3U, 0x401F8598U, 0x0U, 0x401F83C4U -#define IOMUXC_GPIO_SD_B1_00_LPUART4_TX 0x401F81D4U, 0x4U, 0x401F8544U, 0x0U, 0x401F83C4U -#define IOMUXC_GPIO_SD_B1_00_GPIO3_IO00 0x401F81D4U, 0x5U, 0, 0, 0x401F83C4U - -#define IOMUXC_GPIO_SD_B1_01_USDHC2_DATA2 0x401F81D8U, 0x0U, 0x401F85F0U, 0x0U, 0x401F83C8U -#define IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02 0x401F81D8U, 0x1U, 0x401F84C0U, 0x0U, 0x401F83C8U -#define IOMUXC_GPIO_SD_B1_01_FLEXPWM1_PWMB03 0x401F81D8U, 0x2U, 0x401F8464U, 0x0U, 0x401F83C8U -#define IOMUXC_GPIO_SD_B1_01_SAI1_TX_DATA02 0x401F81D8U, 0x3U, 0x401F859CU, 0x0U, 0x401F83C8U -#define IOMUXC_GPIO_SD_B1_01_LPUART4_RX 0x401F81D8U, 0x4U, 0x401F8540U, 0x0U, 0x401F83C8U -#define IOMUXC_GPIO_SD_B1_01_GPIO3_IO01 0x401F81D8U, 0x5U, 0, 0, 0x401F83C8U - -#define IOMUXC_GPIO_SD_B1_02_USDHC2_DATA1 0x401F81DCU, 0x0U, 0x401F85ECU, 0x0U, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01 0x401F81DCU, 0x1U, 0x401F84BCU, 0x0U, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_FLEXPWM2_PWMA03 0x401F81DCU, 0x2U, 0x401F8474U, 0x0U, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_SAI1_TX_DATA01 0x401F81DCU, 0x3U, 0x401F85A0U, 0x0U, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_FLEXCAN1_TX 0x401F81DCU, 0x4U, 0, 0, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_GPIO3_IO02 0x401F81DCU, 0x5U, 0, 0, 0x401F83CCU -#define IOMUXC_GPIO_SD_B1_02_CCM_WAIT 0x401F81DCU, 0x6U, 0, 0, 0x401F83CCU - -#define IOMUXC_GPIO_SD_B1_03_USDHC2_DATA0 0x401F81E0U, 0x0U, 0x401F85E8U, 0x0U, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00 0x401F81E0U, 0x1U, 0x401F84B8U, 0x0U, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_FLEXPWM2_PWMB03 0x401F81E0U, 0x2U, 0x401F8484U, 0x0U, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_SAI1_MCLK 0x401F81E0U, 0x3U, 0x401F858CU, 0x0U, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_FLEXCAN1_RX 0x401F81E0U, 0x4U, 0x401F844CU, 0x0U, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_GPIO3_IO03 0x401F81E0U, 0x5U, 0, 0, 0x401F83D0U -#define IOMUXC_GPIO_SD_B1_03_CCM_PMIC_READY 0x401F81E0U, 0x6U, 0x401F83FCU, 0x0U, 0x401F83D0U - -#define IOMUXC_GPIO_SD_B1_04_USDHC2_CLK 0x401F81E4U, 0x0U, 0x401F85DCU, 0x0U, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK 0x401F81E4U, 0x1U, 0, 0, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_LPI2C1_SCL 0x401F81E4U, 0x2U, 0x401F84CCU, 0x0U, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_SAI1_RX_SYNC 0x401F81E4U, 0x3U, 0x401F85A4U, 0x0U, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_FLEXSPIA_SS1_B 0x401F81E4U, 0x4U, 0, 0, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_GPIO3_IO04 0x401F81E4U, 0x5U, 0, 0, 0x401F83D4U -#define IOMUXC_GPIO_SD_B1_04_CCM_STOP 0x401F81E4U, 0x6U, 0, 0, 0x401F83D4U - -#define IOMUXC_GPIO_SD_B1_05_USDHC2_CMD 0x401F81E8U, 0x0U, 0x401F85E4U, 0x0U, 0x401F83D8U -#define IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS 0x401F81E8U, 0x1U, 0x401F84A4U, 0x0U, 0x401F83D8U -#define IOMUXC_GPIO_SD_B1_05_LPI2C1_SDA 0x401F81E8U, 0x2U, 0x401F84D0U, 0x0U, 0x401F83D8U -#define IOMUXC_GPIO_SD_B1_05_SAI1_RX_BCLK 0x401F81E8U, 0x3U, 0x401F8590U, 0x0U, 0x401F83D8U -#define IOMUXC_GPIO_SD_B1_05_FLEXSPIB_SS0_B 0x401F81E8U, 0x4U, 0, 0, 0x401F83D8U -#define IOMUXC_GPIO_SD_B1_05_GPIO3_IO05 0x401F81E8U, 0x5U, 0, 0, 0x401F83D8U - -#define IOMUXC_GPIO_SD_B1_06_USDHC2_RESET_B 0x401F81ECU, 0x0U, 0, 0, 0x401F83DCU -#define IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B 0x401F81ECU, 0x1U, 0, 0, 0x401F83DCU -#define IOMUXC_GPIO_SD_B1_06_LPUART7_CTS_B 0x401F81ECU, 0x2U, 0, 0, 0x401F83DCU -#define IOMUXC_GPIO_SD_B1_06_SAI1_RX_DATA00 0x401F81ECU, 0x3U, 0x401F8594U, 0x0U, 0x401F83DCU -#define IOMUXC_GPIO_SD_B1_06_LPSPI2_PCS0 0x401F81ECU, 0x4U, 0x401F84FCU, 0x0U, 0x401F83DCU -#define IOMUXC_GPIO_SD_B1_06_GPIO3_IO06 0x401F81ECU, 0x5U, 0, 0, 0x401F83DCU - -#define IOMUXC_GPIO_SD_B1_07_SEMC_CSX01 0x401F81F0U, 0x0U, 0, 0, 0x401F83E0U -#define IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK 0x401F81F0U, 0x1U, 0x401F84C8U, 0x0U, 0x401F83E0U -#define IOMUXC_GPIO_SD_B1_07_LPUART7_RTS_B 0x401F81F0U, 0x2U, 0, 0, 0x401F83E0U -#define IOMUXC_GPIO_SD_B1_07_SAI1_TX_DATA00 0x401F81F0U, 0x3U, 0, 0, 0x401F83E0U -#define IOMUXC_GPIO_SD_B1_07_LPSPI2_SCK 0x401F81F0U, 0x4U, 0x401F8500U, 0x0U, 0x401F83E0U -#define IOMUXC_GPIO_SD_B1_07_GPIO3_IO07 0x401F81F0U, 0x5U, 0, 0, 0x401F83E0U - -#define IOMUXC_GPIO_SD_B1_08_USDHC2_DATA4 0x401F81F4U, 0x0U, 0x401F85F8U, 0x0U, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00 0x401F81F4U, 0x1U, 0x401F84A8U, 0x0U, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_LPUART7_TX 0x401F81F4U, 0x2U, 0x401F855CU, 0x0U, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_SAI1_TX_BCLK 0x401F81F4U, 0x3U, 0x401F85A8U, 0x0U, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_LPSPI2_SD0 0x401F81F4U, 0x4U, 0x401F8508U, 0x0U, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_GPIO3_IO08 0x401F81F4U, 0x5U, 0, 0, 0x401F83E4U -#define IOMUXC_GPIO_SD_B1_08_SEMC_CSX02 0x401F81F4U, 0x6U, 0, 0, 0x401F83E4U - -#define IOMUXC_GPIO_SD_B1_09_USDHC2_DATA5 0x401F81F8U, 0x0U, 0x401F85FCU, 0x0U, 0x401F83E8U -#define IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01 0x401F81F8U, 0x1U, 0x401F84ACU, 0x0U, 0x401F83E8U -#define IOMUXC_GPIO_SD_B1_09_LPUART7_RX 0x401F81F8U, 0x2U, 0x401F8558U, 0x0U, 0x401F83E8U -#define IOMUXC_GPIO_SD_B1_09_SAI1_TX_SYNC 0x401F81F8U, 0x3U, 0x401F85ACU, 0x0U, 0x401F83E8U -#define IOMUXC_GPIO_SD_B1_09_LPSPI2_SDI 0x401F81F8U, 0x4U, 0x401F8504U, 0x0U, 0x401F83E8U -#define IOMUXC_GPIO_SD_B1_09_GPIO3_IO09 0x401F81F8U, 0x5U, 0, 0, 0x401F83E8U - -#define IOMUXC_GPIO_SD_B1_10_USDHC2_DATA6 0x401F81FCU, 0x0U, 0x401F8600U, 0x0U, 0x401F83ECU -#define IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02 0x401F81FCU, 0x1U, 0x401F84B0U, 0x0U, 0x401F83ECU -#define IOMUXC_GPIO_SD_B1_10_LPUART2_RX 0x401F81FCU, 0x2U, 0x401F852CU, 0x0U, 0x401F83ECU -#define IOMUXC_GPIO_SD_B1_10_LPI2C2_SDA 0x401F81FCU, 0x3U, 0x401F84D8U, 0x0U, 0x401F83ECU -#define IOMUXC_GPIO_SD_B1_10_LPSPI2_PCS2 0x401F81FCU, 0x4U, 0, 0, 0x401F83ECU -#define IOMUXC_GPIO_SD_B1_10_GPIO3_IO10 0x401F81FCU, 0x5U, 0, 0, 0x401F83ECU - -#define IOMUXC_GPIO_SD_B1_11_USDHC2_DATA7 0x401F8200U, 0x0U, 0x401F8604U, 0x0U, 0x401F83F0U -#define IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03 0x401F8200U, 0x1U, 0x401F84B4U, 0x0U, 0x401F83F0U -#define IOMUXC_GPIO_SD_B1_11_LPUART2_TX 0x401F8200U, 0x2U, 0x401F8530U, 0x0U, 0x401F83F0U -#define IOMUXC_GPIO_SD_B1_11_LPI2C2_SCL 0x401F8200U, 0x3U, 0x401F84D4U, 0x0U, 0x401F83F0U -#define IOMUXC_GPIO_SD_B1_11_LPSPI2_PCS3 0x401F8200U, 0x4U, 0, 0, 0x401F83F0U -#define IOMUXC_GPIO_SD_B1_11_GPIO3_IO11 0x401F8200U, 0x5U, 0, 0, 0x401F83F0U - -/*@}*/ - -#define IOMUXC_GPR_SAIMCLK_LOWBITMASK (0x7U) -#define IOMUXC_GPR_SAIMCLK_HIGHBITMASK (0x3U) - -typedef enum _iomuxc_gpr_mode -{ - kIOMUXC_GPR_GlobalInterruptRequest = IOMUXC_GPR_GPR1_GINT_MASK, - kIOMUXC_GPR_ENET1RefClkMode = IOMUXC_GPR_GPR1_ENET1_CLK_SEL_MASK, - kIOMUXC_GPR_USBExposureMode = IOMUXC_GPR_GPR1_USB_EXP_MODE_MASK, - kIOMUXC_GPR_ENET1TxClkOutputDir = IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK, - kIOMUXC_GPR_SAI1MClkOutputDir = IOMUXC_GPR_GPR1_SAI1_MCLK_DIR_MASK, - kIOMUXC_GPR_SAI2MClkOutputDir = IOMUXC_GPR_GPR1_SAI2_MCLK_DIR_MASK, - kIOMUXC_GPR_SAI3MClkOutputDir = IOMUXC_GPR_GPR1_SAI3_MCLK_DIR_MASK, - kIOMUXC_GPR_ExcMonitorSlavErrResponse = IOMUXC_GPR_GPR1_EXC_MON_MASK, - kIOMUXC_GPR_ENETIpgClkOn = IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN_MASK, - kIOMUXC_GPR_AHBClockEnable = (int)IOMUXC_GPR_GPR1_CM7_FORCE_HCLK_EN_MASK, -} iomuxc_gpr_mode_t; - -typedef enum _iomuxc_gpr_saimclk -{ - kIOMUXC_GPR_SAI1MClk1Sel = IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_SHIFT, - kIOMUXC_GPR_SAI1MClk2Sel = IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_SHIFT, - kIOMUXC_GPR_SAI1MClk3Sel = IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_SHIFT, - kIOMUXC_GPR_SAI2MClk3Sel = IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_SHIFT, - kIOMUXC_GPR_SAI3MClk3Sel = IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_SHIFT, -} iomuxc_gpr_saimclk_t; - -typedef enum _iomuxc_mqs_pwm_oversample_rate -{ - kIOMUXC_MqsPwmOverSampleRate32 = 0, /* MQS PWM over sampling rate 32. */ - kIOMUXC_MqsPwmOverSampleRate64 = 1 /* MQS PWM over sampling rate 64. */ -} iomuxc_mqs_pwm_oversample_rate_t; - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus */ - -/*! @name Configuration */ -/*@{*/ - -/*! - * @brief Sets the IOMUXC pin mux mode. - * @note The first five parameters can be filled with the pin function ID macros. - * - * This is an example to set the PTA6 as the lpuart0_tx: - * @code - * IOMUXC_SetPinMux(IOMUXC_PTA6_LPUART0_TX, 0); - * @endcode - * - * This is an example to set the PTA0 as GPIOA0: - * @code - * IOMUXC_SetPinMux(IOMUXC_PTA0_GPIOA0, 0); - * @endcode - * - * @param muxRegister The pin mux register. - * @param muxMode The pin mux mode. - * @param inputRegister The select input register. - * @param inputDaisy The input daisy. - * @param configRegister The config register. - * @param inputOnfield Software input on field. - */ -static inline void IOMUXC_SetPinMux(uint32_t muxRegister, - uint32_t muxMode, - uint32_t inputRegister, - uint32_t inputDaisy, - uint32_t configRegister, - uint32_t inputOnfield) -{ - *((volatile uint32_t *)muxRegister) = - IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield); - - if (inputRegister != 0UL) - { - *((volatile uint32_t *)inputRegister) = inputDaisy; - } -} - -/*! - * @brief Sets the IOMUXC pin configuration. - * @note The previous five parameters can be filled with the pin function ID macros. - * - * This is an example to set pin configuration for IOMUXC_PTA3_LPI2C0_SCLS: - * @code - * IOMUXC_SetPinConfig(IOMUXC_PTA3_LPI2C0_SCLS,IOMUXC_SW_PAD_CTL_PAD_PUS_MASK|IOMUXC_SW_PAD_CTL_PAD_PUS(2U)) - * @endcode - * - * @param muxRegister The pin mux register. - * @param muxMode The pin mux mode. - * @param inputRegister The select input register. - * @param inputDaisy The input daisy. - * @param configRegister The config register. - * @param configValue The pin config value. - */ -static inline void IOMUXC_SetPinConfig(uint32_t muxRegister, - uint32_t muxMode, - uint32_t inputRegister, - uint32_t inputDaisy, - uint32_t configRegister, - uint32_t configValue) -{ - if (configRegister != 0UL) - { - *((volatile uint32_t *)configRegister) = configValue; - } -} - -/*! - * @brief Sets IOMUXC general configuration for some mode. - * - * @param base The IOMUXC GPR base address. - * @param mode The mode for setting. the mode is the logical OR of "iomuxc_gpr_mode" - * @param enable True enable false disable. - */ -static inline void IOMUXC_EnableMode(IOMUXC_GPR_Type *base, uint32_t mode, bool enable) -{ - mode &= ~(IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_MASK | IOMUXC_GPR_GPR1_SAI1_MCLK2_SEL_MASK | - IOMUXC_GPR_GPR1_SAI1_MCLK3_SEL_MASK | IOMUXC_GPR_GPR1_SAI2_MCLK3_SEL_MASK | - IOMUXC_GPR_GPR1_SAI3_MCLK3_SEL_MASK); - - if (enable) - { - base->GPR1 |= mode; - } - else - { - base->GPR1 &= ~mode; - } -} - -/*! - * @brief Sets IOMUXC general configuration for SAI MCLK selection. - * - * @param base The IOMUXC GPR base address. - * @param mclk The SAI MCLK. - * @param clkSrc The clock source. Take refer to register setting details for the clock source in RM. - */ -static inline void IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR_Type *base, iomuxc_gpr_saimclk_t mclk, uint8_t clkSrc) -{ - uint32_t gpr; - - if (mclk > kIOMUXC_GPR_SAI1MClk2Sel) - { - gpr = base->GPR1 & ~((uint32_t)IOMUXC_GPR_SAIMCLK_HIGHBITMASK << (uint32_t)mclk); - base->GPR1 = (((uint32_t)clkSrc & IOMUXC_GPR_SAIMCLK_HIGHBITMASK) << (uint32_t)mclk) | gpr; - } - else - { - gpr = base->GPR1 & ~((uint32_t)IOMUXC_GPR_SAIMCLK_LOWBITMASK << (uint32_t)mclk); - base->GPR1 = (((uint32_t)clkSrc & IOMUXC_GPR_SAIMCLK_LOWBITMASK) << (uint32_t)mclk) | gpr; - } -} - -/*! - * @brief Enters or exit MQS software reset. - * - * @param base The IOMUXC GPR base address. - * @param enable Enter or exit MQS software reset. - */ -static inline void IOMUXC_MQSEnterSoftwareReset(IOMUXC_GPR_Type *base, bool enable) -{ - if (enable) - { - base->GPR2 |= IOMUXC_GPR_GPR2_MQS_SW_RST_MASK; - } - else - { - base->GPR2 &= ~IOMUXC_GPR_GPR2_MQS_SW_RST_MASK; - } -} - -/*! - * @brief Enables or disables MQS. - * - * @param base The IOMUXC GPR base address. - * @param enable Enable or disable the MQS. - */ -static inline void IOMUXC_MQSEnable(IOMUXC_GPR_Type *base, bool enable) -{ - if (enable) - { - base->GPR2 |= IOMUXC_GPR_GPR2_MQS_EN_MASK; - } - else - { - base->GPR2 &= ~IOMUXC_GPR_GPR2_MQS_EN_MASK; - } -} - -/*! - * @brief Configure MQS PWM oversampling rate compared with mclk and divider ratio control for mclk from hmclk. - * - * @param base The IOMUXC GPR base address. - * @param rate The MQS PWM oversampling rate, refer to "iomuxc_mqs_pwm_oversample_rate_t". - * @param divider The divider ratio control for mclk from hmclk. mclk freq = 1 /(divider + 1) * hmclk freq. - */ - -static inline void IOMUXC_MQSConfig(IOMUXC_GPR_Type *base, iomuxc_mqs_pwm_oversample_rate_t rate, uint8_t divider) -{ - uint32_t gpr = base->GPR2 & ~(IOMUXC_GPR_GPR2_MQS_OVERSAMPLE_MASK | IOMUXC_GPR_GPR2_MQS_CLK_DIV_MASK); - base->GPR2 = gpr | IOMUXC_GPR_GPR2_MQS_OVERSAMPLE(rate) | IOMUXC_GPR_GPR2_MQS_CLK_DIV(divider); -} - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /*_cplusplus */ - -/*! @}*/ - -#endif /* _FSL_IOMUXC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_kpp.c b/devices/MIMXRT1052/drivers/fsl_kpp.c deleted file mode 100644 index 8c0b195..0000000 --- a/devices/MIMXRT1052/drivers/fsl_kpp.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2017, 2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_kpp.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.kpp" -#endif - -#define KPP_KEYPAD_SCAN_TIMES (3U) -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to SEMC clocks for each instance. */ -static const clock_ip_name_t s_kppClock[FSL_FEATURE_SOC_KPP_COUNT] = KPP_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Pointers to SEMC bases for each instance. */ -static KPP_Type *const s_kppBases[] = KPP_BASE_PTRS; - -/*! @brief Pointers to KPP IRQ number for each instance. */ -static const IRQn_Type s_kppIrqs[] = KPP_IRQS; -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t KPP_GetInstance(KPP_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_kppBases); instance++) - { - if (s_kppBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_kppBases)); - - return instance; -} -static void KPP_Mdelay(uint64_t tickets) -{ - while ((tickets--) != 0UL) - { - __NOP(); - } -} - -/*! - * brief KPP initialize. - * This function ungates the KPP clock and initializes KPP. - * This function must be called before calling any other KPP driver functions. - * - * param base KPP peripheral base address. - * param configure The KPP configuration structure pointer. - */ -void KPP_Init(KPP_Type *base, kpp_config_t *configure) -{ - assert(configure); - - uint32_t instance = KPP_GetInstance(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Un-gate sdram controller clock. */ - CLOCK_EnableClock(s_kppClock[KPP_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Clear all. */ - base->KPSR &= (uint16_t)(~(KPP_KPSR_KRIE_MASK | KPP_KPSR_KDIE_MASK)); - - /* Enable the keypad row and set the column strobe output to open drain. */ - base->KPCR = KPP_KPCR_KRE(configure->activeRow); - base->KPDR = KPP_KPDR_KCD((uint8_t) ~(configure->activeColumn)); - base->KPCR |= KPP_KPCR_KCO(configure->activeColumn); - - /* Set the input direction for row and output direction for column. */ - base->KDDR = KPP_KDDR_KCDD(configure->activeColumn) | KPP_KDDR_KRDD((uint8_t) ~(configure->activeRow)); - - /* Clear the status flag and enable the interrupt. */ - base->KPSR = KPP_KPSR_KPKR_MASK | KPP_KPSR_KPKD_MASK | KPP_KPSR_KDSC_MASK | configure->interrupt; - - if ((configure->interrupt) != 0U) - { - /* Enable at the Interrupt */ - (void)EnableIRQ(s_kppIrqs[instance]); - } -} - -/*! - * brief Deinitializes the KPP module and gates the clock. - * This function gates the KPP clock. As a result, the KPP - * module doesn't work after calling this function. - * - * param base KPP peripheral base address. - */ -void KPP_Deinit(KPP_Type *base) -{ - /* Disable interrupts and disable all rows. */ - base->KPSR &= (uint16_t)(~(KPP_KPSR_KRIE_MASK | KPP_KPSR_KDIE_MASK)); - base->KPCR = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable KPP clock. */ - CLOCK_DisableClock(s_kppClock[KPP_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Keypad press scanning. - * - * This function will scanning all columns and rows. so - * all scanning data will be stored in the data pointer. - * - * param base KPP peripheral base address. - * param data KPP key press scanning data. The data buffer should be prepared with - * length at least equal to KPP_KEYPAD_COLUMNNUM_MAX * KPP_KEYPAD_ROWNUM_MAX. - * the data pointer is recommended to be a array like uint8_t data[KPP_KEYPAD_COLUMNNUM_MAX]. - * for example the data[2] = 4, that means in column 1 row 2 has a key press event. - * param clockSrc_Hz Source clock. - */ -void KPP_keyPressScanning(KPP_Type *base, uint8_t *data, uint32_t clockSrc_Hz) -{ - assert(data); - - uint16_t kppKCO = base->KPCR & KPP_KPCR_KCO_MASK; - uint8_t columIndex = 0; - uint8_t activeColumn = (uint8_t)((base->KPCR & KPP_KPCR_KCO_MASK) >> KPP_KPCR_KCO_SHIFT); - uint8_t times; - uint8_t rowData[KPP_KEYPAD_SCAN_TIMES][KPP_KEYPAD_COLUMNNUM_MAX]; - bool press = false; - uint8_t column; - - /* Initialize row data to zero. */ - (void)memset(&rowData[0][0], 0, sizeof(rowData)); - - /* Scanning. */ - /* Configure the column data to 1 according to column numbers. */ - base->KPDR = KPP_KPDR_KCD_MASK; - /* Configure column to totem pole for quick discharge of keypad capacitance. */ - base->KPCR &= (uint16_t)(((uint16_t)~kppKCO) | KPP_KPCR_KRE_MASK); - /* Recover. */ - base->KPCR |= kppKCO; - /* Three times scanning. */ - for (times = 0; times < KPP_KEYPAD_SCAN_TIMES; times++) - { - for (columIndex = 0; columIndex < KPP_KEYPAD_COLUMNNUM_MAX; columIndex++) - { - column = activeColumn & (1U << columIndex); - if (column != 0U) - { - /* Set the single column line to 0. */ - base->KPDR = KPP_KPDR_KCD(~(uint16_t)column); - /* Take 100us delays. */ - KPP_Mdelay(((uint64_t)clockSrc_Hz / 10000000UL)); - /* Read row data. */ - rowData[times][columIndex] = (uint8_t)(~(base->KPDR & KPP_KPDR_KRD_MASK)); - } - else - { - /* Read row data. */ - rowData[times][columIndex] = 0; - } - } - } - - /* Return all columns to 0 in preparation for standby mode. */ - base->KPDR &= (uint16_t)(~KPP_KPDR_KCD_MASK); - - /* Check if three time scan data is the same. */ - for (columIndex = 0; columIndex < KPP_KEYPAD_COLUMNNUM_MAX; columIndex++) - { - if (((uint8_t)(rowData[0][columIndex] & rowData[1][columIndex]) & rowData[2][columIndex]) != 0U) - { - press = true; - } - } - - if (press) - { - (void)memcpy(data, &rowData[0][0], sizeof(rowData[0])); - } - else - { - (void)memset(data, 0, sizeof(rowData[0])); - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_kpp.h b/devices/MIMXRT1052/drivers/fsl_kpp.h deleted file mode 100644 index dc65aaf..0000000 --- a/devices/MIMXRT1052/drivers/fsl_kpp.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2017, 2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_KPP_H_ -#define _FSL_KPP_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup kpp - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief KPP driver version 2.0.0. */ -#define FSL_KPP_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) -/*@}*/ - -#define KPP_KEYPAD_COLUMNNUM_MAX (8U) -#define KPP_KEYPAD_ROWNUM_MAX (8U) - -/*! @brief List of interrupts supported by the peripheral. This - * enumeration uses one-bot encoding to allow a logical OR of multiple - * members. Members usually map to interrupt enable bits in one or more - * peripheral registers. - */ -typedef enum _kpp_interrupt_enable -{ - kKPP_keyDepressInterrupt = KPP_KPSR_KDIE_MASK, /*!< Keypad depress interrupt source */ - kKPP_keyReleaseInterrupt = KPP_KPSR_KRIE_MASK /*!< Keypad release interrupt source */ -} kpp_interrupt_enable_t; - -/*! @brief Lists of KPP synchronize chain operation. */ -typedef enum _kpp_sync_operation -{ - kKPP_ClearKeyDepressSyncChain = KPP_KPSR_KDSC_MASK, /*!< Keypad depress interrupt status. */ - kKPP_SetKeyReleasesSyncChain = KPP_KPSR_KRSS_MASK, /*!< Keypad release interrupt status. */ -} kpp_sync_operation_t; - -/*! @brief Lists of KPP status. */ -typedef struct _kpp_config -{ - uint8_t activeRow; /*!< The row number: bit 7 ~ 0 represents the row 7 ~ 0. */ - uint8_t activeColumn; /*!< The column number: bit 7 ~ 0 represents the column 7 ~ 0. */ - uint16_t interrupt; /*!< KPP interrupt source. A logical OR of "kpp_interrupt_enable_t". */ -} kpp_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and De-initialization - * @{ - */ - -/*! - * @brief KPP initialize. - * This function ungates the KPP clock and initializes KPP. - * This function must be called before calling any other KPP driver functions. - * - * @param base KPP peripheral base address. - * @param configure The KPP configuration structure pointer. - */ -void KPP_Init(KPP_Type *base, kpp_config_t *configure); - -/*! - * @brief Deinitializes the KPP module and gates the clock. - * This function gates the KPP clock. As a result, the KPP - * module doesn't work after calling this function. - * - * @param base KPP peripheral base address. - */ -void KPP_Deinit(KPP_Type *base); - -/* @} */ - -/*! - * @name KPP Basic Operation - * @{ - */ - -/*! - * @brief Enable the interrupt. - * - * @param base KPP peripheral base address. - * @param mask KPP interrupts to enable. This is a logical OR of the - * enumeration :: kpp_interrupt_enable_t. - */ -static inline void KPP_EnableInterrupts(KPP_Type *base, uint16_t mask) -{ - uint16_t data = (uint16_t)(base->KPSR & ~(KPP_KPSR_KPKR_MASK | KPP_KPSR_KPKD_MASK)); - base->KPSR = data | mask; -} - -/*! - * @brief Disable the interrupt. - * - * @param base KPP peripheral base address. - * @param mask KPP interrupts to disable. This is a logical OR of the - * enumeration :: kpp_interrupt_enable_t. - */ -static inline void KPP_DisableInterrupts(KPP_Type *base, uint16_t mask) -{ - base->KPSR &= ~(mask | KPP_KPSR_KPKR_MASK | KPP_KPSR_KPKD_MASK); -} - -/*! - * @brief Gets the KPP interrupt event status. - * - * @param base KPP peripheral base address. - * @return The status of the KPP. Application can use the enum type in the "kpp_interrupt_enable_t" - * to get the right status of the related event. - */ -static inline uint16_t KPP_GetStatusFlag(KPP_Type *base) -{ - return (base->KPSR & (KPP_KPSR_KPKR_MASK | KPP_KPSR_KPKD_MASK)) << KPP_KPSR_KDIE_SHIFT; -} - -/*! - * @brief Clears KPP status flag. - * - * @param base KPP peripheral base address. - * @param mask KPP mask to be cleared. This is a logical OR of the - * enumeration :: kpp_interrupt_enable_t. - */ -static inline void KPP_ClearStatusFlag(KPP_Type *base, uint16_t mask) -{ - base->KPSR |= (uint16_t)((mask) >> KPP_KPSR_KDIE_SHIFT); -} - -/*! - * @brief Set KPP synchronization chain. - * - * @param base KPP peripheral base address. - * @param mask KPP mask to be cleared. This is a logical OR of the - * enumeration :: kpp_sync_operation_t. - */ -static inline void KPP_SetSynchronizeChain(KPP_Type *base, uint16_t mask) -{ - uint16_t data = base->KPSR & (KPP_KPSR_KRSS_MASK | KPP_KPSR_KDSC_MASK | KPP_KPSR_KRIE_MASK | KPP_KPSR_KDIE_MASK); - base->KPSR = data | mask; -} - -/*! - * @brief Keypad press scanning. - * - * This function will scanning all columns and rows. so - * all scanning data will be stored in the data pointer. - * - * @param base KPP peripheral base address. - * @param data KPP key press scanning data. The data buffer should be prepared with - * length at least equal to KPP_KEYPAD_COLUMNNUM_MAX * KPP_KEYPAD_ROWNUM_MAX. - * the data pointer is recommended to be a array like uint8_t data[KPP_KEYPAD_COLUMNNUM_MAX]. - * for example the data[2] = 4, that means in column 1 row 2 has a key press event. - * @param clockSrc_Hz Source clock. - */ -void KPP_keyPressScanning(KPP_Type *base, uint8_t *data, uint32_t clockSrc_Hz); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_KPP_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c.c b/devices/MIMXRT1052/drivers/fsl_lpi2c.c deleted file mode 100644 index 54b0baf..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c.c +++ /dev/null @@ -1,2433 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpi2c.h" -#include -#include - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpi2c" -#endif - -/* ! @brief LPI2C master fifo commands. */ -enum -{ - kTxDataCmd = LPI2C_MTDR_CMD(0x0U), /*!< Transmit DATA[7:0] */ - kRxDataCmd = LPI2C_MTDR_CMD(0X1U), /*!< Receive (DATA[7:0] + 1) bytes */ - kStopCmd = LPI2C_MTDR_CMD(0x2U), /*!< Generate STOP condition */ - kStartCmd = LPI2C_MTDR_CMD(0x4U), /*!< Generate(repeated) START and transmit address in DATA[[7:0] */ -}; - -/*! - * @brief Default watermark values. - * - * The default watermarks are set to zero. - */ -enum -{ - kDefaultTxWatermark = 0, - kDefaultRxWatermark = 0, -}; - -/*! @brief States for the state machine used by transactional APIs. */ -enum -{ - kIdleState = 0, - kSendCommandState, - kIssueReadCommandState, - kTransferDataState, - kStopState, - kWaitForCompletionState, -}; - -/*! @brief Typedef for slave interrupt handler. */ -typedef void (*lpi2c_slave_isr_t)(LPI2C_Type *base, lpi2c_slave_handle_t *handle); - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -static uint32_t LPI2C_GetCyclesForWidth(uint32_t sourceClock_Hz, - uint32_t width_ns, - uint32_t maxCycles, - uint32_t prescaler); - -static status_t LPI2C_MasterWaitForTxReady(LPI2C_Type *base); - -static status_t LPI2C_RunTransferStateMachine(LPI2C_Type *base, lpi2c_master_handle_t *handle, bool *isDone); - -static void LPI2C_InitTransferStateMachine(lpi2c_master_handle_t *handle); - -static status_t LPI2C_SlaveCheckAndClearError(LPI2C_Type *base, uint32_t flags); - -static void LPI2C_CommonIRQHandler(LPI2C_Type *base, uint32_t instance); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Array to map LPI2C instance number to base pointer. */ -static LPI2C_Type *const kLpi2cBases[] = LPI2C_BASE_PTRS; - -/*! @brief Array to map LPI2C instance number to IRQ number, used internally for LPI2C master interrupt and EDMA -transactional APIs. */ -IRQn_Type const kLpi2cIrqs[] = LPI2C_IRQS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Array to map LPI2C instance number to clock gate enum. */ -static clock_ip_name_t const kLpi2cClocks[] = LPI2C_CLOCKS; - -#if defined(LPI2C_PERIPH_CLOCKS) -/*! @brief Array to map LPI2C instance number to pheripheral clock gate enum. */ -static const clock_ip_name_t kLpi2cPeriphClocks[] = LPI2C_PERIPH_CLOCKS; -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Pointer to master IRQ handler for each instance, used internally for LPI2C master interrupt and EDMA -transactional APIs. */ -lpi2c_master_isr_t s_lpi2cMasterIsr; - -/*! @brief Pointers to master handles for each instance, used internally for LPI2C master interrupt and EDMA -transactional APIs. */ -void *s_lpi2cMasterHandle[ARRAY_SIZE(kLpi2cBases)]; - -/*! @brief Pointer to slave IRQ handler for each instance. */ -static lpi2c_slave_isr_t s_lpi2cSlaveIsr; - -/*! @brief Pointers to slave handles for each instance. */ -static lpi2c_slave_handle_t *s_lpi2cSlaveHandle[ARRAY_SIZE(kLpi2cBases)]; - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Returns an instance number given a base address. - * - * If an invalid base address is passed, debug builds will assert. Release builds will just return - * instance number 0. - * - * param base The LPI2C peripheral base address. - * return LPI2C instance number starting from 0. - */ -uint32_t LPI2C_GetInstance(LPI2C_Type *base) -{ - uint32_t instance; - for (instance = 0U; instance < ARRAY_SIZE(kLpi2cBases); ++instance) - { - if (kLpi2cBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(kLpi2cBases)); - return instance; -} - -/*! - * @brief Computes a cycle count for a given time in nanoseconds. - * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. - * @param width_ns Desired with in nanoseconds. - * @param maxCycles Maximum cycle count, determined by the number of bits wide the cycle count field is. - * @param prescaler LPI2C prescaler setting. - */ -static uint32_t LPI2C_GetCyclesForWidth(uint32_t sourceClock_Hz, - uint32_t width_ns, - uint32_t maxCycles, - uint32_t prescaler) -{ - assert(sourceClock_Hz > 0U); - - uint32_t divider = 1U; - - while (prescaler != 0U) - { - divider *= 2U; - prescaler--; - } - - uint32_t busCycle_ns = 1000000U / (sourceClock_Hz / divider / 1000U); - uint32_t cycles = 0U; - - /* Search for the cycle count just below the desired glitch width. */ - while ((((cycles + 1U) * busCycle_ns) < width_ns) && (cycles + 1U < maxCycles)) - { - ++cycles; - } - - /* If we end up with zero cycles, then set the filter to a single cycle unless the */ - /* bus clock is greater than 10x the desired glitch width. */ - if ((cycles == 0U) && (busCycle_ns <= (width_ns * 10U))) - { - cycles = 1U; - } - - return cycles; -} - -/*! - * @brief Convert provided flags to status code, and clear any errors if present. - * @param base The LPI2C peripheral base address. - * @param status Current status flags value that will be checked. - * @retval #kStatus_Success - * @retval #kStatus_LPI2C_PinLowTimeout - * @retval #kStatus_LPI2C_ArbitrationLost - * @retval #kStatus_LPI2C_Nak - * @retval #kStatus_LPI2C_FifoError - */ -/* Not static so it can be used from fsl_lpi2c_edma.c. */ -status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status) -{ - status_t result = kStatus_Success; - - /* Check for error. These errors cause a stop to automatically be sent. We must */ - /* clear the errors before a new transfer can start. */ - status &= (uint32_t)kLPI2C_MasterErrorFlags; - if (0U != status) - { - /* Select the correct error code. Ordered by severity, with bus issues first. */ - if (0U != (status & (uint32_t)kLPI2C_MasterPinLowTimeoutFlag)) - { - result = kStatus_LPI2C_PinLowTimeout; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterArbitrationLostFlag)) - { - result = kStatus_LPI2C_ArbitrationLost; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterNackDetectFlag)) - { - result = kStatus_LPI2C_Nak; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterFifoErrFlag)) - { - result = kStatus_LPI2C_FifoError; - } - else - { - ; /* Intentional empty */ - } - - /* Clear the flags. */ - LPI2C_MasterClearStatusFlags(base, status); - - /* Reset fifos. These flags clear automatically. */ - base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; - } - else - { - ; /* Intentional empty */ - } - - return result; -} - -/*! - * @brief Wait until there is room in the tx fifo. - * @param base The LPI2C peripheral base address. - * @retval #kStatus_Success - * @retval #kStatus_LPI2C_PinLowTimeout - * @retval #kStatus_LPI2C_ArbitrationLost - * @retval #kStatus_LPI2C_Nak - * @retval #kStatus_LPI2C_FifoError - */ -static status_t LPI2C_MasterWaitForTxReady(LPI2C_Type *base) -{ - status_t result = kStatus_Success; - uint32_t status; - size_t txCount; - size_t txFifoSize = (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base); - -#if I2C_RETRY_TIMES != 0U - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - do - { - /* Get the number of words in the tx fifo and compute empty slots. */ - LPI2C_MasterGetFifoCounts(base, NULL, &txCount); - txCount = txFifoSize - txCount; - - /* Check for error flags. */ - status = LPI2C_MasterGetStatusFlags(base); - result = LPI2C_MasterCheckAndClearError(base, status); - if (kStatus_Success != result) - { - break; - } -#if I2C_RETRY_TIMES != 0U - waitTimes--; - } while ((0U == txCount) && (0U != waitTimes)); - - if (0U == waitTimes) - { - result = kStatus_LPI2C_Timeout; - } -#else - } while (0U == txCount); -#endif - - return result; -} - -/*! - * @brief Make sure the bus isn't already busy. - * - * A busy bus is allowed if we are the one driving it. - * - * @param base The LPI2C peripheral base address. - * @retval #kStatus_Success - * @retval #kStatus_LPI2C_Busy - */ -/* Not static so it can be used from fsl_lpi2c_edma.c. */ -status_t LPI2C_CheckForBusyBus(LPI2C_Type *base) -{ - status_t ret = kStatus_Success; - - uint32_t status = LPI2C_MasterGetStatusFlags(base); - if ((0U != (status & (uint32_t)kLPI2C_MasterBusBusyFlag)) && (0U == (status & (uint32_t)kLPI2C_MasterBusyFlag))) - { - ret = kStatus_LPI2C_Busy; - } - - return ret; -} - -/*! - * brief Provides a default configuration for the LPI2C master peripheral. - * - * This function provides the following default configuration for the LPI2C master peripheral: - * code - * masterConfig->enableMaster = true; - * masterConfig->debugEnable = false; - * masterConfig->ignoreAck = false; - * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; - * masterConfig->baudRate_Hz = 100000U; - * masterConfig->busIdleTimeout_ns = 0U; - * masterConfig->pinLowTimeout_ns = 0U; - * masterConfig->sdaGlitchFilterWidth_ns = 0U; - * masterConfig->sclGlitchFilterWidth_ns = 0U; - * masterConfig->hostRequest.enable = false; - * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; - * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; - * endcode - * - * After calling this function, you can override any settings in order to customize the configuration, - * prior to initializing the master driver with LPI2C_MasterInit(). - * - * param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. - */ -void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig) -{ - /* Initializes the configure structure to zero. */ - (void)memset(masterConfig, 0, sizeof(*masterConfig)); - - masterConfig->enableMaster = true; - masterConfig->debugEnable = false; - masterConfig->enableDoze = true; - masterConfig->ignoreAck = false; - masterConfig->pinConfig = kLPI2C_2PinOpenDrain; - masterConfig->baudRate_Hz = 100000U; - masterConfig->busIdleTimeout_ns = 0U; - masterConfig->pinLowTimeout_ns = 0U; - masterConfig->sdaGlitchFilterWidth_ns = 0U; - masterConfig->sclGlitchFilterWidth_ns = 0U; - masterConfig->hostRequest.enable = false; - masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; - masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; -} - -/*! - * brief Initializes the LPI2C master peripheral. - * - * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user - * provided configuration. A software reset is performed prior to configuration. - * - * param base The LPI2C peripheral base address. - * param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of - * defaults - * that you can override. - * param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, - * filter widths, and timeout periods. - */ -void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz) -{ - uint32_t prescaler; - uint32_t cycles; - uint32_t cfgr2; - uint32_t value; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPI2C_GetInstance(base); - - /* Ungate the clock. */ - (void)CLOCK_EnableClock(kLpi2cClocks[instance]); -#if defined(LPI2C_PERIPH_CLOCKS) - /* Ungate the functional clock in initialize function. */ - CLOCK_EnableClock(kLpi2cPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Reset peripheral before configuring it. */ - LPI2C_MasterReset(base); - - /* Doze bit: 0 is enable, 1 is disable */ - base->MCR = LPI2C_MCR_DBGEN(masterConfig->debugEnable) | LPI2C_MCR_DOZEN(!(masterConfig->enableDoze)); - - /* host request */ - value = base->MCFGR0; - value &= (~(LPI2C_MCFGR0_HREN_MASK | LPI2C_MCFGR0_HRPOL_MASK | LPI2C_MCFGR0_HRSEL_MASK)); - value |= LPI2C_MCFGR0_HREN(masterConfig->hostRequest.enable) | - LPI2C_MCFGR0_HRPOL(masterConfig->hostRequest.polarity) | - LPI2C_MCFGR0_HRSEL(masterConfig->hostRequest.source); - base->MCFGR0 = value; - - /* pin config and ignore ack */ - value = base->MCFGR1; - value &= ~(LPI2C_MCFGR1_PINCFG_MASK | LPI2C_MCFGR1_IGNACK_MASK); - value |= LPI2C_MCFGR1_PINCFG(masterConfig->pinConfig); - value |= LPI2C_MCFGR1_IGNACK(masterConfig->ignoreAck); - base->MCFGR1 = value; - - LPI2C_MasterSetWatermarks(base, (size_t)kDefaultTxWatermark, (size_t)kDefaultRxWatermark); - - /* Configure glitch filters. */ - cfgr2 = base->MCFGR2; - if (0U != (masterConfig->sdaGlitchFilterWidth_ns)) - { - cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->sdaGlitchFilterWidth_ns, - (LPI2C_MCFGR2_FILTSDA_MASK >> LPI2C_MCFGR2_FILTSDA_SHIFT), 1U); - cfgr2 &= ~LPI2C_MCFGR2_FILTSDA_MASK; - cfgr2 |= LPI2C_MCFGR2_FILTSDA(cycles); - } - if (0U != masterConfig->sclGlitchFilterWidth_ns) - { - cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->sclGlitchFilterWidth_ns, - (LPI2C_MCFGR2_FILTSCL_MASK >> LPI2C_MCFGR2_FILTSCL_SHIFT), 1U); - cfgr2 &= ~LPI2C_MCFGR2_FILTSCL_MASK; - cfgr2 |= LPI2C_MCFGR2_FILTSCL(cycles); - } - base->MCFGR2 = cfgr2; - - /* Configure baudrate after the SDA/SCL glitch filter setting, - since the baudrate calculation needs them as parameter. */ - LPI2C_MasterSetBaudRate(base, sourceClock_Hz, masterConfig->baudRate_Hz); - - /* Configure bus idle and pin low timeouts after baudrate setting, - since the timeout calculation needs prescaler as parameter. */ - prescaler = (base->MCFGR1 & LPI2C_MCFGR1_PRESCALE_MASK) >> LPI2C_MCFGR1_PRESCALE_SHIFT; - - if (0U != (masterConfig->busIdleTimeout_ns)) - { - cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->busIdleTimeout_ns, - (LPI2C_MCFGR2_BUSIDLE_MASK >> LPI2C_MCFGR2_BUSIDLE_SHIFT), prescaler); - cfgr2 &= ~LPI2C_MCFGR2_BUSIDLE_MASK; - cfgr2 |= LPI2C_MCFGR2_BUSIDLE(cycles); - } - base->MCFGR2 = cfgr2; - if (0U != masterConfig->pinLowTimeout_ns) - { - cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->pinLowTimeout_ns / 256U, - (LPI2C_MCFGR2_BUSIDLE_MASK >> LPI2C_MCFGR2_BUSIDLE_SHIFT), prescaler); - base->MCFGR3 = (base->MCFGR3 & ~LPI2C_MCFGR3_PINLOW_MASK) | LPI2C_MCFGR3_PINLOW(cycles); - } - - LPI2C_MasterEnable(base, masterConfig->enableMaster); -} - -/*! - * brief Deinitializes the LPI2C master peripheral. - * - * This function disables the LPI2C master peripheral and gates the clock. It also performs a software - * reset to restore the peripheral to reset conditions. - * - * param base The LPI2C peripheral base address. - */ -void LPI2C_MasterDeinit(LPI2C_Type *base) -{ - /* Restore to reset state. */ - LPI2C_MasterReset(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPI2C_GetInstance(base); - - /* Gate clock. */ - (void)CLOCK_DisableClock(kLpi2cClocks[instance]); -#if defined(LPI2C_PERIPH_CLOCKS) - /* Gate the functional clock. */ - CLOCK_DisableClock(kLpi2cPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Configures LPI2C master data match feature. - * - * param base The LPI2C peripheral base address. - * param matchConfig Settings for the data match feature. - */ -void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *matchConfig) -{ - /* Disable master mode. */ - bool wasEnabled = (0U != ((base->MCR & LPI2C_MCR_MEN_MASK) >> LPI2C_MCR_MEN_SHIFT)); - LPI2C_MasterEnable(base, false); - - base->MCFGR1 = (base->MCFGR1 & ~LPI2C_MCFGR1_MATCFG_MASK) | LPI2C_MCFGR1_MATCFG(matchConfig->matchMode); - base->MCFGR0 = (base->MCFGR0 & ~LPI2C_MCFGR0_RDMO_MASK) | LPI2C_MCFGR0_RDMO(matchConfig->rxDataMatchOnly); - base->MDMR = LPI2C_MDMR_MATCH0(matchConfig->match0) | LPI2C_MDMR_MATCH1(matchConfig->match1); - - /* Restore master mode. */ - if (wasEnabled) - { - LPI2C_MasterEnable(base, true); - } -} - -/*! - * brief Sets the I2C bus frequency for master transactions. - * - * The LPI2C 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. - * - * note Please note that the second parameter is the clock frequency of LPI2C module, the third - * parameter means user configured bus baudrate, this implementation is different from other I2C drivers - * which use baudrate configuration as second parameter and source clock frequency as third parameter. - * - * param base The LPI2C peripheral base address. - * param sourceClock_Hz LPI2C functional clock frequency in Hertz. - * param baudRate_Hz Requested bus frequency in Hertz. - */ -void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz) -{ - bool wasEnabled; - uint8_t filtScl = (uint8_t)((base->MCFGR2 & LPI2C_MCFGR2_FILTSCL_MASK) >> LPI2C_MCFGR2_FILTSCL_SHIFT); - - uint8_t divider = 1U; - uint8_t bestDivider = 1U; - uint8_t prescale = 0U; - uint8_t bestPre = 0U; - - uint8_t clkCycle; - uint8_t bestclkCycle = 0U; - - uint32_t absError = 0U; - uint32_t bestError = 0xffffffffu; - uint32_t computedRate; - - uint32_t tmpReg = 0U; - - /* Disable master mode. */ - wasEnabled = (0U != ((base->MCR & LPI2C_MCR_MEN_MASK) >> LPI2C_MCR_MEN_SHIFT)); - LPI2C_MasterEnable(base, false); - - /* Baud rate = (sourceClock_Hz / 2 ^ prescale) / (CLKLO + 1 + CLKHI + 1 + SCL_LATENCY) - * SCL_LATENCY = ROUNDDOWN((2 + FILTSCL) / (2 ^ prescale)) - */ - for (prescale = 0U; prescale <= 7U; prescale++) - { - /* Calculate the clkCycle, clkCycle = CLKLO + CLKHI, divider = 2 ^ prescale */ - clkCycle = (uint8_t)((10U * sourceClock_Hz / divider / baudRate_Hz + 5U) / 10U - (2U + filtScl) / divider - 2U); - /* According to register description, The max value for CLKLO and CLKHI is 63. - however to meet the I2C specification of tBUF, CLKHI should be less than - clkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / divider + 1U. Refer to the comment of the tmpHigh's - calculation for details. So we have: - CLKHI < clkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / divider + 1U, - clkCycle = CLKHI + CLKLO and - sourceClock_Hz / baudRate_Hz / divider = clkCycle + 2 + ROUNDDOWN((2 + FILTSCL) / divider), - we can come up with: CLKHI < 0.92 x CLKLO - ROUNDDOWN(2 + FILTSCL) / divider - so the max boundary of CLKHI should be 0.92 x 63 - ROUNDDOWN(2 + FILTSCL) / divider, - and the max boundary of clkCycle is 1.92 x 63 - ROUNDDOWN(2 + FILTSCL) / divider. */ - if (clkCycle > (120U - (2U + filtScl) / divider)) - { - divider *= 2U; - continue; - } - /* Calculate the computed baudrate and compare it with the desired baudrate */ - computedRate = (sourceClock_Hz / (uint32_t)divider) / - ((uint32_t)clkCycle + 2U + (2U + (uint32_t)filtScl) / (uint32_t)divider); - absError = baudRate_Hz > computedRate ? baudRate_Hz - computedRate : computedRate - baudRate_Hz; - if (absError < bestError) - { - bestPre = prescale; - bestDivider = divider; - bestclkCycle = clkCycle; - bestError = absError; - - /* If the error is 0, then we can stop searching because we won't find a better match. */ - if (absError == 0U) - { - break; - } - } - divider *= 2U; - } - - /* SCL low time tLO should be larger than or equal to SCL high time tHI: - tLO = ((CLKLO + 1) x (2 ^ PRESCALE)) >= tHI = ((CLKHI + 1 + SCL_LATENCY) x (2 ^ PRESCALE)), - which is CLKLO >= CLKHI + (2U + filtScl) / bestDivider. - Also since bestclkCycle = CLKLO + CLKHI, bestDivider = 2 ^ PRESCALE - which makes CLKHI <= (bestclkCycle - (2U + filtScl) / bestDivider) / 2U. - - The max tBUF should be at least 0.52 times of the SCL clock cycle: - tBUF = ((CLKLO + 1) x (2 ^ PRESCALE) / sourceClock_Hz) > (0.52 / baudRate_Hz), - plus bestDivider = 2 ^ PRESCALE, bestclkCycle = CLKLO + CLKHI we can come up with - CLKHI <= (bestclkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / bestDivider + 1U). - In this case to get a safe CLKHI calculation, we can assume: - */ - uint8_t tmpHigh = (bestclkCycle - (2U + filtScl) / bestDivider) / 2U; - while (tmpHigh > (bestclkCycle - 52U * sourceClock_Hz / baudRate_Hz / bestDivider / 100U + 1U)) - { - tmpHigh = tmpHigh - 1U; - } - - /* Calculate DATAVD and SETHOLD. - To meet the timing requirement of I2C spec for standard mode, fast mode and fast mode plus: */ - /* The min tHD:STA/tSU:STA/tSU:STO should be at least 0.4 times of the SCL clock cycle, use 0.5 to be safe: - tHD:STA = ((SETHOLD + 1) x (2 ^ PRESCALE) / sourceClock_Hz) > (0.5 / baudRate_Hz), bestDivider = 2 ^ PRESCALE */ - uint8_t tmpHold = (uint8_t)(sourceClock_Hz / baudRate_Hz / bestDivider / 2U) - 1U; - - /* The max tVD:DAT/tVD:ACK/tHD:DAT should be at most 0.345 times of the SCL clock cycle, use 0.25 to be safe: - tVD:DAT = ((DATAVD + 1) x (2 ^ PRESCALE) / sourceClock_Hz) < (0.25 / baudRate_Hz), bestDivider = 2 ^ PRESCALE */ - uint8_t tmpDataVd = (uint8_t)(sourceClock_Hz / baudRate_Hz / bestDivider / 4U) - 1U; - - /* The min tSU:DAT should be at least 0.05 times of the SCL clock cycle: - tSU:DAT = ((2 + FILTSDA + 2 ^ PRESCALE) / sourceClock_Hz) >= (0.05 / baud), - plus bestDivider = 2 ^ PRESCALE, we can come up with: - FILTSDA >= (0.05 x sourceClock_Hz / baudRate_Hz - bestDivider - 2) */ - if ((sourceClock_Hz / baudRate_Hz / 20U) > (bestDivider + 2U)) - { - /* Read out the FILTSDA configuration, if it is smaller than expected, change the setting. */ - uint8_t filtSda = (uint8_t)((base->MCFGR2 & LPI2C_MCFGR2_FILTSDA_MASK) >> LPI2C_MCFGR2_FILTSDA_SHIFT); - if (filtSda < (sourceClock_Hz / baudRate_Hz / 20U - bestDivider - 2U)) - { - filtSda = (uint8_t)(sourceClock_Hz / baudRate_Hz / 20U) - bestDivider - 2U; - } - base->MCFGR2 = (base->MCFGR2 & ~LPI2C_MCFGR2_FILTSDA_MASK) | LPI2C_MCFGR2_FILTSDA(filtSda); - } - - /* Set CLKHI, CLKLO, SETHOLD, DATAVD value. */ - tmpReg = LPI2C_MCCR0_CLKHI((uint32_t)tmpHigh) | - LPI2C_MCCR0_CLKLO((uint32_t)((uint32_t)bestclkCycle - (uint32_t)tmpHigh)) | - LPI2C_MCCR0_SETHOLD((uint32_t)tmpHold) | LPI2C_MCCR0_DATAVD((uint32_t)tmpDataVd); - base->MCCR0 = tmpReg; - - /* Set PRESCALE value. */ - base->MCFGR1 = (base->MCFGR1 & ~LPI2C_MCFGR1_PRESCALE_MASK) | LPI2C_MCFGR1_PRESCALE(bestPre); - - /* Restore master mode. */ - if (wasEnabled) - { - LPI2C_MasterEnable(base, true); - } -} - -/*! - * brief Sends a START signal and slave address on the I2C bus. - * - * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure - * that another master is not occupying the bus. Then a START signal is transmitted, followed by the - * 7-bit address specified in the a address parameter. Note that this function does not actually wait - * until the START and address are successfully sent on the bus before returning. - * - * param base The LPI2C peripheral base address. - * param address 7-bit slave device address, in bits [6:0]. - * param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set - * the R/w bit (bit 0) in the transmitted slave address. - * retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. - * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - */ -status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) -{ - /* Return an error if the bus is already in use not by us. */ - status_t result = LPI2C_CheckForBusyBus(base); - if (kStatus_Success == result) - { - /* Clear all flags. */ - LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); - - /* Turn off auto-stop option. */ - base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; - - /* Wait until there is room in the fifo. */ - result = LPI2C_MasterWaitForTxReady(base); - if (kStatus_Success == result) - { - /* Issue start command. */ - base->MTDR = (uint32_t)kStartCmd | (((uint32_t)address << 1U) | (uint32_t)dir); - } - } - - return result; -} - -/*! - * brief Sends a STOP signal on the I2C bus. - * - * This function does not return until the STOP signal is seen on the bus, or an error occurs. - * - * param base The LPI2C peripheral base address. - * retval #kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. - * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterStop(LPI2C_Type *base) -{ - /* Wait until there is room in the fifo. */ - status_t result = LPI2C_MasterWaitForTxReady(base); - if (kStatus_Success == result) - { - /* Send the STOP signal */ - base->MTDR = (uint32_t)kStopCmd; - - /* Wait for the stop detected flag to set, indicating the transfer has completed on the bus. */ - /* Also check for errors while waiting. */ -#if I2C_RETRY_TIMES != 0U - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - -#if I2C_RETRY_TIMES != 0U - while ((result == kStatus_Success) && (0U != waitTimes)) - { - waitTimes--; -#else - while (result == kStatus_Success) - { -#endif - uint32_t status = LPI2C_MasterGetStatusFlags(base); - - /* Check for error flags. */ - result = LPI2C_MasterCheckAndClearError(base, status); - - /* Check if the stop was sent successfully. */ - if ((0U != (status & (uint32_t)kLPI2C_MasterStopDetectFlag)) && - (0U != (status & (uint32_t)kLPI2C_MasterTxReadyFlag))) - { - LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterStopDetectFlag); - break; - } - } - -#if I2C_RETRY_TIMES != 0U - if (0U == waitTimes) - { - result = kStatus_LPI2C_Timeout; - } -#endif - } - - return result; -} - -/*! - * brief Performs a polling receive transfer on the I2C bus. - * - * param base The LPI2C peripheral base address. - * param rxBuff The pointer to the data to be transferred. - * param rxSize The length in bytes of the data to be transferred. - * retval #kStatus_Success Data was received successfully. - * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize) -{ - assert(NULL != rxBuff); - - status_t result = kStatus_Success; - uint8_t *buf; - size_t tmpRxSize = rxSize; -#if I2C_RETRY_TIMES != 0U - uint32_t waitTimes; -#endif - - /* Check transfer data size. */ - if (rxSize > (256U * FSL_FEATURE_LPI2C_FIFO_SIZEn(base))) - { - return kStatus_InvalidArgument; - } - - /* Handle empty read. */ - if (rxSize != 0U) - { - /* Wait until there is room in the command fifo. */ - result = LPI2C_MasterWaitForTxReady(base); - if (kStatus_Success == result) - { - /* Issue command to receive data. A single write to MTDR can issue read operation of 0xFFU + 1 byte of data - at most, so when the rxSize is larger than 0x100U, push multiple read commands to MTDR until rxSize is - reached. */ - while (tmpRxSize != 0U) - { - if (tmpRxSize > 256U) - { - base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(0xFFU); - tmpRxSize -= 256U; - } - else - { - base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); - tmpRxSize = 0U; - } - } - - /* Receive data */ - buf = (uint8_t *)rxBuff; - while (0U != (rxSize--)) - { -#if I2C_RETRY_TIMES != 0U - waitTimes = I2C_RETRY_TIMES; -#endif - /* Read LPI2C receive fifo register. The register includes a flag to indicate whether */ - /* the FIFO is empty, so we can both get the data and check if we need to keep reading */ - /* using a single register read. */ - uint32_t value = 0U; - do - { - /* Check for errors. */ - result = LPI2C_MasterCheckAndClearError(base, LPI2C_MasterGetStatusFlags(base)); - if (kStatus_Success != result) - { - break; - } - - value = base->MRDR; -#if I2C_RETRY_TIMES != 0U - waitTimes--; - } while ((0U != (value & LPI2C_MRDR_RXEMPTY_MASK)) && (0U != waitTimes)); - if (0U == waitTimes) - { - result = kStatus_LPI2C_Timeout; - } -#else - } while (0U != (value & LPI2C_MRDR_RXEMPTY_MASK)); -#endif - if ((status_t)kStatus_Success != result) - { - break; - } - - *buf++ = (uint8_t)(value & LPI2C_MRDR_DATA_MASK); - } - } - } - - return result; -} - -/*! - * brief Performs a polling send transfer on the I2C bus. - * - * Sends up to a 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_LPI2C_Nak. - * - * param base The LPI2C peripheral base address. - * param txBuff The pointer to the data to be transferred. - * param txSize The length in bytes of the data to be transferred. - * retval #kStatus_Success Data was sent successfully. - * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * retval #kStatus_LPI2C_FifoError FIFO under run or over run. - * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterSend(LPI2C_Type *base, void *txBuff, size_t txSize) -{ - status_t result = kStatus_Success; - uint8_t *buf = (uint8_t *)txBuff; - - assert(NULL != txBuff); - - /* Send data buffer */ - while (0U != (txSize--)) - { - /* Wait until there is room in the fifo. This also checks for errors. */ - result = LPI2C_MasterWaitForTxReady(base); - if (kStatus_Success != result) - { - break; - } - - /* Write byte into LPI2C master data register. */ - base->MTDR = *buf++; - } - - return result; -} - -/*! - * brief Performs a master polling transfer on the I2C bus. - * - * note The API does not return until the transfer succeeds or fails due - * to error happens during transfer. - * - * param base The LPI2C peripheral base address. - * param transfer Pointer to the transfer structure. - * retval #kStatus_Success Data was received successfully. - * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer) -{ - assert(NULL != transfer); - assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); - - status_t result = kStatus_Success; - uint16_t commandBuffer[7]; - uint32_t cmdCount = 0U; - - /* Check transfer data size in read operation. */ - if ((transfer->direction == kLPI2C_Read) && (transfer->dataSize > (256U * FSL_FEATURE_LPI2C_FIFO_SIZEn(base)))) - { - return kStatus_InvalidArgument; - } - - /* Return an error if the bus is already in use not by us. */ - result = LPI2C_CheckForBusyBus(base); - if (kStatus_Success == result) - { - /* Clear all flags. */ - LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); - - /* Turn off auto-stop option. */ - base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; - - lpi2c_direction_t direction = (0U != transfer->subaddressSize) ? kLPI2C_Write : transfer->direction; - if (0U == (transfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag)) - { - commandBuffer[cmdCount++] = - (uint16_t)kStartCmd | - (uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)direction); - } - - /* Subaddress, MSB first. */ - if (0U != transfer->subaddressSize) - { - uint32_t subaddressRemaining = transfer->subaddressSize; - while (0U != subaddressRemaining--) - { - uint8_t subaddressByte = (uint8_t)((transfer->subaddress >> (8U * subaddressRemaining)) & 0xffU); - commandBuffer[cmdCount++] = subaddressByte; - } - } - - /* Reads need special handling. */ - if ((0U != transfer->dataSize) && (transfer->direction == kLPI2C_Read)) - { - /* Need to send repeated start if switching directions to read. */ - if (direction == kLPI2C_Write) - { - commandBuffer[cmdCount++] = - (uint16_t)kStartCmd | - (uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); - } - } - - /* Send command buffer */ - uint32_t index = 0U; - while (0U != cmdCount--) - { - /* Wait until there is room in the fifo. This also checks for errors. */ - result = LPI2C_MasterWaitForTxReady(base); - if (kStatus_Success != result) - { - break; - } - - /* Write byte into LPI2C master data register. */ - base->MTDR = commandBuffer[index]; - index++; - } - - if (kStatus_Success == result) - { - /* Transmit data. */ - if ((transfer->direction == kLPI2C_Write) && (transfer->dataSize > 0U)) - { - /* Send Data. */ - result = LPI2C_MasterSend(base, transfer->data, transfer->dataSize); - } - - /* Receive Data. */ - if ((transfer->direction == kLPI2C_Read) && (transfer->dataSize > 0U)) - { - result = LPI2C_MasterReceive(base, transfer->data, transfer->dataSize); - } - - if (kStatus_Success == result) - { - if ((transfer->flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) - { - result = LPI2C_MasterStop(base); - } - } - } - } - - return result; -} - -/*! - * brief Creates a new handle for the LPI2C master non-blocking APIs. - * - * 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 LPI2C_MasterTransferAbort() API shall be called. - * - * - * note The function also enables the NVIC IRQ for the input LPI2C. Need to notice - * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to - * enable the associated INTMUX IRQ in application. - * - * param base The LPI2C peripheral base address. - * param[out] handle Pointer to the LPI2C master driver handle. - * param callback User provided pointer to the asynchronous callback function. - * param userData User provided pointer to the application callback data. - */ -void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, - lpi2c_master_handle_t *handle, - lpi2c_master_transfer_callback_t callback, - void *userData) -{ - uint32_t instance; - - assert(NULL != handle); - - /* Clear out the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Look up instance number */ - instance = LPI2C_GetInstance(base); - - /* Save base and instance. */ - handle->completionCallback = callback; - handle->userData = userData; - - /* Save this handle for IRQ use. */ - s_lpi2cMasterHandle[instance] = handle; - - /* Set irq handler. */ - s_lpi2cMasterIsr = LPI2C_MasterTransferHandleIRQ; - - /* Clear internal IRQ enables and enable NVIC IRQ. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* Enable NVIC IRQ, this only enables the IRQ directly connected to the NVIC. - In some cases the LPI2C IRQ is configured through INTMUX, user needs to enable - INTMUX IRQ in application code. */ - (void)EnableIRQ(kLpi2cIrqs[instance]); -} - -/*! - * @brief Execute states until FIFOs are exhausted. - * @param handle Master nonblocking driver handle. - * @param[out] isDone Set to true if the transfer has completed. - * @retval #kStatus_Success - * @retval #kStatus_LPI2C_PinLowTimeout - * @retval #kStatus_LPI2C_ArbitrationLost - * @retval #kStatus_LPI2C_Nak - * @retval #kStatus_LPI2C_FifoError - */ -static status_t LPI2C_RunTransferStateMachine(LPI2C_Type *base, lpi2c_master_handle_t *handle, bool *isDone) -{ - uint32_t status; - status_t result = kStatus_Success; - lpi2c_master_transfer_t *xfer; - size_t txCount; - size_t rxCount; - size_t txFifoSize = (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base); - bool state_complete = false; - uint16_t sendval; - - /* Set default isDone return value. */ - *isDone = false; - - /* Check for errors. */ - status = LPI2C_MasterGetStatusFlags(base); - /* For the last byte, nack flag is expected. - Do not check and clear kLPI2C_MasterNackDetectFlag for the last byte, - in case FIFO is emptied when stop command has not been sent. */ - if (handle->remainingBytes == 0U) - { - status &= ~(uint32_t)kLPI2C_MasterNackDetectFlag; - } - result = LPI2C_MasterCheckAndClearError(base, status); - if (kStatus_Success == result) - { - /* Get pointer to private data. */ - xfer = &handle->transfer; - - /* Get fifo counts and compute room in tx fifo. */ - LPI2C_MasterGetFifoCounts(base, &rxCount, &txCount); - txCount = txFifoSize - txCount; - - while (!state_complete) - { - /* Execute the state. */ - switch (handle->state) - { - case (uint8_t)kSendCommandState: - /* Make sure there is room in the tx fifo for the next command. */ - if (0U == txCount--) - { - state_complete = true; - break; - } - - /* Issue command. buf is a uint8_t* pointing at the uint16 command array. */ - sendval = ((uint16_t)handle->buf[0]) | (((uint16_t)handle->buf[1]) << 8U); - base->MTDR = sendval; - handle->buf++; - handle->buf++; - - /* Count down until all commands are sent. */ - if (--handle->remainingBytes == 0U) - { - /* Choose next state and set up buffer pointer and count. */ - if (0U != xfer->dataSize) - { - /* Either a send or receive transfer is next. */ - handle->state = (uint8_t)kTransferDataState; - handle->buf = (uint8_t *)xfer->data; - handle->remainingBytes = (uint16_t)xfer->dataSize; - if (xfer->direction == kLPI2C_Read) - { - /* Disable TX interrupt */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterTxReadyFlag); - /* Issue command to receive data. A single write to MTDR can issue read operation of - 0xFFU + 1 byte of data at most, so when the dataSize is larger than 0x100U, push - multiple read commands to MTDR until dataSize is reached. */ - size_t tmpRxSize = xfer->dataSize; - while (tmpRxSize != 0U) - { - if (tmpRxSize > 256U) - { - base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(0xFFU); - tmpRxSize -= 256U; - } - else - { - base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); - tmpRxSize = 0U; - } - } - } - } - else - { - /* No transfer, so move to stop state. */ - handle->state = (uint8_t)kStopState; - } - } - break; - - case (uint8_t)kIssueReadCommandState: - /* Make sure there is room in the tx fifo for the read command. */ - if (0U == txCount--) - { - state_complete = true; - break; - } - - base->MTDR = (uint32_t)kRxDataCmd | LPI2C_MTDR_DATA(xfer->dataSize - 1U); - - /* Move to transfer state. */ - handle->state = (uint8_t)kTransferDataState; - if (xfer->direction == kLPI2C_Read) - { - /* Disable TX interrupt */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterTxReadyFlag); - } - break; - - case (uint8_t)kTransferDataState: - if (xfer->direction == kLPI2C_Write) - { - /* Make sure there is room in the tx fifo. */ - if (0U == txCount--) - { - state_complete = true; - break; - } - - /* Put byte to send in fifo. */ - base->MTDR = *(handle->buf)++; - } - else - { - /* XXX handle receive sizes > 256, use kIssueReadCommandState */ - /* Make sure there is data in the rx fifo. */ - if (0U == rxCount--) - { - state_complete = true; - break; - } - - /* Read byte from fifo. */ - *(handle->buf)++ = (uint8_t)(base->MRDR & LPI2C_MRDR_DATA_MASK); - } - - /* Move to stop when the transfer is done. */ - if (--handle->remainingBytes == 0U) - { - if (xfer->direction == kLPI2C_Write) - { - state_complete = true; - } - handle->state = (uint8_t)kStopState; - } - break; - - case (uint8_t)kStopState: - /* Only issue a stop transition if the caller requested it. */ - if ((xfer->flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) - { - /* Make sure there is room in the tx fifo for the stop command. */ - if (0U == txCount--) - { - state_complete = true; - break; - } - - base->MTDR = (uint32_t)kStopCmd; - } - else - { - /* If all data is read and no stop flag is required to send, we are done. */ - if (xfer->direction == kLPI2C_Read) - { - *isDone = true; - } - state_complete = true; - } - handle->state = (uint8_t)kWaitForCompletionState; - break; - - case (uint8_t)kWaitForCompletionState: - if ((xfer->flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) - { - /* We stay in this state until the stop state is detected. */ - if (0U != (status & (uint32_t)kLPI2C_MasterStopDetectFlag)) - { - *isDone = true; - } - } - else - { - /* If all data is pushed to FIFO and no stop flag is required to send, we need to make sure they - are all send out to bus. */ - if ((xfer->direction == kLPI2C_Write) && ((base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) == 0U)) - { - /* We stay in this state until the data is sent out to bus. */ - *isDone = true; - } - } - state_complete = true; - break; - default: - assert(false); - break; - } - } - } - return result; -} - -/*! - * @brief Prepares the transfer state machine and fills in the command buffer. - * @param handle Master nonblocking driver handle. - */ -static void LPI2C_InitTransferStateMachine(lpi2c_master_handle_t *handle) -{ - lpi2c_master_transfer_t *xfer = &handle->transfer; - - /* Handle no start option. */ - if (0U != (xfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag)) - { - if (xfer->direction == kLPI2C_Read) - { - /* Need to issue read command first. */ - handle->state = (uint8_t)kIssueReadCommandState; - } - else - { - /* Start immediately in the data transfer state. */ - handle->state = (uint8_t)kTransferDataState; - } - - handle->buf = (uint8_t *)xfer->data; - handle->remainingBytes = (uint16_t)xfer->dataSize; - } - else - { - uint16_t *cmd = (uint16_t *)&handle->commandBuffer; - uint32_t cmdCount = 0U; - - /* Initial direction depends on whether a subaddress was provided, and of course the actual */ - /* data transfer direction. */ - lpi2c_direction_t direction = (0U != xfer->subaddressSize) ? kLPI2C_Write : xfer->direction; - - /* Start command. */ - cmd[cmdCount++] = - (uint16_t)kStartCmd | (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)direction); - - /* Subaddress, MSB first. */ - if (0U != xfer->subaddressSize) - { - uint32_t subaddressRemaining = xfer->subaddressSize; - while (0U != (subaddressRemaining--)) - { - uint8_t subaddressByte = (uint8_t)((xfer->subaddress >> (8U * subaddressRemaining)) & 0xffU); - cmd[cmdCount++] = subaddressByte; - } - } - - /* Reads need special handling. */ - if ((0U != xfer->dataSize) && (xfer->direction == kLPI2C_Read)) - { - /* Need to send repeated start if switching directions to read. */ - if (direction == kLPI2C_Write) - { - cmd[cmdCount++] = (uint16_t)kStartCmd | - (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); - } - } - - /* Set up state machine for transferring the commands. */ - handle->state = (uint8_t)kSendCommandState; - handle->remainingBytes = (uint16_t)cmdCount; - handle->buf = (uint8_t *)&handle->commandBuffer; - } -} - -/*! - * brief Performs a non-blocking transaction on the I2C bus. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * param transfer The pointer to the transfer descriptor. - * retval #kStatus_Success The transaction was started successfully. - * retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking - * transaction is already in progress. - */ -status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, - lpi2c_master_handle_t *handle, - lpi2c_master_transfer_t *transfer) -{ - assert(NULL != handle); - assert(NULL != transfer); - assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); - - status_t result; - - /* Check transfer data size in read operation. */ - if ((transfer->direction == kLPI2C_Read) && - (transfer->dataSize > (256U * (uint32_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base)))) - { - return kStatus_InvalidArgument; - } - - /* Return busy if another transaction is in progress. */ - if (handle->state != (uint8_t)kIdleState) - { - result = kStatus_LPI2C_Busy; - } - else - { - result = LPI2C_CheckForBusyBus(base); - } - - if ((status_t)kStatus_Success == result) - { - /* Disable LPI2C IRQ sources while we configure stuff. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* Reset FIFO in case there are data. */ - base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; - - /* Save transfer into handle. */ - handle->transfer = *transfer; - - /* Generate commands to send. */ - LPI2C_InitTransferStateMachine(handle); - - /* Clear all flags. */ - LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); - - /* Turn off auto-stop option. */ - base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; - - /* Enable LPI2C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ - LPI2C_MasterEnableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - } - - return result; -} - -/*! - * brief Returns number of bytes transferred so far. - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * param[out] count Number of bytes transferred so far by the non-blocking transaction. - * retval #kStatus_Success - * retval #kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count) -{ - status_t result = kStatus_Success; - - assert(NULL != handle); - - if (NULL == count) - { - result = kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - else if (handle->state == (uint8_t)kIdleState) - { - *count = 0; - result = kStatus_NoTransferInProgress; - } - else - { - uint8_t state; - uint16_t remainingBytes; - uint32_t dataSize; - - /* Cache some fields with IRQs disabled. This ensures all field values */ - /* are synchronized with each other during an ongoing transfer. */ - uint32_t irqs = LPI2C_MasterGetEnabledInterrupts(base); - LPI2C_MasterDisableInterrupts(base, irqs); - state = handle->state; - remainingBytes = handle->remainingBytes; - dataSize = handle->transfer.dataSize; - LPI2C_MasterEnableInterrupts(base, irqs); - - /* Get transfer count based on current transfer state. */ - switch (state) - { - case (uint8_t)kIdleState: - case (uint8_t)kSendCommandState: - case (uint8_t) - kIssueReadCommandState: /* XXX return correct value for this state when >256 reads are supported */ - *count = 0; - break; - - case (uint8_t)kTransferDataState: - *count = dataSize - remainingBytes; - break; - - case (uint8_t)kStopState: - case (uint8_t)kWaitForCompletionState: - default: - *count = dataSize; - break; - } - } - - return result; -} - -/*! - * brief Terminates a non-blocking LPI2C master transmission early. - * - * note It is not safe to call this function from an IRQ handler that has a higher priority than the - * LPI2C peripheral's IRQ priority. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * retval #kStatus_Success A transaction was successfully aborted. - * retval #kStatus_LPI2C_Idle There is not a non-blocking transaction currently in progress. - */ -void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle) -{ - if (handle->state != (uint8_t)kIdleState) - { - /* Disable internal IRQ enables. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* Reset fifos. */ - base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; - - /* If master is still busy and has not send out stop signal yet. */ - if ((LPI2C_MasterGetStatusFlags(base) & ((uint32_t)kLPI2C_MasterStopDetectFlag | - (uint32_t)kLPI2C_MasterBusyFlag)) == (uint32_t)kLPI2C_MasterBusyFlag) - { - /* Send a stop command to finalize the transfer. */ - base->MTDR = (uint32_t)kStopCmd; - } - - /* Reset handle. */ - handle->state = (uint8_t)kIdleState; - } -} - -/*! - * brief Reusable routine to handle master interrupts. - * note This function does not need to be called unless you are reimplementing the - * nonblocking API's interrupt handler routines to add special functionality. - * param base The LPI2C peripheral base address. - * param lpi2cMasterHandle Pointer to the LPI2C master driver handle. - */ -void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, void *lpi2cMasterHandle) -{ - assert(lpi2cMasterHandle != NULL); - - lpi2c_master_handle_t *handle = (lpi2c_master_handle_t *)lpi2cMasterHandle; - bool isDone = false; - status_t result; - - /* Don't do anything if we don't have a valid handle. */ - if (NULL != handle) - { - if (handle->state != (uint8_t)kIdleState) - { - result = LPI2C_RunTransferStateMachine(base, handle, &isDone); - - if ((result != kStatus_Success) || isDone) - { - /* Handle error, terminate xfer */ - if (result != kStatus_Success) - { - LPI2C_MasterTransferAbort(base, handle); - } - - /* Disable internal IRQ enables. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* Set handle to idle state. */ - handle->state = (uint8_t)kIdleState; - - /* Invoke callback. */ - if (NULL != handle->completionCallback) - { - handle->completionCallback(base, handle, result, handle->userData); - } - } - } - } -} - -/*! - * brief Provides a default configuration for the LPI2C slave peripheral. - * - * This function provides the following default configuration for the LPI2C slave peripheral: - * code - * slaveConfig->enableSlave = true; - * slaveConfig->address0 = 0U; - * slaveConfig->address1 = 0U; - * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; - * slaveConfig->filterDozeEnable = true; - * slaveConfig->filterEnable = true; - * slaveConfig->enableGeneralCall = false; - * slaveConfig->sclStall.enableAck = false; - * slaveConfig->sclStall.enableTx = true; - * slaveConfig->sclStall.enableRx = true; - * slaveConfig->sclStall.enableAddress = true; - * slaveConfig->ignoreAck = false; - * slaveConfig->enableReceivedAddressRead = false; - * slaveConfig->sdaGlitchFilterWidth_ns = 0; - * slaveConfig->sclGlitchFilterWidth_ns = 0; - * slaveConfig->dataValidDelay_ns = 0; - * slaveConfig->clockHoldTime_ns = 0; - * endcode - * - * After calling this function, override any settings to customize the configuration, - * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the a - * address0 member of the configuration structure with the desired slave address. - * - * param[out] slaveConfig User provided configuration structure that is set to default values. Refer to - * #lpi2c_slave_config_t. - */ -void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig) -{ - /* Initializes the configure structure to zero. */ - (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); - - slaveConfig->enableSlave = true; - slaveConfig->address0 = 0U; - slaveConfig->address1 = 0U; - slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; - slaveConfig->filterDozeEnable = true; - slaveConfig->filterEnable = true; - slaveConfig->enableGeneralCall = false; - slaveConfig->sclStall.enableAck = false; - slaveConfig->sclStall.enableTx = true; - slaveConfig->sclStall.enableRx = true; - slaveConfig->sclStall.enableAddress = false; - slaveConfig->ignoreAck = false; - slaveConfig->enableReceivedAddressRead = false; - slaveConfig->sdaGlitchFilterWidth_ns = 0U; /* TODO determine default width values */ - slaveConfig->sclGlitchFilterWidth_ns = 0U; - slaveConfig->dataValidDelay_ns = 0U; - slaveConfig->clockHoldTime_ns = 0U; -} - -/*! - * brief Initializes the LPI2C slave peripheral. - * - * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user - * provided configuration. - * - * param base The LPI2C peripheral base address. - * param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults - * that you can override. - * param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, - * data valid delay, and clock hold time. - */ -void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz) -{ - uint32_t tmpCycle; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPI2C_GetInstance(base); - - /* Ungate the clock. */ - (void)CLOCK_EnableClock(kLpi2cClocks[instance]); -#if defined(LPI2C_PERIPH_CLOCKS) - /* Ungate the functional clock in initialize function. */ - CLOCK_EnableClock(kLpi2cPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Restore to reset conditions. */ - LPI2C_SlaveReset(base); - - /* Configure peripheral. */ - base->SAMR = LPI2C_SAMR_ADDR0(slaveConfig->address0) | LPI2C_SAMR_ADDR1(slaveConfig->address1); - - base->SCFGR1 = - LPI2C_SCFGR1_ADDRCFG(slaveConfig->addressMatchMode) | LPI2C_SCFGR1_IGNACK(slaveConfig->ignoreAck) | - LPI2C_SCFGR1_RXCFG(slaveConfig->enableReceivedAddressRead) | LPI2C_SCFGR1_GCEN(slaveConfig->enableGeneralCall) | - LPI2C_SCFGR1_ACKSTALL(slaveConfig->sclStall.enableAck) | LPI2C_SCFGR1_TXDSTALL(slaveConfig->sclStall.enableTx) | - LPI2C_SCFGR1_RXSTALL(slaveConfig->sclStall.enableRx) | - LPI2C_SCFGR1_ADRSTALL(slaveConfig->sclStall.enableAddress); - - tmpCycle = - LPI2C_SCFGR2_FILTSDA(LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->sdaGlitchFilterWidth_ns, - (LPI2C_SCFGR2_FILTSDA_MASK >> LPI2C_SCFGR2_FILTSDA_SHIFT), 1U)); - tmpCycle |= - LPI2C_SCFGR2_FILTSCL(LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->sclGlitchFilterWidth_ns, - (LPI2C_SCFGR2_FILTSCL_MASK >> LPI2C_SCFGR2_FILTSCL_SHIFT), 1U)); - tmpCycle |= LPI2C_SCFGR2_DATAVD(LPI2C_GetCyclesForWidth( - sourceClock_Hz, slaveConfig->dataValidDelay_ns, (LPI2C_SCFGR2_DATAVD_MASK >> LPI2C_SCFGR2_DATAVD_SHIFT), 1U)); - - base->SCFGR2 = tmpCycle | LPI2C_SCFGR2_CLKHOLD(LPI2C_GetCyclesForWidth( - sourceClock_Hz, slaveConfig->clockHoldTime_ns, - (LPI2C_SCFGR2_CLKHOLD_MASK >> LPI2C_SCFGR2_CLKHOLD_SHIFT), 1U)); - - /* Save SCR to last so we don't enable slave until it is configured */ - base->SCR = LPI2C_SCR_FILTDZ(slaveConfig->filterDozeEnable) | LPI2C_SCR_FILTEN(slaveConfig->filterEnable) | - LPI2C_SCR_SEN(slaveConfig->enableSlave); -} - -/*! - * brief Deinitializes the LPI2C slave peripheral. - * - * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software - * reset to restore the peripheral to reset conditions. - * - * param base The LPI2C peripheral base address. - */ -void LPI2C_SlaveDeinit(LPI2C_Type *base) -{ - LPI2C_SlaveReset(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPI2C_GetInstance(base); - - /* Gate the clock. */ - (void)CLOCK_DisableClock(kLpi2cClocks[instance]); - -#if defined(LPI2C_PERIPH_CLOCKS) - /* Gate the functional clock. */ - CLOCK_DisableClock(kLpi2cPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * @brief Convert provided flags to status code, and clear any errors if present. - * @param base The LPI2C peripheral base address. - * @param status Current status flags value that will be checked. - * @retval #kStatus_Success - * @retval #kStatus_LPI2C_BitError - * @retval #kStatus_LPI2C_FifoError - */ -static status_t LPI2C_SlaveCheckAndClearError(LPI2C_Type *base, uint32_t flags) -{ - status_t result = kStatus_Success; - - flags &= (uint32_t)kLPI2C_SlaveErrorFlags; - if (0U != flags) - { - if (0U != (flags & (uint32_t)kLPI2C_SlaveBitErrFlag)) - { - result = kStatus_LPI2C_BitError; - } - else if (0U != (flags & (uint32_t)kLPI2C_SlaveFifoErrFlag)) - { - result = kStatus_LPI2C_FifoError; - } - else - { - ; /* Intentional empty */ - } - - /* Clear the errors. */ - LPI2C_SlaveClearStatusFlags(base, flags); - } - else - { - ; /* Intentional empty */ - } - - return result; -} - -/*! - * brief Performs a polling send transfer on the I2C bus. - * - * param base The LPI2C peripheral base address. - * param txBuff The pointer to the data to be transferred. - * param txSize The length in bytes of the data to be transferred. - * param[out] actualTxSize - * return Error or success status returned by API. - */ -status_t LPI2C_SlaveSend(LPI2C_Type *base, void *txBuff, size_t txSize, size_t *actualTxSize) -{ - status_t result = kStatus_Success; - uint8_t *buf = (uint8_t *)txBuff; - size_t remaining = txSize; - - assert(NULL != txBuff); - -#if I2C_RETRY_TIMES != 0U - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - /* Clear stop flag. */ - LPI2C_SlaveClearStatusFlags(base, - (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); - - while (0U != remaining) - { - uint32_t flags; - - /* Wait until we can transmit. */ - do - { - /* Check for errors */ - flags = LPI2C_SlaveGetStatusFlags(base); - result = LPI2C_SlaveCheckAndClearError(base, flags); - if (kStatus_Success != result) - { - if (NULL != actualTxSize) - { - *actualTxSize = txSize - remaining; - } - break; - } -#if I2C_RETRY_TIMES != 0U - waitTimes--; - } while ((0U == (flags & ((uint32_t)kLPI2C_SlaveTxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | - (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && - (0U != waitTimes)); - if (0U == waitTimes) - { - result = kStatus_LPI2C_Timeout; - } -#else - } while (0U == (flags & ((uint32_t)kLPI2C_SlaveTxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | - (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))); -#endif - - if (kStatus_Success != result) - { - break; - } - - /* Send a byte. */ - if (0U != (flags & (uint32_t)kLPI2C_SlaveTxReadyFlag)) - { - base->STDR = *buf++; - --remaining; - } - - /* Exit loop if we see a stop or restart in transfer*/ - if ((0U != (flags & ((uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && - (remaining != 0U)) - { - LPI2C_SlaveClearStatusFlags( - base, (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); - break; - } - } - - if (NULL != actualTxSize) - { - *actualTxSize = txSize - remaining; - } - - return result; -} - -/*! - * brief Performs a polling receive transfer on the I2C bus. - * - * param base The LPI2C peripheral base address. - * param rxBuff The pointer to the data to be transferred. - * param rxSize The length in bytes of the data to be transferred. - * param[out] actualRxSize - * return Error or success status returned by API. - */ -status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize) -{ - status_t result = kStatus_Success; - uint8_t *buf = (uint8_t *)rxBuff; - size_t remaining = rxSize; - - assert(NULL != rxBuff); - -#if I2C_RETRY_TIMES != 0U - uint32_t waitTimes = I2C_RETRY_TIMES; -#endif - - /* Clear stop flag. */ - LPI2C_SlaveClearStatusFlags(base, - (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); - - while (0U != remaining) - { - uint32_t flags; - - /* Wait until we can receive. */ - do - { - /* Check for errors */ - flags = LPI2C_SlaveGetStatusFlags(base); - result = LPI2C_SlaveCheckAndClearError(base, flags); - if (kStatus_Success != result) - { - if (NULL != actualRxSize) - { - *actualRxSize = rxSize - remaining; - } - break; - } -#if I2C_RETRY_TIMES != 0U - waitTimes--; - } while ((0U == (flags & ((uint32_t)kLPI2C_SlaveRxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | - (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && - (0U != waitTimes)); - if (0U == waitTimes) - { - result = kStatus_LPI2C_Timeout; - } -#else - } while (0U == (flags & ((uint32_t)kLPI2C_SlaveRxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | - (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))); -#endif - - if ((status_t)kStatus_Success != result) - { - break; - } - - /* Receive a byte. */ - if (0U != (flags & (uint32_t)kLPI2C_SlaveRxReadyFlag)) - { - *buf++ = (uint8_t)(base->SRDR & LPI2C_SRDR_DATA_MASK); - --remaining; - } - - /* Exit loop if we see a stop or restart */ - if ((0U != (flags & ((uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && - (remaining != 0U)) - { - LPI2C_SlaveClearStatusFlags( - base, (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); - break; - } - } - - if (NULL != actualRxSize) - { - *actualRxSize = rxSize - remaining; - } - - return result; -} - -/*! - * brief Creates a new handle for the LPI2C slave non-blocking APIs. - * - * 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 LPI2C_SlaveTransferAbort() API shall be called. - * - * note The function also enables the NVIC IRQ for the input LPI2C. Need to notice - * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to - * enable the associated INTMUX IRQ in application. - - * param base The LPI2C peripheral base address. - * param[out] handle Pointer to the LPI2C slave driver handle. - * param callback User provided pointer to the asynchronous callback function. - * param userData User provided pointer to the application callback data. - */ -void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, - lpi2c_slave_handle_t *handle, - lpi2c_slave_transfer_callback_t callback, - void *userData) -{ - uint32_t instance; - - assert(NULL != handle); - - /* Clear out the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Look up instance number */ - instance = LPI2C_GetInstance(base); - - /* Save base and instance. */ - handle->callback = callback; - handle->userData = userData; - - /* Save this handle for IRQ use. */ - s_lpi2cSlaveHandle[instance] = handle; - - /* Set irq handler. */ - s_lpi2cSlaveIsr = LPI2C_SlaveTransferHandleIRQ; - - /* Clear internal IRQ enables and enable NVIC IRQ. */ - LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); - (void)EnableIRQ(kLpi2cIrqs[instance]); - - /* Nack by default. */ - base->STAR = LPI2C_STAR_TXNACK_MASK; -} - -/*! - * brief Starts accepting slave transfers. - * - * Call this API after calling I2C_SlaveInit() and LPI2C_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 LPI2C_SlaveTransferCreateHandle(). The callback is always invoked - * from the interrupt context. - * - * The set of events received by the callback is customizable. To do so, set the a eventMask parameter to - * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. - * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_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 #kLPI2C_SlaveAllEvents constant is provided as - * a convenient way to enable all events. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. - * param eventMask Bit mask formed by OR'ing together #lpi2c_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 #kLPI2C_SlaveAllEvents to enable all events. - * - * retval #kStatus_Success Slave transfers were successfully started. - * retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. - */ -status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask) -{ - status_t result = kStatus_Success; - - assert(NULL != handle); - - /* Return busy if another transaction is in progress. */ - if (handle->isBusy) - { - result = kStatus_LPI2C_Busy; - } - else - { - /* Return an error if the bus is already in use not by us. */ - uint32_t status = LPI2C_SlaveGetStatusFlags(base); - if ((0U != (status & (uint32_t)kLPI2C_SlaveBusBusyFlag)) && (0U == (status & (uint32_t)kLPI2C_SlaveBusyFlag))) - { - result = kStatus_LPI2C_Busy; - } - } - - if ((status_t)kStatus_Success == result) - { - /* Disable LPI2C IRQ sources while we configure stuff. */ - LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); - - /* Clear transfer in handle. */ - (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); - - /* Record that we're busy. */ - handle->isBusy = true; - - /* Set up event mask. tx and rx are always enabled. */ - handle->eventMask = eventMask | (uint32_t)kLPI2C_SlaveTransmitEvent | (uint32_t)kLPI2C_SlaveReceiveEvent; - - /* Ack by default. */ - base->STAR = 0U; - - /* Clear all flags. */ - LPI2C_SlaveClearStatusFlags(base, (uint32_t)kLPI2C_SlaveClearFlags); - - /* Enable LPI2C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ - LPI2C_SlaveEnableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); - } - - return result; -} - -/*! - * brief Gets the slave transfer status during a non-blocking transfer. - * param base The LPI2C peripheral base address. - * param handle Pointer to i2c_slave_handle_t structure. - * param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not - * required. - * retval #kStatus_Success - * retval #kStatus_NoTransferInProgress - */ -status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count) -{ - status_t status = kStatus_Success; - - assert(NULL != handle); - - if (count == NULL) - { - status = kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - else if (!handle->isBusy) - { - *count = 0; - status = kStatus_NoTransferInProgress; - } - - /* For an active transfer, just return the count from the handle. */ - else - { - *count = handle->transferredCount; - } - - return status; -} - -/*! - * brief Aborts the slave non-blocking transfers. - * note This API could be called at any time to stop slave for handling the bus events. - * param base The LPI2C peripheral base address. - * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. - * retval #kStatus_Success - * retval #kStatus_LPI2C_Idle - */ -void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle) -{ - assert(NULL != handle); - - /* Return idle if no transaction is in progress. */ - if (handle->isBusy) - { - /* Disable LPI2C IRQ sources. */ - LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); - - /* Nack by default. */ - base->STAR = LPI2C_STAR_TXNACK_MASK; - - /* Reset transfer info. */ - (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); - - /* We're no longer busy. */ - handle->isBusy = false; - } -} - -/*! - * brief Reusable routine to handle slave interrupts. - * 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. - * param base The LPI2C peripheral base address. - * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. - */ -void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle) -{ - uint32_t flags; - lpi2c_slave_transfer_t *xfer; - - /* Check for a valid handle in case of a spurious interrupt. */ - if (NULL != handle) - { - xfer = &handle->transfer; - - /* Get status flags. */ - flags = LPI2C_SlaveGetStatusFlags(base); - - if (0U != (flags & ((uint32_t)kLPI2C_SlaveBitErrFlag | (uint32_t)kLPI2C_SlaveFifoErrFlag))) - { - xfer->event = kLPI2C_SlaveCompletionEvent; - xfer->completionStatus = LPI2C_SlaveCheckAndClearError(base, flags); - - if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveCompletionEvent)) && (NULL != handle->callback)) - { - handle->callback(base, xfer, handle->userData); - } - } - else - { - if (0U != - (flags & (((uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag) | ((uint32_t)kLPI2C_SlaveStopDetectFlag)))) - { - xfer->event = (0U != (flags & (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag)) ? - kLPI2C_SlaveRepeatedStartEvent : - kLPI2C_SlaveCompletionEvent; - xfer->receivedAddress = 0U; - xfer->completionStatus = kStatus_Success; - xfer->transferredCount = handle->transferredCount; - - if (xfer->event == kLPI2C_SlaveCompletionEvent) - { - handle->isBusy = false; - } - - if (handle->wasTransmit) - { - /* Subtract one from the transmit count to offset the fact that LPI2C asserts the */ - /* tx flag before it sees the nack from the master-receiver, thus causing one more */ - /* count that the master actually receives. */ - --xfer->transferredCount; - handle->wasTransmit = false; - } - - /* Clear the flag. */ - LPI2C_SlaveClearStatusFlags(base, flags & ((uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag | - (uint32_t)kLPI2C_SlaveStopDetectFlag)); - - /* Revert to sending an Ack by default, in case we sent a Nack for receive. */ - base->STAR = 0U; - - if ((0U != (handle->eventMask & (uint32_t)xfer->event)) && (NULL != handle->callback)) - { - handle->callback(base, xfer, handle->userData); - } - - /* Clean up transfer info on completion, after the callback has been invoked. */ - (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); - } - if (0U != (flags & (uint32_t)kLPI2C_SlaveAddressValidFlag)) - { - xfer->event = kLPI2C_SlaveAddressMatchEvent; - xfer->receivedAddress = (uint8_t)(base->SASR & LPI2C_SASR_RADDR_MASK); - - /* Update handle status to busy because slave is addressed. */ - handle->isBusy = true; - if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveAddressMatchEvent)) && (NULL != handle->callback)) - { - handle->callback(base, xfer, handle->userData); - } - } - if (0U != (flags & (uint32_t)kLPI2C_SlaveTransmitAckFlag)) - { - xfer->event = kLPI2C_SlaveTransmitAckEvent; - - if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveTransmitAckEvent)) && (NULL != handle->callback)) - { - handle->callback(base, xfer, handle->userData); - } - } - - /* Handle transmit and receive. */ - if (0U != (flags & (uint32_t)kLPI2C_SlaveTxReadyFlag)) - { - handle->wasTransmit = true; - - /* If we're out of data, invoke callback to get more. */ - if ((NULL == xfer->data) || (0U == xfer->dataSize)) - { - xfer->event = kLPI2C_SlaveTransmitEvent; - if (NULL != handle->callback) - { - handle->callback(base, xfer, handle->userData); - } - - /* Clear the transferred count now that we have a new buffer. */ - handle->transferredCount = 0U; - } - - /* Transmit a byte. */ - if ((NULL != xfer->data) && (0U != xfer->dataSize)) - { - base->STDR = *xfer->data++; - --xfer->dataSize; - ++handle->transferredCount; - } - } - if (0U != (flags & (uint32_t)kLPI2C_SlaveRxReadyFlag)) - { - /* If we're out of room in the buffer, invoke callback to get another. */ - if ((NULL == xfer->data) || (0U == xfer->dataSize)) - { - xfer->event = kLPI2C_SlaveReceiveEvent; - if (NULL != handle->callback) - { - handle->callback(base, xfer, handle->userData); - } - - /* Clear the transferred count now that we have a new buffer. */ - handle->transferredCount = 0U; - } - - /* Receive a byte. */ - if ((NULL != xfer->data) && (0U != xfer->dataSize)) - { - *xfer->data++ = (uint8_t)base->SRDR; - --xfer->dataSize; - ++handle->transferredCount; - } - else - { - /* We don't have any room to receive more data, so send a nack. */ - base->STAR = LPI2C_STAR_TXNACK_MASK; - } - } - } - } -} - -#if !(defined(FSL_FEATURE_I2C_HAS_NO_IRQ) && FSL_FEATURE_I2C_HAS_NO_IRQ) -/*! - * @brief Shared IRQ handler that can call both master and slave ISRs. - * - * The master and slave ISRs are called through function pointers in order to decouple - * this code from the ISR functions. Without this, the linker would always pull in both - * ISRs and every function they call, even if only the functional API was used. - * - * @param base The LPI2C peripheral base address. - * @param instance The LPI2C peripheral instance number. - */ -static void LPI2C_CommonIRQHandler(LPI2C_Type *base, uint32_t instance) -{ - /* Check for master IRQ. */ - if ((0U != (base->MCR & LPI2C_MCR_MEN_MASK)) && (NULL != s_lpi2cMasterIsr)) - { - /* Master mode. */ - s_lpi2cMasterIsr(base, s_lpi2cMasterHandle[instance]); - } - - /* Check for slave IRQ. */ - if ((0U != (base->SCR & LPI2C_SCR_SEN_MASK)) && (NULL != s_lpi2cSlaveIsr)) - { - /* Slave mode. */ - s_lpi2cSlaveIsr(base, s_lpi2cSlaveHandle[instance]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(LPI2C0) -/* Implementation of LPI2C0 handler named in startup code. */ -void LPI2C0_DriverIRQHandler(void); -void LPI2C0_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C0, 0U); -} -#endif - -#if defined(LPI2C1) -/* Implementation of LPI2C1 handler named in startup code. */ -void LPI2C1_DriverIRQHandler(void); -void LPI2C1_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C1, 1U); -} -#endif - -#if defined(LPI2C2) -/* Implementation of LPI2C2 handler named in startup code. */ -void LPI2C2_DriverIRQHandler(void); -void LPI2C2_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C2, 2U); -} -#endif - -#if defined(LPI2C3) -/* Implementation of LPI2C3 handler named in startup code. */ -void LPI2C3_DriverIRQHandler(void); -void LPI2C3_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C3, 3U); -} -#endif - -#if defined(LPI2C4) -/* Implementation of LPI2C4 handler named in startup code. */ -void LPI2C4_DriverIRQHandler(void); -void LPI2C4_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C4, 4U); -} -#endif - -#if defined(LPI2C5) -/* Implementation of LPI2C5 handler named in startup code. */ -void LPI2C5_DriverIRQHandler(void); -void LPI2C5_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C5, 5U); -} -#endif - -#if defined(LPI2C6) -/* Implementation of LPI2C6 handler named in startup code. */ -void LPI2C6_DriverIRQHandler(void); -void LPI2C6_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(LPI2C6, 6U); -} -#endif - -#if defined(CM4_0__LPI2C) -/* Implementation of CM4_0__LPI2C handler named in startup code. */ -void M4_0_LPI2C_DriverIRQHandler(void); -void M4_0_LPI2C_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(CM4_0__LPI2C, LPI2C_GetInstance(CM4_0__LPI2C)); -} -#endif - -#if defined(CM4__LPI2C) -/* Implementation of CM4__LPI2C handler named in startup code. */ -void M4_LPI2C_DriverIRQHandler(void); -void M4_LPI2C_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(CM4__LPI2C, LPI2C_GetInstance(CM4__LPI2C)); -} -#endif - -#if defined(CM4_1__LPI2C) -/* Implementation of CM4_1__LPI2C handler named in startup code. */ -void M4_1_LPI2C_DriverIRQHandler(void); -void M4_1_LPI2C_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(CM4_1__LPI2C, LPI2C_GetInstance(CM4_1__LPI2C)); -} -#endif - -#if defined(DMA__LPI2C0) -/* Implementation of DMA__LPI2C0 handler named in startup code. */ -void DMA_I2C0_INT_DriverIRQHandler(void); -void DMA_I2C0_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(DMA__LPI2C0, LPI2C_GetInstance(DMA__LPI2C0)); -} -#endif - -#if defined(DMA__LPI2C1) -/* Implementation of DMA__LPI2C1 handler named in startup code. */ -void DMA_I2C1_INT_DriverIRQHandler(void); -void DMA_I2C1_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(DMA__LPI2C1, LPI2C_GetInstance(DMA__LPI2C1)); -} -#endif - -#if defined(DMA__LPI2C2) -/* Implementation of DMA__LPI2C2 handler named in startup code. */ -void DMA_I2C2_INT_DriverIRQHandler(void); -void DMA_I2C2_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(DMA__LPI2C2, LPI2C_GetInstance(DMA__LPI2C2)); -} -#endif - -#if defined(DMA__LPI2C3) -/* Implementation of DMA__LPI2C3 handler named in startup code. */ -void DMA_I2C3_INT_DriverIRQHandler(void); -void DMA_I2C3_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(DMA__LPI2C3, LPI2C_GetInstance(DMA__LPI2C3)); -} -#endif - -#if defined(DMA__LPI2C4) -/* Implementation of DMA__LPI2C3 handler named in startup code. */ -void DMA_I2C4_INT_DriverIRQHandler(void); -void DMA_I2C4_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(DMA__LPI2C4, LPI2C_GetInstance(DMA__LPI2C4)); -} -#endif - -#if defined(ADMA__LPI2C0) -/* Implementation of DMA__LPI2C0 handler named in startup code. */ -void ADMA_I2C0_INT_DriverIRQHandler(void); -void ADMA_I2C0_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(ADMA__LPI2C0, LPI2C_GetInstance(ADMA__LPI2C0)); -} -#endif - -#if defined(ADMA__LPI2C1) -/* Implementation of DMA__LPI2C1 handler named in startup code. */ -void ADMA_I2C1_INT_DriverIRQHandler(void); -void ADMA_I2C1_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(ADMA__LPI2C1, LPI2C_GetInstance(ADMA__LPI2C1)); -} -#endif - -#if defined(ADMA__LPI2C2) -/* Implementation of DMA__LPI2C2 handler named in startup code. */ -void ADMA_I2C2_INT_DriverIRQHandler(void); -void ADMA_I2C2_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(ADMA__LPI2C2, LPI2C_GetInstance(ADMA__LPI2C2)); -} -#endif - -#if defined(ADMA__LPI2C3) -/* Implementation of DMA__LPI2C3 handler named in startup code. */ -void ADMA_I2C3_INT_DriverIRQHandler(void); -void ADMA_I2C3_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(ADMA__LPI2C3, LPI2C_GetInstance(ADMA__LPI2C3)); -} -#endif - -#if defined(ADMA__LPI2C4) -/* Implementation of DMA__LPI2C3 handler named in startup code. */ -void ADMA_I2C4_INT_DriverIRQHandler(void); -void ADMA_I2C4_INT_DriverIRQHandler(void) -{ - LPI2C_CommonIRQHandler(ADMA__LPI2C4, LPI2C_GetInstance(ADMA__LPI2C4)); -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c.h b/devices/MIMXRT1052/drivers/fsl_lpi2c.h deleted file mode 100644 index 2341a9b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c.h +++ /dev/null @@ -1,1318 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPI2C_H_ -#define _FSL_LPI2C_H_ - -#include -#include "fsl_device_registers.h" -#include "fsl_common.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! - * @addtogroup lpi2c - * @{ - */ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPI2C driver version. */ -#define FSL_LPI2C_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) -/*@}*/ - -/*! @brief Retry times for waiting flag. */ -#ifndef I2C_RETRY_TIMES -#define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ -#endif - -/*! @brief LPI2C status return codes. */ -enum -{ - kStatus_LPI2C_Busy = MAKE_STATUS(kStatusGroup_LPI2C, 0), /*!< The master is already performing a transfer. */ - kStatus_LPI2C_Idle = MAKE_STATUS(kStatusGroup_LPI2C, 1), /*!< The slave driver is idle. */ - kStatus_LPI2C_Nak = MAKE_STATUS(kStatusGroup_LPI2C, 2), /*!< The slave device sent a NAK in response to a byte. */ - kStatus_LPI2C_FifoError = MAKE_STATUS(kStatusGroup_LPI2C, 3), /*!< FIFO under run or overrun. */ - kStatus_LPI2C_BitError = MAKE_STATUS(kStatusGroup_LPI2C, 4), /*!< Transferred bit was not seen on the bus. */ - kStatus_LPI2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_LPI2C, 5), /*!< Arbitration lost error. */ - kStatus_LPI2C_PinLowTimeout = - MAKE_STATUS(kStatusGroup_LPI2C, 6), /*!< SCL or SDA were held low longer than the timeout. */ - kStatus_LPI2C_NoTransferInProgress = - MAKE_STATUS(kStatusGroup_LPI2C, 7), /*!< Attempt to abort a transfer when one is not in progress. */ - kStatus_LPI2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_LPI2C, 8), /*!< DMA request failed. */ - kStatus_LPI2C_Timeout = MAKE_STATUS(kStatusGroup_LPI2C, 9), /*!< Timeout polling status flags. */ -}; - -/*! @} */ - -/*! - * @addtogroup lpi2c_master_driver - * @{ - */ - -/*! - * @brief LPI2C master peripheral flags. - * - * The following status register flags can be cleared: - * - #kLPI2C_MasterEndOfPacketFlag - * - #kLPI2C_MasterStopDetectFlag - * - #kLPI2C_MasterNackDetectFlag - * - #kLPI2C_MasterArbitrationLostFlag - * - #kLPI2C_MasterFifoErrFlag - * - #kLPI2C_MasterPinLowTimeoutFlag - * - #kLPI2C_MasterDataMatchFlag - * - * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as - * interrupts. - * - * @note These enums are meant to be OR'd together to form a bit mask. - */ -enum _lpi2c_master_flags -{ - kLPI2C_MasterTxReadyFlag = LPI2C_MSR_TDF_MASK, /*!< Transmit data flag */ - kLPI2C_MasterRxReadyFlag = LPI2C_MSR_RDF_MASK, /*!< Receive data flag */ - kLPI2C_MasterEndOfPacketFlag = LPI2C_MSR_EPF_MASK, /*!< End Packet flag */ - kLPI2C_MasterStopDetectFlag = LPI2C_MSR_SDF_MASK, /*!< Stop detect flag */ - kLPI2C_MasterNackDetectFlag = LPI2C_MSR_NDF_MASK, /*!< NACK detect flag */ - kLPI2C_MasterArbitrationLostFlag = LPI2C_MSR_ALF_MASK, /*!< Arbitration lost flag */ - kLPI2C_MasterFifoErrFlag = LPI2C_MSR_FEF_MASK, /*!< FIFO error flag */ - kLPI2C_MasterPinLowTimeoutFlag = LPI2C_MSR_PLTF_MASK, /*!< Pin low timeout flag */ - kLPI2C_MasterDataMatchFlag = LPI2C_MSR_DMF_MASK, /*!< Data match flag */ - kLPI2C_MasterBusyFlag = LPI2C_MSR_MBF_MASK, /*!< Master busy flag */ - kLPI2C_MasterBusBusyFlag = LPI2C_MSR_BBF_MASK, /*!< Bus busy flag */ - - /*! All flags which are cleared by the driver upon starting a transfer. */ - kLPI2C_MasterClearFlags = kLPI2C_MasterEndOfPacketFlag | kLPI2C_MasterStopDetectFlag | kLPI2C_MasterNackDetectFlag | - kLPI2C_MasterArbitrationLostFlag | kLPI2C_MasterFifoErrFlag | - kLPI2C_MasterPinLowTimeoutFlag | kLPI2C_MasterDataMatchFlag, - /*! IRQ sources enabled by the non-blocking transactional API. */ - kLPI2C_MasterIrqFlags = kLPI2C_MasterArbitrationLostFlag | kLPI2C_MasterTxReadyFlag | kLPI2C_MasterRxReadyFlag | - kLPI2C_MasterStopDetectFlag | kLPI2C_MasterNackDetectFlag | kLPI2C_MasterPinLowTimeoutFlag | - kLPI2C_MasterFifoErrFlag, - /*! Errors to check for. */ - kLPI2C_MasterErrorFlags = kLPI2C_MasterNackDetectFlag | kLPI2C_MasterArbitrationLostFlag | - kLPI2C_MasterFifoErrFlag | kLPI2C_MasterPinLowTimeoutFlag -}; - -/*! @brief Direction of master and slave transfers. */ -typedef enum _lpi2c_direction -{ - kLPI2C_Write = 0U, /*!< Master transmit. */ - kLPI2C_Read = 1U /*!< Master receive. */ -} lpi2c_direction_t; - -/*! @brief LPI2C pin configuration. */ -typedef enum _lpi2c_master_pin_config -{ - kLPI2C_2PinOpenDrain = 0x0U, /*!< LPI2C Configured for 2-pin open drain mode */ - kLPI2C_2PinOutputOnly = 0x1U, /*!< LPI2C Configured for 2-pin output only mode (ultra-fast mode) */ - kLPI2C_2PinPushPull = 0x2U, /*!< LPI2C Configured for 2-pin push-pull mode */ - kLPI2C_4PinPushPull = 0x3U, /*!< LPI2C Configured for 4-pin push-pull mode */ - kLPI2C_2PinOpenDrainWithSeparateSlave = - 0x4U, /*!< LPI2C Configured for 2-pin open drain mode with separate LPI2C slave */ - kLPI2C_2PinOutputOnlyWithSeparateSlave = - 0x5U, /*!< LPI2C Configured for 2-pin output only mode(ultra-fast mode) with separate LPI2C slave */ - kLPI2C_2PinPushPullWithSeparateSlave = - 0x6U, /*!< LPI2C Configured for 2-pin push-pull mode with separate LPI2C slave */ - kLPI2C_4PinPushPullWithInvertedOutput = 0x7U /*!< LPI2C Configured for 4-pin push-pull mode(inverted outputs) */ -} lpi2c_master_pin_config_t; - -/*! @brief LPI2C master host request selection. */ -typedef enum _lpi2c_host_request_source -{ - kLPI2C_HostRequestExternalPin = 0x0U, /*!< Select the LPI2C_HREQ pin as the host request input */ - kLPI2C_HostRequestInputTrigger = 0x1U, /*!< Select the input trigger as the host request input */ -} lpi2c_host_request_source_t; - -/*! @brief LPI2C master host request pin polarity configuration. */ -typedef enum _lpi2c_host_request_polarity -{ - kLPI2C_HostRequestPinActiveLow = 0x0U, /*!< Configure the LPI2C_HREQ pin active low */ - kLPI2C_HostRequestPinActiveHigh = 0x1U /*!< Configure the LPI2C_HREQ pin active high */ -} lpi2c_host_request_polarity_t; - -/*! - * @brief Structure with settings to initialize the LPI2C master module. - * - * This structure holds configuration settings for the LPI2C peripheral. To initialize this - * structure to reasonable defaults, call the LPI2C_MasterGetDefaultConfig() function and - * pass a pointer to your configuration structure instance. - * - * The configuration structure can be made constant so it resides in flash. - */ -typedef struct _lpi2c_master_config -{ - bool enableMaster; /*!< Whether to enable master mode. */ - bool enableDoze; /*!< Whether master is enabled in doze mode. */ - bool debugEnable; /*!< Enable transfers to continue when halted in debug mode. */ - bool ignoreAck; /*!< Whether to ignore ACK/NACK. */ - lpi2c_master_pin_config_t pinConfig; /*!< The pin configuration option. */ - uint32_t baudRate_Hz; /*!< Desired baud rate in Hertz. */ - uint32_t busIdleTimeout_ns; /*!< Bus idle timeout in nanoseconds. Set to 0 to disable. */ - uint32_t pinLowTimeout_ns; /*!< Pin low timeout in nanoseconds. Set to 0 to disable. */ - uint8_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SDA pin. Set to 0 to disable. */ - uint8_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SCL pin. Set to 0 to disable. */ - struct - { - bool enable; /*!< Enable host request. */ - lpi2c_host_request_source_t source; /*!< Host request source. */ - lpi2c_host_request_polarity_t polarity; /*!< Host request pin polarity. */ - } hostRequest; /*!< Host request options. */ -} lpi2c_master_config_t; - -/*! @brief LPI2C master data match configuration modes. */ -typedef enum _lpi2c_data_match_config_mode -{ - kLPI2C_MatchDisabled = 0x0U, /*!< LPI2C Match Disabled */ - kLPI2C_1stWordEqualsM0OrM1 = 0x2U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0 OR MATCH1 */ - kLPI2C_AnyWordEqualsM0OrM1 = 0x3U, /*!< LPI2C Match Enabled and any data word equals MATCH0 OR MATCH1 */ - kLPI2C_1stWordEqualsM0And2ndWordEqualsM1 = - 0x4U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0, 2nd data equals MATCH1 */ - kLPI2C_AnyWordEqualsM0AndNextWordEqualsM1 = - 0x5U, /*!< LPI2C Match Enabled and any data word equals MATCH0, next data equals MATCH1 */ - kLPI2C_1stWordAndM1EqualsM0AndM1 = - 0x6U, /*!< LPI2C Match Enabled and 1st data word and MATCH0 equals MATCH0 and MATCH1 */ - kLPI2C_AnyWordAndM1EqualsM0AndM1 = - 0x7U /*!< LPI2C Match Enabled and any data word and MATCH0 equals MATCH0 and MATCH1 */ -} lpi2c_data_match_config_mode_t; - -/*! @brief LPI2C master data match configuration structure. */ -typedef struct _lpi2c_match_config -{ - lpi2c_data_match_config_mode_t matchMode; /*!< Data match configuration setting. */ - bool rxDataMatchOnly; /*!< When set to true, received data is ignored until a successful match. */ - uint32_t match0; /*!< Match value 0. */ - uint32_t match1; /*!< Match value 1. */ -} lpi2c_data_match_config_t; - -/* Forward declaration of the transfer descriptor and handle typedefs. */ -typedef struct _lpi2c_master_transfer lpi2c_master_transfer_t; -typedef struct _lpi2c_master_handle lpi2c_master_handle_t; - -/*! - * @brief Master completion callback function pointer type. - * - * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use - * in the call to LPI2C_MasterTransferCreateHandle(). - * - * @param base The LPI2C peripheral base address. - * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. - * @param userData Arbitrary pointer-sized value passed from the application. - */ -typedef void (*lpi2c_master_transfer_callback_t)(LPI2C_Type *base, - lpi2c_master_handle_t *handle, - status_t completionStatus, - void *userData); - -/*! - * @brief Transfer option flags. - * - * @note These enumerations are intended to be OR'd together to form a bit mask of options for - * the #_lpi2c_master_transfer::flags field. - */ -enum _lpi2c_master_transfer_flags -{ - kLPI2C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ - kLPI2C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ - kLPI2C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ - kLPI2C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ -}; - -/*! - * @brief Non-blocking transfer descriptor structure. - * - * This structure is used to pass transaction parameters to the LPI2C_MasterTransferNonBlocking() API. - */ -struct _lpi2c_master_transfer -{ - uint32_t flags; /*!< Bit mask of options for the transfer. See enumeration #_lpi2c_master_transfer_flags for - available options. Set to 0 or #kLPI2C_TransferDefaultFlag for normal transfers. */ - uint16_t slaveAddress; /*!< The 7-bit slave address. */ - lpi2c_direction_t direction; /*!< Either #kLPI2C_Read or #kLPI2C_Write. */ - uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ - size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ - void *data; /*!< Pointer to data to transfer. */ - size_t dataSize; /*!< Number of bytes to transfer. */ -}; - -/*! - * @brief Driver handle for master non-blocking APIs. - * @note The contents of this structure are private and subject to change. - */ -struct _lpi2c_master_handle -{ - uint8_t state; /*!< Transfer state machine current state. */ - uint16_t remainingBytes; /*!< Remaining byte count in current state. */ - uint8_t *buf; /*!< Buffer pointer for current state. */ - uint16_t commandBuffer[6]; /*!< LPI2C command sequence. When all 6 command words are used: - Start&addr&write[1 word] + subaddr[4 words] + restart&addr&read[1 word] */ - lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ - lpi2c_master_transfer_callback_t completionCallback; /*!< Callback function pointer. */ - void *userData; /*!< Application data passed to callback. */ -}; - -/*! @brief Typedef for master interrupt handler, used internally for LPI2C master interrupt and EDMA transactional APIs. - */ -typedef void (*lpi2c_master_isr_t)(LPI2C_Type *base, void *handle); - -/*! @} */ - -/*! - * @addtogroup lpi2c_slave_driver - * @{ - */ - -/*! - * @brief LPI2C slave peripheral flags. - * - * The following status register flags can be cleared: - * - #kLPI2C_SlaveRepeatedStartDetectFlag - * - #kLPI2C_SlaveStopDetectFlag - * - #kLPI2C_SlaveBitErrFlag - * - #kLPI2C_SlaveFifoErrFlag - * - * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as - * interrupts. - * - * @note These enumerations are meant to be OR'd together to form a bit mask. - */ -enum _lpi2c_slave_flags -{ - kLPI2C_SlaveTxReadyFlag = LPI2C_SSR_TDF_MASK, /*!< Transmit data flag */ - kLPI2C_SlaveRxReadyFlag = LPI2C_SSR_RDF_MASK, /*!< Receive data flag */ - kLPI2C_SlaveAddressValidFlag = LPI2C_SSR_AVF_MASK, /*!< Address valid flag */ - kLPI2C_SlaveTransmitAckFlag = LPI2C_SSR_TAF_MASK, /*!< Transmit ACK flag */ - kLPI2C_SlaveRepeatedStartDetectFlag = LPI2C_SSR_RSF_MASK, /*!< Repeated start detect flag */ - kLPI2C_SlaveStopDetectFlag = LPI2C_SSR_SDF_MASK, /*!< Stop detect flag */ - kLPI2C_SlaveBitErrFlag = LPI2C_SSR_BEF_MASK, /*!< Bit error flag */ - kLPI2C_SlaveFifoErrFlag = LPI2C_SSR_FEF_MASK, /*!< FIFO error flag */ - kLPI2C_SlaveAddressMatch0Flag = LPI2C_SSR_AM0F_MASK, /*!< Address match 0 flag */ - kLPI2C_SlaveAddressMatch1Flag = LPI2C_SSR_AM1F_MASK, /*!< Address match 1 flag */ - kLPI2C_SlaveGeneralCallFlag = LPI2C_SSR_GCF_MASK, /*!< General call flag */ - kLPI2C_SlaveBusyFlag = LPI2C_SSR_SBF_MASK, /*!< Master busy flag */ - kLPI2C_SlaveBusBusyFlag = LPI2C_SSR_BBF_MASK, /*!< Bus busy flag */ - /*! All flags which are cleared by the driver upon starting a transfer. */ - kLPI2C_SlaveClearFlags = kLPI2C_SlaveRepeatedStartDetectFlag | kLPI2C_SlaveStopDetectFlag | kLPI2C_SlaveBitErrFlag | - kLPI2C_SlaveFifoErrFlag, - /*! IRQ sources enabled by the non-blocking transactional API. */ - kLPI2C_SlaveIrqFlags = kLPI2C_SlaveTxReadyFlag | kLPI2C_SlaveRxReadyFlag | kLPI2C_SlaveStopDetectFlag | - kLPI2C_SlaveRepeatedStartDetectFlag | kLPI2C_SlaveFifoErrFlag | kLPI2C_SlaveBitErrFlag | - kLPI2C_SlaveTransmitAckFlag | kLPI2C_SlaveAddressValidFlag, - /*! Errors to check for. */ - kLPI2C_SlaveErrorFlags = kLPI2C_SlaveFifoErrFlag | kLPI2C_SlaveBitErrFlag -}; - -/*! @brief LPI2C slave address match options. */ -typedef enum _lpi2c_slave_address_match -{ - kLPI2C_MatchAddress0 = 0U, /*!< Match only address 0. */ - kLPI2C_MatchAddress0OrAddress1 = 2U, /*!< Match either address 0 or address 1. */ - kLPI2C_MatchAddress0ThroughAddress1 = 6U, /*!< Match a range of slave addresses from address 0 through address 1. */ -} lpi2c_slave_address_match_t; - -/*! - * @brief Structure with settings to initialize the LPI2C slave module. - * - * This structure holds configuration settings for the LPI2C slave peripheral. To initialize this - * structure to reasonable defaults, call the LPI2C_SlaveGetDefaultConfig() function and - * pass a pointer to your configuration structure instance. - * - * The configuration structure can be made constant so it resides in flash. - */ -typedef struct _lpi2c_slave_config -{ - bool enableSlave; /*!< Enable slave mode. */ - uint8_t address0; /*!< Slave's 7-bit address. */ - uint8_t address1; /*!< Alternate slave 7-bit address. */ - lpi2c_slave_address_match_t addressMatchMode; /*!< Address matching options. */ - bool filterDozeEnable; /*!< Enable digital glitch filter in doze mode. */ - bool filterEnable; /*!< Enable digital glitch filter. */ - bool enableGeneralCall; /*!< Enable general call address matching. */ - struct - { - bool enableAck; /*!< Enables SCL clock stretching during slave-transmit address byte(s) - and slave-receiver address and data byte(s) to allow software to - write the Transmit ACK Register before the ACK or NACK is transmitted. - Clock stretching occurs when transmitting the 9th bit. When - enableAckSCLStall is enabled, there is no need to set either - enableRxDataSCLStall or enableAddressSCLStall. */ - bool enableTx; /*!< Enables SCL clock stretching when the transmit data flag is set - during a slave-transmit transfer. */ - bool enableRx; /*!< Enables SCL clock stretching when receive data flag is set during - a slave-receive transfer. */ - bool enableAddress; /*!< Enables SCL clock stretching when the address valid flag is asserted. */ - } sclStall; - bool ignoreAck; /*!< Continue transfers after a NACK is detected. */ - bool enableReceivedAddressRead; /*!< Enable reading the address received address as the first byte of data. */ - uint32_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SDA signal. */ - uint32_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SCL signal. */ - uint32_t dataValidDelay_ns; /*!< Width in nanoseconds of the data valid delay. */ - uint32_t clockHoldTime_ns; /*!< Width in nanoseconds of the clock hold time. */ -} lpi2c_slave_config_t; - -/*! - * @brief Set of events sent to the callback for non blocking slave transfers. - * - * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together - * events is passed to LPI2C_SlaveTransferNonBlocking() in order to specify which events to enable. - * Then, when the slave callback is invoked, it is passed the current event through its @a transfer - * parameter. - * - * @note These enumerations are meant to be OR'd together to form a bit mask of events. - */ -typedef enum _lpi2c_slave_transfer_event -{ - kLPI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */ - kLPI2C_SlaveTransmitEvent = 0x02U, /*!< Callback is requested to provide data to transmit - (slave-transmitter role). */ - kLPI2C_SlaveReceiveEvent = 0x04U, /*!< Callback is requested to provide a buffer in which to place received - data (slave-receiver role). */ - kLPI2C_SlaveTransmitAckEvent = 0x08U, /*!< Callback needs to either transmit an ACK or NACK. */ - kLPI2C_SlaveRepeatedStartEvent = 0x10U, /*!< A repeated start was detected. */ - kLPI2C_SlaveCompletionEvent = 0x20U, /*!< A stop was detected, completing the transfer. */ - - /*! Bit mask of all available events. */ - kLPI2C_SlaveAllEvents = kLPI2C_SlaveAddressMatchEvent | kLPI2C_SlaveTransmitEvent | kLPI2C_SlaveReceiveEvent | - kLPI2C_SlaveTransmitAckEvent | kLPI2C_SlaveRepeatedStartEvent | kLPI2C_SlaveCompletionEvent, -} lpi2c_slave_transfer_event_t; - -/*! @brief LPI2C slave transfer structure */ -typedef struct _lpi2c_slave_transfer -{ - lpi2c_slave_transfer_event_t event; /*!< Reason the callback is being invoked. */ - uint8_t receivedAddress; /*!< Matching address send by master. */ - uint8_t *data; /*!< Transfer buffer */ - size_t dataSize; /*!< Transfer size */ - status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for - #kLPI2C_SlaveCompletionEvent. */ - size_t transferredCount; /*!< Number of bytes actually transferred since start or last repeated start. */ -} lpi2c_slave_transfer_t; - -/* Forward declaration. */ -typedef struct _lpi2c_slave_handle lpi2c_slave_handle_t; - -/*! - * @brief Slave event callback function pointer type. - * - * This callback is used only for the slave non-blocking transfer API. To install a callback, - * use the LPI2C_SlaveSetCallback() function after you have created a handle. - * - * @param base Base address for the LPI2C instance on which the event occurred. - * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. - * @param userData Arbitrary pointer-sized value passed from the application. - */ -typedef void (*lpi2c_slave_transfer_callback_t)(LPI2C_Type *base, lpi2c_slave_transfer_t *transfer, void *userData); - -/*! - * @brief LPI2C slave handle structure. - * @note The contents of this structure are private and subject to change. - */ -struct _lpi2c_slave_handle -{ - lpi2c_slave_transfer_t transfer; /*!< LPI2C slave transfer copy. */ - bool isBusy; /*!< Whether transfer is busy. */ - bool wasTransmit; /*!< Whether the last transfer was a transmit. */ - uint32_t eventMask; /*!< Mask of enabled events. */ - uint32_t transferredCount; /*!< Count of bytes transferred. */ - lpi2c_slave_transfer_callback_t callback; /*!< Callback function called at transfer event. */ - void *userData; /*!< Callback parameter passed to callback. */ -}; - -/*! @} */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! Array to map LPI2C instance number to IRQ number, used internally for LPI2C master interrupt and EDMA transactional -APIs. */ -extern IRQn_Type const kLpi2cIrqs[]; - -/*! Pointer to master IRQ handler for each instance, used internally for LPI2C master interrupt and EDMA transactional -APIs. */ -extern lpi2c_master_isr_t s_lpi2cMasterIsr; - -/*! Pointers to master handles for each instance, used internally for LPI2C master interrupt and EDMA transactional -APIs. */ -extern void *s_lpi2cMasterHandle[]; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Returns an instance number given a base address. - * - * If an invalid base address is passed, debug builds will assert. Release builds will just return - * instance number 0. - * - * @param base The LPI2C peripheral base address. - * @return LPI2C instance number starting from 0. - */ -uint32_t LPI2C_GetInstance(LPI2C_Type *base); - -/*! - * @addtogroup lpi2c_master_driver - * @{ - */ - -/*! @name Initialization and deinitialization */ -/*@{*/ - -/*! - * @brief Provides a default configuration for the LPI2C master peripheral. - * - * This function provides the following default configuration for the LPI2C master peripheral: - * @code - * masterConfig->enableMaster = true; - * masterConfig->debugEnable = false; - * masterConfig->ignoreAck = false; - * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; - * masterConfig->baudRate_Hz = 100000U; - * masterConfig->busIdleTimeout_ns = 0; - * masterConfig->pinLowTimeout_ns = 0; - * masterConfig->sdaGlitchFilterWidth_ns = 0; - * masterConfig->sclGlitchFilterWidth_ns = 0; - * masterConfig->hostRequest.enable = false; - * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; - * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; - * @endcode - * - * After calling this function, you can override any settings in order to customize the configuration, - * prior to initializing the master driver with LPI2C_MasterInit(). - * - * @param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. - */ -void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig); - -/*! - * @brief Initializes the LPI2C master peripheral. - * - * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user - * provided configuration. A software reset is performed prior to configuration. - * - * @param base The LPI2C peripheral base address. - * @param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of - * defaults - * that you can override. - * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, - * filter widths, and timeout periods. - */ -void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz); - -/*! - * @brief Deinitializes the LPI2C master peripheral. - * - * This function disables the LPI2C master peripheral and gates the clock. It also performs a software - * reset to restore the peripheral to reset conditions. - * - * @param base The LPI2C peripheral base address. - */ -void LPI2C_MasterDeinit(LPI2C_Type *base); - -/*! - * @brief Configures LPI2C master data match feature. - * - * @param base The LPI2C peripheral base address. - * @param matchConfig Settings for the data match feature. - */ -void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *matchConfig); - -/* Not static so it can be used from fsl_lpi2c_edma.c. */ -status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status); - -/* Not static so it can be used from fsl_lpi2c_edma.c. */ -status_t LPI2C_CheckForBusyBus(LPI2C_Type *base); - -/*! - * @brief Performs a software reset. - * - * Restores the LPI2C master peripheral to reset conditions. - * - * @param base The LPI2C peripheral base address. - */ -static inline void LPI2C_MasterReset(LPI2C_Type *base) -{ - base->MCR = LPI2C_MCR_RST_MASK; - base->MCR = 0; -} - -/*! - * @brief Enables or disables the LPI2C module as master. - * - * @param base The LPI2C peripheral base address. - * @param enable Pass true to enable or false to disable the specified LPI2C as master. - */ -static inline void LPI2C_MasterEnable(LPI2C_Type *base, bool enable) -{ - base->MCR = (base->MCR & ~LPI2C_MCR_MEN_MASK) | LPI2C_MCR_MEN(enable); -} - -/*@}*/ - -/*! @name Status */ -/*@{*/ - -/*! - * @brief Gets the LPI2C master status flags. - * - * A bit mask with the state of all LPI2C master status flags is returned. For each flag, the corresponding bit - * in the return value is set if the flag is asserted. - * - * @param base The LPI2C peripheral base address. - * @return State of the status flags: - * - 1: related status flag is set. - * - 0: related status flag is not set. - * @see _lpi2c_master_flags - */ -static inline uint32_t LPI2C_MasterGetStatusFlags(LPI2C_Type *base) -{ - return base->MSR; -} - -/*! - * @brief Clears the LPI2C master status flag state. - * - * The following status register flags can be cleared: - * - #kLPI2C_MasterEndOfPacketFlag - * - #kLPI2C_MasterStopDetectFlag - * - #kLPI2C_MasterNackDetectFlag - * - #kLPI2C_MasterArbitrationLostFlag - * - #kLPI2C_MasterFifoErrFlag - * - #kLPI2C_MasterPinLowTimeoutFlag - * - #kLPI2C_MasterDataMatchFlag - * - * Attempts to clear other flags has no effect. - * - * @param base The LPI2C peripheral base address. - * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of - * _lpi2c_master_flags enumerators OR'd together. You may pass the result of a previous call to - * LPI2C_MasterGetStatusFlags(). - * @see _lpi2c_master_flags. - */ -static inline void LPI2C_MasterClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) -{ - base->MSR = statusMask; -} - -/*@}*/ - -/*! @name Interrupts */ -/*@{*/ - -/*! - * @brief Enables the LPI2C master interrupt requests. - * - * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as - * interrupts. - * - * @param base The LPI2C peripheral base address. - * @param interruptMask Bit mask of interrupts to enable. See _lpi2c_master_flags for the set - * of constants that should be OR'd together to form the bit mask. - */ -static inline void LPI2C_MasterEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) -{ - base->MIER |= interruptMask; -} - -/*! - * @brief Disables the LPI2C master interrupt requests. - * - * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as - * interrupts. - * - * @param base The LPI2C peripheral base address. - * @param interruptMask Bit mask of interrupts to disable. See _lpi2c_master_flags for the set - * of constants that should be OR'd together to form the bit mask. - */ -static inline void LPI2C_MasterDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) -{ - base->MIER &= ~interruptMask; -} - -/*! - * @brief Returns the set of currently enabled LPI2C master interrupt requests. - * - * @param base The LPI2C peripheral base address. - * @return A bitmask composed of _lpi2c_master_flags enumerators OR'd together to indicate the - * set of enabled interrupts. - */ -static inline uint32_t LPI2C_MasterGetEnabledInterrupts(LPI2C_Type *base) -{ - return base->MIER; -} - -/*@}*/ - -/*! @name DMA control */ -/*@{*/ - -/*! - * @brief Enables or disables LPI2C master DMA requests. - * - * @param base The LPI2C peripheral base address. - * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. - * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. - */ -static inline void LPI2C_MasterEnableDMA(LPI2C_Type *base, bool enableTx, bool enableRx) -{ - base->MDER = LPI2C_MDER_TDDE(enableTx) | LPI2C_MDER_RDDE(enableRx); -} - -/*! - * @brief Gets LPI2C master transmit data register address for DMA transfer. - * - * @param base The LPI2C peripheral base address. - * @return The LPI2C Master Transmit Data Register address. - */ -static inline uint32_t LPI2C_MasterGetTxFifoAddress(LPI2C_Type *base) -{ - return (uint32_t)&base->MTDR; -} - -/*! - * @brief Gets LPI2C master receive data register address for DMA transfer. - * - * @param base The LPI2C peripheral base address. - * @return The LPI2C Master Receive Data Register address. - */ -static inline uint32_t LPI2C_MasterGetRxFifoAddress(LPI2C_Type *base) -{ - return (uint32_t)&base->MRDR; -} - -/*@}*/ - -/*! @name FIFO control */ -/*@{*/ - -/*! - * @brief Sets the watermarks for LPI2C master FIFOs. - * - * @param base The LPI2C peripheral base address. - * @param txWords Transmit FIFO watermark value in words. The #kLPI2C_MasterTxReadyFlag flag is set whenever - * the number of words in the transmit FIFO is equal or less than @a txWords. Writing a value equal or - * greater than the FIFO size is truncated. - * @param rxWords Receive FIFO watermark value in words. The #kLPI2C_MasterRxReadyFlag flag is set whenever - * the number of words in the receive FIFO is greater than @a rxWords. Writing a value equal or greater - * than the FIFO size is truncated. - */ -static inline void LPI2C_MasterSetWatermarks(LPI2C_Type *base, size_t txWords, size_t rxWords) -{ - base->MFCR = LPI2C_MFCR_TXWATER(txWords) | LPI2C_MFCR_RXWATER(rxWords); -} - -/*! - * @brief Gets the current number of words in the LPI2C master FIFOs. - * - * @param base The LPI2C peripheral base address. - * @param[out] txCount Pointer through which the current number of words in the transmit FIFO is returned. - * Pass NULL if this value is not required. - * @param[out] rxCount Pointer through which the current number of words in the receive FIFO is returned. - * Pass NULL if this value is not required. - */ -static inline void LPI2C_MasterGetFifoCounts(LPI2C_Type *base, size_t *rxCount, size_t *txCount) -{ - if (NULL != txCount) - { - *txCount = (base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) >> LPI2C_MFSR_TXCOUNT_SHIFT; - } - if (NULL != rxCount) - { - *rxCount = (base->MFSR & LPI2C_MFSR_RXCOUNT_MASK) >> LPI2C_MFSR_RXCOUNT_SHIFT; - } -} - -/*@}*/ - -/*! @name Bus operations */ -/*@{*/ - -/*! - * @brief Sets the I2C bus frequency for master transactions. - * - * The LPI2C 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. - * - * @note Please note that the second parameter is the clock frequency of LPI2C module, the third - * parameter means user configured bus baudrate, this implementation is different from other I2C drivers - * which use baudrate configuration as second parameter and source clock frequency as third parameter. - * - * @param base The LPI2C peripheral base address. - * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. - * @param baudRate_Hz Requested bus frequency in Hertz. - */ -void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz); - -/*! - * @brief Returns whether the bus is idle. - * - * Requires the master mode to be enabled. - * - * @param base The LPI2C peripheral base address. - * @retval true Bus is busy. - * @retval false Bus is idle. - */ -static inline bool LPI2C_MasterGetBusIdleState(LPI2C_Type *base) -{ - return ((base->MSR & LPI2C_MSR_BBF_MASK) >> LPI2C_MSR_BBF_SHIFT) == 1U ? true : false; -} - -/*! - * @brief Sends a START signal and slave address on the I2C bus. - * - * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure - * that another master is not occupying the bus. Then a START signal is transmitted, followed by the - * 7-bit address specified in the @a address parameter. Note that this function does not actually wait - * until the START and address are successfully sent on the bus before returning. - * - * @param base The LPI2C peripheral base address. - * @param address 7-bit slave device address, in bits [6:0]. - * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set - * the R/w bit (bit 0) in the transmitted slave address. - * @retval kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - */ -status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir); - -/*! - * @brief Sends a repeated START signal and slave address on the I2C bus. - * - * This function is used to send a Repeated START signal when a transfer is already in progress. Like - * LPI2C_MasterStart(), it also sends the specified 7-bit address. - * - * @note This function exists primarily to maintain compatible APIs between LPI2C and I2C drivers, - * as well as to better document the intent of code that uses these APIs. - * - * @param base The LPI2C peripheral base address. - * @param address 7-bit slave device address, in bits [6:0]. - * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set - * the R/w bit (bit 0) in the transmitted slave address. - * @retval kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - */ -static inline status_t LPI2C_MasterRepeatedStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) -{ - return LPI2C_MasterStart(base, address, dir); -} - -/*! - * @brief Performs a polling send transfer on the I2C bus. - * - * Sends up to @a 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_LPI2C_Nak. - * - * @param base The LPI2C peripheral base address. - * @param txBuff The pointer to the data to be transferred. - * @param txSize The length in bytes of the data to be transferred. - * @retval kStatus_Success Data was sent successfully. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * @retval #kStatus_LPI2C_FifoError FIFO under run or over run. - * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterSend(LPI2C_Type *base, void *txBuff, size_t txSize); - -/*! - * @brief Performs a polling receive transfer on the I2C bus. - * - * @param base The LPI2C peripheral base address. - * @param rxBuff The pointer to the data to be transferred. - * @param rxSize The length in bytes of the data to be transferred. - * @retval kStatus_Success Data was received successfully. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize); - -/*! - * @brief Sends a STOP signal on the I2C bus. - * - * This function does not return until the STOP signal is seen on the bus, or an error occurs. - * - * @param base The LPI2C peripheral base address. - * @retval kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterStop(LPI2C_Type *base); - -/*! - * @brief Performs a master polling transfer on the I2C bus. - * - * @note The API does not return until the transfer succeeds or fails due - * to error happens during transfer. - * - * @param base The LPI2C peripheral base address. - * @param transfer Pointer to the transfer structure. - * @retval kStatus_Success Data was received successfully. - * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. - * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. - * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. - * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. - * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. - */ -status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer); - -/*@}*/ - -/*! @name Non-blocking */ -/*@{*/ - -/*! - * @brief Creates a new handle for the LPI2C master non-blocking APIs. - * - * 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 LPI2C_MasterTransferAbort() API shall be called. - * - * - * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice - * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to - * enable the associated INTMUX IRQ in application. - * - * @param base The LPI2C peripheral base address. - * @param[out] handle Pointer to the LPI2C master driver handle. - * @param callback User provided pointer to the asynchronous callback function. - * @param userData User provided pointer to the application callback data. - */ -void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, - lpi2c_master_handle_t *handle, - lpi2c_master_transfer_callback_t callback, - void *userData); - -/*! - * @brief Performs a non-blocking transaction on the I2C bus. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @param transfer The pointer to the transfer descriptor. - * @retval kStatus_Success The transaction was started successfully. - * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking - * transaction is already in progress. - */ -status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, - lpi2c_master_handle_t *handle, - lpi2c_master_transfer_t *transfer); - -/*! - * @brief Returns number of bytes transferred so far. - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @param[out] count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_Success - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count); - -/*! - * @brief Terminates a non-blocking LPI2C master transmission early. - * - * @note It is not safe to call this function from an IRQ handler that has a higher priority than the - * LPI2C peripheral's IRQ priority. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @retval kStatus_Success A transaction was successfully aborted. - * @retval #kStatus_LPI2C_Idle There is not a non-blocking transaction currently in progress. - */ -void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle); - -/*@}*/ - -/*! @name IRQ handler */ -/*@{*/ - -/*! - * @brief Reusable routine to handle master interrupts. - * @note This function does not need to be called unless you are reimplementing the - * nonblocking API's interrupt handler routines to add special functionality. - * @param base The LPI2C peripheral base address. - * @param lpi2cMasterHandle Pointer to the LPI2C master driver handle. - */ -void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, void *lpi2cMasterHandle); - -/*@}*/ - -/*! @} */ - -/*! - * @addtogroup lpi2c_slave_driver - * @{ - */ - -/*! @name Slave initialization and deinitialization */ -/*@{*/ - -/*! - * @brief Provides a default configuration for the LPI2C slave peripheral. - * - * This function provides the following default configuration for the LPI2C slave peripheral: - * @code - * slaveConfig->enableSlave = true; - * slaveConfig->address0 = 0U; - * slaveConfig->address1 = 0U; - * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; - * slaveConfig->filterDozeEnable = true; - * slaveConfig->filterEnable = true; - * slaveConfig->enableGeneralCall = false; - * slaveConfig->sclStall.enableAck = false; - * slaveConfig->sclStall.enableTx = true; - * slaveConfig->sclStall.enableRx = true; - * slaveConfig->sclStall.enableAddress = true; - * slaveConfig->ignoreAck = false; - * slaveConfig->enableReceivedAddressRead = false; - * slaveConfig->sdaGlitchFilterWidth_ns = 0; - * slaveConfig->sclGlitchFilterWidth_ns = 0; - * slaveConfig->dataValidDelay_ns = 0; - * slaveConfig->clockHoldTime_ns = 0; - * @endcode - * - * After calling this function, override any settings to customize the configuration, - * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the @a - * address0 member of the configuration structure with the desired slave address. - * - * @param[out] slaveConfig User provided configuration structure that is set to default values. Refer to - * #lpi2c_slave_config_t. - */ -void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig); - -/*! - * @brief Initializes the LPI2C slave peripheral. - * - * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user - * provided configuration. - * - * @param base The LPI2C peripheral base address. - * @param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults - * that you can override. - * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, - * data valid delay, and clock hold time. - */ -void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz); - -/*! - * @brief Deinitializes the LPI2C slave peripheral. - * - * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software - * reset to restore the peripheral to reset conditions. - * - * @param base The LPI2C peripheral base address. - */ -void LPI2C_SlaveDeinit(LPI2C_Type *base); - -/*! - * @brief Performs a software reset of the LPI2C slave peripheral. - * - * @param base The LPI2C peripheral base address. - */ -static inline void LPI2C_SlaveReset(LPI2C_Type *base) -{ - base->SCR = LPI2C_SCR_RST_MASK; - base->SCR = 0; -} - -/*! - * @brief Enables or disables the LPI2C module as slave. - * - * @param base The LPI2C peripheral base address. - * @param enable Pass true to enable or false to disable the specified LPI2C as slave. - */ -static inline void LPI2C_SlaveEnable(LPI2C_Type *base, bool enable) -{ - base->SCR = (base->SCR & ~LPI2C_SCR_SEN_MASK) | LPI2C_SCR_SEN(enable); -} - -/*@}*/ - -/*! @name Slave status */ -/*@{*/ - -/*! - * @brief Gets the LPI2C slave status flags. - * - * A bit mask with the state of all LPI2C slave status flags is returned. For each flag, the corresponding bit - * in the return value is set if the flag is asserted. - * - * @param base The LPI2C peripheral base address. - * @return State of the status flags: - * - 1: related status flag is set. - * - 0: related status flag is not set. - * @see _lpi2c_slave_flags - */ -static inline uint32_t LPI2C_SlaveGetStatusFlags(LPI2C_Type *base) -{ - return base->SSR; -} - -/*! - * @brief Clears the LPI2C status flag state. - * - * The following status register flags can be cleared: - * - #kLPI2C_SlaveRepeatedStartDetectFlag - * - #kLPI2C_SlaveStopDetectFlag - * - #kLPI2C_SlaveBitErrFlag - * - #kLPI2C_SlaveFifoErrFlag - * - * Attempts to clear other flags has no effect. - * - * @param base The LPI2C peripheral base address. - * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of - * #_lpi2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to - * LPI2C_SlaveGetStatusFlags(). - * @see _lpi2c_slave_flags. - */ -static inline void LPI2C_SlaveClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) -{ - base->SSR = statusMask; -} - -/*@}*/ - -/*! @name Slave interrupts */ -/*@{*/ - -/*! - * @brief Enables the LPI2C slave interrupt requests. - * - * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as - * interrupts. - * - * @param base The LPI2C peripheral base address. - * @param interruptMask Bit mask of interrupts to enable. See #_lpi2c_slave_flags for the set - * of constants that should be OR'd together to form the bit mask. - */ -static inline void LPI2C_SlaveEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) -{ - base->SIER |= interruptMask; -} - -/*! - * @brief Disables the LPI2C slave interrupt requests. - * - * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as - * interrupts. - * - * @param base The LPI2C peripheral base address. - * @param interruptMask Bit mask of interrupts to disable. See #_lpi2c_slave_flags for the set - * of constants that should be OR'd together to form the bit mask. - */ -static inline void LPI2C_SlaveDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) -{ - base->SIER &= ~interruptMask; -} - -/*! - * @brief Returns the set of currently enabled LPI2C slave interrupt requests. - * @param base The LPI2C peripheral base address. - * @return A bitmask composed of #_lpi2c_slave_flags enumerators OR'd together to indicate the - * set of enabled interrupts. - */ -static inline uint32_t LPI2C_SlaveGetEnabledInterrupts(LPI2C_Type *base) -{ - return base->SIER; -} - -/*@}*/ - -/*! @name Slave DMA control */ -/*@{*/ - -/*! - * @brief Enables or disables the LPI2C slave peripheral DMA requests. - * - * @param base The LPI2C peripheral base address. - * @param enableAddressValid Enable flag for the address valid DMA request. Pass true for enable, false for disable. - * The address valid DMA request is shared with the receive data DMA request. - * @param enableRx Enable flag for the receive data DMA request. Pass true for enable, false for disable. - * @param enableTx Enable flag for the transmit data DMA request. Pass true for enable, false for disable. - */ -static inline void LPI2C_SlaveEnableDMA(LPI2C_Type *base, bool enableAddressValid, bool enableRx, bool enableTx) -{ - base->SDER = (base->SDER & ~(LPI2C_SDER_AVDE_MASK | LPI2C_SDER_RDDE_MASK | LPI2C_SDER_TDDE_MASK)) | - LPI2C_SDER_AVDE(enableAddressValid) | LPI2C_SDER_RDDE(enableRx) | LPI2C_SDER_TDDE(enableTx); -} - -/*@}*/ - -/*! @name Slave bus operations */ -/*@{*/ - -/*! - * @brief Returns whether the bus is idle. - * - * Requires the slave mode to be enabled. - * - * @param base The LPI2C peripheral base address. - * @retval true Bus is busy. - * @retval false Bus is idle. - */ -static inline bool LPI2C_SlaveGetBusIdleState(LPI2C_Type *base) -{ - return ((base->SSR & LPI2C_SSR_BBF_MASK) >> LPI2C_SSR_BBF_SHIFT) == 1U ? true : false; -} - -/*! - * @brief Transmits either an ACK or NAK on the I2C bus in response to a byte from the master. - * - * Use this function to send an ACK or NAK when the #kLPI2C_SlaveTransmitAckFlag is asserted. This - * only happens if you enable the sclStall.enableAck field of the ::lpi2c_slave_config_t configuration - * structure used to initialize the slave peripheral. - * - * @param base The LPI2C peripheral base address. - * @param ackOrNack Pass true for an ACK or false for a NAK. - */ -static inline void LPI2C_SlaveTransmitAck(LPI2C_Type *base, bool ackOrNack) -{ - base->STAR = LPI2C_STAR_TXNACK(!ackOrNack); -} - -/*! - * @brief Returns the slave address sent by the I2C master. - * - * This function should only be called if the #kLPI2C_SlaveAddressValidFlag is asserted. - * - * @param base The LPI2C peripheral base address. - * @return The 8-bit address matched by the LPI2C slave. Bit 0 contains the R/w direction bit, and - * the 7-bit slave address is in the upper 7 bits. - */ -static inline uint32_t LPI2C_SlaveGetReceivedAddress(LPI2C_Type *base) -{ - return base->SASR & LPI2C_SASR_RADDR_MASK; -} - -/*! - * @brief Performs a polling send transfer on the I2C bus. - * - * @param base The LPI2C peripheral base address. - * @param txBuff The pointer to the data to be transferred. - * @param txSize The length in bytes of the data to be transferred. - * @param[out] actualTxSize - * @return Error or success status returned by API. - */ -status_t LPI2C_SlaveSend(LPI2C_Type *base, void *txBuff, size_t txSize, size_t *actualTxSize); - -/*! - * @brief Performs a polling receive transfer on the I2C bus. - * - * @param base The LPI2C peripheral base address. - * @param rxBuff The pointer to the data to be transferred. - * @param rxSize The length in bytes of the data to be transferred. - * @param[out] actualRxSize - * @return Error or success status returned by API. - */ -status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize); - -/*@}*/ - -/*! @name Slave non-blocking */ -/*@{*/ - -/*! - * @brief Creates a new handle for the LPI2C slave non-blocking APIs. - * - * 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 LPI2C_SlaveTransferAbort() API shall be called. - * - * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice - * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to - * enable the associated INTMUX IRQ in application. - - * @param base The LPI2C peripheral base address. - * @param[out] handle Pointer to the LPI2C slave driver handle. - * @param callback User provided pointer to the asynchronous callback function. - * @param userData User provided pointer to the application callback data. - */ -void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, - lpi2c_slave_handle_t *handle, - lpi2c_slave_transfer_callback_t callback, - void *userData); - -/*! - * @brief Starts accepting slave transfers. - * - * Call this API after calling I2C_SlaveInit() and LPI2C_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 LPI2C_SlaveTransferCreateHandle(). The callback is always invoked - * from the interrupt context. - * - * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to - * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. - * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_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 #kLPI2C_SlaveAllEvents constant is provided as - * a convenient way to enable all events. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. - * @param eventMask Bit mask formed by OR'ing together #lpi2c_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 #kLPI2C_SlaveAllEvents to enable all events. - * - * @retval kStatus_Success Slave transfers were successfully started. - * @retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. - */ -status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask); - -/*! - * @brief Gets the slave transfer status during a non-blocking transfer. - * @param base The LPI2C peripheral base address. - * @param handle Pointer to i2c_slave_handle_t structure. - * @param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not - * required. - * @retval kStatus_Success - * @retval kStatus_NoTransferInProgress - */ -status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count); - -/*! - * @brief Aborts the slave non-blocking transfers. - * @note This API could be called at any time to stop slave for handling the bus events. - * @param base The LPI2C peripheral base address. - * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. - * @retval kStatus_Success - * @retval #kStatus_LPI2C_Idle - */ -void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle); - -/*@}*/ - -/*! @name Slave IRQ handler */ -/*@{*/ - -/*! - * @brief Reusable routine to handle slave interrupts. - * @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. - * @param base The LPI2C peripheral base address. - * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. - */ -void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle); - -/*@}*/ - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -#endif /* _FSL_LPI2C_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c b/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c deleted file mode 100644 index 82c77b8..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.c +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpi2c_edma.h" -#include -#include - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpi2c_edma" -#endif - -/* @brief Mask to align an address to 32 bytes. */ -#define ALIGN_32_MASK (0x1fU) - -/* ! @brief LPI2C master fifo commands. */ -enum _lpi2c_master_fifo_cmd -{ - kTxDataCmd = LPI2C_MTDR_CMD(0x0U), /*!< Transmit DATA[7:0] */ - kRxDataCmd = LPI2C_MTDR_CMD(0X1U), /*!< Receive (DATA[7:0] + 1) bytes */ - kStopCmd = LPI2C_MTDR_CMD(0x2U), /*!< Generate STOP condition */ - kStartCmd = LPI2C_MTDR_CMD(0x4U), /*!< Generate(repeated) START and transmit address in DATA[[7:0] */ -}; - -/*! @brief States for the state machine used by transactional APIs. */ -enum _lpi2c_transfer_states -{ - kIdleState = 0, - kSendCommandState, - kIssueReadCommandState, - kTransferDataState, - kStopState, - kWaitForCompletionState, -}; - -/*! @brief Typedef for interrupt handler. */ -typedef void (*lpi2c_isr_t)(LPI2C_Type *base, void *handle); - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Prepares the command buffer with the sequence of commands needed to send the requested transaction. - * @param handle Master DMA driver handle. - * @return Number of command words. - */ -static uint32_t LPI2C_GenerateCommands(lpi2c_master_edma_handle_t *handle); - -/*! - * @brief DMA completion callback. - * @param dmaHandle DMA channel handle for the channel that completed. - * @param userData User data associated with the channel handle. For this callback, the user data is the - * LPI2C DMA driver handle. - * @param isTransferDone Whether the DMA transfer has completed. - * @param tcds Number of TCDs that completed. - */ -static void LPI2C_MasterEDMACallback(edma_handle_t *dmaHandle, void *userData, bool isTransferDone, uint32_t tcds); - -/*! - * @brief LPI2C master edma transfer IRQ handle routine. - * - * This API handles the LPI2C bus error status and invoke callback if needed. - * - * @param base The LPI2C peripheral base address. - * @param lpi2cMasterEdmaHandle Pointer to the LPI2C master edma handle. - */ -static void LPI2C_MasterTransferEdmaHandleIRQ(LPI2C_Type *base, void *lpi2cMasterEdmaHandle); -/******************************************************************************* - * Variables - ******************************************************************************/ - -static uint32_t lpi2c_edma_RecSetting = 0x02; - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Create a new handle for the LPI2C master DMA APIs. - * - * The creation of a handle is for use with the DMA APIs. Once a handle - * is created, there is not a corresponding destroy handle. If the user wants to - * terminate a transfer, the LPI2C_MasterTransferAbortEDMA() API shall be called. - * - * For devices where the LPI2C send and receive DMA requests are OR'd together, the a txDmaHandle - * parameter is ignored and may be set to NULL. - * - * param base The LPI2C peripheral base address. - * param[out] handle Pointer to the LPI2C master driver handle. - * param rxDmaHandle Handle for the eDMA receive channel. Created by the user prior to calling this function. - * param txDmaHandle Handle for the eDMA transmit channel. Created by the user prior to calling this function. - * param callback User provided pointer to the asynchronous callback function. - * param userData User provided pointer to the application callback data. - */ -void LPI2C_MasterCreateEDMAHandle(LPI2C_Type *base, - lpi2c_master_edma_handle_t *handle, - edma_handle_t *rxDmaHandle, - edma_handle_t *txDmaHandle, - lpi2c_master_edma_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - assert(rxDmaHandle != NULL); - assert(txDmaHandle != NULL); - - /* Look up instance number */ - uint32_t instance = LPI2C_GetInstance(base); - - /* Clear out the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set up the handle. For combined rx/tx DMA requests, the tx channel handle is set to the rx handle */ - /* in order to make the transfer API code simpler. */ - handle->base = base; - handle->completionCallback = callback; - handle->userData = userData; - handle->rx = rxDmaHandle; - handle->tx = (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) > 0) ? txDmaHandle : rxDmaHandle; - - /* Save the handle in global variables to support the double weak mechanism. */ - s_lpi2cMasterHandle[instance] = handle; - - /* Set LPI2C_MasterTransferEdmaHandleIRQ as LPI2C DMA IRQ handler */ - s_lpi2cMasterIsr = LPI2C_MasterTransferEdmaHandleIRQ; - - /* Enable interrupt in NVIC. */ - (void)EnableIRQ(kLpi2cIrqs[instance]); - - /* Set DMA channel completion callbacks. */ - EDMA_SetCallback(handle->rx, LPI2C_MasterEDMACallback, handle); - if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) - { - EDMA_SetCallback(handle->tx, LPI2C_MasterEDMACallback, handle); - } -} - -static uint32_t LPI2C_GenerateCommands(lpi2c_master_edma_handle_t *handle) -{ - lpi2c_master_transfer_t *xfer = &handle->transfer; - uint16_t *cmd = (uint16_t *)&handle->commandBuffer; - uint32_t cmdCount = 0; - - /* Handle no start option. */ - if ((xfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag) != 0U) - { - if (xfer->direction == kLPI2C_Read) - { - /* Need to issue read command first. */ - cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(xfer->dataSize - 1U); - } - } - else - { - /* - * Initial direction depends on whether a subaddress was provided, and of course the actual - * data transfer direction. - */ - lpi2c_direction_t direction = (xfer->subaddressSize != 0U) ? kLPI2C_Write : xfer->direction; - - /* Start command. */ - cmd[cmdCount++] = - (uint16_t)kStartCmd | (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)direction); - - /* Subaddress, MSB first. */ - if (xfer->subaddressSize != 0U) - { - uint32_t subaddressRemaining = xfer->subaddressSize; - while (0U != subaddressRemaining--) - { - uint8_t subaddressByte = (uint8_t)(xfer->subaddress >> (8U * subaddressRemaining)) & 0xffU; - cmd[cmdCount++] = subaddressByte; - } - } - - /* Reads need special handling because we have to issue a read command and maybe a repeated start. */ - if ((xfer->dataSize != 0U) && (xfer->direction == kLPI2C_Read)) - { - /* Need to send repeated start if switching directions to read. */ - if (direction == kLPI2C_Write) - { - cmd[cmdCount++] = (uint16_t)kStartCmd | - (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); - } - - /* Read command. A single write to MTDR can issue read operation of 0xFFU + 1 byte of data at most, so when - the dataSize is larger than 0x100U, push multiple read commands to MTDR until dataSize is reached. */ - size_t tmpRxSize = xfer->dataSize; - while (tmpRxSize != 0U) - { - if (tmpRxSize > 256U) - { - cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(0xFFU); - tmpRxSize -= 256U; - } - else - { - cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); - tmpRxSize = 0U; - } - } - } - } - - return cmdCount; -} - -/*! - * brief Performs a non-blocking DMA-based transaction on the I2C bus. - * - * The callback specified when the a handle was created is invoked when the transaction has - * completed. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * param transfer The pointer to the transfer descriptor. - * retval #kStatus_Success The transaction was started successfully. - * retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or another DMA - * transaction is already in progress. - */ -status_t LPI2C_MasterTransferEDMA(LPI2C_Type *base, - lpi2c_master_edma_handle_t *handle, - lpi2c_master_transfer_t *transfer) -{ - status_t result; - - assert(handle != NULL); - assert(transfer != NULL); - assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); - - /* Check transfer data size in read operation. */ - /* A single write to MTDR can issue read operation of 0xFFU + 1 byte of data at most, so when the dataSize is larger - than 0x100U, push multiple read commands to MTDR until dataSize is reached. LPI2C edma transfer uses linked - descriptor to transfer command and data, the command buffer is stored in handle. Allocate 4 command words to - carry read command which can cover nearly all use cases. */ - if ((transfer->direction == kLPI2C_Read) && (transfer->dataSize > (256U * 4U))) - { - return kStatus_InvalidArgument; - } - - /* Return busy if another transaction is in progress. */ - if (handle->isBusy) - { - return kStatus_LPI2C_Busy; - } - - /* Return an error if the bus is already in use not by us. */ - result = LPI2C_CheckForBusyBus(base); - if (result != kStatus_Success) - { - return result; - } - - /* We're now busy. */ - handle->isBusy = true; - - /* Disable LPI2C IRQ and DMA sources while we configure stuff. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - LPI2C_MasterEnableDMA(base, false, false); - - /* Clear all flags. */ - LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); - - /* Save transfer into handle. */ - handle->transfer = *transfer; - - /* Generate commands to send. */ - uint32_t commandCount = LPI2C_GenerateCommands(handle); - - /* If the user is transmitting no data with no start or stop, then just go ahead and invoke the callback. */ - if ((0U == commandCount) && (transfer->dataSize == 0U)) - { - if (handle->completionCallback != NULL) - { - handle->completionCallback(base, handle, kStatus_Success, handle->userData); - } - return kStatus_Success; - } - - /* Reset DMA channels. */ - EDMA_ResetChannel(handle->rx->base, handle->rx->channel); - if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) - { - EDMA_ResetChannel(handle->tx->base, handle->tx->channel); - } - - /* Get a 32-byte aligned TCD pointer. */ - edma_tcd_t *tcd = (edma_tcd_t *)((uint32_t)(&handle->tcds[1]) & (~ALIGN_32_MASK)); - - bool hasSendData = (transfer->direction == kLPI2C_Write) && (transfer->dataSize != 0U); - bool hasReceiveData = (transfer->direction == kLPI2C_Read) && (transfer->dataSize != 0U); - - edma_transfer_config_t transferConfig; - edma_tcd_t *linkTcd = NULL; - - /* Set up data transmit. */ - if (hasSendData) - { - uint32_t *srcAddr = (uint32_t *)transfer->data; - transferConfig.srcAddr = (uint32_t)srcAddr; - transferConfig.destAddr = (uint32_t)LPI2C_MasterGetTxFifoAddress(base); - transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.srcOffset = (int16_t)sizeof(uint8_t); - transferConfig.destOffset = 0; - transferConfig.minorLoopBytes = sizeof(uint8_t); /* TODO optimize to fill fifo */ - transferConfig.majorLoopCounts = transfer->dataSize; - - /* Store the initially configured eDMA minor byte transfer count into the LPI2C handle */ - handle->nbytes = (uint8_t)transferConfig.minorLoopBytes; - - if (commandCount != 0U) - { - /* Create a software TCD, which will be chained after the commands. */ - EDMA_TcdReset(tcd); - EDMA_TcdSetTransferConfig(tcd, &transferConfig, NULL); - EDMA_TcdEnableInterrupts(tcd, (uint32_t)kEDMA_MajorInterruptEnable); - linkTcd = tcd; - } - else - { - /* User is only transmitting data with no required commands, so this transfer can stand alone. */ - EDMA_SetTransferConfig(handle->tx->base, handle->tx->channel, &transferConfig, NULL); - EDMA_EnableChannelInterrupts(handle->tx->base, handle->tx->channel, (uint32_t)kEDMA_MajorInterruptEnable); - } - } - else if (hasReceiveData) - { - uint32_t *srcAddr = (uint32_t *)transfer->data; - /* Set up data receive. */ - transferConfig.srcAddr = (uint32_t)LPI2C_MasterGetRxFifoAddress(base); - transferConfig.destAddr = (uint32_t)srcAddr; - transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.srcOffset = 0; - transferConfig.destOffset = (int16_t)sizeof(uint8_t); - transferConfig.minorLoopBytes = sizeof(uint8_t); /* TODO optimize to empty fifo */ - transferConfig.majorLoopCounts = transfer->dataSize; - - /* Store the initially configured eDMA minor byte transfer count into the LPI2C handle */ - handle->nbytes = (uint8_t)transferConfig.minorLoopBytes; - - if ((FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) || (0U == commandCount)) - { - /* We can put this receive transfer on its own DMA channel. */ - EDMA_SetTransferConfig(handle->rx->base, handle->rx->channel, &transferConfig, NULL); - EDMA_EnableChannelInterrupts(handle->rx->base, handle->rx->channel, (uint32_t)kEDMA_MajorInterruptEnable); - } - else - { - /* For shared rx/tx DMA requests, when there are commands, create a software TCD of - enabling rx dma and disabling tx dma, which will be chained onto the commands transfer, - and create another software TCD of transfering data and chain it onto the last TCD. - Notice that in this situation assume tx/rx uses same channel */ - EDMA_TcdReset(tcd); - EDMA_TcdSetTransferConfig(tcd, &transferConfig, NULL); - EDMA_TcdEnableInterrupts(tcd, (uint32_t)kEDMA_MajorInterruptEnable); - - transferConfig.srcAddr = (uint32_t)&lpi2c_edma_RecSetting; - transferConfig.destAddr = (uint32_t) & (base->MDER); - transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfig.srcOffset = 0; - transferConfig.destOffset = (int16_t)sizeof(uint8_t); - transferConfig.minorLoopBytes = sizeof(uint8_t); - transferConfig.majorLoopCounts = 1; - - edma_tcd_t *tcdSetRxClearTxDMA = (edma_tcd_t *)((uint32_t)(&handle->tcds[2]) & (~ALIGN_32_MASK)); - - EDMA_TcdReset(tcdSetRxClearTxDMA); - EDMA_TcdSetTransferConfig(tcdSetRxClearTxDMA, &transferConfig, tcd); - linkTcd = tcdSetRxClearTxDMA; - } - } - else - { - /* No data to send */ - } - - /* Set up commands transfer. */ - if (commandCount != 0U) - { - transferConfig.srcAddr = (uint32_t)handle->commandBuffer; - transferConfig.destAddr = (uint32_t)LPI2C_MasterGetTxFifoAddress(base); - transferConfig.srcTransferSize = kEDMA_TransferSize2Bytes; - transferConfig.destTransferSize = kEDMA_TransferSize2Bytes; - transferConfig.srcOffset = (int16_t)sizeof(uint16_t); - transferConfig.destOffset = 0; - transferConfig.minorLoopBytes = sizeof(uint16_t); /* TODO optimize to fill fifo */ - transferConfig.majorLoopCounts = commandCount; - - EDMA_SetTransferConfig(handle->tx->base, handle->tx->channel, &transferConfig, linkTcd); - } - - /* Start DMA transfer. */ - if (hasReceiveData || (0 == FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base))) - { - EDMA_StartTransfer(handle->rx); - } - - if ((hasSendData || (commandCount != 0U)) && (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0)) - { - EDMA_StartTransfer(handle->tx); - } - - /* Enable DMA in both directions. This actually kicks of the transfer. */ - LPI2C_MasterEnableDMA(base, true, true); - - /* Enable all LPI2C master interrupts */ - LPI2C_MasterEnableInterrupts(base, - (uint32_t)kLPI2C_MasterArbitrationLostFlag | (uint32_t)kLPI2C_MasterNackDetectFlag | - (uint32_t)kLPI2C_MasterPinLowTimeoutFlag | (uint32_t)kLPI2C_MasterFifoErrFlag); - - return result; -} - -/*! - * brief Returns number of bytes transferred so far. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * param[out] count Number of bytes transferred so far by the non-blocking transaction. - * retval #kStatus_Success - * retval #kStatus_NoTransferInProgress There is not a DMA transaction currently in progress. - */ -status_t LPI2C_MasterTransferGetCountEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (!handle->isBusy) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - uint32_t remaining = handle->transfer.dataSize; - - /* If the DMA is still on a commands transfer that chains to the actual data transfer, */ - /* we do nothing and return the number of transferred bytes as zero. */ - if (EDMA_GetNextTCDAddress(handle->tx) == 0U) - { - if (handle->transfer.direction == kLPI2C_Write) - { - remaining = - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->tx->base, handle->tx->channel); - } - else - { - remaining = - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->rx->base, handle->rx->channel); - } - } - - *count = handle->transfer.dataSize - remaining; - - return kStatus_Success; -} - -/*! - * brief Terminates a non-blocking LPI2C master transmission early. - * - * note It is not safe to call this function from an IRQ handler that has a higher priority than the - * eDMA peripheral's IRQ priority. - * - * param base The LPI2C peripheral base address. - * param handle Pointer to the LPI2C master driver handle. - * retval #kStatus_Success A transaction was successfully aborted. - * retval #kStatus_LPI2C_Idle There is not a DMA transaction currently in progress. - */ -status_t LPI2C_MasterTransferAbortEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle) -{ - /* Catch when there is not an active transfer. */ - if (!handle->isBusy) - { - return kStatus_LPI2C_Idle; - } - - /* Terminate DMA transfers. */ - EDMA_AbortTransfer(handle->rx); - if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) - { - EDMA_AbortTransfer(handle->tx); - } - - /* Reset fifos. */ - base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; - - /* Disable LPI2C interrupts. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* If master is still busy and has not send out stop signal yet. */ - if ((LPI2C_MasterGetStatusFlags(base) & - ((uint32_t)kLPI2C_MasterStopDetectFlag | (uint32_t)kLPI2C_MasterBusyFlag)) == (uint32_t)kLPI2C_MasterBusyFlag) - { - /* Send a stop command to finalize the transfer. */ - base->MTDR = (uint32_t)kStopCmd; - } - - /* Reset handle. */ - handle->isBusy = false; - - return kStatus_Success; -} - -static void LPI2C_MasterEDMACallback(edma_handle_t *dmaHandle, void *userData, bool isTransferDone, uint32_t tcds) -{ - lpi2c_master_edma_handle_t *handle = (lpi2c_master_edma_handle_t *)userData; - - if (NULL == handle) - { - return; - } - - /* Check for errors. */ - status_t result = LPI2C_MasterCheckAndClearError(handle->base, LPI2C_MasterGetStatusFlags(handle->base)); - - /* Done with this transaction. */ - handle->isBusy = false; - - if (0U == (handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag)) - { - /* Send a stop command to finalize the transfer. */ - handle->base->MTDR = (uint32_t)kStopCmd; - } - - /* Invoke callback. */ - if (handle->completionCallback != NULL) - { - handle->completionCallback(handle->base, handle, result, handle->userData); - } -} - -static void LPI2C_MasterTransferEdmaHandleIRQ(LPI2C_Type *base, void *lpi2cMasterEdmaHandle) -{ - assert(lpi2cMasterEdmaHandle != NULL); - - lpi2c_master_edma_handle_t *handle = (lpi2c_master_edma_handle_t *)lpi2cMasterEdmaHandle; - uint32_t status = LPI2C_MasterGetStatusFlags(base); - status_t result = kStatus_Success; - - /* Terminate DMA transfers. */ - EDMA_AbortTransfer(handle->rx); - if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) - { - EDMA_AbortTransfer(handle->tx); - } - - /* Done with this transaction. */ - handle->isBusy = false; - - /* Disable LPI2C interrupts. */ - LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); - - /* Check error status */ - if (0U != (status & (uint32_t)kLPI2C_MasterPinLowTimeoutFlag)) - { - result = kStatus_LPI2C_PinLowTimeout; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterArbitrationLostFlag)) - { - result = kStatus_LPI2C_ArbitrationLost; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterNackDetectFlag)) - { - result = kStatus_LPI2C_Nak; - } - else if (0U != (status & (uint32_t)kLPI2C_MasterFifoErrFlag)) - { - result = kStatus_LPI2C_FifoError; - } - else - { - ; /* Intentional empty */ - } - - /* Clear error status. */ - (void)LPI2C_MasterCheckAndClearError(base, status); - - /* Send stop flag if needed */ - if (0U == (handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag)) - { - status = LPI2C_MasterGetStatusFlags(base); - /* If bus is still busy and the master has not generate stop flag */ - if ((status & ((uint32_t)kLPI2C_MasterBusBusyFlag | (uint32_t)kLPI2C_MasterStopDetectFlag)) == - (uint32_t)kLPI2C_MasterBusBusyFlag) - { - /* Send a stop command to finalize the transfer. */ - handle->base->MTDR = (uint32_t)kStopCmd; - } - } - - /* Invoke callback. */ - if (handle->completionCallback != NULL) - { - handle->completionCallback(base, handle, result, handle->userData); - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.h b/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.h deleted file mode 100644 index 1d48fdf..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c_edma.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPI2C_EDMA_H_ -#define _FSL_LPI2C_EDMA_H_ - -#include "fsl_lpi2c.h" -#include "fsl_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPI2C EDMA driver version. */ -#define FSL_LPI2C_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) -/*@}*/ - -/*! - * @addtogroup lpi2c_master_edma_driver - * @{ - */ - -/* Forward declaration of the transfer descriptor and handle typedefs. */ -typedef struct _lpi2c_master_edma_handle lpi2c_master_edma_handle_t; - -/*! - * @brief Master DMA completion callback function pointer type. - * - * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use - * in the call to LPI2C_MasterCreateEDMAHandle(). - * - * @param base The LPI2C peripheral base address. - * @param handle Handle associated with the completed transfer. - * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. - * @param userData Arbitrary pointer-sized value passed from the application. - */ -typedef void (*lpi2c_master_edma_transfer_callback_t)(LPI2C_Type *base, - lpi2c_master_edma_handle_t *handle, - status_t completionStatus, - void *userData); - -/*! - * @brief Driver handle for master DMA APIs. - * @note The contents of this structure are private and subject to change. - */ -struct _lpi2c_master_edma_handle -{ - LPI2C_Type *base; /*!< LPI2C base pointer. */ - bool isBusy; /*!< Transfer state machine current state. */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - uint16_t commandBuffer[10]; /*!< LPI2C command sequence. When all 10 command words are used: - Start&addr&write[1 word] + subaddr[4 words] + restart&addr&read[1 word] + receive&Size[4 words] */ - lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ - lpi2c_master_edma_transfer_callback_t completionCallback; /*!< Callback function pointer. */ - void *userData; /*!< Application data passed to callback. */ - edma_handle_t *rx; /*!< Handle for receive DMA channel. */ - edma_handle_t *tx; /*!< Handle for transmit DMA channel. */ - edma_tcd_t tcds[3]; /*!< Software TCD. Three are allocated to provide enough room to align to 32-bytes. */ -}; - -/*! @} */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @addtogroup lpi2c_master_edma_driver - * @{ - */ - -/*! @name Master DMA */ -/*@{*/ - -/*! - * @brief Create a new handle for the LPI2C master DMA APIs. - * - * The creation of a handle is for use with the DMA APIs. Once a handle - * is created, there is not a corresponding destroy handle. If the user wants to - * terminate a transfer, the LPI2C_MasterTransferAbortEDMA() API shall be called. - * - * For devices where the LPI2C send and receive DMA requests are OR'd together, the @a txDmaHandle - * parameter is ignored and may be set to NULL. - * - * @param base The LPI2C peripheral base address. - * @param[out] handle Pointer to the LPI2C master driver handle. - * @param rxDmaHandle Handle for the eDMA receive channel. Created by the user prior to calling this function. - * @param txDmaHandle Handle for the eDMA transmit channel. Created by the user prior to calling this function. - * @param callback User provided pointer to the asynchronous callback function. - * @param userData User provided pointer to the application callback data. - */ -void LPI2C_MasterCreateEDMAHandle(LPI2C_Type *base, - lpi2c_master_edma_handle_t *handle, - edma_handle_t *rxDmaHandle, - edma_handle_t *txDmaHandle, - lpi2c_master_edma_transfer_callback_t callback, - void *userData); - -/*! - * @brief Performs a non-blocking DMA-based transaction on the I2C bus. - * - * The callback specified when the @a handle was created is invoked when the transaction has - * completed. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @param transfer The pointer to the transfer descriptor. - * @retval kStatus_Success The transaction was started successfully. - * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or another DMA - * transaction is already in progress. - */ -status_t LPI2C_MasterTransferEDMA(LPI2C_Type *base, - lpi2c_master_edma_handle_t *handle, - lpi2c_master_transfer_t *transfer); - -/*! - * @brief Returns number of bytes transferred so far. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @param[out] count Number of bytes transferred so far by the non-blocking transaction. - * @retval kStatus_Success - * @retval kStatus_NoTransferInProgress There is not a DMA transaction currently in progress. - */ -status_t LPI2C_MasterTransferGetCountEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle, size_t *count); - -/*! - * @brief Terminates a non-blocking LPI2C master transmission early. - * - * @note It is not safe to call this function from an IRQ handler that has a higher priority than the - * eDMA peripheral's IRQ priority. - * - * @param base The LPI2C peripheral base address. - * @param handle Pointer to the LPI2C master driver handle. - * @retval kStatus_Success A transaction was successfully aborted. - * @retval #kStatus_LPI2C_Idle There is not a DMA transaction currently in progress. - */ -status_t LPI2C_MasterTransferAbortEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle); - -/*@}*/ - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -#endif /* _FSL_LPI2C_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.c b/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.c deleted file mode 100644 index efb2d40..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpi2c_freertos.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpi2c_freertos" -#endif - -static void LPI2C_RTOS_Callback(LPI2C_Type *base, lpi2c_master_handle_t *drv_handle, status_t status, void *userData) -{ - lpi2c_rtos_handle_t *handle = (lpi2c_rtos_handle_t *)userData; - BaseType_t reschedule; - handle->async_status = status; - (void)xSemaphoreGiveFromISR(handle->semaphore, &reschedule); - portYIELD_FROM_ISR(reschedule); -} - -/*! - * brief Initializes LPI2C. - * - * This function initializes the LPI2C module and related RTOS context. - * - * param handle The RTOS LPI2C handle, the pointer to an allocated space for RTOS context. - * param base The pointer base address of the LPI2C instance to initialize. - * param masterConfig Configuration structure to set-up LPI2C in master mode. - * param srcClock_Hz Frequency of input clock of the LPI2C module. - * return status of the operation. - */ -status_t LPI2C_RTOS_Init(lpi2c_rtos_handle_t *handle, - LPI2C_Type *base, - const lpi2c_master_config_t *masterConfig, - uint32_t srcClock_Hz) -{ - if (handle == NULL) - { - return kStatus_InvalidArgument; - } - - if (base == NULL) - { - return kStatus_InvalidArgument; - } - - (void)memset(handle, 0, sizeof(lpi2c_rtos_handle_t)); - - handle->mutex = xSemaphoreCreateMutex(); - if (handle->mutex == NULL) - { - return kStatus_Fail; - } - - handle->semaphore = xSemaphoreCreateBinary(); - if (handle->semaphore == NULL) - { - vSemaphoreDelete(handle->mutex); - return kStatus_Fail; - } - - handle->base = base; - - LPI2C_MasterInit(handle->base, masterConfig, srcClock_Hz); - LPI2C_MasterTransferCreateHandle(base, &handle->drv_handle, LPI2C_RTOS_Callback, (void *)handle); - - return kStatus_Success; -} - -/*! - * brief Deinitializes the LPI2C. - * - * This function deinitializes the LPI2C module and related RTOS context. - * - * param handle The RTOS LPI2C handle. - */ -status_t LPI2C_RTOS_Deinit(lpi2c_rtos_handle_t *handle) -{ - LPI2C_MasterDeinit(handle->base); - - vSemaphoreDelete(handle->semaphore); - vSemaphoreDelete(handle->mutex); - - return kStatus_Success; -} - -/*! - * brief Performs I2C transfer. - * - * This function performs an I2C transfer using LPI2C module according to data given in the transfer structure. - * - * param handle The RTOS LPI2C handle. - * param transfer Structure specifying the transfer parameters. - * return status of the operation. - */ -status_t LPI2C_RTOS_Transfer(lpi2c_rtos_handle_t *handle, lpi2c_master_transfer_t *transfer) -{ - status_t status; - - /* Lock resource mutex */ - if (xSemaphoreTake(handle->mutex, portMAX_DELAY) != pdTRUE) - { - return kStatus_LPI2C_Busy; - } - - status = LPI2C_MasterTransferNonBlocking(handle->base, &handle->drv_handle, transfer); - if (status != kStatus_Success) - { - (void)xSemaphoreGive(handle->mutex); - return status; - } - - /* Wait for transfer to finish */ - (void)xSemaphoreTake(handle->semaphore, portMAX_DELAY); - - /* Unlock resource mutex */ - (void)xSemaphoreGive(handle->mutex); - - /* Return status captured by callback function */ - return handle->async_status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.h b/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.h deleted file mode 100644 index 90bc78e..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpi2c_freertos.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef __FSL_LPI2C_FREERTOS_H__ -#define __FSL_LPI2C_FREERTOS_H__ - -#include "FreeRTOS.h" -#include "portable.h" -#include "semphr.h" - -#include "fsl_lpi2c.h" - -/*! - * @addtogroup lpi2c_freertos_driver LPI2C FreeRTOS Driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPI2C FreeRTOS driver version. */ -#define FSL_LPI2C_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) -/*@}*/ - -/*! - * @cond RTOS_PRIVATE - * @brief LPI2C FreeRTOS handle - */ -typedef struct _lpi2c_rtos_handle -{ - LPI2C_Type *base; /*!< LPI2C base address */ - lpi2c_master_handle_t drv_handle; /*!< Handle of the underlying driver, treated as opaque by the RTOS layer */ - status_t async_status; - SemaphoreHandle_t mutex; /*!< Mutex to lock the handle during a trasfer */ - SemaphoreHandle_t semaphore; /*!< Semaphore to notify and unblock task when transfer ends */ -} lpi2c_rtos_handle_t; -/*! \endcond */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name LPI2C RTOS Operation - * @{ - */ - -/*! - * @brief Initializes LPI2C. - * - * This function initializes the LPI2C module and related RTOS context. - * - * @param handle The RTOS LPI2C handle, the pointer to an allocated space for RTOS context. - * @param base The pointer base address of the LPI2C instance to initialize. - * @param masterConfig Configuration structure to set-up LPI2C in master mode. - * @param srcClock_Hz Frequency of input clock of the LPI2C module. - * @return status of the operation. - */ -status_t LPI2C_RTOS_Init(lpi2c_rtos_handle_t *handle, - LPI2C_Type *base, - const lpi2c_master_config_t *masterConfig, - uint32_t srcClock_Hz); - -/*! - * @brief Deinitializes the LPI2C. - * - * This function deinitializes the LPI2C module and related RTOS context. - * - * @param handle The RTOS LPI2C handle. - */ -status_t LPI2C_RTOS_Deinit(lpi2c_rtos_handle_t *handle); - -/*! - * @brief Performs I2C transfer. - * - * This function performs an I2C transfer using LPI2C module according to data given in the transfer structure. - * - * @param handle The RTOS LPI2C handle. - * @param transfer Structure specifying the transfer parameters. - * @return status of the operation. - */ -status_t LPI2C_RTOS_Transfer(lpi2c_rtos_handle_t *handle, lpi2c_master_transfer_t *transfer); - -/*! - * @} - */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ - -#endif /* __FSL_LPI2C_FREERTOS_H__ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpspi.c b/devices/MIMXRT1052/drivers/fsl_lpspi.c deleted file mode 100755 index 161a953..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpspi.c +++ /dev/null @@ -1,2284 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020,2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpspi.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpspi" -#endif - -/*! - * @brief Default watermark values. - * - * The default watermarks are set to zero. - */ -enum _lpspi_default_watermarks -{ - kLpspiDefaultTxWatermark = 0, - kLpspiDefaultRxWatermark = 0, -}; - -/*! @brief Typedef for master interrupt handler. */ -typedef void (*lpspi_master_isr_t)(LPSPI_Type *base, lpspi_master_handle_t *handle); - -/*! @brief Typedef for slave interrupt handler. */ -typedef void (*lpspi_slave_isr_t)(LPSPI_Type *base, lpspi_slave_handle_t *handle); - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Configures the LPSPI peripheral chip select polarity. - * - * This function takes in the desired peripheral chip select (Pcs) and it's corresponding desired polarity and - * configures the Pcs signal to operate with the desired characteristic. - * - * @param base LPSPI peripheral address. - * @param pcs The particular peripheral chip select (parameter value is of type lpspi_which_pcs_t) for which we wish to - * apply the active high or active low characteristic. - * @param activeLowOrHigh The setting for either "active high, inactive low (0)" or "active low, inactive high(1)" of - * type lpspi_pcs_polarity_config_t. - */ -static void LPSPI_SetOnePcsPolarity(LPSPI_Type *base, - lpspi_which_pcs_t pcs, - lpspi_pcs_polarity_config_t activeLowOrHigh); - -/*! - * @brief Combine the write data for 1 byte to 4 bytes. - * This is not a public API. - */ -static uint32_t LPSPI_CombineWriteData(uint8_t *txData, uint8_t bytesEachWrite, bool isByteSwap); - -/*! - * @brief Separate the read data for 1 byte to 4 bytes. - * This is not a public API. - */ -static void LPSPI_SeparateReadData(uint8_t *rxData, uint32_t readData, uint8_t bytesEachRead, bool isByteSwap); - -/*! - * @brief Wait for tx FIFO to be empty. - * This is not a public API. - * @param base LPSPI peripheral address. - * @return true for the tx FIFO is ready, false is not. - */ -static bool LPSPI_TxFifoReady(LPSPI_Type *base); - -/*! - * @brief Master fill up the TX FIFO with data. - * This is not a public API. - */ -static void LPSPI_MasterTransferFillUpTxFifo(LPSPI_Type *base, lpspi_master_handle_t *handle); - -/*! - * @brief Master finish up a transfer. - * It would call back if there is callback function and set the state to idle. - * This is not a public API. - */ -static void LPSPI_MasterTransferComplete(LPSPI_Type *base, lpspi_master_handle_t *handle); - -/*! - * @brief Slave fill up the TX FIFO with data. - * This is not a public API. - */ -static void LPSPI_SlaveTransferFillUpTxFifo(LPSPI_Type *base, lpspi_slave_handle_t *handle); - -/*! - * @brief Slave finish up a transfer. - * It would call back if there is callback function and set the state to idle. - * This is not a public API. - */ -static void LPSPI_SlaveTransferComplete(LPSPI_Type *base, lpspi_slave_handle_t *handle); - -/*! - * @brief LPSPI common interrupt handler. - * - * @param handle pointer to s_lpspiHandle which stores the transfer state. - */ -static void LPSPI_CommonIRQHandler(LPSPI_Type *base, void *param); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* Defines constant value arrays for the baud rate pre-scalar and scalar divider values.*/ -static const uint8_t s_baudratePrescaler[] = {1, 2, 4, 8, 16, 32, 64, 128}; - -/*! @brief Pointers to lpspi bases for each instance. */ -static LPSPI_Type *const s_lpspiBases[] = LPSPI_BASE_PTRS; - -/*! @brief Pointers to lpspi IRQ number for each instance. */ -static const IRQn_Type s_lpspiIRQ[] = LPSPI_IRQS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to lpspi clocks for each instance. */ -static const clock_ip_name_t s_lpspiClocks[] = LPSPI_CLOCKS; - -#if defined(LPSPI_PERIPH_CLOCKS) -static const clock_ip_name_t s_LpspiPeriphClocks[] = LPSPI_PERIPH_CLOCKS; -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Pointers to lpspi handles for each instance. */ -static void *s_lpspiHandle[ARRAY_SIZE(s_lpspiBases)]; - -/*! @brief Pointer to master IRQ handler for each instance. */ -static lpspi_master_isr_t s_lpspiMasterIsr; -/*! @brief Pointer to slave IRQ handler for each instance. */ -static lpspi_slave_isr_t s_lpspiSlaveIsr; -/* @brief Dummy data for each instance. This data is used when user's tx buffer is NULL*/ -volatile uint8_t g_lpspiDummyData[ARRAY_SIZE(s_lpspiBases)] = {0}; - -/********************************************************************************************************************** - * Code - *********************************************************************************************************************/ - -/*! - * brief Get the LPSPI instance from peripheral base address. - * - * param base LPSPI peripheral base address. - * return LPSPI instance. - */ -uint32_t LPSPI_GetInstance(LPSPI_Type *base) -{ - uint8_t instance = 0; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_lpspiBases); instance++) - { - if (s_lpspiBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_lpspiBases)); - - return instance; -} - -/*! - * brief Set up the dummy data. - * - * param base LPSPI peripheral address. - * param dummyData Data to be transferred when tx buffer is NULL. - * Note: - * This API has no effect when LPSPI in slave interrupt mode, because driver - * will set the TXMSK bit to 1 if txData is NULL, no data is loaded from transmit - * FIFO and output pin is tristated. - */ -void LPSPI_SetDummyData(LPSPI_Type *base, uint8_t dummyData) -{ - uint32_t instance = LPSPI_GetInstance(base); - g_lpspiDummyData[instance] = dummyData; -} - -/*! - * brief Initializes the LPSPI master. - * - * param base LPSPI peripheral address. - * param masterConfig Pointer to structure lpspi_master_config_t. - * param srcClock_Hz Module source input clock in Hertz - */ -void LPSPI_MasterInit(LPSPI_Type *base, const lpspi_master_config_t *masterConfig, uint32_t srcClock_Hz) -{ - assert(masterConfig != NULL); - - uint32_t tcrPrescaleValue = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPSPI_GetInstance(base); - /* Enable LPSPI clock */ - (void)CLOCK_EnableClock(s_lpspiClocks[instance]); - -#if defined(LPSPI_PERIPH_CLOCKS) - (void)CLOCK_EnableClock(s_LpspiPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Set LPSPI to master */ - LPSPI_SetMasterSlaveMode(base, kLPSPI_Master); - - /* Set specific PCS to active high or low */ - LPSPI_SetOnePcsPolarity(base, masterConfig->whichPcs, masterConfig->pcsActiveHighOrLow); - - /* Set Configuration Register 1 related setting.*/ - base->CFGR1 = (base->CFGR1 & ~(LPSPI_CFGR1_OUTCFG_MASK | LPSPI_CFGR1_PINCFG_MASK | LPSPI_CFGR1_NOSTALL_MASK)) | - LPSPI_CFGR1_OUTCFG(masterConfig->dataOutConfig) | LPSPI_CFGR1_PINCFG(masterConfig->pinCfg) | - LPSPI_CFGR1_NOSTALL(0); - - /* Set baudrate and delay times*/ - (void)LPSPI_MasterSetBaudRate(base, masterConfig->baudRate, srcClock_Hz, &tcrPrescaleValue); - - /* Set default watermarks */ - LPSPI_SetFifoWatermarks(base, (uint32_t)kLpspiDefaultTxWatermark, (uint32_t)kLpspiDefaultRxWatermark); - - /* Set Transmit Command Register*/ - base->TCR = LPSPI_TCR_CPOL(masterConfig->cpol) | LPSPI_TCR_CPHA(masterConfig->cpha) | - LPSPI_TCR_LSBF(masterConfig->direction) | LPSPI_TCR_FRAMESZ(masterConfig->bitsPerFrame - 1U) | - LPSPI_TCR_PRESCALE(tcrPrescaleValue) | LPSPI_TCR_PCS(masterConfig->whichPcs); - - LPSPI_Enable(base, true); - - (void)LPSPI_MasterSetDelayTimes(base, masterConfig->pcsToSckDelayInNanoSec, kLPSPI_PcsToSck, srcClock_Hz); - (void)LPSPI_MasterSetDelayTimes(base, masterConfig->lastSckToPcsDelayInNanoSec, kLPSPI_LastSckToPcs, srcClock_Hz); - (void)LPSPI_MasterSetDelayTimes(base, masterConfig->betweenTransferDelayInNanoSec, kLPSPI_BetweenTransfer, - srcClock_Hz); - - LPSPI_SetDummyData(base, LPSPI_DUMMY_DATA); -} - -/*! - * brief Sets the lpspi_master_config_t structure to default values. - * - * This API initializes the configuration structure for LPSPI_MasterInit(). - * The initialized structure can remain unchanged in LPSPI_MasterInit(), or can be modified - * before calling the LPSPI_MasterInit(). - * Example: - * code - * lpspi_master_config_t masterConfig; - * LPSPI_MasterGetDefaultConfig(&masterConfig); - * endcode - * param masterConfig pointer to lpspi_master_config_t structure - */ -void LPSPI_MasterGetDefaultConfig(lpspi_master_config_t *masterConfig) -{ - assert(masterConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(masterConfig, 0, sizeof(*masterConfig)); - - masterConfig->baudRate = 500000; - masterConfig->bitsPerFrame = 8; - masterConfig->cpol = kLPSPI_ClockPolarityActiveHigh; - masterConfig->cpha = kLPSPI_ClockPhaseFirstEdge; - masterConfig->direction = kLPSPI_MsbFirst; - - masterConfig->pcsToSckDelayInNanoSec = 1000000000U / masterConfig->baudRate * 2U; - masterConfig->lastSckToPcsDelayInNanoSec = 1000000000U / masterConfig->baudRate * 2U; - masterConfig->betweenTransferDelayInNanoSec = 1000000000U / masterConfig->baudRate * 2U; - - masterConfig->whichPcs = kLPSPI_Pcs0; - masterConfig->pcsActiveHighOrLow = kLPSPI_PcsActiveLow; - - masterConfig->pinCfg = kLPSPI_SdiInSdoOut; - masterConfig->dataOutConfig = kLpspiDataOutRetained; -} - -/*! - * brief LPSPI slave configuration. - * - * param base LPSPI peripheral address. - * param slaveConfig Pointer to a structure lpspi_slave_config_t. - */ -void LPSPI_SlaveInit(LPSPI_Type *base, const lpspi_slave_config_t *slaveConfig) -{ - assert(slaveConfig != NULL); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPSPI_GetInstance(base); - /* Enable LPSPI clock */ - (void)CLOCK_EnableClock(s_lpspiClocks[instance]); - -#if defined(LPSPI_PERIPH_CLOCKS) - (void)CLOCK_EnableClock(s_LpspiPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - LPSPI_SetMasterSlaveMode(base, kLPSPI_Slave); - - LPSPI_SetOnePcsPolarity(base, slaveConfig->whichPcs, slaveConfig->pcsActiveHighOrLow); - - base->CFGR1 = (base->CFGR1 & ~(LPSPI_CFGR1_OUTCFG_MASK | LPSPI_CFGR1_PINCFG_MASK)) | - LPSPI_CFGR1_OUTCFG(slaveConfig->dataOutConfig) | LPSPI_CFGR1_PINCFG(slaveConfig->pinCfg); - - LPSPI_SetFifoWatermarks(base, (uint32_t)kLpspiDefaultTxWatermark, (uint32_t)kLpspiDefaultRxWatermark); - - base->TCR = LPSPI_TCR_CPOL(slaveConfig->cpol) | LPSPI_TCR_CPHA(slaveConfig->cpha) | - LPSPI_TCR_LSBF(slaveConfig->direction) | LPSPI_TCR_FRAMESZ(slaveConfig->bitsPerFrame - 1U); - - /* This operation will set the dummy data for edma transfer, no effect in interrupt way. */ - LPSPI_SetDummyData(base, LPSPI_DUMMY_DATA); - - LPSPI_Enable(base, true); -} - -/*! - * brief Sets the lpspi_slave_config_t structure to default values. - * - * This API initializes the configuration structure for LPSPI_SlaveInit(). - * The initialized structure can remain unchanged in LPSPI_SlaveInit() or can be modified - * before calling the LPSPI_SlaveInit(). - * Example: - * code - * lpspi_slave_config_t slaveConfig; - * LPSPI_SlaveGetDefaultConfig(&slaveConfig); - * endcode - * param slaveConfig pointer to lpspi_slave_config_t structure. - */ -void LPSPI_SlaveGetDefaultConfig(lpspi_slave_config_t *slaveConfig) -{ - assert(slaveConfig != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); - - slaveConfig->bitsPerFrame = 8; /*!< Bits per frame, minimum 8, maximum 4096.*/ - slaveConfig->cpol = kLPSPI_ClockPolarityActiveHigh; /*!< Clock polarity. */ - slaveConfig->cpha = kLPSPI_ClockPhaseFirstEdge; /*!< Clock phase. */ - slaveConfig->direction = kLPSPI_MsbFirst; /*!< MSB or LSB data shift direction. */ - - slaveConfig->whichPcs = kLPSPI_Pcs0; /*!< Desired Peripheral Chip Select (pcs) */ - slaveConfig->pcsActiveHighOrLow = kLPSPI_PcsActiveLow; /*!< Desired PCS active high or low */ - - slaveConfig->pinCfg = kLPSPI_SdiInSdoOut; - slaveConfig->dataOutConfig = kLpspiDataOutRetained; -} - -/*! - * brief Restores the LPSPI peripheral to reset state. Note that this function - * sets all registers to reset state. As a result, the LPSPI module can't work after calling - * this API. - * param base LPSPI peripheral address. - */ -void LPSPI_Reset(LPSPI_Type *base) -{ - /* Reset all internal logic and registers, except the Control Register. Remains set until cleared by software.*/ - base->CR |= LPSPI_CR_RST_MASK; - - /* Software reset doesn't reset the CR, so manual reset the FIFOs */ - base->CR |= LPSPI_CR_RRF_MASK | LPSPI_CR_RTF_MASK; - - /* Master logic is not reset and module is disabled.*/ - base->CR = 0x00U; -} - -/*! - * brief De-initializes the LPSPI peripheral. Call this API to disable the LPSPI clock. - * param base LPSPI peripheral address. - */ -void LPSPI_Deinit(LPSPI_Type *base) -{ - /* Reset to default value */ - LPSPI_Reset(base); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPSPI_GetInstance(base); - /* Enable LPSPI clock */ - (void)CLOCK_DisableClock(s_lpspiClocks[instance]); - -#if defined(LPSPI_PERIPH_CLOCKS) - (void)CLOCK_DisableClock(s_LpspiPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -static void LPSPI_SetOnePcsPolarity(LPSPI_Type *base, - lpspi_which_pcs_t pcs, - lpspi_pcs_polarity_config_t activeLowOrHigh) -{ - uint32_t cfgr1Value = 0; - /* Clear the PCS polarity bit */ - cfgr1Value = base->CFGR1 & ~(1UL << (LPSPI_CFGR1_PCSPOL_SHIFT + (uint32_t)pcs)); - - /* Configure the PCS polarity bit according to the activeLowOrHigh setting */ - base->CFGR1 = cfgr1Value | ((uint32_t)activeLowOrHigh << (LPSPI_CFGR1_PCSPOL_SHIFT + (uint32_t)pcs)); -} - -/*! - * brief Sets the LPSPI baud rate in bits per second. - * - * This function takes in the desired bitsPerSec (baud rate) and calculates the nearest - * possible baud rate without exceeding the desired baud rate and returns the - * calculated baud rate in bits-per-second. It requires the caller to provide - * the frequency of the module source clock (in Hertz). Note that the baud rate - * does not go into effect until the Transmit Control Register (TCR) is programmed - * with the prescale value. Hence, this function returns the prescale tcrPrescaleValue - * parameter for later programming in the TCR. The higher level - * peripheral driver should alert the user of an out of range baud rate input. - * - * Note that the LPSPI module must first be disabled before configuring this. - * Note that the LPSPI module must be configured for master mode before configuring this. - * - * param base LPSPI peripheral address. - * param baudRate_Bps The desired baud rate in bits per second. - * param srcClock_Hz Module source input clock in Hertz. - * param tcrPrescaleValue The TCR prescale value needed to program the TCR. - * return The actual calculated baud rate. This function may also return a "0" if the - * LPSPI is not configured for master mode or if the LPSPI module is not disabled. - */ - -uint32_t LPSPI_MasterSetBaudRate(LPSPI_Type *base, - uint32_t baudRate_Bps, - uint32_t srcClock_Hz, - uint32_t *tcrPrescaleValue) -{ - assert(tcrPrescaleValue != NULL); - - /* For master mode configuration only, if slave mode detected, return 0. - * Also, the LPSPI module needs to be disabled first, if enabled, return 0 - */ - if ((!LPSPI_IsMaster(base)) || ((base->CR & LPSPI_CR_MEN_MASK) != 0U)) - { - return 0U; - } - - uint32_t prescaler, bestPrescaler; - uint32_t scaler, bestScaler; - uint32_t realBaudrate, bestBaudrate; - uint32_t diff, min_diff; - uint32_t desiredBaudrate = baudRate_Bps; - - /* find combination of prescaler and scaler resulting in baudrate closest to the - * requested value - */ - min_diff = 0xFFFFFFFFU; - - /* Set to maximum divisor value bit settings so that if baud rate passed in is less - * than the minimum possible baud rate, then the SPI will be configured to the lowest - * possible baud rate - */ - bestPrescaler = 7; - bestScaler = 255; - - bestBaudrate = 0; /* required to avoid compilation warning */ - - /* In all for loops, if min_diff = 0, the exit for loop*/ - for (prescaler = 0U; prescaler < 8U; prescaler++) - { - if (min_diff == 0U) - { - break; - } - for (scaler = 0U; scaler < 256U; scaler++) - { - if (min_diff == 0U) - { - break; - } - realBaudrate = (srcClock_Hz / (s_baudratePrescaler[prescaler] * (scaler + 2U))); - - /* calculate the baud rate difference based on the conditional statement - * that states that the calculated baud rate must not exceed the desired baud rate - */ - if (desiredBaudrate >= realBaudrate) - { - diff = desiredBaudrate - realBaudrate; - if (min_diff > diff) - { - /* a better match found */ - min_diff = diff; - bestPrescaler = prescaler; - bestScaler = scaler; - bestBaudrate = realBaudrate; - } - } - } - } - - /* Write the best baud rate scalar to the CCR. - * Note, no need to check for error since we've already checked to make sure the module is - * disabled and in master mode. Also, there is a limit on the maximum divider so we will not - * exceed this. - */ - base->CCR = (base->CCR & ~LPSPI_CCR_SCKDIV_MASK) | LPSPI_CCR_SCKDIV(bestScaler); - - /* return the best prescaler value for user to use later */ - *tcrPrescaleValue = bestPrescaler; - - /* return the actual calculated baud rate */ - return bestBaudrate; -} - -/*! - * brief Manually configures a specific LPSPI delay parameter (module must be disabled to - * change the delay values). - * - * This function configures the following: - * SCK to PCS delay, or - * PCS to SCK delay, or - * The configurations must occur between the transfer delay. - * - * The delay names are available in type lpspi_delay_type_t. - * - * The user passes the desired delay along with the delay value. - * This allows the user to directly set the delay values if they have - * pre-calculated them or if they simply wish to manually increment the value. - * - * Note that the LPSPI module must first be disabled before configuring this. - * Note that the LPSPI module must be configured for master mode before configuring this. - * - * param base LPSPI peripheral address. - * param scaler The 8-bit delay value 0x00 to 0xFF (255). - * param whichDelay The desired delay to configure, must be of type lpspi_delay_type_t. - */ -void LPSPI_MasterSetDelayScaler(LPSPI_Type *base, uint32_t scaler, lpspi_delay_type_t whichDelay) -{ - /*These settings are only relevant in master mode */ - switch (whichDelay) - { - case kLPSPI_PcsToSck: - base->CCR = (base->CCR & (~LPSPI_CCR_PCSSCK_MASK)) | LPSPI_CCR_PCSSCK(scaler); - - break; - case kLPSPI_LastSckToPcs: - base->CCR = (base->CCR & (~LPSPI_CCR_SCKPCS_MASK)) | LPSPI_CCR_SCKPCS(scaler); - - break; - case kLPSPI_BetweenTransfer: - base->CCR = (base->CCR & (~LPSPI_CCR_DBT_MASK)) | LPSPI_CCR_DBT(scaler); - - break; - default: - assert(false); - break; - } -} - -/*! - * brief Calculates the delay based on the desired delay input in nanoseconds (module must be - * disabled to change the delay values). - * - * This function calculates the values for the following: - * SCK to PCS delay, or - * PCS to SCK delay, or - * The configurations must occur between the transfer delay. - * - * The delay names are available in type lpspi_delay_type_t. - * - * The user passes the desired delay and the desired delay value in - * nano-seconds. The function calculates the value needed for the desired delay parameter - * and returns the actual calculated delay because an exact delay match may not be possible. In this - * case, the closest match is calculated without going below the desired delay value input. - * It is possible to input a very large delay value that exceeds the capability of the part, in - * which case the maximum supported delay is returned. It is up to the higher level - * peripheral driver to alert the user of an out of range delay input. - * - * Note that the LPSPI module must be configured for master mode before configuring this. And note that - * the delayTime = LPSPI_clockSource / (PRESCALE * Delay_scaler). - * - * param base LPSPI peripheral address. - * param delayTimeInNanoSec The desired delay value in nano-seconds. - * param whichDelay The desired delay to configuration, which must be of type lpspi_delay_type_t. - * param srcClock_Hz Module source input clock in Hertz. - * return actual Calculated delay value in nano-seconds. - */ -uint32_t LPSPI_MasterSetDelayTimes(LPSPI_Type *base, - uint32_t delayTimeInNanoSec, - lpspi_delay_type_t whichDelay, - uint32_t srcClock_Hz) -{ - uint64_t realDelay, bestDelay; - uint32_t scaler, bestScaler; - uint32_t diff, min_diff; - uint64_t initialDelayNanoSec; - uint32_t clockDividedPrescaler; - - /* For delay between transfer, an additional scaler value is needed */ - uint32_t additionalScaler = 0; - - /*As the RM note, the LPSPI baud rate clock is itself divided by the PRESCALE setting, which can vary between - * transfers.*/ - clockDividedPrescaler = - srcClock_Hz / s_baudratePrescaler[(base->TCR & LPSPI_TCR_PRESCALE_MASK) >> LPSPI_TCR_PRESCALE_SHIFT]; - - /* Find combination of prescaler and scaler resulting in the delay closest to the requested value.*/ - min_diff = 0xFFFFFFFFU; - - /* Initialize scaler to max value to generate the max delay */ - bestScaler = 0xFFU; - - /* Calculate the initial (min) delay and maximum possible delay based on the specific delay as - * the delay divisors are slightly different based on which delay we are configuring. - */ - if (whichDelay == kLPSPI_BetweenTransfer) - { - /* First calculate the initial, default delay, note min delay is 2 clock cycles. Due to large size of - calculated values (uint64_t), we need to break up the calculation into several steps to ensure - accurate calculated results - */ - initialDelayNanoSec = 1000000000U; - initialDelayNanoSec *= 2U; - initialDelayNanoSec /= clockDividedPrescaler; - - /* Calculate the maximum delay */ - bestDelay = 1000000000U; - bestDelay *= 257U; /* based on DBT+2, or 255 + 2 */ - bestDelay /= clockDividedPrescaler; - - additionalScaler = 1U; - } - else - { - /* First calculate the initial, default delay, min delay is 1 clock cycle. Due to large size of calculated - values (uint64_t), we need to break up the calculation into several steps to ensure accurate calculated - results. - */ - initialDelayNanoSec = 1000000000U; - initialDelayNanoSec /= clockDividedPrescaler; - - /* Calculate the maximum delay */ - bestDelay = 1000000000U; - bestDelay *= 256U; /* based on SCKPCS+1 or PCSSCK+1, or 255 + 1 */ - bestDelay /= clockDividedPrescaler; - - additionalScaler = 0U; - } - - /* If the initial, default delay is already greater than the desired delay, then - * set the delay to their initial value (0) and return the delay. In other words, - * there is no way to decrease the delay value further. - */ - if (initialDelayNanoSec >= delayTimeInNanoSec) - { - LPSPI_MasterSetDelayScaler(base, 0, whichDelay); - return (uint32_t)initialDelayNanoSec; - } - - /* If min_diff = 0, the exit for loop */ - for (scaler = 0U; scaler < 256U; scaler++) - { - if (min_diff == 0U) - { - break; - } - /* Calculate the real delay value as we cycle through the scaler values. - Due to large size of calculated values (uint64_t), we need to break up the - calculation into several steps to ensure accurate calculated results - */ - realDelay = 1000000000U; - realDelay *= ((uint64_t)scaler + 1UL + (uint64_t)additionalScaler); - realDelay /= clockDividedPrescaler; - - /* calculate the delay difference based on the conditional statement - * that states that the calculated delay must not be less then the desired delay - */ - if (realDelay >= delayTimeInNanoSec) - { - diff = (uint32_t)(realDelay - (uint64_t)delayTimeInNanoSec); - if (min_diff > diff) - { - /* a better match found */ - min_diff = diff; - bestScaler = scaler; - bestDelay = realDelay; - } - } - } - - /* write the best scaler value for the delay */ - LPSPI_MasterSetDelayScaler(base, bestScaler, whichDelay); - - /* return the actual calculated delay value (in ns) */ - return (uint32_t)bestDelay; -} - -/*Transactional APIs -- Master*/ - -/*! - * brief Initializes the LPSPI master handle. - * - * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - - * param base LPSPI peripheral address. - * param handle LPSPI handle pointer to lpspi_master_handle_t. - * param callback DSPI callback. - * param userData callback function parameter. - */ -void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base, - lpspi_master_handle_t *handle, - lpspi_master_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - s_lpspiHandle[LPSPI_GetInstance(base)] = handle; - - /* Set irq handler. */ - s_lpspiMasterIsr = LPSPI_MasterTransferHandleIRQ; - - handle->callback = callback; - handle->userData = userData; -} - -/*! - * brief Check the argument for transfer . - * - * param base LPSPI peripheral address. - * param transfer the transfer struct to be used. - * param isEdma True to check for EDMA transfer, false to check interrupt non-blocking transfer - * return Return true for right and false for wrong. - */ -bool LPSPI_CheckTransferArgument(LPSPI_Type *base, lpspi_transfer_t *transfer, bool isEdma) -{ - assert(transfer != NULL); - uint32_t bitsPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) + 1U; - uint32_t bytesPerFrame = (bitsPerFrame + 7U) / 8U; - uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); - /* If the transfer count is zero, then return immediately.*/ - if (transfer->dataSize == 0U) - { - return false; - } - - /* If both send buffer and receive buffer is null */ - if ((NULL == (transfer->txData)) && (NULL == (transfer->rxData))) - { - return false; - } - - /*The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4 . - *For bytesPerFrame greater than 4 situation: - *the transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4 , - *otherwise , the transfer data size can be integer multiples of bytesPerFrame. - */ - if (bytesPerFrame <= 4U) - { - if ((transfer->dataSize % bytesPerFrame) != 0U) - { - return false; - } - } - else - { - if ((bytesPerFrame % 4U) != 0U) - { - if (transfer->dataSize != bytesPerFrame) - { - return false; - } - } - else - { - if ((transfer->dataSize % bytesPerFrame) != 0U) - { - return false; - } - } - } - - /* Check if using 3-wire mode and the txData is NULL, set the output pin to tristated. */ - if ((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) - { - /* The 3-wire mode can't send and receive data at the same time. */ - if ((transfer->txData != NULL) && (transfer->rxData != NULL)) - { - return false; - } - if (NULL == transfer->txData) - { - base->CFGR1 |= LPSPI_CFGR1_OUTCFG_MASK; - } - } - - if (isEdma && ((bytesPerFrame % 4U) == 3U)) - { - return false; - } - - return true; -} - -/*! - * brief LPSPI master transfer data using a polling method. - * - * This function transfers data using a polling method. This is a blocking function, which does not return until all - * transfers have been completed. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * param base LPSPI peripheral address. - * param transfer pointer to lpspi_transfer_t structure. - * return status of status_t. - */ -status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base, lpspi_transfer_t *transfer) -{ - assert(transfer != NULL); - - /* Check that LPSPI is not busy.*/ - if ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_ModuleBusyFlag) != 0U) - { - return kStatus_LPSPI_Busy; - } - LPSPI_Enable(base, false); - /* Check arguements */ - if (!LPSPI_CheckTransferArgument(base, transfer, false)) - { - return kStatus_InvalidArgument; - } - - LPSPI_FlushFifo(base, true, true); - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); - - /* Variables */ - bool isTxMask = false; - bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); - uint8_t bytesEachWrite; - uint8_t bytesEachRead; - uint8_t *txData = transfer->txData; - uint8_t *rxData = transfer->rxData; - uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; - uint32_t readData = 0U; - uint32_t txRemainingByteCount = transfer->dataSize; - uint32_t rxRemainingByteCount = transfer->dataSize; - uint32_t wordToSend = - ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); - /*The TX and RX FIFO sizes are always the same*/ - uint32_t fifoSize = LPSPI_GetRxFifoSize(base); - uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; - /* No need to configure PCS continous if the transfer byte count is smaller than frame size */ - bool isPcsContinuous = (((transfer->configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U) && - (bytesPerFrame < transfer->dataSize)); - uint32_t rxFifoMaxBytes = MIN(bytesPerFrame, 4U) * fifoSize; - uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; - uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); - -#if SPI_RETRY_TIMES - uint32_t waitTimes; -#endif - - /* Mask tx data in half duplex mode */ - if (((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) && - (txData == NULL)) - { - isTxMask = true; - } - - base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); - LPSPI_Enable(base, true); - - /* Configure transfer control register. */ - base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | - LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | - LPSPI_TCR_PCS(whichPcs); - - /*TCR is also shared the FIFO, so wait for TCR written.*/ - if (!LPSPI_TxFifoReady(base)) - { - return kStatus_LPSPI_Timeout; - } - - /* PCS should be configured separately from the other bits, otherwise it will not take effect. */ - base->TCR |= LPSPI_TCR_CONT(isPcsContinuous) | LPSPI_TCR_CONTC(isPcsContinuous) | LPSPI_TCR_RXMSK(NULL == rxData); - - /*TCR is also shared the FIFO, so wait for TCR written.*/ - if (!LPSPI_TxFifoReady(base)) - { - return kStatus_LPSPI_Timeout; - } - - if (bytesPerFrame <= 4U) - { - bytesEachWrite = (uint8_t)bytesPerFrame; - bytesEachRead = (uint8_t)bytesPerFrame; - } - else - { - bytesEachWrite = 4U; - bytesEachRead = 4U; - } - - /*Write the TX data until txRemainingByteCount is equal to 0 */ - while (txRemainingByteCount > 0U) - { - if (txRemainingByteCount < bytesEachWrite) - { - bytesEachWrite = (uint8_t)txRemainingByteCount; - } - - /*Wait until TX FIFO is not full*/ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((LPSPI_GetTxFifoCount(base) == fifoSize) && (--waitTimes != 0U)) -#else - while (LPSPI_GetTxFifoCount(base) == fifoSize) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_LPSPI_Timeout; - } -#endif - - /* To prevent rxfifo overflow, ensure transmitting and receiving are executed in parallel */ - if (((NULL == rxData) || (rxRemainingByteCount - txRemainingByteCount) < rxFifoMaxBytes)) - { - if (isTxMask) - { - /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared - by hardware every time when TCR[FRAMESZ] bit of data is transfered. - In this case TCR[TXMSK] should be set to initiate each transfer. */ - base->TCR |= LPSPI_TCR_TXMSK_MASK; - if (isPcsContinuous && (txRemainingByteCount == bytesPerFrame)) - { - /* For the last piece of frame size of data, if is PCS continous mode(TCR[CONT]), TCR[CONTC] should - * be cleared to de-assert the PCS. Be sure to clear the TXMSK as well otherwise another FRAMESZ - * of data will be received. */ - base->TCR &= ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK | LPSPI_TCR_TXMSK_MASK); - } - txRemainingByteCount -= bytesPerFrame; - } - else - { - if (txData != NULL) - { - wordToSend = LPSPI_CombineWriteData(txData, bytesEachWrite, isByteSwap); - txData += bytesEachWrite; - } - /* Otherwise push data to tx FIFO to initiate transfer */ - LPSPI_WriteData(base, wordToSend); - txRemainingByteCount -= bytesEachWrite; - } - } - - /* Check whether there is RX data in RX FIFO . Read out the RX data so that the RX FIFO would not overrun. */ - if ((rxData != NULL) && (rxRemainingByteCount != 0U)) - { - /* To ensure parallel execution in 3-wire mode, after writting 1 to TXMSK to generate clock of - bytesPerFrame's data wait until bytesPerFrame's data is received. */ - while (isTxMask && (LPSPI_GetRxFifoCount(base) == 0U)) - { - } -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((LPSPI_GetRxFifoCount(base) != 0U) && (--waitTimes != 0U)) -#else - while (LPSPI_GetRxFifoCount(base) != 0U) -#endif - { - readData = LPSPI_ReadData(base); - if (rxRemainingByteCount < bytesEachRead) - { - bytesEachRead = (uint8_t)rxRemainingByteCount; - } - - LPSPI_SeparateReadData(rxData, readData, bytesEachRead, isByteSwap); - rxData += bytesEachRead; - - rxRemainingByteCount -= bytesEachRead; - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_LPSPI_Timeout; - } -#endif - } - } - - if (isPcsContinuous && !isTxMask) - { - /* In PCS continous mode(TCR[CONT]), after write all the data in TX FIFO, TCR[CONTC] and TCR[CONT] should be - cleared to de-assert the PCS. Note that TCR register also use the TX FIFO. Also CONTC should be cleared when - tx is not masked, otherwise written to TCR register with TXMSK bit wet will initiate a new transfer. */ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((LPSPI_GetTxFifoCount(base) == fifoSize) && (--waitTimes != 0U)) -#else - while (LPSPI_GetTxFifoCount(base) == fifoSize) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_LPSPI_Timeout; - } -#endif - base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK)); - } - - /*Read out the RX data in FIFO*/ - if (rxData != NULL) - { - while (rxRemainingByteCount > 0U) - { -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while ((LPSPI_GetRxFifoCount(base) != 0U) && (--waitTimes != 0U)) -#else - while (LPSPI_GetRxFifoCount(base) != 0U) -#endif - { - readData = LPSPI_ReadData(base); - - if (rxRemainingByteCount < bytesEachRead) - { - bytesEachRead = (uint8_t)rxRemainingByteCount; - } - - LPSPI_SeparateReadData(rxData, readData, bytesEachRead, isByteSwap); - rxData += bytesEachRead; - - rxRemainingByteCount -= bytesEachRead; - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_LPSPI_Timeout; - } -#endif - } - } - else - { - /* If no RX buffer, then transfer is not complete until transfer complete flag sets */ -#if SPI_RETRY_TIMES - waitTimes = SPI_RETRY_TIMES; - while (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) == 0U) && (--waitTimes != 0U)) -#else - while ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) == 0U) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return kStatus_LPSPI_Timeout; - } -#endif - } - - return kStatus_Success; -} - -/*! - * brief LPSPI master transfer data using an interrupt method. - * - * This function transfers data using an interrupt method. This is a non-blocking function, which returns right away. - * When all data is transferred, the callback function is called. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - * param transfer pointer to lpspi_transfer_t structure. - * return status of status_t. - */ -status_t LPSPI_MasterTransferNonBlocking(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - - /* Check that we're not busy.*/ - if (handle->state == (uint8_t)kLPSPI_Busy) - { - return kStatus_LPSPI_Busy; - } - - LPSPI_Enable(base, false); - /* Check arguements */ - if (!LPSPI_CheckTransferArgument(base, transfer, false)) - { - return kStatus_InvalidArgument; - } - - /* Flush FIFO, clear status, disable all the interrupts. */ - LPSPI_FlushFifo(base, true, true); - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - - /* Variables */ - bool isRxMask = false; - uint8_t txWatermark; - uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; - uint32_t tmpTimes; - uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; - uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); - - /* Assign the original value for members of transfer handle. */ - handle->state = (uint8_t)kLPSPI_Busy; - handle->txData = transfer->txData; - handle->rxData = transfer->rxData; - handle->txRemainingByteCount = transfer->dataSize; - handle->rxRemainingByteCount = transfer->dataSize; - handle->totalByteCount = transfer->dataSize; - handle->writeTcrInIsr = false; - handle->bytesPerFrame = (uint16_t)((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; - /* No need to configure PCS continous if the transfer byte count is smaller than frame size */ - bool isPcsContinuous = (((transfer->configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U) && - (transfer->dataSize > handle->bytesPerFrame)); - handle->writeRegRemainingTimes = - (transfer->dataSize / (uint32_t)handle->bytesPerFrame) * (((uint32_t)handle->bytesPerFrame + 3U) / 4U); - handle->readRegRemainingTimes = handle->writeRegRemainingTimes; - handle->txBuffIfNull = - ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); - /*The TX and RX FIFO sizes are always the same*/ - handle->fifoSize = LPSPI_GetRxFifoSize(base); - handle->isPcsContinuous = isPcsContinuous; - handle->isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); - /*Calculate the bytes for write/read the TX/RX register each time*/ - if (handle->bytesPerFrame <= 4U) - { - handle->bytesEachWrite = (uint8_t)handle->bytesPerFrame; - handle->bytesEachRead = (uint8_t)handle->bytesPerFrame; - } - else - { - handle->bytesEachWrite = 4U; - handle->bytesEachRead = 4U; - } - - /*Set the RX and TX watermarks to reduce the ISR times.*/ - if (handle->fifoSize > 1U) - { - txWatermark = 1U; - handle->rxWatermark = handle->fifoSize - 2U; - } - else - { - txWatermark = 0U; - handle->rxWatermark = 0U; - } - LPSPI_SetFifoWatermarks(base, txWatermark, handle->rxWatermark); - - /* If there is no rxData, mask the receive data so that receive data is not stored in receive FIFO. */ - if (handle->rxData == NULL) - { - isRxMask = true; - handle->rxRemainingByteCount = 0; - } - - /* Mask tx data in half duplex mode since the tx/rx share the same pin, so that the data received from slave is not - * interfered. */ - if (((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) && - (handle->txData == NULL)) - { - handle->isTxMask = true; - } - - /*Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ - base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); - - /* Enable module for following configuration of TCR to take effect. */ - LPSPI_Enable(base, true); - - /* Configure transfer control register. */ - base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | - LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | - LPSPI_TCR_PCS(whichPcs); - - /*TCR is also shared the FIFO , so wait for TCR written.*/ - if (!LPSPI_TxFifoReady(base)) - { - return kStatus_LPSPI_Timeout; - } - - /* PCS should be configured separately from the other bits, otherwise it will not take effect. */ - base->TCR |= LPSPI_TCR_CONT(isPcsContinuous) | LPSPI_TCR_CONTC(isPcsContinuous) | LPSPI_TCR_RXMSK(isRxMask); - - /* Enable the NVIC for LPSPI peripheral. Note that below code is useless if the LPSPI interrupt is in INTMUX , - * and you should also enable the INTMUX interupt in your application. - */ - (void)EnableIRQ(s_lpspiIRQ[LPSPI_GetInstance(base)]); - - /*TCR is also shared the FIFO , so wait for TCR written.*/ - if (!LPSPI_TxFifoReady(base)) - { - return kStatus_LPSPI_Timeout; - } - - if (handle->isTxMask) - { - /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared by - hardware every time when TCR[FRAMESZ] bit of data is transfered. In this case TCR[TXMSK] should be set to - initiate each transfer. */ - - base->TCR |= LPSPI_TCR_TXMSK_MASK; - handle->txRemainingByteCount -= (uint32_t)handle->bytesPerFrame; - } - else - { - /* Fill up the TX data in FIFO to initiate transfer */ - LPSPI_MasterTransferFillUpTxFifo(base, handle); - } - - /* Since SPI is a synchronous interface, we only need to enable the RX interrupt if there is RX data. - * The IRQ handler will get the status of RX and TX interrupt flags. - */ - if (handle->rxData != NULL) - { - if (handle->isTxMask) - { - /* if tx data is masked, transfer is initiated by writing 1 to TCR[TXMSK] and TCR[FRMESZ] bits of data is - read. If rx water mark is set larger than TCR[FRMESZ], rx interrupt will not be generated. Lower the rx - water mark setting */ - if ((handle->bytesPerFrame / 4U) < (uint16_t)handle->rxWatermark) - { - handle->rxWatermark = - (uint8_t)(handle->bytesPerFrame / 4U) > 0U ? (uint8_t)(handle->bytesPerFrame / 4U - 1U) : 0U; - base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(handle->rxWatermark); - } - } - else - { - /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise - *there is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. - */ - tmpTimes = handle->readRegRemainingTimes; - if (tmpTimes <= handle->rxWatermark) - { - base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(tmpTimes - 1U); - } - } - - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); - } - else - { - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable); - } - - return kStatus_Success; -} - -static void LPSPI_MasterTransferFillUpTxFifo(LPSPI_Type *base, lpspi_master_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t wordToSend = 0; - uint8_t fifoSize = handle->fifoSize; - uint32_t writeRegRemainingTimes = handle->writeRegRemainingTimes; - uint32_t readRegRemainingTimes = handle->readRegRemainingTimes; - size_t txRemainingByteCount = handle->txRemainingByteCount; - uint8_t bytesEachWrite = handle->bytesEachWrite; - bool isByteSwap = handle->isByteSwap; - - /* Make sure the difference in remaining TX and RX byte counts does not exceed FIFO depth - * and that the number of TX FIFO entries does not exceed the FIFO depth. - * But no need to make the protection if there is no rxData. - */ - while ((LPSPI_GetTxFifoCount(base) < fifoSize) && - (((readRegRemainingTimes - writeRegRemainingTimes) < (uint32_t)fifoSize) || (handle->rxData == NULL))) - { - if (txRemainingByteCount < (size_t)bytesEachWrite) - { - handle->bytesEachWrite = (uint8_t)txRemainingByteCount; - bytesEachWrite = handle->bytesEachWrite; - } - - if (handle->txData != NULL) - { - wordToSend = LPSPI_CombineWriteData(handle->txData, bytesEachWrite, isByteSwap); - handle->txData += bytesEachWrite; - } - else - { - wordToSend = handle->txBuffIfNull; - } - - /*Write the word to TX register*/ - LPSPI_WriteData(base, wordToSend); - - /*Decrease the write TX register times.*/ - --handle->writeRegRemainingTimes; - writeRegRemainingTimes = handle->writeRegRemainingTimes; - - /*Decrease the remaining TX byte count.*/ - handle->txRemainingByteCount -= (size_t)bytesEachWrite; - txRemainingByteCount = handle->txRemainingByteCount; - - if (handle->txRemainingByteCount == 0U) - { - /* If PCS is continuous, update TCR to de-assert PCS */ - if (handle->isPcsContinuous) - { - /* Only write to the TCR if the FIFO has room */ - if (LPSPI_GetTxFifoCount(base) < fifoSize) - { - base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK)); - handle->writeTcrInIsr = false; - } - /* Else, set a global flag to tell the ISR to do write to the TCR */ - else - { - handle->writeTcrInIsr = true; - } - } - break; - } - } -} - -static void LPSPI_MasterTransferComplete(LPSPI_Type *base, lpspi_master_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable interrupt requests*/ - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - - handle->state = (uint8_t)kLPSPI_Idle; - - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_Success, handle->userData); - } -} - -/*! - * brief Gets the master transfer remaining bytes. - * - * This function gets the master transfer remaining bytes. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the non-blocking transaction. - * return status of status_t. - */ -status_t LPSPI_MasterTransferGetCount(LPSPI_Type *base, lpspi_master_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (handle->state != (uint8_t)kLPSPI_Busy) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - size_t remainingByte; - - if (handle->rxData != NULL) - { - remainingByte = handle->rxRemainingByteCount; - } - else - { - remainingByte = handle->txRemainingByteCount; - } - - *count = handle->totalByteCount - remainingByte; - - return kStatus_Success; -} - -/*! - * brief LPSPI master abort transfer which uses an interrupt method. - * - * This function aborts a transfer which uses an interrupt method. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - */ -void LPSPI_MasterTransferAbort(LPSPI_Type *base, lpspi_master_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable interrupt requests*/ - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - - LPSPI_Reset(base); - - handle->state = (uint8_t)kLPSPI_Idle; - handle->txRemainingByteCount = 0; - handle->rxRemainingByteCount = 0; -} - -/*! - * brief LPSPI Master IRQ handler function. - * - * This function processes the LPSPI transmit and receive IRQ. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - */ -void LPSPI_MasterTransferHandleIRQ(LPSPI_Type *base, lpspi_master_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t readData; - uint8_t bytesEachRead = handle->bytesEachRead; - bool isByteSwap = handle->isByteSwap; - uint32_t readRegRemainingTimes = handle->readRegRemainingTimes; - - if (handle->rxData != NULL) - { - if (handle->rxRemainingByteCount != 0U) - { - /* First, disable the interrupts to avoid potentially triggering another interrupt - * while reading out the RX FIFO as more data may be coming into the RX FIFO. We'll - * re-enable the interrupts based on the LPSPI state after reading out the FIFO. - */ - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); - - while ((LPSPI_GetRxFifoCount(base) != 0U) && (handle->rxRemainingByteCount != 0U)) - { - /*Read out the data*/ - readData = LPSPI_ReadData(base); - - /*Decrease the read RX register times.*/ - --handle->readRegRemainingTimes; - readRegRemainingTimes = handle->readRegRemainingTimes; - - if (handle->rxRemainingByteCount < (size_t)bytesEachRead) - { - handle->bytesEachRead = (uint8_t)(handle->rxRemainingByteCount); - bytesEachRead = handle->bytesEachRead; - } - - LPSPI_SeparateReadData(handle->rxData, readData, bytesEachRead, isByteSwap); - handle->rxData += bytesEachRead; - - /*Decrease the remaining RX byte count.*/ - handle->rxRemainingByteCount -= (size_t)bytesEachRead; - } - - /* Re-enable the interrupts only if rxCount indicates there is more data to receive, - * else we may get a spurious interrupt. - * */ - if (handle->rxRemainingByteCount != 0U) - { - /* Set the TDF and RDF interrupt enables simultaneously to avoid race conditions */ - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); - } - } - - /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there - *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. - */ - if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) - { - base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | - LPSPI_FCR_RXWATER((readRegRemainingTimes > 1U) ? (readRegRemainingTimes - 1U) : (0U)); - } - } - - if (handle->txRemainingByteCount != 0U) - { - if (handle->isTxMask) - { - /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared by - hardware every time when TCR[FRAMESZ] bit of data is transfered. - In this case TCR[TXMSK] should be set to initiate each transfer. */ - base->TCR |= LPSPI_TCR_TXMSK_MASK; - if ((handle->txRemainingByteCount == (uint32_t)handle->bytesPerFrame) && (handle->isPcsContinuous)) - { - /* For the last piece of frame size of data, if is PCS continous mode(TCR[CONT]), TCR[CONTC] should - * be cleared to de-assert the PCS. Be sure to clear the TXMSK as well otherwise another FRAMESZ - * of data will be received. */ - base->TCR &= ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK | LPSPI_TCR_TXMSK_MASK); - } - handle->txRemainingByteCount -= (uint32_t)handle->bytesPerFrame; - } - else - { - LPSPI_MasterTransferFillUpTxFifo(base, handle); - } - } - else - { - if ((LPSPI_GetTxFifoCount(base) < (handle->fifoSize))) - { - if ((handle->isPcsContinuous) && (handle->writeTcrInIsr) && (!handle->isTxMask)) - { - base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK)); - handle->writeTcrInIsr = false; - } - } - } - - if ((handle->txRemainingByteCount == 0U) && (handle->rxRemainingByteCount == 0U) && (!handle->writeTcrInIsr)) - { - /* If no RX buffer, then transfer is not complete until transfer complete flag sets */ - if (handle->rxData == NULL) - { - if ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) != 0U) - { - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_TransferCompleteFlag); - /* Complete the transfer and disable the interrupts */ - LPSPI_MasterTransferComplete(base, handle); - } - else - { - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TransferCompleteInterruptEnable); - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); - } - } - else - { - /* Complete the transfer and disable the interrupts */ - LPSPI_MasterTransferComplete(base, handle); - } - } -} - -/*Transactional APIs -- Slave*/ -/*! - * brief Initializes the LPSPI slave handle. - * - * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - * - * param base LPSPI peripheral address. - * param handle LPSPI handle pointer to lpspi_slave_handle_t. - * param callback DSPI callback. - * param userData callback function parameter. - */ -void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base, - lpspi_slave_handle_t *handle, - lpspi_slave_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - s_lpspiHandle[LPSPI_GetInstance(base)] = handle; - - /* Set irq handler. */ - s_lpspiSlaveIsr = LPSPI_SlaveTransferHandleIRQ; - - handle->callback = callback; - handle->userData = userData; -} - -/*! - * brief LPSPI slave transfer data using an interrupt method. - * - * This function transfer data using an interrupt method. This is a non-blocking function, which returns right away. - * When all data is transferred, the callback function is called. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - * param transfer pointer to lpspi_transfer_t structure. - * return status of status_t. - */ -status_t LPSPI_SlaveTransferNonBlocking(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - - /* Check that we're not busy.*/ - if (handle->state == (uint8_t)kLPSPI_Busy) - { - return kStatus_LPSPI_Busy; - } - LPSPI_Enable(base, false); - /* Check arguements */ - if (!LPSPI_CheckTransferArgument(base, transfer, false)) - { - return kStatus_InvalidArgument; - } - - /* Flush FIFO, clear status, disable all the inerrupts. */ - LPSPI_FlushFifo(base, true, true); - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - - /* Variables */ - bool isRxMask = false; - bool isTxMask = false; - uint8_t txWatermark; - uint32_t readRegRemainingTimes; - uint32_t whichPcs = (transfer->configFlags & LPSPI_SLAVE_PCS_MASK) >> LPSPI_SLAVE_PCS_SHIFT; - uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; - - /* Assign the original value for members of transfer handle. */ - handle->state = (uint8_t)kLPSPI_Busy; - handle->txData = transfer->txData; - handle->rxData = transfer->rxData; - handle->txRemainingByteCount = transfer->dataSize; - handle->rxRemainingByteCount = transfer->dataSize; - handle->totalByteCount = transfer->dataSize; - handle->writeRegRemainingTimes = (transfer->dataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); - handle->readRegRemainingTimes = handle->writeRegRemainingTimes; - /*The TX and RX FIFO sizes are always the same*/ - handle->fifoSize = LPSPI_GetRxFifoSize(base); - handle->isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_SlaveByteSwap) != 0U); - /*Calculate the bytes for write/read the TX/RX register each time*/ - if (bytesPerFrame <= 4U) - { - handle->bytesEachWrite = (uint8_t)bytesPerFrame; - handle->bytesEachRead = (uint8_t)bytesPerFrame; - } - else - { - handle->bytesEachWrite = 4U; - handle->bytesEachRead = 4U; - } - /* Set proper RX and TX watermarks to reduce the ISR response times. */ - if (handle->fifoSize > 1U) - { - txWatermark = 1U; - handle->rxWatermark = handle->fifoSize - 2U; - } - else - { - txWatermark = 0U; - handle->rxWatermark = 0U; - } - LPSPI_SetFifoWatermarks(base, txWatermark, handle->rxWatermark); - - /* If there is no rxData, mask the receive data so that receive data is not stored in receive FIFO. */ - if (handle->rxData == NULL) - { - isRxMask = true; - handle->rxRemainingByteCount = 0U; - } - /* If there is no txData, mask the transmit data so that no data is loaded from transmit FIFO and output pin - * is tristated. */ - if (handle->txData == NULL) - { - isTxMask = true; - handle->txRemainingByteCount = 0U; - } - - /* Enable module for following configuration of TCR to take effect. */ - LPSPI_Enable(base, true); - - base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | - LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | - LPSPI_TCR_RXMSK(isRxMask) | LPSPI_TCR_TXMSK(isTxMask) | LPSPI_TCR_PCS(whichPcs); - - /* Enable the NVIC for LPSPI peripheral. Note that below code is useless if the LPSPI interrupt is in INTMUX , - * and you should also enable the INTMUX interupt in your application. - */ - (void)EnableIRQ(s_lpspiIRQ[LPSPI_GetInstance(base)]); - - /*TCR is also shared the FIFO, so wait for TCR written.*/ - if (!LPSPI_TxFifoReady(base)) - { - return kStatus_LPSPI_Timeout; - } - - /* Fill up the TX data in FIFO */ - if (handle->txData != NULL) - { - LPSPI_SlaveTransferFillUpTxFifo(base, handle); - } - - /* Since SPI is a synchronous interface, we only need to enable the RX interrupt if there is RX data. - * The IRQ handler will get the status of RX and TX interrupt flags. - */ - if (handle->rxData != NULL) - { - /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there - *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. - */ - readRegRemainingTimes = handle->readRegRemainingTimes; - if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) - { - base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(readRegRemainingTimes - 1U); - } - - /* RX request and FIFO overflow request enable */ - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable | (uint32_t)kLPSPI_ReceiveErrorInterruptEnable); - } - else - { - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable); - } - - if (handle->txData != NULL) - { - /* TX FIFO underflow request enable */ - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TransmitErrorInterruptEnable); - } - - return kStatus_Success; -} - -static void LPSPI_SlaveTransferFillUpTxFifo(LPSPI_Type *base, lpspi_slave_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t wordToSend = 0U; - uint8_t bytesEachWrite = handle->bytesEachWrite; - bool isByteSwap = handle->isByteSwap; - - while (LPSPI_GetTxFifoCount(base) < (handle->fifoSize)) - { - if (handle->txRemainingByteCount < (size_t)bytesEachWrite) - { - handle->bytesEachWrite = (uint8_t)handle->txRemainingByteCount; - bytesEachWrite = handle->bytesEachWrite; - } - - wordToSend = LPSPI_CombineWriteData(handle->txData, bytesEachWrite, isByteSwap); - handle->txData += bytesEachWrite; - - /*Decrease the remaining TX byte count.*/ - handle->txRemainingByteCount -= (size_t)bytesEachWrite; - - /*Write the word to TX register*/ - LPSPI_WriteData(base, wordToSend); - - if (handle->txRemainingByteCount == 0U) - { - break; - } - } -} - -static void LPSPI_SlaveTransferComplete(LPSPI_Type *base, lpspi_slave_handle_t *handle) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - /* Disable interrupt requests*/ - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - - if (handle->state == (uint8_t)kLPSPI_Error) - { - status = kStatus_LPSPI_Error; - } - else - { - status = kStatus_Success; - } - - handle->state = (uint8_t)kLPSPI_Idle; - - if (handle->callback != NULL) - { - handle->callback(base, handle, status, handle->userData); - } -} - -/*! - * brief Gets the slave transfer remaining bytes. - * - * This function gets the slave transfer remaining bytes. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the non-blocking transaction. - * return status of status_t. - */ -status_t LPSPI_SlaveTransferGetCount(LPSPI_Type *base, lpspi_slave_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (handle->state != (uint8_t)kLPSPI_Busy) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - size_t remainingByte; - - if (handle->rxData != NULL) - { - remainingByte = handle->rxRemainingByteCount; - } - else - { - remainingByte = handle->txRemainingByteCount; - } - - *count = handle->totalByteCount - remainingByte; - - return kStatus_Success; -} - -/*! - * brief LPSPI slave aborts a transfer which uses an interrupt method. - * - * This function aborts a transfer which uses an interrupt method. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - */ -void LPSPI_SlaveTransferAbort(LPSPI_Type *base, lpspi_slave_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable interrupt requests*/ - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); - - LPSPI_Reset(base); - - handle->state = (uint8_t)kLPSPI_Idle; - handle->txRemainingByteCount = 0U; - handle->rxRemainingByteCount = 0U; -} - -/*! - * brief LPSPI Slave IRQ handler function. - * - * This function processes the LPSPI transmit and receives an IRQ. - * - * param base LPSPI peripheral address. - * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - */ -void LPSPI_SlaveTransferHandleIRQ(LPSPI_Type *base, lpspi_slave_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t readData; /* variable to store word read from RX FIFO */ - uint8_t bytesEachRead = handle->bytesEachRead; - bool isByteSwap = handle->isByteSwap; - uint32_t readRegRemainingTimes; - - if (handle->rxData != NULL) - { - if (handle->rxRemainingByteCount > 0U) - { - while (LPSPI_GetRxFifoCount(base) != 0U) - { - /*Read out the data*/ - readData = LPSPI_ReadData(base); - - /*Decrease the read RX register times.*/ - --handle->readRegRemainingTimes; - - if (handle->rxRemainingByteCount < (size_t)bytesEachRead) - { - handle->bytesEachRead = (uint8_t)handle->rxRemainingByteCount; - bytesEachRead = handle->bytesEachRead; - } - - LPSPI_SeparateReadData(handle->rxData, readData, bytesEachRead, isByteSwap); - handle->rxData += bytesEachRead; - - /*Decrease the remaining RX byte count.*/ - handle->rxRemainingByteCount -= (size_t)bytesEachRead; - - if ((handle->txRemainingByteCount > 0U) && (handle->txData != NULL)) - { - LPSPI_SlaveTransferFillUpTxFifo(base, handle); - } - - if (handle->rxRemainingByteCount == 0U) - { - break; - } - } - } - - /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there - *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. - */ - readRegRemainingTimes = handle->readRegRemainingTimes; - if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) - { - base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | - LPSPI_FCR_RXWATER((readRegRemainingTimes > 1U) ? (readRegRemainingTimes - 1U) : (0U)); - } - } - if ((handle->rxData == NULL) && (handle->txRemainingByteCount != 0U) && (handle->txData != NULL)) - { - LPSPI_SlaveTransferFillUpTxFifo(base, handle); - } - - if ((handle->txRemainingByteCount == 0U) && (handle->rxRemainingByteCount == 0U)) - { - /* If no RX buffer, then transfer is not complete until transfer complete flag sets and the TX FIFO empty*/ - if (handle->rxData == NULL) - { - if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_FrameCompleteFlag) != 0U) && - (LPSPI_GetTxFifoCount(base) == 0U)) - { - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_FrameCompleteFlag); - /* Complete the transfer and disable the interrupts */ - LPSPI_SlaveTransferComplete(base, handle); - } - else - { - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_FrameCompleteFlag); - LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_FrameCompleteInterruptEnable); - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); - } - } - else - { - /* Complete the transfer and disable the interrupts */ - LPSPI_SlaveTransferComplete(base, handle); - } - } - - /* Catch tx fifo underflow conditions, service only if tx under flow interrupt enabled */ - if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransmitErrorFlag) != 0U) && - ((base->IER & LPSPI_IER_TEIE_MASK) != 0U)) - { - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_TransmitErrorFlag); - /* Change state to error and clear flag */ - if (handle->txData != NULL) - { - handle->state = (uint8_t)kLPSPI_Error; - } - handle->errorCount++; - } - /* Catch rx fifo overflow conditions, service only if rx over flow interrupt enabled */ - if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_ReceiveErrorFlag) != 0U) && - ((base->IER & LPSPI_IER_REIE_MASK) != 0U)) - { - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_ReceiveErrorFlag); - /* Change state to error and clear flag */ - if (handle->txData != NULL) - { - handle->state = (uint8_t)kLPSPI_Error; - } - handle->errorCount++; - } -} - -static uint32_t LPSPI_CombineWriteData(uint8_t *txData, uint8_t bytesEachWrite, bool isByteSwap) -{ - assert(txData != NULL); - - uint32_t wordToSend = 0U; - - switch (bytesEachWrite) - { - case 1: - wordToSend = *txData; - ++txData; - break; - - case 2: - if (!isByteSwap) - { - wordToSend = *txData; - ++txData; - wordToSend |= (unsigned)(*txData) << 8U; - ++txData; - } - else - { - wordToSend = (unsigned)(*txData) << 8U; - ++txData; - wordToSend |= *txData; - ++txData; - } - - break; - - case 3: - if (!isByteSwap) - { - wordToSend = *txData; - ++txData; - wordToSend |= (unsigned)(*txData) << 8U; - ++txData; - wordToSend |= (unsigned)(*txData) << 16U; - ++txData; - } - else - { - wordToSend = (unsigned)(*txData) << 16U; - ++txData; - wordToSend |= (unsigned)(*txData) << 8U; - ++txData; - wordToSend |= *txData; - ++txData; - } - break; - - case 4: - if (!isByteSwap) - { - wordToSend = *txData; - ++txData; - wordToSend |= (unsigned)(*txData) << 8U; - ++txData; - wordToSend |= (unsigned)(*txData) << 16U; - ++txData; - wordToSend |= (unsigned)(*txData) << 24U; - ++txData; - } - else - { - wordToSend = (unsigned)(*txData) << 24U; - ++txData; - wordToSend |= (unsigned)(*txData) << 16U; - ++txData; - wordToSend |= (unsigned)(*txData) << 8U; - ++txData; - wordToSend |= *txData; - ++txData; - } - break; - - default: - assert(false); - break; - } - return wordToSend; -} - -static void LPSPI_SeparateReadData(uint8_t *rxData, uint32_t readData, uint8_t bytesEachRead, bool isByteSwap) -{ - assert(rxData != NULL); - - switch (bytesEachRead) - { - case 1: - *rxData = (uint8_t)readData; - ++rxData; - break; - - case 2: - if (!isByteSwap) - { - *rxData = (uint8_t)readData; - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - } - else - { - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)readData; - ++rxData; - } - break; - - case 3: - if (!isByteSwap) - { - *rxData = (uint8_t)readData; - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)(readData >> 16); - ++rxData; - } - else - { - *rxData = (uint8_t)(readData >> 16); - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)readData; - ++rxData; - } - break; - - case 4: - if (!isByteSwap) - { - *rxData = (uint8_t)readData; - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)(readData >> 16); - ++rxData; - *rxData = (uint8_t)(readData >> 24); - ++rxData; - } - else - { - *rxData = (uint8_t)(readData >> 24); - ++rxData; - *rxData = (uint8_t)(readData >> 16); - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)readData; - ++rxData; - } - break; - - default: - assert(false); - break; - } -} - -static bool LPSPI_TxFifoReady(LPSPI_Type *base) -{ -#if SPI_RETRY_TIMES - uint32_t waitTimes = SPI_RETRY_TIMES; - while (((uint8_t)LPSPI_GetTxFifoCount(base) != 0U) && (--waitTimes != 0U)) -#else - while ((uint8_t)LPSPI_GetTxFifoCount(base) != 0U) -#endif - { - } -#if SPI_RETRY_TIMES - if (waitTimes == 0U) - { - return false; - } -#endif - return true; -} - -static void LPSPI_CommonIRQHandler(LPSPI_Type *base, void *param) -{ - if (LPSPI_IsMaster(base)) - { - s_lpspiMasterIsr(base, (lpspi_master_handle_t *)param); - } - else - { - s_lpspiSlaveIsr(base, (lpspi_slave_handle_t *)param); - } - SDK_ISR_EXIT_BARRIER; -} - -#if defined(LPSPI0) -void LPSPI0_DriverIRQHandler(void); -void LPSPI0_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[0] != NULL); - LPSPI_CommonIRQHandler(LPSPI0, s_lpspiHandle[0]); -} -#endif - -#if defined(LPSPI1) -void LPSPI1_DriverIRQHandler(void); -void LPSPI1_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[1] != NULL); - LPSPI_CommonIRQHandler(LPSPI1, s_lpspiHandle[1]); -} -#endif - -#if defined(LPSPI2) -void LPSPI2_DriverIRQHandler(void); -void LPSPI2_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[2] != NULL); - LPSPI_CommonIRQHandler(LPSPI2, s_lpspiHandle[2]); -} -#endif - -#if defined(LPSPI3) -void LPSPI3_DriverIRQHandler(void); -void LPSPI3_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[3] != NULL); - LPSPI_CommonIRQHandler(LPSPI3, s_lpspiHandle[3]); -} -#endif - -#if defined(LPSPI4) -void LPSPI4_DriverIRQHandler(void); -void LPSPI4_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[4] != NULL); - LPSPI_CommonIRQHandler(LPSPI4, s_lpspiHandle[4]); -} -#endif - -#if defined(LPSPI5) -void LPSPI5_DriverIRQHandler(void); -void LPSPI5_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[5] != NULL); - LPSPI_CommonIRQHandler(LPSPI5, s_lpspiHandle[5]); -} -#endif - -#if defined(DMA__LPSPI0) -void DMA_SPI0_INT_DriverIRQHandler(void); -void DMA_SPI0_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI0)] != NULL); - LPSPI_CommonIRQHandler(DMA__LPSPI0, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI0)]); -} -#endif - -#if defined(DMA__LPSPI1) -void DMA_SPI1_INT_DriverIRQHandler(void); -void DMA_SPI1_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI1)] != NULL); - LPSPI_CommonIRQHandler(DMA__LPSPI1, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI1)]); -} -#endif -#if defined(DMA__LPSPI2) -void DMA_SPI2_INT_DriverIRQHandler(void); -void DMA_SPI2_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI2)] != NULL); - LPSPI_CommonIRQHandler(DMA__LPSPI2, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI2)]); -} -#endif - -#if defined(DMA__LPSPI3) -void DMA_SPI3_INT_DriverIRQHandler(void); -void DMA_SPI3_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI3)] != NULL); - LPSPI_CommonIRQHandler(DMA__LPSPI3, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI3)]); -} -#endif - -#if defined(ADMA__LPSPI0) -void ADMA_SPI0_INT_DriverIRQHandler(void); -void ADMA_SPI0_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI0)] != NULL); - LPSPI_CommonIRQHandler(ADMA__LPSPI0, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI0)]); -} -#endif - -#if defined(ADMA__LPSPI1) -void ADMA_SPI1_INT_DriverIRQHandler(void); -void ADMA_SPI1_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI1)] != NULL); - LPSPI_CommonIRQHandler(ADMA__LPSPI1, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI1)]); -} -#endif -#if defined(ADMA__LPSPI2) -void ADMA_SPI2_INT_DriverIRQHandler(void); -void ADMA_SPI2_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI2)] != NULL); - LPSPI_CommonIRQHandler(ADMA__LPSPI2, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI2)]); -} -#endif - -#if defined(ADMA__LPSPI3) -void ADMA_SPI3_INT_DriverIRQHandler(void); -void ADMA_SPI3_INT_DriverIRQHandler(void) -{ - assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI3)] != NULL); - LPSPI_CommonIRQHandler(ADMA__LPSPI3, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI3)]); -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_lpspi.h b/devices/MIMXRT1052/drivers/fsl_lpspi.h deleted file mode 100644 index ba0a97a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpspi.h +++ /dev/null @@ -1,1156 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020,2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPSPI_H_ -#define _FSL_LPSPI_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup lpspi_driver - * @{ - */ - -/********************************************************************************************************************** - * Definitions - *********************************************************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPSPI driver version. */ -#define FSL_LPSPI_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) -/*@}*/ - -#ifndef LPSPI_DUMMY_DATA -/*! @brief LPSPI dummy data if no Tx data.*/ -#define LPSPI_DUMMY_DATA (0x00U) /*!< Dummy data used for tx if there is not txData. */ -#endif - -/*! @brief Retry times for waiting flag. */ -#ifndef SPI_RETRY_TIMES -#define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ -#endif - -/*! @brief Global variable for dummy data value setting. */ -extern volatile uint8_t g_lpspiDummyData[]; - -/*! @brief Status for the LPSPI driver.*/ -enum -{ - kStatus_LPSPI_Busy = MAKE_STATUS(kStatusGroup_LPSPI, 0), /*!< LPSPI transfer is busy.*/ - kStatus_LPSPI_Error = MAKE_STATUS(kStatusGroup_LPSPI, 1), /*!< LPSPI driver error. */ - kStatus_LPSPI_Idle = MAKE_STATUS(kStatusGroup_LPSPI, 2), /*!< LPSPI is idle.*/ - kStatus_LPSPI_OutOfRange = MAKE_STATUS(kStatusGroup_LPSPI, 3), /*!< LPSPI transfer out Of range. */ - kStatus_LPSPI_Timeout = MAKE_STATUS(kStatusGroup_LPSPI, 4) /*!< LPSPI timeout polling status flags. */ -}; - -/*! @brief LPSPI status flags in SPIx_SR register.*/ -enum _lpspi_flags -{ - kLPSPI_TxDataRequestFlag = LPSPI_SR_TDF_MASK, /*!< Transmit data flag */ - kLPSPI_RxDataReadyFlag = LPSPI_SR_RDF_MASK, /*!< Receive data flag */ - kLPSPI_WordCompleteFlag = LPSPI_SR_WCF_MASK, /*!< Word Complete flag */ - kLPSPI_FrameCompleteFlag = LPSPI_SR_FCF_MASK, /*!< Frame Complete flag */ - kLPSPI_TransferCompleteFlag = LPSPI_SR_TCF_MASK, /*!< Transfer Complete flag */ - kLPSPI_TransmitErrorFlag = LPSPI_SR_TEF_MASK, /*!< Transmit Error flag (FIFO underrun) */ - kLPSPI_ReceiveErrorFlag = LPSPI_SR_REF_MASK, /*!< Receive Error flag (FIFO overrun) */ - kLPSPI_DataMatchFlag = LPSPI_SR_DMF_MASK, /*!< Data Match flag */ - kLPSPI_ModuleBusyFlag = LPSPI_SR_MBF_MASK, /*!< Module Busy flag */ - kLPSPI_AllStatusFlag = (LPSPI_SR_TDF_MASK | LPSPI_SR_RDF_MASK | LPSPI_SR_WCF_MASK | LPSPI_SR_FCF_MASK | - LPSPI_SR_TCF_MASK | LPSPI_SR_TEF_MASK | LPSPI_SR_REF_MASK | LPSPI_SR_DMF_MASK | - LPSPI_SR_MBF_MASK) /*!< Used for clearing all w1c status flags */ -}; - -/*! @brief LPSPI interrupt source.*/ -enum _lpspi_interrupt_enable -{ - kLPSPI_TxInterruptEnable = LPSPI_IER_TDIE_MASK, /*!< Transmit data interrupt enable */ - kLPSPI_RxInterruptEnable = LPSPI_IER_RDIE_MASK, /*!< Receive data interrupt enable */ - kLPSPI_WordCompleteInterruptEnable = LPSPI_IER_WCIE_MASK, /*!< Word complete interrupt enable */ - kLPSPI_FrameCompleteInterruptEnable = LPSPI_IER_FCIE_MASK, /*!< Frame complete interrupt enable */ - kLPSPI_TransferCompleteInterruptEnable = LPSPI_IER_TCIE_MASK, /*!< Transfer complete interrupt enable */ - kLPSPI_TransmitErrorInterruptEnable = LPSPI_IER_TEIE_MASK, /*!< Transmit error interrupt enable(FIFO underrun)*/ - kLPSPI_ReceiveErrorInterruptEnable = LPSPI_IER_REIE_MASK, /*!< Receive Error interrupt enable (FIFO overrun) */ - kLPSPI_DataMatchInterruptEnable = LPSPI_IER_DMIE_MASK, /*!< Data Match interrupt enable */ - kLPSPI_AllInterruptEnable = - (LPSPI_IER_TDIE_MASK | LPSPI_IER_RDIE_MASK | LPSPI_IER_WCIE_MASK | LPSPI_IER_FCIE_MASK | LPSPI_IER_TCIE_MASK | - LPSPI_IER_TEIE_MASK | LPSPI_IER_REIE_MASK | LPSPI_IER_DMIE_MASK) /*!< All above interrupts enable.*/ -}; - -/*! @brief LPSPI DMA source.*/ -enum _lpspi_dma_enable -{ - kLPSPI_TxDmaEnable = LPSPI_DER_TDDE_MASK, /*!< Transmit data DMA enable */ - kLPSPI_RxDmaEnable = LPSPI_DER_RDDE_MASK /*!< Receive data DMA enable */ -}; - -/*! @brief LPSPI master or slave mode configuration.*/ -typedef enum _lpspi_master_slave_mode -{ - kLPSPI_Master = 1U, /*!< LPSPI peripheral operates in master mode.*/ - kLPSPI_Slave = 0U /*!< LPSPI peripheral operates in slave mode.*/ -} lpspi_master_slave_mode_t; - -/*! @brief LPSPI Peripheral Chip Select (PCS) configuration (which PCS to configure).*/ -typedef enum _lpspi_which_pcs_config -{ - kLPSPI_Pcs0 = 0U, /*!< PCS[0] */ - kLPSPI_Pcs1 = 1U, /*!< PCS[1] */ - kLPSPI_Pcs2 = 2U, /*!< PCS[2] */ - kLPSPI_Pcs3 = 3U /*!< PCS[3] */ -} lpspi_which_pcs_t; - -/*! @brief LPSPI Peripheral Chip Select (PCS) Polarity configuration.*/ -typedef enum _lpspi_pcs_polarity_config -{ - kLPSPI_PcsActiveHigh = 1U, /*!< PCS Active High (idles low) */ - kLPSPI_PcsActiveLow = 0U /*!< PCS Active Low (idles high) */ -} lpspi_pcs_polarity_config_t; - -/*! @brief LPSPI Peripheral Chip Select (PCS) Polarity.*/ -enum _lpspi_pcs_polarity -{ - kLPSPI_Pcs0ActiveLow = 1U << 0, /*!< Pcs0 Active Low (idles high). */ - kLPSPI_Pcs1ActiveLow = 1U << 1, /*!< Pcs1 Active Low (idles high). */ - kLPSPI_Pcs2ActiveLow = 1U << 2, /*!< Pcs2 Active Low (idles high). */ - kLPSPI_Pcs3ActiveLow = 1U << 3, /*!< Pcs3 Active Low (idles high). */ - kLPSPI_PcsAllActiveLow = 0xFU /*!< Pcs0 to Pcs5 Active Low (idles high). */ -}; - -/*! @brief LPSPI clock polarity configuration.*/ -typedef enum _lpspi_clock_polarity -{ - kLPSPI_ClockPolarityActiveHigh = 0U, /*!< CPOL=0. Active-high LPSPI clock (idles low)*/ - kLPSPI_ClockPolarityActiveLow = 1U /*!< CPOL=1. Active-low LPSPI clock (idles high)*/ -} lpspi_clock_polarity_t; - -/*! @brief LPSPI clock phase configuration.*/ -typedef enum _lpspi_clock_phase -{ - kLPSPI_ClockPhaseFirstEdge = 0U, /*!< CPHA=0. Data is captured on the leading edge of the SCK and changed on the - following edge.*/ - kLPSPI_ClockPhaseSecondEdge = 1U /*!< CPHA=1. Data is changed on the leading edge of the SCK and captured on the - following edge.*/ -} lpspi_clock_phase_t; - -/*! @brief LPSPI data shifter direction options.*/ -typedef enum _lpspi_shift_direction -{ - kLPSPI_MsbFirst = 0U, /*!< Data transfers start with most significant bit.*/ - kLPSPI_LsbFirst = 1U /*!< Data transfers start with least significant bit.*/ -} lpspi_shift_direction_t; - -/*! @brief LPSPI Host Request select configuration. */ -typedef enum _lpspi_host_request_select -{ - kLPSPI_HostReqExtPin = 0U, /*!< Host Request is an ext pin. */ - kLPSPI_HostReqInternalTrigger = 1U /*!< Host Request is an internal trigger. */ -} lpspi_host_request_select_t; - -/*! @brief LPSPI Match configuration options. */ -typedef enum _lpspi_match_config -{ - kLPSI_MatchDisabled = 0x0U, /*!< LPSPI Match Disabled. */ - kLPSI_1stWordEqualsM0orM1 = 0x2U, /*!< LPSPI Match Enabled. */ - kLPSI_AnyWordEqualsM0orM1 = 0x3U, /*!< LPSPI Match Enabled. */ - kLPSI_1stWordEqualsM0and2ndWordEqualsM1 = 0x4U, /*!< LPSPI Match Enabled. */ - kLPSI_AnyWordEqualsM0andNxtWordEqualsM1 = 0x5U, /*!< LPSPI Match Enabled. */ - kLPSI_1stWordAndM1EqualsM0andM1 = 0x6U, /*!< LPSPI Match Enabled. */ - kLPSI_AnyWordAndM1EqualsM0andM1 = 0x7U, /*!< LPSPI Match Enabled. */ -} lpspi_match_config_t; - -/*! @brief LPSPI pin (SDO and SDI) configuration. */ -typedef enum _lpspi_pin_config -{ - kLPSPI_SdiInSdoOut = 0U, /*!< LPSPI SDI input, SDO output. */ - kLPSPI_SdiInSdiOut = 1U, /*!< LPSPI SDI input, SDI output. */ - kLPSPI_SdoInSdoOut = 2U, /*!< LPSPI SDO input, SDO output. */ - kLPSPI_SdoInSdiOut = 3U /*!< LPSPI SDO input, SDI output. */ -} lpspi_pin_config_t; - -/*! @brief LPSPI data output configuration. */ -typedef enum _lpspi_data_out_config -{ - kLpspiDataOutRetained = 0U, /*!< Data out retains last value when chip select is de-asserted */ - kLpspiDataOutTristate = 1U /*!< Data out is tristated when chip select is de-asserted */ -} lpspi_data_out_config_t; - -/*! @brief LPSPI transfer width configuration. */ -typedef enum _lpspi_transfer_width -{ - kLPSPI_SingleBitXfer = 0U, /*!< 1-bit shift at a time, data out on SDO, in on SDI (normal mode) */ - kLPSPI_TwoBitXfer = 1U, /*!< 2-bits shift out on SDO/SDI and in on SDO/SDI */ - kLPSPI_FourBitXfer = 2U /*!< 4-bits shift out on SDO/SDI/PCS[3:2] and in on SDO/SDI/PCS[3:2] */ -} lpspi_transfer_width_t; - -/*! @brief LPSPI delay type selection.*/ -typedef enum _lpspi_delay_type -{ - kLPSPI_PcsToSck = 1U, /*!< PCS-to-SCK delay. */ - kLPSPI_LastSckToPcs, /*!< Last SCK edge to PCS delay. */ - kLPSPI_BetweenTransfer /*!< Delay between transfers. */ -} lpspi_delay_type_t; - -#define LPSPI_MASTER_PCS_SHIFT (4U) /*!< LPSPI master PCS shift macro , internal used. */ -#define LPSPI_MASTER_PCS_MASK (0xF0U) /*!< LPSPI master PCS shift macro , internal used. */ - -/*! @brief Use this enumeration for LPSPI master transfer configFlags. */ -enum _lpspi_transfer_config_flag_for_master -{ - kLPSPI_MasterPcs0 = 0U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS0 signal */ - kLPSPI_MasterPcs1 = 1U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS1 signal */ - kLPSPI_MasterPcs2 = 2U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS2 signal */ - kLPSPI_MasterPcs3 = 3U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS3 signal */ - - kLPSPI_MasterPcsContinuous = 1U << 20, /*!< Is PCS signal continuous */ - - kLPSPI_MasterByteSwap = - 1U << 22 /*!< Is master swap the byte. - * For example, when want to send data 1 2 3 4 5 6 7 8 (suppose you set - * lpspi_shift_direction_t to MSB). - * 1. If you set bitPerFrame = 8 , no matter the kLPSPI_MasterByteSwapyou flag is used - * or not, the waveform is 1 2 3 4 5 6 7 8. - * 2. If you set bitPerFrame = 16 : - * (1) the waveform is 2 1 4 3 6 5 8 7 if you do not use the kLPSPI_MasterByteSwap flag. - * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_MasterByteSwap flag. - * 3. If you set bitPerFrame = 32 : - * (1) the waveform is 4 3 2 1 8 7 6 5 if you do not use the kLPSPI_MasterByteSwap flag. - * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_MasterByteSwap flag. - */ -}; - -#define LPSPI_SLAVE_PCS_SHIFT (4U) /*!< LPSPI slave PCS shift macro , internal used. */ -#define LPSPI_SLAVE_PCS_MASK (0xF0U) /*!< LPSPI slave PCS shift macro , internal used. */ - -/*! @brief Use this enumeration for LPSPI slave transfer configFlags. */ -enum _lpspi_transfer_config_flag_for_slave -{ - kLPSPI_SlavePcs0 = 0U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS0 signal */ - kLPSPI_SlavePcs1 = 1U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS1 signal */ - kLPSPI_SlavePcs2 = 2U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS2 signal */ - kLPSPI_SlavePcs3 = 3U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS3 signal */ - - kLPSPI_SlaveByteSwap = - 1U << 22 /*!< Is slave swap the byte. - * For example, when want to send data 1 2 3 4 5 6 7 8 (suppose you set - * lpspi_shift_direction_t to MSB). - * 1. If you set bitPerFrame = 8 , no matter the kLPSPI_SlaveByteSwap flag is used - * or not, the waveform is 1 2 3 4 5 6 7 8. - * 2. If you set bitPerFrame = 16 : - * (1) the waveform is 2 1 4 3 6 5 8 7 if you do not use the kLPSPI_SlaveByteSwap flag. - * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_SlaveByteSwap flag. - * 3. If you set bitPerFrame = 32 : - * (1) the waveform is 4 3 2 1 8 7 6 5 if you do not use the kLPSPI_SlaveByteSwap flag. - * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_SlaveByteSwap flag. - */ -}; - -/*! @brief LPSPI transfer state, which is used for LPSPI transactional API state machine. */ -enum _lpspi_transfer_state -{ - kLPSPI_Idle = 0x0U, /*!< Nothing in the transmitter/receiver. */ - kLPSPI_Busy, /*!< Transfer queue is not finished. */ - kLPSPI_Error /*!< Transfer error. */ -}; - -/*! @brief LPSPI master configuration structure.*/ -typedef struct _lpspi_master_config -{ - uint32_t baudRate; /*!< Baud Rate for LPSPI. */ - uint32_t bitsPerFrame; /*!< Bits per frame, minimum 8, maximum 4096.*/ - lpspi_clock_polarity_t cpol; /*!< Clock polarity. */ - lpspi_clock_phase_t cpha; /*!< Clock phase. */ - lpspi_shift_direction_t direction; /*!< MSB or LSB data shift direction. */ - - uint32_t pcsToSckDelayInNanoSec; /*!< PCS to SCK delay time in nanoseconds, setting to 0 sets the minimum delay. - It sets the boundary value if out of range.*/ - uint32_t lastSckToPcsDelayInNanoSec; /*!< Last SCK to PCS delay time in nanoseconds, setting to 0 sets the minimum - delay. It sets the boundary value if out of range.*/ - uint32_t betweenTransferDelayInNanoSec; /*!< After the SCK delay time with nanoseconds, setting to 0 sets the - minimum delay. It sets the boundary value if out of range.*/ - - lpspi_which_pcs_t whichPcs; /*!< Desired Peripheral Chip Select (PCS). */ - lpspi_pcs_polarity_config_t pcsActiveHighOrLow; /*!< Desired PCS active high or low */ - - lpspi_pin_config_t pinCfg; /*!< Configures which pins are used for input and output data - *during single bit transfers.*/ - - lpspi_data_out_config_t dataOutConfig; /*!< Configures if the output data is tristated - * between accesses (LPSPI_PCS is negated). */ -} lpspi_master_config_t; - -/*! @brief LPSPI slave configuration structure.*/ -typedef struct _lpspi_slave_config -{ - uint32_t bitsPerFrame; /*!< Bits per frame, minimum 8, maximum 4096.*/ - lpspi_clock_polarity_t cpol; /*!< Clock polarity. */ - lpspi_clock_phase_t cpha; /*!< Clock phase. */ - lpspi_shift_direction_t direction; /*!< MSB or LSB data shift direction. */ - - lpspi_which_pcs_t whichPcs; /*!< Desired Peripheral Chip Select (pcs) */ - lpspi_pcs_polarity_config_t pcsActiveHighOrLow; /*!< Desired PCS active high or low */ - - lpspi_pin_config_t pinCfg; /*!< Configures which pins are used for input and output data - *during single bit transfers.*/ - - lpspi_data_out_config_t dataOutConfig; /*!< Configures if the output data is tristated - * between accesses (LPSPI_PCS is negated). */ -} lpspi_slave_config_t; - -/*! - * @brief Forward declaration of the _lpspi_master_handle typedefs. - */ -typedef struct _lpspi_master_handle lpspi_master_handle_t; - -/*! - * @brief Forward declaration of the _lpspi_slave_handle typedefs. - */ -typedef struct _lpspi_slave_handle lpspi_slave_handle_t; - -/*! - * @brief Master completion callback function pointer type. - * - * @param base LPSPI peripheral address. - * @param handle Pointer to the handle for the LPSPI master. - * @param status Success or error code describing whether the transfer is completed. - * @param userData Arbitrary pointer-dataSized value passed from the application. - */ -typedef void (*lpspi_master_transfer_callback_t)(LPSPI_Type *base, - lpspi_master_handle_t *handle, - status_t status, - void *userData); - -/*! - * @brief Slave completion callback function pointer type. - * - * @param base LPSPI peripheral address. - * @param handle Pointer to the handle for the LPSPI slave. - * @param status Success or error code describing whether the transfer is completed. - * @param userData Arbitrary pointer-dataSized value passed from the application. - */ -typedef void (*lpspi_slave_transfer_callback_t)(LPSPI_Type *base, - lpspi_slave_handle_t *handle, - status_t status, - void *userData); - -/*! @brief LPSPI master/slave transfer structure.*/ -typedef struct _lpspi_transfer -{ - uint8_t *txData; /*!< Send buffer. */ - uint8_t *rxData; /*!< Receive buffer. */ - volatile size_t dataSize; /*!< Transfer bytes. */ - - uint32_t configFlags; /*!< Transfer transfer configuration flags. Set from _lpspi_transfer_config_flag_for_master if - the transfer is used for master or _lpspi_transfer_config_flag_for_slave enumeration if the - transfer is used for slave.*/ -} lpspi_transfer_t; - -/*! @brief LPSPI master transfer handle structure used for transactional API. */ -struct _lpspi_master_handle -{ - volatile bool isPcsContinuous; /*!< Is PCS continuous in transfer. */ - volatile bool writeTcrInIsr; /*!< A flag that whether should write TCR in ISR. */ - - volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ - volatile bool isTxMask; /*!< A flag that whether TCR[TXMSK] is set. */ - volatile uint16_t bytesPerFrame; /*!< Number of bytes in each frame */ - - volatile uint8_t fifoSize; /*!< FIFO dataSize. */ - - volatile uint8_t rxWatermark; /*!< Rx watermark. */ - - volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ - volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ - - uint8_t *volatile txData; /*!< Send buffer. */ - uint8_t *volatile rxData; /*!< Receive buffer. */ - volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ - volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ - - volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ - volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ - - uint32_t totalByteCount; /*!< Number of transfer bytes*/ - - uint32_t txBuffIfNull; /*!< Used if the txData is NULL. */ - - volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ - - lpspi_master_transfer_callback_t callback; /*!< Completion callback. */ - void *userData; /*!< Callback user data. */ -}; - -/*! @brief LPSPI slave transfer handle structure used for transactional API. */ -struct _lpspi_slave_handle -{ - volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ - - volatile uint8_t fifoSize; /*!< FIFO dataSize. */ - - volatile uint8_t rxWatermark; /*!< Rx watermark. */ - - volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ - volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ - - uint8_t *volatile txData; /*!< Send buffer. */ - uint8_t *volatile rxData; /*!< Receive buffer. */ - - volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ - volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ - - volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ - volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ - - uint32_t totalByteCount; /*!< Number of transfer bytes*/ - - volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ - - volatile uint32_t errorCount; /*!< Error count for slave transfer.*/ - - lpspi_slave_transfer_callback_t callback; /*!< Completion callback. */ - void *userData; /*!< Callback user data. */ -}; - -/********************************************************************************************************************** - * API - *********************************************************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initializes the LPSPI master. - * - * @param base LPSPI peripheral address. - * @param masterConfig Pointer to structure lpspi_master_config_t. - * @param srcClock_Hz Module source input clock in Hertz - */ -void LPSPI_MasterInit(LPSPI_Type *base, const lpspi_master_config_t *masterConfig, uint32_t srcClock_Hz); - -/*! - * @brief Sets the lpspi_master_config_t structure to default values. - * - * This API initializes the configuration structure for LPSPI_MasterInit(). - * The initialized structure can remain unchanged in LPSPI_MasterInit(), or can be modified - * before calling the LPSPI_MasterInit(). - * Example: - * @code - * lpspi_master_config_t masterConfig; - * LPSPI_MasterGetDefaultConfig(&masterConfig); - * @endcode - * @param masterConfig pointer to lpspi_master_config_t structure - */ -void LPSPI_MasterGetDefaultConfig(lpspi_master_config_t *masterConfig); - -/*! - * @brief LPSPI slave configuration. - * - * @param base LPSPI peripheral address. - * @param slaveConfig Pointer to a structure lpspi_slave_config_t. - */ -void LPSPI_SlaveInit(LPSPI_Type *base, const lpspi_slave_config_t *slaveConfig); - -/*! - * @brief Sets the lpspi_slave_config_t structure to default values. - * - * This API initializes the configuration structure for LPSPI_SlaveInit(). - * The initialized structure can remain unchanged in LPSPI_SlaveInit() or can be modified - * before calling the LPSPI_SlaveInit(). - * Example: - * @code - * lpspi_slave_config_t slaveConfig; - * LPSPI_SlaveGetDefaultConfig(&slaveConfig); - * @endcode - * @param slaveConfig pointer to lpspi_slave_config_t structure. - */ -void LPSPI_SlaveGetDefaultConfig(lpspi_slave_config_t *slaveConfig); - -/*! - * @brief De-initializes the LPSPI peripheral. Call this API to disable the LPSPI clock. - * @param base LPSPI peripheral address. - */ -void LPSPI_Deinit(LPSPI_Type *base); - -/*! - * @brief Restores the LPSPI peripheral to reset state. Note that this function - * sets all registers to reset state. As a result, the LPSPI module can't work after calling - * this API. - * @param base LPSPI peripheral address. - */ -void LPSPI_Reset(LPSPI_Type *base); - -/*! - * @brief Get the LPSPI instance from peripheral base address. - * - * @param base LPSPI peripheral base address. - * @return LPSPI instance. - */ -uint32_t LPSPI_GetInstance(LPSPI_Type *base); - -/*! - * @brief Enables the LPSPI peripheral and sets the MCR MDIS to 0. - * - * @param base LPSPI peripheral address. - * @param enable Pass true to enable module, false to disable module. - */ -static inline void LPSPI_Enable(LPSPI_Type *base, bool enable) -{ - if (enable) - { - base->CR |= LPSPI_CR_MEN_MASK; - } - else - { - base->CR &= ~LPSPI_CR_MEN_MASK; - } -} - -/*! - *@} - */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the LPSPI status flag state. - * @param base LPSPI peripheral address. - * @return The LPSPI status(in SR register). - */ -static inline uint32_t LPSPI_GetStatusFlags(LPSPI_Type *base) -{ - return (base->SR); -} - -/*! - * @brief Gets the LPSPI Tx FIFO size. - * @param base LPSPI peripheral address. - * @return The LPSPI Tx FIFO size. - */ -static inline uint8_t LPSPI_GetTxFifoSize(LPSPI_Type *base) -{ - return (1U << ((base->PARAM & LPSPI_PARAM_TXFIFO_MASK) >> LPSPI_PARAM_TXFIFO_SHIFT)); -} - -/*! - * @brief Gets the LPSPI Rx FIFO size. - * @param base LPSPI peripheral address. - * @return The LPSPI Rx FIFO size. - */ -static inline uint8_t LPSPI_GetRxFifoSize(LPSPI_Type *base) -{ - return (1U << ((base->PARAM & LPSPI_PARAM_RXFIFO_MASK) >> LPSPI_PARAM_RXFIFO_SHIFT)); -} - -/*! - * @brief Gets the LPSPI Tx FIFO count. - * @param base LPSPI peripheral address. - * @return The number of words in the transmit FIFO. - */ -static inline uint32_t LPSPI_GetTxFifoCount(LPSPI_Type *base) -{ - return ((base->FSR & LPSPI_FSR_TXCOUNT_MASK) >> LPSPI_FSR_TXCOUNT_SHIFT); -} - -/*! - * @brief Gets the LPSPI Rx FIFO count. - * @param base LPSPI peripheral address. - * @return The number of words in the receive FIFO. - */ -static inline uint32_t LPSPI_GetRxFifoCount(LPSPI_Type *base) -{ - return ((base->FSR & LPSPI_FSR_RXCOUNT_MASK) >> LPSPI_FSR_RXCOUNT_SHIFT); -} - -/*! - * @brief Clears the LPSPI status flag. - * - * This function clears the desired status bit by using a write-1-to-clear. The user passes in the base and the - * desired status flag bit to clear. The list of status flags is defined in the _lpspi_flags. - * Example usage: - * @code - * LPSPI_ClearStatusFlags(base, kLPSPI_TxDataRequestFlag|kLPSPI_RxDataReadyFlag); - * @endcode - * - * @param base LPSPI peripheral address. - * @param statusFlags The status flag used from type _lpspi_flags. - */ -static inline void LPSPI_ClearStatusFlags(LPSPI_Type *base, uint32_t statusFlags) -{ - base->SR = statusFlags; /*!< The status flags are cleared by writing 1 (w1c).*/ -} - -/*! - *@} - */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the LPSPI interrupts. - * - * This function configures the various interrupt masks of the LPSPI. The parameters are base and an interrupt mask. - * Note that, for Tx fill and Rx FIFO drain requests, enabling the interrupt request disables the DMA request. - * - * @code - * LPSPI_EnableInterrupts(base, kLPSPI_TxInterruptEnable | kLPSPI_RxInterruptEnable ); - * @endcode - * - * @param base LPSPI peripheral address. - * @param mask The interrupt mask; Use the enum _lpspi_interrupt_enable. - */ -static inline void LPSPI_EnableInterrupts(LPSPI_Type *base, uint32_t mask) -{ - base->IER |= mask; -} - -/*! - * @brief Disables the LPSPI interrupts. - * - * @code - * LPSPI_DisableInterrupts(base, kLPSPI_TxInterruptEnable | kLPSPI_RxInterruptEnable ); - * @endcode - * - * @param base LPSPI peripheral address. - * @param mask The interrupt mask; Use the enum _lpspi_interrupt_enable. - */ -static inline void LPSPI_DisableInterrupts(LPSPI_Type *base, uint32_t mask) -{ - base->IER &= ~mask; -} - -/*! - *@} - */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables the LPSPI DMA request. - * - * This function configures the Rx and Tx DMA mask of the LPSPI. The parameters are base and a DMA mask. - * @code - * LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable | kLPSPI_RxDmaEnable); - * @endcode - * - * @param base LPSPI peripheral address. - * @param mask The interrupt mask; Use the enum _lpspi_dma_enable. - */ -static inline void LPSPI_EnableDMA(LPSPI_Type *base, uint32_t mask) -{ - base->DER |= mask; -} - -/*! - * @brief Disables the LPSPI DMA request. - * - * This function configures the Rx and Tx DMA mask of the LPSPI. The parameters are base and a DMA mask. - * @code - * SPI_DisableDMA(base, kLPSPI_TxDmaEnable | kLPSPI_RxDmaEnable); - * @endcode - * - * @param base LPSPI peripheral address. - * @param mask The interrupt mask; Use the enum _lpspi_dma_enable. - */ -static inline void LPSPI_DisableDMA(LPSPI_Type *base, uint32_t mask) -{ - base->DER &= ~mask; -} - -/*! - * @brief Gets the LPSPI Transmit Data Register address for a DMA operation. - * - * This function gets the LPSPI Transmit Data Register address because this value is needed - * for the DMA operation. - * This function can be used for either master or slave mode. - * - * @param base LPSPI peripheral address. - * @return The LPSPI Transmit Data Register address. - */ -static inline uint32_t LPSPI_GetTxRegisterAddress(LPSPI_Type *base) -{ - return (uint32_t) & (base->TDR); -} - -/*! - * @brief Gets the LPSPI Receive Data Register address for a DMA operation. - * - * This function gets the LPSPI Receive Data Register address because this value is needed - * for the DMA operation. - * This function can be used for either master or slave mode. - * - * @param base LPSPI peripheral address. - * @return The LPSPI Receive Data Register address. - */ -static inline uint32_t LPSPI_GetRxRegisterAddress(LPSPI_Type *base) -{ - return (uint32_t) & (base->RDR); -} - -/*! - *@} - */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Check the argument for transfer . - * - * @param base LPSPI peripheral address. - * @param transfer the transfer struct to be used. - * @param isEdma True to check for EDMA transfer, false to check interrupt non-blocking transfer - * @return Return true for right and false for wrong. - */ -bool LPSPI_CheckTransferArgument(LPSPI_Type *base, lpspi_transfer_t *transfer, bool isEdma); - -/*! - * @brief Configures the LPSPI for either master or slave. - * - * Note that the CFGR1 should only be written when the LPSPI is disabled (LPSPIx_CR_MEN = 0). - * - * @param base LPSPI peripheral address. - * @param mode Mode setting (master or slave) of type lpspi_master_slave_mode_t. - */ -static inline void LPSPI_SetMasterSlaveMode(LPSPI_Type *base, lpspi_master_slave_mode_t mode) -{ - base->CFGR1 = (base->CFGR1 & (~LPSPI_CFGR1_MASTER_MASK)) | LPSPI_CFGR1_MASTER(mode); -} - -/*! - * @brief Configures the peripheral chip select used for the transfer. - * - * @param base LPSPI peripheral address. - * @param select LPSPI Peripheral Chip Select (PCS) configuration. - */ -static inline void LPSPI_SelectTransferPCS(LPSPI_Type *base, lpspi_which_pcs_t select) -{ - base->TCR = (base->TCR & (~LPSPI_TCR_PCS_MASK)) | LPSPI_TCR_PCS((uint8_t)select); -} - -/*! - * @brief Set the PCS signal to continuous or uncontinuous mode. - * - * @note In master mode, continuous transfer will keep the PCS asserted at the end of the frame size, until a command - * word is received that starts a new frame. So PCS must be set back to uncontinuous when transfer finishes. - * In slave mode, when continuous transfer is enabled, the LPSPI will only transmit the first frame size bits, after - * that the LPSPI will transmit received data back (assuming a 32-bit shift register). - * - * @param base LPSPI peripheral address. - * @param IsContinous True to set the transfer PCS to continuous mode, false to set to uncontinuous mode. - */ -static inline void LPSPI_SetPCSContinous(LPSPI_Type *base, bool IsContinous) -{ - if (IsContinous) - { - base->TCR |= LPSPI_TCR_CONT_MASK; - } - else - { - base->TCR &= LPSPI_TCR_CONT_MASK; - } -} - -/*! - * @brief Returns whether the LPSPI module is in master mode. - * - * @param base LPSPI peripheral address. - * @return Returns true if the module is in master mode or false if the module is in slave mode. - */ -static inline bool LPSPI_IsMaster(LPSPI_Type *base) -{ - return (bool)((base->CFGR1) & LPSPI_CFGR1_MASTER_MASK); -} - -/*! - * @brief Flushes the LPSPI FIFOs. - * - * @param base LPSPI peripheral address. - * @param flushTxFifo Flushes (true) the Tx FIFO, else do not flush (false) the Tx FIFO. - * @param flushRxFifo Flushes (true) the Rx FIFO, else do not flush (false) the Rx FIFO. - */ -static inline void LPSPI_FlushFifo(LPSPI_Type *base, bool flushTxFifo, bool flushRxFifo) -{ - base->CR |= ((uint32_t)flushTxFifo << LPSPI_CR_RTF_SHIFT) | ((uint32_t)flushRxFifo << LPSPI_CR_RRF_SHIFT); -} - -/*! - * @brief Sets the transmit and receive FIFO watermark values. - * - * This function allows the user to set the receive and transmit FIFO watermarks. The function - * does not compare the watermark settings to the FIFO size. The FIFO watermark should not be - * equal to or greater than the FIFO size. It is up to the higher level driver to make this check. - * - * @param base LPSPI peripheral address. - * @param txWater The TX FIFO watermark value. Writing a value equal or greater than the FIFO size is truncated. - * @param rxWater The RX FIFO watermark value. Writing a value equal or greater than the FIFO size is truncated. - */ -static inline void LPSPI_SetFifoWatermarks(LPSPI_Type *base, uint32_t txWater, uint32_t rxWater) -{ - base->FCR = LPSPI_FCR_TXWATER(txWater) | LPSPI_FCR_RXWATER(rxWater); -} - -/*! - * @brief Configures all LPSPI peripheral chip select polarities simultaneously. - * - * Note that the CFGR1 should only be written when the LPSPI is disabled (LPSPIx_CR_MEN = 0). - * - * This is an example: PCS0 and PCS1 set to active low and other PCSs set to active high. Note that the number of - * PCS is device-specific. - * @code - * LPSPI_SetAllPcsPolarity(base, kLPSPI_Pcs0ActiveLow | kLPSPI_Pcs1ActiveLow); - * @endcode - * - * @param base LPSPI peripheral address. - * @param mask The PCS polarity mask; Use the enum _lpspi_pcs_polarity. - */ -static inline void LPSPI_SetAllPcsPolarity(LPSPI_Type *base, uint32_t mask) -{ - base->CFGR1 = (base->CFGR1 & ~LPSPI_CFGR1_PCSPOL_MASK) | LPSPI_CFGR1_PCSPOL(~mask); -} - -/*! - * @brief Configures the frame size. - * - * The minimum frame size is 8-bits and the maximum frame size is 4096-bits. If the frame size is less than or equal - * to 32-bits, the word size and frame size are identical. If the frame size is greater than 32-bits, the word - * size is 32-bits for each word except the last (the last word contains the remainder bits if the frame size is not - * divisible by 32). The minimum word size is 2-bits. A frame size of 33-bits (or similar) is not supported. - * - * Note 1: The transmit command register should be initialized before enabling the LPSPI in slave mode, although - * the command register does not update until after the LPSPI is enabled. After it is enabled, the transmit command - * register - * should only be changed if the LPSPI is idle. - * - * Note 2: The transmit and command FIFO is a combined FIFO that includes both transmit data and command words. That - * means the TCR register should be written to when the Tx FIFO is not full. - * - * @param base LPSPI peripheral address. - * @param frameSize The frame size in number of bits. - */ -static inline void LPSPI_SetFrameSize(LPSPI_Type *base, uint32_t frameSize) -{ - base->TCR = (base->TCR & ~LPSPI_TCR_FRAMESZ_MASK) | LPSPI_TCR_FRAMESZ(frameSize - 1U); -} - -/*! - * @brief Sets the LPSPI baud rate in bits per second. - * - * This function takes in the desired bitsPerSec (baud rate) and calculates the nearest - * possible baud rate without exceeding the desired baud rate and returns the - * calculated baud rate in bits-per-second. It requires the caller to provide - * the frequency of the module source clock (in Hertz). Note that the baud rate - * does not go into effect until the Transmit Control Register (TCR) is programmed - * with the prescale value. Hence, this function returns the prescale tcrPrescaleValue - * parameter for later programming in the TCR. The higher level - * peripheral driver should alert the user of an out of range baud rate input. - * - * Note that the LPSPI module must first be disabled before configuring this. - * Note that the LPSPI module must be configured for master mode before configuring this. - * - * @param base LPSPI peripheral address. - * @param baudRate_Bps The desired baud rate in bits per second. - * @param srcClock_Hz Module source input clock in Hertz. - * @param tcrPrescaleValue The TCR prescale value needed to program the TCR. - * @return The actual calculated baud rate. This function may also return a "0" if the - * LPSPI is not configured for master mode or if the LPSPI module is not disabled. - */ - -uint32_t LPSPI_MasterSetBaudRate(LPSPI_Type *base, - uint32_t baudRate_Bps, - uint32_t srcClock_Hz, - uint32_t *tcrPrescaleValue); - -/*! - * @brief Manually configures a specific LPSPI delay parameter (module must be disabled to - * change the delay values). - * - * This function configures the following: - * SCK to PCS delay, or - * PCS to SCK delay, or - * The configurations must occur between the transfer delay. - * - * The delay names are available in type lpspi_delay_type_t. - * - * The user passes the desired delay along with the delay value. - * This allows the user to directly set the delay values if they have - * pre-calculated them or if they simply wish to manually increment the value. - * - * Note that the LPSPI module must first be disabled before configuring this. - * Note that the LPSPI module must be configured for master mode before configuring this. - * - * @param base LPSPI peripheral address. - * @param scaler The 8-bit delay value 0x00 to 0xFF (255). - * @param whichDelay The desired delay to configure, must be of type lpspi_delay_type_t. - */ -void LPSPI_MasterSetDelayScaler(LPSPI_Type *base, uint32_t scaler, lpspi_delay_type_t whichDelay); - -/*! - * @brief Calculates the delay based on the desired delay input in nanoseconds (module must be - * disabled to change the delay values). - * - * This function calculates the values for the following: - * SCK to PCS delay, or - * PCS to SCK delay, or - * The configurations must occur between the transfer delay. - * - * The delay names are available in type lpspi_delay_type_t. - * - * The user passes the desired delay and the desired delay value in - * nano-seconds. The function calculates the value needed for the desired delay parameter - * and returns the actual calculated delay because an exact delay match may not be possible. In this - * case, the closest match is calculated without going below the desired delay value input. - * It is possible to input a very large delay value that exceeds the capability of the part, in - * which case the maximum supported delay is returned. It is up to the higher level - * peripheral driver to alert the user of an out of range delay input. - * - * Note that the LPSPI module must be configured for master mode before configuring this. And note that - * the delayTime = LPSPI_clockSource / (PRESCALE * Delay_scaler). - * - * @param base LPSPI peripheral address. - * @param delayTimeInNanoSec The desired delay value in nano-seconds. - * @param whichDelay The desired delay to configuration, which must be of type lpspi_delay_type_t. - * @param srcClock_Hz Module source input clock in Hertz. - * @return actual Calculated delay value in nano-seconds. - */ -uint32_t LPSPI_MasterSetDelayTimes(LPSPI_Type *base, - uint32_t delayTimeInNanoSec, - lpspi_delay_type_t whichDelay, - uint32_t srcClock_Hz); - -/*! - * @brief Writes data into the transmit data buffer. - * - * This function writes data passed in by the user to the Transmit Data Register (TDR). - * The user can pass up to 32-bits of data to load into the TDR. If the frame size exceeds 32-bits, - * the user has to manage sending the data one 32-bit word at a time. - * Any writes to the TDR result in an immediate push to the transmit FIFO. - * This function can be used for either master or slave modes. - * - * @param base LPSPI peripheral address. - * @param data The data word to be sent. - */ -static inline void LPSPI_WriteData(LPSPI_Type *base, uint32_t data) -{ - base->TDR = data; -} - -/*! - * @brief Reads data from the data buffer. - * - * This function reads the data from the Receive Data Register (RDR). - * This function can be used for either master or slave mode. - * - * @param base LPSPI peripheral address. - * @return The data read from the data buffer. - */ -static inline uint32_t LPSPI_ReadData(LPSPI_Type *base) -{ - return (base->RDR); -} - -/*! - * @brief Set up the dummy data. - * - * @param base LPSPI peripheral address. - * @param dummyData Data to be transferred when tx buffer is NULL. - * Note: - * This API has no effect when LPSPI in slave interrupt mode, because driver - * will set the TXMSK bit to 1 if txData is NULL, no data is loaded from transmit - * FIFO and output pin is tristated. - */ -void LPSPI_SetDummyData(LPSPI_Type *base, uint8_t dummyData); - -/*! - *@} - */ - -/*! - * @name Transactional - * @{ - */ -/*Transactional APIs*/ - -/*! - * @brief Initializes the LPSPI master handle. - * - * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - - * @param base LPSPI peripheral address. - * @param handle LPSPI handle pointer to lpspi_master_handle_t. - * @param callback DSPI callback. - * @param userData callback function parameter. - */ -void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base, - lpspi_master_handle_t *handle, - lpspi_master_transfer_callback_t callback, - void *userData); - -/*! - * @brief LPSPI master transfer data using a polling method. - * - * This function transfers data using a polling method. This is a blocking function, which does not return until all - * transfers have been - * completed. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * @param base LPSPI peripheral address. - * @param transfer pointer to lpspi_transfer_t structure. - * @return status of status_t. - */ -status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base, lpspi_transfer_t *transfer); - -/*! - * @brief LPSPI master transfer data using an interrupt method. - * - * This function transfers data using an interrupt method. This is a non-blocking function, which returns right away. - * When all data is transferred, the callback function is called. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - * @param transfer pointer to lpspi_transfer_t structure. - * @return status of status_t. - */ -status_t LPSPI_MasterTransferNonBlocking(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_transfer_t *transfer); - -/*! - * @brief Gets the master transfer remaining bytes. - * - * This function gets the master transfer remaining bytes. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @return status of status_t. - */ -status_t LPSPI_MasterTransferGetCount(LPSPI_Type *base, lpspi_master_handle_t *handle, size_t *count); - -/*! - * @brief LPSPI master abort transfer which uses an interrupt method. - * - * This function aborts a transfer which uses an interrupt method. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - */ -void LPSPI_MasterTransferAbort(LPSPI_Type *base, lpspi_master_handle_t *handle); - -/*! - * @brief LPSPI Master IRQ handler function. - * - * This function processes the LPSPI transmit and receive IRQ. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. - */ -void LPSPI_MasterTransferHandleIRQ(LPSPI_Type *base, lpspi_master_handle_t *handle); - -/*! - * @brief Initializes the LPSPI slave handle. - * - * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - * - * @param base LPSPI peripheral address. - * @param handle LPSPI handle pointer to lpspi_slave_handle_t. - * @param callback DSPI callback. - * @param userData callback function parameter. - */ -void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base, - lpspi_slave_handle_t *handle, - lpspi_slave_transfer_callback_t callback, - void *userData); - -/*! - * @brief LPSPI slave transfer data using an interrupt method. - * - * This function transfer data using an interrupt method. This is a non-blocking function, which returns right away. - * When all data is transferred, the callback function is called. - * - * Note: - * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - * @param transfer pointer to lpspi_transfer_t structure. - * @return status of status_t. - */ -status_t LPSPI_SlaveTransferNonBlocking(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_transfer_t *transfer); - -/*! - * @brief Gets the slave transfer remaining bytes. - * - * This function gets the slave transfer remaining bytes. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - * @param count Number of bytes transferred so far by the non-blocking transaction. - * @return status of status_t. - */ -status_t LPSPI_SlaveTransferGetCount(LPSPI_Type *base, lpspi_slave_handle_t *handle, size_t *count); - -/*! - * @brief LPSPI slave aborts a transfer which uses an interrupt method. - * - * This function aborts a transfer which uses an interrupt method. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - */ -void LPSPI_SlaveTransferAbort(LPSPI_Type *base, lpspi_slave_handle_t *handle); - -/*! - * @brief LPSPI Slave IRQ handler function. - * - * This function processes the LPSPI transmit and receives an IRQ. - * - * @param base LPSPI peripheral address. - * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. - */ -void LPSPI_SlaveTransferHandleIRQ(LPSPI_Type *base, lpspi_slave_handle_t *handle); - -/*! - *@} - */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /*_FSL_LPSPI_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_lpspi_edma.c b/devices/MIMXRT1052/drivers/fsl_lpspi_edma.c deleted file mode 100755 index cd46d73..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpspi_edma.c +++ /dev/null @@ -1,1052 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpspi_edma.h" - -/*********************************************************************************************************************** - * Definitions - ***********************************************************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpspi_edma" -#endif - -/*! - * @brief Structure definition for dspi_master_edma_private_handle_t. The structure is private. - */ -typedef struct _lpspi_master_edma_private_handle -{ - LPSPI_Type *base; /*!< LPSPI peripheral base address. */ - lpspi_master_edma_handle_t *handle; /*!< lpspi_master_edma_handle_t handle */ -} lpspi_master_edma_private_handle_t; - -/*! - * @brief Structure definition for dspi_slave_edma_private_handle_t. The structure is private. - */ -typedef struct _lpspi_slave_edma_private_handle -{ - LPSPI_Type *base; /*!< LPSPI peripheral base address. */ - lpspi_slave_edma_handle_t *handle; /*!< lpspi_slave_edma_handle_t handle */ -} lpspi_slave_edma_private_handle_t; - -/*********************************************************************************************************************** - * Prototypes - ***********************************************************************************************************************/ - -/*! - * @brief EDMA_LpspiMasterCallback after the LPSPI master transfer completed by using EDMA. - * This is not a public API. - */ -static void EDMA_LpspiMasterCallback(edma_handle_t *edmaHandle, - void *g_lpspiEdmaPrivateHandle, - bool transferDone, - uint32_t tcds); - -/*! - * @brief EDMA_LpspiSlaveCallback after the LPSPI slave transfer completed by using EDMA. - * This is not a public API. - */ -static void EDMA_LpspiSlaveCallback(edma_handle_t *edmaHandle, - void *g_lpspiEdmaPrivateHandle, - bool transferDone, - uint32_t tcds); - -static void LPSPI_SeparateEdmaReadData(uint8_t *rxData, uint32_t readData, uint32_t bytesEachRead, bool isByteSwap); - -/*********************************************************************************************************************** - * Variables - ***********************************************************************************************************************/ -/*! @brief Pointers to lpspi bases for each instance. */ -static LPSPI_Type *const s_lpspiBases[] = LPSPI_BASE_PTRS; - -/*! @brief Pointers to lpspi edma handles for each instance. */ -static lpspi_master_edma_private_handle_t s_lpspiMasterEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]; -static lpspi_slave_edma_private_handle_t s_lpspiSlaveEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]; - -/*********************************************************************************************************************** - * Code - ***********************************************************************************************************************/ -static void LPSPI_SeparateEdmaReadData(uint8_t *rxData, uint32_t readData, uint32_t bytesEachRead, bool isByteSwap) -{ - assert(rxData != NULL); - - switch (bytesEachRead) - { - case 1: - if (!isByteSwap) - { - *rxData = (uint8_t)readData; - ++rxData; - } - else - { - *rxData = (uint8_t)(readData >> 24); - ++rxData; - } - break; - - case 2: - if (!isByteSwap) - { - *rxData = (uint8_t)readData; - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - } - else - { - *rxData = (uint8_t)(readData >> 16); - ++rxData; - *rxData = (uint8_t)(readData >> 24); - ++rxData; - } - break; - - case 4: - - *rxData = (uint8_t)readData; - ++rxData; - *rxData = (uint8_t)(readData >> 8); - ++rxData; - *rxData = (uint8_t)(readData >> 16); - ++rxData; - *rxData = (uint8_t)(readData >> 24); - ++rxData; - - break; - - default: - assert(false); - break; - } -} - -/*! - * brief Initializes the LPSPI master eDMA handle. - * - * This function initializes the LPSPI eDMA handle which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - * - * Note that the LPSPI eDMA has a separated (Rx and Rx as two sources) or shared (Rx and Tx are the same source) DMA - * request source. - * (1) For a separated DMA request source, enable and set the Rx DMAMUX source for edmaRxRegToRxDataHandle and - * Tx DMAMUX source for edmaIntermediaryToTxRegHandle. - * (2) For a shared DMA request source, enable and set the Rx/Rx DMAMUX source for edmaRxRegToRxDataHandle. - * - * param base LPSPI peripheral base address. - * param handle LPSPI handle pointer to lpspi_master_edma_handle_t. - * param callback LPSPI callback. - * param userData callback function parameter. - * param edmaRxRegToRxDataHandle edmaRxRegToRxDataHandle pointer to edma_handle_t. - * param edmaTxDataToTxRegHandle edmaTxDataToTxRegHandle pointer to edma_handle_t. - */ -void LPSPI_MasterTransferCreateHandleEDMA(LPSPI_Type *base, - lpspi_master_edma_handle_t *handle, - lpspi_master_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *edmaRxRegToRxDataHandle, - edma_handle_t *edmaTxDataToTxRegHandle) -{ - assert(handle != NULL); - assert(edmaRxRegToRxDataHandle != NULL); - assert(edmaTxDataToTxRegHandle != NULL); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - uint32_t instance = LPSPI_GetInstance(base); - - s_lpspiMasterEdmaPrivateHandle[instance].base = base; - s_lpspiMasterEdmaPrivateHandle[instance].handle = handle; - - handle->callback = callback; - handle->userData = userData; - - handle->edmaRxRegToRxDataHandle = edmaRxRegToRxDataHandle; - handle->edmaTxDataToTxRegHandle = edmaTxDataToTxRegHandle; -} - -static void LPSPI_PrepareTransferEDMA(LPSPI_Type *base) -{ - /* Flush FIFO, clear status, disable all the inerrupts and DMA requests. */ - LPSPI_FlushFifo(base, true, true); - LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); - LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); - LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); -} - -/*! - * brief LPSPI master transfer data using eDMA. - * - * This function transfers data using eDMA. This is a non-blocking function, which returns right away. When all data - * is transferred, the callback function is called. - * - * Note: - * The transfer data size should be an integer multiple of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. - * param transfer pointer to lpspi_transfer_t structure. - * return status of status_t. - */ -status_t LPSPI_MasterTransferEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - - /* Check that we're not busy.*/ - if (handle->state == (uint8_t)kLPSPI_Busy) - { - return kStatus_LPSPI_Busy; - } - - /* Disable module before configuration */ - LPSPI_Enable(base, false); - /* Check arguements */ - if (!LPSPI_CheckTransferArgument(base, transfer, true)) - { - return kStatus_InvalidArgument; - } - - LPSPI_PrepareTransferEDMA(base); - - /* Variables */ - bool isThereExtraTxBytes = false; - bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); - bool isPcsContinuous = ((transfer->configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U); - uint32_t instance = LPSPI_GetInstance(base); - uint8_t dummyData = g_lpspiDummyData[instance]; - uint8_t bytesLastWrite = 0; - /*Used for byte swap*/ - uint32_t addrOffset = 0; - uint32_t rxAddr = LPSPI_GetRxRegisterAddress(base); - uint32_t txAddr = LPSPI_GetTxRegisterAddress(base); - uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; - uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; - edma_transfer_config_t transferConfigRx; - edma_transfer_config_t transferConfigTx; - edma_tcd_t *softwareTCD_pcsContinuous = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[2]) & (~0x1FU)); - edma_tcd_t *softwareTCD_extraBytes = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[1]) & (~0x1FU)); - - handle->state = (uint8_t)kLPSPI_Busy; - handle->txData = transfer->txData; - handle->rxData = transfer->rxData; - handle->txRemainingByteCount = transfer->dataSize; - handle->rxRemainingByteCount = transfer->dataSize; - handle->totalByteCount = transfer->dataSize; - handle->writeRegRemainingTimes = (transfer->dataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); - handle->readRegRemainingTimes = handle->writeRegRemainingTimes; - handle->txBuffIfNull = - ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); - /*The TX and RX FIFO sizes are always the same*/ - handle->fifoSize = LPSPI_GetRxFifoSize(base); - handle->isPcsContinuous = isPcsContinuous; - handle->isByteSwap = isByteSwap; - handle->isThereExtraRxBytes = false; - - /*Because DMA is fast enough , so set the RX and TX watermarks to 0 .*/ - LPSPI_SetFifoWatermarks(base, 0U, 0U); - - /* Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ - base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); - - /* Enable module for following configuration of TCR to take effect. */ - LPSPI_Enable(base, true); - - /* For DMA transfer , we'd better not masked the transmit data and receive data in TCR since the transfer flow is - * hard to controlled by software. */ - base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK | LPSPI_TCR_PCS_MASK)) | - LPSPI_TCR_CONT(isPcsContinuous) | LPSPI_TCR_BYSW(isByteSwap) | LPSPI_TCR_PCS(whichPcs); - - /*Calculate the bytes for write/read the TX/RX register each time*/ - if (bytesPerFrame <= 4U) - { - handle->bytesEachWrite = (uint8_t)bytesPerFrame; - handle->bytesEachRead = (uint8_t)bytesPerFrame; - - handle->bytesLastRead = (uint8_t)bytesPerFrame; - } - else - { - handle->bytesEachWrite = 4U; - handle->bytesEachRead = 4U; - - handle->bytesLastRead = 4U; - - if ((transfer->dataSize % 4U) != 0U) - { - bytesLastWrite = (uint8_t)(transfer->dataSize % 4U); - handle->bytesLastRead = bytesLastWrite; - - isThereExtraTxBytes = true; - - --handle->writeRegRemainingTimes; - - --handle->readRegRemainingTimes; - handle->isThereExtraRxBytes = true; - } - } - - EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_LpspiMasterCallback, - &s_lpspiMasterEdmaPrivateHandle[instance]); - - /* Configure rx EDMA transfer */ - EDMA_ResetChannel(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel); - - if (handle->rxData != NULL) - { - transferConfigRx.destAddr = (uint32_t) & (handle->rxData[0]); - transferConfigRx.destOffset = 1; - } - else - { - transferConfigRx.destAddr = (uint32_t) & (handle->rxBuffIfNull); - transferConfigRx.destOffset = 0; - } - transferConfigRx.destTransferSize = kEDMA_TransferSize1Bytes; - - addrOffset = 0; - switch (handle->bytesEachRead) - { - case (1U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfigRx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize2Bytes; - transferConfigRx.minorLoopBytes = 2; - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - case (4U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize4Bytes; - transferConfigRx.minorLoopBytes = 4; - break; - - default: - transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfigRx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigRx.srcAddr = (uint32_t)rxAddr + addrOffset; - transferConfigRx.srcOffset = 0; - - transferConfigRx.majorLoopCounts = handle->readRegRemainingTimes; - - /* Store the initially configured eDMA minor byte transfer count into the LPSPI handle */ - handle->nbytes = (uint8_t)transferConfigRx.minorLoopBytes; - - EDMA_SetTransferConfig(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, - &transferConfigRx, NULL); - EDMA_EnableChannelInterrupts(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, - (uint32_t)kEDMA_MajorInterruptEnable); - - /* Configure tx EDMA transfer */ - EDMA_ResetChannel(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel); - - if (isThereExtraTxBytes) - { - if (handle->txData != NULL) - { - transferConfigTx.srcAddr = (uint32_t) & (transfer->txData[transfer->dataSize - bytesLastWrite]); - transferConfigTx.srcOffset = 1; - } - else - { - transferConfigTx.srcAddr = (uint32_t)(&handle->txBuffIfNull); - transferConfigTx.srcOffset = 0; - } - - transferConfigTx.destOffset = 0; - - transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; - - addrOffset = 0; - switch (bytesLastWrite) - { - case (1U): - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; - transferConfigTx.minorLoopBytes = 2; - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - default: - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; - transferConfigTx.majorLoopCounts = 1; - - EDMA_TcdReset(softwareTCD_extraBytes); - - if (handle->isPcsContinuous) - { - EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, softwareTCD_pcsContinuous); - } - else - { - EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, NULL); - } - } - - if (handle->isPcsContinuous) - { - handle->transmitCommand = base->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK); - - transferConfigTx.srcAddr = (uint32_t) & (handle->transmitCommand); - transferConfigTx.srcOffset = 0; - - transferConfigTx.destAddr = (uint32_t) & (base->TCR); - transferConfigTx.destOffset = 0; - - transferConfigTx.srcTransferSize = kEDMA_TransferSize4Bytes; - transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; - transferConfigTx.minorLoopBytes = 4; - transferConfigTx.majorLoopCounts = 1; - - EDMA_TcdReset(softwareTCD_pcsContinuous); - EDMA_TcdSetTransferConfig(softwareTCD_pcsContinuous, &transferConfigTx, NULL); - } - - if (handle->txData != NULL) - { - transferConfigTx.srcAddr = (uint32_t)(handle->txData); - transferConfigTx.srcOffset = 1; - } - else - { - transferConfigTx.srcAddr = (uint32_t)(&handle->txBuffIfNull); - transferConfigTx.srcOffset = 0; - } - - transferConfigTx.destOffset = 0; - - transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; - - addrOffset = 0U; - switch (handle->bytesEachRead) - { - case (1U): - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; - transferConfigTx.minorLoopBytes = 2; - - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - case (4U): - transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; - transferConfigTx.minorLoopBytes = 4; - break; - - default: - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; - - transferConfigTx.majorLoopCounts = handle->writeRegRemainingTimes; - - if (isThereExtraTxBytes) - { - EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, - &transferConfigTx, softwareTCD_extraBytes); - } - else if (handle->isPcsContinuous) - { - EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, - &transferConfigTx, softwareTCD_pcsContinuous); - } - else - { - EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, - &transferConfigTx, NULL); - } - - EDMA_StartTransfer(handle->edmaTxDataToTxRegHandle); - EDMA_StartTransfer(handle->edmaRxRegToRxDataHandle); - LPSPI_EnableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); - - return kStatus_Success; -} - -static void EDMA_LpspiMasterCallback(edma_handle_t *edmaHandle, - void *g_lpspiEdmaPrivateHandle, - bool transferDone, - uint32_t tcds) -{ - assert(edmaHandle != NULL); - assert(g_lpspiEdmaPrivateHandle != NULL); - - uint32_t readData; - - lpspi_master_edma_private_handle_t *lpspiEdmaPrivateHandle; - - lpspiEdmaPrivateHandle = (lpspi_master_edma_private_handle_t *)g_lpspiEdmaPrivateHandle; - - size_t rxRemainingByteCount = lpspiEdmaPrivateHandle->handle->rxRemainingByteCount; - uint8_t bytesLastRead = lpspiEdmaPrivateHandle->handle->bytesLastRead; - bool isByteSwap = lpspiEdmaPrivateHandle->handle->isByteSwap; - - LPSPI_DisableDMA(lpspiEdmaPrivateHandle->base, (uint32_t)kLPSPI_TxDmaEnable | (uint32_t)kLPSPI_RxDmaEnable); - - if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes) - { - while (LPSPI_GetRxFifoCount(lpspiEdmaPrivateHandle->base) == 0U) - { - } - readData = LPSPI_ReadData(lpspiEdmaPrivateHandle->base); - - if (lpspiEdmaPrivateHandle->handle->rxData != NULL) - { - LPSPI_SeparateEdmaReadData(&(lpspiEdmaPrivateHandle->handle->rxData[rxRemainingByteCount - bytesLastRead]), - readData, bytesLastRead, isByteSwap); - } - } - - lpspiEdmaPrivateHandle->handle->state = (uint8_t)kLPSPI_Idle; - - if (lpspiEdmaPrivateHandle->handle->callback != NULL) - { - lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle, - kStatus_Success, lpspiEdmaPrivateHandle->handle->userData); - } -} - -/*! - * brief LPSPI master aborts a transfer which is using eDMA. - * - * This function aborts a transfer which is using eDMA. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. - */ -void LPSPI_MasterTransferAbortEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle) -{ - assert(handle != NULL); - - LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); - - EDMA_AbortTransfer(handle->edmaRxRegToRxDataHandle); - EDMA_AbortTransfer(handle->edmaTxDataToTxRegHandle); - - handle->state = (uint8_t)kLPSPI_Idle; -} - -/*! - * brief Gets the master eDMA transfer remaining bytes. - * - * This function gets the master eDMA transfer remaining bytes. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the EDMA transaction. - * return status of status_t. - */ -status_t LPSPI_MasterTransferGetCountEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (handle->state != (uint8_t)kLPSPI_Busy) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - size_t remainingByte; - - remainingByte = - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->edmaRxRegToRxDataHandle->base, - handle->edmaRxRegToRxDataHandle->channel); - - *count = handle->totalByteCount - remainingByte; - - return kStatus_Success; -} - -/*! - * brief Initializes the LPSPI slave eDMA handle. - * - * This function initializes the LPSPI eDMA handle which can be used for other LPSPI transactional APIs. Usually, for a - * specified LPSPI instance, call this API once to get the initialized handle. - * - * Note that LPSPI eDMA has a separated (Rx and Tx as two sources) or shared (Rx and Tx as the same source) DMA request - * source. - * - * (1) For a separated DMA request source, enable and set the Rx DMAMUX source for edmaRxRegToRxDataHandle and - * Tx DMAMUX source for edmaTxDataToTxRegHandle. - * (2) For a shared DMA request source, enable and set the Rx/Rx DMAMUX source for edmaRxRegToRxDataHandle . - * - * param base LPSPI peripheral base address. - * param handle LPSPI handle pointer to lpspi_slave_edma_handle_t. - * param callback LPSPI callback. - * param userData callback function parameter. - * param edmaRxRegToRxDataHandle edmaRxRegToRxDataHandle pointer to edma_handle_t. - * param edmaTxDataToTxRegHandle edmaTxDataToTxRegHandle pointer to edma_handle_t. - */ -void LPSPI_SlaveTransferCreateHandleEDMA(LPSPI_Type *base, - lpspi_slave_edma_handle_t *handle, - lpspi_slave_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *edmaRxRegToRxDataHandle, - edma_handle_t *edmaTxDataToTxRegHandle) -{ - assert(handle != NULL); - assert(edmaRxRegToRxDataHandle != NULL); - assert(edmaTxDataToTxRegHandle != NULL); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - uint32_t instance = LPSPI_GetInstance(base); - - s_lpspiSlaveEdmaPrivateHandle[instance].base = base; - s_lpspiSlaveEdmaPrivateHandle[instance].handle = handle; - - handle->callback = callback; - handle->userData = userData; - - handle->edmaRxRegToRxDataHandle = edmaRxRegToRxDataHandle; - handle->edmaTxDataToTxRegHandle = edmaTxDataToTxRegHandle; -} - -/*! - * brief LPSPI slave transfers data using eDMA. - * - * This function transfers data using eDMA. This is a non-blocking function, which return right away. When all data - * is transferred, the callback function is called. - * - * Note: - * The transfer data size should be an integer multiple of bytesPerFrame if bytesPerFrame is less than or equal to 4. - * For bytesPerFrame greater than 4: - * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. - * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. - * param transfer pointer to lpspi_transfer_t structure. - * return status of status_t. - */ -status_t LPSPI_SlaveTransferEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, lpspi_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - - /* Check that we're not busy.*/ - if (handle->state == (uint8_t)kLPSPI_Busy) - { - return kStatus_LPSPI_Busy; - } - /* Disable module before configuration. */ - LPSPI_Enable(base, false); - /* Check arguements, also dma transfer can not support 3 bytes */ - if (!LPSPI_CheckTransferArgument(base, transfer, true)) - { - return kStatus_InvalidArgument; - } - - LPSPI_PrepareTransferEDMA(base); - - /* Variables */ - bool isThereExtraTxBytes = false; - bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); - uint8_t bytesLastWrite = 0; - uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; - uint32_t mask = (uint32_t)kLPSPI_RxDmaEnable; - - /* Used for byte swap */ - uint32_t addrOffset = 0; - uint32_t instance = LPSPI_GetInstance(base); - uint32_t rxAddr = LPSPI_GetRxRegisterAddress(base); - uint32_t txAddr = LPSPI_GetTxRegisterAddress(base); - uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; - uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; - edma_transfer_config_t transferConfigRx; - edma_transfer_config_t transferConfigTx; - edma_tcd_t *softwareTCD_extraBytes = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[1]) & (~0x1FU)); - - /* Assign the original value for members of transfer handle. */ - handle->state = (uint8_t)kLPSPI_Busy; - handle->txData = transfer->txData; - handle->rxData = transfer->rxData; - handle->txRemainingByteCount = transfer->dataSize; - handle->rxRemainingByteCount = transfer->dataSize; - handle->totalByteCount = transfer->dataSize; - handle->writeRegRemainingTimes = (transfer->dataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); - handle->readRegRemainingTimes = handle->writeRegRemainingTimes; - handle->txBuffIfNull = - ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); - /*The TX and RX FIFO sizes are always the same*/ - handle->fifoSize = LPSPI_GetRxFifoSize(base); - handle->isByteSwap = isByteSwap; - handle->isThereExtraRxBytes = false; - - /* Because DMA is fast enough, set the RX and TX watermarks to 0. */ - LPSPI_SetFifoWatermarks(base, 0U, 0U); - - /* Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ - base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); - - /* Enable module for following configuration of TCR to take effect. */ - LPSPI_Enable(base, true); - - /* For DMA transfer, mask the transmit data if the tx data is null, for rx the receive data should not be masked at - any time since we use rx dma transfer finish cllback to indicate transfer finish. */ - base->TCR = - (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK | LPSPI_TCR_TXMSK_MASK)) | - LPSPI_TCR_TXMSK(transfer->txData == NULL) | LPSPI_TCR_BYSW(isByteSwap) | LPSPI_TCR_PCS(whichPcs); - - /*Calculate the bytes for write/read the TX/RX register each time*/ - if (bytesPerFrame <= 4U) - { - handle->bytesEachWrite = (uint8_t)bytesPerFrame; - handle->bytesEachRead = (uint8_t)bytesPerFrame; - - handle->bytesLastRead = (uint8_t)bytesPerFrame; - } - else - { - handle->bytesEachWrite = 4U; - handle->bytesEachRead = 4U; - - handle->bytesLastRead = 4U; - - if ((transfer->dataSize % 4U) != 0U) - { - bytesLastWrite = (uint8_t)(transfer->dataSize % 4U); - handle->bytesLastRead = bytesLastWrite; - - isThereExtraTxBytes = true; - --handle->writeRegRemainingTimes; - - handle->isThereExtraRxBytes = true; - --handle->readRegRemainingTimes; - } - } - - EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_LpspiSlaveCallback, - &s_lpspiSlaveEdmaPrivateHandle[instance]); - - /*Rx*/ - if (handle->readRegRemainingTimes > 0U) - { - EDMA_ResetChannel(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel); - - if (handle->rxData != NULL) - { - transferConfigRx.destAddr = (uint32_t) & (handle->rxData[0]); - transferConfigRx.destOffset = 1; - } - else - { - transferConfigRx.destAddr = (uint32_t) & (handle->rxBuffIfNull); - transferConfigRx.destOffset = 0; - } - transferConfigRx.destTransferSize = kEDMA_TransferSize1Bytes; - - addrOffset = 0; - switch (handle->bytesEachRead) - { - case (1U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfigRx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize2Bytes; - transferConfigRx.minorLoopBytes = 2; - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - case (4U): - transferConfigRx.srcTransferSize = kEDMA_TransferSize4Bytes; - transferConfigRx.minorLoopBytes = 4; - break; - - default: - transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; - transferConfigRx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigRx.srcAddr = (uint32_t)rxAddr + addrOffset; - transferConfigRx.srcOffset = 0; - - transferConfigRx.majorLoopCounts = handle->readRegRemainingTimes; - - /* Store the initially configured eDMA minor byte transfer count into the DSPI handle */ - handle->nbytes = (uint8_t)transferConfigRx.minorLoopBytes; - - EDMA_SetTransferConfig(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, - &transferConfigRx, NULL); - EDMA_EnableChannelInterrupts(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, - (uint32_t)kEDMA_MajorInterruptEnable); - EDMA_StartTransfer(handle->edmaRxRegToRxDataHandle); - } - - /*Tx*/ - if (handle->txData != NULL) - { - EDMA_ResetChannel(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel); - if (isThereExtraTxBytes) - { - transferConfigTx.srcAddr = (uint32_t) & (transfer->txData[transfer->dataSize - bytesLastWrite]); - transferConfigTx.srcOffset = 1; - transferConfigTx.destOffset = 0; - transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; - addrOffset = 0; - switch (bytesLastWrite) - { - case (1U): - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; - transferConfigTx.minorLoopBytes = 2; - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - default: - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; - transferConfigTx.majorLoopCounts = 1; - - EDMA_TcdReset(softwareTCD_extraBytes); - EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, NULL); - } - - transferConfigTx.srcAddr = (uint32_t)(handle->txData); - transferConfigTx.srcOffset = 1; - transferConfigTx.destOffset = 0; - transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; - addrOffset = 0; - switch (handle->bytesEachRead) - { - case (1U): - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - if (handle->isByteSwap) - { - addrOffset = 3; - } - break; - - case (2U): - transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; - transferConfigTx.minorLoopBytes = 2; - - if (handle->isByteSwap) - { - addrOffset = 2; - } - break; - - case (4U): - transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; - transferConfigTx.minorLoopBytes = 4; - break; - - default: - transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; - transferConfigTx.minorLoopBytes = 1; - assert(false); - break; - } - - transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; - transferConfigTx.majorLoopCounts = handle->writeRegRemainingTimes; - - if (isThereExtraTxBytes) - { - EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, - &transferConfigTx, softwareTCD_extraBytes); - } - else - { - EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, - &transferConfigTx, NULL); - } - EDMA_StartTransfer(handle->edmaTxDataToTxRegHandle); - mask |= (uint32_t)kLPSPI_TxDmaEnable; - } - - LPSPI_EnableDMA(base, mask); - - return kStatus_Success; -} - -static void EDMA_LpspiSlaveCallback(edma_handle_t *edmaHandle, - void *g_lpspiEdmaPrivateHandle, - bool transferDone, - uint32_t tcds) -{ - assert(edmaHandle != NULL); - assert(g_lpspiEdmaPrivateHandle != NULL); - - uint32_t readData; - - lpspi_slave_edma_private_handle_t *lpspiEdmaPrivateHandle; - - lpspiEdmaPrivateHandle = (lpspi_slave_edma_private_handle_t *)g_lpspiEdmaPrivateHandle; - - size_t rxRemainingByteCount = lpspiEdmaPrivateHandle->handle->rxRemainingByteCount; - uint8_t bytesLastRead = lpspiEdmaPrivateHandle->handle->bytesLastRead; - bool isByteSwap = lpspiEdmaPrivateHandle->handle->isByteSwap; - - LPSPI_DisableDMA(lpspiEdmaPrivateHandle->base, (uint32_t)kLPSPI_TxDmaEnable | (uint32_t)kLPSPI_RxDmaEnable); - - if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes) - { - while (LPSPI_GetRxFifoCount(lpspiEdmaPrivateHandle->base) == 0U) - { - } - readData = LPSPI_ReadData(lpspiEdmaPrivateHandle->base); - - if (lpspiEdmaPrivateHandle->handle->rxData != NULL) - { - LPSPI_SeparateEdmaReadData(&(lpspiEdmaPrivateHandle->handle->rxData[rxRemainingByteCount - bytesLastRead]), - readData, bytesLastRead, isByteSwap); - } - } - - lpspiEdmaPrivateHandle->handle->state = (uint8_t)kLPSPI_Idle; - - if (lpspiEdmaPrivateHandle->handle->callback != NULL) - { - lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle, - kStatus_Success, lpspiEdmaPrivateHandle->handle->userData); - } -} - -/*! - * brief LPSPI slave aborts a transfer which is using eDMA. - * - * This function aborts a transfer which is using eDMA. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. - */ -void LPSPI_SlaveTransferAbortEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle) -{ - assert(handle != NULL); - - LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); - - EDMA_AbortTransfer(handle->edmaRxRegToRxDataHandle); - EDMA_AbortTransfer(handle->edmaTxDataToTxRegHandle); - - handle->state = (uint8_t)kLPSPI_Idle; -} - -/*! - * brief Gets the slave eDMA transfer remaining bytes. - * - * This function gets the slave eDMA transfer remaining bytes. - * - * param base LPSPI peripheral base address. - * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. - * param count Number of bytes transferred so far by the eDMA transaction. - * return status of status_t. - */ -status_t LPSPI_SlaveTransferGetCountEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - if (NULL == count) - { - return kStatus_InvalidArgument; - } - - /* Catch when there is not an active transfer. */ - if (handle->state != (uint8_t)kLPSPI_Busy) - { - *count = 0; - return kStatus_NoTransferInProgress; - } - - size_t remainingByte; - - remainingByte = - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->edmaRxRegToRxDataHandle->base, - handle->edmaRxRegToRxDataHandle->channel); - - *count = handle->totalByteCount - remainingByte; - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpspi_edma.h b/devices/MIMXRT1052/drivers/fsl_lpspi_edma.h deleted file mode 100644 index 85da8ed..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpspi_edma.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPSPI_EDMA_H_ -#define _FSL_LPSPI_EDMA_H_ - -#include "fsl_lpspi.h" -#include "fsl_edma.h" - -/*! - * @addtogroup lpspi_edma_driver - * @{ - */ - -/*********************************************************************************************************************** - * Definitions - **********************************************************************************************************************/ -/*! @name Driver version */ -/*@{*/ -/*! @brief LPSPI EDMA driver version. */ -#define FSL_LPSPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) -/*@}*/ - -/*! - * @brief Forward declaration of the _lpspi_master_edma_handle typedefs. - */ -typedef struct _lpspi_master_edma_handle lpspi_master_edma_handle_t; - -/*! - * @brief Forward declaration of the _lpspi_slave_edma_handle typedefs. - */ -typedef struct _lpspi_slave_edma_handle lpspi_slave_edma_handle_t; - -/*! - * @brief Completion callback function pointer type. - * - * @param base LPSPI peripheral base address. - * @param handle Pointer to the handle for the LPSPI master. - * @param status Success or error code describing whether the transfer completed. - * @param userData Arbitrary pointer-dataSized value passed from the application. - */ -typedef void (*lpspi_master_edma_transfer_callback_t)(LPSPI_Type *base, - lpspi_master_edma_handle_t *handle, - status_t status, - void *userData); -/*! - * @brief Completion callback function pointer type. - * - * @param base LPSPI peripheral base address. - * @param handle Pointer to the handle for the LPSPI slave. - * @param status Success or error code describing whether the transfer completed. - * @param userData Arbitrary pointer-dataSized value passed from the application. - */ -typedef void (*lpspi_slave_edma_transfer_callback_t)(LPSPI_Type *base, - lpspi_slave_edma_handle_t *handle, - status_t status, - void *userData); - -/*! @brief LPSPI master eDMA transfer handle structure used for transactional API. */ -struct _lpspi_master_edma_handle -{ - volatile bool isPcsContinuous; /*!< Is PCS continuous in transfer. */ - - volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ - - volatile uint8_t fifoSize; /*!< FIFO dataSize. */ - - volatile uint8_t rxWatermark; /*!< Rx watermark. */ - - volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ - volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ - - volatile uint8_t bytesLastRead; /*!< Bytes for last read RDR. */ - volatile bool isThereExtraRxBytes; /*!< Is there extra RX byte. */ - - uint8_t *volatile txData; /*!< Send buffer. */ - uint8_t *volatile rxData; /*!< Receive buffer. */ - volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ - volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ - - volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ - volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ - - uint32_t totalByteCount; /*!< Number of transfer bytes*/ - - uint32_t txBuffIfNull; /*!< Used if there is not txData for DMA purpose.*/ - uint32_t rxBuffIfNull; /*!< Used if there is not rxData for DMA purpose.*/ - - uint32_t transmitCommand; /*!< Used to write TCR for DMA purpose.*/ - - volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ - - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - - lpspi_master_edma_transfer_callback_t callback; /*!< Completion callback. */ - void *userData; /*!< Callback user data. */ - - edma_handle_t *edmaRxRegToRxDataHandle; /*!async_status = status; - (void)xSemaphoreGiveFromISR(handle->event, &reschedule); - portYIELD_FROM_ISR(reschedule); -} - -/*! - * brief Initializes LPSPI. - * - * This function initializes the LPSPI module and related RTOS context. - * - * param handle The RTOS LPSPI handle, the pointer to an allocated space for RTOS context. - * param base The pointer base address of the LPSPI instance to initialize. - * param masterConfig Configuration structure to set-up LPSPI in master mode. - * param srcClock_Hz Frequency of input clock of the LPSPI module. - * return status of the operation. - */ -status_t LPSPI_RTOS_Init(lpspi_rtos_handle_t *handle, - LPSPI_Type *base, - const lpspi_master_config_t *masterConfig, - uint32_t srcClock_Hz) -{ - if (handle == NULL) - { - return kStatus_InvalidArgument; - } - - if (base == NULL) - { - return kStatus_InvalidArgument; - } - - (void)memset(handle, 0, sizeof(lpspi_rtos_handle_t)); - - handle->mutex = xSemaphoreCreateMutex(); - if (handle->mutex == NULL) - { - return kStatus_Fail; - } - - handle->event = xSemaphoreCreateBinary(); - if (handle->event == NULL) - { - vSemaphoreDelete(handle->mutex); - return kStatus_Fail; - } - - handle->base = base; - - LPSPI_MasterInit(handle->base, masterConfig, srcClock_Hz); - LPSPI_MasterTransferCreateHandle(handle->base, &handle->drv_handle, LPSPI_RTOS_Callback, (void *)handle); - - return kStatus_Success; -} - -/*! - * brief Deinitializes the LPSPI. - * - * This function deinitializes the LPSPI module and related RTOS context. - * - * param handle The RTOS LPSPI handle. - */ -status_t LPSPI_RTOS_Deinit(lpspi_rtos_handle_t *handle) -{ - LPSPI_Deinit(handle->base); - vSemaphoreDelete(handle->event); - vSemaphoreDelete(handle->mutex); - - return kStatus_Success; -} - -/*! - * brief Performs SPI transfer. - * - * This function performs an SPI transfer according to data given in the transfer structure. - * - * param handle The RTOS LPSPI handle. - * param transfer Structure specifying the transfer parameters. - * return status of the operation. - */ -status_t LPSPI_RTOS_Transfer(lpspi_rtos_handle_t *handle, lpspi_transfer_t *transfer) -{ - status_t status; - - /* Lock resource mutex */ - if (xSemaphoreTake(handle->mutex, portMAX_DELAY) != pdTRUE) - { - return kStatus_LPSPI_Busy; - } - - status = LPSPI_MasterTransferNonBlocking(handle->base, &handle->drv_handle, transfer); - if (status != kStatus_Success) - { - (void)xSemaphoreGive(handle->mutex); - return status; - } - - /* Wait for transfer to finish */ - if (xSemaphoreTake(handle->event, portMAX_DELAY) != pdTRUE) - { - return kStatus_LPSPI_Error; - } - - /* Unlock resource mutex */ - (void)xSemaphoreGive(handle->mutex); - - /* Return status captured by callback function */ - return handle->async_status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpspi_freertos.h b/devices/MIMXRT1052/drivers/fsl_lpspi_freertos.h deleted file mode 100644 index 2c6bc1e..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpspi_freertos.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef __FSL_LPSPI_FREERTOS_H__ -#define __FSL_LPSPI_FREERTOS_H__ - -#include "FreeRTOS.h" -#include "portable.h" -#include "semphr.h" - -#include "fsl_lpspi.h" - -/*! - * @addtogroup lpspi_freertos_driver LPSPI FreeRTOS Driver - * @{ - */ - -/********************************************************************************************************************** - * Definitions - *********************************************************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPSPI FreeRTOS driver version 2.0.5. */ -#define FSL_LPSPI_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) -/*@}*/ - -/*! - * @cond RTOS_PRIVATE - * @brief LPSPI FreeRTOS handle - */ -typedef struct _lpspi_rtos_handle -{ - LPSPI_Type *base; /*!< LPSPI base address */ - lpspi_master_handle_t drv_handle; /*!< Handle of the underlying driver, treated as opaque by the RTOS layer */ - status_t async_status; - SemaphoreHandle_t mutex; /*!< Mutex to lock the handle during a trasfer */ - SemaphoreHandle_t event; /*!< Semaphore to notify and unblock task when transfer ends */ -} lpspi_rtos_handle_t; -/*! \endcond */ - -/********************************************************************************************************************** - * API - *********************************************************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name LPSPI RTOS Operation - * @{ - */ - -/*! - * @brief Initializes LPSPI. - * - * This function initializes the LPSPI module and related RTOS context. - * - * @param handle The RTOS LPSPI handle, the pointer to an allocated space for RTOS context. - * @param base The pointer base address of the LPSPI instance to initialize. - * @param masterConfig Configuration structure to set-up LPSPI in master mode. - * @param srcClock_Hz Frequency of input clock of the LPSPI module. - * @return status of the operation. - */ -status_t LPSPI_RTOS_Init(lpspi_rtos_handle_t *handle, - LPSPI_Type *base, - const lpspi_master_config_t *masterConfig, - uint32_t srcClock_Hz); - -/*! - * @brief Deinitializes the LPSPI. - * - * This function deinitializes the LPSPI module and related RTOS context. - * - * @param handle The RTOS LPSPI handle. - */ -status_t LPSPI_RTOS_Deinit(lpspi_rtos_handle_t *handle); - -/*! - * @brief Performs SPI transfer. - * - * This function performs an SPI transfer according to data given in the transfer structure. - * - * @param handle The RTOS LPSPI handle. - * @param transfer Structure specifying the transfer parameters. - * @return status of the operation. - */ -status_t LPSPI_RTOS_Transfer(lpspi_rtos_handle_t *handle, lpspi_transfer_t *transfer); - -/*! - * @} - */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ - -#endif /* __FSL_LPSPI_FREERTOS_H__ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart.c b/devices/MIMXRT1052/drivers/fsl_lpuart.c deleted file mode 100644 index e57d21b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart.c +++ /dev/null @@ -1,2259 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpuart.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpuart" -#endif - -/* LPUART transfer state. */ -enum -{ - kLPUART_TxIdle, /*!< TX idle. */ - kLPUART_TxBusy, /*!< TX busy. */ - kLPUART_RxIdle, /*!< RX idle. */ - kLPUART_RxBusy /*!< RX busy. */ -}; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Check whether the RX ring buffer is full. - * - * @userData handle LPUART handle pointer. - * @retval true RX ring buffer is full. - * @retval false RX ring buffer is not full. - */ -static bool LPUART_TransferIsRxRingBufferFull(LPUART_Type *base, lpuart_handle_t *handle); - -/*! - * @brief Write to TX register using non-blocking method. - * - * This function writes data to the TX register directly, upper layer must make - * sure the TX register is empty or TX FIFO has empty room before calling this function. - * - * @note This function does not check whether all the data has been sent out to bus, - * so before disable TX, check kLPUART_TransmissionCompleteFlag to ensure the TX is - * finished. - * - * @param base LPUART peripheral base address. - * @param data Start address of the data to write. - * @param length Size of the buffer to be sent. - */ -static void LPUART_WriteNonBlocking(LPUART_Type *base, const uint8_t *data, size_t length); - -/*! - * @brief Read RX register using non-blocking method. - * - * This function reads data from the TX register directly, upper layer must make - * sure the RX register is full or TX FIFO has data before calling this function. - * - * @param base LPUART peripheral base address. - * @param data Start address of the buffer to store the received data. - * @param length Size of the buffer. - */ -static void LPUART_ReadNonBlocking(LPUART_Type *base, uint8_t *data, size_t length); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/* Array of LPUART peripheral base address. */ -static LPUART_Type *const s_lpuartBases[] = LPUART_BASE_PTRS; -/* Array of LPUART handle. */ -void *s_lpuartHandle[ARRAY_SIZE(s_lpuartBases)]; -/* Array of LPUART IRQ number. */ -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -static const IRQn_Type s_lpuartRxIRQ[] = LPUART_RX_IRQS; -const IRQn_Type s_lpuartTxIRQ[] = LPUART_TX_IRQS; -#else -const IRQn_Type s_lpuartIRQ[] = LPUART_RX_TX_IRQS; -#endif -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of LPUART clock name. */ -static const clock_ip_name_t s_lpuartClock[] = LPUART_CLOCKS; - -#if defined(LPUART_PERIPH_CLOCKS) -/* Array of LPUART functional clock name. */ -static const clock_ip_name_t s_lpuartPeriphClocks[] = LPUART_PERIPH_CLOCKS; -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/* LPUART ISR for transactional APIs. */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -lpuart_isr_t s_lpuartIsr = (lpuart_isr_t)DefaultISR; -#else -lpuart_isr_t s_lpuartIsr; -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ -/*! - * brief Get the LPUART instance from peripheral base address. - * - * param base LPUART peripheral base address. - * return LPUART instance. - */ -uint32_t LPUART_GetInstance(LPUART_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0U; instance < ARRAY_SIZE(s_lpuartBases); instance++) - { - if (s_lpuartBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_lpuartBases)); - - return instance; -} - -/*! - * brief Get the length of received data in RX ring buffer. - * - * userData handle LPUART handle pointer. - * return Length of received data in RX ring buffer. - */ -size_t LPUART_TransferGetRxRingBufferLength(LPUART_Type *base, lpuart_handle_t *handle) -{ - assert(NULL != handle); - - size_t size; - size_t tmpRxRingBufferSize = handle->rxRingBufferSize; - uint16_t tmpRxRingBufferTail = handle->rxRingBufferTail; - uint16_t tmpRxRingBufferHead = handle->rxRingBufferHead; - - if (tmpRxRingBufferTail > tmpRxRingBufferHead) - { - size = ((size_t)tmpRxRingBufferHead + tmpRxRingBufferSize - (size_t)tmpRxRingBufferTail); - } - else - { - size = ((size_t)tmpRxRingBufferHead - (size_t)tmpRxRingBufferTail); - } - - return size; -} - -static bool LPUART_TransferIsRxRingBufferFull(LPUART_Type *base, lpuart_handle_t *handle) -{ - assert(NULL != handle); - - bool full; - - if (LPUART_TransferGetRxRingBufferLength(base, handle) == (handle->rxRingBufferSize - 1U)) - { - full = true; - } - else - { - full = false; - } - return full; -} - -static void LPUART_WriteNonBlocking(LPUART_Type *base, const uint8_t *data, size_t length) -{ - assert(NULL != data); - - size_t i; - - /* The Non Blocking write data API assume user have ensured there is enough space in - peripheral to write. */ - for (i = 0; i < length; i++) - { - base->DATA = data[i]; - } -} - -static void LPUART_ReadNonBlocking(LPUART_Type *base, uint8_t *data, size_t length) -{ - assert(NULL != data); - - size_t i; -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - uint32_t ctrl = base->CTRL; - bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || - (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); -#endif - - /* The Non Blocking read data API assume user have ensured there is enough space in - peripheral to write. */ - for (i = 0; i < length; i++) - { -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - if (isSevenDataBits) - { - data[i] = (uint8_t)(base->DATA & 0x7FU); - } - else - { - data[i] = (uint8_t)base->DATA; - } -#else - data[i] = (uint8_t)(base->DATA); -#endif - } -} - -/*! - * brief Initializes an LPUART instance with the user configuration structure and the peripheral clock. - * - * This function configures the LPUART module with user-defined settings. Call the LPUART_GetDefaultConfig() function - * to configure the configuration structure and get the default configuration. - * The example below shows how to use this API to configure the LPUART. - * code - * lpuart_config_t lpuartConfig; - * lpuartConfig.baudRate_Bps = 115200U; - * lpuartConfig.parityMode = kLPUART_ParityDisabled; - * lpuartConfig.dataBitsCount = kLPUART_EightDataBits; - * lpuartConfig.isMsb = false; - * lpuartConfig.stopBitCount = kLPUART_OneStopBit; - * lpuartConfig.txFifoWatermark = 0; - * lpuartConfig.rxFifoWatermark = 1; - * LPUART_Init(LPUART1, &lpuartConfig, 20000000U); - * endcode - * - * param base LPUART peripheral base address. - * param config Pointer to a user-defined configuration structure. - * param srcClock_Hz LPUART clock source frequency in HZ. - * retval kStatus_LPUART_BaudrateNotSupport Baudrate is not support in current clock source. - * retval kStatus_Success LPUART initialize succeed - */ -status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz) -{ - assert(NULL != config); - assert(0U < config->baudRate_Bps); -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) >= config->txFifoWatermark); - assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) >= config->rxFifoWatermark); -#endif - - status_t status = kStatus_Success; - uint32_t temp; - uint16_t sbr, sbrTemp; - uint8_t osr, osrTemp; - uint32_t tempDiff, calculatedBaud, baudDiff; - - /* This LPUART instantiation uses a slightly different baud rate calculation - * The idea is to use the best OSR (over-sampling rate) possible - * Note, OSR is typically hard-set to 16 in other LPUART instantiations - * loop to find the best OSR value possible, one that generates minimum baudDiff - * iterate through the rest of the supported values of OSR */ - - baudDiff = config->baudRate_Bps; - osr = 0U; - sbr = 0U; - for (osrTemp = 4U; osrTemp <= 32U; osrTemp++) - { - /* calculate the temporary sbr value */ - sbrTemp = (uint16_t)((srcClock_Hz * 10U / (config->baudRate_Bps * (uint32_t)osrTemp) + 5U) / 10U); - /*set sbrTemp to 1 if the sourceClockInHz can not satisfy the desired baud rate*/ - if (sbrTemp == 0U) - { - sbrTemp = 1U; - } - /* Calculate the baud rate based on the temporary OSR and SBR values */ - calculatedBaud = (srcClock_Hz / ((uint32_t)osrTemp * (uint32_t)sbrTemp)); - tempDiff = calculatedBaud > config->baudRate_Bps ? (calculatedBaud - config->baudRate_Bps) : - (config->baudRate_Bps - calculatedBaud); - - if (tempDiff <= baudDiff) - { - baudDiff = tempDiff; - osr = osrTemp; /* update and store the best OSR value calculated */ - sbr = sbrTemp; /* update store the best SBR value calculated */ - } - } - - /* Check to see if actual baud rate is within 3% of desired baud rate - * based on the best calculate OSR value */ - if (baudDiff > ((config->baudRate_Bps / 100U) * 3U)) - { - /* Unacceptable baud rate difference of more than 3%*/ - status = kStatus_LPUART_BaudrateNotSupport; - } - else - { -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - - uint32_t instance = LPUART_GetInstance(base); - - /* Enable lpuart clock */ - (void)CLOCK_EnableClock(s_lpuartClock[instance]); -#if defined(LPUART_PERIPH_CLOCKS) - (void)CLOCK_EnableClock(s_lpuartPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_LPUART_HAS_GLOBAL) && FSL_FEATURE_LPUART_HAS_GLOBAL - /*Reset all internal logic and registers, except the Global Register */ - LPUART_SoftwareReset(base); -#else - /* Disable LPUART TX RX before setting. */ - base->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); -#endif - - temp = base->BAUD; - - /* Acceptable baud rate, check if OSR is between 4x and 7x oversampling. - * If so, then "BOTHEDGE" sampling must be turned on */ - if ((osr > 3U) && (osr < 8U)) - { - temp |= LPUART_BAUD_BOTHEDGE_MASK; - } - - /* program the osr value (bit value is one less than actual value) */ - temp &= ~LPUART_BAUD_OSR_MASK; - temp |= LPUART_BAUD_OSR((uint32_t)osr - 1UL); - - /* write the sbr value to the BAUD registers */ - temp &= ~LPUART_BAUD_SBR_MASK; - base->BAUD = temp | LPUART_BAUD_SBR(sbr); - - /* Set bit count and parity mode. */ - base->BAUD &= ~LPUART_BAUD_M10_MASK; - - temp = base->CTRL & ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK | LPUART_CTRL_ILT_MASK | - LPUART_CTRL_IDLECFG_MASK); - - temp |= (uint8_t)config->parityMode | LPUART_CTRL_IDLECFG(config->rxIdleConfig) | - LPUART_CTRL_ILT(config->rxIdleType); - -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - if (kLPUART_SevenDataBits == config->dataBitsCount) - { - if (kLPUART_ParityDisabled != config->parityMode) - { - temp &= ~LPUART_CTRL_M7_MASK; /* Seven data bits and one parity bit */ - } - else - { - temp |= LPUART_CTRL_M7_MASK; - } - } - else -#endif - { - if (kLPUART_ParityDisabled != config->parityMode) - { - temp |= LPUART_CTRL_M_MASK; /* Eight data bits and one parity bit */ - } - } - - base->CTRL = temp; - -#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT - /* set stop bit per char */ - temp = base->BAUD & ~LPUART_BAUD_SBNS_MASK; - base->BAUD = temp | LPUART_BAUD_SBNS((uint8_t)config->stopBitCount); -#endif - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Set tx/rx WATER watermark - Note: - Take care of the RX FIFO, RX interrupt request only assert when received bytes - equal or more than RX water mark, there is potential issue if RX water - mark larger than 1. - For example, if RX FIFO water mark is 2, upper layer needs 5 bytes and - 5 bytes are received. the last byte will be saved in FIFO but not trigger - RX interrupt because the water mark is 2. - */ - base->WATER = (((uint32_t)(config->rxFifoWatermark) << 16U) | config->txFifoWatermark); - - /* Enable tx/rx FIFO */ - base->FIFO |= (LPUART_FIFO_TXFE_MASK | LPUART_FIFO_RXFE_MASK); - - /* Flush FIFO */ - base->FIFO |= (LPUART_FIFO_TXFLUSH_MASK | LPUART_FIFO_RXFLUSH_MASK); -#endif - - /* Clear all status flags */ - temp = (LPUART_STAT_RXEDGIF_MASK | LPUART_STAT_IDLE_MASK | LPUART_STAT_OR_MASK | LPUART_STAT_NF_MASK | - LPUART_STAT_FE_MASK | LPUART_STAT_PF_MASK); - -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - temp |= LPUART_STAT_LBKDIF_MASK; -#endif - -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - temp |= (LPUART_STAT_MA1F_MASK | LPUART_STAT_MA2F_MASK); -#endif - -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT - /* Set the CTS configuration/TX CTS source. */ - base->MODIR |= LPUART_MODIR_TXCTSC(config->txCtsConfig) | LPUART_MODIR_TXCTSSRC(config->txCtsSource); - if (true == config->enableRxRTS) - { - /* Enable the receiver RTS(request-to-send) function. */ - base->MODIR |= LPUART_MODIR_RXRTSE_MASK; - } - if (true == config->enableTxCTS) - { - /* Enable the CTS(clear-to-send) function. */ - base->MODIR |= LPUART_MODIR_TXCTSE_MASK; - } -#endif - - /* Set data bits order. */ - if (true == config->isMsb) - { - temp |= LPUART_STAT_MSBF_MASK; - } - else - { - temp &= ~LPUART_STAT_MSBF_MASK; - } - - base->STAT |= temp; - - /* Enable TX/RX base on configure structure. */ - temp = base->CTRL; - if (true == config->enableTx) - { - temp |= LPUART_CTRL_TE_MASK; - } - - if (true == config->enableRx) - { - temp |= LPUART_CTRL_RE_MASK; - } - - base->CTRL = temp; - } - - return status; -} -/*! - * brief Deinitializes a LPUART instance. - * - * This function waits for transmit to complete, disables TX and RX, and disables the LPUART clock. - * - * param base LPUART peripheral base address. - */ -void LPUART_Deinit(LPUART_Type *base) -{ - uint32_t temp; - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Wait tx FIFO send out*/ - while (0U != ((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXWATER_SHIFT)) - { - } -#endif - /* Wait last char shift out */ - while (0U == (base->STAT & LPUART_STAT_TC_MASK)) - { - } - - /* Clear all status flags */ - temp = (LPUART_STAT_RXEDGIF_MASK | LPUART_STAT_IDLE_MASK | LPUART_STAT_OR_MASK | LPUART_STAT_NF_MASK | - LPUART_STAT_FE_MASK | LPUART_STAT_PF_MASK); - -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - temp |= LPUART_STAT_LBKDIF_MASK; -#endif - -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - temp |= (LPUART_STAT_MA1F_MASK | LPUART_STAT_MA2F_MASK); -#endif - - base->STAT |= temp; - - /* Disable the module. */ - base->CTRL = 0U; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = LPUART_GetInstance(base); - - /* Disable lpuart clock */ - (void)CLOCK_DisableClock(s_lpuartClock[instance]); - -#if defined(LPUART_PERIPH_CLOCKS) - (void)CLOCK_DisableClock(s_lpuartPeriphClocks[instance]); -#endif - -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets the default configuration structure. - * - * This function initializes the LPUART configuration structure to a default value. The default - * values are: - * lpuartConfig->baudRate_Bps = 115200U; - * lpuartConfig->parityMode = kLPUART_ParityDisabled; - * lpuartConfig->dataBitsCount = kLPUART_EightDataBits; - * lpuartConfig->isMsb = false; - * lpuartConfig->stopBitCount = kLPUART_OneStopBit; - * lpuartConfig->txFifoWatermark = 0; - * lpuartConfig->rxFifoWatermark = 1; - * lpuartConfig->rxIdleType = kLPUART_IdleTypeStartBit; - * lpuartConfig->rxIdleConfig = kLPUART_IdleCharacter1; - * lpuartConfig->enableTx = false; - * lpuartConfig->enableRx = false; - * - * param config Pointer to a configuration structure. - */ -void LPUART_GetDefaultConfig(lpuart_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->baudRate_Bps = 115200U; - config->parityMode = kLPUART_ParityDisabled; - config->dataBitsCount = kLPUART_EightDataBits; - config->isMsb = false; -#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT - config->stopBitCount = kLPUART_OneStopBit; -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - config->txFifoWatermark = 0U; - config->rxFifoWatermark = 0U; -#endif -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT - config->enableRxRTS = false; - config->enableTxCTS = false; - config->txCtsConfig = kLPUART_CtsSampleAtStart; - config->txCtsSource = kLPUART_CtsSourcePin; -#endif - config->rxIdleType = kLPUART_IdleTypeStartBit; - config->rxIdleConfig = kLPUART_IdleCharacter1; - config->enableTx = false; - config->enableRx = false; -} - -/*! - * brief Sets the LPUART instance baudrate. - * - * This function configures the LPUART module baudrate. This function is used to update - * the LPUART module baudrate after the LPUART module is initialized by the LPUART_Init. - * code - * LPUART_SetBaudRate(LPUART1, 115200U, 20000000U); - * endcode - * - * param base LPUART peripheral base address. - * param baudRate_Bps LPUART baudrate to be set. - * param srcClock_Hz LPUART clock source frequency in HZ. - * retval kStatus_LPUART_BaudrateNotSupport Baudrate is not supported in the current clock source. - * retval kStatus_Success Set baudrate succeeded. - */ -status_t LPUART_SetBaudRate(LPUART_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) -{ - assert(0U < baudRate_Bps); - - status_t status = kStatus_Success; - uint32_t temp, oldCtrl; - uint16_t sbr, sbrTemp; - uint8_t osr, osrTemp; - uint32_t tempDiff, calculatedBaud, baudDiff; - - /* This LPUART instantiation uses a slightly different baud rate calculation - * The idea is to use the best OSR (over-sampling rate) possible - * Note, OSR is typically hard-set to 16 in other LPUART instantiations - * loop to find the best OSR value possible, one that generates minimum baudDiff - * iterate through the rest of the supported values of OSR */ - - baudDiff = baudRate_Bps; - osr = 0U; - sbr = 0U; - for (osrTemp = 4U; osrTemp <= 32U; osrTemp++) - { - /* calculate the temporary sbr value */ - sbrTemp = (uint16_t)((srcClock_Hz * 10U / (baudRate_Bps * (uint32_t)osrTemp) + 5U) / 10U); - /*set sbrTemp to 1 if the sourceClockInHz can not satisfy the desired baud rate*/ - if (sbrTemp == 0U) - { - sbrTemp = 1U; - } - /* Calculate the baud rate based on the temporary OSR and SBR values */ - calculatedBaud = srcClock_Hz / ((uint32_t)osrTemp * (uint32_t)sbrTemp); - - tempDiff = calculatedBaud > baudRate_Bps ? (calculatedBaud - baudRate_Bps) : (baudRate_Bps - calculatedBaud); - - if (tempDiff <= baudDiff) - { - baudDiff = tempDiff; - osr = osrTemp; /* update and store the best OSR value calculated */ - sbr = sbrTemp; /* update store the best SBR value calculated */ - } - } - - /* Check to see if actual baud rate is within 3% of desired baud rate - * based on the best calculate OSR value */ - if (baudDiff < (uint32_t)((baudRate_Bps / 100U) * 3U)) - { - /* Store CTRL before disable Tx and Rx */ - oldCtrl = base->CTRL; - - /* Disable LPUART TX RX before setting. */ - base->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); - - temp = base->BAUD; - - /* Acceptable baud rate, check if OSR is between 4x and 7x oversampling. - * If so, then "BOTHEDGE" sampling must be turned on */ - if ((osr > 3U) && (osr < 8U)) - { - temp |= LPUART_BAUD_BOTHEDGE_MASK; - } - - /* program the osr value (bit value is one less than actual value) */ - temp &= ~LPUART_BAUD_OSR_MASK; - temp |= LPUART_BAUD_OSR((uint32_t)osr - 1UL); - - /* write the sbr value to the BAUD registers */ - temp &= ~LPUART_BAUD_SBR_MASK; - base->BAUD = temp | LPUART_BAUD_SBR(sbr); - - /* Restore CTRL. */ - base->CTRL = oldCtrl; - } - else - { - /* Unacceptable baud rate difference of more than 3%*/ - status = kStatus_LPUART_BaudrateNotSupport; - } - - return status; -} - -/*! - * brief Enable 9-bit data mode for LPUART. - * - * This function set the 9-bit mode for LPUART module. The 9th bit is not used for parity thus can be modified by user. - * - * param base LPUART peripheral base address. - * param enable true to enable, flase to disable. - */ -void LPUART_Enable9bitMode(LPUART_Type *base, bool enable) -{ - assert(base != NULL); - - uint32_t temp = 0U; - - if (enable) - { - /* Set LPUART_CTRL_M for 9-bit mode, clear LPUART_CTRL_PE to disable parity. */ - temp = base->CTRL & ~((uint32_t)LPUART_CTRL_PE_MASK | (uint32_t)LPUART_CTRL_M_MASK); - temp |= (uint32_t)LPUART_CTRL_M_MASK; - base->CTRL = temp; - } - else - { - /* Clear LPUART_CTRL_M. */ - base->CTRL &= ~(uint32_t)LPUART_CTRL_M_MASK; - } -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - /* Clear LPUART_CTRL_M7 to disable 7-bit mode. */ - base->CTRL &= ~(uint32_t)LPUART_CTRL_M7_MASK; -#endif -#if defined(FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT - /* Clear LPUART_BAUD_M10 to disable 10-bit mode. */ - base->BAUD &= ~(uint32_t)LPUART_BAUD_M10_MASK; -#endif -} - -/*! - * brief Transmit an address frame in 9-bit data mode. - * - * param base LPUART peripheral base address. - * param address LPUART slave address. - */ -void LPUART_SendAddress(LPUART_Type *base, uint8_t address) -{ - assert(base != NULL); - - uint32_t temp = base->DATA & 0xFFFFFC00UL; - temp |= ((uint32_t)address | (1UL << LPUART_DATA_R8T8_SHIFT)); - base->DATA = temp; -} - -/*! - * brief Enables LPUART interrupts according to a provided mask. - * - * This function enables the LPUART interrupts according to a provided mask. The mask - * is a logical OR of enumeration members. See the ref _lpuart_interrupt_enable. - * This examples shows how to enable TX empty interrupt and RX full interrupt: - * code - * LPUART_EnableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); - * endcode - * - * param base LPUART peripheral base address. - * param mask The interrupts to enable. Logical OR of ref _uart_interrupt_enable. - */ -void LPUART_EnableInterrupts(LPUART_Type *base, uint32_t mask) -{ - /* Only consider the real interrupt enable bits. */ - mask &= (uint32_t)kLPUART_AllInterruptEnable; - - /* Check int enable bits in base->BAUD */ - uint32_t tempReg = base->BAUD; -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - tempReg |= ((mask << 8U) & LPUART_BAUD_LBKDIE_MASK); - /* Clear bit 7 from mask */ - mask &= ~(uint32_t)kLPUART_LinBreakInterruptEnable; -#endif - tempReg |= ((mask << 8U) & LPUART_BAUD_RXEDGIE_MASK); - /* Clear bit 6 from mask */ - mask &= ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable; - base->BAUD = tempReg; - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Check int enable bits in base->FIFO */ - base->FIFO = (base->FIFO & ~(LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) | - (mask & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); - /* Clear bit 9 and bit 8 from mask */ - mask &= ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable); -#endif - - /* Check int enable bits in base->CTRL */ - base->CTRL |= mask; -} - -/*! - * brief Disables LPUART interrupts according to a provided mask. - * - * This function disables the LPUART interrupts according to a provided mask. The mask - * is a logical OR of enumeration members. See ref _lpuart_interrupt_enable. - * This example shows how to disable the TX empty interrupt and RX full interrupt: - * code - * LPUART_DisableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); - * endcode - * - * param base LPUART peripheral base address. - * param mask The interrupts to disable. Logical OR of ref _lpuart_interrupt_enable. - */ -void LPUART_DisableInterrupts(LPUART_Type *base, uint32_t mask) -{ - /* Only consider the real interrupt enable bits. */ - mask &= (uint32_t)kLPUART_AllInterruptEnable; - /* Check int enable bits in base->BAUD */ - uint32_t tempReg = base->BAUD; -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - tempReg &= ~((mask << 8U) & LPUART_BAUD_LBKDIE_MASK); - /* Clear bit 7 from mask */ - mask &= ~(uint32_t)kLPUART_LinBreakInterruptEnable; -#endif - tempReg &= ~((mask << 8U) & LPUART_BAUD_RXEDGIE_MASK); - /* Clear bit 6 from mask */ - mask &= ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable; - base->BAUD = tempReg; - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Check int enable bits in base->FIFO */ - base->FIFO = (base->FIFO & ~(LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) & - ~(mask & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); - /* Clear bit 9 and bit 8 from mask */ - mask &= ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable); -#endif - - /* Check int enable bits in base->CTRL */ - base->CTRL &= ~mask; -} - -/*! - * brief Gets enabled LPUART interrupts. - * - * This function gets the enabled LPUART interrupts. The enabled interrupts are returned - * as the logical OR value of the enumerators ref _lpuart_interrupt_enable. To check - * a specific interrupt enable status, compare the return value with enumerators - * in ref _lpuart_interrupt_enable. - * For example, to check whether the TX empty interrupt is enabled: - * code - * uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(LPUART1); - * - * if (kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts) - * { - * ... - * } - * endcode - * - * param base LPUART peripheral base address. - * return LPUART interrupt flags which are logical OR of the enumerators in ref _lpuart_interrupt_enable. - */ -uint32_t LPUART_GetEnabledInterrupts(LPUART_Type *base) -{ - /* Check int enable bits in base->CTRL */ - uint32_t temp = (uint32_t)(base->CTRL & (uint32_t)kLPUART_AllInterruptEnable); - - /* Check int enable bits in base->BAUD */ - temp = (temp & ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable) | ((base->BAUD & LPUART_BAUD_RXEDGIE_MASK) >> 8U); -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - temp = (temp & ~(uint32_t)kLPUART_LinBreakInterruptEnable) | ((base->BAUD & LPUART_BAUD_LBKDIE_MASK) >> 8U); -#endif - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Check int enable bits in base->FIFO */ - temp = - (temp & ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable)) | - (base->FIFO & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); -#endif - - return temp; -} - -/*! - * brief Gets LPUART status flags. - * - * This function gets all LPUART status flags. The flags are returned as the logical - * OR value of the enumerators ref _lpuart_flags. To check for a specific status, - * compare the return value with enumerators in the ref _lpuart_flags. - * For example, to check whether the TX is empty: - * code - * if (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(LPUART1)) - * { - * ... - * } - * endcode - * - * param base LPUART peripheral base address. - * return LPUART status flags which are ORed by the enumerators in the _lpuart_flags. - */ -uint32_t LPUART_GetStatusFlags(LPUART_Type *base) -{ - uint32_t temp; - temp = base->STAT; -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - temp |= (base->FIFO & - (LPUART_FIFO_TXEMPT_MASK | LPUART_FIFO_RXEMPT_MASK | LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) >> - 16U; -#endif - /* Only keeps the status bits */ - temp &= (uint32_t)kLPUART_AllFlags; - return temp; -} - -/*! - * brief Clears status flags with a provided mask. - * - * This function clears LPUART status flags with a provided mask. Automatically cleared flags - * can't be cleared by this function. - * Flags that can only cleared or set by hardware are: - * kLPUART_TxDataRegEmptyFlag, kLPUART_TransmissionCompleteFlag, kLPUART_RxDataRegFullFlag, - * kLPUART_RxActiveFlag, kLPUART_NoiseErrorInRxDataRegFlag, kLPUART_ParityErrorInRxDataRegFlag, - * kLPUART_TxFifoEmptyFlag,kLPUART_RxFifoEmptyFlag - * Note: This API should be called when the Tx/Rx is idle, otherwise it takes no effects. - * - * param base LPUART peripheral base address. - * param mask the status flags to be cleared. The user can use the enumerators in the - * _lpuart_status_flag_t to do the OR operation and get the mask. - * return 0 succeed, others failed. - * retval kStatus_LPUART_FlagCannotClearManually The flag can't be cleared by this function but - * it is cleared automatically by hardware. - * retval kStatus_Success Status in the mask are cleared. - */ -status_t LPUART_ClearStatusFlags(LPUART_Type *base, uint32_t mask) -{ - uint32_t temp; - status_t status; - - /* Only deal with the clearable flags */ - mask &= (uint32_t)kLPUART_AllClearFlags; -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Status bits in FIFO register */ - if ((mask & ((uint32_t)kLPUART_TxFifoOverflowFlag | (uint32_t)kLPUART_RxFifoUnderflowFlag)) != 0U) - { - /* Get the FIFO register value and mask the rx/tx FIFO flush bits and the status bits that can be W1C in case - they are written 1 accidentally. */ - temp = (uint32_t)base->FIFO; - temp &= (uint32_t)( - ~(LPUART_FIFO_TXFLUSH_MASK | LPUART_FIFO_RXFLUSH_MASK | LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)); - temp |= (mask << 16U) & (LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK); - base->FIFO = temp; - } -#endif - /* Status bits in STAT register */ - /* First get the STAT register value and mask all the bits that not represent status, then OR with the status bit - * that is to be W1C */ - temp = (base->STAT & 0x3E000000UL) | mask; - base->STAT = temp; - /* If some flags still pending. */ - if (0U != (mask & LPUART_GetStatusFlags(base))) - { - status = kStatus_LPUART_FlagCannotClearManually; - } - else - { - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Writes to the transmitter register using a blocking method. - * - * This function polls the transmitter register, first waits for the register to be empty or TX FIFO to have room, - * and writes data to the transmitter buffer, then waits for the data to be sent out to bus. - * - * param base LPUART peripheral base address. - * param data Start address of the data to write. - * param length Size of the data to write. - * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. - * retval kStatus_Success Successfully wrote all data. - */ -status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length) -{ - assert(NULL != data); - - const uint8_t *dataAddress = data; - size_t transferSize = length; - -#if UART_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != transferSize) - { -#if UART_RETRY_TIMES - waitTimes = UART_RETRY_TIMES; - while ((0U == (base->STAT & LPUART_STAT_TDRE_MASK)) && (0U != --waitTimes)) -#else - while (0U == (base->STAT & LPUART_STAT_TDRE_MASK)) -#endif - { - } -#if UART_RETRY_TIMES - if (0U == waitTimes) - { - return kStatus_LPUART_Timeout; - } -#endif - base->DATA = *(dataAddress); - dataAddress++; - transferSize--; - } - /* Ensure all the data in the transmit buffer are sent out to bus. */ -#if UART_RETRY_TIMES - waitTimes = UART_RETRY_TIMES; - while ((0U == (base->STAT & LPUART_STAT_TC_MASK)) && (0U != --waitTimes)) -#else - while (0U == (base->STAT & LPUART_STAT_TC_MASK)) -#endif - { - } -#if UART_RETRY_TIMES - if (0U == waitTimes) - { - return kStatus_LPUART_Timeout; - } -#endif - return kStatus_Success; -} - -/*! - * brief Reads the receiver data register using a blocking method. - * - * This function polls the receiver register, waits for the receiver register full or receiver FIFO - * has data, and reads data from the TX register. - * - * param base LPUART peripheral base address. - * param data Start address of the buffer to store the received data. - * param length Size of the buffer. - * retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. - * retval kStatus_LPUART_NoiseError Noise error happened while receiving data. - * retval kStatus_LPUART_FramingError Framing error happened while receiving data. - * retval kStatus_LPUART_ParityError Parity error happened while receiving data. - * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. - * retval kStatus_Success Successfully received all data. - */ -status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length) -{ - assert(NULL != data); - - status_t status = kStatus_Success; - uint32_t statusFlag; - uint8_t *dataAddress = data; - -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - uint32_t ctrl = base->CTRL; - bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || - (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); -#endif - -#if UART_RETRY_TIMES - uint32_t waitTimes; -#endif - - while (0U != (length--)) - { -#if UART_RETRY_TIMES - waitTimes = UART_RETRY_TIMES; -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - while (0U == ((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)) -#else - while (0U == (base->STAT & LPUART_STAT_RDRF_MASK)) -#endif - { -#if UART_RETRY_TIMES - if (0U == --waitTimes) - { - status = kStatus_LPUART_Timeout; - break; - } -#endif - statusFlag = LPUART_GetStatusFlags(base); - - if (0U != (statusFlag & (uint32_t)kLPUART_RxOverrunFlag)) - { - status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_RxOverrunFlag)) ? - (kStatus_LPUART_RxHardwareOverrun) : - (kStatus_LPUART_FlagCannotClearManually)); - /* Other error flags(FE, NF, and PF) are prevented from setting once OR is set, no need to check other - * error flags*/ - break; - } - - if (0U != (statusFlag & (uint32_t)kLPUART_ParityErrorFlag)) - { - status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_ParityErrorFlag)) ? - (kStatus_LPUART_ParityError) : - (kStatus_LPUART_FlagCannotClearManually)); - } - - if (0U != (statusFlag & (uint32_t)kLPUART_FramingErrorFlag)) - { - status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_FramingErrorFlag)) ? - (kStatus_LPUART_FramingError) : - (kStatus_LPUART_FlagCannotClearManually)); - } - - if (0U != (statusFlag & (uint32_t)kLPUART_NoiseErrorFlag)) - { - status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_NoiseErrorFlag)) ? - (kStatus_LPUART_NoiseError) : - (kStatus_LPUART_FlagCannotClearManually)); - } - if (kStatus_Success != status) - { - break; - } - } - - if (kStatus_Success == status) - { -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - if (isSevenDataBits) - { - *(dataAddress) = (uint8_t)(base->DATA & 0x7FU); - dataAddress++; - } - else - { - *(dataAddress) = (uint8_t)base->DATA; - dataAddress++; - } -#else - *(dataAddress) = (uint8_t)base->DATA; - dataAddress++; -#endif - } - else - { - break; - } - } - - return status; -} - -/*! - * brief Initializes the LPUART handle. - * - * This function initializes the LPUART handle, which can be used for other LPUART - * transactional APIs. Usually, for a specified LPUART instance, - * call this API once to get the initialized handle. - * - * The LPUART driver supports the "background" receiving, which means that user can set up - * an RX ring buffer optionally. Data received is stored into the ring buffer even when the - * user doesn't call the LPUART_TransferReceiveNonBlocking() API. If there is already data received - * in the ring buffer, the user can get the received data from the ring buffer directly. - * The ring buffer is disabled if passing NULL as p ringBuffer. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param callback Callback function. - * param userData User data. - */ -void LPUART_TransferCreateHandle(LPUART_Type *base, - lpuart_handle_t *handle, - lpuart_transfer_callback_t callback, - void *userData) -{ - assert(NULL != handle); - - uint32_t instance; - -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - uint32_t ctrl = base->CTRL; - bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || - (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); -#endif - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(lpuart_handle_t)); - - /* Set the TX/RX state. */ - handle->rxState = (uint8_t)kLPUART_RxIdle; - handle->txState = (uint8_t)kLPUART_TxIdle; - - /* Set the callback and user data. */ - handle->callback = callback; - handle->userData = userData; - -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - /* Initial seven data bits flag */ - handle->isSevenDataBits = isSevenDataBits; -#endif - - /* Get instance from peripheral base address. */ - instance = LPUART_GetInstance(base); - - /* Save the handle in global variables to support the double weak mechanism. */ - s_lpuartHandle[instance] = handle; - - s_lpuartIsr = LPUART_TransferHandleIRQ; - -/* Enable interrupt in NVIC. */ -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ - (void)EnableIRQ(s_lpuartRxIRQ[instance]); - (void)EnableIRQ(s_lpuartTxIRQ[instance]); -#else - (void)EnableIRQ(s_lpuartIRQ[instance]); -#endif -} - -/*! - * brief Sets up the RX ring buffer. - * - * This function sets up the RX ring buffer to a specific UART handle. - * - * When the RX ring buffer is used, data received is stored into the ring buffer even when - * the user doesn't call the UART_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 RX ring buffer, one byte is reserved for internal use. In other - * words, if p ringBufferSize is 32, then only 31 bytes are used for saving data. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. - * param ringBufferSize size of the ring buffer. - */ -void LPUART_TransferStartRingBuffer(LPUART_Type *base, - lpuart_handle_t *handle, - uint8_t *ringBuffer, - size_t ringBufferSize) -{ - assert(NULL != handle); - assert(NULL != ringBuffer); - - /* Setup the ring buffer address */ - handle->rxRingBuffer = ringBuffer; - handle->rxRingBufferSize = ringBufferSize; - handle->rxRingBufferHead = 0U; - handle->rxRingBufferTail = 0U; - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. */ - uint32_t irqMask = DisableGlobalIRQ(); - /* Enable the interrupt to accept the data when user need the ring buffer. */ - base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); -} - -/*! - * brief Aborts the background transfer and uninstalls the ring buffer. - * - * This function aborts the background transfer and uninstalls the ring buffer. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - */ -void LPUART_TransferStopRingBuffer(LPUART_Type *base, lpuart_handle_t *handle) -{ - assert(NULL != handle); - - if (handle->rxState == (uint8_t)kLPUART_RxIdle) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. - */ - uint32_t irqMask = DisableGlobalIRQ(); - base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - } - - handle->rxRingBuffer = NULL; - handle->rxRingBufferSize = 0U; - handle->rxRingBufferHead = 0U; - handle->rxRingBufferTail = 0U; -} - -/*! - * brief Transmits a buffer of data using the interrupt method. - * - * This function send data using an interrupt method. This is a non-blocking function, which - * returns directly without waiting for all data written to the transmitter register. When - * all data is written to the TX register in the ISR, the LPUART driver calls the callback - * function and passes the ref kStatus_LPUART_TxIdle as status parameter. - * - * note The kStatus_LPUART_TxIdle is passed to the upper layer when all data are written - * to the TX register. However, there is no check to ensure that all the data sent out. Before disabling the TX, - * check the kLPUART_TransmissionCompleteFlag to ensure that the transmit is finished. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param xfer LPUART transfer structure, see #lpuart_transfer_t. - * retval kStatus_Success Successfully start the data transmission. - * retval kStatus_LPUART_TxBusy Previous transmission still not finished, data not all written to the TX register. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_TransferSendNonBlocking(LPUART_Type *base, lpuart_handle_t *handle, lpuart_transfer_t *xfer) -{ - assert(NULL != handle); - assert(NULL != xfer); - assert(NULL != xfer->txData); - assert(0U != xfer->dataSize); - - status_t status; - - /* Return error if current TX busy. */ - if ((uint8_t)kLPUART_TxBusy == handle->txState) - { - status = kStatus_LPUART_TxBusy; - } - else - { - handle->txData = xfer->txData; - handle->txDataSize = xfer->dataSize; - handle->txDataSizeAll = xfer->dataSize; - handle->txState = (uint8_t)kLPUART_TxBusy; - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. - */ - uint32_t irqMask = DisableGlobalIRQ(); - /* Enable transmitter interrupt. */ - base->CTRL |= (uint32_t)LPUART_CTRL_TIE_MASK; - EnableGlobalIRQ(irqMask); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the interrupt-driven data transmit. - * - * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out - * how many bytes are not sent out. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - */ -void LPUART_TransferAbortSend(LPUART_Type *base, lpuart_handle_t *handle) -{ - assert(NULL != handle); - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. */ - uint32_t irqMask = DisableGlobalIRQ(); - base->CTRL &= ~(uint32_t)(LPUART_CTRL_TIE_MASK | LPUART_CTRL_TCIE_MASK); - EnableGlobalIRQ(irqMask); - - handle->txDataSize = 0; - handle->txState = (uint8_t)kLPUART_TxIdle; -} - -/*! - * brief Gets the number of bytes that have been sent out to bus. - * - * This function gets the number of bytes that have been sent out to bus by an interrupt method. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param count Send bytes count. - * retval kStatus_NoTransferInProgress No send in progress. - * retval kStatus_InvalidArgument Parameter is invalid. - * retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetSendCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count) -{ - assert(NULL != handle); - assert(NULL != count); - - status_t status = kStatus_Success; - size_t tmptxDataSize = handle->txDataSize; - - if ((uint8_t)kLPUART_TxIdle == handle->txState) - { - status = kStatus_NoTransferInProgress; - } - else - { -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - *count = handle->txDataSizeAll - tmptxDataSize - - ((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); -#else - if ((base->STAT & (uint32_t)kLPUART_TxDataRegEmptyFlag) != 0U) - { - *count = handle->txDataSizeAll - tmptxDataSize; - } - else - { - *count = handle->txDataSizeAll - tmptxDataSize - 1U; - } -#endif - } - - return status; -} - -/*! - * brief Receives a buffer of data using the interrupt method. - * - * This function receives data using an interrupt method. This is a non-blocking function - * which returns without waiting to ensure that all data are received. - * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and - * the parameter p receivedBytes shows how many bytes are copied from the ring buffer. - * After copying, if the data in the ring buffer is not enough for read, the receive - * request is saved by the LPUART driver. When the new data arrives, the receive request - * is serviced first. When all data is received, the LPUART driver notifies the upper layer - * through a callback function and passes a status parameter ref kStatus_UART_RxIdle. - * For example, the upper layer needs 10 bytes but there are only 5 bytes in ring buffer. - * The 5 bytes are copied to xfer->data, which returns with the - * parameter p receivedBytes set to 5. For the remaining 5 bytes, the newly arrived data is - * saved from xfer->data[5]. When 5 bytes are received, the LPUART 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 xfer->data. When all data is received, the upper layer is notified. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param xfer LPUART transfer structure, see #uart_transfer_t. - * param receivedBytes Bytes received from the ring buffer directly. - * retval kStatus_Success Successfully queue the transfer into the transmit queue. - * retval kStatus_LPUART_RxBusy Previous receive request is not finished. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_TransferReceiveNonBlocking(LPUART_Type *base, - lpuart_handle_t *handle, - lpuart_transfer_t *xfer, - size_t *receivedBytes) -{ - assert(NULL != handle); - assert(NULL != xfer); - assert(NULL != xfer->rxData); - assert(0U != xfer->dataSize); - - uint32_t i; - status_t status; - uint32_t irqMask; - /* How many bytes to copy from ring buffer to user memory. */ - size_t bytesToCopy = 0U; - /* How many bytes to receive. */ - size_t bytesToReceive; - /* How many bytes currently have received. */ - size_t bytesCurrentReceived; - - /* How to get data: - 1. If RX ring buffer is not enabled, then save xfer->data and xfer->dataSize - to lpuart handle, enable interrupt to store received data to xfer->data. When - all data received, trigger callback. - 2. If RX ring buffer is enabled and not empty, get data from ring buffer first. - If there are enough data in ring buffer, copy them to xfer->data and return. - If there are not enough data in ring buffer, copy all of them to xfer->data, - save the xfer->data remained empty space to lpuart handle, receive data - to this empty space and trigger callback when finished. */ - - if ((uint8_t)kLPUART_RxBusy == handle->rxState) - { - status = kStatus_LPUART_RxBusy; - } - else - { - bytesToReceive = xfer->dataSize; - bytesCurrentReceived = 0; - - /* If RX ring buffer is used. */ - if (NULL != handle->rxRingBuffer) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - /* Disable LPUART RX IRQ, protect ring buffer. */ - base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - - /* How many bytes in RX ring buffer currently. */ - bytesToCopy = LPUART_TransferGetRxRingBufferLength(base, handle); - - if (0U != bytesToCopy) - { - bytesToCopy = MIN(bytesToReceive, bytesToCopy); - - bytesToReceive -= bytesToCopy; - - /* Copy data from ring buffer to user memory. */ - for (i = 0U; i < bytesToCopy; i++) - { - xfer->rxData[bytesCurrentReceived] = handle->rxRingBuffer[handle->rxRingBufferTail]; - bytesCurrentReceived++; - - /* Wrap to 0. Not use modulo (%) because it might be large and slow. */ - if (((uint32_t)handle->rxRingBufferTail + 1U) == handle->rxRingBufferSize) - { - handle->rxRingBufferTail = 0U; - } - else - { - handle->rxRingBufferTail++; - } - } - } - - /* If ring buffer does not have enough data, still need to read more data. */ - if (0U != bytesToReceive) - { - /* No data in ring buffer, save the request to LPUART handle. */ - handle->rxData = &xfer->rxData[bytesCurrentReceived]; - handle->rxDataSize = bytesToReceive; - handle->rxDataSizeAll = xfer->dataSize; - handle->rxState = (uint8_t)kLPUART_RxBusy; - } - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - /* Re-enable LPUART RX IRQ. */ - base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - - /* Call user callback since all data are received. */ - if (0U == bytesToReceive) - { - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); - } - } - } - /* Ring buffer not used. */ - else - { - handle->rxData = &xfer->rxData[bytesCurrentReceived]; - handle->rxDataSize = bytesToReceive; - handle->rxDataSizeAll = bytesToReceive; - handle->rxState = (uint8_t)kLPUART_RxBusy; - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - /* Enable RX interrupt. */ - base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - } - - /* Return the how many bytes have read. */ - if (NULL != receivedBytes) - { - *receivedBytes = bytesCurrentReceived; - } - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the interrupt-driven data receiving. - * - * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out - * how many bytes not received yet. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - */ -void LPUART_TransferAbortReceive(LPUART_Type *base, lpuart_handle_t *handle) -{ - assert(NULL != handle); - - /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */ - if (NULL == handle->rxRingBuffer) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. - */ - uint32_t irqMask = DisableGlobalIRQ(); - /* Disable RX interrupt. */ - base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - } - - handle->rxDataSize = 0U; - handle->rxState = (uint8_t)kLPUART_RxIdle; -} - -/*! - * brief Gets the number of bytes that have been received. - * - * This function gets the number of bytes that have been received. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param count Receive bytes count. - * retval kStatus_NoTransferInProgress No receive in progress. - * retval kStatus_InvalidArgument Parameter is invalid. - * retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetReceiveCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count) -{ - assert(NULL != handle); - assert(NULL != count); - - status_t status = kStatus_Success; - size_t tmprxDataSize = handle->rxDataSize; - - if ((uint8_t)kLPUART_RxIdle == handle->rxState) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = handle->rxDataSizeAll - tmprxDataSize; - } - - return status; -} - -/*! - * brief LPUART IRQ handle function. - * - * This function handles the LPUART transmit and receive IRQ request. - * - * param base LPUART peripheral base address. - * param irqHandle LPUART handle pointer. - */ -void LPUART_TransferHandleIRQ(LPUART_Type *base, void *irqHandle) -{ - assert(NULL != irqHandle); - - uint8_t count; - uint8_t tempCount; - uint32_t status = LPUART_GetStatusFlags(base); - uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(base); - uint16_t tpmRxRingBufferHead; - uint32_t tpmData; - uint32_t irqMask; - lpuart_handle_t *handle = (lpuart_handle_t *)irqHandle; - - /* If RX overrun. */ - if ((uint32_t)kLPUART_RxOverrunFlag == ((uint32_t)kLPUART_RxOverrunFlag & status)) - { - /* Clear overrun flag, otherwise the RX does not work. */ - base->STAT = ((base->STAT & 0x3FE00000U) | LPUART_STAT_OR_MASK); - - /* Trigger callback. */ - if (NULL != (handle->callback)) - { - handle->callback(base, handle, kStatus_LPUART_RxHardwareOverrun, handle->userData); - } - } - - /* If IDLE flag is set and the IDLE interrupt is enabled. */ - if ((0U != ((uint32_t)kLPUART_IdleLineFlag & status)) && - (0U != ((uint32_t)kLPUART_IdleLineInterruptEnable & enabledInterrupts))) - { -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - count = ((uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)); - - while ((0U != handle->rxDataSize) && (0U != count)) - { - tempCount = (uint8_t)MIN(handle->rxDataSize, count); - - /* Using non block API to read the data from the registers. */ - LPUART_ReadNonBlocking(base, handle->rxData, tempCount); - handle->rxData = &handle->rxData[tempCount]; - handle->rxDataSize -= tempCount; - count -= tempCount; - - /* If rxDataSize is 0, invoke rx idle callback.*/ - if (0U == (handle->rxDataSize)) - { - handle->rxState = (uint8_t)kLPUART_RxIdle; - - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); - } - } - } -#endif - /* Clear IDLE flag.*/ - base->STAT = ((base->STAT & 0x3FE00000U) | LPUART_STAT_IDLE_MASK); - - /* If rxDataSize is 0, disable rx ready, overrun and idle line interrupt.*/ - if (0U == handle->rxDataSize) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); - EnableGlobalIRQ(irqMask); - } - /* Invoke callback if callback is not NULL and rxDataSize is not 0. */ - else if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_IdleLineDetected, handle->userData); - } - else - { - /* Avoid MISRA 15.7 */ - } - } - /* Receive data register full */ - if ((0U != ((uint32_t)kLPUART_RxDataRegFullFlag & status)) && - (0U != ((uint32_t)kLPUART_RxDataRegFullInterruptEnable & enabledInterrupts))) - { - /* Get the size that can be stored into buffer for this interrupt. */ -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - count = ((uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)); -#else - count = 1; -#endif - - /* If handle->rxDataSize is not 0, first save data to handle->rxData. */ - while ((0U != handle->rxDataSize) && (0U != count)) - { -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - tempCount = (uint8_t)MIN(handle->rxDataSize, count); -#else - tempCount = 1; -#endif - - /* Using non block API to read the data from the registers. */ - LPUART_ReadNonBlocking(base, handle->rxData, tempCount); - handle->rxData = &handle->rxData[tempCount]; - handle->rxDataSize -= tempCount; - count -= tempCount; - - /* If all the data required for upper layer is ready, trigger callback. */ - if (0U == handle->rxDataSize) - { - handle->rxState = (uint8_t)kLPUART_RxIdle; - - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); - } - } - } - - /* If use RX ring buffer, receive data to ring buffer. */ - if (NULL != handle->rxRingBuffer) - { - while (0U != count--) - { - /* If RX ring buffer is full, trigger callback to notify over run. */ - if (LPUART_TransferIsRxRingBufferFull(base, handle)) - { - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_RxRingBufferOverrun, handle->userData); - } - } - - /* If ring buffer is still full after callback function, the oldest data is overridden. */ - if (LPUART_TransferIsRxRingBufferFull(base, handle)) - { - /* Increase handle->rxRingBufferTail to make room for new data. */ - if (((uint32_t)handle->rxRingBufferTail + 1U) == handle->rxRingBufferSize) - { - handle->rxRingBufferTail = 0U; - } - else - { - handle->rxRingBufferTail++; - } - } - - /* Read data. */ - tpmRxRingBufferHead = handle->rxRingBufferHead; - tpmData = base->DATA; -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - if (handle->isSevenDataBits) - { - handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)(tpmData & 0x7FU); - } - else - { - handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)tpmData; - } -#else - handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)tpmData; -#endif - - /* Increase handle->rxRingBufferHead. */ - if (((uint32_t)handle->rxRingBufferHead + 1U) == handle->rxRingBufferSize) - { - handle->rxRingBufferHead = 0U; - } - else - { - handle->rxRingBufferHead++; - } - } - } - /* If no receive requst pending, stop RX interrupt. */ - else if (0U == handle->rxDataSize) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK | LPUART_CTRL_ILIE_MASK); - EnableGlobalIRQ(irqMask); - } - else - { - } - } - - /* Send data register empty and the interrupt is enabled. */ - if ((0U != ((uint32_t)kLPUART_TxDataRegEmptyFlag & status)) && - (0U != ((uint32_t)kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts))) - { -/* Get the bytes that available at this moment. */ -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - count = (uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) - - (uint8_t)((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); -#else - count = 1; -#endif - - while ((0U != handle->txDataSize) && (0U != count)) - { -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - tempCount = (uint8_t)MIN(handle->txDataSize, count); -#else - tempCount = 1; -#endif - - /* Using non block API to write the data to the registers. */ - LPUART_WriteNonBlocking(base, handle->txData, tempCount); - handle->txData = &handle->txData[tempCount]; - handle->txDataSize -= tempCount; - count -= tempCount; - - /* If all the data are written to data register, notify user with the callback, then TX finished. */ - if (0U == handle->txDataSize) - { - /* Disable and re-enable the global interrupt to protect the interrupt enable register during - * read-modify-wrte. */ - irqMask = DisableGlobalIRQ(); - /* Disable TX register empty interrupt and enable transmission completion interrupt. */ - base->CTRL = (base->CTRL & ~LPUART_CTRL_TIE_MASK) | LPUART_CTRL_TCIE_MASK; - EnableGlobalIRQ(irqMask); - } - } - } - - /* Transmission complete and the interrupt is enabled. */ - if ((0U != ((uint32_t)kLPUART_TransmissionCompleteFlag & status)) && - (0U != ((uint32_t)kLPUART_TransmissionCompleteInterruptEnable & enabledInterrupts))) - { - /* Set txState to idle only when all data has been sent out to bus. */ - handle->txState = (uint8_t)kLPUART_TxIdle; - - /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. - */ - irqMask = DisableGlobalIRQ(); - /* Disable transmission complete interrupt. */ - base->CTRL &= ~(uint32_t)LPUART_CTRL_TCIE_MASK; - EnableGlobalIRQ(irqMask); - - /* Trigger callback. */ - if (NULL != handle->callback) - { - handle->callback(base, handle, kStatus_LPUART_TxIdle, handle->userData); - } - } -} - -/*! - * brief LPUART Error IRQ handle function. - * - * This function handles the LPUART error IRQ request. - * - * param base LPUART peripheral base address. - * param irqHandle LPUART handle pointer. - */ -void LPUART_TransferHandleErrorIRQ(LPUART_Type *base, void *irqHandle) -{ - /* To be implemented by User. */ -} -#if defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1 -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART0_LPUART1_RX_DriverIRQHandler(void); -void LPUART0_LPUART1_RX_DriverIRQHandler(void) -{ - /* If handle is registered, treat the transfer function is enabled. */ - if (NULL != s_lpuartHandle[0]) - { - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - } - if (NULL != s_lpuartHandle[1]) - { - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - } - SDK_ISR_EXIT_BARRIER; -} -void LPUART0_LPUART1_TX_DriverIRQHandler(void); -void LPUART0_LPUART1_TX_DriverIRQHandler(void) -{ - /* If handle is registered, treat the transfer function is enabled. */ - if (NULL != s_lpuartHandle[0]) - { - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - } - if (NULL != s_lpuartHandle[1]) - { - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - } - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART0_LPUART1_DriverIRQHandler(void); -void LPUART0_LPUART1_DriverIRQHandler(void) -{ - /* If handle is registered, treat the transfer function is enabled. */ - if (NULL != s_lpuartHandle[0]) - { - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - } - if (NULL != s_lpuartHandle[1]) - { - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART0) -#if !(defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART0_TX_DriverIRQHandler(void); -void LPUART0_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART0_RX_DriverIRQHandler(void); -void LPUART0_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART0_DriverIRQHandler(void); -void LPUART0_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART0, s_lpuartHandle[0]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif -#endif - -#if defined(LPUART1) -#if !(defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART1_TX_DriverIRQHandler(void); -void LPUART1_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART1_RX_DriverIRQHandler(void); -void LPUART1_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART1_DriverIRQHandler(void); -void LPUART1_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART1, s_lpuartHandle[1]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif -#endif - -#if defined(LPUART2) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART2_TX_DriverIRQHandler(void); -void LPUART2_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART2, s_lpuartHandle[2]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART2_RX_DriverIRQHandler(void); -void LPUART2_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART2, s_lpuartHandle[2]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART2_DriverIRQHandler(void); -void LPUART2_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART2, s_lpuartHandle[2]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART3) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART3_TX_DriverIRQHandler(void); -void LPUART3_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART3, s_lpuartHandle[3]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART3_RX_DriverIRQHandler(void); -void LPUART3_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART3, s_lpuartHandle[3]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART3_DriverIRQHandler(void); -void LPUART3_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART3, s_lpuartHandle[3]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART4) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART4_TX_DriverIRQHandler(void); -void LPUART4_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART4, s_lpuartHandle[4]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART4_RX_DriverIRQHandler(void); -void LPUART4_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART4, s_lpuartHandle[4]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART4_DriverIRQHandler(void); -void LPUART4_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART4, s_lpuartHandle[4]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART5) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART5_TX_DriverIRQHandler(void); -void LPUART5_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART5, s_lpuartHandle[5]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART5_RX_DriverIRQHandler(void); -void LPUART5_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART5, s_lpuartHandle[5]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART5_DriverIRQHandler(void); -void LPUART5_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART5, s_lpuartHandle[5]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART6) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART6_TX_DriverIRQHandler(void); -void LPUART6_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART6, s_lpuartHandle[6]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART6_RX_DriverIRQHandler(void); -void LPUART6_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART6, s_lpuartHandle[6]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART6_DriverIRQHandler(void); -void LPUART6_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART6, s_lpuartHandle[6]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART7) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART7_TX_DriverIRQHandler(void); -void LPUART7_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART7, s_lpuartHandle[7]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART7_RX_DriverIRQHandler(void); -void LPUART7_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART7, s_lpuartHandle[7]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART7_DriverIRQHandler(void); -void LPUART7_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART7, s_lpuartHandle[7]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART8) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART8_TX_DriverIRQHandler(void); -void LPUART8_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART8, s_lpuartHandle[8]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART8_RX_DriverIRQHandler(void); -void LPUART8_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART8, s_lpuartHandle[8]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART8_DriverIRQHandler(void); -void LPUART8_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART8, s_lpuartHandle[8]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART9) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART9_TX_DriverIRQHandler(void); -void LPUART9_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART9, s_lpuartHandle[9]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART9_RX_DriverIRQHandler(void); -void LPUART9_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART9, s_lpuartHandle[9]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART9_DriverIRQHandler(void); -void LPUART9_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART9, s_lpuartHandle[9]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART10) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART10_TX_DriverIRQHandler(void); -void LPUART10_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART10, s_lpuartHandle[10]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART10_RX_DriverIRQHandler(void); -void LPUART10_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART10, s_lpuartHandle[10]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART10_DriverIRQHandler(void); -void LPUART10_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART10, s_lpuartHandle[10]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(LPUART11) -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -void LPUART11_TX_DriverIRQHandler(void); -void LPUART11_TX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART11, s_lpuartHandle[11]); - SDK_ISR_EXIT_BARRIER; -} -void LPUART11_RX_DriverIRQHandler(void); -void LPUART11_RX_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART11, s_lpuartHandle[11]); - SDK_ISR_EXIT_BARRIER; -} -#else -void LPUART11_DriverIRQHandler(void); -void LPUART11_DriverIRQHandler(void) -{ - s_lpuartIsr(LPUART11, s_lpuartHandle[11]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(CM4_0__LPUART) -void M4_0_LPUART_DriverIRQHandler(void); -void M4_0_LPUART_DriverIRQHandler(void) -{ - s_lpuartIsr(CM4_0__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4_0__LPUART)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CM4_1__LPUART) -void M4_1_LPUART_DriverIRQHandler(void); -void M4_1_LPUART_DriverIRQHandler(void) -{ - s_lpuartIsr(CM4_1__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4_1__LPUART)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(CM4__LPUART) -void M4_LPUART_DriverIRQHandler(void); -void M4_LPUART_DriverIRQHandler(void) -{ - s_lpuartIsr(CM4__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4__LPUART)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__LPUART0) -void DMA_UART0_INT_DriverIRQHandler(void); -void DMA_UART0_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(DMA__LPUART0, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART0)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__LPUART1) -void DMA_UART1_INT_DriverIRQHandler(void); -void DMA_UART1_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(DMA__LPUART1, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART1)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__LPUART2) -void DMA_UART2_INT_DriverIRQHandler(void); -void DMA_UART2_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(DMA__LPUART2, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART2)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__LPUART3) -void DMA_UART3_INT_DriverIRQHandler(void); -void DMA_UART3_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(DMA__LPUART3, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART3)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(DMA__LPUART4) -void DMA_UART4_INT_DriverIRQHandler(void); -void DMA_UART4_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(DMA__LPUART4, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART4)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__LPUART0) -void ADMA_UART0_INT_DriverIRQHandler(void); -void ADMA_UART0_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(ADMA__LPUART0, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART0)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__LPUART1) -void ADMA_UART1_INT_DriverIRQHandler(void); -void ADMA_UART1_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(ADMA__LPUART1, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART1)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__LPUART2) -void ADMA_UART2_INT_DriverIRQHandler(void); -void ADMA_UART2_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(ADMA__LPUART2, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART2)]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(ADMA__LPUART3) -void ADMA_UART3_INT_DriverIRQHandler(void); -void ADMA_UART3_INT_DriverIRQHandler(void) -{ - s_lpuartIsr(ADMA__LPUART3, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART3)]); - SDK_ISR_EXIT_BARRIER; -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart.h b/devices/MIMXRT1052/drivers/fsl_lpuart.h deleted file mode 100644 index cbd8f1f..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart.h +++ /dev/null @@ -1,1062 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPUART_H_ -#define _FSL_LPUART_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup lpuart_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPUART driver version. */ -#define FSL_LPUART_DRIVER_VERSION (MAKE_VERSION(2, 5, 1)) -/*@}*/ - -/*! @brief Retry times for waiting flag. */ -#ifndef UART_RETRY_TIMES -#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */ -#endif - -/*! @brief Error codes for the LPUART driver. */ -enum -{ - kStatus_LPUART_TxBusy = MAKE_STATUS(kStatusGroup_LPUART, 0), /*!< TX busy */ - kStatus_LPUART_RxBusy = MAKE_STATUS(kStatusGroup_LPUART, 1), /*!< RX busy */ - kStatus_LPUART_TxIdle = MAKE_STATUS(kStatusGroup_LPUART, 2), /*!< LPUART transmitter is idle. */ - kStatus_LPUART_RxIdle = MAKE_STATUS(kStatusGroup_LPUART, 3), /*!< LPUART receiver is idle. */ - kStatus_LPUART_TxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 4), /*!< TX FIFO watermark too large */ - kStatus_LPUART_RxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 5), /*!< RX FIFO watermark too large */ - kStatus_LPUART_FlagCannotClearManually = MAKE_STATUS(kStatusGroup_LPUART, 6), /*!< Some flag can't manually clear */ - kStatus_LPUART_Error = MAKE_STATUS(kStatusGroup_LPUART, 7), /*!< Error happens on LPUART. */ - kStatus_LPUART_RxRingBufferOverrun = - MAKE_STATUS(kStatusGroup_LPUART, 8), /*!< LPUART RX software ring buffer overrun. */ - kStatus_LPUART_RxHardwareOverrun = MAKE_STATUS(kStatusGroup_LPUART, 9), /*!< LPUART RX receiver overrun. */ - kStatus_LPUART_NoiseError = MAKE_STATUS(kStatusGroup_LPUART, 10), /*!< LPUART noise error. */ - kStatus_LPUART_FramingError = MAKE_STATUS(kStatusGroup_LPUART, 11), /*!< LPUART framing error. */ - kStatus_LPUART_ParityError = MAKE_STATUS(kStatusGroup_LPUART, 12), /*!< LPUART parity error. */ - kStatus_LPUART_BaudrateNotSupport = - MAKE_STATUS(kStatusGroup_LPUART, 13), /*!< Baudrate is not support in current clock source */ - kStatus_LPUART_IdleLineDetected = MAKE_STATUS(kStatusGroup_LPUART, 14), /*!< IDLE flag. */ - kStatus_LPUART_Timeout = MAKE_STATUS(kStatusGroup_LPUART, 15), /*!< LPUART times out. */ -}; - -/*! @brief LPUART parity mode. */ -typedef enum _lpuart_parity_mode -{ - kLPUART_ParityDisabled = 0x0U, /*!< Parity disabled */ - kLPUART_ParityEven = 0x2U, /*!< Parity enabled, type even, bit setting: PE|PT = 10 */ - kLPUART_ParityOdd = 0x3U, /*!< Parity enabled, type odd, bit setting: PE|PT = 11 */ -} lpuart_parity_mode_t; - -/*! @brief LPUART data bits count. */ -typedef enum _lpuart_data_bits -{ - kLPUART_EightDataBits = 0x0U, /*!< Eight data bit */ -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - kLPUART_SevenDataBits = 0x1U, /*!< Seven data bit */ -#endif -} lpuart_data_bits_t; - -/*! @brief LPUART stop bit count. */ -typedef enum _lpuart_stop_bit_count -{ - kLPUART_OneStopBit = 0U, /*!< One stop bit */ - kLPUART_TwoStopBit = 1U, /*!< Two stop bits */ -} lpuart_stop_bit_count_t; - -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT -/*! @brief LPUART transmit CTS source. */ -typedef enum _lpuart_transmit_cts_source -{ - kLPUART_CtsSourcePin = 0U, /*!< CTS resource is the LPUART_CTS pin. */ - kLPUART_CtsSourceMatchResult = 1U, /*!< CTS resource is the match result. */ -} lpuart_transmit_cts_source_t; - -/*! @brief LPUART transmit CTS configure. */ -typedef enum _lpuart_transmit_cts_config -{ - kLPUART_CtsSampleAtStart = 0U, /*!< CTS input is sampled at the start of each character. */ - kLPUART_CtsSampleAtIdle = 1U, /*!< CTS input is sampled when the transmitter is idle */ -} lpuart_transmit_cts_config_t; -#endif - -/*! @brief LPUART idle flag type defines when the receiver starts counting. */ -typedef enum _lpuart_idle_type_select -{ - kLPUART_IdleTypeStartBit = 0U, /*!< Start counting after a valid start bit. */ - kLPUART_IdleTypeStopBit = 1U, /*!< Start counting after a stop bit. */ -} lpuart_idle_type_select_t; - -/*! @brief LPUART idle detected configuration. - * This structure defines the number of idle characters that must be received before - * the IDLE flag is set. - */ -typedef enum _lpuart_idle_config -{ - kLPUART_IdleCharacter1 = 0U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter2 = 1U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter4 = 2U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter8 = 3U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter16 = 4U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter32 = 5U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter64 = 6U, /*!< the number of idle characters. */ - kLPUART_IdleCharacter128 = 7U, /*!< the number of idle characters. */ -} lpuart_idle_config_t; - -/*! - * @brief LPUART interrupt configuration structure, default settings all disabled. - * - * This structure contains the settings for all LPUART interrupt configurations. - */ -enum _lpuart_interrupt_enable -{ -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - kLPUART_LinBreakInterruptEnable = (LPUART_BAUD_LBKDIE_MASK >> 8U), /*!< LIN break detect. bit 7 */ -#endif - kLPUART_RxActiveEdgeInterruptEnable = (LPUART_BAUD_RXEDGIE_MASK >> 8U), /*!< Receive Active Edge. bit 6 */ - kLPUART_TxDataRegEmptyInterruptEnable = (LPUART_CTRL_TIE_MASK), /*!< Transmit data register empty. bit 23 */ - kLPUART_TransmissionCompleteInterruptEnable = (LPUART_CTRL_TCIE_MASK), /*!< Transmission complete. bit 22 */ - kLPUART_RxDataRegFullInterruptEnable = (LPUART_CTRL_RIE_MASK), /*!< Receiver data register full. bit 21 */ - kLPUART_IdleLineInterruptEnable = (LPUART_CTRL_ILIE_MASK), /*!< Idle line. bit 20 */ - kLPUART_RxOverrunInterruptEnable = (LPUART_CTRL_ORIE_MASK), /*!< Receiver Overrun. bit 27 */ - kLPUART_NoiseErrorInterruptEnable = (LPUART_CTRL_NEIE_MASK), /*!< Noise error flag. bit 26 */ - kLPUART_FramingErrorInterruptEnable = (LPUART_CTRL_FEIE_MASK), /*!< Framing error flag. bit 25 */ - kLPUART_ParityErrorInterruptEnable = (LPUART_CTRL_PEIE_MASK), /*!< Parity error flag. bit 24 */ -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - kLPUART_Match1InterruptEnable = (LPUART_CTRL_MA1IE_MASK), /*!< Parity error flag. bit 15 */ - kLPUART_Match2InterruptEnable = (LPUART_CTRL_MA2IE_MASK), /*!< Parity error flag. bit 14 */ -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - kLPUART_TxFifoOverflowInterruptEnable = (LPUART_FIFO_TXOFE_MASK), /*!< Transmit FIFO Overflow. bit 9 */ - kLPUART_RxFifoUnderflowInterruptEnable = (LPUART_FIFO_RXUFE_MASK), /*!< Receive FIFO Underflow. bit 8 */ -#endif - - kLPUART_AllInterruptEnable = kLPUART_RxActiveEdgeInterruptEnable | kLPUART_TxDataRegEmptyInterruptEnable | - kLPUART_TransmissionCompleteInterruptEnable | kLPUART_RxDataRegFullInterruptEnable | - kLPUART_IdleLineInterruptEnable | kLPUART_RxOverrunInterruptEnable | - kLPUART_NoiseErrorInterruptEnable | kLPUART_FramingErrorInterruptEnable | - kLPUART_ParityErrorInterruptEnable -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - | kLPUART_LinBreakInterruptEnable -#endif -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - | kLPUART_Match1InterruptEnable | kLPUART_Match2InterruptEnable -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - | kLPUART_TxFifoOverflowInterruptEnable | kLPUART_RxFifoUnderflowInterruptEnable -#endif - , -}; - -/*! - * @brief LPUART status flags. - * - * This provides constants for the LPUART status flags for use in the LPUART functions. - */ -enum _lpuart_flags -{ - kLPUART_TxDataRegEmptyFlag = - (LPUART_STAT_TDRE_MASK), /*!< Transmit data register empty flag, sets when transmit buffer is empty. bit 23 */ - kLPUART_TransmissionCompleteFlag = - (LPUART_STAT_TC_MASK), /*!< Transmission complete flag, sets when transmission activity complete. bit 22 */ - kLPUART_RxDataRegFullFlag = (LPUART_STAT_RDRF_MASK), /*!< Receive data register full flag, sets when the receive - data buffer is full. bit 21 */ - kLPUART_IdleLineFlag = (LPUART_STAT_IDLE_MASK), /*!< Idle line detect flag, sets when idle line detected. bit 20 */ - kLPUART_RxOverrunFlag = (LPUART_STAT_OR_MASK), /*!< Receive Overrun, sets when new data is received before data is - read from receive register. bit 19 */ - kLPUART_NoiseErrorFlag = (LPUART_STAT_NF_MASK), /*!< Receive takes 3 samples of each received bit. If any of these - samples differ, noise flag sets. bit 18 */ - kLPUART_FramingErrorFlag = - (LPUART_STAT_FE_MASK), /*!< Frame error flag, sets if logic 0 was detected where stop bit expected. bit 17 */ - kLPUART_ParityErrorFlag = (LPUART_STAT_PF_MASK), /*!< If parity enabled, sets upon parity error detection. bit 16 */ -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - kLPUART_LinBreakFlag = (LPUART_STAT_LBKDIF_MASK), /*!< LIN break detect interrupt flag, sets when LIN break - char detected and LIN circuit enabled. bit 31 */ -#endif - kLPUART_RxActiveEdgeFlag = (LPUART_STAT_RXEDGIF_MASK), /*!< Receive pin active edge interrupt flag, sets when active - edge detected. bit 30 */ - kLPUART_RxActiveFlag = - (LPUART_STAT_RAF_MASK), /*!< Receiver Active Flag (RAF), sets at beginning of valid start. bit 24 */ -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - kLPUART_DataMatch1Flag = - LPUART_STAT_MA1F_MASK, /*!< The next character to be read from LPUART_DATA matches MA1. bit 15 */ - kLPUART_DataMatch2Flag = - LPUART_STAT_MA2F_MASK, /*!< The next character to be read from LPUART_DATA matches MA2. bit 14 */ -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - kLPUART_TxFifoEmptyFlag = - (LPUART_FIFO_TXEMPT_MASK >> 16), /*!< TXEMPT bit, sets if transmit buffer is empty. bit 7 */ - kLPUART_RxFifoEmptyFlag = - (LPUART_FIFO_RXEMPT_MASK >> 16), /*!< RXEMPT bit, sets if receive buffer is empty. bit 6 */ - kLPUART_TxFifoOverflowFlag = - (LPUART_FIFO_TXOF_MASK >> 16), /*!< TXOF bit, sets if transmit buffer overflow occurred. bit 1 */ - kLPUART_RxFifoUnderflowFlag = - (LPUART_FIFO_RXUF_MASK >> 16), /*!< RXUF bit, sets if receive buffer underflow occurred. bit 0 */ -#endif - - kLPUART_AllClearFlags = kLPUART_RxActiveEdgeFlag | kLPUART_IdleLineFlag | kLPUART_RxOverrunFlag | - kLPUART_NoiseErrorFlag | kLPUART_FramingErrorFlag | kLPUART_ParityErrorFlag -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - | kLPUART_DataMatch1Flag | kLPUART_DataMatch2Flag -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - | kLPUART_TxFifoOverflowFlag | kLPUART_RxFifoUnderflowFlag -#endif -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - | kLPUART_LinBreakFlag -#endif - , - - kLPUART_AllFlags = - kLPUART_RxActiveEdgeFlag | kLPUART_IdleLineFlag | kLPUART_RxOverrunFlag | kLPUART_TxDataRegEmptyFlag | - kLPUART_TransmissionCompleteFlag | kLPUART_RxDataRegFullFlag | kLPUART_RxActiveFlag | kLPUART_NoiseErrorFlag | - kLPUART_FramingErrorFlag | kLPUART_ParityErrorFlag -#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING - | kLPUART_DataMatch1Flag | kLPUART_DataMatch2Flag -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - | kLPUART_TxFifoOverflowFlag | kLPUART_RxFifoUnderflowFlag | kLPUART_TxFifoEmptyFlag | kLPUART_RxFifoEmptyFlag -#endif -#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT - | kLPUART_LinBreakFlag -#endif - , -}; - -/*! @brief LPUART configuration structure. */ -typedef struct _lpuart_config -{ - uint32_t baudRate_Bps; /*!< LPUART baud rate */ - lpuart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */ - lpuart_data_bits_t dataBitsCount; /*!< Data bits count, eight (default), seven */ - bool isMsb; /*!< Data bits order, LSB (default), MSB */ -#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT - lpuart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */ -#endif -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - uint8_t txFifoWatermark; /*!< TX FIFO watermark */ - uint8_t rxFifoWatermark; /*!< RX FIFO watermark */ -#endif -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT - bool enableRxRTS; /*!< RX RTS enable */ - bool enableTxCTS; /*!< TX CTS enable */ - lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */ - lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */ -#endif - lpuart_idle_type_select_t rxIdleType; /*!< RX IDLE type. */ - lpuart_idle_config_t rxIdleConfig; /*!< RX IDLE configuration. */ - bool enableTx; /*!< Enable TX */ - bool enableRx; /*!< Enable RX */ -} lpuart_config_t; - -/*! @brief LPUART transfer structure. */ -typedef struct _lpuart_transfer -{ - /* - * Use separate TX and RX data pointer, because TX data is const data. - * The member data is kept for backward compatibility. - */ - union - { - uint8_t *data; /*!< The buffer of data to be transfer.*/ - uint8_t *rxData; /*!< The buffer to receive data. */ - const uint8_t *txData; /*!< The buffer of data to be sent. */ - }; - size_t dataSize; /*!< The byte count to be transfer. */ -} lpuart_transfer_t; - -/* Forward declaration of the handle typedef. */ -typedef struct _lpuart_handle lpuart_handle_t; - -/*! @brief LPUART transfer callback function. */ -typedef void (*lpuart_transfer_callback_t)(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData); - -/*! @brief LPUART handle structure. */ -struct _lpuart_handle -{ - const uint8_t *volatile txData; /*!< Address of remaining data to send. */ - volatile size_t txDataSize; /*!< Size of the remaining data to send. */ - size_t txDataSizeAll; /*!< Size of the data to send out. */ - uint8_t *volatile rxData; /*!< Address of remaining data to receive. */ - volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */ - size_t rxDataSizeAll; /*!< Size of the data to receive. */ - - uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */ - size_t rxRingBufferSize; /*!< Size of the ring buffer. */ - volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */ - volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */ - - lpuart_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< LPUART callback function parameter.*/ - - volatile uint8_t txState; /*!< TX transfer state. */ - volatile uint8_t rxState; /*!< RX transfer state. */ - -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - bool isSevenDataBits; /*!< Seven data bits flag. */ -#endif -}; - -/* Typedef for interrupt handler. */ -typedef void (*lpuart_isr_t)(LPUART_Type *base, void *handle); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/* Array of LPUART handle. */ -extern void *s_lpuartHandle[]; - -/* Array of LPUART IRQ number. */ -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ -extern const IRQn_Type s_lpuartTxIRQ[]; -#else -extern const IRQn_Type s_lpuartIRQ[]; -#endif - -/* LPUART ISR for transactional APIs. */ -extern lpuart_isr_t s_lpuartIsr; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* _cplusplus */ - -#if defined(FSL_FEATURE_LPUART_HAS_GLOBAL) && FSL_FEATURE_LPUART_HAS_GLOBAL - -/*! - * @name Software Reset - * @{ - */ - -/*! - * @brief Resets the LPUART using software. - * - * This function resets all internal logic and registers except the Global Register. - * Remains set until cleared by software. - * - * @param base LPUART peripheral base address. - */ -static inline void LPUART_SoftwareReset(LPUART_Type *base) -{ - base->GLOBAL |= LPUART_GLOBAL_RST_MASK; - base->GLOBAL &= ~LPUART_GLOBAL_RST_MASK; -} -/* @} */ -#endif /*FSL_FEATURE_LPUART_HAS_GLOBAL*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initializes an LPUART instance with the user configuration structure and the peripheral clock. - * - * This function configures the LPUART module with user-defined settings. Call the LPUART_GetDefaultConfig() function - * to configure the configuration structure and get the default configuration. - * The example below shows how to use this API to configure the LPUART. - * @code - * lpuart_config_t lpuartConfig; - * lpuartConfig.baudRate_Bps = 115200U; - * lpuartConfig.parityMode = kLPUART_ParityDisabled; - * lpuartConfig.dataBitsCount = kLPUART_EightDataBits; - * lpuartConfig.isMsb = false; - * lpuartConfig.stopBitCount = kLPUART_OneStopBit; - * lpuartConfig.txFifoWatermark = 0; - * lpuartConfig.rxFifoWatermark = 1; - * LPUART_Init(LPUART1, &lpuartConfig, 20000000U); - * @endcode - * - * @param base LPUART peripheral base address. - * @param config Pointer to a user-defined configuration structure. - * @param srcClock_Hz LPUART clock source frequency in HZ. - * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not support in current clock source. - * @retval kStatus_Success LPUART initialize succeed - */ -status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz); - -/*! - * @brief Deinitializes a LPUART instance. - * - * This function waits for transmit to complete, disables TX and RX, and disables the LPUART clock. - * - * @param base LPUART peripheral base address. - */ -void LPUART_Deinit(LPUART_Type *base); - -/*! - * @brief Gets the default configuration structure. - * - * This function initializes the LPUART configuration structure to a default value. The default - * values are: - * lpuartConfig->baudRate_Bps = 115200U; - * lpuartConfig->parityMode = kLPUART_ParityDisabled; - * lpuartConfig->dataBitsCount = kLPUART_EightDataBits; - * lpuartConfig->isMsb = false; - * lpuartConfig->stopBitCount = kLPUART_OneStopBit; - * lpuartConfig->txFifoWatermark = 0; - * lpuartConfig->rxFifoWatermark = 1; - * lpuartConfig->rxIdleType = kLPUART_IdleTypeStartBit; - * lpuartConfig->rxIdleConfig = kLPUART_IdleCharacter1; - * lpuartConfig->enableTx = false; - * lpuartConfig->enableRx = false; - * - * @param config Pointer to a configuration structure. - */ -void LPUART_GetDefaultConfig(lpuart_config_t *config); -/* @} */ - -/*! - * @name Module configuration - * @{ - */ -/*! - * @brief Sets the LPUART instance baudrate. - * - * This function configures the LPUART module baudrate. This function is used to update - * the LPUART module baudrate after the LPUART module is initialized by the LPUART_Init. - * @code - * LPUART_SetBaudRate(LPUART1, 115200U, 20000000U); - * @endcode - * - * @param base LPUART peripheral base address. - * @param baudRate_Bps LPUART baudrate to be set. - * @param srcClock_Hz LPUART clock source frequency in HZ. - * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not supported in the current clock source. - * @retval kStatus_Success Set baudrate succeeded. - */ -status_t LPUART_SetBaudRate(LPUART_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); - -/*! - * @brief Enable 9-bit data mode for LPUART. - * - * This function set the 9-bit mode for LPUART module. The 9th bit is not used for parity thus can be modified by user. - * - * @param base LPUART peripheral base address. - * @param enable true to enable, flase to disable. - */ -void LPUART_Enable9bitMode(LPUART_Type *base, bool enable); - -/*! - * @brief Set the LPUART address. - * - * This function configures the address for LPUART module that works as slave in 9-bit data mode. One or two address - * fields can be configured. When the address field's match enable bit is set, the frame it receices with MSB being - * 1 is considered as an address frame, otherwise it is considered as data frame. Once the address frame matches one - * of slave's own addresses, this slave is addressed. This address frame and its following data frames are stored in - * the receive buffer, otherwise the frames will be discarded. To un-address a slave, just send an address frame with - * unmatched address. - * - * @note Any LPUART instance joined in the multi-slave system can work as slave. The position of the address mark is the - * same as the parity bit when parity is enabled for 8 bit and 9 bit data formats. - * - * @param base LPUART peripheral base address. - * @param address1 LPUART slave address1. - * @param address2 LPUART slave address2. - */ -static inline void LPUART_SetMatchAddress(LPUART_Type *base, uint16_t address1, uint16_t address2) -{ - /* Configure match address. */ - uint32_t address = ((uint32_t)address2 << 16U) | (uint32_t)address1 | 0x1000100UL; - base->MATCH = address; -} - -/*! - * @brief Enable the LPUART match address feature. - * - * @param base LPUART peripheral base address. - * @param match1 true to enable match address1, false to disable. - * @param match2 true to enable match address2, false to disable. - */ -static inline void LPUART_EnableMatchAddress(LPUART_Type *base, bool match1, bool match2) -{ - /* Configure match address1 enable bit. */ - if (match1) - { - base->BAUD |= (uint32_t)LPUART_BAUD_MAEN1_MASK; - } - else - { - base->BAUD &= ~(uint32_t)LPUART_BAUD_MAEN1_MASK; - } - /* Configure match address2 enable bit. */ - if (match2) - { - base->BAUD |= (uint32_t)LPUART_BAUD_MAEN2_MASK; - } - else - { - base->BAUD &= ~(uint32_t)LPUART_BAUD_MAEN2_MASK; - } -} - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO -/*! - * @brief Sets the rx FIFO watermark. - * - * @param base LPUART peripheral base address. - * @param water Rx FIFO watermark. - */ -static inline void LPUART_SetRxFifoWatermark(LPUART_Type *base, uint8_t water) -{ - base->WATER = (base->WATER & ~LPUART_WATER_RXWATER_MASK) | LPUART_WATER_RXWATER(water); -} - -/*! - * @brief Sets the tx FIFO watermark. - * - * @param base LPUART peripheral base address. - * @param water Tx FIFO watermark. - */ -static inline void LPUART_SetTxFifoWatermark(LPUART_Type *base, uint8_t water) -{ - base->WATER = (base->WATER & ~LPUART_WATER_TXWATER_MASK) | LPUART_WATER_TXWATER(water); -} -#endif -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets LPUART status flags. - * - * This function gets all LPUART status flags. The flags are returned as the logical - * OR value of the enumerators @ref _lpuart_flags. To check for a specific status, - * compare the return value with enumerators in the @ref _lpuart_flags. - * For example, to check whether the TX is empty: - * @code - * if (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(LPUART1)) - * { - * ... - * } - * @endcode - * - * @param base LPUART peripheral base address. - * @return LPUART status flags which are ORed by the enumerators in the _lpuart_flags. - */ -uint32_t LPUART_GetStatusFlags(LPUART_Type *base); - -/*! - * @brief Clears status flags with a provided mask. - * - * This function clears LPUART status flags with a provided mask. Automatically cleared flags - * can't be cleared by this function. - * Flags that can only cleared or set by hardware are: - * kLPUART_TxDataRegEmptyFlag, kLPUART_TransmissionCompleteFlag, kLPUART_RxDataRegFullFlag, - * kLPUART_RxActiveFlag, kLPUART_NoiseErrorInRxDataRegFlag, kLPUART_ParityErrorInRxDataRegFlag, - * kLPUART_TxFifoEmptyFlag,kLPUART_RxFifoEmptyFlag - * Note: This API should be called when the Tx/Rx is idle, otherwise it takes no effects. - * - * @param base LPUART peripheral base address. - * @param mask the status flags to be cleared. The user can use the enumerators in the - * _lpuart_status_flag_t to do the OR operation and get the mask. - * @return 0 succeed, others failed. - * @retval kStatus_LPUART_FlagCannotClearManually The flag can't be cleared by this function but - * it is cleared automatically by hardware. - * @retval kStatus_Success Status in the mask are cleared. - */ -status_t LPUART_ClearStatusFlags(LPUART_Type *base, uint32_t mask); -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables LPUART interrupts according to a provided mask. - * - * This function enables the LPUART interrupts according to a provided mask. The mask - * is a logical OR of enumeration members. See the @ref _lpuart_interrupt_enable. - * This examples shows how to enable TX empty interrupt and RX full interrupt: - * @code - * LPUART_EnableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); - * @endcode - * - * @param base LPUART peripheral base address. - * @param mask The interrupts to enable. Logical OR of the enumeration _uart_interrupt_enable. - */ -void LPUART_EnableInterrupts(LPUART_Type *base, uint32_t mask); - -/*! - * @brief Disables LPUART interrupts according to a provided mask. - * - * This function disables the LPUART interrupts according to a provided mask. The mask - * is a logical OR of enumeration members. See @ref _lpuart_interrupt_enable. - * This example shows how to disable the TX empty interrupt and RX full interrupt: - * @code - * LPUART_DisableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); - * @endcode - * - * @param base LPUART peripheral base address. - * @param mask The interrupts to disable. Logical OR of @ref _lpuart_interrupt_enable. - */ -void LPUART_DisableInterrupts(LPUART_Type *base, uint32_t mask); - -/*! - * @brief Gets enabled LPUART interrupts. - * - * This function gets the enabled LPUART interrupts. The enabled interrupts are returned - * as the logical OR value of the enumerators @ref _lpuart_interrupt_enable. To check - * a specific interrupt enable status, compare the return value with enumerators - * in @ref _lpuart_interrupt_enable. - * For example, to check whether the TX empty interrupt is enabled: - * @code - * uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(LPUART1); - * - * if (kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts) - * { - * ... - * } - * @endcode - * - * @param base LPUART peripheral base address. - * @return LPUART interrupt flags which are logical OR of the enumerators in @ref _lpuart_interrupt_enable. - */ -uint32_t LPUART_GetEnabledInterrupts(LPUART_Type *base); -/* @} */ - -#if defined(FSL_FEATURE_LPUART_HAS_DMA_ENABLE) && FSL_FEATURE_LPUART_HAS_DMA_ENABLE -/*! - * @name DMA Configuration - * @{ - */ -/*! - * @brief Gets the LPUART data register address. - * - * This function returns the LPUART data register address, which is mainly used by the DMA/eDMA. - * - * @param base LPUART peripheral base address. - * @return LPUART data register addresses which are used both by the transmitter and receiver. - */ -static inline uint32_t LPUART_GetDataRegisterAddress(LPUART_Type *base) -{ - return (uint32_t) & (base->DATA); -} - -/*! - * @brief Enables or disables the LPUART transmitter DMA request. - * - * This function enables or disables the transmit data register empty flag, STAT[TDRE], to generate DMA requests. - * - * @param base LPUART peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void LPUART_EnableTxDMA(LPUART_Type *base, bool enable) -{ - if (enable) - { - base->BAUD |= LPUART_BAUD_TDMAE_MASK; - } - else - { - base->BAUD &= ~LPUART_BAUD_TDMAE_MASK; - } -} - -/*! - * @brief Enables or disables the LPUART receiver DMA. - * - * This function enables or disables the receiver data register full flag, STAT[RDRF], to generate DMA requests. - * - * @param base LPUART peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void LPUART_EnableRxDMA(LPUART_Type *base, bool enable) -{ - if (enable) - { - base->BAUD |= LPUART_BAUD_RDMAE_MASK; - } - else - { - base->BAUD &= ~LPUART_BAUD_RDMAE_MASK; - } -} -/* @} */ -#endif /* FSL_FEATURE_LPUART_HAS_DMA_ENABLE */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Get the LPUART instance from peripheral base address. - * - * @param base LPUART peripheral base address. - * @return LPUART instance. - */ -uint32_t LPUART_GetInstance(LPUART_Type *base); - -/*! - * @brief Enables or disables the LPUART transmitter. - * - * This function enables or disables the LPUART transmitter. - * - * @param base LPUART peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void LPUART_EnableTx(LPUART_Type *base, bool enable) -{ - if (enable) - { - base->CTRL |= LPUART_CTRL_TE_MASK; - } - else - { - base->CTRL &= ~LPUART_CTRL_TE_MASK; - } -} - -/*! - * @brief Enables or disables the LPUART receiver. - * - * This function enables or disables the LPUART receiver. - * - * @param base LPUART peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void LPUART_EnableRx(LPUART_Type *base, bool enable) -{ - if (enable) - { - base->CTRL |= LPUART_CTRL_RE_MASK; - } - else - { - base->CTRL &= ~LPUART_CTRL_RE_MASK; - } -} - -/*! - * @brief Writes to the transmitter register. - * - * This function writes data to the transmitter register directly. The upper layer must - * ensure that the TX register is empty or that the TX FIFO has room before calling this function. - * - * @param base LPUART peripheral base address. - * @param data Data write to the TX register. - */ -static inline void LPUART_WriteByte(LPUART_Type *base, uint8_t data) -{ - base->DATA = data; -} - -/*! - * @brief Reads the receiver register. - * - * This function reads data from the receiver register directly. The upper layer must - * ensure that the receiver register is full or that the RX FIFO has data before calling this function. - * - * @param base LPUART peripheral base address. - * @return Data read from data register. - */ -static inline uint8_t LPUART_ReadByte(LPUART_Type *base) -{ -#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT - uint32_t ctrl = base->CTRL; - uint8_t result; - bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || - (((ctrl & LPUART_CTRL_M7_MASK) == 0U) && ((ctrl & LPUART_CTRL_M_MASK) == 0U) && - ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); - - if (isSevenDataBits) - { - result = (uint8_t)(base->DATA & 0x7FU); - } - else - { - result = (uint8_t)base->DATA; - } - - return result; -#else - return (uint8_t)(base->DATA); -#endif -} - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO -/*! - * @brief Gets the rx FIFO data count. - * - * @param base LPUART peripheral base address. - * @return rx FIFO data count. - */ -static inline uint8_t LPUART_GetRxFifoCount(LPUART_Type *base) -{ - return (uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT); -} - -/*! - * @brief Gets the tx FIFO data count. - * - * @param base LPUART peripheral base address. - * @return tx FIFO data count. - */ -static inline uint8_t LPUART_GetTxFifoCount(LPUART_Type *base) -{ - return (uint8_t)((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); -} -#endif - -/*! - * @brief Transmit an address frame in 9-bit data mode. - * - * @param base LPUART peripheral base address. - * @param address LPUART slave address. - */ -void LPUART_SendAddress(LPUART_Type *base, uint8_t address); - -/*! - * @brief Writes to the transmitter register using a blocking method. - * - * This function polls the transmitter register, first waits for the register to be empty or TX FIFO to have room, - * and writes data to the transmitter buffer, then waits for the dat to be sent out to the bus. - * - * @param base LPUART peripheral base address. - * @param data Start address of the data to write. - * @param length Size of the data to write. - * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. - * @retval kStatus_Success Successfully wrote all data. - */ -status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length); - -/*! - * @brief Reads the receiver data register using a blocking method. - * - * This function polls the receiver register, waits for the receiver register full or receiver FIFO - * has data, and reads data from the TX register. - * - * @param base LPUART peripheral base address. - * @param data Start address of the buffer to store the received data. - * @param length Size of the buffer. - * @retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. - * @retval kStatus_LPUART_NoiseError Noise error happened while receiving data. - * @retval kStatus_LPUART_FramingError Framing error happened while receiving data. - * @retval kStatus_LPUART_ParityError Parity error happened while receiving data. - * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. - * @retval kStatus_Success Successfully received all data. - */ -status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length); - -/* @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the LPUART handle. - * - * This function initializes the LPUART handle, which can be used for other LPUART - * transactional APIs. Usually, for a specified LPUART instance, - * call this API once to get the initialized handle. - * - * The LPUART driver supports the "background" receiving, which means that user can set up - * an RX ring buffer optionally. Data received is stored into the ring buffer even when the - * user doesn't call the LPUART_TransferReceiveNonBlocking() API. If there is already data received - * in the ring buffer, the user can get the received data from the ring buffer directly. - * The ring buffer is disabled if passing NULL as @p ringBuffer. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param callback Callback function. - * @param userData User data. - */ -void LPUART_TransferCreateHandle(LPUART_Type *base, - lpuart_handle_t *handle, - lpuart_transfer_callback_t callback, - void *userData); -/*! - * @brief Transmits a buffer of data using the interrupt method. - * - * This function send data using an interrupt method. This is a non-blocking function, which - * returns directly without waiting for all data written to the transmitter register. When - * all data is written to the TX register in the ISR, the LPUART driver calls the callback - * function and passes the @ref kStatus_LPUART_TxIdle as status parameter. - * - * @note The kStatus_LPUART_TxIdle is passed to the upper layer when all data are written - * to the TX register. However, there is no check to ensure that all the data sent out. Before disabling the TX, - * check the kLPUART_TransmissionCompleteFlag to ensure that the transmit is finished. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param xfer LPUART transfer structure, see #lpuart_transfer_t. - * @retval kStatus_Success Successfully start the data transmission. - * @retval kStatus_LPUART_TxBusy Previous transmission still not finished, data not all written to the TX register. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_TransferSendNonBlocking(LPUART_Type *base, lpuart_handle_t *handle, lpuart_transfer_t *xfer); - -/*! - * @brief Sets up the RX ring buffer. - * - * This function sets up the RX ring buffer to a specific UART handle. - * - * When the RX ring buffer is used, data received is stored into the ring buffer even when - * the user doesn't call the UART_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 RX ring buffer, one byte is reserved for internal use. In other - * words, if @p ringBufferSize is 32, then only 31 bytes are used for saving data. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. - * @param ringBufferSize size of the ring buffer. - */ -void LPUART_TransferStartRingBuffer(LPUART_Type *base, - lpuart_handle_t *handle, - uint8_t *ringBuffer, - size_t ringBufferSize); - -/*! - * @brief Aborts the background transfer and uninstalls the ring buffer. - * - * This function aborts the background transfer and uninstalls the ring buffer. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - */ -void LPUART_TransferStopRingBuffer(LPUART_Type *base, lpuart_handle_t *handle); - -/*! - * @brief Get the length of received data in RX ring buffer. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @return Length of received data in RX ring buffer. - */ -size_t LPUART_TransferGetRxRingBufferLength(LPUART_Type *base, lpuart_handle_t *handle); - -/*! - * @brief Aborts the interrupt-driven data transmit. - * - * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out - * how many bytes are not sent out. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - */ -void LPUART_TransferAbortSend(LPUART_Type *base, lpuart_handle_t *handle); - -/*! - * @brief Gets the number of bytes that have been sent out to bus. - * - * This function gets the number of bytes that have been sent out to bus by an interrupt method. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param count Send bytes count. - * @retval kStatus_NoTransferInProgress No send in progress. - * @retval kStatus_InvalidArgument Parameter is invalid. - * @retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetSendCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); - -/*! - * @brief Receives a buffer of data using the interrupt method. - * - * This function receives data using an interrupt method. This is a non-blocking function - * which returns without waiting to ensure that all data are received. - * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and - * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer. - * After copying, if the data in the ring buffer is not enough for read, the receive - * request is saved by the LPUART driver. When the new data arrives, the receive request - * is serviced first. When all data is received, the LPUART driver notifies the upper layer - * through a callback function and passes a status parameter kStatus_UART_RxIdle. - * For example, the upper layer needs 10 bytes but there are only 5 bytes in ring buffer. - * The 5 bytes are copied to xfer->data, which returns with the - * parameter @p receivedBytes set to 5. For the remaining 5 bytes, the newly arrived data is - * saved from xfer->data[5]. When 5 bytes are received, the LPUART 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 xfer->data. When all data is received, the upper layer is notified. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param xfer LPUART transfer structure, see uart_transfer_t. - * @param receivedBytes Bytes received from the ring buffer directly. - * @retval kStatus_Success Successfully queue the transfer into the transmit queue. - * @retval kStatus_LPUART_RxBusy Previous receive request is not finished. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_TransferReceiveNonBlocking(LPUART_Type *base, - lpuart_handle_t *handle, - lpuart_transfer_t *xfer, - size_t *receivedBytes); - -/*! - * @brief Aborts the interrupt-driven data receiving. - * - * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out - * how many bytes not received yet. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - */ -void LPUART_TransferAbortReceive(LPUART_Type *base, lpuart_handle_t *handle); - -/*! - * @brief Gets the number of bytes that have been received. - * - * This function gets the number of bytes that have been received. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param count Receive bytes count. - * @retval kStatus_NoTransferInProgress No receive in progress. - * @retval kStatus_InvalidArgument Parameter is invalid. - * @retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetReceiveCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); - -/*! - * @brief LPUART IRQ handle function. - * - * This function handles the LPUART transmit and receive IRQ request. - * - * @param base LPUART peripheral base address. - * @param irqHandle LPUART handle pointer. - */ -void LPUART_TransferHandleIRQ(LPUART_Type *base, void *irqHandle); - -/*! - * @brief LPUART Error IRQ handle function. - * - * This function handles the LPUART error IRQ request. - * - * @param base LPUART peripheral base address. - * @param irqHandle LPUART handle pointer. - */ -void LPUART_TransferHandleErrorIRQ(LPUART_Type *base, void *irqHandle); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_LPUART_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart_edma.c b/devices/MIMXRT1052/drivers/fsl_lpuart_edma.c deleted file mode 100644 index 49828df..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart_edma.c +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpuart_edma.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpuart_edma" -#endif - -/*base, false); - - /* Stop transfer. */ - EDMA_AbortTransfer(handle); - - /* Enable tx complete interrupt */ - LPUART_EnableInterrupts(lpuartPrivateHandle->base, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); - } -} - -static void LPUART_ReceiveEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) -{ - assert(NULL != param); - - lpuart_edma_private_handle_t *lpuartPrivateHandle = (lpuart_edma_private_handle_t *)param; - - /* Avoid warning for unused parameters. */ - handle = handle; - tcds = tcds; - - if (transferDone) - { - /* Disable transfer. */ - LPUART_TransferAbortReceiveEDMA(lpuartPrivateHandle->base, lpuartPrivateHandle->handle); - - if (NULL != lpuartPrivateHandle->handle->callback) - { - lpuartPrivateHandle->handle->callback(lpuartPrivateHandle->base, lpuartPrivateHandle->handle, - kStatus_LPUART_RxIdle, lpuartPrivateHandle->handle->userData); - } - } -} - -/*! - * brief Initializes the LPUART handle which is used in transactional functions. - * param base LPUART peripheral base address. - * param handle Pointer to lpuart_edma_handle_t structure. - * param callback Callback function. - * param userData User data. - * param txEdmaHandle User requested DMA handle for TX DMA transfer. - * param rxEdmaHandle User requested DMA handle for RX DMA transfer. - */ -void LPUART_TransferCreateHandleEDMA(LPUART_Type *base, - lpuart_edma_handle_t *handle, - lpuart_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txEdmaHandle, - edma_handle_t *rxEdmaHandle) -{ - assert(NULL != handle); - - uint32_t instance = LPUART_GetInstance(base); - - s_lpuartEdmaPrivateHandle[instance].base = base; - s_lpuartEdmaPrivateHandle[instance].handle = handle; - - (void)memset(handle, 0, sizeof(*handle)); - - handle->rxState = (uint8_t)kLPUART_RxIdle; - handle->txState = (uint8_t)kLPUART_TxIdle; - - handle->rxEdmaHandle = rxEdmaHandle; - handle->txEdmaHandle = txEdmaHandle; - - handle->callback = callback; - handle->userData = userData; - -#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO - /* Note: - Take care of the RX FIFO, EDMA request only assert when received bytes - equal or more than RX water mark, there is potential issue if RX water - mark larger than 1. - For example, if RX FIFO water mark is 2, upper layer needs 5 bytes and - 5 bytes are received. the last byte will be saved in FIFO but not trigger - EDMA transfer because the water mark is 2. - */ - if (NULL != rxEdmaHandle) - { - base->WATER &= (~LPUART_WATER_RXWATER_MASK); - } -#endif - - /* Save the handle in global variables to support the double weak mechanism. */ - s_lpuartHandle[instance] = handle; - /* Set LPUART_TransferEdmaHandleIRQ as DMA IRQ handler */ - s_lpuartIsr = LPUART_TransferEdmaHandleIRQ; - /* Disable all LPUART internal interrupts */ - LPUART_DisableInterrupts(base, (uint32_t)kLPUART_AllInterruptEnable); - /* Enable interrupt in NVIC. */ -#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ - (void)EnableIRQ(s_lpuartTxIRQ[instance]); -#else - (void)EnableIRQ(s_lpuartIRQ[instance]); -#endif - - /* Configure TX. */ - if (NULL != txEdmaHandle) - { - EDMA_SetCallback(handle->txEdmaHandle, LPUART_SendEDMACallback, &s_lpuartEdmaPrivateHandle[instance]); - } - - /* Configure RX. */ - if (NULL != rxEdmaHandle) - { - EDMA_SetCallback(handle->rxEdmaHandle, LPUART_ReceiveEDMACallback, &s_lpuartEdmaPrivateHandle[instance]); - } -} - -/*! - * brief Sends data using eDMA. - * - * This function sends data using eDMA. This is a non-blocking function, which returns - * right away. When all data is sent, the send callback function is called. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param xfer LPUART eDMA transfer structure. See #lpuart_transfer_t. - * retval kStatus_Success if succeed, others failed. - * retval kStatus_LPUART_TxBusy Previous transfer on going. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_SendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer) -{ - assert(NULL != handle); - assert(NULL != handle->txEdmaHandle); - assert(NULL != xfer); - assert(NULL != xfer->data); - assert(0U != xfer->dataSize); - - edma_transfer_config_t xferConfig; - status_t status; - - /* If previous TX not finished. */ - if ((uint8_t)kLPUART_TxBusy == handle->txState) - { - status = kStatus_LPUART_TxBusy; - } - else - { - handle->txState = (uint8_t)kLPUART_TxBusy; - handle->txDataSizeAll = xfer->dataSize; - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, xfer->data, sizeof(uint8_t), - (void *)(uint32_t *)LPUART_GetDataRegisterAddress(base), sizeof(uint8_t), sizeof(uint8_t), - xfer->dataSize, kEDMA_MemoryToPeripheral); - - /* Store the initially configured eDMA minor byte transfer count into the LPUART handle */ - handle->nbytes = (uint8_t)sizeof(uint8_t); - - /* Submit transfer. */ - if (kStatus_Success != - EDMA_SubmitTransfer(handle->txEdmaHandle, (const edma_transfer_config_t *)(uint32_t)&xferConfig)) - { - return kStatus_Fail; - } - EDMA_StartTransfer(handle->txEdmaHandle); - - /* Enable LPUART TX EDMA. */ - LPUART_EnableTxDMA(base, true); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Receives data using eDMA. - * - * This function receives data using eDMA. This is non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * param base LPUART peripheral base address. - * param handle Pointer to lpuart_edma_handle_t structure. - * param xfer LPUART eDMA transfer structure, see #lpuart_transfer_t. - * retval kStatus_Success if succeed, others fail. - * retval kStatus_LPUART_RxBusy Previous transfer ongoing. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_ReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer) -{ - assert(NULL != handle); - assert(NULL != handle->rxEdmaHandle); - assert(NULL != xfer); - assert(NULL != xfer->data); - assert(0U != xfer->dataSize); - - edma_transfer_config_t xferConfig; - status_t status; - - /* If previous RX not finished. */ - if ((uint8_t)kLPUART_RxBusy == handle->rxState) - { - status = kStatus_LPUART_RxBusy; - } - else - { - handle->rxState = (uint8_t)kLPUART_RxBusy; - handle->rxDataSizeAll = xfer->dataSize; - - /* Prepare transfer. */ - EDMA_PrepareTransfer(&xferConfig, (void *)(uint32_t *)LPUART_GetDataRegisterAddress(base), sizeof(uint8_t), - xfer->data, sizeof(uint8_t), sizeof(uint8_t), xfer->dataSize, kEDMA_PeripheralToMemory); - - /* Store the initially configured eDMA minor byte transfer count into the LPUART handle */ - handle->nbytes = (uint8_t)sizeof(uint8_t); - - /* Submit transfer. */ - if (kStatus_Success != - EDMA_SubmitTransfer(handle->rxEdmaHandle, (const edma_transfer_config_t *)(uint32_t)&xferConfig)) - { - return kStatus_Fail; - } - EDMA_StartTransfer(handle->rxEdmaHandle); - - /* Enable LPUART RX EDMA. */ - LPUART_EnableRxDMA(base, true); - - status = kStatus_Success; - } - - return status; -} - -/*! - * brief Aborts the sent data using eDMA. - * - * This function aborts the sent data using eDMA. - * - * param base LPUART peripheral base address. - * param handle Pointer to lpuart_edma_handle_t structure. - */ -void LPUART_TransferAbortSendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle) -{ - assert(NULL != handle); - assert(NULL != handle->txEdmaHandle); - - /* Disable LPUART TX EDMA. */ - LPUART_EnableTxDMA(base, false); - - /* Stop transfer. */ - EDMA_AbortTransfer(handle->txEdmaHandle); - - handle->txState = (uint8_t)kLPUART_TxIdle; -} - -/*! - * brief Aborts the received data using eDMA. - * - * This function aborts the received data using eDMA. - * - * param base LPUART peripheral base address. - * param handle Pointer to lpuart_edma_handle_t structure. - */ -void LPUART_TransferAbortReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle) -{ - assert(NULL != handle); - assert(NULL != handle->rxEdmaHandle); - - /* Disable LPUART RX EDMA. */ - LPUART_EnableRxDMA(base, false); - - /* Stop transfer. */ - EDMA_AbortTransfer(handle->rxEdmaHandle); - - handle->rxState = (uint8_t)kLPUART_RxIdle; -} - -/*! - * brief Gets the number of received bytes. - * - * This function gets the number of received bytes. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param count Receive bytes count. - * retval kStatus_NoTransferInProgress No receive in progress. - * retval kStatus_InvalidArgument Parameter is invalid. - * retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetReceiveCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count) -{ - assert(NULL != handle); - assert(NULL != handle->rxEdmaHandle); - assert(NULL != count); - - if ((uint8_t)kLPUART_RxIdle == handle->rxState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->rxDataSizeAll - - ((uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->rxEdmaHandle->base, handle->rxEdmaHandle->channel)); - - return kStatus_Success; -} - -/*! - * brief Gets the number of bytes written to the LPUART TX register. - * - * This function gets the number of bytes written to the LPUART TX - * register by DMA. - * - * param base LPUART peripheral base address. - * param handle LPUART handle pointer. - * param count Send bytes count. - * retval kStatus_NoTransferInProgress No send in progress. - * retval kStatus_InvalidArgument Parameter is invalid. - * retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetSendCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count) -{ - assert(NULL != handle); - assert(NULL != handle->txEdmaHandle); - assert(NULL != count); - - if ((uint8_t)kLPUART_TxIdle == handle->txState) - { - return kStatus_NoTransferInProgress; - } - - *count = handle->txDataSizeAll - - ((uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->txEdmaHandle->base, handle->txEdmaHandle->channel)); - - return kStatus_Success; -} - -/*! - * brief LPUART eDMA IRQ handle function. - * - * This function handles the LPUART tx complete IRQ request and invoke user callback. - * It is not set to static so that it can be used in user application. - * - * param base LPUART peripheral base address. - * param lpuartEdmaHandle LPUART handle pointer. - */ -void LPUART_TransferEdmaHandleIRQ(LPUART_Type *base, void *lpuartEdmaHandle) -{ - assert(lpuartEdmaHandle != NULL); - - lpuart_edma_handle_t *handle = (lpuart_edma_handle_t *)lpuartEdmaHandle; - - /* Disable tx complete interrupt */ - LPUART_DisableInterrupts(base, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); - - handle->txState = (uint8_t)kLPUART_TxIdle; - - if (handle->callback != NULL) - { - handle->callback(base, handle, kStatus_LPUART_TxIdle, handle->userData); - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart_edma.h b/devices/MIMXRT1052/drivers/fsl_lpuart_edma.h deleted file mode 100644 index 8c02416..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart_edma.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_LPUART_EDMA_H_ -#define _FSL_LPUART_EDMA_H_ - -#include "fsl_lpuart.h" -#include "fsl_edma.h" - -/*! - * @addtogroup lpuart_edma_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPUART EDMA driver version. */ -#define FSL_LPUART_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) -/*@}*/ - -/* Forward declaration of the handle typedef. */ -typedef struct _lpuart_edma_handle lpuart_edma_handle_t; - -/*! @brief LPUART transfer callback function. */ -typedef void (*lpuart_edma_transfer_callback_t)(LPUART_Type *base, - lpuart_edma_handle_t *handle, - status_t status, - void *userData); - -/*! - * @brief LPUART eDMA handle - */ -struct _lpuart_edma_handle -{ - lpuart_edma_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< LPUART callback function parameter.*/ - size_t rxDataSizeAll; /*!< Size of the data to receive. */ - size_t txDataSizeAll; /*!< Size of the data to send out. */ - - edma_handle_t *txEdmaHandle; /*!< The eDMA TX channel used. */ - edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */ - - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - - volatile uint8_t txState; /*!< TX transfer state. */ - volatile uint8_t rxState; /*!< RX transfer state */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA transactional - * @{ - */ - -/*! - * @brief Initializes the LPUART handle which is used in transactional functions. - * @param base LPUART peripheral base address. - * @param handle Pointer to lpuart_edma_handle_t structure. - * @param callback Callback function. - * @param userData User data. - * @param txEdmaHandle User requested DMA handle for TX DMA transfer. - * @param rxEdmaHandle User requested DMA handle for RX DMA transfer. - */ -void LPUART_TransferCreateHandleEDMA(LPUART_Type *base, - lpuart_edma_handle_t *handle, - lpuart_edma_transfer_callback_t callback, - void *userData, - edma_handle_t *txEdmaHandle, - edma_handle_t *rxEdmaHandle); - -/*! - * @brief Sends data using eDMA. - * - * This function sends data using eDMA. This is a non-blocking function, which returns - * right away. When all data is sent, the send callback function is called. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param xfer LPUART eDMA transfer structure. See #lpuart_transfer_t. - * @retval kStatus_Success if succeed, others failed. - * @retval kStatus_LPUART_TxBusy Previous transfer on going. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_SendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer); - -/*! - * @brief Receives data using eDMA. - * - * This function receives data using eDMA. This is non-blocking function, which returns - * right away. When all data is received, the receive callback function is called. - * - * @param base LPUART peripheral base address. - * @param handle Pointer to lpuart_edma_handle_t structure. - * @param xfer LPUART eDMA transfer structure, see #lpuart_transfer_t. - * @retval kStatus_Success if succeed, others fail. - * @retval kStatus_LPUART_RxBusy Previous transfer ongoing. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t LPUART_ReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer); - -/*! - * @brief Aborts the sent data using eDMA. - * - * This function aborts the sent data using eDMA. - * - * @param base LPUART peripheral base address. - * @param handle Pointer to lpuart_edma_handle_t structure. - */ -void LPUART_TransferAbortSendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle); - -/*! - * @brief Aborts the received data using eDMA. - * - * This function aborts the received data using eDMA. - * - * @param base LPUART peripheral base address. - * @param handle Pointer to lpuart_edma_handle_t structure. - */ -void LPUART_TransferAbortReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle); - -/*! - * @brief Gets the number of bytes written to the LPUART TX register. - * - * This function gets the number of bytes written to the LPUART TX - * register by DMA. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param count Send bytes count. - * @retval kStatus_NoTransferInProgress No send in progress. - * @retval kStatus_InvalidArgument Parameter is invalid. - * @retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetSendCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count); - -/*! - * @brief Gets the number of received bytes. - * - * This function gets the number of received bytes. - * - * @param base LPUART peripheral base address. - * @param handle LPUART handle pointer. - * @param count Receive bytes count. - * @retval kStatus_NoTransferInProgress No receive in progress. - * @retval kStatus_InvalidArgument Parameter is invalid. - * @retval kStatus_Success Get successfully through the parameter \p count; - */ -status_t LPUART_TransferGetReceiveCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count); - -/*! - * @brief LPUART eDMA IRQ handle function. - * - * This function handles the LPUART tx complete IRQ request and invoke user callback. - * It is not set to static so that it can be used in user application. - * - * @param base LPUART peripheral base address. - * @param lpuartEdmaHandle LPUART handle pointer. - */ -void LPUART_TransferEdmaHandleIRQ(LPUART_Type *base, void *lpuartEdmaHandle); - -/*@}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_LPUART_EDMA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.c b/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.c deleted file mode 100644 index 8b137b5..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_lpuart_freertos.h" -#include -#include -#include - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.lpuart_freertos" -#endif - -static void LPUART_RTOS_Callback(LPUART_Type *base, lpuart_handle_t *state, status_t status, void *param) -{ - lpuart_rtos_handle_t *handle = (lpuart_rtos_handle_t *)param; - BaseType_t xHigherPriorityTaskWoken, xResult; - - xHigherPriorityTaskWoken = pdFALSE; - xResult = pdFAIL; - - if (status == kStatus_LPUART_RxIdle) - { - xResult = xEventGroupSetBitsFromISR(handle->rxEvent, RTOS_LPUART_COMPLETE, &xHigherPriorityTaskWoken); - } - else if (status == kStatus_LPUART_TxIdle) - { - xResult = xEventGroupSetBitsFromISR(handle->txEvent, RTOS_LPUART_COMPLETE, &xHigherPriorityTaskWoken); - } - else if (status == kStatus_LPUART_RxRingBufferOverrun) - { - xResult = - xEventGroupSetBitsFromISR(handle->rxEvent, RTOS_LPUART_RING_BUFFER_OVERRUN, &xHigherPriorityTaskWoken); - } - else if (status == kStatus_LPUART_RxHardwareOverrun) - { - /* Clear Overrun flag (OR) in LPUART STAT register */ - (void)LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_RxOverrunFlag); - xResult = - xEventGroupSetBitsFromISR(handle->rxEvent, RTOS_LPUART_HARDWARE_BUFFER_OVERRUN, &xHigherPriorityTaskWoken); - } - else - { - xResult = pdFAIL; - } - - if (xResult != pdFAIL) - { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } -} - -/*FUNCTION********************************************************************** - * - * Function Name : LPUART_RTOS_Init - * Description : Initializes the LPUART instance for application - * - *END**************************************************************************/ -/*! - * brief Initializes an LPUART instance for operation in RTOS. - * - * param handle The RTOS LPUART handle, the pointer to an allocated space for RTOS context. - * param t_handle The pointer to an allocated space to store the transactional layer internal state. - * param cfg The pointer to the parameters required to configure the LPUART after initialization. - * return kStatus_Success, others failed - */ -int LPUART_RTOS_Init(lpuart_rtos_handle_t *handle, lpuart_handle_t *t_handle, const lpuart_rtos_config_t *cfg) -{ - status_t status; - lpuart_config_t defcfg; - - if (NULL == handle) - { - return kStatus_InvalidArgument; - } - if (NULL == t_handle) - { - return kStatus_InvalidArgument; - } - if (NULL == cfg) - { - return kStatus_InvalidArgument; - } - if (NULL == cfg->base) - { - return kStatus_InvalidArgument; - } - if (0u == cfg->srcclk) - { - return kStatus_InvalidArgument; - } - if (0u == cfg->baudrate) - { - return kStatus_InvalidArgument; - } - - handle->base = cfg->base; - handle->t_state = t_handle; -#if (configSUPPORT_STATIC_ALLOCATION == 1) - handle->txSemaphore = xSemaphoreCreateMutexStatic(&handle->txSemaphoreBuffer); -#else - handle->txSemaphore = xSemaphoreCreateMutex(); -#endif - if (NULL == handle->txSemaphore) - { - return kStatus_Fail; - } -#if (configSUPPORT_STATIC_ALLOCATION == 1) - handle->rxSemaphore = xSemaphoreCreateMutexStatic(&handle->rxSemaphoreBuffer); -#else - handle->rxSemaphore = xSemaphoreCreateMutex(); -#endif - if (NULL == handle->rxSemaphore) - { - vSemaphoreDelete(handle->txSemaphore); - return kStatus_Fail; - } -#if (configSUPPORT_STATIC_ALLOCATION == 1) - handle->txEvent = xEventGroupCreateStatic(&handle->txEventBuffer); -#else - handle->txEvent = xEventGroupCreate(); -#endif - if (NULL == handle->txEvent) - { - vSemaphoreDelete(handle->rxSemaphore); - vSemaphoreDelete(handle->txSemaphore); - return kStatus_Fail; - } -#if (configSUPPORT_STATIC_ALLOCATION == 1) - handle->rxEvent = xEventGroupCreateStatic(&handle->rxEventBuffer); -#else - handle->rxEvent = xEventGroupCreate(); -#endif - if (NULL == handle->rxEvent) - { - vEventGroupDelete(handle->txEvent); - vSemaphoreDelete(handle->rxSemaphore); - vSemaphoreDelete(handle->txSemaphore); - return kStatus_Fail; - } - LPUART_GetDefaultConfig(&defcfg); - - defcfg.baudRate_Bps = cfg->baudrate; - defcfg.parityMode = cfg->parity; - defcfg.stopBitCount = cfg->stopbits; -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT - defcfg.enableRxRTS = cfg->enableRxRTS; - defcfg.enableTxCTS = cfg->enableTxCTS; - defcfg.txCtsSource = cfg->txCtsSource; - defcfg.txCtsConfig = cfg->txCtsConfig; -#endif - status = LPUART_Init(handle->base, &defcfg, cfg->srcclk); - if (status != kStatus_Success) - { - vEventGroupDelete(handle->rxEvent); - vEventGroupDelete(handle->txEvent); - vSemaphoreDelete(handle->rxSemaphore); - vSemaphoreDelete(handle->txSemaphore); - return kStatus_Fail; - } - LPUART_TransferCreateHandle(handle->base, handle->t_state, LPUART_RTOS_Callback, handle); - LPUART_TransferStartRingBuffer(handle->base, handle->t_state, cfg->buffer, cfg->buffer_size); - - LPUART_EnableTx(handle->base, true); - LPUART_EnableRx(handle->base, true); - - return kStatus_Success; -} - -/*FUNCTION********************************************************************** - * - * Function Name : LPUART_RTOS_Deinit - * Description : Deinitializes the LPUART instance and frees resources - * - *END**************************************************************************/ -/*! - * brief Deinitializes an LPUART instance for operation. - * - * This function deinitializes the LPUART module, sets all register value to the reset value, - * and releases the resources. - * - * param handle The RTOS LPUART handle. - */ -int LPUART_RTOS_Deinit(lpuart_rtos_handle_t *handle) -{ - LPUART_Deinit(handle->base); - - vEventGroupDelete(handle->txEvent); - vEventGroupDelete(handle->rxEvent); - - /* Give the semaphore. This is for functional safety */ - (void)xSemaphoreGive(handle->txSemaphore); - (void)xSemaphoreGive(handle->rxSemaphore); - - vSemaphoreDelete(handle->txSemaphore); - vSemaphoreDelete(handle->rxSemaphore); - - /* Invalidate the handle */ - handle->base = NULL; - handle->t_state = NULL; - - return 0; -} - -/*FUNCTION********************************************************************** - * - * Function Name : UART_RTOS_Send - * Description : Initializes the UART instance for application - * - *END**************************************************************************/ -/*! - * brief Sends data in the background. - * - * This function sends data. It is an synchronous API. - * If the hardware buffer is full, the task is in the blocked state. - * - * param handle The RTOS LPUART handle. - * param buffer The pointer to buffer to send. - * param length The number of bytes to send. - */ -int LPUART_RTOS_Send(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length) -{ - EventBits_t ev; - int retval = kStatus_Success; - status_t status; - - if (NULL == handle->base) - { - /* Invalid handle. */ - return kStatus_Fail; - } - if (0u == length) - { - return kStatus_Success; - } - if (NULL == buffer) - { - return kStatus_InvalidArgument; - } - - if (pdFALSE == xSemaphoreTake(handle->txSemaphore, 0)) - { - /* We could not take the semaphore, exit with 0 data received */ - return kStatus_Fail; - } - - handle->txTransfer.data = (uint8_t *)buffer; - handle->txTransfer.dataSize = (uint32_t)length; - - /* Non-blocking call */ - status = LPUART_TransferSendNonBlocking(handle->base, handle->t_state, &handle->txTransfer); - if (status != kStatus_Success) - { - (void)xSemaphoreGive(handle->txSemaphore); - return kStatus_Fail; - } - - ev = xEventGroupWaitBits(handle->txEvent, RTOS_LPUART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY); - if ((ev & RTOS_LPUART_COMPLETE) == 0U) - { - retval = kStatus_Fail; - } - - if (pdFALSE == xSemaphoreGive(handle->txSemaphore)) - { - /* We could not post the semaphore, exit with error */ - retval = kStatus_Fail; - } - - return retval; -} - -/*FUNCTION********************************************************************** - * - * Function Name : LPUART_RTOS_Recv - * Description : Receives chars for the application - * - *END**************************************************************************/ -/*! - * brief Receives data. - * - * This function receives data from LPUART. It is an synchronous API. If any data is immediately available - * it is returned immediately and the number of bytes received. - * - * param handle The RTOS LPUART handle. - * param buffer The pointer to buffer where to write received data. - * param length The number of bytes to receive. - * param received The pointer to a variable of size_t where the number of received data is filled. - */ -int LPUART_RTOS_Receive(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length, size_t *received) -{ - EventBits_t ev; - size_t n = 0; - int retval = kStatus_Fail; - size_t local_received = 0; - status_t status; - - if (NULL == handle->base) - { - /* Invalid handle. */ - return kStatus_Fail; - } - if (0u == length) - { - if (received != NULL) - { - *received = n; - } - return kStatus_Success; - } - if (NULL == buffer) - { - return kStatus_InvalidArgument; - } - - /* New transfer can be performed only after current one is finished */ - if (pdFALSE == xSemaphoreTake(handle->rxSemaphore, portMAX_DELAY)) - { - /* We could not take the semaphore, exit with 0 data received */ - return kStatus_Fail; - } - - handle->rxTransfer.data = buffer; - handle->rxTransfer.dataSize = (uint32_t)length; - - /* Non-blocking call */ - status = LPUART_TransferReceiveNonBlocking(handle->base, handle->t_state, &handle->rxTransfer, &n); - if (status != kStatus_Success) - { - (void)xSemaphoreGive(handle->rxSemaphore); - return kStatus_Fail; - } - - ev = xEventGroupWaitBits( - handle->rxEvent, RTOS_LPUART_COMPLETE | RTOS_LPUART_RING_BUFFER_OVERRUN | RTOS_LPUART_HARDWARE_BUFFER_OVERRUN, - pdTRUE, pdFALSE, portMAX_DELAY); - if ((ev & RTOS_LPUART_HARDWARE_BUFFER_OVERRUN) != 0U) - { - /* Stop data transfer to application buffer, ring buffer is still active */ - LPUART_TransferAbortReceive(handle->base, handle->t_state); - /* Prevent false indication of successful transfer in next call of LPUART_RTOS_Receive. - RTOS_LPUART_COMPLETE flag could be set meanwhile overrun is handled */ - (void)xEventGroupClearBits(handle->rxEvent, RTOS_LPUART_COMPLETE); - retval = kStatus_LPUART_RxHardwareOverrun; - local_received = 0; - } - else if ((ev & RTOS_LPUART_RING_BUFFER_OVERRUN) != 0U) - { - /* Stop data transfer to application buffer, ring buffer is still active */ - LPUART_TransferAbortReceive(handle->base, handle->t_state); - /* Prevent false indication of successful transfer in next call of LPUART_RTOS_Receive. - RTOS_LPUART_COMPLETE flag could be set meanwhile overrun is handled */ - (void)xEventGroupClearBits(handle->rxEvent, RTOS_LPUART_COMPLETE); - retval = kStatus_LPUART_RxRingBufferOverrun; - local_received = 0; - } - else if ((ev & RTOS_LPUART_COMPLETE) != 0U) - { - retval = kStatus_Success; - local_received = length; - } - else - { - retval = kStatus_LPUART_Error; - local_received = 0; - } - - /* Prevent repetitive NULL check */ - if (received != NULL) - { - *received = local_received; - } - - /* Enable next transfer. Current one is finished */ - if (pdFALSE == xSemaphoreGive(handle->rxSemaphore)) - { - /* We could not post the semaphore, exit with error */ - retval = kStatus_Fail; - } - return retval; -} diff --git a/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.h b/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.h deleted file mode 100644 index 624dc6f..0000000 --- a/devices/MIMXRT1052/drivers/fsl_lpuart_freertos.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef __FSL_LPUART_RTOS_H__ -#define __FSL_LPUART_RTOS_H__ - -#include "fsl_lpuart.h" -#include -#include -#include - -/*! - * @addtogroup lpuart_freertos_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief LPUART FreeRTOS driver version. */ -#define FSL_LPUART_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) -/*@}*/ - -/*! @brief LPUART RTOS configuration structure. */ -typedef struct _lpuart_rtos_config -{ - LPUART_Type *base; /*!< UART base address */ - uint32_t srcclk; /*!< UART source clock in Hz*/ - uint32_t baudrate; /*!< Desired communication speed */ - lpuart_parity_mode_t parity; /*!< Parity setting */ - lpuart_stop_bit_count_t stopbits; /*!< Number of stop bits to use */ - uint8_t *buffer; /*!< Buffer for background reception */ - uint32_t buffer_size; /*!< Size of buffer for background reception */ -#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT - bool enableRxRTS; /*!< RX RTS enable */ - bool enableTxCTS; /*!< TX CTS enable */ - lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */ - lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */ -#endif -} lpuart_rtos_config_t; - -/*! - * @cond RTOS_PRIVATE - * @name LPUART event flags - * - * This are only valid states for txEvent and rxEvent (lpuart_rtos_handle_t). - */ -/*@{*/ -/*! @brief Event flag - transfer complete. */ -#define RTOS_LPUART_COMPLETE 0x1U -/*! @brief Event flag - ring buffer overrun. */ -#define RTOS_LPUART_RING_BUFFER_OVERRUN 0x2U -/*! @brief Event flag - hardware buffer overrun. */ -#define RTOS_LPUART_HARDWARE_BUFFER_OVERRUN 0x4U -/*@}*/ - -/*! @brief LPUART FreeRTOS transfer structure. */ -typedef struct _lpuart_rtos_handle -{ - LPUART_Type *base; /*!< UART base address */ - lpuart_transfer_t txTransfer; /*!< TX transfer structure */ - lpuart_transfer_t rxTransfer; /*!< RX transfer structure */ - SemaphoreHandle_t rxSemaphore; /*!< RX semaphore for resource sharing */ - SemaphoreHandle_t txSemaphore; /*!< TX semaphore for resource sharing */ - EventGroupHandle_t rxEvent; /*!< RX completion event */ - EventGroupHandle_t txEvent; /*!< TX completion event */ - void *t_state; /*!< Transactional state of the underlying driver */ -#if (configSUPPORT_STATIC_ALLOCATION == 1) - StaticSemaphore_t txSemaphoreBuffer; /*!< Statically allocated memory for txSemaphore */ - StaticSemaphore_t rxSemaphoreBuffer; /*!< Statically allocated memory for rxSemaphore */ - StaticEventGroup_t txEventBuffer; /*!< Statically allocated memory for txEvent */ - StaticEventGroup_t rxEventBuffer; /*!< Statically allocated memory for rxEvent */ -#endif -} lpuart_rtos_handle_t; -/*! \endcond */ - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name LPUART RTOS Operation - * @{ - */ - -/*! - * @brief Initializes an LPUART instance for operation in RTOS. - * - * @param handle The RTOS LPUART handle, the pointer to an allocated space for RTOS context. - * @param t_handle The pointer to an allocated space to store the transactional layer internal state. - * @param cfg The pointer to the parameters required to configure the LPUART after initialization. - * @return 0 succeed, others failed - */ -int LPUART_RTOS_Init(lpuart_rtos_handle_t *handle, lpuart_handle_t *t_handle, const lpuart_rtos_config_t *cfg); - -/*! - * @brief Deinitializes an LPUART instance for operation. - * - * This function deinitializes the LPUART module, sets all register value to the reset value, - * and releases the resources. - * - * @param handle The RTOS LPUART handle. - */ -int LPUART_RTOS_Deinit(lpuart_rtos_handle_t *handle); - -/*! - * @name LPUART transactional Operation - * @{ - */ - -/*! - * @brief Sends data in the background. - * - * This function sends data. It is an synchronous API. - * If the hardware buffer is full, the task is in the blocked state. - * - * @param handle The RTOS LPUART handle. - * @param buffer The pointer to buffer to send. - * @param length The number of bytes to send. - */ -int LPUART_RTOS_Send(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length); - -/*! - * @brief Receives data. - * - * This function receives data from LPUART. It is an synchronous API. If any data is immediately available - * it is returned immediately and the number of bytes received. - * - * @param handle The RTOS LPUART handle. - * @param buffer The pointer to buffer where to write received data. - * @param length The number of bytes to receive. - * @param received The pointer to a variable of size_t where the number of received data is filled. - */ -int LPUART_RTOS_Receive(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length, size_t *received); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* __FSL_LPUART_RTOS_H__ */ diff --git a/devices/MIMXRT1052/drivers/fsl_nic301.h b/devices/MIMXRT1052/drivers/fsl_nic301.h deleted file mode 100644 index ceda190..0000000 --- a/devices/MIMXRT1052/drivers/fsl_nic301.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright 2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_NIC301_H_ -#define _FSL_NIC301_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup nic301 - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.nic301" -#endif - -/*! @name Driver version */ -/*@{*/ -/*! @brief NIC301 driver version 2.0.0. */ -#define FSL_NIC301_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 0U)) -/*@}*/ - -#define GPV0_BASE (0x41000000UL) -#define GPV1_BASE (0x41100000UL) -#define GPV4_BASE (0x41400000UL) - -#define NIC_FN_MOD2_OFFSET (0x024UL) -#define NIC_FN_MOD_AHB_OFFSET (0x028UL) -#define NIC_WR_TIDEMARK_OFFSET (0x040UL) -#define NIC_READ_QOS_OFFSET (0x100UL) -#define NIC_WRITE_QOS_OFFSET (0x104UL) -#define NIC_FN_MOD_OFFSET (0x108UL) - -#define NIC_LCD_BASE (GPV0_BASE + 0x44000) -#define NIC_CSI_BASE (GPV0_BASE + 0x45000) -#define NIC_PXP_BASE (GPV0_BASE + 0x46000) - -#define NIC_DCP_BASE (GPV1_BASE + 0x42000) -#define NIC_ENET_BASE (GPV1_BASE + 0x43000) -#define NIC_USBO2_BASE (GPV1_BASE + 0x44000) -#define NIC_USDHC1_BASE (GPV1_BASE + 0x45000) -#define NIC_USDHC2_BASE (GPV1_BASE + 0x46000) -#define NIC_TestPort_BASE (GPV1_BASE + 0x47000) - -#define NIC_CM7_BASE (GPV4_BASE + 0x42000) -#define NIC_DMA_BASE (GPV4_BASE + 0x43000) - -#define NIC_QOS_MASK (0xF) -#define NIC_WR_TIDEMARK_MASK (0x7) -#define NIC_FN_MOD_AHB_MASK (0x7) -#define NIC_FN_MOD_MASK (0x1) -#define NIC_FN_MOD2_MASK (0x1) - -typedef enum _nic_reg -{ - /* read_qos */ - kNIC_REG_READ_QOS_LCD = NIC_LCD_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_CSI = NIC_CSI_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_PXP = NIC_PXP_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_DCP = NIC_DCP_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_ENET = NIC_ENET_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_USBO2 = NIC_USBO2_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_USDHC1 = NIC_USDHC1_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_USDHC2 = NIC_USDHC2_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_TestPort = NIC_TestPort_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_CM7 = NIC_CM7_BASE + NIC_READ_QOS_OFFSET, - kNIC_REG_READ_QOS_DMA = NIC_DMA_BASE + NIC_READ_QOS_OFFSET, - - /* write_qos */ - kNIC_REG_WRITE_QOS_LCD = NIC_LCD_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_CSI = NIC_CSI_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_PXP = NIC_PXP_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_DCP = NIC_DCP_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_ENET = NIC_ENET_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_USBO2 = NIC_USBO2_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_USDHC1 = NIC_USDHC1_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_USDHC2 = NIC_USDHC2_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_TestPort = NIC_TestPort_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_CM7 = NIC_CM7_BASE + NIC_WRITE_QOS_OFFSET, - kNIC_REG_WRITE_QOS_DMA = NIC_DMA_BASE + NIC_WRITE_QOS_OFFSET, - - /* fn_mod */ - kNIC_REG_FN_MOD_LCD = NIC_LCD_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_CSI = NIC_CSI_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_PXP = NIC_PXP_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_DCP = NIC_DCP_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_ENET = NIC_ENET_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_USBO2 = NIC_USBO2_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_USDHC1 = NIC_USDHC1_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_USDHC2 = NIC_USDHC2_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_TestPort = NIC_TestPort_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_CM7 = NIC_CM7_BASE + NIC_FN_MOD_OFFSET, - kNIC_REG_FN_MOD_DMA = NIC_DMA_BASE + NIC_FN_MOD_OFFSET, - - /* fn_mod2 */ - kNIC_REG_FN_MOD2_DCP = NIC_ENET_BASE + NIC_FN_MOD2_OFFSET, - - /* fn_mod_ahb */ - kNIC_REG_FN_MOD_AHB_ENET = NIC_ENET_BASE + NIC_FN_MOD_AHB_OFFSET, - kNIC_REG_FN_MOD_AHB_TestPort = NIC_TestPort_BASE + NIC_FN_MOD_AHB_OFFSET, - kNIC_REG_FN_MOD_AHB_DMA = NIC_DMA_BASE + NIC_FN_MOD_AHB_OFFSET, - - /* wr_tidemark */ - kNIC_REG_WR_TIDEMARK_CM7 = NIC_CM7_BASE + NIC_WR_TIDEMARK_OFFSET, -} nic_reg_t; - -/* fn_mod2 */ -typedef enum _nic_fn_mod2 -{ - kNIC_FN_MOD2_ENABLE = 0, - kNIC_FN_MOD2_BYPASS, -} nic_fn_mod2_t; - -/* fn_mod_ahb */ -typedef enum _nic_fn_mod_ahb -{ - kNIC_FN_MOD_AHB_RD_INCR_OVERRIDE = 0, - kNIC_FN_MOD_AHB_WR_INCR_OVERRIDE, - kNIC_FN_MOD_AHB_LOCK_OVERRIDE, -} nic_fn_mod_ahb_t; - -/* fn_mod */ -typedef enum _nic_fn_mod -{ - kNIC_FN_MOD_ReadIssue = 0, - kNIC_FN_MOD_WriteIssue, -} nic_fn_mod_t; - -/* read_qos/write_qos */ -typedef enum _nic_qos -{ - kNIC_QOS_0 = 0, - kNIC_QOS_1, - kNIC_QOS_2, - kNIC_QOS_3, - kNIC_QOS_4, - kNIC_QOS_5, - kNIC_QOS_6, - kNIC_QOS_7, - kNIC_QOS_8, - kNIC_QOS_9, - kNIC_QOS_10, - kNIC_QOS_11, - kNIC_QOS_12, - kNIC_QOS_13, - kNIC_QOS_14, - kNIC_QOS_15, -} nic_qos_t; - -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @brief Set read_qos Value - * - * @param base Base address of GPV address - * @param value Target value (0 - 15) - */ -static inline void NIC_SetReadQos(nic_reg_t base, nic_qos_t value) -{ - *(volatile uint32_t *)(base + NIC_READ_QOS_OFFSET) = (value & NIC_QOS_MASK); - __DSB(); -} - -/*! - * @brief Get read_qos Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline nic_qos_t NIC_GetReadQos(nic_reg_t base) -{ - return (nic_qos_t)((*(volatile uint32_t *)(base + NIC_READ_QOS_OFFSET)) & NIC_QOS_MASK); -} - -/*! - * @brief Set write_qos Value - * - * @param base Base address of GPV address - * @param value Target value (0 - 15) - */ -static void inline NIC_SetWriteQos(nic_reg_t base, nic_qos_t value) -{ - *(volatile uint32_t *)(base + NIC_WRITE_QOS_OFFSET) = (value & NIC_QOS_MASK); - __DSB(); -} - -/*! - * @brief Get write_qos Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline nic_qos_t NIC_GetWriteQos(nic_reg_t base) -{ - return (nic_qos_t)((*(volatile uint32_t *)(base + NIC_WRITE_QOS_OFFSET)) & NIC_QOS_MASK); -} - -/*! - * @brief Set fn_mod_ahb Value - * - * @param base Base address of GPV address - * @param value Target value - */ -static inline void NIC_SetFnModAhb(nic_reg_t base, nic_fn_mod_ahb_t v) -{ - *(volatile uint32_t *)(base + NIC_FN_MOD_AHB_OFFSET) = v; - __DSB(); -} - -/*! - * @brief Get fn_mod_ahb Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline nic_fn_mod_ahb_t NIC_GetFnModAhb(nic_reg_t base) -{ - return (nic_fn_mod_ahb_t)((*(volatile uint32_t *)(base + NIC_FN_MOD_AHB_OFFSET)) & NIC_FN_MOD_AHB_MASK); -} - -/*! - * @brief Set wr_tidemark Value - * - * @param base Base address of GPV address - * @param value Target value (0 - 7) - */ -static inline void NIC_SetWrTideMark(nic_reg_t base, uint8_t value) -{ - *(volatile uint32_t *)(base + NIC_WR_TIDEMARK_OFFSET) = (value & NIC_WR_TIDEMARK_MASK); - __DSB(); -} - -/*! - * @brief Get wr_tidemark Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline uint8_t NIC_GetWrTideMark(nic_reg_t base) -{ - return (uint8_t)((*(volatile uint32_t *)(base + NIC_WR_TIDEMARK_OFFSET)) & NIC_WR_TIDEMARK_MASK); -} - -/*! - * @brief Set fn_mod Value - * - * @param base Base address of GPV address - * @param value Target value - */ -static inline void NIC_SetFnMod(nic_reg_t base, nic_fn_mod_t value) -{ - *(volatile uint32_t *)(base + NIC_FN_MOD_OFFSET) = value; - __DSB(); -} - -/*! - * @brief Get fn_mod Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline nic_fn_mod_t NIC_GetFnMod(nic_reg_t base) -{ - return (nic_fn_mod_t)((*(volatile uint32_t *)(base + NIC_FN_MOD_OFFSET)) & NIC_FN_MOD_MASK); -} - -/*! - * @brief Set fn_mod2 Value - * - * @param base Base address of GPV address - * @param value Target value - */ -static inline void NIC_SetFnMod2(nic_reg_t base, nic_fn_mod_t value) -{ - *(volatile uint32_t *)(base + NIC_FN_MOD2_OFFSET) = value; - __DSB(); -} - -/*! - * @brief Get fn_mod2 Value - * - * @param base Base address of GPV address - * @return Current value configured - */ -static inline nic_fn_mod2_t NIC_GetFnMod2(nic_reg_t base) -{ - return (nic_fn_mod2_t)((*(volatile uint32_t *)(base + NIC_FN_MOD2_OFFSET)) & NIC_FN_MOD2_MASK); -} - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ -#endif /* _FSL_NIC301_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_ocotp.c b/devices/MIMXRT1052/drivers/fsl_ocotp.c deleted file mode 100644 index 4c15d69..0000000 --- a/devices/MIMXRT1052/drivers/fsl_ocotp.c +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright 2019-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_ocotp.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.ocotp" -#endif - -#if defined(FSL_FEATURE_OCOTP_HAS_STATUS) && FSL_FEATURE_OCOTP_HAS_STATUS -#define OCOTP_STATUS_READ_DED_MASK \ - (OCOTP_OUT_STATUS0_DED0_MASK | OCOTP_OUT_STATUS0_DED1_MASK | OCOTP_OUT_STATUS0_DED2_MASK | \ - OCOTP_OUT_STATUS0_DED3_MASK) -#endif - -/* Wait time should be not less than 150ns . */ -#define OCOTP_TIMING_WAIT_NS (uint64_t)150 -/* Relex time should be not less than 100ns . */ -#define OCOTP_TIMING_RELEX_NS (uint64_t)100 -/* Program time should be rang from 9000ns~11000ns. */ -#define OCOTP_TIMING_PROGRAM_NS (uint64_t)10000 -/* Read time should be less than 40ns. */ -#define OCOTP_TIMING_READ_NS (uint64_t)40 - -/* Unlock key is 0x3E77. */ -#define OCOTP_WRITE_UNLOCK_KEY (0x3E77) -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) -/*! - * @brief Set read timing configuration. - * - * @param base OCOTP peripheral base addess. - * @param timingConfig configuration of timing. - */ -static void OCOTP_SetReadTiming(OCOTP_Type *base, ocotp_timing_t timingConfig); - -/*! - * @brief Set write timing configuration. - * - * @param base OCOTP peripheral base addess. - * @param timingConfig configuration of timing. - */ -static void OCOTP_SetWriteTiming(OCOTP_Type *base, ocotp_timing_t timingConfig); -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) -/* Timing configuration for OCOTP controller. */ -static ocotp_timing_t s_timingConfig; -#endif - -/******************************************************************************* - * Code - *******************************************************************************/ -/* Reload the shadow register. */ -status_t OCOTP_ReloadShadowRegister(OCOTP_Type *base) -{ - assert(NULL != base); - - status_t status = kStatus_Success; - - /* Make sure the OCOTP is ready, Overlapped accesses are not supported by the controller. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* Clear access error status bit. */ - OCOTP_ClearErrorStatus(base); - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - /* Set the read timing. */ - OCOTP_SetReadTiming(base, s_timingConfig); - - /* Wait for the OCOTP controller not busy. */ - while (OCOTP_CheckBusyStatus(base)) - { - } -#endif - -#if defined(OCOTP_OUT_STATUS0_DED_RELOAD_MASK) - /* Clear reload error status. */ - base->OUT_STATUS0_CLR = OCOTP_OUT_STATUS0_DED_RELOAD_MASK; -#endif - - /* Set reload bit. */ - base->CTRL_SET = OCOTP_CTRL_RELOAD_SHADOWS(1); - - /* Wait for the OCOTP controller not busy. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - /* Wait for shadow register reload complete. this bit will be auto clear by OCOTP once operation is complete. */ - while (OCOTP_CTRL_RELOAD_SHADOWS_MASK == (base->CTRL & OCOTP_CTRL_RELOAD_SHADOWS_MASK)) - { - } - -#if defined(OCOTP_OUT_STATUS0_DED_RELOAD_MASK) - if ((base->OUT_STATUS0 & OCOTP_OUT_STATUS0_DED_RELOAD_MASK) != 0U) - { - status = kStatus_OCOTP_ReloadError; - } -#endif - - return status; -} - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) -static void OCOTP_SetReadTiming(OCOTP_Type *base, ocotp_timing_t timingConfig) -{ - uint32_t timingValue = base->TIMING; - - timingValue &= ~(OCOTP_TIMING_RELAX_MASK | OCOTP_TIMING_STROBE_READ_MASK | OCOTP_TIMING_WAIT_MASK); - timingValue |= OCOTP_TIMING_RELAX(timingConfig.relax) | OCOTP_TIMING_STROBE_READ(timingConfig.strobe_read) | - OCOTP_TIMING_WAIT(timingConfig.wait); - base->TIMING = timingValue; -} - -static void OCOTP_SetWriteTiming(OCOTP_Type *base, ocotp_timing_t timingConfig) -{ - uint32_t timingValue = base->TIMING; - - timingValue &= ~(OCOTP_TIMING_RELAX_MASK | OCOTP_TIMING_STROBE_PROG_MASK | OCOTP_TIMING_WAIT_MASK); - timingValue |= OCOTP_TIMING_RELAX(timingConfig.relax) | OCOTP_TIMING_STROBE_PROG(timingConfig.strobe_prog) | - OCOTP_TIMING_WAIT(timingConfig.wait); - - base->TIMING = timingValue; -} -#endif - -/* Initializes OCOTP controller. */ -void OCOTP_Init(OCOTP_Type *base, uint32_t srcClock_Hz) -{ - assert(NULL != base); -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - assert(0UL != srcClock_Hz); -#endif - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable OCOTP clock */ - CLOCK_EnableClock(kCLOCK_Ocotp); -#endif - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - /* tWait time shoule be higher than OCOTP_TIMING_WAIT_NS. */ - s_timingConfig.wait = (uint32_t)((OCOTP_TIMING_WAIT_NS * srcClock_Hz + 1000000000U) / 1000000000U - 1U); - - /* tRelax time shoule be higher than OCOTP_TIMING_RELEX_NS. */ - s_timingConfig.relax = (uint32_t)((OCOTP_TIMING_RELEX_NS * srcClock_Hz + 1000000000U) / 1000000000U - 1U); - - /* tStrobe_prog time should be close to OCOTP_TIMING_PROGRAM_NS, only add half of 1000000000. */ - s_timingConfig.strobe_prog = (uint32_t)((OCOTP_TIMING_PROGRAM_NS * srcClock_Hz + 500000000U) / 1000000000U) + - 2U * (s_timingConfig.relax + 1U) - 1U; - - /* tStrobe_read time should be higher than OCOTP_TIMING_READ_NS. */ - s_timingConfig.strobe_read = (uint32_t)((OCOTP_TIMING_READ_NS * srcClock_Hz + 1000000000U) / 1000000000U) + - 2U * (s_timingConfig.relax + 1U) - 1U; -#endif -} - -/* De-init OCOTP controller. */ -void OCOTP_Deinit(OCOTP_Type *base) -{ - assert(NULL != base); - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - s_timingConfig.wait = 0UL; - s_timingConfig.relax = 0UL; - s_timingConfig.strobe_prog = 0UL; - s_timingConfig.strobe_read = 0UL; -#endif - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable OCOTP clock */ - CLOCK_DisableClock(kCLOCK_Ocotp); -#endif -} - -/* Read the fuse shadow register. */ -uint32_t OCOTP_ReadFuseShadowRegister(OCOTP_Type *base, uint32_t address) -{ - assert(NULL != base); - - uint32_t data = 0U; - - (void)OCOTP_ReadFuseShadowRegisterExt(base, address, &data, 1); - - return data; -} - -status_t OCOTP_ReadFuseShadowRegisterExt(OCOTP_Type *base, uint32_t address, uint32_t *data, uint8_t fuseWords) -{ - assert((fuseWords > 0U) && (fuseWords <= OCOTP_READ_FUSE_DATA_COUNT)); - assert(NULL != data); - - status_t status = kStatus_Success; - -#if (OCOTP_READ_FUSE_DATA_COUNT > 1U) - uint32_t i; -#endif - - /* Make sure the OCOTP is ready, Overlapped accesses are not supported by the controller. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* If ERROR bit was set, clear access error status bit. */ - if (OCOTP_CheckErrorStatus(base)) - { - OCOTP_ClearErrorStatus(base); - } - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - /* Set the read timing. */ - OCOTP_SetReadTiming(base, s_timingConfig); - - /* Wait for busy bit is cleared. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* Clear access error status bit. */ - if (OCOTP_CheckErrorStatus(base)) - { - OCOTP_ClearErrorStatus(base); - } -#endif - -#if defined(OCOTP_STATUS_READ_DED_MASK) - /* Clear error flags. */ - base->OUT_STATUS0_CLR = OCOTP_STATUS_READ_DED_MASK; -#endif - - /* Write requested address to register. */ - base->CTRL_CLR = OCOTP_CTRL_CLR_ADDR_MASK; - base->CTRL_SET = OCOTP_CTRL_SET_ADDR(address); - - /* Set OCOTP auto read enable. */ -#if defined(OCOTP_READ_CTRL_READ_NUM_MASK) - base->READ_CTRL = (base->READ_CTRL & ~(OCOTP_READ_CTRL_READ_NUM_MASK)) | - OCOTP_READ_CTRL_READ_NUM((uint32_t)fuseWords - 1U) | OCOTP_READ_CTRL_READ_FUSE_MASK; -#else - base->READ_CTRL |= OCOTP_READ_CTRL_READ_FUSE_MASK; -#endif - - /* Wait for busy bit is cleared, and no error occurred on controller. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* If ERROR bit was set, this may be mean that the accsee to the register was wrong. */ - if (OCOTP_CheckErrorStatus(base)) - { - /* Clear access error status bit. */ - OCOTP_ClearErrorStatus(base); - - status = kStatus_OCOTP_AccessError; - } - -#if defined(OCOTP_STATUS_READ_DED_MASK) - if ((base->OUT_STATUS0 & OCOTP_STATUS_READ_DED_MASK) != 0U) - { - status = kStatus_Fail; - } -#endif - -#if (OCOTP_READ_FUSE_DATA_COUNT == 1U) - *data = base->READ_FUSE_DATA; -#else - for (i = 0; i < fuseWords; i++) - { - data[i] = base->READ_FUSE_DATAS[i].READ_FUSE_DATA; - } -#endif - - return status; -} - -/* Write the fuse shadow register. */ -status_t OCOTP_WriteFuseShadowRegister(OCOTP_Type *base, uint32_t address, uint32_t data) -{ - return OCOTP_WriteFuseShadowRegisterWithLock(base, address, data, false); -} - -status_t OCOTP_WriteFuseShadowRegisterWithLock(OCOTP_Type *base, uint32_t address, uint32_t data, bool lock) -{ - assert(NULL != base); - - status_t status = kStatus_Success; - -#if defined(FSL_FEATURE_OCOTP_HAS_STATUS) && FSL_FEATURE_OCOTP_HAS_STATUS - uint32_t regStatus; -#endif - -#if !(defined(FSL_FEATURE_OCOTP_HAS_WORDLOCK) && FSL_FEATURE_OCOTP_HAS_WORDLOCK) - if (lock) - { - return kStatus_InvalidArgument; - } -#endif - - /* Make sure the OCOTP is ready, Overlapped accesses are not supported by the controller. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* Clear access error status bit. */ - if (OCOTP_CheckErrorStatus(base)) - { - OCOTP_ClearErrorStatus(base); - } - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) - /* Set write timing for OCOTP controller. */ - OCOTP_SetWriteTiming(base, s_timingConfig); - - /* Wait for busy bit is cleared. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* Clear access error status bit. */ - if (OCOTP_CheckErrorStatus(base)) - { - OCOTP_ClearErrorStatus(base); - } -#endif - -#if defined(FSL_FEATURE_OCOTP_HAS_STATUS) && FSL_FEATURE_OCOTP_HAS_STATUS - /* Clear errors. */ - base->OUT_STATUS0_CLR = (OCOTP_OUT_STATUS0_PROGFAIL_MASK | OCOTP_OUT_STATUS0_LOCKED_MASK); -#endif - - /* Write requested address and unlock key to register. */ -#if (defined(FSL_FEATURE_OCOTP_HAS_WORDLOCK) && FSL_FEATURE_OCOTP_HAS_WORDLOCK) - base->CTRL_CLR = OCOTP_CTRL_CLR_ADDR_MASK | OCOTP_CTRL_WR_UNLOCK_MASK | OCOTP_CTRL_WORDLOCK_MASK; -#else - base->CTRL_CLR = OCOTP_CTRL_CLR_ADDR_MASK | OCOTP_CTRL_WR_UNLOCK_MASK; -#endif - -#if (defined(FSL_FEATURE_OCOTP_HAS_WORDLOCK) && FSL_FEATURE_OCOTP_HAS_WORDLOCK) - if (lock) - { - base->CTRL_SET = - OCOTP_CTRL_SET_ADDR(address) | OCOTP_CTRL_WR_UNLOCK(OCOTP_WRITE_UNLOCK_KEY) | OCOTP_CTRL_WORDLOCK_MASK; - } - else -#endif - { - base->CTRL_SET = OCOTP_CTRL_SET_ADDR(address) | OCOTP_CTRL_WR_UNLOCK(OCOTP_WRITE_UNLOCK_KEY); - } - - /* Write data to register. */ - base->DATA = data; - - /* Wait for busy bit is cleared, and no error occurred on controller. */ - while (OCOTP_CheckBusyStatus(base)) - { - } - - /* If ERROR bit was set, this may be mean that the accsee to the register was wrong. */ - if (OCOTP_CheckErrorStatus(base)) - { - /* Clear access error status bit. */ - OCOTP_ClearErrorStatus(base); - - status = kStatus_OCOTP_AccessError; - } - -#if defined(FSL_FEATURE_OCOTP_HAS_STATUS) && FSL_FEATURE_OCOTP_HAS_STATUS - regStatus = base->OUT_STATUS0; - - if ((regStatus & OCOTP_OUT_STATUS0_PROGFAIL_MASK) != 0U) - { - status = kStatus_OCOTP_ProgramFail; - } - else if ((regStatus & OCOTP_OUT_STATUS0_LOCKED_MASK) != 0U) - { - status = kStatus_OCOTP_Locked; - } - else - { - /* For MISRA rules. */ - } -#endif - - if (kStatus_Success == status) - { - /* Reload the fuse register. */ - status = OCOTP_ReloadShadowRegister(base); - } - - return status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_ocotp.h b/devices/MIMXRT1052/drivers/fsl_ocotp.h deleted file mode 100644 index 73a405a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_ocotp.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2019-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_OCOTP_H_ -#define _FSL_OCOTP_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup ocotp - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ -/*! @name Driver version */ -/*@{*/ -/*! @brief OCOTP driver version. */ -#define FSL_OCOTP_DRIVER_VERSION (MAKE_VERSION(2, 1, 3)) -/*@}*/ - -#ifndef OCOTP_READ_FUSE_DATA_COUNT -#define OCOTP_READ_FUSE_DATA_COUNT (1U) -#endif - -/*! @brief _ocotp_status Error codes for the OCOTP driver. */ -enum -{ - kStatus_OCOTP_AccessError = MAKE_STATUS(kStatusGroup_SDK_OCOTP, 0), /*!< eFuse and shadow register access error. */ - kStatus_OCOTP_CrcFail = MAKE_STATUS(kStatusGroup_SDK_OCOTP, 1), /*!< CRC check failed. */ - kStatus_OCOTP_ReloadError = - MAKE_STATUS(kStatusGroup_SDK_OCOTP, 2), /*!< Error happens during reload shadow register. */ - kStatus_OCOTP_ProgramFail = MAKE_STATUS(kStatusGroup_SDK_OCOTP, 3), /*!< Fuse programming failed. */ - kStatus_OCOTP_Locked = MAKE_STATUS(kStatusGroup_SDK_OCOTP, 4), /*!< Fuse is locked and cannot be programmed. */ -}; - -#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) -/*! @brief OCOTP timing structure. - * Note that, these value are used for calcalating the read/write timings. - * And the values should statisfy below rules: - * - * Tsp_rd=(WAIT+1)/ipg_clk_freq should be >= 150ns; - * Tsp_pgm=(RELAX+1)/ipg_clk_freq should be >= 100ns; - * Trd = ((STROBE_READ+1)- 2*(RELAX_READ+1)) /ipg_clk_freq, - * The Trd is required to be larger than 40 ns. - * Tpgm = ((STROBE_PROG+1)- 2*(RELAX_PROG+1)) /ipg_clk_freq; - * The Tpgm should be configured within the range of 9000 ns < Tpgm < 11000 ns; - */ -typedef struct _ocotp_timing -{ - uint32_t wait; /*!< Wait time value to fill in the TIMING register. */ - uint32_t relax; /*!< Relax time value to fill in the TIMING register. */ - uint32_t strobe_prog; /*!< Storbe program time value to fill in the TIMING register. */ - uint32_t strobe_read; /*!< Storbe read time value to fill in the TIMING register. */ -} ocotp_timing_t; -#endif /* FSL_FEATURE_OCOTP_HAS_TIMING_CTRL */ - -/******************************************************************************* - * API - *******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Initializes OCOTP controller. - * - * @param base OCOTP peripheral base address. - * @param srcClock_Hz source clock frequency in unit of Hz. When the macro - * FSL_FEATURE_OCOTP_HAS_TIMING_CTRL is defined as 0, this parameter is not used, - * application could pass in 0 in this case. - */ -void OCOTP_Init(OCOTP_Type *base, uint32_t srcClock_Hz); - -/*! - * @brief De-initializes OCOTP controller. - * - * @retval kStatus_Success upon successful execution, error status otherwise. - */ -void OCOTP_Deinit(OCOTP_Type *base); - -/*! - * @brief Checking the BUSY bit in CTRL register. - * Checking this BUSY bit will help confirm if the OCOTP controller is ready for access. - * - * @param base OCOTP peripheral base address. - * @retval true for bit set and false for cleared. - */ -static inline bool OCOTP_CheckBusyStatus(OCOTP_Type *base) -{ - return ((OCOTP_CTRL_BUSY_MASK == (base->CTRL & OCOTP_CTRL_BUSY_MASK)) ? (true) : (false)); -} - -/*! - * @brief Checking the ERROR bit in CTRL register. - * - * @param base OCOTP peripheral base address. - * @retval true for bit set and false for cleared. - */ -static inline bool OCOTP_CheckErrorStatus(OCOTP_Type *base) -{ - return ((OCOTP_CTRL_ERROR_MASK == (base->CTRL & OCOTP_CTRL_ERROR_MASK)) ? (true) : (false)); -} - -/*! - * @brief Clear the error bit if this bit is set. - * - * @param base OCOTP peripheral base address. - */ -static inline void OCOTP_ClearErrorStatus(OCOTP_Type *base) -{ - base->CTRL_CLR = OCOTP_CTRL_CLR_ERROR_MASK; -} - -/*! - * @brief Reload the shadow register. - * This function will help reload the shadow register without reseting the OCOTP module. - * Please make sure the OCOTP has been initialized before calling this API. - * - * @param base OCOTP peripheral base addess. - * @retval kStatus_Success Reload success. - * @retval kStatus_OCOTP_ReloadError Reload failed. - */ -status_t OCOTP_ReloadShadowRegister(OCOTP_Type *base); - -/*! - * @brief Read the fuse shadow register with the fuse addess. - * - * @deprecated Use @ref OCOTP_ReadFuseShadowRegisterExt instead of this function. - * - * @param base OCOTP peripheral base address. - * @param address the fuse address to be read from. - * @return The read out data. - */ -uint32_t OCOTP_ReadFuseShadowRegister(OCOTP_Type *base, uint32_t address); - -/*! - * @brief Read the fuse shadow register from the fuse addess. - * - * This function reads fuse from @p address, how many words to read is specified - * by the parameter @p fuseWords. This function could read at most - * OCOTP_READ_FUSE_DATA_COUNT fuse word one time. - * - * @param base OCOTP peripheral base address. - * @param address the fuse address to be read from. - * @param data Data array to save the readout fuse value. - * @param fuseWords How many words to read. - * @retval kStatus_Success Read success. - * @retval kStatus_Fail Error occurs during read. - */ -status_t OCOTP_ReadFuseShadowRegisterExt(OCOTP_Type *base, uint32_t address, uint32_t *data, uint8_t fuseWords); - -/*! - * @brief Write the fuse shadow register with the fuse addess and data. - * Please make sure the wrtie address is not locked while calling this API. - * - * @param base OCOTP peripheral base address. - * @param address the fuse address to be written. - * @param data the value will be writen to fuse address. - * @retval write status, kStatus_Success for success and kStatus_Fail for failed. - */ -status_t OCOTP_WriteFuseShadowRegister(OCOTP_Type *base, uint32_t address, uint32_t data); - -/*! - * @brief Write the fuse shadow register and lock it. - * - * Please make sure the wrtie address is not locked while calling this API. - * - * Some OCOTP controller supports ECC mode and redundancy mode (see reference mananual - * for more details). OCOTP controller will auto select ECC or redundancy - * mode to program the fuse word according to fuse map definition. In ECC mode, the - * 32 fuse bits in one word can only be written once. In redundancy mode, the word can - * be written more than once as long as they are different fuse bits. Set parameter - * @p lock as true to force use ECC mode. - * - * @param base OCOTP peripheral base address. - * @param address The fuse address to be written. - * @param data The value will be writen to fuse address. - * @param lock Lock or unlock write fuse shadow register operation. - * @retval kStatus_Success Program and reload success. - * @retval kStatus_OCOTP_Locked The eFuse word is locked and cannot be programmed. - * @retval kStatus_OCOTP_ProgramFail eFuse word programming failed. - * @retval kStatus_OCOTP_ReloadError eFuse word programming success, but - * error happens during reload the values. - * @retval kStatus_OCOTP_AccessError Cannot access eFuse word. - */ -status_t OCOTP_WriteFuseShadowRegisterWithLock(OCOTP_Type *base, uint32_t address, uint32_t data, bool lock); - -/*! - * @brief Get the OCOTP controller version from the register. - * - * @param base OCOTP peripheral base address. - * @retval return the version value. - */ -static inline uint32_t OCOTP_GetVersion(OCOTP_Type *base) -{ - return (base->VERSION); -} - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_OCOTP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_pit.c b/devices/MIMXRT1052/drivers/fsl_pit.c deleted file mode 100644 index 659de24..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pit.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_pit.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.pit" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Gets the instance from the base address to be used to gate or ungate the module clock - * - * @param base PIT peripheral base address - * - * @return The PIT instance - */ -static uint32_t PIT_GetInstance(PIT_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to PIT bases for each instance. */ -static PIT_Type *const s_pitBases[] = PIT_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to PIT clocks for each instance. */ -static const clock_ip_name_t s_pitClocks[] = PIT_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t PIT_GetInstance(PIT_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_pitBases); instance++) - { - if (s_pitBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_pitBases)); - - return instance; -} - -/*! - * brief Ungates the PIT clock, enables the PIT module, and configures the peripheral for basic operations. - * - * note This API should be called at the beginning of the application using the PIT driver. - * - * param base PIT peripheral base address - * param config Pointer to the user's PIT config structure - */ -void PIT_Init(PIT_Type *base, const pit_config_t *config) -{ - assert(NULL != config); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate the PIT clock*/ - CLOCK_EnableClock(s_pitClocks[PIT_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_PIT_HAS_MDIS) && FSL_FEATURE_PIT_HAS_MDIS - /* Enable PIT timers */ - base->MCR &= ~PIT_MCR_MDIS_MASK; -#endif - -#if defined(FSL_FEATURE_PIT_TIMER_COUNT) && (FSL_FEATURE_PIT_TIMER_COUNT) - /* Clear all status bits for all channels to make sure the status of all TCTRL registers is clean. */ - for (uint8_t i = 0U; i < (uint32_t)FSL_FEATURE_PIT_TIMER_COUNT; i++) - { - base->CHANNEL[i].TCTRL &= ~(PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK | PIT_TCTRL_CHN_MASK); - } -#endif /* FSL_FEATURE_PIT_TIMER_COUNT */ - - /* Config timer operation when in debug mode */ - if (true == config->enableRunInDebug) - { - base->MCR &= ~PIT_MCR_FRZ_MASK; - } - else - { - base->MCR |= PIT_MCR_FRZ_MASK; - } -} - -/*! - * brief Gates the PIT clock and disables the PIT module. - * - * param base PIT peripheral base address - */ -void PIT_Deinit(PIT_Type *base) -{ -#if defined(FSL_FEATURE_PIT_HAS_MDIS) && FSL_FEATURE_PIT_HAS_MDIS - /* Disable PIT timers */ - base->MCR |= PIT_MCR_MDIS_MASK; -#endif - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Gate the PIT clock*/ - CLOCK_DisableClock(s_pitClocks[PIT_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -#if defined(FSL_FEATURE_PIT_HAS_LIFETIME_TIMER) && FSL_FEATURE_PIT_HAS_LIFETIME_TIMER - -/*! - * brief Reads the current lifetime counter value. - * - * The lifetime timer is a 64-bit timer which chains timer 0 and timer 1 together. - * Timer 0 and 1 are chained by calling the PIT_SetTimerChainMode before using this timer. - * The period of lifetime timer is equal to the "period of timer 0 * period of timer 1". - * For the 64-bit value, the higher 32-bit has the value of timer 1, and the lower 32-bit - * has the value of timer 0. - * - * param base PIT peripheral base address - * - * return Current lifetime timer value - */ -uint64_t PIT_GetLifetimeTimerCount(PIT_Type *base) -{ - uint32_t valueH = 0U; - uint32_t valueL = 0U; - - /* LTMR64H should be read before LTMR64L */ - valueH = base->LTMR64H; - valueL = base->LTMR64L; - - return (((uint64_t)valueH << 32U) + (uint64_t)(valueL)); -} - -#endif /* FSL_FEATURE_PIT_HAS_LIFETIME_TIMER */ diff --git a/devices/MIMXRT1052/drivers/fsl_pit.h b/devices/MIMXRT1052/drivers/fsl_pit.h deleted file mode 100644 index 2b035d4..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pit.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_PIT_H_ -#define _FSL_PIT_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup pit - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief PIT Driver Version 2.0.4 */ -#define FSL_PIT_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) -/*@}*/ - -/*! - * @brief List of PIT channels - * @note Actual number of available channels is SoC dependent - */ -typedef enum _pit_chnl -{ - kPIT_Chnl_0 = 0U, /*!< PIT channel number 0*/ - kPIT_Chnl_1, /*!< PIT channel number 1 */ - kPIT_Chnl_2, /*!< PIT channel number 2 */ - kPIT_Chnl_3, /*!< PIT channel number 3 */ -} pit_chnl_t; - -/*! @brief List of PIT interrupts */ -typedef enum _pit_interrupt_enable -{ - kPIT_TimerInterruptEnable = PIT_TCTRL_TIE_MASK, /*!< Timer interrupt enable*/ -} pit_interrupt_enable_t; - -/*! @brief List of PIT status flags */ -typedef enum _pit_status_flags -{ - kPIT_TimerFlag = PIT_TFLG_TIF_MASK, /*!< Timer flag */ -} pit_status_flags_t; - -/*! - * @brief PIT configuration structure - * - * This structure holds the configuration settings for the PIT peripheral. To initialize this - * structure to reasonable defaults, call the PIT_GetDefaultConfig() function and pass a - * pointer to your config structure instance. - * - * The configuration structure can be made constant so it resides in flash. - */ -typedef struct _pit_config -{ - bool enableRunInDebug; /*!< true: Timers run in debug mode; false: Timers stop in debug mode */ -} pit_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Ungates the PIT clock, enables the PIT module, and configures the peripheral for basic operations. - * - * @note This API should be called at the beginning of the application using the PIT driver. - * - * @param base PIT peripheral base address - * @param config Pointer to the user's PIT config structure - */ -void PIT_Init(PIT_Type *base, const pit_config_t *config); - -/*! - * @brief Gates the PIT clock and disables the PIT module. - * - * @param base PIT peripheral base address - */ -void PIT_Deinit(PIT_Type *base); - -/*! - * @brief Fills in the PIT configuration structure with the default settings. - * - * The default values are as follows. - * @code - * config->enableRunInDebug = false; - * @endcode - * @param config Pointer to the configuration structure. - */ -static inline void PIT_GetDefaultConfig(pit_config_t *config) -{ - assert(NULL != config); - - /* Timers are stopped in Debug mode */ - config->enableRunInDebug = false; -} - -#if defined(FSL_FEATURE_PIT_HAS_CHAIN_MODE) && FSL_FEATURE_PIT_HAS_CHAIN_MODE - -/*! - * @brief Enables or disables chaining a timer with the previous timer. - * - * When a timer has a chain mode enabled, it only counts after the previous - * timer has expired. If the timer n-1 has counted down to 0, counter n - * decrements the value by one. Each timer is 32-bits, which allows the developers - * to chain timers together and form a longer timer (64-bits and larger). The first timer - * (timer 0) can't be chained to any other timer. - * - * @param base PIT peripheral base address - * @param channel Timer channel number which is chained with the previous timer - * @param enable Enable or disable chain. - * true: Current timer is chained with the previous timer. - * false: Timer doesn't chain with other timers. - */ -static inline void PIT_SetTimerChainMode(PIT_Type *base, pit_chnl_t channel, bool enable) -{ - if (enable) - { - base->CHANNEL[channel].TCTRL |= PIT_TCTRL_CHN_MASK; - } - else - { - base->CHANNEL[channel].TCTRL &= ~PIT_TCTRL_CHN_MASK; - } -} - -#endif /* FSL_FEATURE_PIT_HAS_CHAIN_MODE */ - -/*! @}*/ - -/*! - * @name Interrupt Interface - * @{ - */ - -/*! - * @brief Enables the selected PIT interrupts. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::pit_interrupt_enable_t - */ -static inline void PIT_EnableInterrupts(PIT_Type *base, pit_chnl_t channel, uint32_t mask) -{ - base->CHANNEL[channel].TCTRL |= mask; -} - -/*! - * @brief Disables the selected PIT interrupts. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * @param mask The interrupts to disable. This is a logical OR of members of the - * enumeration ::pit_interrupt_enable_t - */ -static inline void PIT_DisableInterrupts(PIT_Type *base, pit_chnl_t channel, uint32_t mask) -{ - base->CHANNEL[channel].TCTRL &= ~mask; -} - -/*! - * @brief Gets the enabled PIT interrupts. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration ::pit_interrupt_enable_t - */ -static inline uint32_t PIT_GetEnabledInterrupts(PIT_Type *base, pit_chnl_t channel) -{ - return (base->CHANNEL[channel].TCTRL & PIT_TCTRL_TIE_MASK); -} - -/*! @}*/ - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Gets the PIT status flags. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * - * @return The status flags. This is the logical OR of members of the - * enumeration ::pit_status_flags_t - */ -static inline uint32_t PIT_GetStatusFlags(PIT_Type *base, pit_chnl_t channel) -{ - return (base->CHANNEL[channel].TFLG & PIT_TFLG_TIF_MASK); -} - -/*! - * @brief Clears the PIT status flags. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::pit_status_flags_t - */ -static inline void PIT_ClearStatusFlags(PIT_Type *base, pit_chnl_t channel, uint32_t mask) -{ - base->CHANNEL[channel].TFLG = mask; -} - -/*! @}*/ - -/*! - * @name Read and Write the timer period - * @{ - */ - -/*! - * @brief Sets the timer period in units of count. - * - * Timers begin counting from the value set by this function until it reaches 0, - * then it generates an interrupt and load this register value again. - * Writing a new value to this register does not restart the timer. Instead, the value - * is loaded after the timer expires. - * - * @note Users can call the utility macros provided in fsl_common.h to convert to ticks. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * @param count Timer period in units of ticks - */ -static inline void PIT_SetTimerPeriod(PIT_Type *base, pit_chnl_t channel, uint32_t count) -{ - assert(count != 0U); - /* According to RM, the LDVAL trigger = clock ticks -1 */ - base->CHANNEL[channel].LDVAL = count - 1U; -} - -/*! - * @brief Reads the current timer counting value. - * - * This function returns the real-time timer counting value, in a range from 0 to a - * timer period. - * - * @note Users can call the utility macros provided in fsl_common.h to convert ticks to usec or msec. - * - * @param base PIT peripheral base address - * @param channel Timer channel number - * - * @return Current timer counting value in ticks - */ -static inline uint32_t PIT_GetCurrentTimerCount(PIT_Type *base, pit_chnl_t channel) -{ - return base->CHANNEL[channel].CVAL; -} - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ - -/*! - * @brief Starts the timer counting. - * - * After calling this function, timers load period value, count down to 0 and - * then load the respective start value again. Each time a timer reaches 0, - * it generates a trigger pulse and sets the timeout interrupt flag. - * - * @param base PIT peripheral base address - * @param channel Timer channel number. - */ -static inline void PIT_StartTimer(PIT_Type *base, pit_chnl_t channel) -{ - base->CHANNEL[channel].TCTRL |= PIT_TCTRL_TEN_MASK; -} - -/*! - * @brief Stops the timer counting. - * - * This function stops every timer counting. Timers reload their periods - * respectively after the next time they call the PIT_DRV_StartTimer. - * - * @param base PIT peripheral base address - * @param channel Timer channel number. - */ -static inline void PIT_StopTimer(PIT_Type *base, pit_chnl_t channel) -{ - base->CHANNEL[channel].TCTRL &= ~PIT_TCTRL_TEN_MASK; -} - -/*! @}*/ - -#if defined(FSL_FEATURE_PIT_HAS_LIFETIME_TIMER) && FSL_FEATURE_PIT_HAS_LIFETIME_TIMER - -/*! - * @brief Reads the current lifetime counter value. - * - * The lifetime timer is a 64-bit timer which chains timer 0 and timer 1 together. - * Timer 0 and 1 are chained by calling the PIT_SetTimerChainMode before using this timer. - * The period of lifetime timer is equal to the "period of timer 0 * period of timer 1". - * For the 64-bit value, the higher 32-bit has the value of timer 1, and the lower 32-bit - * has the value of timer 0. - * - * @param base PIT peripheral base address - * - * @return Current lifetime timer value - */ -uint64_t PIT_GetLifetimeTimerCount(PIT_Type *base); - -#endif /* FSL_FEATURE_PIT_HAS_LIFETIME_TIMER */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_PIT_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_pmu.c b/devices/MIMXRT1052/drivers/fsl_pmu.c deleted file mode 100644 index 8e8b047..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pmu.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#include "fsl_pmu.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.pmu" -#endif - -/*! - * name Status. - * { - */ - -uint32_t PMU_GetStatusFlags(PMU_Type *base) -{ - uint32_t ret = 0U; - - /* For 1P1. */ - if (PMU_REG_1P1_OK_VDD1P1_MASK == (PMU_REG_1P1_OK_VDD1P1_MASK & base->REG_1P1)) - { - ret |= (uint32_t)kPMU_1P1RegulatorOutputOK; - } - if (PMU_REG_1P1_BO_VDD1P1_MASK == (PMU_REG_1P1_BO_VDD1P1_MASK & base->REG_1P1)) - { - ret |= (uint32_t)kPMU_1P1BrownoutOnOutput; - } - - /* For 3P0. */ - if (PMU_REG_3P0_OK_VDD3P0_MASK == (PMU_REG_3P0_OK_VDD3P0_MASK & base->REG_3P0)) - { - ret |= (uint32_t)kPMU_3P0RegulatorOutputOK; - } - if (PMU_REG_3P0_BO_VDD3P0_MASK == (PMU_REG_3P0_BO_VDD3P0_MASK & base->REG_3P0)) - { - ret |= (uint32_t)kPMU_3P0BrownoutOnOutput; - } - - /* For 2P5. */ - if (PMU_REG_2P5_OK_VDD2P5_MASK == (PMU_REG_2P5_OK_VDD2P5_MASK & base->REG_2P5)) - { - ret |= (uint32_t)kPMU_2P5RegulatorOutputOK; - } - if (PMU_REG_2P5_BO_VDD2P5_MASK == (PMU_REG_2P5_BO_VDD2P5_MASK & base->REG_2P5)) - { - ret |= (uint32_t)kPMU_2P5BrownoutOnOutput; - } - - return ret; -} diff --git a/devices/MIMXRT1052/drivers/fsl_pmu.h b/devices/MIMXRT1052/drivers/fsl_pmu.h deleted file mode 100644 index 5e66473..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pmu.h +++ /dev/null @@ -1,671 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_PMU_H_ -#define _FSL_PMU_H_ - -#include "fsl_common.h" - -/*! @addtogroup pmu */ -/*! @{ */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief PMU driver version */ -#define FSL_PMU_DRIVER_VERSION (MAKE_VERSION(2, 1, 1)) /*!< Version 2.1.1. */ - /*@}*/ - -/*! - * @brief PMU Status flags. - */ -enum -{ - kPMU_1P1RegulatorOutputOK = (1U << 0U), /*!< Status bit that signals when the 1p1 regulator output - is ok. 1 = regulator output > brownout target. */ - kPMU_1P1BrownoutOnOutput = (1U << 1U), /*!< Status bit that signals when a 1p1 brownout is detected - on the regulator output. */ - kPMU_3P0RegulatorOutputOK = (1U << 2U), /*!< Status bit that signals when the 3p0 regulator output - is ok. 1 = regulator output > brownout target. */ - kPMU_3P0BrownoutOnOutput = (1U << 3U), /*!< Status bit that signals when a 3p0 brownout is detected - on the regulator output. */ - kPMU_2P5RegulatorOutputOK = (1U << 4U), /*!< Status bit that signals when the 2p5 regulator output - is ok. 1 = regulator output > brownout target. */ - kPMU_2P5BrownoutOnOutput = (1U << 5U), /*!< Status bit that signals when a 2p5 brownout is detected - on the regulator output. */ -}; - -/*! - * @brief The source for the reference voltage of the weak 1P1 regulator. - */ -typedef enum _pmu_1p1_weak_reference_source -{ - kPMU_1P1WeakReferenceSourceAlt0 = 0U, /*!< Weak-linreg output tracks low-power-bandgap voltage. */ - kPMU_1P1WeakReferenceSourceAlt1 = 1U, /*!< Weak-linreg output tracks VDD_SOC_CAP voltage. */ -} pmu_1p1_weak_reference_source_t; - -/*! - * @brief Input voltage source for LDO_3P0 from USB VBus. - */ -typedef enum _pmu_3p0_vbus_voltage_source -{ - kPMU_3P0VBusVoltageSourceAlt0 = 0U, /*!< USB_OTG1_VBUS - Utilize VBUS OTG1 for power. */ - kPMU_3P0VBusVoltageSourceAlt1 = 1U, /*!< USB_OTG2_VBUS - Utilize VBUS OTG2 for power. */ -} pmu_3p0_vbus_voltage_source_t; - -/*! - * @brief Regulator voltage ramp rate. - */ -typedef enum _pmu_core_reg_voltage_ramp_rate -{ - kPMU_CoreRegVoltageRampRateFast = 0U, /*!< Fast. */ - kPMU_CoreRegVoltageRampRateMediumFast = 1U, /*!< Medium Fast. */ - kPMU_CoreRegVoltageRampRateMediumSlow = 2U, /*!< Medium Slow. */ - kPMU_CoreRegVoltageRampRateSlow = 0U, /*!< Slow. */ -} pmu_core_reg_voltage_ramp_rate_t; - -#if defined(FSL_FEATURE_PMU_HAS_LOWPWR_CTRL) && FSL_FEATURE_PMU_HAS_LOWPWR_CTRL -/*! - * @brief Mask values of power gate. - */ -enum _pmu_power_gate -{ - kPMU_PowerGateDisplay = PMU_LOWPWR_CTRL_MIX_PWRGATE_MASK, /*!< Display power gate control. */ - kPMU_PowerGateDisplayLogic = PMU_LOWPWR_CTRL_DISPLAY_PWRGATE_MASK, /*!< Display logic power gate control. */ - kPMU_PowerGateL2 = PMU_LOWPWR_CTRL_L2_PWRGATE_MASK, /*!< L2 power gate control. */ - kPMU_PowerGateL1 = PMU_LOWPWR_CTRL_L1_PWRGATE_MASK, /*!< L1 power gate control. */ - kPMU_PowerGateRefTopIBias = PMU_LOWPWR_CTRL_REFTOP_IBIAS_OFF_MASK, /*!< Low power reftop ibias disable. */ -}; -#endif /* FSL_FEATURE_PMU_HAS_LOWPWR_CTRL. */ - -/*! - * @brief Bandgap select. - */ -typedef enum _pmu_power_bandgap -{ - kPMU_NormalPowerBandgap = 0U, /*!< Normal power bandgap. */ - kPMU_LowPowerBandgap = 1U, /*!< Low power bandgap. */ -} pmu_power_bandgap_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus*/ - -/*! - * @name Status. - * @{ - */ - -/*! - * @brief Get PMU status flags. - * - * @param base PMU peripheral base address. - * @return PMU status flags.It indicate if regulator output of 1P1,3P0 and 2P5 is ok - * and brownout output of 1P1,3P0 and 2P5 is detected. - */ -uint32_t PMU_GetStatusFlags(PMU_Type *base); - -/*@}*/ - -/*! - * @name 1P1 Regular - * @{ - */ - -/*! - * @brief Selects the source for the reference voltage of the weak 1P1 regulator. - * - * @param base PMU peripheral base address. - * @param option The option for reference voltage source, see to #pmu_1p1_weak_reference_source_t. - */ -static inline void PMU_1P1SetWeakReferenceSource(PMU_Type *base, pmu_1p1_weak_reference_source_t option) -{ - base->REG_1P1 = (base->REG_1P1 & ~PMU_REG_1P1_SELREF_WEAK_LINREG_MASK) | PMU_REG_1P1_SELREF_WEAK_LINREG(option); -} - -/*! - * @brief Enables the weak 1P1 regulator. - * - * This regulator can be used when the main 1P1 regulator is disabled, under low-power conditions. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_1P1EnableWeakRegulator(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_1P1 |= PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK; - } - else - { - base->REG_1P1 &= ~PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK; - } -} - -/*! - * @brief Adjust the 1P1 regulator output voltage. - * - * Each LSB is worth 25mV. Programming examples are detailed below. Other output target voltages - * may be interpolated from these examples. Choices must be in this range: - * - 0x1b(1.375V) >= output_trg >= 0x04(0.8V) - * - 0x04 : 0.8V - * - 0x10 : 1.1V (typical) - * - 0x1b : 1.375V - * NOTE: There may be reduced chip functionality or reliability at the extremes of the programming range. - * - * @param base PMU peripheral base address. - * @param value Setting value for the output. - */ -static inline void PMU_1P1SetRegulatorOutputVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_1P1 = (base->REG_1P1 & ~PMU_REG_1P1_OUTPUT_TRG_MASK) | PMU_REG_1P1_OUTPUT_TRG(value); -} - -/*! - * @brief Adjust the 1P1 regulator brownout offset voltage. - * - * Control bits to adjust the regulator brownout offset voltage in 25mV steps. The reset - * brown-offset is 175mV below the programmed target code. - * Brownout target = OUTPUT_TRG - BO_OFFSET. - * Some steps may be irrelevant because of input supply limitations or load operation. - * - * @param base PMU peripheral base address. - * @param value Setting value for the brownout offset. The available range is in 3-bit. - */ -static inline void PMU_1P1SetBrownoutOffsetVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_1P1 = (base->REG_1P1 & ~PMU_REG_1P1_BO_OFFSET_MASK) | PMU_REG_1P1_BO_OFFSET(value); -} - -/*! - * @brief Enable the pull-down circuitry in the regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_1P1EnablePullDown(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_1P1 |= PMU_REG_1P1_ENABLE_PULLDOWN_MASK; - } - else - { - base->REG_1P1 &= ~PMU_REG_1P1_ENABLE_PULLDOWN_MASK; - } -} - -/*! - * @brief Enable the current-limit circuitry in the regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_1P1EnableCurrentLimit(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_1P1 |= PMU_REG_1P1_ENABLE_ILIMIT_MASK; - } - else - { - base->REG_1P1 &= ~PMU_REG_1P1_ENABLE_ILIMIT_MASK; - } -} - -/*! - * @brief Enable the brownout circuitry in the regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_1P1EnableBrownout(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_1P1 |= PMU_REG_1P1_ENABLE_BO_MASK; - } - else - { - base->REG_1P1 &= ~PMU_REG_1P1_ENABLE_BO_MASK; - } -} - -/*! - * @brief Enable the regulator output. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_1P1EnableOutput(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_1P1 |= PMU_REG_1P1_ENABLE_LINREG_MASK; - } - else - { - base->REG_1P1 &= ~PMU_REG_1P1_ENABLE_LINREG_MASK; - } -} - -/*@}*/ - -/*! - * @name 3P0 Regular - * @{ - */ - -/*! - * @brief Adjust the 3P0 regulator output voltage. - * - * Each LSB is worth 25mV. Programming examples are detailed below. Other output target voltages - * may be interpolated from these examples. Choices must be in this range: - * - 0x00(2.625V) >= output_trg >= 0x1f(3.4V) - * - 0x00 : 2.625V - * - 0x0f : 3.0V (typical) - * - 0x1f : 3.4V - * - * @param base PMU peripheral base address. - * @param value Setting value for the output. - */ -static inline void PMU_3P0SetRegulatorOutputVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_3P0 = (base->REG_3P0 & ~PMU_REG_3P0_OUTPUT_TRG_MASK) | PMU_REG_3P0_OUTPUT_TRG(value); -} - -/*! - * @brief Select input voltage source for LDO_3P0. - * - * Select input voltage source for LDO_3P0 from either USB_OTG1_VBUS or USB_OTG2_VBUS. If only - * one of the two VBUS voltages is present, it is automatically selected. - * - * @param base PMU peripheral base address. - * @param option User-defined input voltage source for LDO_3P0. - */ -static inline void PMU_3P0SetVBusVoltageSource(PMU_Type *base, pmu_3p0_vbus_voltage_source_t option) -{ - base->REG_3P0 = (base->REG_3P0 & ~PMU_REG_3P0_VBUS_SEL_MASK) | PMU_REG_3P0_VBUS_SEL(option); -} - -/*! - * @brief Adjust the 3P0 regulator brownout offset voltage. - * - * Control bits to adjust the 3P0 regulator brownout offset voltage in 25mV steps. The reset - * brown-offset is 175mV below the programmed target code. - * Brownout target = OUTPUT_TRG - BO_OFFSET. - * Some steps may be irrelevant because of input supply limitations or load operation. - * - * @param base PMU peripheral base address. - * @param value Setting value for the brownout offset. The available range is in 3-bit. - */ -static inline void PMU_3P0SetBrownoutOffsetVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_3P0 = (base->REG_3P0 & ~PMU_REG_3P0_BO_OFFSET_MASK) | PMU_REG_3P0_BO_OFFSET(value); -} - -/*! - * @brief Enable the current-limit circuitry in the 3P0 regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_3P0EnableCurrentLimit(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_3P0 |= PMU_REG_3P0_ENABLE_ILIMIT_MASK; - } - else - { - base->REG_3P0 &= ~PMU_REG_3P0_ENABLE_ILIMIT_MASK; - } -} - -/*! - * @brief Enable the brownout circuitry in the 3P0 regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_3P0EnableBrownout(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_3P0 |= PMU_REG_3P0_ENABLE_BO_MASK; - } - else - { - base->REG_3P0 &= ~PMU_REG_3P0_ENABLE_BO_MASK; - } -} - -/*! - * @brief Enable the 3P0 regulator output. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_3P0EnableOutput(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_3P0 |= PMU_REG_3P0_ENABLE_LINREG_MASK; - } - else - { - base->REG_3P0 &= ~PMU_REG_3P0_ENABLE_LINREG_MASK; - } -} - -/* @} */ - -/*! - * @name 2P5 Regulator - * @{ - */ - -/*! - * @brief Enables the weak 2P5 regulator. - * - * This low power regulator is used when the main 2P5 regulator is disabled - * to keep the 2.5V output roughly at 2.5V. Scales directly with the value of VDDHIGH_IN. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_2P5EnableWeakRegulator(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK; - } -} - -/*! - * @brief Adjust the 1P1 regulator output voltage. - * - * Each LSB is worth 25mV. Programming examples are detailed below. Other output target voltages - * may be interpolated from these examples. Choices must be in this range: - * - 0x00(2.1V) >= output_trg >= 0x1f(2.875V) - * - 0x00 : 2.1V - * - 0x10 : 2.5V (typical) - * - 0x1f : 2.875V - * NOTE: There may be reduced chip functionality or reliability at the extremes of the programming range. - * - * @param base PMU peripheral base address. - * @param value Setting value for the output. - */ -static inline void PMU_2P5SetRegulatorOutputVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_2P5 = (base->REG_2P5 & ~PMU_REG_2P5_OUTPUT_TRG_MASK) | PMU_REG_2P5_OUTPUT_TRG(value); -} - -/*! - * @brief Adjust the 2P5 regulator brownout offset voltage. - * - * Adjust the regulator brownout offset voltage in 25mV steps. The reset - * brown-offset is 175mV below the programmed target code. - * Brownout target = OUTPUT_TRG - BO_OFFSET. - * Some steps may be irrelevant because of input supply limitations or load operation. - * - * @param base PMU peripheral base address. - * @param value Setting value for the brownout offset. The available range is in 3-bit. - */ -static inline void PMU_2P5SetBrownoutOffsetVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_2P5 = (base->REG_2P5 & ~PMU_REG_2P5_BO_OFFSET_MASK) | PMU_REG_2P5_BO_OFFSET(value); -} - -/*! - * @brief Enable the pull-down circuitry in the 2P5 regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_2P5EnablePullDown(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_PULLDOWN_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_PULLDOWN_MASK; - } -} - -/*! - * @brief Enable the pull-down circuitry in the 2P5 regulator. - * @deprecated Do not use this function. It has been superceded by @ref PMU_2P5EnablePullDown. - */ -static inline void PMU_2P1EnablePullDown(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_PULLDOWN_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_PULLDOWN_MASK; - } -} - -/*! - * @brief Enable the current-limit circuitry in the 2P5 regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_2P5EnableCurrentLimit(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_ILIMIT_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_ILIMIT_MASK; - } -} - -/*! - * @brief Enable the brownout circuitry in the 2P5 regulator. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_2P5nableBrownout(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_BO_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_BO_MASK; - } -} - -/*! - * @brief Enable the 2P5 regulator output. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_2P5EnableOutput(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_2P5 |= PMU_REG_2P5_ENABLE_LINREG_MASK; - } - else - { - base->REG_2P5 &= ~PMU_REG_2P5_ENABLE_LINREG_MASK; - } -} - -/* @} */ - -/*! - * @name Core Regulator - * @{ - */ - -/*! - * @brief Increase the gate drive on power gating FETs. - * - * If set, increases the gate drive on power gating FETs to reduce leakage in the off state. - * Care must be taken to apply this bit only when the input supply voltage to the power FET - * is less than 1.1V. - * NOTE: This bit should only be used in low-power modes where the external input supply voltage - * is nominally 0.9V. - * - * @param base PMU peripheral base address. - * @param enable Enable the feature or not. - */ -static inline void PMU_CoreEnableIncreaseGateDrive(PMU_Type *base, bool enable) -{ - if (enable) - { - base->REG_CORE |= PMU_REG_CORE_FET_ODRIVE_MASK; - } - else - { - base->REG_CORE &= ~PMU_REG_CORE_FET_ODRIVE_MASK; - } -} - -/*! - * @brief Set the CORE regulator voltage ramp rate. - * - * @param base PMU peripheral base address. - * @param option User-defined option for voltage ramp rate, see to #pmu_core_reg_voltage_ramp_rate_t. - */ -static inline void PMU_CoreSetRegulatorVoltageRampRate(PMU_Type *base, pmu_core_reg_voltage_ramp_rate_t option) -{ - base->REG_CORE = (base->REG_CORE & ~PMU_REG_CORE_RAMP_RATE_MASK) | PMU_REG_CORE_RAMP_RATE(option); -} - -/*! - * @brief Define the target voltage for the SOC power domain. - * - * Define the target voltage for the SOC power domain. Single-bit increments reflect 25mV core - * voltage steps. Some steps may not be relevant because of input supply limitations or load operation. - * - 0x00 : Power gated off. - * - 0x01 : Target core voltage = 0.725V - * - 0x02 : Target core voltage = 0.750V - * - ... - * - 0x10 : Target core voltage = 1.100V - * - ... - * - 0x1e : Target core voltage = 1.450V - * - 0x1F : Power FET switched full on. No regulation. - * NOTE: This register is capable of programming an over-voltage condition on the device. Consult the - * datasheet Operating Ranges table for the allowed voltages. - * - * @param base PMU peripheral base address. - * @param value Setting value for target voltage. 5-bit available - */ -static inline void PMU_CoreSetSOCDomainVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_CORE = (base->REG_CORE & ~PMU_REG_CORE_REG2_TARG_MASK) | PMU_REG_CORE_REG2_TARG(value); -} - -/*! - * @brief Define the target voltage for the ARM Core power domain. - * - * Define the target voltage for the ARM Core power domain. Single-bit increments reflect 25mV core - * voltage steps. Some steps may not be relevant because of input supply limitations or load operation. - * - 0x00 : Power gated off. - * - 0x01 : Target core voltage = 0.725V - * - 0x02 : Target core voltage = 0.750V - * - ... - * - 0x10 : Target core voltage = 1.100V - * - ... - * - 0x1e : Target core voltage = 1.450V - * - 0x1F : Power FET switched full on. No regulation. - * NOTE: This register is capable of programming an over-voltage condition on the device. Consult the - * datasheet Operating Ranges table for the allowed voltages. - * - * @param base PMU peripheral base address. - * @param value Setting value for target voltage. 5-bit available - */ -static inline void PMU_CoreSetARMCoreDomainVoltage(PMU_Type *base, uint32_t value) -{ - base->REG_CORE = (base->REG_CORE & ~PMU_REG_CORE_REG0_TARG_MASK) | PMU_REG_CORE_REG0_TARG(value); -} - -/* @} */ - -#if defined(FSL_FEATURE_PMU_HAS_LOWPWR_CTRL) && FSL_FEATURE_PMU_HAS_LOWPWR_CTRL -/*! - * @name Power Gate Controller & other - * @{ - */ - -/*! - * @brief Gate the power to modules. - * - * @param base PMU peripheral base address. - * @param gates Mask value for the module to be gated. See to #_pmu_power_gate. - */ -static inline void PMU_GatePower(PMU_Type *base, uint32_t gates) -{ - base->LOWPWR_CTRL_SET = gates; -} - -/*! - * @brief Ungate the power to modules. - * - * @param base PMU peripheral base address. - * @param gates Mask value for the module to be gated. See to #_pmu_power_gate. - */ -static inline void PMU_UngatePower(PMU_Type *base, uint32_t gates) -{ - base->LOWPWR_CTRL_CLR = gates; -} - -/*! - * @brief Enable the low power bandgap. - * - * @param base PMU peripheral base address. - * @param enable Enable the low power bandgap or use the normal power bandgap. - * @ - */ -static inline void PMU_EnableLowPowerBandgap(PMU_Type *base, bool enable) -{ - if (enable) - { - base->LOWPWR_CTRL_SET = PMU_LOWPWR_CTRL_LPBG_SEL_MASK; /* Use the low power bandgap. */ - } - else - { - base->LOWPWR_CTRL_CLR = PMU_LOWPWR_CTRL_LPBG_SEL_MASK; /* Use the normal power bandgap. */ - } -} -#endif /* FSL_FEATURE_PMU_HAS_LOWPWR_CTRL. */ -/* @} */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus*/ - -/*! @}*/ - -#endif /* _FSL_PMU_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_pwm.c b/devices/MIMXRT1052/drivers/fsl_pwm.c deleted file mode 100644 index d16fe3a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pwm.c +++ /dev/null @@ -1,935 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_pwm.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.pwm" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get the instance from the base address - * - * @param base PWM peripheral base address - * - * @return The PWM module instance - */ -static uint32_t PWM_GetInstance(PWM_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to PWM bases for each instance. */ -static PWM_Type *const s_pwmBases[] = PWM_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to PWM clocks for each PWM submodule. */ -static const clock_ip_name_t s_pwmClocks[][FSL_FEATURE_PWM_SUBMODULE_COUNT] = PWM_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Complement the variable of type uint16_t as needed - * - * This function can complement the variable of type uint16_t as needed.For example, - * need to ask for the opposite of a positive integer. - * - * param value Parameters of type uint16_t - */ -static inline uint16_t PWM_GetComplementU16(uint16_t value) -{ - return (~value + 1U); -} - -static inline uint16_t dutyCycleToReloadValue(uint8_t dutyCyclePercent) -{ - /* Rounding calculations to improve the accuracy of reloadValue */ - return ((65535U * dutyCyclePercent) + 50U) / 100U; -} - -static uint32_t PWM_GetInstance(PWM_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_pwmBases); instance++) - { - if (s_pwmBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_pwmBases)); - - return instance; -} - -/*! - * brief Ungates the PWM submodule clock and configures the peripheral for basic operation. - * - * note This API should be called at the beginning of the application using the PWM driver. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param config Pointer to user's PWM config structure. - * - * return kStatus_Success means success; else failed. - */ -status_t PWM_Init(PWM_Type *base, pwm_submodule_t subModule, const pwm_config_t *config) -{ - assert(config); - - uint16_t reg; - - /* Source clock for submodule 0 cannot be itself */ - if ((config->clockSource == kPWM_Submodule0Clock) && (subModule == kPWM_Module_0)) - { - return kStatus_Fail; - } - - /* Reload source select clock for submodule 0 cannot be master reload */ - if ((config->reloadSelect == kPWM_MasterReload) && (subModule == kPWM_Module_0)) - { - return kStatus_Fail; - } - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Ungate the PWM submodule clock*/ - CLOCK_EnableClock(s_pwmClocks[PWM_GetInstance(base)][subModule]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Clear the fault status flags */ - base->FSTS |= PWM_FSTS_FFLAG_MASK; - - reg = base->SM[subModule].CTRL2; - - /* Setup the submodule clock-source, control source of the INIT signal, - * source of the force output signal, operation in debug & wait modes and reload source select - */ - reg &= ~(uint16_t)(PWM_CTRL2_CLK_SEL_MASK | PWM_CTRL2_FORCE_SEL_MASK | PWM_CTRL2_INIT_SEL_MASK | - PWM_CTRL2_INDEP_MASK | PWM_CTRL2_WAITEN_MASK | PWM_CTRL2_DBGEN_MASK | PWM_CTRL2_RELOAD_SEL_MASK); - reg |= (PWM_CTRL2_CLK_SEL(config->clockSource) | PWM_CTRL2_FORCE_SEL(config->forceTrigger) | - PWM_CTRL2_INIT_SEL(config->initializationControl) | PWM_CTRL2_DBGEN(config->enableDebugMode) | - PWM_CTRL2_WAITEN(config->enableWait) | PWM_CTRL2_RELOAD_SEL(config->reloadSelect)); - - /* Setup PWM A & B to be independent or a complementary-pair */ - switch (config->pairOperation) - { - case kPWM_Independent: - reg |= PWM_CTRL2_INDEP_MASK; - break; - case kPWM_ComplementaryPwmA: - base->MCTRL &= ~((uint16_t)1U << (PWM_MCTRL_IPOL_SHIFT + (uint16_t)subModule)); - break; - case kPWM_ComplementaryPwmB: - base->MCTRL |= ((uint16_t)1U << (PWM_MCTRL_IPOL_SHIFT + (uint16_t)subModule)); - break; - default: - assert(false); - break; - } - base->SM[subModule].CTRL2 = reg; - - reg = base->SM[subModule].CTRL; - - /* Setup the clock prescale, load mode and frequency */ - reg &= ~(uint16_t)(PWM_CTRL_PRSC_MASK | PWM_CTRL_LDFQ_MASK | PWM_CTRL_LDMOD_MASK); - reg |= (PWM_CTRL_PRSC(config->prescale) | PWM_CTRL_LDFQ(config->reloadFrequency)); - - /* Setup register reload logic */ - switch (config->reloadLogic) - { - case kPWM_ReloadImmediate: - reg |= PWM_CTRL_LDMOD_MASK; - break; - case kPWM_ReloadPwmHalfCycle: - reg |= PWM_CTRL_HALF_MASK; - reg &= (uint16_t)(~PWM_CTRL_FULL_MASK); - break; - case kPWM_ReloadPwmFullCycle: - reg &= (uint16_t)(~PWM_CTRL_HALF_MASK); - reg |= PWM_CTRL_FULL_MASK; - break; - case kPWM_ReloadPwmHalfAndFullCycle: - reg |= PWM_CTRL_HALF_MASK; - reg |= PWM_CTRL_FULL_MASK; - break; - default: - assert(false); - break; - } - base->SM[subModule].CTRL = reg; - - /* Issue a Force trigger event when configured to trigger locally */ - if (config->forceTrigger == kPWM_Force_Local) - { - base->SM[subModule].CTRL2 |= PWM_CTRL2_FORCE(1U); - } - - return kStatus_Success; -} - -/*! - * brief Gate the PWM submodule clock - * - * param base PWM peripheral base address - * param subModule PWM submodule to deinitialize - */ -void PWM_Deinit(PWM_Type *base, pwm_submodule_t subModule) -{ - /* Stop the submodule */ - base->MCTRL &= ~((uint16_t)1U << (PWM_MCTRL_RUN_SHIFT + (uint16_t)subModule)); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Gate the PWM submodule clock*/ - CLOCK_DisableClock(s_pwmClocks[PWM_GetInstance(base)][subModule]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Fill in the PWM config struct with the default settings - * - * The default values are: - * code - * config->enableDebugMode = false; - * config->enableWait = false; - * config->reloadSelect = kPWM_LocalReload; - * config->clockSource = kPWM_BusClock; - * config->prescale = kPWM_Prescale_Divide_1; - * config->initializationControl = kPWM_Initialize_LocalSync; - * config->forceTrigger = kPWM_Force_Local; - * config->reloadFrequency = kPWM_LoadEveryOportunity; - * config->reloadLogic = kPWM_ReloadImmediate; - * config->pairOperation = kPWM_Independent; - * endcode - * param config Pointer to user's PWM config structure. - */ -void PWM_GetDefaultConfig(pwm_config_t *config) -{ - assert(config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - /* PWM is paused in debug mode */ - config->enableDebugMode = false; - /* PWM is paused in wait mode */ - config->enableWait = false; - /* PWM module uses the local reload signal to reload registers */ - config->reloadSelect = kPWM_LocalReload; - /* Use the IP Bus clock as source clock for the PWM submodule */ - config->clockSource = kPWM_BusClock; - /* Clock source prescale is set to divide by 1*/ - config->prescale = kPWM_Prescale_Divide_1; - /* Local sync causes initialization */ - config->initializationControl = kPWM_Initialize_LocalSync; - /* The local force signal, CTRL2[FORCE], from the submodule is used to force updates */ - config->forceTrigger = kPWM_Force_Local; - /* PWM reload frequency, reload opportunity is PWM half cycle or full cycle. - * This field is not used in Immediate reload mode - */ - config->reloadFrequency = kPWM_LoadEveryOportunity; - /* Buffered-registers get loaded with new values as soon as LDOK bit is set */ - config->reloadLogic = kPWM_ReloadImmediate; - /* PWM A & PWM B operate as 2 independent channels */ - config->pairOperation = kPWM_Independent; -} - -/*! - * brief Sets up the PWM signals for a PWM submodule. - * - * The function initializes the submodule according to the parameters passed in by the user. The function - * also sets up the value compare registers to match the PWM signal requirements. - * If the dead time insertion logic is enabled, the pulse period is reduced by the - * dead time period specified by the user. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param chnlParams Array of PWM channel parameters to configure the channel(s) - * param numOfChnls Number of channels to configure, this should be the size of the array passed in. - * Array size should not be more than 2 as each submodule has 2 pins to output PWM - * param mode PWM operation mode, options available in enumeration ::pwm_mode_t - * param pwmFreq_Hz PWM signal frequency in Hz - * param srcClock_Hz PWM main counter clock in Hz. - * - * return Returns kStatusFail if there was error setting up the signal; kStatusSuccess otherwise - */ -status_t PWM_SetupPwm(PWM_Type *base, - pwm_submodule_t subModule, - const pwm_signal_param_t *chnlParams, - uint8_t numOfChnls, - pwm_mode_t mode, - uint32_t pwmFreq_Hz, - uint32_t srcClock_Hz) -{ - assert(chnlParams); - assert(pwmFreq_Hz); - assert(numOfChnls); - assert(srcClock_Hz); - - uint32_t pwmClock; - uint16_t pulseCnt = 0, pwmHighPulse = 0; - uint16_t modulo = 0; - uint8_t i, polarityShift = 0, outputEnableShift = 0; - - if (numOfChnls > 2U) - { - /* Each submodule has 2 signals; PWM A & PWM B */ - return kStatus_Fail; - } - - /* Divide the clock by the prescale value */ - pwmClock = (srcClock_Hz / (1UL << ((base->SM[subModule].CTRL & PWM_CTRL_PRSC_MASK) >> PWM_CTRL_PRSC_SHIFT))); - pulseCnt = (uint16_t)(pwmClock / pwmFreq_Hz); - - /* Setup each PWM channel */ - for (i = 0; i < numOfChnls; i++) - { - /* Calculate pulse width */ - pwmHighPulse = (pulseCnt * chnlParams->dutyCyclePercent) / 100U; - - /* Setup the different match registers to generate the PWM signal */ - switch (mode) - { - case kPWM_SignedCenterAligned: - /* Setup the PWM period for a signed center aligned signal */ - if (i == 0U) - { - modulo = (pulseCnt >> 1U); - /* Indicates the start of the PWM period */ - base->SM[subModule].INIT = PWM_GetComplementU16(modulo); - /* Indicates the center value */ - base->SM[subModule].VAL0 = 0; - /* Indicates the end of the PWM period */ - /* The change during the end to start of the PWM period requires a count time */ - base->SM[subModule].VAL1 = modulo - 1U; - } - - /* Setup the PWM dutycycle */ - if (chnlParams->pwmChannel == kPWM_PwmA) - { - base->SM[subModule].VAL2 = PWM_GetComplementU16(pwmHighPulse / 2U); - base->SM[subModule].VAL3 = (pwmHighPulse / 2U); - } - else - { - base->SM[subModule].VAL4 = PWM_GetComplementU16(pwmHighPulse / 2U); - base->SM[subModule].VAL5 = (pwmHighPulse / 2U); - } - break; - case kPWM_CenterAligned: - /* Setup the PWM period for an unsigned center aligned signal */ - /* Indicates the start of the PWM period */ - if (i == 0U) - { - base->SM[subModule].INIT = 0; - /* Indicates the center value */ - base->SM[subModule].VAL0 = (pulseCnt / 2U); - /* Indicates the end of the PWM period */ - /* The change during the end to start of the PWM period requires a count time */ - base->SM[subModule].VAL1 = pulseCnt - 1U; - } - - /* Setup the PWM dutycycle */ - if (chnlParams->pwmChannel == kPWM_PwmA) - { - base->SM[subModule].VAL2 = ((pulseCnt - pwmHighPulse) / 2U); - base->SM[subModule].VAL3 = ((pulseCnt + pwmHighPulse) / 2U); - } - else - { - base->SM[subModule].VAL4 = ((pulseCnt - pwmHighPulse) / 2U); - base->SM[subModule].VAL5 = ((pulseCnt + pwmHighPulse) / 2U); - } - break; - case kPWM_SignedEdgeAligned: - /* Setup the PWM period for a signed edge aligned signal */ - if (i == 0U) - { - modulo = (pulseCnt >> 1U); - /* Indicates the start of the PWM period */ - base->SM[subModule].INIT = PWM_GetComplementU16(modulo); - /* Indicates the center value */ - base->SM[subModule].VAL0 = 0; - /* Indicates the end of the PWM period */ - /* The change during the end to start of the PWM period requires a count time */ - base->SM[subModule].VAL1 = modulo - 1U; - } - - /* Setup the PWM dutycycle */ - if (chnlParams->pwmChannel == kPWM_PwmA) - { - base->SM[subModule].VAL2 = PWM_GetComplementU16(modulo); - base->SM[subModule].VAL3 = PWM_GetComplementU16(modulo) + pwmHighPulse; - } - else - { - base->SM[subModule].VAL4 = PWM_GetComplementU16(modulo); - base->SM[subModule].VAL5 = PWM_GetComplementU16(modulo) + pwmHighPulse; - } - break; - case kPWM_EdgeAligned: - /* Setup the PWM period for a unsigned edge aligned signal */ - /* Indicates the start of the PWM period */ - if (i == 0U) - { - base->SM[subModule].INIT = 0; - /* Indicates the center value */ - base->SM[subModule].VAL0 = (pulseCnt / 2U); - /* Indicates the end of the PWM period */ - /* The change during the end to start of the PWM period requires a count time */ - base->SM[subModule].VAL1 = pulseCnt - 1U; - } - - /* Setup the PWM dutycycle */ - if (chnlParams->pwmChannel == kPWM_PwmA) - { - base->SM[subModule].VAL2 = 0; - base->SM[subModule].VAL3 = pwmHighPulse; - } - else - { - base->SM[subModule].VAL4 = 0; - base->SM[subModule].VAL5 = pwmHighPulse; - } - break; - default: - assert(false); - break; - } - /* Setup register shift values based on the channel being configured. - * Also setup the deadtime value - */ - if (chnlParams->pwmChannel == kPWM_PwmA) - { - polarityShift = PWM_OCTRL_POLA_SHIFT; - outputEnableShift = PWM_OUTEN_PWMA_EN_SHIFT; - base->SM[subModule].DTCNT0 = PWM_DTCNT0_DTCNT0(chnlParams->deadtimeValue); - } - else - { - polarityShift = PWM_OCTRL_POLB_SHIFT; - outputEnableShift = PWM_OUTEN_PWMB_EN_SHIFT; - base->SM[subModule].DTCNT1 = PWM_DTCNT1_DTCNT1(chnlParams->deadtimeValue); - } - - /* Set PWM output fault status */ - switch (chnlParams->pwmChannel) - { - case kPWM_PwmA: - base->SM[subModule].OCTRL &= ~((uint16_t)PWM_OCTRL_PWMAFS_MASK); - base->SM[subModule].OCTRL |= (((uint16_t)(chnlParams->faultState) << (uint16_t)PWM_OCTRL_PWMAFS_SHIFT) & - (uint16_t)PWM_OCTRL_PWMAFS_MASK); - break; - case kPWM_PwmB: - base->SM[subModule].OCTRL &= ~((uint16_t)PWM_OCTRL_PWMBFS_MASK); - base->SM[subModule].OCTRL |= (((uint16_t)(chnlParams->faultState) << (uint16_t)PWM_OCTRL_PWMBFS_SHIFT) & - (uint16_t)PWM_OCTRL_PWMBFS_MASK); - break; - case kPWM_PwmX: - base->SM[subModule].OCTRL &= ~((uint16_t)PWM_OCTRL_PWMXFS_MASK); - base->SM[subModule].OCTRL |= (((uint16_t)(chnlParams->faultState) << (uint16_t)PWM_OCTRL_PWMXFS_SHIFT) & - (uint16_t)PWM_OCTRL_PWMXFS_MASK); - break; - default: - assert(false); - break; - } - - /* Setup signal active level */ - if ((bool)chnlParams->level == kPWM_HighTrue) - { - base->SM[subModule].OCTRL &= ~((uint16_t)1U << (uint16_t)polarityShift); - } - else - { - base->SM[subModule].OCTRL |= ((uint16_t)1U << (uint16_t)polarityShift); - } - /* Enable PWM output */ - base->OUTEN |= ((uint16_t)1U << ((uint16_t)outputEnableShift + (uint16_t)subModule)); - - /* Get the next channel parameters */ - chnlParams++; - } - - return kStatus_Success; -} - -/*! - * brief Updates the PWM signal's dutycycle. - * - * The function updates the PWM dutycyle to the new value that is passed in. - * If the dead time insertion logic is enabled then the pulse period is reduced by the - * dead time period specified by the user. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param pwmSignal Signal (PWM A or PWM B) to update - * param currPwmMode The current PWM mode set during PWM setup - * param dutyCyclePercent New PWM pulse width, value should be between 0 to 100 - * 0=inactive signal(0% duty cycle)... - * 100=active signal (100% duty cycle) - */ -void PWM_UpdatePwmDutycycle(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmSignal, - pwm_mode_t currPwmMode, - uint8_t dutyCyclePercent) -{ - assert(dutyCyclePercent <= 100U); - assert((uint16_t)pwmSignal < 2U); - uint16_t reloadValue = dutyCycleToReloadValue(dutyCyclePercent); - - PWM_UpdatePwmDutycycleHighAccuracy(base, subModule, pwmSignal, currPwmMode, reloadValue); -} - -/*! - * brief Updates the PWM signal's dutycycle with 16-bit accuracy. - * - * The function updates the PWM dutycyle to the new value that is passed in. - * If the dead time insertion logic is enabled then the pulse period is reduced by the - * dead time period specified by the user. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param pwmSignal Signal (PWM A or PWM B) to update - * param currPwmMode The current PWM mode set during PWM setup - * param dutyCycle New PWM pulse width, value should be between 0 to 65535 - * 0=inactive signal(0% duty cycle)... - * 65535=active signal (100% duty cycle) - */ -void PWM_UpdatePwmDutycycleHighAccuracy( - PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmSignal, pwm_mode_t currPwmMode, uint16_t dutyCycle) -{ - assert((uint16_t)pwmSignal < 2U); - uint16_t pulseCnt = 0, pwmHighPulse = 0; - uint16_t modulo = 0; - - switch (currPwmMode) - { - case kPWM_SignedCenterAligned: - modulo = base->SM[subModule].VAL1 + 1U; - pulseCnt = modulo * 2U; - /* Calculate pulse width */ - pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; - - /* Setup the PWM dutycycle */ - if (pwmSignal == kPWM_PwmA) - { - base->SM[subModule].VAL2 = PWM_GetComplementU16(pwmHighPulse / 2U); - base->SM[subModule].VAL3 = (pwmHighPulse / 2U); - } - else - { - base->SM[subModule].VAL4 = PWM_GetComplementU16(pwmHighPulse / 2U); - base->SM[subModule].VAL5 = (pwmHighPulse / 2U); - } - break; - case kPWM_CenterAligned: - pulseCnt = base->SM[subModule].VAL1 + 1U; - /* Calculate pulse width */ - pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; - - /* Setup the PWM dutycycle */ - if (pwmSignal == kPWM_PwmA) - { - base->SM[subModule].VAL2 = ((pulseCnt - pwmHighPulse) / 2U); - base->SM[subModule].VAL3 = ((pulseCnt + pwmHighPulse) / 2U); - } - else - { - base->SM[subModule].VAL4 = ((pulseCnt - pwmHighPulse) / 2U); - base->SM[subModule].VAL5 = ((pulseCnt + pwmHighPulse) / 2U); - } - break; - case kPWM_SignedEdgeAligned: - modulo = base->SM[subModule].VAL1 + 1U; - pulseCnt = modulo * 2U; - /* Calculate pulse width */ - pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; - - /* Setup the PWM dutycycle */ - if (pwmSignal == kPWM_PwmA) - { - base->SM[subModule].VAL2 = PWM_GetComplementU16(modulo); - base->SM[subModule].VAL3 = PWM_GetComplementU16(modulo) + pwmHighPulse; - } - else - { - base->SM[subModule].VAL4 = PWM_GetComplementU16(modulo); - base->SM[subModule].VAL5 = PWM_GetComplementU16(modulo) + pwmHighPulse; - } - break; - case kPWM_EdgeAligned: - pulseCnt = base->SM[subModule].VAL1 + 1U; - /* Calculate pulse width */ - pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; - - /* Setup the PWM dutycycle */ - if (pwmSignal == kPWM_PwmA) - { - base->SM[subModule].VAL2 = 0; - base->SM[subModule].VAL3 = pwmHighPulse; - } - else - { - base->SM[subModule].VAL4 = 0; - base->SM[subModule].VAL5 = pwmHighPulse; - } - break; - default: - assert(false); - break; - } -} - -/*! - * brief Sets up the PWM input capture - * - * Each PWM submodule has 3 pins that can be configured for use as input capture pins. This function - * sets up the capture parameters for each pin and enables the pin for input capture operation. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param pwmChannel Channel in the submodule to setup - * param inputCaptureParams Parameters passed in to set up the input pin - */ -void PWM_SetupInputCapture(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmChannel, - const pwm_input_capture_param_t *inputCaptureParams) -{ - uint16_t reg = 0; - switch (pwmChannel) - { - case kPWM_PwmA: - /* Setup the capture paramters for PWM A pin */ - reg = (PWM_CAPTCTRLA_INP_SELA(inputCaptureParams->captureInputSel) | - PWM_CAPTCTRLA_EDGA0(inputCaptureParams->edge0) | PWM_CAPTCTRLA_EDGA1(inputCaptureParams->edge1) | - PWM_CAPTCTRLA_ONESHOTA(inputCaptureParams->enableOneShotCapture) | - PWM_CAPTCTRLA_CFAWM(inputCaptureParams->fifoWatermark)); - /* Enable the edge counter if using the output edge counter */ - if (inputCaptureParams->captureInputSel) - { - reg |= PWM_CAPTCTRLA_EDGCNTA_EN_MASK; - } - /* Enable input capture operation */ - reg |= PWM_CAPTCTRLA_ARMA_MASK; - - base->SM[subModule].CAPTCTRLA = reg; - - /* Setup the compare value when using the edge counter as source */ - base->SM[subModule].CAPTCOMPA = PWM_CAPTCOMPA_EDGCMPA(inputCaptureParams->edgeCompareValue); - /* Setup PWM A pin for input capture */ - base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMA_EN_SHIFT + (uint16_t)subModule)); - break; - case kPWM_PwmB: - /* Setup the capture paramters for PWM B pin */ - reg = (PWM_CAPTCTRLB_INP_SELB(inputCaptureParams->captureInputSel) | - PWM_CAPTCTRLB_EDGB0(inputCaptureParams->edge0) | PWM_CAPTCTRLB_EDGB1(inputCaptureParams->edge1) | - PWM_CAPTCTRLB_ONESHOTB(inputCaptureParams->enableOneShotCapture) | - PWM_CAPTCTRLB_CFBWM(inputCaptureParams->fifoWatermark)); - /* Enable the edge counter if using the output edge counter */ - if (inputCaptureParams->captureInputSel) - { - reg |= PWM_CAPTCTRLB_EDGCNTB_EN_MASK; - } - /* Enable input capture operation */ - reg |= PWM_CAPTCTRLB_ARMB_MASK; - - base->SM[subModule].CAPTCTRLB = reg; - - /* Setup the compare value when using the edge counter as source */ - base->SM[subModule].CAPTCOMPB = PWM_CAPTCOMPB_EDGCMPB(inputCaptureParams->edgeCompareValue); - /* Setup PWM B pin for input capture */ - base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMB_EN_SHIFT + (uint16_t)subModule)); - break; - case kPWM_PwmX: - reg = (PWM_CAPTCTRLX_INP_SELX(inputCaptureParams->captureInputSel) | - PWM_CAPTCTRLX_EDGX0(inputCaptureParams->edge0) | PWM_CAPTCTRLX_EDGX1(inputCaptureParams->edge1) | - PWM_CAPTCTRLX_ONESHOTX(inputCaptureParams->enableOneShotCapture) | - PWM_CAPTCTRLX_CFXWM(inputCaptureParams->fifoWatermark)); - /* Enable the edge counter if using the output edge counter */ - if (inputCaptureParams->captureInputSel) - { - reg |= PWM_CAPTCTRLX_EDGCNTX_EN_MASK; - } - /* Enable input capture operation */ - reg |= PWM_CAPTCTRLX_ARMX_MASK; - - base->SM[subModule].CAPTCTRLX = reg; - - /* Setup the compare value when using the edge counter as source */ - base->SM[subModule].CAPTCOMPX = PWM_CAPTCOMPX_EDGCMPX(inputCaptureParams->edgeCompareValue); - /* Setup PWM X pin for input capture */ - base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMX_EN_SHIFT + (uint16_t)subModule)); - break; - default: - assert(false); - break; - } -} - -/*! - * @brief Sets up the PWM fault input filter. - * - * @param base PWM peripheral base address - * @param faultInputFilterParams Parameters passed in to set up the fault input filter. - */ -void PWM_SetupFaultInputFilter(PWM_Type *base, const pwm_fault_input_filter_param_t *faultInputFilterParams) -{ - assert(NULL != faultInputFilterParams); - - /* When changing values for fault period from a non-zero value, first write a value of 0 to clear the filter. */ - if (0U != (base->FFILT & PWM_FFILT_FILT_PER_MASK)) - { - base->FFILT &= ~(uint16_t)(PWM_FFILT_FILT_PER_MASK); - } - - base->FFILT = (uint16_t)(PWM_FFILT_FILT_PER(faultInputFilterParams->faultFilterPeriod) | - PWM_FFILT_FILT_CNT(faultInputFilterParams->faultFilterCount) | - PWM_FFILT_GSTR(faultInputFilterParams->faultGlitchStretch ? 1U : 0U)); -} - -/*! - * brief Sets up the PWM fault protection. - * - * PWM has 4 fault inputs. - * - * param base PWM peripheral base address - * param faultNum PWM fault to configure. - * param faultParams Pointer to the PWM fault config structure - */ -void PWM_SetupFaults(PWM_Type *base, pwm_fault_input_t faultNum, const pwm_fault_param_t *faultParams) -{ - assert(faultParams); - uint16_t reg; - - reg = base->FCTRL; - /* Set the faults level-settting */ - if (faultParams->faultLevel) - { - reg |= ((uint16_t)1U << (PWM_FCTRL_FLVL_SHIFT + (uint16_t)faultNum)); - } - else - { - reg &= ~((uint16_t)1U << (PWM_FCTRL_FLVL_SHIFT + (uint16_t)faultNum)); - } - /* Set the fault clearing mode */ - if ((uint16_t)faultParams->faultClearingMode != 0U) - { - /* Use manual fault clearing */ - reg &= ~((uint16_t)1U << (PWM_FCTRL_FAUTO_SHIFT + (uint16_t)faultNum)); - if (faultParams->faultClearingMode == kPWM_ManualSafety) - { - /* Use manual fault clearing with safety mode enabled */ - reg |= ((uint16_t)1U << (PWM_FCTRL_FSAFE_SHIFT + (uint16_t)faultNum)); - } - else - { - /* Use manual fault clearing with safety mode disabled */ - reg &= ~((uint16_t)1U << (PWM_FCTRL_FSAFE_SHIFT + (uint16_t)faultNum)); - } - } - else - { - /* Use automatic fault clearing */ - reg |= ((uint16_t)1U << (PWM_FCTRL_FAUTO_SHIFT + (uint16_t)faultNum)); - } - base->FCTRL = reg; - - /* Set the combinational path option */ - if (faultParams->enableCombinationalPath) - { - /* Combinational path from the fault input to the PWM output is available */ - base->FCTRL2 &= ~((uint16_t)1U << (uint16_t)faultNum); - } - else - { - /* No combinational path available, only fault filter & latch signal can disable PWM output */ - base->FCTRL2 |= ((uint16_t)1U << (uint16_t)faultNum); - } - - /* Initially clear both recovery modes */ - reg = base->FSTS; - reg &= ~(((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)) | - ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum))); - /* Setup fault recovery */ - switch (faultParams->recoverMode) - { - case kPWM_NoRecovery: - break; - case kPWM_RecoverHalfCycle: - reg |= ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum)); - break; - case kPWM_RecoverFullCycle: - reg |= ((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)); - break; - case kPWM_RecoverHalfAndFullCycle: - reg |= ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum)); - reg |= ((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)); - break; - default: - assert(false); - break; - } - base->FSTS = reg; -} - -/*! - * brief Fill in the PWM fault config struct with the default settings - * - * The default values are: - * code - * config->faultClearingMode = kPWM_Automatic; - * config->faultLevel = false; - * config->enableCombinationalPath = true; - * config->recoverMode = kPWM_NoRecovery; - * endcode - * param config Pointer to user's PWM fault config structure. - */ -void PWM_FaultDefaultConfig(pwm_fault_param_t *config) -{ - assert(config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - /* PWM uses automatic fault clear mode */ - config->faultClearingMode = kPWM_Automatic; - /* PWM fault level is set to logic 0 */ - config->faultLevel = false; - /* Combinational Path from fault input is enabled */ - config->enableCombinationalPath = true; - /* PWM output will stay inactive when recovering from a fault */ - config->recoverMode = kPWM_NoRecovery; -} - -/*! - * brief Selects the signal to output on a PWM pin when a FORCE_OUT signal is asserted. - * - * The user specifies which channel to configure by supplying the submodule number and whether - * to modify PWM A or PWM B within that submodule. - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param pwmChannel Channel to configure - * param mode Signal to output when a FORCE_OUT is triggered - */ -void PWM_SetupForceSignal(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel, pwm_force_signal_t mode) - -{ - uint16_t shift; - uint16_t reg; - - /* DTSRCSEL register has 4 bits per submodule; 2 bits for PWM A and 2 bits for PWM B */ - shift = ((uint16_t)subModule * 4U) + ((uint16_t)pwmChannel * 2U); - - /* Setup the signal to be passed upon occurrence of a FORCE_OUT signal */ - reg = base->DTSRCSEL; - reg &= ~((uint16_t)0x3U << shift); - reg |= (uint16_t)((uint16_t)mode << shift); - base->DTSRCSEL = reg; -} - -/*! - * brief Enables the selected PWM interrupts - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -void PWM_EnableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) -{ - /* Upper 16 bits are for related to the submodule */ - base->SM[subModule].INTEN |= ((uint16_t)mask & 0xFFFFU); - /* Fault related interrupts */ - base->FCTRL |= ((uint16_t)(mask >> 16U) & PWM_FCTRL_FIE_MASK); -} - -/*! - * brief Disables the selected PWM interrupts - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -void PWM_DisableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) -{ - base->SM[subModule].INTEN &= ~((uint16_t)mask & 0xFFFFU); - base->FCTRL &= ~((uint16_t)(mask >> 16U) & PWM_FCTRL_FIE_MASK); -} - -/*! - * brief Gets the enabled PWM interrupts - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * - * return The enabled interrupts. This is the logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -uint32_t PWM_GetEnabledInterrupts(PWM_Type *base, pwm_submodule_t subModule) -{ - uint32_t enabledInterrupts; - - enabledInterrupts = base->SM[subModule].INTEN; - enabledInterrupts |= (((uint32_t)base->FCTRL & PWM_FCTRL_FIE_MASK) << 16UL); - return enabledInterrupts; -} - -/*! - * brief Gets the PWM status flags - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * - * return The status flags. This is the logical OR of members of the - * enumeration ::pwm_status_flags_t - */ -uint32_t PWM_GetStatusFlags(PWM_Type *base, pwm_submodule_t subModule) -{ - uint32_t statusFlags; - - statusFlags = base->SM[subModule].STS; - statusFlags |= (((uint32_t)base->FSTS & PWM_FSTS_FFLAG_MASK) << 16UL); - - return statusFlags; -} - -/*! - * brief Clears the PWM status flags - * - * param base PWM peripheral base address - * param subModule PWM submodule to configure - * param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::pwm_status_flags_t - */ -void PWM_ClearStatusFlags(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) -{ - uint16_t reg; - - base->SM[subModule].STS = ((uint16_t)mask & 0xFFFFU); - reg = base->FSTS; - /* Clear the fault flags and set only the ones we wish to clear as the fault flags are cleared - * by writing a login one - */ - reg &= ~(uint16_t)(PWM_FSTS_FFLAG_MASK); - reg |= (uint16_t)((mask >> 16U) & PWM_FSTS_FFLAG_MASK); - base->FSTS = reg; -} diff --git a/devices/MIMXRT1052/drivers/fsl_pwm.h b/devices/MIMXRT1052/drivers/fsl_pwm.h deleted file mode 100644 index 081abf1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pwm.h +++ /dev/null @@ -1,987 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_PWM_H_ -#define _FSL_PWM_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup pwm_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_PWM_DRIVER_VERSION (MAKE_VERSION(2, 2, 1)) /*!< Version 2.2.1 */ -/*@}*/ - -/*! Number of bits per submodule for software output control */ -#define PWM_SUBMODULE_SWCONTROL_WIDTH 2 - -/*! @brief List of PWM submodules */ -typedef enum _pwm_submodule -{ - kPWM_Module_0 = 0U, /*!< Submodule 0 */ - kPWM_Module_1, /*!< Submodule 1 */ - kPWM_Module_2, /*!< Submodule 2 */ - kPWM_Module_3 /*!< Submodule 3 */ -} pwm_submodule_t; - -/*! @brief List of PWM channels in each module */ -typedef enum _pwm_channels -{ - kPWM_PwmB = 0U, - kPWM_PwmA, - kPWM_PwmX -} pwm_channels_t; - -/*! @brief List of PWM value registers */ -typedef enum _pwm_value_register -{ - kPWM_ValueRegister_0 = 0U, /*!< PWM Value0 register */ - kPWM_ValueRegister_1, /*!< PWM Value1 register */ - kPWM_ValueRegister_2, /*!< PWM Value2 register */ - kPWM_ValueRegister_3, /*!< PWM Value3 register */ - kPWM_ValueRegister_4, /*!< PWM Value4 register */ - kPWM_ValueRegister_5 /*!< PWM Value5 register */ -} pwm_value_register_t; - -/*! @brief List of PWM value registers mask */ -enum _pwm_value_register_mask -{ - kPWM_ValueRegisterMask_0 = (1U << 0), /*!< PWM Value0 register mask */ - kPWM_ValueRegisterMask_1 = (1U << 1), /*!< PWM Value1 register mask */ - kPWM_ValueRegisterMask_2 = (1U << 2), /*!< PWM Value2 register mask */ - kPWM_ValueRegisterMask_3 = (1U << 3), /*!< PWM Value3 register mask */ - kPWM_ValueRegisterMask_4 = (1U << 4), /*!< PWM Value4 register mask */ - kPWM_ValueRegisterMask_5 = (1U << 5) /*!< PWM Value5 register mask */ -}; - -/*! @brief PWM clock source selection.*/ -typedef enum _pwm_clock_source -{ - kPWM_BusClock = 0U, /*!< The IPBus clock is used as the clock */ - kPWM_ExternalClock, /*!< EXT_CLK is used as the clock */ - kPWM_Submodule0Clock /*!< Clock of the submodule 0 (AUX_CLK) is used as the source clock */ -} pwm_clock_source_t; - -/*! @brief PWM prescaler factor selection for clock source*/ -typedef enum _pwm_clock_prescale -{ - kPWM_Prescale_Divide_1 = 0U, /*!< PWM clock frequency = fclk/1 */ - kPWM_Prescale_Divide_2, /*!< PWM clock frequency = fclk/2 */ - kPWM_Prescale_Divide_4, /*!< PWM clock frequency = fclk/4 */ - kPWM_Prescale_Divide_8, /*!< PWM clock frequency = fclk/8 */ - kPWM_Prescale_Divide_16, /*!< PWM clock frequency = fclk/16 */ - kPWM_Prescale_Divide_32, /*!< PWM clock frequency = fclk/32 */ - kPWM_Prescale_Divide_64, /*!< PWM clock frequency = fclk/64 */ - kPWM_Prescale_Divide_128 /*!< PWM clock frequency = fclk/128 */ -} pwm_clock_prescale_t; - -/*! @brief Options that can trigger a PWM FORCE_OUT */ -typedef enum _pwm_force_output_trigger -{ - kPWM_Force_Local = 0U, /*!< The local force signal, CTRL2[FORCE], from the submodule is used to force updates */ - kPWM_Force_Master, /*!< The master force signal from submodule 0 is used to force updates */ - kPWM_Force_LocalReload, /*!< The local reload signal from this submodule is used to force updates without regard to - the state of LDOK */ - kPWM_Force_MasterReload, /*!< The master reload signal from submodule 0 is used to force updates if LDOK is set */ - kPWM_Force_LocalSync, /*!< The local sync signal from this submodule is used to force updates */ - kPWM_Force_MasterSync, /*!< The master sync signal from submodule0 is used to force updates */ - kPWM_Force_External, /*!< The external force signal, EXT_FORCE, from outside the PWM module causes updates */ - kPWM_Force_ExternalSync /*!< The external sync signal, EXT_SYNC, from outside the PWM module causes updates */ -} pwm_force_output_trigger_t; - -/*! @brief PWM counter initialization options */ -typedef enum _pwm_init_source -{ - kPWM_Initialize_LocalSync = 0U, /*!< Local sync causes initialization */ - kPWM_Initialize_MasterReload, /*!< Master reload from submodule 0 causes initialization */ - kPWM_Initialize_MasterSync, /*!< Master sync from submodule 0 causes initialization */ - kPWM_Initialize_ExtSync /*!< EXT_SYNC causes initialization */ -} pwm_init_source_t; - -/*! @brief PWM load frequency selection */ -typedef enum _pwm_load_frequency -{ - kPWM_LoadEveryOportunity = 0U, /*!< Every PWM opportunity */ - kPWM_LoadEvery2Oportunity, /*!< Every 2 PWM opportunities */ - kPWM_LoadEvery3Oportunity, /*!< Every 3 PWM opportunities */ - kPWM_LoadEvery4Oportunity, /*!< Every 4 PWM opportunities */ - kPWM_LoadEvery5Oportunity, /*!< Every 5 PWM opportunities */ - kPWM_LoadEvery6Oportunity, /*!< Every 6 PWM opportunities */ - kPWM_LoadEvery7Oportunity, /*!< Every 7 PWM opportunities */ - kPWM_LoadEvery8Oportunity, /*!< Every 8 PWM opportunities */ - kPWM_LoadEvery9Oportunity, /*!< Every 9 PWM opportunities */ - kPWM_LoadEvery10Oportunity, /*!< Every 10 PWM opportunities */ - kPWM_LoadEvery11Oportunity, /*!< Every 11 PWM opportunities */ - kPWM_LoadEvery12Oportunity, /*!< Every 12 PWM opportunities */ - kPWM_LoadEvery13Oportunity, /*!< Every 13 PWM opportunities */ - kPWM_LoadEvery14Oportunity, /*!< Every 14 PWM opportunities */ - kPWM_LoadEvery15Oportunity, /*!< Every 15 PWM opportunities */ - kPWM_LoadEvery16Oportunity /*!< Every 16 PWM opportunities */ -} pwm_load_frequency_t; - -/*! @brief List of PWM fault selections */ -typedef enum _pwm_fault_input -{ - kPWM_Fault_0 = 0U, /*!< Fault 0 input pin */ - kPWM_Fault_1, /*!< Fault 1 input pin */ - kPWM_Fault_2, /*!< Fault 2 input pin */ - kPWM_Fault_3 /*!< Fault 3 input pin */ -} pwm_fault_input_t; - -/*! @brief List of PWM fault disable mapping selections */ -typedef enum _pwm_fault_disable -{ - kPWM_FaultDisable_0 = (1U << 0), /*!< Fault 0 disable mapping */ - kPWM_FaultDisable_1 = (1U << 1), /*!< Fault 1 disable mapping */ - kPWM_FaultDisable_2 = (1U << 2), /*!< Fault 2 disable mapping */ - kPWM_FaultDisable_3 = (1U << 3) /*!< Fault 3 disable mapping */ -} pwm_fault_disable_t; - -/*! @brief List of PWM fault channels */ -typedef enum _pwm_fault_channels -{ - kPWM_faultchannel_0 = 0U, - kPWM_faultchannel_1 -} pwm_fault_channels_t; - -/*! @brief PWM capture edge select */ -typedef enum _pwm_input_capture_edge -{ - kPWM_Disable = 0U, /*!< Disabled */ - kPWM_FallingEdge, /*!< Capture on falling edge only */ - kPWM_RisingEdge, /*!< Capture on rising edge only */ - kPWM_RiseAndFallEdge /*!< Capture on rising or falling edge */ -} pwm_input_capture_edge_t; - -/*! @brief PWM output options when a FORCE_OUT signal is asserted */ -typedef enum _pwm_force_signal -{ - kPWM_UsePwm = 0U, /*!< Generated PWM signal is used by the deadtime logic.*/ - kPWM_InvertedPwm, /*!< Inverted PWM signal is used by the deadtime logic.*/ - kPWM_SoftwareControl, /*!< Software controlled value is used by the deadtime logic. */ - kPWM_UseExternal /*!< PWM_EXTA signal is used by the deadtime logic. */ -} pwm_force_signal_t; - -/*! @brief Options available for the PWM A & B pair operation */ -typedef enum _pwm_chnl_pair_operation -{ - kPWM_Independent = 0U, /*!< PWM A & PWM B operate as 2 independent channels */ - kPWM_ComplementaryPwmA, /*!< PWM A & PWM B are complementary channels, PWM A generates the signal */ - kPWM_ComplementaryPwmB /*!< PWM A & PWM B are complementary channels, PWM B generates the signal */ -} pwm_chnl_pair_operation_t; - -/*! @brief Options available on how to load the buffered-registers with new values */ -typedef enum _pwm_register_reload -{ - kPWM_ReloadImmediate = 0U, /*!< Buffered-registers get loaded with new values as soon as LDOK bit is set */ - kPWM_ReloadPwmHalfCycle, /*!< Registers loaded on a PWM half cycle */ - kPWM_ReloadPwmFullCycle, /*!< Registers loaded on a PWM full cycle */ - kPWM_ReloadPwmHalfAndFullCycle /*!< Registers loaded on a PWM half & full cycle */ -} pwm_register_reload_t; - -/*! @brief Options available on how to re-enable the PWM output when recovering from a fault */ -typedef enum _pwm_fault_recovery_mode -{ - kPWM_NoRecovery = 0U, /*!< PWM output will stay inactive */ - kPWM_RecoverHalfCycle, /*!< PWM output re-enabled at the first half cycle */ - kPWM_RecoverFullCycle, /*!< PWM output re-enabled at the first full cycle */ - kPWM_RecoverHalfAndFullCycle /*!< PWM output re-enabled at the first half or full cycle */ -} pwm_fault_recovery_mode_t; - -/*! @brief List of PWM interrupt options */ -typedef enum _pwm_interrupt_enable -{ - kPWM_CompareVal0InterruptEnable = (1U << 0), /*!< PWM VAL0 compare interrupt */ - kPWM_CompareVal1InterruptEnable = (1U << 1), /*!< PWM VAL1 compare interrupt */ - kPWM_CompareVal2InterruptEnable = (1U << 2), /*!< PWM VAL2 compare interrupt */ - kPWM_CompareVal3InterruptEnable = (1U << 3), /*!< PWM VAL3 compare interrupt */ - kPWM_CompareVal4InterruptEnable = (1U << 4), /*!< PWM VAL4 compare interrupt */ - kPWM_CompareVal5InterruptEnable = (1U << 5), /*!< PWM VAL5 compare interrupt */ - kPWM_CaptureX0InterruptEnable = (1U << 6), /*!< PWM capture X0 interrupt */ - kPWM_CaptureX1InterruptEnable = (1U << 7), /*!< PWM capture X1 interrupt */ - kPWM_CaptureB0InterruptEnable = (1U << 8), /*!< PWM capture B0 interrupt */ - kPWM_CaptureB1InterruptEnable = (1U << 9), /*!< PWM capture B1 interrupt */ - kPWM_CaptureA0InterruptEnable = (1U << 10), /*!< PWM capture A0 interrupt */ - kPWM_CaptureA1InterruptEnable = (1U << 11), /*!< PWM capture A1 interrupt */ - kPWM_ReloadInterruptEnable = (1U << 12), /*!< PWM reload interrupt */ - kPWM_ReloadErrorInterruptEnable = (1U << 13), /*!< PWM reload error interrupt */ - kPWM_Fault0InterruptEnable = (1U << 16), /*!< PWM fault 0 interrupt */ - kPWM_Fault1InterruptEnable = (1U << 17), /*!< PWM fault 1 interrupt */ - kPWM_Fault2InterruptEnable = (1U << 18), /*!< PWM fault 2 interrupt */ - kPWM_Fault3InterruptEnable = (1U << 19) /*!< PWM fault 3 interrupt */ -} pwm_interrupt_enable_t; - -/*! @brief List of PWM status flags */ -typedef enum _pwm_status_flags -{ - kPWM_CompareVal0Flag = (1U << 0), /*!< PWM VAL0 compare flag */ - kPWM_CompareVal1Flag = (1U << 1), /*!< PWM VAL1 compare flag */ - kPWM_CompareVal2Flag = (1U << 2), /*!< PWM VAL2 compare flag */ - kPWM_CompareVal3Flag = (1U << 3), /*!< PWM VAL3 compare flag */ - kPWM_CompareVal4Flag = (1U << 4), /*!< PWM VAL4 compare flag */ - kPWM_CompareVal5Flag = (1U << 5), /*!< PWM VAL5 compare flag */ - kPWM_CaptureX0Flag = (1U << 6), /*!< PWM capture X0 flag */ - kPWM_CaptureX1Flag = (1U << 7), /*!< PWM capture X1 flag */ - kPWM_CaptureB0Flag = (1U << 8), /*!< PWM capture B0 flag */ - kPWM_CaptureB1Flag = (1U << 9), /*!< PWM capture B1 flag */ - kPWM_CaptureA0Flag = (1U << 10), /*!< PWM capture A0 flag */ - kPWM_CaptureA1Flag = (1U << 11), /*!< PWM capture A1 flag */ - kPWM_ReloadFlag = (1U << 12), /*!< PWM reload flag */ - kPWM_ReloadErrorFlag = (1U << 13), /*!< PWM reload error flag */ - kPWM_RegUpdatedFlag = (1U << 14), /*!< PWM registers updated flag */ - kPWM_Fault0Flag = (1U << 16), /*!< PWM fault 0 flag */ - kPWM_Fault1Flag = (1U << 17), /*!< PWM fault 1 flag */ - kPWM_Fault2Flag = (1U << 18), /*!< PWM fault 2 flag */ - kPWM_Fault3Flag = (1U << 19) /*!< PWM fault 3 flag */ -} pwm_status_flags_t; - -/*! @brief List of PWM DMA options */ -typedef enum _pwm_dma_enable -{ - kPWM_CaptureX0DMAEnable = (1U << 0), /*!< PWM capture X0 DMA */ - kPWM_CaptureX1DMAEnable = (1U << 1), /*!< PWM capture X1 DMA */ - kPWM_CaptureB0DMAEnable = (1U << 2), /*!< PWM capture B0 DMA */ - kPWM_CaptureB1DMAEnable = (1U << 3), /*!< PWM capture B1 DMA */ - kPWM_CaptureA0DMAEnable = (1U << 4), /*!< PWM capture A0 DMA */ - kPWM_CaptureA1DMAEnable = (1U << 5) /*!< PWM capture A1 DMA */ -} pwm_dma_enable_t; - -/*! @brief List of PWM capture DMA enable source select */ -typedef enum _pwm_dma_source_select -{ - kPWM_DMARequestDisable = 0U, /*!< Read DMA requests disabled */ - kPWM_DMAWatermarksEnable, /*!< Exceeding a FIFO watermark sets the DMA read request */ - kPWM_DMALocalSync, /*!< A local sync (VAL1 matches counter) sets the read DMA request */ - kPWM_DMALocalReload /*!< A local reload (STS[RF] being set) sets the read DMA request */ -} pwm_dma_source_select_t; - -/*! @brief PWM FIFO Watermark AND Control */ -typedef enum _pwm_watermark_control -{ - kPWM_FIFOWatermarksOR = 0U, /*!< Selected FIFO watermarks are OR'ed together */ - kPWM_FIFOWatermarksAND /*!< Selected FIFO watermarks are AND'ed together */ -} pwm_watermark_control_t; - -/*! @brief PWM operation mode */ -typedef enum _pwm_mode -{ - kPWM_SignedCenterAligned = 0U, /*!< Signed center-aligned */ - kPWM_CenterAligned, /*!< Unsigned cente-aligned */ - kPWM_SignedEdgeAligned, /*!< Signed edge-aligned */ - kPWM_EdgeAligned /*!< Unsigned edge-aligned */ -} pwm_mode_t; - -/*! @brief PWM output pulse mode, high-true or low-true */ -typedef enum _pwm_level_select -{ - kPWM_HighTrue = 0U, /*!< High level represents "on" or "active" state */ - kPWM_LowTrue /*!< Low level represents "on" or "active" state */ -} pwm_level_select_t; - -/*! @brief PWM output fault status */ -typedef enum _pwm_fault_state -{ - kPWM_PwmFaultState0 = - 0U, /*!< Output is forced to logic 0 state prior to consideration of output polarity control. */ - kPWM_PwmFaultState1, /*!< Output is forced to logic 1 state prior to consideration of output polarity control. */ - kPWM_PwmFaultState2, /*!< Output is tristated. */ - kPWM_PwmFaultState3 /*!< Output is tristated. */ -} pwm_fault_state_t; - -/*! @brief PWM reload source select */ -typedef enum _pwm_reload_source_select -{ - kPWM_LocalReload = 0U, /*!< The local reload signal is used to reload registers */ - kPWM_MasterReload /*!< The master reload signal (from submodule 0) is used to reload */ -} pwm_reload_source_select_t; - -/*! @brief PWM fault clearing options */ -typedef enum _pwm_fault_clear -{ - kPWM_Automatic = 0U, /*!< Automatic fault clearing */ - kPWM_ManualNormal, /*!< Manual fault clearing with no fault safety mode */ - kPWM_ManualSafety /*!< Manual fault clearing with fault safety mode */ -} pwm_fault_clear_t; - -/*! @brief Options for submodule master control operation */ -typedef enum _pwm_module_control -{ - kPWM_Control_Module_0 = (1U << 0), /*!< Control submodule 0's start/stop,buffer reload operation */ - kPWM_Control_Module_1 = (1U << 1), /*!< Control submodule 1's start/stop,buffer reload operation */ - kPWM_Control_Module_2 = (1U << 2), /*!< Control submodule 2's start/stop,buffer reload operation */ - kPWM_Control_Module_3 = (1U << 3) /*!< Control submodule 3's start/stop,buffer reload operation */ -} pwm_module_control_t; - -/*! @brief Structure for the user to define the PWM signal characteristics */ -typedef struct _pwm_signal_param -{ - pwm_channels_t pwmChannel; /*!< PWM channel being configured; PWM A or PWM B */ - uint8_t dutyCyclePercent; /*!< PWM pulse width, value should be between 0 to 100 - 0=inactive signal(0% duty cycle)... - 100=always active signal (100% duty cycle)*/ - pwm_level_select_t level; /*!< PWM output active level select */ - uint16_t deadtimeValue; /*!< The deadtime value; only used if channel pair is operating in complementary mode */ - pwm_fault_state_t faultState; /*!< PWM output fault status */ -} pwm_signal_param_t; - -/*! - * @brief PWM config structure - * - * This structure holds the configuration settings for the PWM peripheral. To initialize this - * structure to reasonable defaults, call the PWM_GetDefaultConfig() function and pass a - * pointer to your config structure instance. - * - * The config struct can be made const so it resides in flash - */ -typedef struct _pwm_config -{ - bool enableDebugMode; /*!< true: PWM continues to run in debug mode; - false: PWM is paused in debug mode */ - bool enableWait; /*!< true: PWM continues to run in WAIT mode; - false: PWM is paused in WAIT mode */ - pwm_init_source_t initializationControl; /*!< Option to initialize the counter */ - pwm_clock_source_t clockSource; /*!< Clock source for the counter */ - pwm_clock_prescale_t prescale; /*!< Pre-scaler to divide down the clock */ - pwm_chnl_pair_operation_t pairOperation; /*!< Channel pair in indepedent or complementary mode */ - pwm_register_reload_t reloadLogic; /*!< PWM Reload logic setup */ - pwm_reload_source_select_t reloadSelect; /*!< Reload source select */ - pwm_load_frequency_t reloadFrequency; /*!< Specifies when to reload, used when user's choice - is not immediate reload */ - pwm_force_output_trigger_t forceTrigger; /*!< Specify which signal will trigger a FORCE_OUT */ -} pwm_config_t; - -/*! @brief Structure for the user to configure the fault input filter. */ -typedef struct _pwm_fault_input_filter_param -{ - uint8_t faultFilterCount; /*!< Fault filter count */ - uint8_t faultFilterPeriod; /*!< Fault filter period;value of 0 will bypass the filter */ - bool faultGlitchStretch; /*!< Fault Glitch Stretch Enable: A logic 1 means that input - fault signals will be stretched to at least 2 IPBus clock cycles */ -} pwm_fault_input_filter_param_t; - -/*! @brief Structure is used to hold the parameters to configure a PWM fault */ -typedef struct _pwm_fault_param -{ - pwm_fault_clear_t faultClearingMode; /*!< Fault clearing mode to use */ - bool faultLevel; /*!< true: Logic 1 indicates fault; - false: Logic 0 indicates fault */ - bool enableCombinationalPath; /*!< true: Combinational Path from fault input is enabled; - false: No combination path is available */ - pwm_fault_recovery_mode_t recoverMode; /*!< Specify when to re-enable the PWM output */ -} pwm_fault_param_t; - -/*! - * @brief Structure is used to hold parameters to configure the capture capability of a signal pin - */ -typedef struct _pwm_input_capture_param -{ - bool captureInputSel; /*!< true: Use the edge counter signal as source - false: Use the raw input signal from the pin as source */ - uint8_t edgeCompareValue; /*!< Compare value, used only if edge counter is used as source */ - pwm_input_capture_edge_t edge0; /*!< Specify which edge causes a capture for input circuitry 0 */ - pwm_input_capture_edge_t edge1; /*!< Specify which edge causes a capture for input circuitry 1 */ - bool enableOneShotCapture; /*!< true: Use one-shot capture mode; - false: Use free-running capture mode */ - uint8_t fifoWatermark; /*!< Watermark level for capture FIFO. The capture flags in - the status register will set if the word count in the FIFO - is greater than this watermark level */ -} pwm_input_capture_param_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Ungates the PWM submodule clock and configures the peripheral for basic operation. - * - * @note This API should be called at the beginning of the application using the PWM driver. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param config Pointer to user's PWM config structure. - * - * @return kStatus_Success means success; else failed. - */ -status_t PWM_Init(PWM_Type *base, pwm_submodule_t subModule, const pwm_config_t *config); - -/*! - * @brief Gate the PWM submodule clock - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to deinitialize - */ -void PWM_Deinit(PWM_Type *base, pwm_submodule_t subModule); - -/*! - * @brief Fill in the PWM config struct with the default settings - * - * The default values are: - * @code - * config->enableDebugMode = false; - * config->enableWait = false; - * config->reloadSelect = kPWM_LocalReload; - * config->clockSource = kPWM_BusClock; - * config->prescale = kPWM_Prescale_Divide_1; - * config->initializationControl = kPWM_Initialize_LocalSync; - * config->forceTrigger = kPWM_Force_Local; - * config->reloadFrequency = kPWM_LoadEveryOportunity; - * config->reloadLogic = kPWM_ReloadImmediate; - * config->pairOperation = kPWM_Independent; - * @endcode - * @param config Pointer to user's PWM config structure. - */ -void PWM_GetDefaultConfig(pwm_config_t *config); - -/*! @}*/ - -/*! - * @name Module PWM output - * @{ - */ -/*! - * @brief Sets up the PWM signals for a PWM submodule. - * - * The function initializes the submodule according to the parameters passed in by the user. The function - * also sets up the value compare registers to match the PWM signal requirements. - * If the dead time insertion logic is enabled, the pulse period is reduced by the - * dead time period specified by the user. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param chnlParams Array of PWM channel parameters to configure the channel(s) - * @param numOfChnls Number of channels to configure, this should be the size of the array passed in. - * Array size should not be more than 2 as each submodule has 2 pins to output PWM - * @param mode PWM operation mode, options available in enumeration ::pwm_mode_t - * @param pwmFreq_Hz PWM signal frequency in Hz - * @param srcClock_Hz PWM main counter clock in Hz. - * - * @return Returns kStatusFail if there was error setting up the signal; kStatusSuccess otherwise - */ -status_t PWM_SetupPwm(PWM_Type *base, - pwm_submodule_t subModule, - const pwm_signal_param_t *chnlParams, - uint8_t numOfChnls, - pwm_mode_t mode, - uint32_t pwmFreq_Hz, - uint32_t srcClock_Hz); - -/*! - * @brief Updates the PWM signal's dutycycle. - * - * The function updates the PWM dutycyle to the new value that is passed in. - * If the dead time insertion logic is enabled then the pulse period is reduced by the - * dead time period specified by the user. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmSignal Signal (PWM A or PWM B) to update - * @param currPwmMode The current PWM mode set during PWM setup - * @param dutyCyclePercent New PWM pulse width, value should be between 0 to 100 - * 0=inactive signal(0% duty cycle)... - * 100=active signal (100% duty cycle) - */ -void PWM_UpdatePwmDutycycle(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmSignal, - pwm_mode_t currPwmMode, - uint8_t dutyCyclePercent); - -/*! - * @brief Updates the PWM signal's dutycycle with 16-bit accuracy. - * - * The function updates the PWM dutycyle to the new value that is passed in. - * If the dead time insertion logic is enabled then the pulse period is reduced by the - * dead time period specified by the user. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmSignal Signal (PWM A or PWM B) to update - * @param currPwmMode The current PWM mode set during PWM setup - * @param dutyCycle New PWM pulse width, value should be between 0 to 65535 - * 0=inactive signal(0% duty cycle)... - * 65535=active signal (100% duty cycle) - */ -void PWM_UpdatePwmDutycycleHighAccuracy( - PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmSignal, pwm_mode_t currPwmMode, uint16_t dutyCycle); - -/*! @}*/ - -/*! - * @brief Sets up the PWM input capture - * - * Each PWM submodule has 3 pins that can be configured for use as input capture pins. This function - * sets up the capture parameters for each pin and enables the pin for input capture operation. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmChannel Channel in the submodule to setup - * @param inputCaptureParams Parameters passed in to set up the input pin - */ -void PWM_SetupInputCapture(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmChannel, - const pwm_input_capture_param_t *inputCaptureParams); - -/*! - * @brief Sets up the PWM fault input filter. - * - * @param base PWM peripheral base address - * @param faultInputFilterParams Parameters passed in to set up the fault input filter. - */ -void PWM_SetupFaultInputFilter(PWM_Type *base, const pwm_fault_input_filter_param_t *faultInputFilterParams); - -/*! - * @brief Sets up the PWM fault protection. - * - * PWM has 4 fault inputs. - * - * @param base PWM peripheral base address - * @param faultNum PWM fault to configure. - * @param faultParams Pointer to the PWM fault config structure - */ -void PWM_SetupFaults(PWM_Type *base, pwm_fault_input_t faultNum, const pwm_fault_param_t *faultParams); - -/*! - * @brief Fill in the PWM fault config struct with the default settings - * - * The default values are: - * @code - * config->faultClearingMode = kPWM_Automatic; - * config->faultLevel = false; - * config->enableCombinationalPath = true; - * config->recoverMode = kPWM_NoRecovery; - * @endcode - * @param config Pointer to user's PWM fault config structure. - */ -void PWM_FaultDefaultConfig(pwm_fault_param_t *config); - -/*! - * @brief Selects the signal to output on a PWM pin when a FORCE_OUT signal is asserted. - * - * The user specifies which channel to configure by supplying the submodule number and whether - * to modify PWM A or PWM B within that submodule. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmChannel Channel to configure - * @param mode Signal to output when a FORCE_OUT is triggered - */ -void PWM_SetupForceSignal(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmChannel, - pwm_force_signal_t mode); - -/*! - * @name Interrupts Interface - * @{ - */ - -/*! - * @brief Enables the selected PWM interrupts - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -void PWM_EnableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); - -/*! - * @brief Disables the selected PWM interrupts - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -void PWM_DisableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); - -/*! - * @brief Gets the enabled PWM interrupts - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration ::pwm_interrupt_enable_t - */ -uint32_t PWM_GetEnabledInterrupts(PWM_Type *base, pwm_submodule_t subModule); - -/*! @}*/ - -/*! - * @name DMA Interface - * @{ - */ - -/*! - * @brief Capture DMA Enable Source Select. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwm_watermark_control PWM FIFO watermark and control - */ -static inline void PWM_DMAFIFOWatermarkControl(PWM_Type *base, - pwm_submodule_t subModule, - pwm_watermark_control_t pwm_watermark_control) -{ - uint16_t reg = base->SM[subModule].DMAEN; - if (pwm_watermark_control == kPWM_FIFOWatermarksOR) - { - reg &= ~((uint16_t)PWM_DMAEN_FAND_MASK); - } - else - { - reg |= ((uint16_t)PWM_DMAEN_FAND_MASK); - } - base->SM[subModule].DMAEN = reg; -} - -/*! - * @brief Capture DMA Enable Source Select. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwm_dma_source_select PWM capture DMA enable source select - */ -static inline void PWM_DMACaptureSourceSelect(PWM_Type *base, - pwm_submodule_t subModule, - pwm_dma_source_select_t pwm_dma_source_select) -{ - uint16_t reg = base->SM[subModule].DMAEN; - - reg &= ~((uint16_t)PWM_DMAEN_CAPTDE_MASK); - reg |= (((uint16_t)pwm_dma_source_select << (uint16_t)PWM_DMAEN_CAPTDE_SHIFT) & (uint16_t)PWM_DMAEN_CAPTDE_MASK); - - base->SM[subModule].DMAEN = reg; -} - -/*! - * @brief Enables or disables the selected PWM DMA Capture read request. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param mask The DMA to enable or disable. This is a logical OR of members of the - * enumeration ::pwm_dma_enable_t - * @param activate true: Enable DMA read request; false: Disable DMA read request - */ -static inline void PWM_EnableDMACapture(PWM_Type *base, pwm_submodule_t subModule, uint16_t mask, bool activate) -{ - uint16_t reg = base->SM[subModule].DMAEN; - if (activate) - { - reg |= (uint16_t)(mask); - } - else - { - reg &= ~((uint16_t)(mask)); - } - base->SM[subModule].DMAEN = reg; -} - -/*! - * @brief Enables or disables the PWM DMA write request. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param activate true: Enable DMA write request; false: Disable DMA write request - */ -static inline void PWM_EnableDMAWrite(PWM_Type *base, pwm_submodule_t subModule, bool activate) -{ - uint16_t reg = base->SM[subModule].DMAEN; - if (activate) - { - reg |= ((uint16_t)PWM_DMAEN_VALDE_MASK); - } - else - { - reg &= ~((uint16_t)PWM_DMAEN_VALDE_MASK); - } - base->SM[subModule].DMAEN = reg; -} - -/*! @}*/ - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Gets the PWM status flags - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * - * @return The status flags. This is the logical OR of members of the - * enumeration ::pwm_status_flags_t - */ -uint32_t PWM_GetStatusFlags(PWM_Type *base, pwm_submodule_t subModule); - -/*! - * @brief Clears the PWM status flags - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::pwm_status_flags_t - */ -void PWM_ClearStatusFlags(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ - -/*! - * @brief Starts the PWM counter for a single or multiple submodules. - * - * Sets the Run bit which enables the clocks to the PWM submodule. This function can start multiple - * submodules at the same time. - * - * @param base PWM peripheral base address - * @param subModulesToStart PWM submodules to start. This is a logical OR of members of the - * enumeration ::pwm_module_control_t - */ -static inline void PWM_StartTimer(PWM_Type *base, uint8_t subModulesToStart) -{ - base->MCTRL |= PWM_MCTRL_RUN(subModulesToStart); -} - -/*! - * @brief Stops the PWM counter for a single or multiple submodules. - * - * Clears the Run bit which resets the submodule's counter. This function can stop multiple - * submodules at the same time. - * - * @param base PWM peripheral base address - * @param subModulesToStop PWM submodules to stop. This is a logical OR of members of the - * enumeration ::pwm_module_control_t - */ -static inline void PWM_StopTimer(PWM_Type *base, uint8_t subModulesToStop) -{ - base->MCTRL &= ~(PWM_MCTRL_RUN(subModulesToStop)); -} - -/*! @}*/ - -/*! - * @brief Enables or disables the PWM output trigger. - * - * This function allows the user to enable or disable the PWM trigger. The PWM has 2 triggers. Trigger 0 - * is activated when the counter matches VAL 0, VAL 2, or VAL 4 register. Trigger 1 is activated - * when the counter matches VAL 1, VAL 3, or VAL 5 register. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param valueRegister Value register that will activate the trigger - * @param activate true: Enable the trigger; false: Disable the trigger - */ -static inline void PWM_OutputTriggerEnable(PWM_Type *base, - pwm_submodule_t subModule, - pwm_value_register_t valueRegister, - bool activate) -{ - if (activate) - { - base->SM[subModule].TCTRL |= ((uint16_t)1U << (uint16_t)valueRegister); - } - else - { - base->SM[subModule].TCTRL &= ~((uint16_t)1U << (uint16_t)valueRegister); - } -} - -/*! - * @brief Enables the PWM output trigger. - * - * This function allows the user to enable one or more (VAL0-5) PWM trigger. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param valueRegisterMask Value register mask that will activate one or more (VAL0-5) trigger - * enumeration ::_pwm_value_register_mask - */ -static inline void PWM_ActivateOutputTrigger(PWM_Type *base, pwm_submodule_t subModule, uint16_t valueRegisterMask) -{ - base->SM[subModule].TCTRL |= (PWM_TCTRL_OUT_TRIG_EN_MASK & (valueRegisterMask)); -} - -/*! - * @brief Disables the PWM output trigger. - * - * This function allows the user to disables one or more (VAL0-5) PWM trigger. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param valueRegisterMask Value register mask that will Deactivate one or more (VAL0-5) trigger - * enumeration ::_pwm_value_register_mask - */ -static inline void PWM_DeactivateOutputTrigger(PWM_Type *base, pwm_submodule_t subModule, uint16_t valueRegisterMask) -{ - base->SM[subModule].TCTRL &= ~(PWM_TCTRL_OUT_TRIG_EN_MASK & (valueRegisterMask)); -} - -/*! - * @brief Sets the software control output for a pin to high or low. - * - * The user specifies which channel to modify by supplying the submodule number and whether - * to modify PWM A or PWM B within that submodule. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmChannel Channel to configure - * @param value true: Supply a logic 1, false: Supply a logic 0. - */ -static inline void PWM_SetupSwCtrlOut(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel, bool value) -{ - if (value) - { - base->SWCOUT |= - ((uint16_t)1U << (((uint16_t)subModule * (uint16_t)PWM_SUBMODULE_SWCONTROL_WIDTH) + (uint16_t)pwmChannel)); - } - else - { - base->SWCOUT &= - ~((uint16_t)1U << (((uint16_t)subModule * (uint16_t)PWM_SUBMODULE_SWCONTROL_WIDTH) + (uint16_t)pwmChannel)); - } -} - -/*! - * @brief Sets or clears the PWM LDOK bit on a single or multiple submodules - * - * Set LDOK bit to load buffered values into CTRL[PRSC] and the INIT, FRACVAL and VAL registers. The - * values are loaded immediately if kPWM_ReloadImmediate option was choosen during config. Else the - * values are loaded at the next PWM reload point. - * This function can issue the load command to multiple submodules at the same time. - * - * @param base PWM peripheral base address - * @param subModulesToUpdate PWM submodules to update with buffered values. This is a logical OR of - * members of the enumeration ::pwm_module_control_t - * @param value true: Set LDOK bit for the submodule list; false: Clear LDOK bit - */ -static inline void PWM_SetPwmLdok(PWM_Type *base, uint8_t subModulesToUpdate, bool value) -{ - if (value) - { - base->MCTRL |= PWM_MCTRL_LDOK(subModulesToUpdate); - } - else - { - base->MCTRL |= PWM_MCTRL_CLDOK(subModulesToUpdate); - } -} - -/*! - * @brief Set PWM output fault status - * - * These bits determine the fault state for the PWM_A output in fault conditions - * and STOP mode. It may also define the output state in WAIT and DEBUG modes - * depending on the settings of CTRL2[WAITEN] and CTRL2[DBGEN]. - * This function can update PWM output fault status. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmChannel Channel to configure - * @param faultState PWM output fault status - */ -static inline void PWM_SetPwmFaultState(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmChannel, - pwm_fault_state_t faultState) -{ - uint16_t reg = base->SM[subModule].OCTRL; - switch (pwmChannel) - { - case kPWM_PwmA: - reg &= ~((uint16_t)PWM_OCTRL_PWMAFS_MASK); - reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMAFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMAFS_MASK); - break; - case kPWM_PwmB: - reg &= ~((uint16_t)PWM_OCTRL_PWMBFS_MASK); - reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMBFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMBFS_MASK); - break; - case kPWM_PwmX: - reg &= ~((uint16_t)PWM_OCTRL_PWMXFS_MASK); - reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMXFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMXFS_MASK); - break; - default: - assert(false); - break; - } - base->SM[subModule].OCTRL = reg; -} - -/*! - * @brief Set PWM fault disable mapping - * - * Each of the four bits of this read/write field is one-to-one associated - * with the four FAULTx inputs of fault channel 0/1. The PWM output will be turned - * off if there is a logic 1 on an FAULTx input and a 1 in the corresponding - * bit of this field. A reset sets all bits in this field. - * - * @param base PWM peripheral base address - * @param subModule PWM submodule to configure - * @param pwmChannel PWM channel to configure - * @param pwm_fault_channels PWM fault channel to configure - * @param value Fault disable mapping mask value - * enumeration ::pwm_fault_disable_t - */ -static inline void PWM_SetupFaultDisableMap(PWM_Type *base, - pwm_submodule_t subModule, - pwm_channels_t pwmChannel, - pwm_fault_channels_t pwm_fault_channels, - uint16_t value) -{ - uint16_t reg = base->SM[subModule].DISMAP[pwm_fault_channels]; - switch (pwmChannel) - { - case kPWM_PwmA: - reg &= ~((uint16_t)PWM_DISMAP_DIS0A_MASK); - reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0A_SHIFT) & (uint16_t)PWM_DISMAP_DIS0A_MASK); - break; - case kPWM_PwmB: - reg &= ~((uint16_t)PWM_DISMAP_DIS0B_MASK); - reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0B_SHIFT) & (uint16_t)PWM_DISMAP_DIS0B_MASK); - break; - case kPWM_PwmX: - reg &= ~((uint16_t)PWM_DISMAP_DIS0X_MASK); - reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0X_SHIFT) & (uint16_t)PWM_DISMAP_DIS0X_MASK); - break; - default: - assert(false); - break; - } - base->SM[subModule].DISMAP[pwm_fault_channels] = reg; -} - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_PWM_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_pxp.c b/devices/MIMXRT1052/drivers/fsl_pxp.c deleted file mode 100644 index b958557..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pxp.c +++ /dev/null @@ -1,1048 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_pxp.h" - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#include "fsl_memory.h" -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.pxp" -#endif - -/* The CSC2 coefficient is ###.####_#### */ -#define PXP_CSC2_COEF_INT_WIDTH 2 -#define PXP_CSC2_COEF_FRAC_WIDTH 8 - -/* Compatibility map macro. */ -#if defined(PXP_PS_CLRKEYLOW_0_PIXEL_MASK) && (!defined(PXP_PS_CLRKEYLOW_PIXEL_MASK)) -#define PS_CLRKEYLOW PS_CLRKEYLOW_0 -#define PS_CLRKEYHIGH PS_CLRKEYHIGH_0 -#endif -#if defined(PXP_AS_CLRKEYLOW_0_PIXEL_MASK) && (!defined(PXP_AS_CLRKEYLOW_PIXEL_MASK)) -#define AS_CLRKEYLOW AS_CLRKEYLOW_0 -#define AS_CLRKEYHIGH AS_CLRKEYHIGH_0 -#endif - -#define PXP_MAX_HEIGHT ((PXP_OUT_LRC_Y_MASK >> PXP_OUT_LRC_Y_SHIFT) + 1U) - -/* Compatibility macro remap. */ -#if (!defined(PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK) && defined(PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_MASK)) -#define PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK PXP_PORTER_DUFF_CTRL_POTER_DUFF_ENABLE_MASK -#endif - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#define PXP_ADDR_CPU_2_IP(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_Local2DMA)) -#else -#define PXP_ADDR_CPU_2_IP(addr) (addr) -#endif /* FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET */ - -typedef union _u32_f32 -{ - float f32; - uint32_t u32; -} u32_f32_t; - -typedef union _pxp_pvoid_u32 -{ - void *pvoid; - uint32_t u32; -} pxp_pvoid_u32_t; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get the instance from the base address - * - * @param base PXP peripheral base address - * - * @return The PXP module instance - */ -static uint32_t PXP_GetInstance(PXP_Type *base); - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_CSC2) && FSL_FEATURE_PXP_HAS_NO_CSC2) -/*! - * @brief Convert IEEE 754 float value to the value could be written to registers. - * - * This function converts the float value to integer value to set the scaler - * and CSC parameters. - * - * This function is an alternative implemention of the following code with no - * MISRA 2004 rule 10.4 error: - * - * @code - return (uint32_t)(floatValue * (float)(1 << fracBits)); - @endcode - * - * @param floatValue The float value to convert. - * @param intBits Bits number of integer part in result. - * @param fracBits Bits number of fractional part in result. - * @return The value to set to register. - */ -static uint32_t PXP_ConvertFloat(float floatValue, uint8_t intBits, uint8_t fracBits); -#endif - -/*! - * @brief Convert the desired scale fact to DEC and PS_SCALE. - * - * @param inputDimension Input dimension. - * @param outputDimension Output dimension. - * @param dec The decimation filter contr0l value. - * @param scale The scale value set to register PS_SCALE. - */ -static void PXP_GetScalerParam(uint16_t inputDimension, uint16_t outputDimension, uint8_t *dec, uint32_t *scale); - -/*! - * @brief Reset the PXP to initialized state. - * - * @param base PXP peripheral base address. - */ -static void PXP_ResetToInit(PXP_Type *base); - -/*! - * @brief Copy rectangle. - * - * @param base PXP peripheral base address. - * @param srcAddr Start address of the soruce rectangle. - * @param srcPitchBytes Pitch of source buffer. - * @param destAddr Start address of the destination rectangle. - * @param destPitchBytes Pitch of destination buffer. - * @param width How many pixels one line to copy. - * @param height How many lines to copy. - * @param pixelFormat Pixel format. - */ -static void PXP_StartRectCopy(PXP_Type *base, - uint32_t srcAddr, - uint16_t srcPitchBytes, - uint32_t destAddr, - uint16_t destPitchBytes, - uint16_t width, - uint16_t height, - pxp_as_pixel_format_t pixelFormat); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to PXP bases for each instance. */ -static PXP_Type *const s_pxpBases[] = PXP_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to PXP clocks for each PXP submodule. */ -static const clock_ip_name_t s_pxpClocks[] = PXP_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t PXP_GetInstance(PXP_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_pxpBases); instance++) - { - if (s_pxpBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_pxpBases)); - - return instance; -} - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_CSC2) && FSL_FEATURE_PXP_HAS_NO_CSC2) -static uint32_t PXP_ConvertFloat(float floatValue, uint8_t intBits, uint8_t fracBits) -{ - /* One bit reserved for sign bit. */ - assert(intBits + fracBits < 32); - - u32_f32_t u32_f32; - uint32_t ret; - - u32_f32.f32 = floatValue; - uint32_t floatBits = u32_f32.u32; - int32_t expValue = (int32_t)((floatBits & 0x7F800000U) >> 23U) - 127; - - ret = (floatBits & 0x007FFFFFU) | 0x00800000U; - expValue += fracBits; - - if (expValue < 0) - { - return 0U; - } - else if (expValue > 23) - { - /* should not exceed 31-bit when left shift. */ - assert((expValue - 23) <= 7); - ret <<= (expValue - 23); - } - else - { - ret >>= (23 - expValue); - } - - /* Set the sign bit. */ - if (floatBits & 0x80000000U) - { - ret = ((~ret) + 1U) & ~(((uint32_t)-1) << (intBits + fracBits + 1)); - } - - return ret; -} -#endif - -static void PXP_GetScalerParam(uint16_t inputDimension, uint16_t outputDimension, uint8_t *dec, uint32_t *scale) -{ - uint32_t scaleFact = ((uint32_t)inputDimension << 12U) / outputDimension; - - if (scaleFact >= (16UL << 12U)) - { - /* Desired fact is two large, use the largest support value. */ - *dec = 3U; - *scale = 0x2000U; - } - else - { - if (scaleFact > (8UL << 12U)) - { - *dec = 3U; - } - else if (scaleFact > (4UL << 12U)) - { - *dec = 2U; - } - else if (scaleFact > (2UL << 12U)) - { - *dec = 1U; - } - else - { - *dec = 0U; - } - - *scale = scaleFact >> (*dec); - - if (0U == *scale) - { - *scale = 1U; - } - } -} - -static void PXP_ResetToInit(PXP_Type *base) -{ - uint32_t ctrl = 0U; - - PXP_Reset(base); - -/* Enable the process engine in primary processing flow. */ -#if defined(PXP_CTRL_ENABLE_ROTATE0_MASK) - ctrl |= PXP_CTRL_ENABLE_ROTATE0_MASK; -#endif -#if defined(PXP_CTRL_ENABLE_ROTATE1_MASK) - ctrl |= PXP_CTRL_ENABLE_ROTATE1_MASK; -#endif -#if defined(PXP_CTRL_ENABLE_CSC2_MASK) - ctrl |= PXP_CTRL_ENABLE_CSC2_MASK; -#endif -#if defined(PXP_CTRL_ENABLE_LUT_MASK) - ctrl |= PXP_CTRL_ENABLE_LUT_MASK; -#endif -#if defined(PXP_CTRL_ENABLE_PS_AS_OUT_MASK) - ctrl |= PXP_CTRL_ENABLE_PS_AS_OUT_MASK; -#endif - - base->CTRL = ctrl; -} - -/*! - * brief Initialize the PXP. - * - * This function enables the PXP peripheral clock, and resets the PXP registers - * to default status. - * - * param base PXP peripheral base address. - */ -void PXP_Init(PXP_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = PXP_GetInstance(base); - CLOCK_EnableClock(s_pxpClocks[instance]); -#endif - - PXP_ResetToInit(base); -} - -/*! - * brief De-initialize the PXP. - * - * This function disables the PXP peripheral clock. - * - * param base PXP peripheral base address. - */ -void PXP_Deinit(PXP_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - uint32_t instance = PXP_GetInstance(base); - CLOCK_DisableClock(s_pxpClocks[instance]); -#endif -} - -/*! - * brief Reset the PXP. - * - * This function resets the PXP peripheral registers to default status. - * - * param base PXP peripheral base address. - */ -void PXP_Reset(PXP_Type *base) -{ - base->CTRL_SET = PXP_CTRL_SFTRST_MASK; - base->CTRL_CLR = (PXP_CTRL_SFTRST_MASK | PXP_CTRL_CLKGATE_MASK); -} - -/*! - * brief Set the alpha surface input buffer configuration. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetAlphaSurfaceBufferConfig(PXP_Type *base, const pxp_as_buffer_config_t *config) -{ - assert(NULL != config); - - base->AS_CTRL = (base->AS_CTRL & ~PXP_AS_CTRL_FORMAT_MASK) | PXP_AS_CTRL_FORMAT(config->pixelFormat); - - base->AS_BUF = PXP_ADDR_CPU_2_IP(config->bufferAddr); - base->AS_PITCH = config->pitchBytes; -} - -/*! - * brief Set the alpha surface blending configuration. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration structure. - */ -void PXP_SetAlphaSurfaceBlendConfig(PXP_Type *base, const pxp_as_blend_config_t *config) -{ - assert(NULL != config); - uint32_t reg; - - reg = base->AS_CTRL; - reg &= - ~(PXP_AS_CTRL_ALPHA0_INVERT_MASK | PXP_AS_CTRL_ROP_MASK | PXP_AS_CTRL_ALPHA_MASK | PXP_AS_CTRL_ALPHA_CTRL_MASK); - reg |= (PXP_AS_CTRL_ROP(config->ropMode) | PXP_AS_CTRL_ALPHA(config->alpha) | - PXP_AS_CTRL_ALPHA_CTRL(config->alphaMode)); - - if (config->invertAlpha) - { - reg |= PXP_AS_CTRL_ALPHA0_INVERT_MASK; - } - - base->AS_CTRL = reg; -} - -/*! - * brief Set the alpha surface position in output buffer. - * - * param base PXP peripheral base address. - * param upperLeftX X of the upper left corner. - * param upperLeftY Y of the upper left corner. - * param lowerRightX X of the lower right corner. - * param lowerRightY Y of the lower right corner. - */ -void PXP_SetAlphaSurfacePosition( - PXP_Type *base, uint16_t upperLeftX, uint16_t upperLeftY, uint16_t lowerRightX, uint16_t lowerRightY) -{ - base->OUT_AS_ULC = PXP_OUT_AS_ULC_Y(upperLeftY) | PXP_OUT_AS_ULC_X(upperLeftX); - base->OUT_AS_LRC = PXP_OUT_AS_LRC_Y(lowerRightY) | PXP_OUT_AS_LRC_X(lowerRightX); -} - -/*! - * brief Set the alpha surface overlay color key. - * - * If a pixel in the current overlay image with a color that falls in the range - * from the p colorKeyLow to p colorKeyHigh range, it will use the process surface - * pixel value for that location. If no PS image is present or if the PS image also - * matches its colorkey range, the PS background color is used. - * - * param base PXP peripheral base address. - * param colorKeyLow Color key low range. - * param colorKeyHigh Color key high range. - * - * note Colorkey operations are higher priority than alpha or ROP operations - */ -void PXP_SetAlphaSurfaceOverlayColorKey(PXP_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh) -{ - base->AS_CLRKEYLOW = colorKeyLow; - base->AS_CLRKEYHIGH = colorKeyHigh; -} - -/*! - * brief Set the process surface input buffer configuration. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetProcessSurfaceBufferConfig(PXP_Type *base, const pxp_ps_buffer_config_t *config) -{ - assert(NULL != config); - - base->PS_CTRL = ((base->PS_CTRL & ~(PXP_PS_CTRL_FORMAT_MASK | PXP_PS_CTRL_WB_SWAP_MASK)) | - PXP_PS_CTRL_FORMAT(config->pixelFormat) | PXP_PS_CTRL_WB_SWAP(config->swapByte)); - - base->PS_BUF = PXP_ADDR_CPU_2_IP(config->bufferAddr); - base->PS_UBUF = PXP_ADDR_CPU_2_IP(config->bufferAddrU); - base->PS_VBUF = PXP_ADDR_CPU_2_IP(config->bufferAddrV); - base->PS_PITCH = config->pitchBytes; -} - -/*! - * brief Set the process surface scaler configuration. - * - * The valid down scale fact is 1/(2^12) ~ 16. - * - * param base PXP peripheral base address. - * param inputWidth Input image width. - * param inputHeight Input image height. - * param outputWidth Output image width. - * param outputHeight Output image height. - */ -void PXP_SetProcessSurfaceScaler( - PXP_Type *base, uint16_t inputWidth, uint16_t inputHeight, uint16_t outputWidth, uint16_t outputHeight) -{ - uint8_t decX, decY; - uint32_t scaleX, scaleY; - - PXP_GetScalerParam(inputWidth, outputWidth, &decX, &scaleX); - PXP_GetScalerParam(inputHeight, outputHeight, &decY, &scaleY); - - base->PS_CTRL = (base->PS_CTRL & ~(PXP_PS_CTRL_DECX_MASK | PXP_PS_CTRL_DECY_MASK)) | PXP_PS_CTRL_DECX(decX) | - PXP_PS_CTRL_DECY(decY); - - base->PS_SCALE = PXP_PS_SCALE_XSCALE(scaleX) | PXP_PS_SCALE_YSCALE(scaleY); -} - -/*! - * brief Set the process surface position in output buffer. - * - * param base PXP peripheral base address. - * param upperLeftX X of the upper left corner. - * param upperLeftY Y of the upper left corner. - * param lowerRightX X of the lower right corner. - * param lowerRightY Y of the lower right corner. - */ -void PXP_SetProcessSurfacePosition( - PXP_Type *base, uint16_t upperLeftX, uint16_t upperLeftY, uint16_t lowerRightX, uint16_t lowerRightY) -{ - base->OUT_PS_ULC = PXP_OUT_PS_ULC_Y(upperLeftY) | PXP_OUT_PS_ULC_X(upperLeftX); - base->OUT_PS_LRC = PXP_OUT_PS_LRC_Y(lowerRightY) | PXP_OUT_PS_LRC_X(lowerRightX); -} - -/*! - * brief Set the process surface color key. - * - * If the PS image matches colorkey range, the PS background color is output. Set - * p colorKeyLow to 0xFFFFFFFF and p colorKeyHigh to 0 will disable the colorkeying. - * - * param base PXP peripheral base address. - * param colorKeyLow Color key low range. - * param colorKeyHigh Color key high range. - */ -void PXP_SetProcessSurfaceColorKey(PXP_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh) -{ - base->PS_CLRKEYLOW = colorKeyLow; - base->PS_CLRKEYHIGH = colorKeyHigh; -} - -/*! - * brief Set the PXP outpt buffer configuration. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetOutputBufferConfig(PXP_Type *base, const pxp_output_buffer_config_t *config) -{ - assert(NULL != config); - - base->OUT_CTRL = (base->OUT_CTRL & ~(PXP_OUT_CTRL_FORMAT_MASK | PXP_OUT_CTRL_INTERLACED_OUTPUT_MASK)) | - PXP_OUT_CTRL_FORMAT(config->pixelFormat) | PXP_OUT_CTRL_INTERLACED_OUTPUT(config->interlacedMode); - - base->OUT_BUF = PXP_ADDR_CPU_2_IP(config->buffer0Addr); - base->OUT_BUF2 = PXP_ADDR_CPU_2_IP(config->buffer1Addr); - - base->OUT_PITCH = config->pitchBytes; - base->OUT_LRC = PXP_OUT_LRC_Y((uint32_t)config->height - 1U) | PXP_OUT_LRC_X((uint32_t)config->width - 1U); - -/* - * The dither store size must be set to the same with the output buffer size, - * otherwise the dither engine could not work. - */ -#if defined(PXP_DITHER_STORE_SIZE_CH0_OUT_WIDTH_MASK) - base->DITHER_STORE_SIZE_CH0 = PXP_DITHER_STORE_SIZE_CH0_OUT_WIDTH(config->width - 1U) | - PXP_DITHER_STORE_SIZE_CH0_OUT_HEIGHT(config->height - 1U); -#endif -} - -/*! - * brief Set the next command. - * - * The PXP supports a primitive ability to queue up one operation while the current - * operation is running. Workflow: - * - * 1. Prepare the PXP register values except STAT, CSCCOEFn, NEXT in the memory - * in the order they appear in the register map. - * 2. Call this function sets the new operation to PXP. - * 3. There are two methods to check whether the PXP has loaded the new operation. - * The first method is using ref PXP_IsNextCommandPending. If there is new operation - * not loaded by the PXP, this function returns true. The second method is checking - * the flag ref kPXP_CommandLoadFlag, if command loaded, this flag asserts. User - * could enable interrupt ref kPXP_CommandLoadInterruptEnable to get the loaded - * signal in interrupt way. - * 4. When command loaded by PXP, a new command could be set using this function. - * - * param base PXP peripheral base address. - * param commandAddr Address of the new command. - */ -void PXP_SetNextCommand(PXP_Type *base, void *commandAddr) -{ - pxp_pvoid_u32_t addr; - - /* Make sure commands have been saved to memory. */ - __DSB(); - - addr.pvoid = commandAddr; - - base->NEXT = PXP_ADDR_CPU_2_IP(addr.u32) & PXP_NEXT_POINTER_MASK; -} - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_CSC2) && FSL_FEATURE_PXP_HAS_NO_CSC2) -/*! - * brief Set the CSC2 configuration. - * - * The CSC2 module receives pixels in any color space and can convert the pixels - * into any of RGB, YUV, or YCbCr color spaces. The output pixels are passed - * onto the LUT and rotation engine for further processing - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetCsc2Config(PXP_Type *base, const pxp_csc2_config_t *config) -{ - assert(NULL != config); - - base->CSC2_CTRL = (base->CSC2_CTRL & ~PXP_CSC2_CTRL_CSC_MODE_MASK) | PXP_CSC2_CTRL_CSC_MODE(config->mode); - - base->CSC2_COEF0 = - (PXP_ConvertFloat(config->A1, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF0_A1_SHIFT) | - (PXP_ConvertFloat(config->A2, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF0_A2_SHIFT); - - base->CSC2_COEF1 = - (PXP_ConvertFloat(config->A3, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF1_A3_SHIFT) | - (PXP_ConvertFloat(config->B1, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF1_B1_SHIFT); - - base->CSC2_COEF2 = - (PXP_ConvertFloat(config->B2, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF2_B2_SHIFT) | - (PXP_ConvertFloat(config->B3, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF2_B3_SHIFT); - - base->CSC2_COEF3 = - (PXP_ConvertFloat(config->C1, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF3_C1_SHIFT) | - (PXP_ConvertFloat(config->C2, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF3_C2_SHIFT); - - base->CSC2_COEF4 = - (PXP_ConvertFloat(config->C3, PXP_CSC2_COEF_INT_WIDTH, PXP_CSC2_COEF_FRAC_WIDTH) << PXP_CSC2_COEF4_C3_SHIFT) | - PXP_CSC2_COEF4_D1(config->D1); - - base->CSC2_COEF5 = PXP_CSC2_COEF5_D2(config->D2) | PXP_CSC2_COEF5_D3(config->D3); -} -#endif - -/*! - * brief Set the CSC1 mode. - * - * The CSC1 module receives scaled YUV/YCbCr444 pixels from the scale engine and - * converts the pixels to the RGB888 color space. It could only be used by process - * surface. - * - * param base PXP peripheral base address. - * param mode The conversion mode. - */ -void PXP_SetCsc1Mode(PXP_Type *base, pxp_csc1_mode_t mode) -{ - /* - * The equations used for Colorspace conversion are: - * - * R = C0*(Y+Y_OFFSET) + C1(V+UV_OFFSET) - * G = C0*(Y+Y_OFFSET) + C3(U+UV_OFFSET) + C2(V+UV_OFFSET) - * B = C0*(Y+Y_OFFSET) + C4(U+UV_OFFSET) - */ - - if (kPXP_Csc1YUV2RGB == mode) - { - base->CSC1_COEF0 = (base->CSC1_COEF0 & ~(PXP_CSC1_COEF0_C0_MASK | PXP_CSC1_COEF0_Y_OFFSET_MASK | - PXP_CSC1_COEF0_UV_OFFSET_MASK | PXP_CSC1_COEF0_YCBCR_MODE_MASK)) | - PXP_CSC1_COEF0_C0(0x100U) /* 1.00. */ - | PXP_CSC1_COEF0_Y_OFFSET(0x0U) /* 0. */ - | PXP_CSC1_COEF0_UV_OFFSET(0x0U); /* 0. */ - base->CSC1_COEF1 = PXP_CSC1_COEF1_C1(0x0123U) /* 1.140. */ - | PXP_CSC1_COEF1_C4(0x0208U); /* 2.032. */ - base->CSC1_COEF2 = PXP_CSC1_COEF2_C2(0x076BU) /* -0.851. */ - | PXP_CSC1_COEF2_C3(0x079BU); /* -0.394. */ - } - else - { - base->CSC1_COEF0 = (base->CSC1_COEF0 & - ~(PXP_CSC1_COEF0_C0_MASK | PXP_CSC1_COEF0_Y_OFFSET_MASK | PXP_CSC1_COEF0_UV_OFFSET_MASK)) | - PXP_CSC1_COEF0_YCBCR_MODE_MASK | PXP_CSC1_COEF0_C0(0x12AU) /* 1.164. */ - | PXP_CSC1_COEF0_Y_OFFSET(0x1F0U) /* -16. */ - | PXP_CSC1_COEF0_UV_OFFSET(0x180U); /* -128. */ - base->CSC1_COEF1 = PXP_CSC1_COEF1_C1(0x0198U) /* 1.596. */ - | PXP_CSC1_COEF1_C4(0x0204U); /* 2.017. */ - base->CSC1_COEF2 = PXP_CSC1_COEF2_C2(0x0730U) /* -0.813. */ - | PXP_CSC1_COEF2_C3(0x079CU); /* -0.392. */ - } -} - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) -/*! - * brief Set the LUT configuration. - * - * The lookup table (LUT) is used to modify pixels in a manner that is not linear - * and that cannot be achieved by the color space conversion modules. To setup - * the LUT, the complete workflow is: - * 1. Use ref PXP_SetLutConfig to set the configuration, such as the lookup mode. - * 2. Use ref PXP_LoadLutTable to load the lookup table to PXP. - * 3. Use ref PXP_EnableLut to enable the function. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetLutConfig(PXP_Type *base, const pxp_lut_config_t *config) -{ - base->LUT_CTRL = (base->LUT_CTRL & ~(PXP_LUT_CTRL_OUT_MODE_MASK | PXP_LUT_CTRL_LOOKUP_MODE_MASK)) | - PXP_LUT_CTRL_LRU_UPD_MASK | /* Use Least Recently Used Policy Update Control. */ - PXP_LUT_CTRL_OUT_MODE(config->outMode) | PXP_LUT_CTRL_LOOKUP_MODE(config->lookupMode); - - if (kPXP_LutOutRGBW4444CFA == config->outMode) - { - base->CFA = config->cfaValue; - } -} - -/*! - * brief Set the look up table to PXP. - * - * If lookup mode is DIRECT mode, this function loads p bytesNum of values - * from the address p memAddr into PXP LUT address p lutStartAddr. So this - * function allows only update part of the PXP LUT. - * - * If lookup mode is CACHE mode, this function sets the new address to p memAddr - * and invalid the PXP LUT cache. - * - * param base PXP peripheral base address. - * param lookupMode Which lookup mode is used. Note that this parameter is only - * used to distinguish DIRECT mode and CACHE mode, it does not change the register - * value PXP_LUT_CTRL[LOOKUP_MODE]. To change that value, use function ref PXP_SetLutConfig. - * param bytesNum How many bytes to set. This value must be divisable by 8. - * param memAddr Address of look up table to set. - * param lutStartAddr The LUT value will be loaded to LUT from index lutAddr. It should - * be 8 bytes aligned. - * - * retval kStatus_Success Load successfully. - * retval kStatus_InvalidArgument Failed because of invalid argument. - */ -status_t PXP_LoadLutTable( - PXP_Type *base, pxp_lut_lookup_mode_t lookupMode, uint32_t bytesNum, uint32_t memAddr, uint16_t lutStartAddr) -{ - memAddr = PXP_ADDR_CPU_2_IP(memAddr); - - if (kPXP_LutCacheRGB565 == lookupMode) - { - /* Make sure the previous memory write is finished, especially the LUT data memory. */ - __DSB(); - - base->LUT_EXTMEM = memAddr; - /* Invalid cache. */ - base->LUT_CTRL |= PXP_LUT_CTRL_INVALID_MASK; - } - else - { - /* Number of bytes must be divisable by 8. */ - if ((bytesNum & 0x07U) || (bytesNum < 8U) || (lutStartAddr & 0x07U) || - (bytesNum + lutStartAddr > PXP_LUT_TABLE_BYTE)) - { - return kStatus_InvalidArgument; - } - - base->LUT_EXTMEM = memAddr; - base->LUT_ADDR = PXP_LUT_ADDR_ADDR(lutStartAddr) | PXP_LUT_ADDR_NUM_BYTES(bytesNum); - - base->STAT_CLR = PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_MASK; - - /* Start DMA transfer. */ - base->LUT_CTRL |= PXP_LUT_CTRL_DMA_START_MASK; - - __DSB(); - - /* Wait for transfer completed. */ - while (!(base->STAT & PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_MASK)) - { - } - } - - return kStatus_Success; -} -#endif /* FSL_FEATURE_PXP_HAS_NO_LUT */ - -#if (defined(FSL_FEATURE_PXP_HAS_DITHER) && FSL_FEATURE_PXP_HAS_DITHER) -/*! - * brief Write data to the PXP internal memory. - * - * param base PXP peripheral base address. - * param ram Which internal memory to write. - * param bytesNum How many bytes to write. - * param data Pointer to the data to write. - * param memStartAddr The start address in the internal memory to write the data. - */ -void PXP_SetInternalRamData(PXP_Type *base, pxp_ram_t ram, uint32_t bytesNum, uint8_t *data, uint16_t memStartAddr) -{ - assert((memStartAddr + bytesNum) <= PXP_INTERNAL_RAM_LUT_BYTE); - - base->INIT_MEM_CTRL = - PXP_INIT_MEM_CTRL_ADDR(memStartAddr) | PXP_INIT_MEM_CTRL_SELECT(ram) | PXP_INIT_MEM_CTRL_START_MASK; - - while (bytesNum--) - { - base->INIT_MEM_DATA = (uint32_t)(*data); - data++; - } - - base->INIT_MEM_CTRL = 0U; -} - -/*! - * brief Set the dither final LUT data. - * - * The dither final LUT is only applicble to dither engine 0. It takes the bits[7:4] - * of the output pixel and looks up and 8 bit value from the 16 value LUT to generate - * the final output pixel to the next process module. - * - * param base PXP peripheral base address. - * param data Pointer to the LUT data to set. - */ -void PXP_SetDitherFinalLutData(PXP_Type *base, const pxp_dither_final_lut_data_t *data) -{ - base->DITHER_FINAL_LUT_DATA0 = data->data_3_0; - base->DITHER_FINAL_LUT_DATA1 = data->data_7_4; - base->DITHER_FINAL_LUT_DATA2 = data->data_11_8; - base->DITHER_FINAL_LUT_DATA3 = data->data_15_12; -} - -/*! - * brief Enable or disable dither engine in the PXP process path. - * - * After the initialize function ref PXP_Init, the dither engine is disabled and not - * use in the PXP processing path. This function enables the dither engine and - * routes the dither engine output to the output buffer. When the dither engine - * is enabled using this function, ref PXP_SetDitherConfig must be called to - * configure dither engine correctly, otherwise there is not output to the output - * buffer. - * - * param base PXP peripheral base address. - * param enable Pass in true to enable, false to disable. - */ -void PXP_EnableDither(PXP_Type *base, bool enable) -{ - if (enable) - { - base->CTRL_SET = PXP_CTRL_ENABLE_DITHER_MASK; - /* Route dither output to output buffer. */ - base->DATA_PATH_CTRL0 &= ~PXP_DATA_PATH_CTRL0_MUX14_SEL_MASK; - } - else - { - base->CTRL_CLR = PXP_CTRL_ENABLE_DITHER_MASK; - /* Route MUX 12 output to output buffer. */ - base->DATA_PATH_CTRL0 |= PXP_DATA_PATH_CTRL0_MUX14_SEL(1U); - } -} -#endif /* FSL_FEATURE_PXP_HAS_DITHER */ - -/*! - * brief Set the Porter Duff configuration. - * - * param base PXP peripheral base address. - * param config Pointer to the configuration. - */ -void PXP_SetPorterDuffConfig(PXP_Type *base, const pxp_porter_duff_config_t *config) -{ - assert(NULL != config); - - union - { - pxp_porter_duff_config_t pdConfigStruct; - uint32_t u32; - } pdConfig; - - pdConfig.pdConfigStruct = *config; - - base->PORTER_DUFF_CTRL = pdConfig.u32; -} - -/*! - * brief Get the Porter Duff configuration by blend mode. - * - * param mode The blend mode. - * param config Pointer to the configuration. - * retval kStatus_Success Successfully get the configuratoin. - * retval kStatus_InvalidArgument The blend mode not supported. - */ -status_t PXP_GetPorterDuffConfig(pxp_porter_duff_blend_mode_t mode, pxp_porter_duff_config_t *config) -{ - status_t status; - - union - { - pxp_porter_duff_config_t pdConfigStruct; - uint32_t u32; - } pdConfig; - - static const uint32_t pdCtrl[] = { - /* kPXP_PorterDuffSrc */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorOne) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorZero), - - /* kPXP_PorterDuffAtop */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorStraight) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorInversed), - - /* kPXP_PorterDuffOver */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorOne) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorInversed), - - /* kPXP_PorterDuffIn */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorStraight) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorZero), - - /* kPXP_PorterDuffOut */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorInversed) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorZero), - - /* kPXP_PorterDuffDst */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorZero) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorOne), - - /* kPXP_PorterDuffDstAtop */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorInversed) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorStraight), - - /* kPXP_PorterDuffDstOver */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorInversed) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorOne), - - /* kPXP_PorterDuffDstIn */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorZero) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorStraight), - - /* kPXP_PorterDuffDstOut */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorZero) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorInversed), - - /* kPXP_PorterDuffXor */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorInversed) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorInversed), - - /* kPXP_PorterDuffClear */ - PXP_PORTER_DUFF_CTRL_PORTER_DUFF_ENABLE_MASK | - PXP_PORTER_DUFF_CTRL_S0_S1_FACTOR_MODE(kPXP_PorterDuffFactorZero) | - PXP_PORTER_DUFF_CTRL_S1_S0_FACTOR_MODE(kPXP_PorterDuffFactorZero), - }; - - if (mode >= kPXP_PorterDuffMax) - { - status = kStatus_InvalidArgument; - } - else - { - pdConfig.u32 = pdCtrl[(uint32_t)mode] | PXP_PORTER_DUFF_CTRL_S0_GLOBAL_ALPHA_MODE(kPXP_PorterDuffLocalAlpha) | - PXP_PORTER_DUFF_CTRL_S1_GLOBAL_ALPHA_MODE(kPXP_PorterDuffLocalAlpha) | - PXP_PORTER_DUFF_CTRL_S0_COLOR_MODE(kPXP_PorterDuffColorWithAlpha) | - PXP_PORTER_DUFF_CTRL_S1_COLOR_MODE(kPXP_PorterDuffColorWithAlpha) | - PXP_PORTER_DUFF_CTRL_S0_ALPHA_MODE(kPXP_PorterDuffAlphaStraight) | - PXP_PORTER_DUFF_CTRL_S1_ALPHA_MODE(kPXP_PorterDuffAlphaStraight); - - *config = pdConfig.pdConfigStruct; - - status = kStatus_Success; - } - - return status; -} - -static void PXP_StartRectCopy(PXP_Type *base, - uint32_t srcAddr, - uint16_t srcPitchBytes, - uint32_t destAddr, - uint16_t destPitchBytes, - uint16_t width, - uint16_t height, - pxp_as_pixel_format_t pixelFormat) -{ - pxp_output_buffer_config_t outputBufferConfig; - pxp_as_buffer_config_t asBufferConfig; - uint32_t intMask; - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) - intMask = - base->CTRL & (PXP_CTRL_NEXT_IRQ_ENABLE_MASK | PXP_CTRL_IRQ_ENABLE_MASK | PXP_CTRL_LUT_DMA_IRQ_ENABLE_MASK); -#else - intMask = base->CTRL & (PXP_CTRL_NEXT_IRQ_ENABLE_MASK | PXP_CTRL_IRQ_ENABLE_MASK); -#endif - - PXP_ResetToInit(base); - - /* Restore previous interrupt configuration. */ - PXP_EnableInterrupts(base, intMask); - - /* Disable PS */ - PXP_SetProcessSurfacePosition(base, 0xFFFFU, 0xFFFFU, 0U, 0U); - - /* Input buffer. */ - asBufferConfig.pixelFormat = pixelFormat; - asBufferConfig.bufferAddr = srcAddr; - asBufferConfig.pitchBytes = srcPitchBytes; - - PXP_SetAlphaSurfaceBufferConfig(base, &asBufferConfig); - PXP_SetAlphaSurfacePosition(base, 0U, 0U, width - 1U, height - 1U); - - /* Alpha mode set to ROP, AS OR PS*/ - const pxp_as_blend_config_t asBlendConfig = { - .alpha = 0U, .invertAlpha = false, .alphaMode = kPXP_AlphaRop, .ropMode = kPXP_RopMergeAs}; - - PXP_SetAlphaSurfaceBlendConfig(base, &asBlendConfig); - - /* Output buffer. */ - outputBufferConfig.pixelFormat = (pxp_output_pixel_format_t)pixelFormat; - outputBufferConfig.interlacedMode = kPXP_OutputProgressive; - outputBufferConfig.buffer0Addr = destAddr; - outputBufferConfig.buffer1Addr = 0U; - outputBufferConfig.pitchBytes = destPitchBytes; - outputBufferConfig.width = width; - outputBufferConfig.height = height; - - PXP_SetOutputBufferConfig(base, &outputBufferConfig); - - PXP_ClearStatusFlags(base, (uint32_t)kPXP_CompleteFlag); - - PXP_Start(base); -} - -/*! - * brief Copy picture from one buffer to another buffer. - * - * This function copies a rectangle from one buffer to another buffer. - * - * param base PXP peripheral base address. - * retval kStatus_Success Successfully started the copy process. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t PXP_StartPictureCopy(PXP_Type *base, const pxp_pic_copy_config_t *config) -{ - uint8_t bytePerPixel; - uint32_t copyFromAddr; - uint32_t copyToAddr; - - if ((0U == config->height) || (0U == config->width)) - { - return kStatus_InvalidArgument; - } - - if ((config->pixelFormat == kPXP_AsPixelFormatARGB8888) || (config->pixelFormat == kPXP_AsPixelFormatRGB888)) - { - bytePerPixel = 4U; - } - else - { - bytePerPixel = 2U; - } - - copyFromAddr = config->srcPicBaseAddr + ((uint32_t)config->srcOffsetY * (uint32_t)config->srcPitchBytes) + - bytePerPixel * config->srcOffsetX; - copyToAddr = config->destPicBaseAddr + ((uint32_t)config->destOffsetY * (uint32_t)config->destPitchBytes) + - bytePerPixel * config->destOffsetX; - - PXP_StartRectCopy(base, copyFromAddr, config->srcPitchBytes, copyToAddr, config->destPitchBytes, config->width, - config->height, config->pixelFormat); - - return kStatus_Success; -} - -/*! - * brief Copy continous memory. - * - * The copy size should be 512 byte aligned. - * - * param base PXP peripheral base address. - * retval kStatus_Success Successfully started the copy process. - * retval kStatus_InvalidArgument Invalid argument. - */ -status_t PXP_StartMemCopy(PXP_Type *base, uint32_t srcAddr, uint32_t destAddr, uint32_t size) -{ - uint16_t pitchBytes; - uint32_t height; - - if ((0U == size) || ((size % 512U) != 0U)) - { - return kStatus_InvalidArgument; - } - - /* - * By default, PXP process block is 8x8. For better performance, choose - * width and height dividable by block size. - */ - if (size < 8U * 512U) - { - height = 8U; - pitchBytes = (uint16_t)(size / height); - } - else - { - pitchBytes = 512U; - height = size / pitchBytes; - } - - if (height > PXP_MAX_HEIGHT) - { - return kStatus_InvalidArgument; - } - - PXP_StartRectCopy(base, srcAddr, pitchBytes, destAddr, pitchBytes, pitchBytes / 4U, (uint16_t)height, - kPXP_AsPixelFormatARGB8888); - - return kStatus_Success; -} diff --git a/devices/MIMXRT1052/drivers/fsl_pxp.h b/devices/MIMXRT1052/drivers/fsl_pxp.h deleted file mode 100644 index 519451a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_pxp.h +++ /dev/null @@ -1,1458 +0,0 @@ -/* - * Copyright 2017-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_PXP_H_ -#define _FSL_PXP_H_ - -#include "fsl_common.h" - -/* Compatibility macro map. */ -#if defined(PXP_AS_CTRL_ALPHA_INVERT_MASK) && (!defined(PXP_AS_CTRL_ALPHA0_INVERT_MASK)) -#define PXP_AS_CTRL_ALPHA0_INVERT_MASK PXP_AS_CTRL_ALPHA_INVERT_MASK -#endif - -#if defined(PXP_AS_CTRL_ALPHA_INVERT_MASK) && (!defined(PXP_AS_CTRL_ALPHA_INVERT_MASK)) -#define PXP_AS_CTRL_ALPHA0_INVERT_MASK PXP_AS_CTRL_ALPHA_INVERT_MASK -#endif - -#if defined(PXP_STAT_IRQ_MASK) && (!defined(PXP_STAT_IRQ0_MASK)) -#define PXP_STAT_IRQ0_MASK PXP_STAT_IRQ_MASK -#endif - -#if defined(PXP_STAT_AXI_READ_ERROR_MASK) && (!defined(PXP_STAT_AXI_READ_ERROR_0_MASK)) -#define PXP_STAT_AXI_READ_ERROR_0_MASK PXP_STAT_AXI_READ_ERROR_MASK -#endif - -#if defined(PXP_STAT_AXI_WRITE_ERROR_MASK) && (!defined(PXP_STAT_AXI_WRITE_ERROR_0_MASK)) -#define PXP_STAT_AXI_WRITE_ERROR_0_MASK PXP_STAT_AXI_WRITE_ERROR_MASK -#endif - -/*! - * @addtogroup pxp_driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* PXP global LUT table is 16K. */ -#define PXP_LUT_TABLE_BYTE (16 * 1024) -/* Intenral memory for LUT, the size is 256 bytes. */ -#define PXP_INTERNAL_RAM_LUT_BYTE (256) - -/*! @name Driver version */ -/*@{*/ -#define FSL_PXP_DRIVER_VERSION (MAKE_VERSION(2, 2, 1)) -/*@}*/ - -/* This macto indicates whether the rotate sub module is shared by process surface and output buffer. */ -#if defined(PXP_CTRL_ROT_POS_MASK) -#define PXP_SHARE_ROTATE 1 -#else -#define PXP_SHARE_ROTATE 0 -#endif - -/*! @brief PXP interrupts to enable. */ -enum _pxp_interrupt_enable -{ - kPXP_CommandLoadInterruptEnable = PXP_CTRL_NEXT_IRQ_ENABLE_MASK, /*!< Interrupt to show that the command set - by @ref PXP_SetNextCommand has been loaded. */ - kPXP_CompleteInterruptEnable = PXP_CTRL_IRQ_ENABLE_MASK, /*!< PXP process completed. */ -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) - kPXP_LutDmaLoadInterruptEnable = PXP_CTRL_LUT_DMA_IRQ_ENABLE_MASK, /*!< The LUT table has been loaded by DMA. */ -#endif -}; - -/*! - * @brief PXP status flags. - * - * @note These enumerations are meant to be OR'd together to form a bit mask. - */ -enum _pxp_flags -{ - kPXP_CommandLoadFlag = PXP_STAT_NEXT_IRQ_MASK, /*!< The command set by @ref PXP_SetNextCommand - has been loaded, could set new command. */ - kPXP_CompleteFlag = PXP_STAT_IRQ0_MASK, /*!< PXP process completed. */ -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) - kPXP_LutDmaLoadFlag = PXP_STAT_LUT_DMA_LOAD_DONE_IRQ_MASK, /*!< The LUT table has been loaded by DMA. */ -#endif - kPXP_Axi0ReadErrorFlag = PXP_STAT_AXI_READ_ERROR_0_MASK, /*!< PXP encountered an AXI read error - and processing has been terminated. */ - kPXP_Axi0WriteErrorFlag = PXP_STAT_AXI_WRITE_ERROR_0_MASK, /*!< PXP encountered an AXI write error - and processing has been terminated. */ -#if defined(PXP_STAT_AXI_READ_ERROR_1_MASK) - kPXP_Axi1ReadErrorFlag = PXP_STAT_AXI_READ_ERROR_1_MASK, /*!< PXP encountered an AXI read error - and processing has been terminated. */ - kPXP_Axi1WriteErrorFlag = PXP_STAT_AXI_WRITE_ERROR_1_MASK, /*!< PXP encountered an AXI write error - and processing has been terminated. */ -#endif -}; - -/*! @brief PXP output flip mode. */ -typedef enum _pxp_flip_mode -{ - kPXP_FlipDisable = 0U, /*!< Flip disable. */ - kPXP_FlipHorizontal = 0x01U, /*!< Horizontal flip. */ - kPXP_FlipVertical = 0x02U, /*!< Vertical flip. */ - kPXP_FlipBoth = 0x03U, /*!< Flip both directions. */ -} pxp_flip_mode_t; - -/*! @brief PXP rotate mode. */ -typedef enum _pxp_rotate_position -{ - kPXP_RotateOutputBuffer = 0U, /*!< Rotate the output buffer. */ - kPXP_RotateProcessSurface, /*!< Rotate the process surface. */ -} pxp_rotate_position_t; - -/*! @brief PXP rotate degree. */ -typedef enum _pxp_rotate_degree -{ - kPXP_Rotate0 = 0U, /*!< Clock wise rotate 0 deg. */ - kPXP_Rotate90, /*!< Clock wise rotate 90 deg. */ - kPXP_Rotate180, /*!< Clock wise rotate 180 deg. */ - kPXP_Rotate270, /*!< Clock wise rotate 270 deg. */ -} pxp_rotate_degree_t; - -/*! @brief PXP interlaced output mode. */ -typedef enum _pxp_interlaced_output_mode -{ - kPXP_OutputProgressive = 0U, /*!< All data written in progressive format to output buffer 0. */ - kPXP_OutputField0, /*!< Only write field 0 data to output buffer 0. */ - kPXP_OutputField1, /*!< Only write field 1 data to output buffer 0. */ - kPXP_OutputInterlaced, /*!< Field 0 write to buffer 0, field 1 write to buffer 1. */ -} pxp_interlaced_output_mode_t; - -/*! @brief PXP output buffer format. */ -typedef enum _pxp_output_pixel_format -{ - kPXP_OutputPixelFormatARGB8888 = 0x0, /*!< 32-bit pixels with alpha. */ - kPXP_OutputPixelFormatRGB888 = 0x4, /*!< 32-bit pixels without alpha (unpacked 24-bit format) */ - kPXP_OutputPixelFormatRGB888P = 0x5, /*!< 24-bit pixels without alpha (packed 24-bit format) */ - kPXP_OutputPixelFormatARGB1555 = 0x8, /*!< 16-bit pixels with alpha. */ - kPXP_OutputPixelFormatARGB4444 = 0x9, /*!< 16-bit pixels with alpha. */ - kPXP_OutputPixelFormatRGB555 = 0xC, /*!< 16-bit pixels without alpha. */ - kPXP_OutputPixelFormatRGB444 = 0xD, /*!< 16-bit pixels without alpha. */ - kPXP_OutputPixelFormatRGB565 = 0xE, /*!< 16-bit pixels without alpha. */ - kPXP_OutputPixelFormatYUV1P444 = 0x10, /*!< 32-bit pixels (1-plane XYUV unpacked). */ - kPXP_OutputPixelFormatUYVY1P422 = 0x12, /*!< 16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) */ - kPXP_OutputPixelFormatVYUY1P422 = 0x13, /*!< 16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) */ - kPXP_OutputPixelFormatY8 = 0x14, /*!< 8-bit monochrome pixels (1-plane Y luma output) */ - kPXP_OutputPixelFormatY4 = 0x15, /*!< 4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) */ - kPXP_OutputPixelFormatYUV2P422 = 0x18, /*!< 16-bit pixels (2-plane UV interleaved bytes) */ - kPXP_OutputPixelFormatYUV2P420 = 0x19, /*!< 16-bit pixels (2-plane UV) */ - kPXP_OutputPixelFormatYVU2P422 = 0x1A, /*!< 16-bit pixels (2-plane VU interleaved bytes) */ - kPXP_OutputPixelFormatYVU2P420 = 0x1B, /*!< 16-bit pixels (2-plane VU) */ -} pxp_output_pixel_format_t; - -/*! @brief PXP output buffer configuration. */ -typedef struct _pxp_output_buffer_config -{ - pxp_output_pixel_format_t pixelFormat; /*!< Output buffer pixel format. */ - pxp_interlaced_output_mode_t interlacedMode; /*!< Interlaced output mode. */ - uint32_t buffer0Addr; /*!< Output buffer 0 address. */ - uint32_t buffer1Addr; /*!< Output buffer 1 address, used for UV data in YUV 2-plane mode, or - field 1 in output interlaced mode. */ - uint16_t pitchBytes; /*!< Number of bytes between two vertically adjacent pixels. */ - uint16_t width; /*!< Pixels per line. */ - uint16_t height; /*!< How many lines in output buffer. */ -} pxp_output_buffer_config_t; - -/*! @brief PXP process surface buffer pixel format. */ -typedef enum _pxp_ps_pixel_format -{ - kPXP_PsPixelFormatRGB888 = 0x4, /*!< 32-bit pixels without alpha (unpacked 24-bit format) */ - kPXP_PsPixelFormatRGB555 = 0xC, /*!< 16-bit pixels without alpha. */ - kPXP_PsPixelFormatRGB444 = 0xD, /*!< 16-bit pixels without alpha. */ - kPXP_PsPixelFormatRGB565 = 0xE, /*!< 16-bit pixels without alpha. */ - kPXP_PsPixelFormatYUV1P444 = 0x10, /*!< 32-bit pixels (1-plane XYUV unpacked). */ - kPXP_PsPixelFormatUYVY1P422 = 0x12, /*!< 16-bit pixels (1-plane U0,Y0,V0,Y1 interleaved bytes) */ - kPXP_PsPixelFormatVYUY1P422 = 0x13, /*!< 16-bit pixels (1-plane V0,Y0,U0,Y1 interleaved bytes) */ - kPXP_PsPixelFormatY8 = 0x14, /*!< 8-bit monochrome pixels (1-plane Y luma output) */ - kPXP_PsPixelFormatY4 = 0x15, /*!< 4-bit monochrome pixels (1-plane Y luma, 4 bit truncation) */ - kPXP_PsPixelFormatYUV2P422 = 0x18, /*!< 16-bit pixels (2-plane UV interleaved bytes) */ - kPXP_PsPixelFormatYUV2P420 = 0x19, /*!< 16-bit pixels (2-plane UV) */ - kPXP_PsPixelFormatYVU2P422 = 0x1A, /*!< 16-bit pixels (2-plane VU interleaved bytes) */ - kPXP_PsPixelFormatYVU2P420 = 0x1B, /*!< 16-bit pixels (2-plane VU) */ - kPXP_PsPixelFormatYVU422 = 0x1E, /*!< 16-bit pixels (3-plane) */ - kPXP_PsPixelFormatYVU420 = 0x1F, /*!< 16-bit pixels (3-plane) */ -} pxp_ps_pixel_format_t; - -/*! @brief PXP process surface buffer YUV format. */ -typedef enum _pxp_ps_yuv_format -{ - kPXP_PsYUVFormatYUV = 0U, /*!< YUV format. */ - kPXP_PsYUVFormatYCbCr, /*!< YCbCr format. */ -} pxp_ps_yuv_format_t; - -/*! @brief PXP process surface buffer configuration. */ -typedef struct _pxp_ps_buffer_config -{ - pxp_ps_pixel_format_t pixelFormat; /*!< PS buffer pixel format. */ - bool swapByte; /*!< For each 16 bit word, set true to swap the two bytes. */ - uint32_t bufferAddr; /*!< Input buffer address for the first panel. */ - uint32_t bufferAddrU; /*!< Input buffer address for the second panel. */ - uint32_t bufferAddrV; /*!< Input buffer address for the third panel. */ - uint16_t pitchBytes; /*!< Number of bytes between two vertically adjacent pixels. */ -} pxp_ps_buffer_config_t; - -/*! @brief PXP alpha surface buffer pixel format. */ -typedef enum _pxp_as_pixel_format -{ - kPXP_AsPixelFormatARGB8888 = 0x0, /*!< 32-bit pixels with alpha. */ - kPXP_AsPixelFormatRGB888 = 0x4, /*!< 32-bit pixels without alpha (unpacked 24-bit format) */ - kPXP_AsPixelFormatARGB1555 = 0x8, /*!< 16-bit pixels with alpha. */ - kPXP_AsPixelFormatARGB4444 = 0x9, /*!< 16-bit pixels with alpha. */ - kPXP_AsPixelFormatRGB555 = 0xC, /*!< 16-bit pixels without alpha. */ - kPXP_AsPixelFormatRGB444 = 0xD, /*!< 16-bit pixels without alpha. */ - kPXP_AsPixelFormatRGB565 = 0xE, /*!< 16-bit pixels without alpha. */ -} pxp_as_pixel_format_t; - -/*! @brief PXP alphs surface buffer configuration. */ -typedef struct _pxp_as_buffer_config -{ - pxp_as_pixel_format_t pixelFormat; /*!< AS buffer pixel format. */ - uint32_t bufferAddr; /*!< Input buffer address. */ - uint16_t pitchBytes; /*!< Number of bytes between two vertically adjacent pixels. */ -} pxp_as_buffer_config_t; - -/*! - * @brief PXP alpha mode during blending. - */ -typedef enum _pxp_alpha_mode -{ - kPXP_AlphaEmbedded, /*!< The alpha surface pixel alpha value will be used for blend. */ - kPXP_AlphaOverride, /*!< The user defined alpha value will be used for blend directly. */ - kPXP_AlphaMultiply, /*!< The alpha surface pixel alpha value scaled the user defined - alpha value will be used for blend, for example, pixel alpha set - set to 200, user defined alpha set to 100, then the reault alpha - is 200 * 100 / 255. */ - kPXP_AlphaRop /*!< Raster operation. */ -} pxp_alpha_mode_t; - -/*! - * @brief PXP ROP mode during blending. - * - * Explanation: - * - AS: Alpha surface - * - PS: Process surface - * - nAS: Alpha surface NOT value - * - nPS: Process surface NOT value - */ -typedef enum _pxp_rop_mode -{ - kPXP_RopMaskAs = 0x0, /*!< AS AND PS. */ - kPXP_RopMaskNotAs = 0x1, /*!< nAS AND PS. */ - kPXP_RopMaskAsNot = 0x2, /*!< AS AND nPS. */ - kPXP_RopMergeAs = 0x3, /*!< AS OR PS. */ - kPXP_RopMergeNotAs = 0x4, /*!< nAS OR PS. */ - kPXP_RopMergeAsNot = 0x5, /*!< AS OR nPS. */ - kPXP_RopNotCopyAs = 0x6, /*!< nAS. */ - kPXP_RopNot = 0x7, /*!< nPS. */ - kPXP_RopNotMaskAs = 0x8, /*!< AS NAND PS. */ - kPXP_RopNotMergeAs = 0x9, /*!< AS NOR PS. */ - kPXP_RopXorAs = 0xA, /*!< AS XOR PS. */ - kPXP_RopNotXorAs = 0xB /*!< AS XNOR PS. */ -} pxp_rop_mode_t; - -/*! - * @brief PXP alpha surface blending configuration. - */ -typedef struct _pxp_as_blend_config -{ - uint8_t alpha; /*!< User defined alpha value, only used when @ref alphaMode is @ref kPXP_AlphaOverride or @ref - kPXP_AlphaRop. */ - bool invertAlpha; /*!< Set true to invert the alpha. */ - pxp_alpha_mode_t alphaMode; /*!< Alpha mode. */ - pxp_rop_mode_t ropMode; /*!< ROP mode, only valid when @ref alphaMode is @ref kPXP_AlphaRop. */ -} pxp_as_blend_config_t; - -/*! @brief PXP process block size. */ -typedef enum _pxp_block_size -{ - kPXP_BlockSize8 = 0U, /*!< Process 8x8 pixel blocks. */ - kPXP_BlockSize16, /*!< Process 16x16 pixel blocks. */ -} pxp_block_size_t; - -/*! @brief PXP CSC1 mode. */ -typedef enum _pxp_csc1_mode -{ - kPXP_Csc1YUV2RGB = 0U, /*!< YUV to RGB. */ - kPXP_Csc1YCbCr2RGB, /*!< YCbCr to RGB. */ -} pxp_csc1_mode_t; - -/*! @brief PXP CSC2 mode. */ -typedef enum _pxp_csc2_mode -{ - kPXP_Csc2YUV2RGB = 0U, /*!< YUV to RGB. */ - kPXP_Csc2YCbCr2RGB, /*!< YCbCr to RGB. */ - kPXP_Csc2RGB2YUV, /*!< RGB to YUV. */ - kPXP_Csc2RGB2YCbCr, /*!< RGB to YCbCr. */ -} pxp_csc2_mode_t; - -/*! - * @brief PXP CSC2 configuration. - * - * Converting from YUV/YCbCr color spaces to the RGB color space uses the - * following equation structure: - * - * R = A1(Y+D1) + A2(U+D2) + A3(V+D3) - * G = B1(Y+D1) + B2(U+D2) + B3(V+D3) - * B = C1(Y+D1) + C2(U+D2) + C3(V+D3) - * - * Converting from the RGB color space to YUV/YCbCr color spaces uses the - * following equation structure: - * - * Y = A1*R + A2*G + A3*B + D1 - * U = B1*R + B2*G + B3*B + D2 - * V = C1*R + C2*G + C3*B + D3 - */ -typedef struct _pxp_csc2_config -{ - pxp_csc2_mode_t mode; /*!< Convertion mode. */ - float A1; /*!< A1. */ - float A2; /*!< A2. */ - float A3; /*!< A3. */ - float B1; /*!< B1. */ - float B2; /*!< B2. */ - float B3; /*!< B3. */ - float C1; /*!< C1. */ - float C2; /*!< C2. */ - float C3; /*!< C3. */ - int16_t D1; /*!< D1. */ - int16_t D2; /*!< D2. */ - int16_t D3; /*!< D3. */ -} pxp_csc2_config_t; - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) -/*! @brief PXP LUT lookup mode. */ -typedef enum _pxp_lut_lookup_mode -{ - kPXP_LutCacheRGB565 = 0U, /*!< LUT ADDR = R[7:3],G[7:2],B[7:3]. Use all 16KB of LUT - for indirect cached 128KB lookup. */ - kPXP_LutDirectY8, /*!< LUT ADDR = 16'b0,Y[7:0]. Use the first 256 bytes of LUT. - Only third data path byte is tranformed. */ - kPXP_LutDirectRGB444, /*!< LUT ADDR = R[7:4],G[7:4],B[7:4]. Use one 8KB bank of LUT - selected by @ref PXP_Select8kLutBank. */ - kPXP_LutDirectRGB454, /*!< LUT ADDR = R[7:4],G[7:3],B[7:4]. Use all 16KB of LUT. */ -} pxp_lut_lookup_mode_t; - -/*! @brief PXP LUT output mode. */ -typedef enum _pxp_lut_out_mode -{ - kPXP_LutOutY8 = 1U, /*!< R/Y byte lane 2 lookup, bytes 1,0 bypassed. */ - kPXP_LutOutRGBW4444CFA, /*!< Byte lane 2 = CFA_Y8, byte lane 1,0 = RGBW4444. */ - kPXP_LutOutRGB888, /*!< RGB565->RGB888 conversion for Gamma correction. */ -} pxp_lut_out_mode_t; - -/*! @brief PXP LUT 8K bank index used when lookup mode is @ref kPXP_LutDirectRGB444. */ -typedef enum _pxp_lut_8k_bank -{ - kPXP_Lut8kBank0 = 0U, /*!< The first 8K bank used. */ - kPXP_Lut8kBank1, /*!< The second 8K bank used. */ -} pxp_lut_8k_bank_t; - -/*! @brief PXP LUT configuration. */ -typedef struct _pxp_lut_config -{ - pxp_lut_lookup_mode_t lookupMode; /*!< Look up mode. */ - pxp_lut_out_mode_t outMode; /*!< Out mode. */ - uint32_t cfaValue; /*!< The CFA value used when look up mode is @ref kPXP_LutOutRGBW4444CFA. */ -} pxp_lut_config_t; -#endif /* FSL_FEATURE_PXP_HAS_NO_LUT */ - -/*! @brief PXP internal memory. */ -typedef enum _pxp_ram -{ - kPXP_RamDither0Lut = 0U, /*!< Dither 0 LUT memory. */ - kPXP_RamDither1Lut = 3U, /*!< Dither 1 LUT memory. */ - kPXP_RamDither2Lut = 4U, /*!< Dither 2 LUT memory. */ -} pxp_ram_t; - -/*! @brief PXP dither mode. */ -enum _pxp_dither_mode -{ - kPXP_DitherPassThrough = 0U, /*!< Pass through, no dither. */ - kPXP_DitherOrdered = 3U, /*!< Ordered dither. */ - kPXP_DitherQuantOnly = 4U, /*!< No dithering, only quantization. */ -}; - -/*! @brief PXP dither LUT mode. */ -enum _pxp_dither_lut_mode -{ - kPXP_DitherLutOff = 0U, /*!< The LUT memory is not used for LUT, could be used as ordered dither index matrix. */ - kPXP_DitherLutPreDither, /*!< Use LUT at the pre-dither stage, The pre-dither LUT could only be used in Floyd mode - or Atkinson mode, which are not supported by current PXP module. */ - kPXP_DitherLutPostDither, /*!< Use LUT at the post-dither stage. */ -}; - -/*! @brief PXP dither matrix size. */ -enum _pxp_dither_matrix_size -{ - kPXP_DitherMatrix8 = 1, /*!< The dither index matrix is 8x8. */ - kPXP_DitherMatrix16, /*!< The dither index matrix is 16x16. */ -}; - -/*! @brief PXP dither final LUT data. */ -typedef struct _pxp_dither_final_lut_data -{ - uint32_t data_3_0; /*!< Data 3 to data 0. Data 0 is the least significant byte. */ - uint32_t data_7_4; /*!< Data 7 to data 4. Data 4 is the least significant byte. */ - uint32_t data_11_8; /*!< Data 11 to data 8. Data 8 is the least significant byte. */ - uint32_t data_15_12; /*!< Data 15 to data 12. Data 12 is the least significant byte. */ -} pxp_dither_final_lut_data_t; - -/*! @brief PXP dither configuration. */ -typedef struct _pxp_dither_config -{ - uint32_t enableDither0 : 1; /*!< Enable dither engine 0 or not, set 1 to enable, 0 to disable. */ - uint32_t enableDither1 : 1; /*!< Enable dither engine 1 or not, set 1 to enable, 0 to disable. */ - uint32_t enableDither2 : 1; /*!< Enable dither engine 2 or not, set 1 to enable, 0 to disable. */ - uint32_t ditherMode0 : 3; /*!< Dither mode for dither engine 0. See @ref _pxp_dither_mode. */ - uint32_t ditherMode1 : 3; /*!< Dither mode for dither engine 1. See @ref _pxp_dither_mode. */ - uint32_t ditherMode2 : 3; /*!< Dither mode for dither engine 2. See @ref _pxp_dither_mode. */ - uint32_t quantBitNum : 3; /*!< Number of bits quantize down to, the valid value is 1~7. */ - uint32_t lutMode : 2; /*!< How to use the memory LUT, see @ref _pxp_dither_lut_mode. This must be set to @ref - kPXP_DitherLutOff - if any dither engine uses @ref kPXP_DitherOrdered mode. */ - uint32_t idxMatrixSize0 : 2; /*!< Size of index matrix used for dither for dither engine 0, see @ref - _pxp_dither_matrix_size. */ - uint32_t idxMatrixSize1 : 2; /*!< Size of index matrix used for dither for dither engine 1, see @ref - _pxp_dither_matrix_size. */ - uint32_t idxMatrixSize2 : 2; /*!< Size of index matrix used for dither for dither engine 2, see @ref - _pxp_dither_matrix_size. */ - uint32_t enableFinalLut : 1; /*!< Enable the final LUT, set 1 to enable, 0 to disable. */ - uint32_t : 8; -} pxp_dither_config_t; - -/*! - * @brief Porter Duff factor mode. - * @anchor pxp_porter_duff_factor_mode - */ -enum -{ - kPXP_PorterDuffFactorOne = 0U, /*!< Use 1. */ - kPXP_PorterDuffFactorZero, /*!< Use 0. */ - kPXP_PorterDuffFactorStraight, /*!< Use straight alpha. */ - kPXP_PorterDuffFactorInversed, /*!< Use inversed alpha. */ -}; - -/*! - * @brief Porter Duff global alpha mode. - * @anchor pxp_porter_duff_global_alpha_mode - */ -enum -{ - kPXP_PorterDuffGlobalAlpha = 0U, /*!< Use global alpha. */ - kPXP_PorterDuffLocalAlpha, /*!< Use local alpha in each pixel. */ - kPXP_PorterDuffScaledAlpha, /*!< Use global alpha * local alpha. */ -}; - -/*! - * @brief Porter Duff alpha mode. - * @anchor pxp_porter_duff_alpha_mode - */ -enum -{ - kPXP_PorterDuffAlphaStraight = 0U, /*!< Use straight alpha, s0_alpha' = s0_alpha. */ - kPXP_PorterDuffAlphaInversed /*!< Use inversed alpha, s0_alpha' = 0xFF - s0_alpha. */ -}; - -/*! - * @brief Porter Duff color mode. - * @anchor pxp_porter_duff_color_mode - */ -enum -{ - kPXP_PorterDuffColorStraight = 0, /*!< @deprecated Use kPXP_PorterDuffColorNoAlpha. */ - kPXP_PorterDuffColorInversed = 1, /*!< @deprecated Use kPXP_PorterDuffColorWithAlpha. */ - kPXP_PorterDuffColorNoAlpha = 0, /*!< s0_pixel' = s0_pixel. */ - kPXP_PorterDuffColorWithAlpha = 1, /*!< s0_pixel' = s0_pixel * s0_alpha". */ -}; - -/*! @brief PXP Porter Duff configuration. */ -typedef struct -{ - uint32_t enable : 1; /*!< Enable or disable Porter Duff. */ - uint32_t srcFactorMode : 2; /*!< Source layer (or AS, s1) factor mode, see @ref pxp_porter_duff_factor_mode. */ - uint32_t dstGlobalAlphaMode : 2; /*!< Destination layer (or PS, s0) global alpha mode, see - @ref pxp_porter_duff_global_alpha_mode. */ - uint32_t dstAlphaMode : 1; /*!< Destination layer (or PS, s0) alpha mode, see @ref pxp_porter_duff_alpha_mode. */ - uint32_t dstColorMode : 1; /*!< Destination layer (or PS, s0) color mode, see @ref pxp_porter_duff_color_mode. */ - uint32_t : 1; - uint32_t dstFactorMode : 2; /*!< Destination layer (or PS, s0) factor mode, see @ref pxp_porter_duff_factor_mode. */ - uint32_t srcGlobalAlphaMode : 2; /*!< Source layer (or AS, s1) global alpha mode, see - @ref pxp_porter_duff_global_alpha_mode. */ - uint32_t srcAlphaMode : 1; /*!< Source layer (or AS, s1) alpha mode, see @ref pxp_porter_duff_alpha_mode. */ - uint32_t srcColorMode : 1; /*!< Source layer (or AS, s1) color mode, see @ref pxp_porter_duff_color_mode. */ - uint32_t : 2; - uint32_t dstGlobalAlpha : 8; /*!< Destination layer (or PS, s0) global alpha value, 0~255. */ - uint32_t srcGlobalAlpha : 8; /*!< Source layer (or AS, s1) global alpha value, 0~255. */ -} pxp_porter_duff_config_t; - -/*! @brief PXP Porter Duff blend mode. Note: don't change the enum item value */ -typedef enum _pxp_porter_duff_blend_mode -{ - kPXP_PorterDuffSrc = 0, /*!< Source Only */ - kPXP_PorterDuffAtop, /*!< Source Atop */ - kPXP_PorterDuffOver, /*!< Source Over */ - kPXP_PorterDuffIn, /*!< Source In. */ - kPXP_PorterDuffOut, /*!< Source Out. */ - kPXP_PorterDuffDst, /*!< Destination Only. */ - kPXP_PorterDuffDstAtop, /*!< Destination Atop. */ - kPXP_PorterDuffDstOver, /*!< Destination Over. */ - kPXP_PorterDuffDstIn, /*!< Destination In. */ - kPXP_PorterDuffDstOut, /*!< Destination Out. */ - kPXP_PorterDuffXor, /*!< XOR. */ - kPXP_PorterDuffClear, /*!< Clear. */ - kPXP_PorterDuffMax, -} pxp_porter_duff_blend_mode_t; - -/*! @brief PXP Porter Duff blend mode. Note: don't change the enum item value */ -typedef struct _pxp_pic_copy_config -{ - uint32_t srcPicBaseAddr; /*!< Source picture base address. */ - uint16_t srcPitchBytes; /*!< Pitch of the source buffer. */ - uint16_t srcOffsetX; /*!< Copy position in source picture. */ - uint16_t srcOffsetY; /*!< Copy position in source picture. */ - uint32_t destPicBaseAddr; /*!< Destination picture base address. */ - uint16_t destPitchBytes; /*!< Pitch of the destination buffer. */ - uint16_t destOffsetX; /*!< Copy position in destination picture. */ - uint16_t destOffsetY; /*!< Copy position in destination picture. */ - uint16_t width; /*!< Pixel number each line to copy. */ - uint16_t height; /*!< Lines to copy. */ - pxp_as_pixel_format_t pixelFormat; /*!< Buffer pixel format. */ -} pxp_pic_copy_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initialize the PXP. - * - * This function enables the PXP peripheral clock, and resets the PXP registers - * to default status. - * - * @param base PXP peripheral base address. - */ -void PXP_Init(PXP_Type *base); - -/*! - * @brief De-initialize the PXP. - * - * This function disables the PXP peripheral clock. - * - * @param base PXP peripheral base address. - */ -void PXP_Deinit(PXP_Type *base); - -/*! - * @brief Reset the PXP. - * - * This function resets the PXP peripheral registers to default status. - * - * @param base PXP peripheral base address. - */ -void PXP_Reset(PXP_Type *base); -/* @} */ - -/*! - * @name Global operations - * @{ - */ - -/*! - * @brief Start process. - * - * Start PXP process using current configuration. - * - * @param base PXP peripheral base address. - */ -static inline void PXP_Start(PXP_Type *base) -{ - base->CTRL_SET = PXP_CTRL_ENABLE_MASK; -} - -/*! - * @brief Enable or disable LCD hand shake. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableLcdHandShake(PXP_Type *base, bool enable) -{ -#if defined(PXP_CTRL_ENABLE_LCD_HANDSHAKE_MASK) - if (enable) - { - base->CTRL_SET = PXP_CTRL_ENABLE_LCD_HANDSHAKE_MASK; - } - else - { - base->CTRL_CLR = PXP_CTRL_ENABLE_LCD_HANDSHAKE_MASK; - } -#else - if (enable) - { - base->CTRL_SET = PXP_CTRL_ENABLE_LCD0_HANDSHAKE_MASK; - } - else - { - base->CTRL_CLR = PXP_CTRL_ENABLE_LCD0_HANDSHAKE_MASK; - } -#endif -} - -#if (defined(FSL_FEATURE_PXP_HAS_EN_REPEAT) && FSL_FEATURE_PXP_HAS_EN_REPEAT) -/*! - * @brief Enable or disable continous run. - * - * If continous run not enabled, @ref PXP_Start starts the PXP process. When completed, - * PXP enters idle mode and flag @ref kPXP_CompleteFlag asserts. - * - * If continous run enabled, the PXP will repeat based on the current configuration register - * settings. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableContinousRun(PXP_Type *base, bool enable) -{ - if (enable) - { - base->CTRL_SET = PXP_CTRL_EN_REPEAT_MASK; - } - else - { - base->CTRL_CLR = PXP_CTRL_EN_REPEAT_MASK; - } -} -#endif /* FSL_FEATURE_PXP_HAS_EN_REPEAT */ - -/*! - * @brief Set the PXP processing block size - * - * This function chooses the pixel block size that PXP using during process. - * Larger block size means better performace, but be careful that when PXP is - * rotating, the output must be divisible by the block size selected. - * - * @param base PXP peripheral base address. - * @param size The pixel block size. - */ -static inline void PXP_SetProcessBlockSize(PXP_Type *base, pxp_block_size_t size) -{ - base->CTRL = (base->CTRL & ~PXP_CTRL_BLOCK_SIZE_MASK) | PXP_CTRL_BLOCK_SIZE(size); -} - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets PXP status flags. - * - * This function gets all PXP status flags. The flags are returned as the logical - * OR value of the enumerators @ref _pxp_flags. To check a specific status, - * compare the return value with enumerators in @ref _pxp_flags. - * For example, to check whether the PXP has completed process, use like this: - * @code - if (kPXP_CompleteFlag & PXP_GetStatusFlags(PXP)) - { - ... - } - @endcode - * - * @param base PXP peripheral base address. - * @return PXP status flags which are OR'ed by the enumerators in the _pxp_flags. - */ -static inline uint32_t PXP_GetStatusFlags(PXP_Type *base) -{ -#if defined(PXP_STAT_AXI_READ_ERROR_1_MASK) - return base->STAT & - (PXP_STAT_NEXT_IRQ_MASK | PXP_STAT_IRQ0_MASK | PXP_STAT_AXI_READ_ERROR_0_MASK | - PXP_STAT_AXI_WRITE_ERROR_0_MASK | PXP_STAT_AXI_READ_ERROR_1_MASK | PXP_STAT_AXI_WRITE_ERROR_1_MASK); -#else - return base->STAT & (PXP_STAT_NEXT_IRQ_MASK | PXP_STAT_IRQ0_MASK | PXP_STAT_AXI_READ_ERROR_0_MASK | - PXP_STAT_AXI_WRITE_ERROR_0_MASK); -#endif -} - -/*! - * @brief Clears status flags with the provided mask. - * - * This function clears PXP status flags with a provided mask. - * - * @param base PXP peripheral base address. - * @param statusMask The status flags to be cleared; it is logical OR value of @ref _pxp_flags. - */ -static inline void PXP_ClearStatusFlags(PXP_Type *base, uint32_t statusMask) -{ - base->STAT_CLR = statusMask; -} - -/*! - * @brief Gets the AXI ID of the failing bus operation. - * - * @param base PXP peripheral base address. - * @param axiIndex Whitch AXI to get - * - 0: AXI0 - * - 1: AXI1 - * @return The AXI ID of the failing bus operation. - */ -static inline uint8_t PXP_GetAxiErrorId(PXP_Type *base, uint8_t axiIndex) -{ -#if defined(PXP_STAT_AXI_ERROR_ID_1_MASK) - if (0 == axiIndex) - { - return (uint8_t)((base->STAT & PXP_STAT_AXI_ERROR_ID_0_MASK) >> PXP_STAT_AXI_ERROR_ID_0_SHIFT); - } - else - { - return (uint8_t)((base->STAT & PXP_STAT_AXI_ERROR_ID_1_MASK) >> PXP_STAT_AXI_ERROR_ID_1_SHIFT); - } -#else - return (uint8_t)((base->STAT & PXP_STAT_AXI_ERROR_ID_MASK) >> PXP_STAT_AXI_ERROR_ID_SHIFT); -#endif -} - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables PXP interrupts according to the provided mask. - * - * This function enables the PXP interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See @ref _pxp_interrupt_enable. - * For example, to enable PXP process complete interrupt and command loaded - * interrupt, do the following. - * @code - PXP_EnableInterrupts(PXP, kPXP_CommandLoadInterruptEnable | kPXP_CompleteInterruptEnable); - @endcode - * - * @param base PXP peripheral base address. - * @param mask The interrupts to enable. Logical OR of @ref _pxp_interrupt_enable. - */ -static inline void PXP_EnableInterrupts(PXP_Type *base, uint32_t mask) -{ - base->CTRL_SET = mask; -} - -/*! - * @brief Disables PXP interrupts according to the provided mask. - * - * This function disables the PXP interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See @ref _pxp_interrupt_enable. - * - * @param base PXP peripheral base address. - * @param mask The interrupts to disable. Logical OR of @ref _pxp_interrupt_enable. - */ -static inline void PXP_DisableInterrupts(PXP_Type *base, uint32_t mask) -{ - base->CTRL_CLR = mask; -} - -/* @} */ - -/*! - * @name Alpha surface - * @{ - */ - -/*! - * @brief Set the alpha surface input buffer configuration. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetAlphaSurfaceBufferConfig(PXP_Type *base, const pxp_as_buffer_config_t *config); - -/*! - * @brief Set the alpha surface blending configuration. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration structure. - */ -void PXP_SetAlphaSurfaceBlendConfig(PXP_Type *base, const pxp_as_blend_config_t *config); - -/*! - * @brief Set the alpha surface overlay color key. - * - * If a pixel in the current overlay image with a color that falls in the range - * from the @p colorKeyLow to @p colorKeyHigh range, it will use the process surface - * pixel value for that location. If no PS image is present or if the PS image also - * matches its colorkey range, the PS background color is used. - * - * @param base PXP peripheral base address. - * @param colorKeyLow Color key low range. - * @param colorKeyHigh Color key high range. - * - * @note Colorkey operations are higher priority than alpha or ROP operations - */ -void PXP_SetAlphaSurfaceOverlayColorKey(PXP_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh); - -/*! - * @brief Enable or disable the alpha surface color key. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableAlphaSurfaceOverlayColorKey(PXP_Type *base, bool enable) -{ - if (enable) - { - base->AS_CTRL |= PXP_AS_CTRL_ENABLE_COLORKEY_MASK; - } - else - { - base->AS_CTRL &= ~PXP_AS_CTRL_ENABLE_COLORKEY_MASK; - } -} - -/*! - * @brief Set the alpha surface position in output buffer. - * - * @param base PXP peripheral base address. - * @param upperLeftX X of the upper left corner. - * @param upperLeftY Y of the upper left corner. - * @param lowerRightX X of the lower right corner. - * @param lowerRightY Y of the lower right corner. - */ -void PXP_SetAlphaSurfacePosition( - PXP_Type *base, uint16_t upperLeftX, uint16_t upperLeftY, uint16_t lowerRightX, uint16_t lowerRightY); -/* @} */ - -/*! - * @name Process surface - * @{ - */ - -/*! - * @brief Set the back ground color of PS. - * - * @param base PXP peripheral base address. - * @param backGroundColor Pixel value of the background color. - */ -static inline void PXP_SetProcessSurfaceBackGroundColor(PXP_Type *base, uint32_t backGroundColor) -{ -#if defined(PXP_PS_BACKGROUND_0_COLOR_MASK) - base->PS_BACKGROUND_0 = backGroundColor; -#else - base->PS_BACKGROUND = backGroundColor; -#endif -} - -/*! - * @brief Set the process surface input buffer configuration. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetProcessSurfaceBufferConfig(PXP_Type *base, const pxp_ps_buffer_config_t *config); - -/*! - * @brief Set the process surface scaler configuration. - * - * The valid down scale fact is 1/(2^12) ~ 16. - * - * @param base PXP peripheral base address. - * @param inputWidth Input image width. - * @param inputHeight Input image height. - * @param outputWidth Output image width. - * @param outputHeight Output image height. - */ -void PXP_SetProcessSurfaceScaler( - PXP_Type *base, uint16_t inputWidth, uint16_t inputHeight, uint16_t outputWidth, uint16_t outputHeight); - -/*! - * @brief Set the process surface position in output buffer. - * - * @param base PXP peripheral base address. - * @param upperLeftX X of the upper left corner. - * @param upperLeftY Y of the upper left corner. - * @param lowerRightX X of the lower right corner. - * @param lowerRightY Y of the lower right corner. - */ -void PXP_SetProcessSurfacePosition( - PXP_Type *base, uint16_t upperLeftX, uint16_t upperLeftY, uint16_t lowerRightX, uint16_t lowerRightY); - -/*! - * @brief Set the process surface color key. - * - * If the PS image matches colorkey range, the PS background color is output. Set - * @p colorKeyLow to 0xFFFFFFFF and @p colorKeyHigh to 0 will disable the colorkeying. - * - * @param base PXP peripheral base address. - * @param colorKeyLow Color key low range. - * @param colorKeyHigh Color key high range. - */ -void PXP_SetProcessSurfaceColorKey(PXP_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh); - -/*! - * @brief Set the process surface input pixel format YUV or YCbCr. - * - * If process surface input pixel format is YUV and CSC1 is not enabled, - * in other words, the process surface output pixel format is also YUV, - * then this function should be called to set whether input pixel format - * is YUV or YCbCr. - * - * @param base PXP peripheral base address. - * @param format The YUV format. - */ -static inline void PXP_SetProcessSurfaceYUVFormat(PXP_Type *base, pxp_ps_yuv_format_t format) -{ - if (kPXP_PsYUVFormatYUV == format) - { - base->CSC1_COEF0 &= ~PXP_CSC1_COEF0_YCBCR_MODE_MASK; - } - else - { - base->CSC1_COEF0 |= PXP_CSC1_COEF0_YCBCR_MODE_MASK; - } -} -/* @} */ - -/*! - * @name Output buffer - * @{ - */ - -/*! - * @brief Set the PXP outpt buffer configuration. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetOutputBufferConfig(PXP_Type *base, const pxp_output_buffer_config_t *config); - -/*! - * @brief Set the global overwritten alpha value. - * - * If global overwritten alpha is enabled, the alpha component in output buffer pixels - * will be overwritten, otherwise the computed alpha value is used. - * - * @param base PXP peripheral base address. - * @param alpha The alpha value. - */ -static inline void PXP_SetOverwrittenAlphaValue(PXP_Type *base, uint8_t alpha) -{ - base->OUT_CTRL = (base->OUT_CTRL & ~PXP_OUT_CTRL_ALPHA_MASK) | PXP_OUT_CTRL_ALPHA(alpha); -} - -/*! - * @brief Enable or disable the global overwritten alpha value. - * - * If global overwritten alpha is enabled, the alpha component in output buffer pixels - * will be overwritten, otherwise the computed alpha value is used. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableOverWrittenAlpha(PXP_Type *base, bool enable) -{ - if (enable) - { - base->OUT_CTRL_SET = PXP_OUT_CTRL_ALPHA_OUTPUT_MASK; - } - else - { - base->OUT_CTRL_CLR = PXP_OUT_CTRL_ALPHA_OUTPUT_MASK; - } -} - -/*! - * @brief Set the rotation configuration. - * - * The PXP could rotate the process surface or the output buffer. There are - * two PXP versions: - * - Version 1: Only has one rotate sub module, the output buffer and process - * surface share the same rotate sub module, which means the process surface - * and output buffer could not be rotate at the same time. When pass in - * @ref kPXP_RotateOutputBuffer, the process surface could not use the rotate, - * Also when pass in @ref kPXP_RotateProcessSurface, output buffer could not - * use the rotate. - * - Version 2: Has two seperate rotate sub modules, the output buffer and - * process surface could configure the rotation independently. - * - * Upper layer could use the macro PXP_SHARE_ROTATE to check which version is. - * PXP_SHARE_ROTATE=1 means version 1. - * - * @param base PXP peripheral base address. - * @param position Rotate process surface or output buffer. - * @param degree Rotate degree. - * @param flipMode Flip mode. - * - * @note This function is different depends on the macro PXP_SHARE_ROTATE. - */ -static inline void PXP_SetRotateConfig(PXP_Type *base, - pxp_rotate_position_t position, - pxp_rotate_degree_t degree, - pxp_flip_mode_t flipMode) -{ -#if PXP_SHARE_ROTATE - base->CTRL = - (base->CTRL & ~(PXP_CTRL_ROTATE_MASK | PXP_CTRL_ROT_POS_MASK | PXP_CTRL_VFLIP_MASK | PXP_CTRL_HFLIP_MASK)) | - PXP_CTRL_ROTATE(degree) | PXP_CTRL_ROT_POS(position) | ((uint32_t)flipMode << PXP_CTRL_HFLIP_SHIFT); -#else - uint32_t ctrl = base->CTRL; - - if (kPXP_RotateOutputBuffer == position) - { - if ((degree != kPXP_Rotate0) || (flipMode != kPXP_FlipDisable)) - { - base->DATA_PATH_CTRL0 = - (base->DATA_PATH_CTRL0 & (~PXP_DATA_PATH_CTRL0_MUX12_SEL_MASK)) | PXP_DATA_PATH_CTRL0_MUX12_SEL(0); - } - else - { - base->DATA_PATH_CTRL0 = - (base->DATA_PATH_CTRL0 & (~PXP_DATA_PATH_CTRL0_MUX12_SEL_MASK)) | PXP_DATA_PATH_CTRL0_MUX12_SEL(1); - } - ctrl &= ~(PXP_CTRL_HFLIP0_MASK | PXP_CTRL_VFLIP0_MASK | PXP_CTRL_ROTATE0_MASK); - ctrl |= (PXP_CTRL_ROTATE0(degree) | ((uint32_t)flipMode << PXP_CTRL_HFLIP0_SHIFT)); - } - else - { - if ((degree != kPXP_Rotate0) || (flipMode != kPXP_FlipDisable)) - { - base->DATA_PATH_CTRL0 = - (base->DATA_PATH_CTRL0 & (~PXP_DATA_PATH_CTRL0_MUX3_SEL_MASK)) | PXP_DATA_PATH_CTRL0_MUX3_SEL(1); - } - else - { - base->DATA_PATH_CTRL0 = - (base->DATA_PATH_CTRL0 & (~PXP_DATA_PATH_CTRL0_MUX3_SEL_MASK)) | PXP_DATA_PATH_CTRL0_MUX3_SEL(0); - } - ctrl &= ~(PXP_CTRL_HFLIP1_MASK | PXP_CTRL_VFLIP1_MASK | PXP_CTRL_ROTATE1_MASK); - ctrl |= (PXP_CTRL_ROTATE1(degree) | ((uint32_t)flipMode << PXP_CTRL_HFLIP1_SHIFT)); - } - - base->CTRL = ctrl; -#endif -} -/* @} */ - -/*! - * @name Command queue - * @{ - */ - -/*! - * @brief Set the next command. - * - * The PXP supports a primitive ability to queue up one operation while the current - * operation is running. Workflow: - * - * 1. Prepare the PXP register values except STAT, CSCCOEFn, NEXT in the memory - * in the order they appear in the register map. - * 2. Call this function sets the new operation to PXP. - * 3. There are two methods to check whether the PXP has loaded the new operation. - * The first method is using @ref PXP_IsNextCommandPending. If there is new operation - * not loaded by the PXP, this function returns true. The second method is checking - * the flag @ref kPXP_CommandLoadFlag, if command loaded, this flag asserts. User - * could enable interrupt @ref kPXP_CommandLoadInterruptEnable to get the loaded - * signal in interrupt way. - * 4. When command loaded by PXP, a new command could be set using this function. - * - * @code - uint32_t pxp_command1[48]; - uint32_t pxp_command2[48]; - - pxp_command1[0] = ...; - pxp_command1[1] = ...; - ... - pxp_command2[0] = ...; - pxp_command2[1] = ...; - ... - - while (PXP_IsNextCommandPending(PXP)) - { - } - - PXP_SetNextCommand(PXP, pxp_command1); - - while (PXP_IsNextCommandPending(PXP)) - { - } - - PXP_SetNextCommand(PXP, pxp_command2); - @endcode - * - * @param base PXP peripheral base address. - * @param commandAddr Address of the new command. - */ -void PXP_SetNextCommand(PXP_Type *base, void *commandAddr); - -/*! - * @brief Check whether the next command is pending. - * - * @param base UART peripheral base address. - * @return True is pending, false is not. - */ -static inline bool PXP_IsNextCommandPending(PXP_Type *base) -{ - return (bool)(base->NEXT & PXP_NEXT_ENABLED_MASK); -} - -/*! - * @brief Cancel command set by @ref PXP_SetNextCommand - * - * @param base UART peripheral base address. - */ -static inline void PXP_CancelNextCommand(PXP_Type *base) -{ - /* Write PXP_NEXT_ENABLED_MASK to the register NEXT_CLR to canel the command. */ - *((volatile uint32_t *)(&(base->NEXT)) + 2U) = PXP_NEXT_ENABLED_MASK; -} - -/* @} */ - -/*! - * @name Color space conversion - * @{ - */ - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_CSC2) && FSL_FEATURE_PXP_HAS_NO_CSC2) -/*! - * @brief Set the CSC2 configuration. - * - * The CSC2 module receives pixels in any color space and can convert the pixels - * into any of RGB, YUV, or YCbCr color spaces. The output pixels are passed - * onto the LUT and rotation engine for further processing - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetCsc2Config(PXP_Type *base, const pxp_csc2_config_t *config); - -/*! - * @brief Enable or disable the CSC2. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableCsc2(PXP_Type *base, bool enable) -{ - if (enable) - { - base->CSC2_CTRL &= ~PXP_CSC2_CTRL_BYPASS_MASK; - } - else - { - base->CSC2_CTRL |= PXP_CSC2_CTRL_BYPASS_MASK; - } -} -#endif /* FSL_FEATURE_PXP_HAS_NO_CSC2 */ - -/*! - * @brief Set the CSC1 mode. - * - * The CSC1 module receives scaled YUV/YCbCr444 pixels from the scale engine and - * converts the pixels to the RGB888 color space. It could only be used by process - * surface. - * - * @param base PXP peripheral base address. - * @param mode The conversion mode. - */ -void PXP_SetCsc1Mode(PXP_Type *base, pxp_csc1_mode_t mode); - -/*! - * @brief Enable or disable the CSC1. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableCsc1(PXP_Type *base, bool enable) -{ - if (enable) - { - base->CSC1_COEF0 &= ~PXP_CSC1_COEF0_BYPASS_MASK; - } - else - { - base->CSC1_COEF0 |= PXP_CSC1_COEF0_BYPASS_MASK; - } -} -/* @} */ - -#if !(defined(FSL_FEATURE_PXP_HAS_NO_LUT) && FSL_FEATURE_PXP_HAS_NO_LUT) -/*! - * @name LUT operations - * @{ - */ - -/*! - * @brief Set the LUT configuration. - * - * The lookup table (LUT) is used to modify pixels in a manner that is not linear - * and that cannot be achieved by the color space conversion modules. To setup - * the LUT, the complete workflow is: - * 1. Use @ref PXP_SetLutConfig to set the configuration, such as the lookup mode. - * 2. Use @ref PXP_LoadLutTable to load the lookup table to PXP. - * 3. Use @ref PXP_EnableLut to enable the function. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetLutConfig(PXP_Type *base, const pxp_lut_config_t *config); - -/*! - * @brief Set the look up table to PXP. - * - * If lookup mode is DIRECT mode, this function loads @p bytesNum of values - * from the address @p memAddr into PXP LUT address @p lutStartAddr. So this - * function allows only update part of the PXP LUT. - * - * If lookup mode is CACHE mode, this function sets the new address to @p memAddr - * and invalid the PXP LUT cache. - * - * @param base PXP peripheral base address. - * @param lookupMode Which lookup mode is used. Note that this parameter is only - * used to distinguish DIRECT mode and CACHE mode, it does not change the register - * value PXP_LUT_CTRL[LOOKUP_MODE]. To change that value, use function @ref PXP_SetLutConfig. - * @param bytesNum How many bytes to set. This value must be divisable by 8. - * @param memAddr Address of look up table to set. - * @param lutStartAddr The LUT value will be loaded to LUT from index lutAddr. It should - * be 8 bytes aligned. - * - * @retval kStatus_Success Load successfully. - * @retval kStatus_InvalidArgument Failed because of invalid argument. - */ -status_t PXP_LoadLutTable( - PXP_Type *base, pxp_lut_lookup_mode_t lookupMode, uint32_t bytesNum, uint32_t memAddr, uint16_t lutStartAddr); - -/*! - * @brief Enable or disable the LUT. - * - * @param base PXP peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void PXP_EnableLut(PXP_Type *base, bool enable) -{ - if (enable) - { - base->LUT_CTRL &= ~PXP_LUT_CTRL_BYPASS_MASK; - } - else - { - base->LUT_CTRL |= PXP_LUT_CTRL_BYPASS_MASK; - } -} - -/*! - * @brief Select the 8kB LUT bank in DIRECT_RGB444 mode. - * - * @param base PXP peripheral base address. - * @param bank The bank to select. - */ -static inline void PXP_Select8kLutBank(PXP_Type *base, pxp_lut_8k_bank_t bank) -{ - base->LUT_CTRL = (base->LUT_CTRL & ~PXP_LUT_CTRL_SEL_8KB_MASK) | PXP_LUT_CTRL_SEL_8KB(bank); -} -/* @} */ -#endif /* FSL_FEATURE_PXP_HAS_NO_LUT */ - -#if (defined(FSL_FEATURE_PXP_HAS_DITHER) && FSL_FEATURE_PXP_HAS_DITHER) -/*! - * @name Dither - * @{ - */ - -/*! - * @brief Write data to the PXP internal memory. - * - * @param base PXP peripheral base address. - * @param ram Which internal memory to write. - * @param bytesNum How many bytes to write. - * @param data Pointer to the data to write. - * @param memStartAddr The start address in the internal memory to write the data. - */ -void PXP_SetInternalRamData(PXP_Type *base, pxp_ram_t ram, uint32_t bytesNum, uint8_t *data, uint16_t memStartAddr); - -/*! - * @brief Set the dither final LUT data. - * - * The dither final LUT is only applicble to dither engine 0. It takes the bits[7:4] - * of the output pixel and looks up and 8 bit value from the 16 value LUT to generate - * the final output pixel to the next process module. - * - * @param base PXP peripheral base address. - * @param data Pointer to the LUT data to set. - */ -void PXP_SetDitherFinalLutData(PXP_Type *base, const pxp_dither_final_lut_data_t *data); - -/*! - * @brief Set the configuration for the dither block. - * - * If the pre-dither LUT, post-dither LUT or ordered dither is used, please call - * @ref PXP_SetInternalRamData to set the LUT data to internal memory. - * - * If the final LUT is used, please call @ref PXP_SetDitherFinalLutData to set - * the LUT data. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - * - * @note When using ordered dithering, please set the PXP process block size same - * with the ordered dithering matrix size using function @ref PXP_SetProcessBlockSize. - */ -static inline void PXP_SetDitherConfig(PXP_Type *base, const pxp_dither_config_t *config) -{ - base->DITHER_CTRL = *((const uint32_t *)config) & 0x00FFFFFFU; -} - -/*! - * @brief Enable or disable dither engine in the PXP process path. - * - * After the initialize function @ref PXP_Init, the dither engine is disabled and not - * use in the PXP processing path. This function enables the dither engine and - * routes the dither engine output to the output buffer. When the dither engine - * is enabled using this function, @ref PXP_SetDitherConfig must be called to - * configure dither engine correctly, otherwise there is not output to the output - * buffer. - * - * @param base PXP peripheral base address. - * @param enable Pass in true to enable, false to disable. - */ -void PXP_EnableDither(PXP_Type *base, bool enable); - -/* @} */ - -#endif /* FSL_FEATURE_PXP_HAS_DITHER */ - -/*! - * @name Porter Duff - * @{ - */ - -/*! - * @brief Set the Porter Duff configuration. - * - * @param base PXP peripheral base address. - * @param config Pointer to the configuration. - */ -void PXP_SetPorterDuffConfig(PXP_Type *base, const pxp_porter_duff_config_t *config); - -/*! - * @brief Get the Porter Duff configuration by blend mode. - * - * The FactorMode are selected based on blend mode, the AlphaMode are set to - * @ref kPXP_PorterDuffAlphaStraight, the ColorMode are set to - * @ref kPXP_PorterDuffColorWithAlpha, the GlobalAlphaMode are set to - * @ref kPXP_PorterDuffLocalAlpha. These values could be modified after calling - * this function. - * - * @param mode The blend mode. - * @param config Pointer to the configuration. - * @retval kStatus_Success Successfully get the configuratoin. - * @retval kStatus_InvalidArgument The blend mode not supported. - */ -status_t PXP_GetPorterDuffConfig(pxp_porter_duff_blend_mode_t mode, pxp_porter_duff_config_t *config); - -/* @} */ - -/*! - * @name Buffer copy - * @{ - */ - -/*! - * @brief Copy picture from one buffer to another buffer. - * - * This function copies a rectangle from one buffer to another buffer. - * - * @verbatim - Source buffer: - srcPicBaseAddr - +-----------------------------------------------------------+ - | | - | (srcOffsetX, srcOffsetY) | - | +-------------------+ | - | | | | - | | | | - | | | height | - | | | | - | | | | - | +-------------------+ | - | width | - | | - | srcPicthBytes | - +-----------------------------------------------------------+ - - Destination buffer: - destPicBaseAddr - +-------------------------------------------+ - | | - | | - | | - | (destOffsetX, destOffsetY) | - | +-------------------+ | - | | | | - | | | | - | | | height | - | | | | - | | | | - | +-------------------+ | - | width | - | | - | | - | | - | destPicthBytes | - +-------------------------------------------+ - @endverbatim - * - * @note This function resets the old PXP settings, which means the settings - * like rotate, flip, will be reseted to disabled status. - * - * @param base PXP peripheral base address. - * @param config Pointer to the picture copy configuration structure. - * @retval kStatus_Success Successfully started the copy process. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t PXP_StartPictureCopy(PXP_Type *base, const pxp_pic_copy_config_t *config); - -/*! - * @brief Copy continous memory. - * - * @note The copy size should be 512 byte aligned. - * @note This function resets the old PXP settings, which means the settings - * like rotate, flip, will be reseted to disabled status. - * - * @param base PXP peripheral base address. - * @param srcAddr Source memory address. - * @param destAddr Destination memory address. - * @param size How many bytes to copy, should be 512 byte aligned. - * @retval kStatus_Success Successfully started the copy process. - * @retval kStatus_InvalidArgument Invalid argument. - */ -status_t PXP_StartMemCopy(PXP_Type *base, uint32_t srcAddr, uint32_t destAddr, uint32_t size); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_PXP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_qtmr.c b/devices/MIMXRT1052/drivers/fsl_qtmr.c deleted file mode 100644 index 44b7867..0000000 --- a/devices/MIMXRT1052/drivers/fsl_qtmr.c +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_qtmr.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.qtmr" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Gets the instance from the base address to be used to gate or ungate the module clock - * - * @param base Quad Timer peripheral base address - * - * @return The Quad Timer instance - */ -static uint32_t QTMR_GetInstance(TMR_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to Quad Timer bases for each instance. */ -static TMR_Type *const s_qtmrBases[] = TMR_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to Quad Timer clocks for each instance. */ -static const clock_ip_name_t s_qtmrClocks[] = TMR_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t QTMR_GetInstance(TMR_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_qtmrBases); instance++) - { - if (s_qtmrBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_qtmrBases)); - - return instance; -} - -/*! - * brief Ungates the Quad Timer clock and configures the peripheral for basic operation. - * - * note This API should be called at the beginning of the application using the Quad Timer driver. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param config Pointer to user's Quad Timer config structure - */ -void QTMR_Init(TMR_Type *base, qtmr_channel_selection_t channel, const qtmr_config_t *config) -{ - assert(NULL != config); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the module clock */ - CLOCK_EnableClock(s_qtmrClocks[QTMR_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Setup the counter sources */ - base->CHANNEL[channel].CTRL = (TMR_CTRL_PCS(config->primarySource) | TMR_CTRL_SCS(config->secondarySource)); - - /* Setup the master mode operation */ - base->CHANNEL[channel].SCTRL = - (TMR_SCTRL_EEOF(config->enableExternalForce) | TMR_SCTRL_MSTR(config->enableMasterMode)); - - /* Setup debug mode */ - base->CHANNEL[channel].CSCTRL = TMR_CSCTRL_DBG_EN(config->debugMode); - - base->CHANNEL[channel].FILT &= (uint16_t)(~(TMR_FILT_FILT_CNT_MASK | TMR_FILT_FILT_PER_MASK)); - /* Setup input filter */ - base->CHANNEL[channel].FILT = - (TMR_FILT_FILT_CNT(config->faultFilterCount) | TMR_FILT_FILT_PER(config->faultFilterPeriod)); -} - -/*! - * brief Stops the counter and gates the Quad Timer clock - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - */ -void QTMR_Deinit(TMR_Type *base, qtmr_channel_selection_t channel) -{ - /* Stop the counter */ - base->CHANNEL[channel].CTRL &= (uint16_t)(~TMR_CTRL_CM_MASK); - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the module clock */ - CLOCK_DisableClock(s_qtmrClocks[QTMR_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Fill in the Quad Timer config struct with the default settings - * - * The default values are: - * code - * config->debugMode = kQTMR_RunNormalInDebug; - * config->enableExternalForce = false; - * config->enableMasterMode = false; - * config->faultFilterCount = 0; - * config->faultFilterPeriod = 0; - * config->primarySource = kQTMR_ClockDivide_2; - * config->secondarySource = kQTMR_Counter0InputPin; - * endcode - * param config Pointer to user's Quad Timer config structure. - */ -void QTMR_GetDefaultConfig(qtmr_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - /* Halt counter during debug mode */ - config->debugMode = kQTMR_RunNormalInDebug; - /* Another counter cannot force state of OFLAG signal */ - config->enableExternalForce = false; - /* Compare function's output from this counter is not broadcast to other counters */ - config->enableMasterMode = false; - /* Fault filter count is set to 0 */ - config->faultFilterCount = 0; - /* Fault filter period is set to 0 which disables the fault filter */ - config->faultFilterPeriod = 0; - /* Primary count source is IP bus clock divide by 2 */ - config->primarySource = kQTMR_ClockDivide_2; - /* Secondary count source is counter 0 input pin */ - config->secondarySource = kQTMR_Counter0InputPin; -} - -/*! - * brief Sets up Quad timer module for PWM signal output. - * - * The function initializes the timer module according to the parameters passed in by the user. The - * function also sets up the value compare registers to match the PWM signal requirements. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param pwmFreqHz PWM signal frequency in Hz - * param dutyCyclePercent PWM pulse width, value should be between 0 to 100 - * 0=inactive signal(0% duty cycle)... - * 100=active signal (100% duty cycle) - * param outputPolarity true: invert polarity of the output signal, false: no inversion - * param srcClock_Hz Main counter clock in Hz. - * - * return Returns an error if there was error setting up the signal. - */ -status_t QTMR_SetupPwm(TMR_Type *base, - qtmr_channel_selection_t channel, - uint32_t pwmFreqHz, - uint8_t dutyCyclePercent, - bool outputPolarity, - uint32_t srcClock_Hz) -{ - uint32_t periodCount, highCount, lowCount; - uint16_t reg; - status_t status; - - if (dutyCyclePercent <= 100U) - { - /* Set OFLAG pin for output mode and force out a low on the pin */ - base->CHANNEL[channel].SCTRL |= (TMR_SCTRL_FORCE_MASK | TMR_SCTRL_OEN_MASK); - - /* Counter values to generate a PWM signal */ - periodCount = srcClock_Hz / pwmFreqHz; - highCount = periodCount * dutyCyclePercent / 100U; - lowCount = periodCount - highCount; - - if (highCount > 0U) - { - highCount -= 1U; - } - if (lowCount > 0U) - { - lowCount -= 1U; - } - - /* This should not be a 16-bit overflow value. If it is, change to a larger divider for clock source. */ - assert(highCount <= 0xFFFFU); - assert(lowCount <= 0xFFFFU); - - /* Setup the compare registers for PWM output */ - base->CHANNEL[channel].COMP1 = (uint16_t)lowCount; - base->CHANNEL[channel].COMP2 = (uint16_t)highCount; - - /* Setup the pre-load registers for PWM output */ - base->CHANNEL[channel].CMPLD1 = (uint16_t)lowCount; - base->CHANNEL[channel].CMPLD2 = (uint16_t)highCount; - - reg = base->CHANNEL[channel].CSCTRL; - /* Setup the compare load control for COMP1 and COMP2. - * Load COMP1 when CSCTRL[TCF2] is asserted, load COMP2 when CSCTRL[TCF1] is asserted - */ - reg &= (uint16_t)(~(TMR_CSCTRL_CL1_MASK | TMR_CSCTRL_CL2_MASK)); - reg |= (TMR_CSCTRL_CL1(kQTMR_LoadOnComp2) | TMR_CSCTRL_CL2(kQTMR_LoadOnComp1)); - base->CHANNEL[channel].CSCTRL = reg; - - if (outputPolarity) - { - /* Invert the polarity */ - base->CHANNEL[channel].SCTRL |= TMR_SCTRL_OPS_MASK; - } - else - { - /* True polarity, no inversion */ - base->CHANNEL[channel].SCTRL &= ~(uint16_t)TMR_SCTRL_OPS_MASK; - } - - reg = base->CHANNEL[channel].CTRL; - reg &= ~(uint16_t)TMR_CTRL_OUTMODE_MASK; - /* Count until compare value is reached and re-initialize the counter, toggle OFLAG output - * using alternating compare register - */ - reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_ToggleOnAltCompareReg)); - base->CHANNEL[channel].CTRL = reg; - - status = kStatus_Success; - } - else - { - /* Invalid dutycycle */ - status = kStatus_Fail; - } - - return status; -} - -/*! - * brief Allows the user to count the source clock cycles until a capture event arrives. - * - * The count is stored in the capture register. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param capturePin Pin through which we receive the input signal to trigger the capture - * param inputPolarity true: invert polarity of the input signal, false: no inversion - * param reloadOnCapture true: reload the counter when an input capture occurs, false: no reload - * param captureMode Specifies which edge of the input signal triggers a capture - */ -void QTMR_SetupInputCapture(TMR_Type *base, - qtmr_channel_selection_t channel, - qtmr_input_source_t capturePin, - bool inputPolarity, - bool reloadOnCapture, - qtmr_input_capture_edge_t captureMode) -{ - uint16_t reg; - - /* Clear the prior value for the input source for capture */ - reg = base->CHANNEL[channel].CTRL & (uint16_t)(~TMR_CTRL_SCS_MASK); - - /* Set the new input source */ - reg |= TMR_CTRL_SCS(capturePin); - base->CHANNEL[channel].CTRL = reg; - - /* Clear the prior values for input polarity, capture mode. Set the external pin as input */ - reg = base->CHANNEL[channel].SCTRL & - (uint16_t)(~(TMR_SCTRL_IPS_MASK | TMR_SCTRL_CAPTURE_MODE_MASK | TMR_SCTRL_OEN_MASK)); - /* Set the new values */ - reg |= (TMR_SCTRL_IPS(inputPolarity) | TMR_SCTRL_CAPTURE_MODE(captureMode)); - base->CHANNEL[channel].SCTRL = reg; - - /* Setup if counter should reload when a capture occurs */ - if (reloadOnCapture) - { - base->CHANNEL[channel].CSCTRL |= TMR_CSCTRL_ROC_MASK; - } - else - { - base->CHANNEL[channel].CSCTRL &= (uint16_t)(~TMR_CSCTRL_ROC_MASK); - } -} - -/*! - * brief Enables the selected Quad Timer interrupts - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -void QTMR_EnableInterrupts(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask) -{ - uint16_t reg; - - reg = base->CHANNEL[channel].SCTRL; - /* Compare interrupt */ - if ((mask & (uint16_t)kQTMR_CompareInterruptEnable) != 0UL) - { - reg |= TMR_SCTRL_TCFIE_MASK; - } - /* Overflow interrupt */ - if ((mask & (uint16_t)kQTMR_OverflowInterruptEnable) != 0UL) - { - reg |= TMR_SCTRL_TOFIE_MASK; - } - /* Input edge interrupt */ - if ((mask & (uint16_t)kQTMR_EdgeInterruptEnable) != 0UL) - { - /* Restriction: Do not set both SCTRL[IEFIE] and DMA[IEFDE] */ - base->CHANNEL[channel].DMA &= ~(uint16_t)TMR_DMA_IEFDE_MASK; - reg |= TMR_SCTRL_IEFIE_MASK; - } - base->CHANNEL[channel].SCTRL = reg; - - reg = base->CHANNEL[channel].CSCTRL; - /* Compare 1 interrupt */ - if ((mask & (uint16_t)kQTMR_Compare1InterruptEnable) != 0UL) - { - reg |= TMR_CSCTRL_TCF1EN_MASK; - } - /* Compare 2 interrupt */ - if ((mask & (uint16_t)kQTMR_Compare2InterruptEnable) != 0UL) - { - reg |= TMR_CSCTRL_TCF2EN_MASK; - } - base->CHANNEL[channel].CSCTRL = reg; -} - -/*! - * brief Disables the selected Quad Timer interrupts - * - * param base Quad Timer peripheral base addres - * param channel Quad Timer channel number - * param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -void QTMR_DisableInterrupts(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask) -{ - uint16_t reg; - - reg = base->CHANNEL[channel].SCTRL; - /* Compare interrupt */ - if ((mask & (uint16_t)kQTMR_CompareInterruptEnable) != 0UL) - { - reg &= (uint16_t)(~TMR_SCTRL_TCFIE_MASK); - } - /* Overflow interrupt */ - if ((mask & (uint16_t)kQTMR_OverflowInterruptEnable) != 0UL) - { - reg &= (uint16_t)(~TMR_SCTRL_TOFIE_MASK); - } - /* Input edge interrupt */ - if ((mask & (uint16_t)kQTMR_EdgeInterruptEnable) != 0UL) - { - reg &= (uint16_t)(~TMR_SCTRL_IEFIE_MASK); - } - base->CHANNEL[channel].SCTRL = reg; - - reg = base->CHANNEL[channel].CSCTRL; - /* Compare 1 interrupt */ - if ((mask & (uint16_t)kQTMR_Compare1InterruptEnable) != 0UL) - { - reg &= ~(uint16_t)TMR_CSCTRL_TCF1EN_MASK; - } - /* Compare 2 interrupt */ - if ((mask & (uint16_t)kQTMR_Compare2InterruptEnable) != 0UL) - { - reg &= ~(uint16_t)TMR_CSCTRL_TCF2EN_MASK; - } - base->CHANNEL[channel].CSCTRL = reg; -} - -/*! - * brief Gets the enabled Quad Timer interrupts - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * - * return The enabled interrupts. This is the logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -uint32_t QTMR_GetEnabledInterrupts(TMR_Type *base, qtmr_channel_selection_t channel) -{ - uint32_t enabledInterrupts = 0; - uint16_t reg; - - reg = base->CHANNEL[channel].SCTRL; - /* Compare interrupt */ - if ((reg & TMR_SCTRL_TCFIE_MASK) != 0U) - { - enabledInterrupts |= (uint32_t)kQTMR_CompareFlag; - } - /* Overflow interrupt */ - if ((reg & TMR_SCTRL_TOFIE_MASK) != 0U) - { - enabledInterrupts |= (uint32_t)kQTMR_OverflowInterruptEnable; - } - /* Input edge interrupt */ - if ((reg & TMR_SCTRL_IEFIE_MASK) != 0U) - { - enabledInterrupts |= (uint32_t)kQTMR_EdgeInterruptEnable; - } - - reg = base->CHANNEL[channel].CSCTRL; - /* Compare 1 interrupt */ - if ((reg & TMR_CSCTRL_TCF1EN_MASK) != 0U) - { - enabledInterrupts |= (uint32_t)kQTMR_Compare1InterruptEnable; - } - /* Compare 2 interrupt */ - if ((reg & TMR_CSCTRL_TCF2EN_MASK) != 0U) - { - enabledInterrupts |= (uint32_t)kQTMR_Compare2InterruptEnable; - } - - return enabledInterrupts; -} - -/*! - * brief Gets the Quad Timer status flags - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * - * return The status flags. This is the logical OR of members of the - * enumeration ::qtmr_status_flags_t - */ -uint32_t QTMR_GetStatus(TMR_Type *base, qtmr_channel_selection_t channel) -{ - uint32_t statusFlags = 0; - uint16_t reg; - - reg = base->CHANNEL[channel].SCTRL; - /* Timer compare flag */ - if ((reg & TMR_SCTRL_TCF_MASK) != 0U) - { - statusFlags |= (uint32_t)kQTMR_CompareFlag; - } - /* Timer overflow flag */ - if ((reg & TMR_SCTRL_TOF_MASK) != 0U) - { - statusFlags |= (uint32_t)kQTMR_OverflowFlag; - } - /* Input edge flag */ - if ((reg & TMR_SCTRL_IEF_MASK) != 0U) - { - statusFlags |= (uint32_t)kQTMR_EdgeFlag; - } - - reg = base->CHANNEL[channel].CSCTRL; - /* Compare 1 flag */ - if ((reg & TMR_CSCTRL_TCF1_MASK) != 0U) - { - statusFlags |= (uint32_t)kQTMR_Compare1Flag; - } - /* Compare 2 flag */ - if ((reg & TMR_CSCTRL_TCF2_MASK) != 0U) - { - statusFlags |= (uint32_t)kQTMR_Compare2Flag; - } - - return statusFlags; -} - -/*! - * brief Clears the Quad Timer status flags. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::qtmr_status_flags_t - */ -void QTMR_ClearStatusFlags(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask) -{ - uint16_t reg; - - reg = base->CHANNEL[channel].SCTRL; - /* Timer compare flag */ - if ((mask & (uint32_t)kQTMR_CompareFlag) != 0U) - { - reg &= (uint16_t)(~TMR_SCTRL_TCF_MASK); - } - /* Timer overflow flag */ - if ((mask & (uint32_t)kQTMR_OverflowFlag) != 0U) - { - reg &= (uint16_t)(~TMR_SCTRL_TOF_MASK); - } - /* Input edge flag */ - if ((mask & (uint32_t)kQTMR_EdgeFlag) != 0U) - { - reg &= (uint16_t)(~TMR_SCTRL_IEF_MASK); - } - base->CHANNEL[channel].SCTRL = reg; - - reg = base->CHANNEL[channel].CSCTRL; - /* Compare 1 flag */ - if ((mask & (uint32_t)kQTMR_Compare1Flag) != 0U) - { - reg &= ~(uint16_t)TMR_CSCTRL_TCF1_MASK; - } - /* Compare 2 flag */ - if ((mask & (uint32_t)kQTMR_Compare2Flag) != 0U) - { - reg &= ~(uint16_t)TMR_CSCTRL_TCF2_MASK; - } - base->CHANNEL[channel].CSCTRL = reg; -} - -/*! - * brief Sets the timer period in ticks. - * - * Timers counts from initial value till it equals the count value set here. The counter - * will then reinitialize to the value specified in the Load register. - * - * note - * 1. This function will write the time period in ticks to COMP1 or COMP2 register - * depending on the count direction - * 2. User can call the utility macros provided in fsl_common.h to convert to ticks - * 3. This function supports cases, providing only primary source clock without secondary source clock. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param ticks Timer period in units of ticks - */ -void QTMR_SetTimerPeriod(TMR_Type *base, qtmr_channel_selection_t channel, uint16_t ticks) -{ - /* Set the length bit to reinitialize the counters on a match */ - base->CHANNEL[channel].CTRL |= TMR_CTRL_LENGTH_MASK; - - if ((base->CHANNEL[channel].CTRL & TMR_CTRL_DIR_MASK) != 0U) - { - /* Counting down */ - base->CHANNEL[channel].COMP2 = ticks; - } - else - { - /* Counting up */ - base->CHANNEL[channel].COMP1 = ticks; - } -} - -/*! - * brief Enable the Quad Timer DMA. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param mask The DMA to enable. This is a logical OR of members of the - * enumeration ::qtmr_dma_enable_t - */ -void QTMR_EnableDma(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask) -{ - uint16_t reg; - - reg = base->CHANNEL[channel].DMA; - /* Input Edge Flag DMA Enable */ - if ((mask & (uint32_t)kQTMR_InputEdgeFlagDmaEnable) != 0U) - { - /* Restriction: Do not set both DMA[IEFDE] and SCTRL[IEFIE] */ - base->CHANNEL[channel].SCTRL &= (uint16_t)(~TMR_SCTRL_IEFIE_MASK); - reg |= TMR_DMA_IEFDE_MASK; - } - /* Comparator Preload Register 1 DMA Enable */ - if ((mask & (uint32_t)kQTMR_ComparatorPreload1DmaEnable) != 0U) - { - reg |= TMR_DMA_CMPLD1DE_MASK; - } - /* Comparator Preload Register 2 DMA Enable */ - if ((mask & (uint32_t)kQTMR_ComparatorPreload2DmaEnable) != 0U) - { - reg |= TMR_DMA_CMPLD2DE_MASK; - } - base->CHANNEL[channel].DMA = reg; -} - -/*! - * brief Disable the Quad Timer DMA. - * - * param base Quad Timer peripheral base address - * param channel Quad Timer channel number - * param mask The DMA to enable. This is a logical OR of members of the - * enumeration ::qtmr_dma_enable_t - */ -void QTMR_DisableDma(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask) -{ - uint16_t reg; - - reg = base->CHANNEL[channel].DMA; - /* Input Edge Flag DMA Enable */ - if ((mask & (uint32_t)kQTMR_InputEdgeFlagDmaEnable) != 0U) - { - reg &= ~(uint16_t)TMR_DMA_IEFDE_MASK; - } - /* Comparator Preload Register 1 DMA Enable */ - if ((mask & (uint32_t)kQTMR_ComparatorPreload1DmaEnable) != 0U) - { - reg &= ~(uint16_t)TMR_DMA_CMPLD1DE_MASK; - } - /* Comparator Preload Register 2 DMA Enable */ - if ((mask & (uint32_t)kQTMR_ComparatorPreload2DmaEnable) != 0U) - { - reg &= ~(uint16_t)TMR_DMA_CMPLD2DE_MASK; - } - base->CHANNEL[channel].DMA = reg; -} diff --git a/devices/MIMXRT1052/drivers/fsl_qtmr.h b/devices/MIMXRT1052/drivers/fsl_qtmr.h deleted file mode 100644 index 589b9c3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_qtmr.h +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_QTMR_H_ -#define _FSL_QTMR_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup qtmr - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_QTMR_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) /*!< Version */ -/*@}*/ - -/*! @brief Quad Timer primary clock source selection*/ -typedef enum _qtmr_primary_count_source -{ - kQTMR_ClockCounter0InputPin = 0, /*!< Use counter 0 input pin */ - kQTMR_ClockCounter1InputPin, /*!< Use counter 1 input pin */ - kQTMR_ClockCounter2InputPin, /*!< Use counter 2 input pin */ - kQTMR_ClockCounter3InputPin, /*!< Use counter 3 input pin */ - kQTMR_ClockCounter0Output, /*!< Use counter 0 output */ - kQTMR_ClockCounter1Output, /*!< Use counter 1 output */ - kQTMR_ClockCounter2Output, /*!< Use counter 2 output */ - kQTMR_ClockCounter3Output, /*!< Use counter 3 output */ - kQTMR_ClockDivide_1, /*!< IP bus clock divide by 1 prescaler */ - kQTMR_ClockDivide_2, /*!< IP bus clock divide by 2 prescaler */ - kQTMR_ClockDivide_4, /*!< IP bus clock divide by 4 prescaler */ - kQTMR_ClockDivide_8, /*!< IP bus clock divide by 8 prescaler */ - kQTMR_ClockDivide_16, /*!< IP bus clock divide by 16 prescaler */ - kQTMR_ClockDivide_32, /*!< IP bus clock divide by 32 prescaler */ - kQTMR_ClockDivide_64, /*!< IP bus clock divide by 64 prescaler */ - kQTMR_ClockDivide_128 /*!< IP bus clock divide by 128 prescaler */ -} qtmr_primary_count_source_t; - -/*! @brief Quad Timer input sources selection*/ -typedef enum _qtmr_input_source -{ - kQTMR_Counter0InputPin = 0, /*!< Use counter 0 input pin */ - kQTMR_Counter1InputPin, /*!< Use counter 1 input pin */ - kQTMR_Counter2InputPin, /*!< Use counter 2 input pin */ - kQTMR_Counter3InputPin /*!< Use counter 3 input pin */ -} qtmr_input_source_t; - -/*! @brief Quad Timer counting mode selection */ -typedef enum _qtmr_counting_mode -{ - kQTMR_NoOperation = 0, /*!< No operation */ - kQTMR_PriSrcRiseEdge, /*!< Count rising edges or primary source */ - kQTMR_PriSrcRiseAndFallEdge, /*!< Count rising and falling edges of primary source */ - kQTMR_PriSrcRiseEdgeSecInpHigh, /*!< Count rise edges of pri SRC while sec inp high active */ - kQTMR_QuadCountMode, /*!< Quadrature count mode, uses pri and sec sources */ - kQTMR_PriSrcRiseEdgeSecDir, /*!< Count rising edges of pri SRC; sec SRC specifies dir */ - kQTMR_SecSrcTrigPriCnt, /*!< Edge of sec SRC trigger primary count until compare*/ - kQTMR_CascadeCount /*!< Cascaded count mode (up/down) */ -} qtmr_counting_mode_t; - -/*! @brief Quad Timer output mode selection*/ -typedef enum _qtmr_output_mode -{ - kQTMR_AssertWhenCountActive = 0, /*!< Assert OFLAG while counter is active*/ - kQTMR_ClearOnCompare, /*!< Clear OFLAG on successful compare */ - kQTMR_SetOnCompare, /*!< Set OFLAG on successful compare */ - kQTMR_ToggleOnCompare, /*!< Toggle OFLAG on successful compare */ - kQTMR_ToggleOnAltCompareReg, /*!< Toggle OFLAG using alternating compare registers */ - kQTMR_SetOnCompareClearOnSecSrcInp, /*!< Set OFLAG on compare, clear on sec SRC input edge */ - kQTMR_SetOnCompareClearOnCountRoll, /*!< Set OFLAG on compare, clear on counter rollover */ - kQTMR_EnableGateClock /*!< Enable gated clock output while count is active */ -} qtmr_output_mode_t; - -/*! @brief Quad Timer input capture edge mode, rising edge, or falling edge */ -typedef enum _qtmr_input_capture_edge -{ - kQTMR_NoCapture = 0, /*!< Capture is disabled */ - kQTMR_RisingEdge, /*!< Capture on rising edge (IPS=0) or falling edge (IPS=1)*/ - kQTMR_FallingEdge, /*!< Capture on falling edge (IPS=0) or rising edge (IPS=1)*/ - kQTMR_RisingAndFallingEdge /*!< Capture on both edges */ -} qtmr_input_capture_edge_t; - -/*! @brief Quad Timer input capture edge mode, rising edge, or falling edge */ -typedef enum _qtmr_preload_control -{ - kQTMR_NoPreload = 0, /*!< Never preload */ - kQTMR_LoadOnComp1, /*!< Load upon successful compare with value in COMP1 */ - kQTMR_LoadOnComp2 /*!< Load upon successful compare with value in COMP2*/ -} qtmr_preload_control_t; - -/*! @brief List of Quad Timer run options when in Debug mode */ -typedef enum _qtmr_debug_action -{ - kQTMR_RunNormalInDebug = 0U, /*!< Continue with normal operation */ - kQTMR_HaltCounter, /*!< Halt counter */ - kQTMR_ForceOutToZero, /*!< Force output to logic 0 */ - kQTMR_HaltCountForceOutZero /*!< Halt counter and force output to logic 0 */ -} qtmr_debug_action_t; - -/*! @brief List of Quad Timer interrupts */ -// typedef enum _qtmr_interrupt_enable -typedef enum _qtmr_interrupt_enable -{ - kQTMR_CompareInterruptEnable = (1U << 0), /*!< Compare interrupt.*/ - kQTMR_Compare1InterruptEnable = (1U << 1), /*!< Compare 1 interrupt.*/ - kQTMR_Compare2InterruptEnable = (1U << 2), /*!< Compare 2 interrupt.*/ - kQTMR_OverflowInterruptEnable = (1U << 3), /*!< Timer overflow interrupt.*/ - kQTMR_EdgeInterruptEnable = (1U << 4) /*!< Input edge interrupt.*/ -} qtmr_interrupt_enable_t; - -/*! @brief List of Quad Timer flags */ -typedef enum _qtmr_status_flags -{ - kQTMR_CompareFlag = (1U << 0), /*!< Compare flag */ - kQTMR_Compare1Flag = (1U << 1), /*!< Compare 1 flag */ - kQTMR_Compare2Flag = (1U << 2), /*!< Compare 2 flag */ - kQTMR_OverflowFlag = (1U << 3), /*!< Timer overflow flag */ - kQTMR_EdgeFlag = (1U << 4) /*!< Input edge flag */ -} qtmr_status_flags_t; - -/*! @brief List of channel selection */ -typedef enum _qtmr_channel_selection -{ - kQTMR_Channel_0 = 0U, /*!< TMR Channel 0 */ - kQTMR_Channel_1, /*!< TMR Channel 1 */ - kQTMR_Channel_2, /*!< TMR Channel 2 */ - kQTMR_Channel_3, /*!< TMR Channel 3 */ -} qtmr_channel_selection_t; - -/*! @brief List of Quad Timer DMA enable */ -typedef enum _qtmr_dma_enable -{ - kQTMR_InputEdgeFlagDmaEnable = (1U << 0), /*!< Input Edge Flag DMA Enable.*/ - kQTMR_ComparatorPreload1DmaEnable = (1U << 1), /*!< Comparator Preload Register 1 DMA Enable.*/ - kQTMR_ComparatorPreload2DmaEnable = (1U << 2), /*!< Comparator Preload Register 2 DMA Enable.*/ -} qtmr_dma_enable_t; - -/*! - * @brief Quad Timer config structure - * - * This structure holds the configuration settings for the Quad Timer peripheral. To initialize this - * structure to reasonable defaults, call the QTMR_GetDefaultConfig() function and pass a - * pointer to your config structure instance. - * - * The config struct can be made const so it resides in flash - */ -typedef struct _qtmr_config -{ - qtmr_primary_count_source_t primarySource; /*!< Specify the primary count source */ - qtmr_input_source_t secondarySource; /*!< Specify the secondary count source */ - bool enableMasterMode; /*!< true: Broadcast compare function output to other counters; - false no broadcast */ - bool enableExternalForce; /*!< true: Compare from another counter force state of OFLAG signal - false: OFLAG controlled by local counter */ - uint8_t faultFilterCount; /*!< Fault filter count */ - uint8_t faultFilterPeriod; /*!< Fault filter period;value of 0 will bypass the filter */ - qtmr_debug_action_t debugMode; /*!< Operation in Debug mode */ -} qtmr_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Ungates the Quad Timer clock and configures the peripheral for basic operation. - * - * @note This API should be called at the beginning of the application using the Quad Timer driver. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param config Pointer to user's Quad Timer config structure - */ -void QTMR_Init(TMR_Type *base, qtmr_channel_selection_t channel, const qtmr_config_t *config); - -/*! - * @brief Stops the counter and gates the Quad Timer clock - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - */ -void QTMR_Deinit(TMR_Type *base, qtmr_channel_selection_t channel); - -/*! - * @brief Fill in the Quad Timer config struct with the default settings - * - * The default values are: - * @code - * config->debugMode = kQTMR_RunNormalInDebug; - * config->enableExternalForce = false; - * config->enableMasterMode = false; - * config->faultFilterCount = 0; - * config->faultFilterPeriod = 0; - * config->primarySource = kQTMR_ClockDivide_2; - * config->secondarySource = kQTMR_Counter0InputPin; - * @endcode - * @param config Pointer to user's Quad Timer config structure. - */ -void QTMR_GetDefaultConfig(qtmr_config_t *config); - -/*! @}*/ - -/*! - * @brief Sets up Quad timer module for PWM signal output. - * - * The function initializes the timer module according to the parameters passed in by the user. The - * function also sets up the value compare registers to match the PWM signal requirements. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param pwmFreqHz PWM signal frequency in Hz - * @param dutyCyclePercent PWM pulse width, value should be between 0 to 100 - * 0=inactive signal(0% duty cycle)... - * 100=active signal (100% duty cycle) - * @param outputPolarity true: invert polarity of the output signal, false: no inversion - * @param srcClock_Hz Main counter clock in Hz. - * - * @return Returns an error if there was error setting up the signal. - */ -status_t QTMR_SetupPwm(TMR_Type *base, - qtmr_channel_selection_t channel, - uint32_t pwmFreqHz, - uint8_t dutyCyclePercent, - bool outputPolarity, - uint32_t srcClock_Hz); - -/*! - * @brief Allows the user to count the source clock cycles until a capture event arrives. - * - * The count is stored in the capture register. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param capturePin Pin through which we receive the input signal to trigger the capture - * @param inputPolarity true: invert polarity of the input signal, false: no inversion - * @param reloadOnCapture true: reload the counter when an input capture occurs, false: no reload - * @param captureMode Specifies which edge of the input signal triggers a capture - */ -void QTMR_SetupInputCapture(TMR_Type *base, - qtmr_channel_selection_t channel, - qtmr_input_source_t capturePin, - bool inputPolarity, - bool reloadOnCapture, - qtmr_input_capture_edge_t captureMode); - -/*! - * @name Interrupt Interface - * @{ - */ - -/*! - * @brief Enables the selected Quad Timer interrupts - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -void QTMR_EnableInterrupts(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask); - -/*! - * @brief Disables the selected Quad Timer interrupts - * - * @param base Quad Timer peripheral base addres - * @param channel Quad Timer channel number - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -void QTMR_DisableInterrupts(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask); - -/*! - * @brief Gets the enabled Quad Timer interrupts - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration ::qtmr_interrupt_enable_t - */ -uint32_t QTMR_GetEnabledInterrupts(TMR_Type *base, qtmr_channel_selection_t channel); - -/*! @}*/ - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Gets the Quad Timer status flags - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * - * @return The status flags. This is the logical OR of members of the - * enumeration ::qtmr_status_flags_t - */ -uint32_t QTMR_GetStatus(TMR_Type *base, qtmr_channel_selection_t channel); - -/*! - * @brief Clears the Quad Timer status flags. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration ::qtmr_status_flags_t - */ -void QTMR_ClearStatusFlags(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask); - -/*! @}*/ - -/*! - * @name Read and Write the timer period - * @{ - */ - -/*! - * @brief Sets the timer period in ticks. - * - * Timers counts from initial value till it equals the count value set here. The counter - * will then reinitialize to the value specified in the Load register. - * - * @note - * 1. This function will write the time period in ticks to COMP1 or COMP2 register - * depending on the count direction - * 2. User can call the utility macros provided in fsl_common.h to convert to ticks - * 3. This function supports cases, providing only primary source clock without secondary source clock. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param ticks Timer period in units of ticks - */ -void QTMR_SetTimerPeriod(TMR_Type *base, qtmr_channel_selection_t channel, uint16_t ticks); - -/*! - * @brief Reads the current timer counting value. - * - * 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 - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * - * @return Current counter value in ticks - */ -static inline uint16_t QTMR_GetCurrentTimerCount(TMR_Type *base, qtmr_channel_selection_t channel) -{ - return base->CHANNEL[channel].CNTR; -} - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ - -/*! - * @brief Starts the Quad Timer counter. - * - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param clockSource Quad Timer clock source - */ -static inline void QTMR_StartTimer(TMR_Type *base, qtmr_channel_selection_t channel, qtmr_counting_mode_t clockSource) -{ - uint16_t reg = base->CHANNEL[channel].CTRL; - - reg &= (uint16_t)(~(TMR_CTRL_CM_MASK)); - reg |= TMR_CTRL_CM(clockSource); - base->CHANNEL[channel].CTRL = reg; -} - -/*! - * @brief Stops the Quad Timer counter. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - */ -static inline void QTMR_StopTimer(TMR_Type *base, qtmr_channel_selection_t channel) -{ - base->CHANNEL[channel].CTRL &= (uint16_t)(~TMR_CTRL_CM_MASK); -} - -/*! @}*/ - -/*! - * @name Enable and Disable the Quad Timer DMA - * @{ - */ - -/*! - * @brief Enable the Quad Timer DMA. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param mask The DMA to enable. This is a logical OR of members of the - * enumeration ::qtmr_dma_enable_t - */ -void QTMR_EnableDma(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask); - -/*! - * @brief Disable the Quad Timer DMA. - * - * @param base Quad Timer peripheral base address - * @param channel Quad Timer channel number - * @param mask The DMA to enable. This is a logical OR of members of the - * enumeration ::qtmr_dma_enable_t - */ -void QTMR_DisableDma(TMR_Type *base, qtmr_channel_selection_t channel, uint32_t mask); - -/*! @}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_QTMR_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_romapi.c b/devices/MIMXRT1052/drivers/fsl_romapi.c deleted file mode 100644 index b18534c..0000000 --- a/devices/MIMXRT1052/drivers/fsl_romapi.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_romapi.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "driver.romapi" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Interface for the ROM FLEXSPI NOR flash driver. - */ -typedef struct -{ - uint32_t version; - status_t (*init)(uint32_t instance, flexspi_nor_config_t *config); - status_t (*program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t dst_addr, const uint32_t *src); - status_t (*erase_all)(uint32_t instance, flexspi_nor_config_t *config); - status_t (*erase)(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t lengthInBytes); - uint32_t reserved1; - void (*clear_cache)(uint32_t instance); - status_t (*xfer)(uint32_t instance, flexspi_xfer_t *xfer); - status_t (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, uint32_t seqNumber); - uint32_t reserved2; -} flexspi_nor_driver_interface_t; - -/*! - * @brief Root of the bootloader api tree. - * - * An instance of this struct resides in read-only memory in the bootloader. It - * provides a user application access to APIs exported by the bootloader. - * - * @note The order of existing fields must not be changed. - */ -typedef struct -{ - void (*runBootloader)(void *arg); /*!< Function to start the bootloader executing */ - const uint32_t version; /*!< Bootloader version number */ - const uint8_t *copyright; /*!< Bootloader Copyright */ - const uint32_t reserved0; - flexspi_nor_driver_interface_t *flexSpiNorDriver; /*!< FLEXSPI NOR flash api */ -} bootloader_api_entry_t; - -/******************************************************************************* - * Variables - ******************************************************************************/ - -#define g_bootloaderTree ((bootloader_api_entry_t *)*(uint32_t *)0x0020001cU) - -#define api_flexspi_nor_erase_sector \ - ((status_t(*)(uint32_t instance, flexspi_nor_config_t * config, uint32_t address))0x002106E7U) -/******************************************************************************* - * Codes - ******************************************************************************/ - -/******************************************************************************* - * ROM FLEXSPI NOR driver - ******************************************************************************/ -#if defined(FSL_FEATURE_BOOT_ROM_HAS_ROMAPI) && FSL_FEATURE_BOOT_ROM_HAS_ROMAPI - -/*! - * @brief Initialize Serial NOR flash via FLEXSPI. - * - * @param instance storge the instance of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - */ -status_t ROM_FLEXSPI_NorFlash_Init(uint32_t instance, flexspi_nor_config_t *config) -{ - return g_bootloaderTree->flexSpiNorDriver->init(instance, config); -} - -/*! - * @brief Program data to Serial NOR via FLEXSPI. - * - * @param instance storge the instance of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param dstAddr A pointer to the desired flash memory to be programmed. - * @param src A pointer to the source buffer of data that is to be programmed - * into the NOR flash. - */ -status_t ROM_FLEXSPI_NorFlash_ProgramPage(uint32_t instance, - flexspi_nor_config_t *config, - uint32_t dstAddr, - const uint32_t *src) -{ - return g_bootloaderTree->flexSpiNorDriver->program(instance, config, dstAddr, src); -} - -/*! - * @brief Erase Flash Region specified by address and length. - * - * @param instance storge the index of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param start The start address of the desired NOR flash memory to be erased. - * @param length The length, given in bytes to be erased. - */ -status_t ROM_FLEXSPI_NorFlash_Erase(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t length) -{ - return g_bootloaderTree->flexSpiNorDriver->erase(instance, config, start, length); -} - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR -/*! - * @brief Erase one sector specified by address. - * - * @param instance storge the index of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param start The start address of the desired NOR flash memory to be erased. - */ -status_t ROM_FLEXSPI_NorFlash_EraseSector(uint32_t instance, flexspi_nor_config_t *config, uint32_t start) -{ - return api_flexspi_nor_erase_sector(instance, config, start); -} -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR */ - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL -/*! @brief Erase all the Serial NOR flash connected on FLEXSPI. */ -status_t ROM_FLEXSPI_NorFlash_EraseAll(uint32_t instance, flexspi_nor_config_t *config) -{ - return g_bootloaderTree->flexSpiNorDriver->erase_all(instance, config); -} -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL */ - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER -/*! @brief FLEXSPI command */ -status_t ROM_FLEXSPI_NorFlash_CommandXfer(uint32_t instance, flexspi_xfer_t *xfer) -{ - return g_bootloaderTree->flexSpiNorDriver->xfer(instance, xfer); -} -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER */ - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT -/*! @brief Configure FLEXSPI Lookup table. */ -status_t ROM_FLEXSPI_NorFlash_UpdateLut(uint32_t instance, - uint32_t seqIndex, - const uint32_t *lutBase, - uint32_t seqNumber) -{ - return g_bootloaderTree->flexSpiNorDriver->update_lut(instance, seqIndex, lutBase, seqNumber); -} -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT */ - -/*! @brief Software reset for the FLEXSPI logic. */ -void ROM_FLEXSPI_NorFlash_ClearCache(uint32_t instance) -{ - g_bootloaderTree->flexSpiNorDriver->clear_cache(instance); -} - -#endif /* FSL_FEATURE_BOOT_ROM_HAS_ROMAPI */ diff --git a/devices/MIMXRT1052/drivers/fsl_romapi.h b/devices/MIMXRT1052/drivers/fsl_romapi.h deleted file mode 100644 index 021f938..0000000 --- a/devices/MIMXRT1052/drivers/fsl_romapi.h +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_ROMAPI_H_ -#define _FSL_ROMAPI_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup romapi - * @{ - */ - -/*! @brief ROMAPI version 1.1.1. */ -#define FSL_ROM_ROMAPI_VERSION (MAKE_VERSION(1U, 1U, 1U)) -/*! @brief ROM FLEXSPI NOR driver version 1.4.0. */ -#define FSL_ROM_FLEXSPINOR_DRIVER_VERSION (MAKE_VERSION(1U, 4U, 0U)) - -/*! - * @name Common ROMAPI fearures info defines - * @{ - */ -/* @brief ROM has FLEXSPI NOR API. */ -#define FSL_ROM_HAS_FLEXSPINOR_API (1) -/* @brief ROM has run bootloader API. */ -#define FSL_ROM_HAS_RUNBOOTLOADER_API (0) -/* @brief ROM has FLEXSPI NOR get config API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_GET_CONFIG (0) -/* @brief ROM has flash init API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_FLASH_INIT (1) -/* @brief ROM has erase API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE (1) -/* @brief ROM has erase sector API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR (1) -/* @brief ROM has erase block API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_BLOCK (0) -/* @brief ROM has erase all API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL (1) -/* @brief ROM has page program API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_PAGE_PROGRAM (1) -/* @brief ROM has update lut API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT (1) -/* @brief ROM has FLEXSPI command API. */ -#define FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER (1) - -/*@}*/ - -#define kROM_StatusGroup_FLEXSPI 60U /*!< ROM FLEXSPI status group number.*/ -#define kROM_StatusGroup_FLEXSPINOR 200U /*!< ROM FLEXSPI NOR status group number.*/ - -#define FSL_ROM_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ - (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \ - FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1)) - -/*! @brief Generate bit mask */ -#define FSL_ROM_FLEXSPI_BITMASK(bit_offset) (1U << (bit_offset)) - -/*! @brief FLEXSPI memory config block related defintions */ -#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) /*!< ascii "FCFB" Big Endian */ -#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) /*!< V1.4.0 */ - -#define CMD_SDR 0x01U -#define CMD_DDR 0x21U -#define RADDR_SDR 0x02U -#define RADDR_DDR 0x22U -#define CADDR_SDR 0x03U -#define CADDR_DDR 0x23U -#define MODE1_SDR 0x04U -#define MODE1_DDR 0x24U -#define MODE2_SDR 0x05U -#define MODE2_DDR 0x25U -#define MODE4_SDR 0x06U -#define MODE4_DDR 0x26U -#define MODE8_SDR 0x07U -#define MODE8_DDR 0x27U -#define WRITE_SDR 0x08U -#define WRITE_DDR 0x28U -#define READ_SDR 0x09U -#define READ_DDR 0x29U -#define LEARN_SDR 0x0AU -#define LEARN_DDR 0x2AU -#define DATSZ_SDR 0x0BU -#define DATSZ_DDR 0x2BU -#define DUMMY_SDR 0x0CU -#define DUMMY_DDR 0x2CU -#define DUMMY_RWDS_SDR 0x0DU -#define DUMMY_RWDS_DDR 0x2DU -#define JMP_ON_CS 0x1FU -#define STOP 0U - -#define FLEXSPI_1PAD 0U -#define FLEXSPI_2PAD 1U -#define FLEXSPI_4PAD 2U -#define FLEXSPI_8PAD 3U - -/* Lookup table related defintions */ -#define NOR_CMD_INDEX_READ 0U -#define NOR_CMD_INDEX_READSTATUS 1U -#define NOR_CMD_INDEX_WRITEENABLE 2U -#define NOR_CMD_INDEX_ERASESECTOR 3U -#define NOR_CMD_INDEX_PAGEPROGRAM 4U -#define NOR_CMD_INDEX_CHIPERASE 5U -#define NOR_CMD_INDEX_DUMMY 6U -#define NOR_CMD_INDEX_ERASEBLOCK 7U - -/*! - * NOR LUT sequence index used for default LUT assignment - * NOTE: - * The will take effect if the lut sequences are not customized. - */ -#define NOR_CMD_LUT_SEQ_IDX_READ 0U /*!< READ LUT sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_READSTATUS 1U /*!< Read Status LUT sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \ - 2U /*!< Read status DPI/QPI/OPI sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 3U /*!< Write Enable sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \ - 4U /*!< Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5U /*!< Erase Sector sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8U /*!< Erase Block sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM 9U /*!< Program sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11U /*!< Chip Erase sequence in lookupTable id stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13U /*!< Read SFDP sequence in lookupTable id stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \ - 14U /*!< Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block */ -#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \ - 15U /*!< Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk */ - -/*! - * @name Support for init FLEXSPI NOR configuration - * @{ - */ -/*! @brief Flash Pad Definitions */ -enum -{ - kSerialFlash_1Pad = 1U, - kSerialFlash_2Pads = 2U, - kSerialFlash_4Pads = 4U, - kSerialFlash_8Pads = 8U, -}; - -/*! @brief FLEXSPI clock configuration type */ -enum -{ - kFLEXSPIClk_SDR, /*!< Clock configure for SDR mode */ - kFLEXSPIClk_DDR, /*!< Clock configurat for DDR mode */ -}; - -/*! @brief FLEXSPI Read Sample Clock Source definition */ -enum _flexspi_read_sample_clk -{ - kFLEXSPIReadSampleClk_LoopbackInternally = 0U, - kFLEXSPIReadSampleClk_LoopbackFromDqsPad = 1U, - kFLEXSPIReadSampleClk_LoopbackFromSckPad = 2U, - kFLEXSPIReadSampleClk_ExternalInputFromDqsPad = 3U, -}; - -/*! @brief Flash Type Definition */ -enum -{ - kFLEXSPIDeviceType_SerialNOR = 1U, /*!< Flash device is Serial NOR */ -}; - -/*! @brief Flash Configuration Command Type */ -enum -{ - kDeviceConfigCmdType_Generic, /*!< Generic command, for example: configure dummy cycles, drive strength, etc */ - kDeviceConfigCmdType_QuadEnable, /*!< Quad Enable command */ - kDeviceConfigCmdType_Spi2Xpi, /*!< Switch from SPI to DPI/QPI/OPI mode */ - kDeviceConfigCmdType_Xpi2Spi, /*!< Switch from DPI/QPI/OPI to SPI mode */ - kDeviceConfigCmdType_Spi2NoCmd, /*!< Switch to 0-4-4/0-8-8 mode */ - kDeviceConfigCmdType_Reset, /*!< Reset device command */ -}; - -/*! @brief Defintions for FLEXSPI Serial Clock Frequency */ -enum _flexspi_serial_clk_freq -{ - kFLEXSPISerialClk_NoChange = 0U, - kFLEXSPISerialClk_30MHz = 1U, - kFLEXSPISerialClk_50MHz = 2U, - kFLEXSPISerialClk_60MHz = 3U, - kFLEXSPISerialClk_75MHz = 4U, - kFLEXSPISerialClk_80MHz = 5U, - kFLEXSPISerialClk_100MHz = 6U, - kFLEXSPISerialClk_133MHz = 7U, - kFLEXSPISerialClk_166MHz = 8U, - kFLEXSPISerialClk_200MHz = 9U, -}; - -/*! @brief Misc feature bit definitions */ -enum -{ - kFLEXSPIMiscOffset_DiffClkEnable = 0U, /*!< Bit for Differential clock enable */ - kFLEXSPIMiscOffset_Ck2Enable = 1U, /*!< Bit for CK2 enable */ - kFLEXSPIMiscOffset_ParallelEnable = 2U, /*!< Bit for Parallel mode enable */ - kFLEXSPIMiscOffset_WordAddressableEnable = 3U, /*!< Bit for Word Addressable enable */ - kFLEXSPIMiscOffset_SafeConfigFreqEnable = 4U, /*!< Bit for Safe Configuration Frequency enable */ - kFLEXSPIMiscOffset_PadSettingOverrideEnable = 5U, /*!< Bit for Pad setting override enable */ - kFLEXSPIMiscOffset_DdrModeEnable = 6U, /*!< Bit for DDR clock confiuration indication. */ - kFLEXSPIMiscOffset_UseValidTimeForAllFreq = 7U, /*!< Bit for DLLCR settings under all modes */ -}; - -enum -{ - kSerialNorType_StandardSPI, /*!< Device that support Standard SPI and Extended SPI mode */ - kSerialNorType_HyperBus, /*!< Device that supports HyperBus only */ - kSerialNorType_XPI, /*!< Device that works under DPI, QPI or OPI mode */ - kSerialNorType_NoCmd, /*!< Device that works under No command mode (XIP mode/Performance Enhance - mode/continous read mode) */ -}; - -/*@}*/ - -/*! - * @name FLEXSPI NOR Configuration - * @{ - */ - -/*! @brief FLEXSPI LUT Sequence structure */ -typedef struct _flexspi_lut_seq -{ - uint8_t seqNum; /*!< Sequence Number, valid number: 1-16 */ - uint8_t seqId; /*!< Sequence Index, valid number: 0-15 */ - uint16_t reserved; -} flexspi_lut_seq_t; - -typedef struct -{ - uint8_t time_100ps; /*!< Data valid time, in terms of 100ps */ - uint8_t delay_cells; /*!< Data valid time, in terms of delay cells */ -} flexspi_dll_time_t; - -/*! @brief FLEXSPI Memory Configuration Block */ -typedef struct _flexspi_mem_config -{ - uint32_t tag; /*!< [0x000-0x003] Tag, fixed value 0x42464346UL */ - uint32_t version; /*!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix */ - uint32_t reserved0; /*!< [0x008-0x00b] Reserved for future use */ - uint8_t readSampleClkSrc; /*!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 */ - uint8_t csHoldTime; /*!< [0x00d-0x00d] Data hold time, default value: 3 */ - uint8_t csSetupTime; /*!< [0x00e-0x00e] Date setup time, default value: 3 */ - uint8_t columnAddressWidth; /*!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For - Serial NAND, need to refer to datasheet */ - uint8_t deviceModeCfgEnable; /*!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable */ - uint8_t deviceModeType; /*!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch, - Generic configuration, etc. */ - uint16_t waitTimeCfgCommands; /*!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for - DPI/QPI/OPI switch or reset command */ - flexspi_lut_seq_t deviceModeSeq; /*!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt - sequence number, [31:16] Reserved */ - uint32_t deviceModeArg; /*!< [0x018-0x01b] Argument/Parameter for device configuration */ - uint8_t configCmdEnable; /*!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable */ - uint8_t configModeType[3]; /*!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe */ - flexspi_lut_seq_t - configCmdSeqs[3]; /*!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq */ - uint32_t reserved1; /*!< [0x02c-0x02f] Reserved for future use */ - uint32_t configCmdArgs[3]; /*!< [0x030-0x03b] Arguments/Parameters for device Configuration commands */ - uint32_t reserved2; /*!< [0x03c-0x03f] Reserved for future use */ - uint32_t controllerMiscOption; /*!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more - details */ - uint8_t deviceType; /*!< [0x044-0x044] Device Type: See Flash Type Definition for more details */ - uint8_t sflashPadType; /*!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal */ - uint8_t serialClkFreq; /*!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot - Chapter for more details */ - uint8_t - lutCustomSeqEnable; /*!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot - be done using 1 LUT sequence, currently, only applicable to HyperFLASH */ - uint32_t reserved3[2]; /*!< [0x048-0x04f] Reserved for future use */ - uint32_t sflashA1Size; /*!< [0x050-0x053] Size of Flash connected to A1 */ - uint32_t sflashA2Size; /*!< [0x054-0x057] Size of Flash connected to A2 */ - uint32_t sflashB1Size; /*!< [0x058-0x05b] Size of Flash connected to B1 */ - uint32_t sflashB2Size; /*!< [0x05c-0x05f] Size of Flash connected to B2 */ - uint32_t csPadSettingOverride; /*!< [0x060-0x063] CS pad setting override value */ - uint32_t sclkPadSettingOverride; /*!< [0x064-0x067] SCK pad setting override value */ - uint32_t dataPadSettingOverride; /*!< [0x068-0x06b] data pad setting override value */ - uint32_t dqsPadSettingOverride; /*!< [0x06c-0x06f] DQS pad setting override value */ - uint32_t timeoutInMs; /*!< [0x070-0x073] Timeout threshold for read status command */ - uint32_t commandInterval; /*!< [0x074-0x077] CS deselect interval between two commands */ - flexspi_dll_time_t dataValidTime[2]; /*!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B */ - uint16_t busyOffset; /*!< [0x07c-0x07d] Busy offset, valid value: 0-31 */ - uint16_t busyBitPolarity; /*!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - - busy flag is 0 when flash device is busy */ - uint32_t lookupTable[64]; /*!< [0x080-0x17f] Lookup table holds Flash command sequences */ - flexspi_lut_seq_t lutCustomSeq[12]; /*!< [0x180-0x1af] Customizable LUT Sequences */ - uint32_t reserved4[4]; /*!< [0x1b0-0x1bf] Reserved for future use */ -} flexspi_mem_config_t; - -/*! @brief Serial NOR configuration block */ -typedef struct _flexspi_nor_config -{ - flexspi_mem_config_t memConfig; /*!< Common memory configuration info via FLEXSPI */ - uint32_t pageSize; /*!< Page size of Serial NOR */ - uint32_t sectorSize; /*!< Sector size of Serial NOR */ - uint8_t ipcmdSerialClkFreq; /*!< Clock frequency for IP command */ - uint8_t isUniformBlockSize; /*!< Sector/Block size is the same */ - uint8_t isDataOrderSwapped; /*!< Data order (D0, D1, D2, D3) is swapped (D1,D0, D3, D2) */ - uint8_t reserved0[1]; /*!< Reserved for future use */ - uint8_t serialNorType; /*!< Serial NOR Flash type: 0/1/2/3 */ - uint8_t needExitNoCmdMode; /*!< Need to exit NoCmd mode before other IP command */ - uint8_t halfClkForNonReadCmd; /*!< Half the Serial Clock for non-read command: true/false */ - uint8_t needRestoreNoCmdMode; /*!< Need to Restore NoCmd mode after IP commmand execution */ - uint32_t blockSize; /*!< Block size */ - uint32_t reserve2[11]; /*!< Reserved for future use */ -} flexspi_nor_config_t; - -/*@}*/ - -/*! @brief Manufacturer ID */ -enum -{ - kSerialFlash_ISSI_ManufacturerID = 0x9DU, /*!< Manufacturer ID of the ISSI serial flash */ - kSerialFlash_Adesto_ManufacturerID = 0x1F, /*!< Manufacturer ID of the Adesto Technologies serial flash*/ - kSerialFlash_Winbond_ManufacturerID = 0xEFU, /*!< Manufacturer ID of the Winbond serial flash */ - kSerialFlash_Cypress_ManufacturerID = 0x01U, /*!< Manufacturer ID for Cypress */ -}; - -/*! @brief ROM FLEXSPI NOR flash status */ -enum _flexspi_nor_status -{ - kStatus_ROM_FLEXSPI_SequenceExecutionTimeout = - MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 0), /*!< Status for Sequence Execution timeout */ - kStatus_ROM_FLEXSPI_InvalidSequence = MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 1), /*!< Status for Invalid Sequence */ - kStatus_ROM_FLEXSPI_DeviceTimeout = MAKE_STATUS(kROM_StatusGroup_FLEXSPI, 2), /*!< Status for Device timeout */ - kStatus_FLEXSPINOR_DTRRead_DummyProbeFailed = - MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 10), /*!< Status for DDR Read dummy probe failure */ - kStatus_ROM_FLEXSPINOR_SFDP_NotFound = - MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 7), /*!< Status for SFDP read failure */ - kStatus_ROM_FLEXSPINOR_Flash_NotFound = - MAKE_STATUS(kROM_StatusGroup_FLEXSPINOR, 9), /*!< Status for Flash detection failure */ -}; - -typedef enum _flexspi_operation -{ - kFLEXSPIOperation_Command, /*!< FLEXSPI operation: Only command, both TX and RX buffer are ignored. */ - kFLEXSPIOperation_Config, /*!< FLEXSPI operation: Configure device mode, the TX FIFO size is fixed in LUT. */ - kFLEXSPIOperation_Write, /*!< FLEXSPI operation: Write, only TX buffer is effective */ - kFLEXSPIOperation_Read, /*!< FLEXSPI operation: Read, only Rx Buffer is effective. */ - kFLEXSPIOperation_End = kFLEXSPIOperation_Read, -} flexspi_operation_t; - -/*! @brief FLEXSPI Transfer Context */ -typedef struct _flexspi_xfer -{ - flexspi_operation_t operation; /*!< FLEXSPI operation */ - uint32_t baseAddress; /*!< FLEXSPI operation base address */ - uint32_t seqId; /*!< Sequence Id */ - uint32_t seqNum; /*!< Sequence Number */ - bool isParallelModeEnable; /*!< Is a parallel transfer */ - uint32_t *txBuffer; /*!< Tx buffer */ - uint32_t txSize; /*!< Tx size in bytes */ - uint32_t *rxBuffer; /*!< Rx buffer */ - uint32_t rxSize; /*!< Rx size in bytes */ -} flexspi_xfer_t; - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FSL_FEATURE_BOOT_ROM_HAS_ROMAPI) && FSL_FEATURE_BOOT_ROM_HAS_ROMAPI - -/*! - * @name Initialization - * @{ - */ - -/*! - * @brief Initialize Serial NOR flash via FLEXSPI - * - * This function checks and initializes the FLEXSPI module for the other FLEXSPI APIs. - * - * @param instance storge the instance of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout - */ -status_t ROM_FLEXSPI_NorFlash_Init(uint32_t instance, flexspi_nor_config_t *config); - -/*@}*/ - -/*! - * @name Programming - * @{ - */ -/*! - * @brief Program data to Serial NOR flash via FLEXSPI. - * - * This function programs the NOR flash memory with the dest address for a given - * flash area as determined by the dst address and the length. - * - * @param instance storge the instance of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param dstAddr A pointer to the desired flash memory to be programmed. - * NOTE: - * It is recommended that use page aligned access; - * If the dstAddr is not aligned to page,the driver automatically - * aligns address down with the page address. - * @param src A pointer to the source buffer of data that is to be programmed - * into the NOR flash. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout - */ -status_t ROM_FLEXSPI_NorFlash_ProgramPage(uint32_t instance, - flexspi_nor_config_t *config, - uint32_t dstAddr, - const uint32_t *src); - -/*@}*/ - -/*! - * @name Erasing - * @{ - */ -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR -/*! - * @brief Erase one sector specified by address - * - * This function erases one of NOR flash sectors based on the desired address. - * - * @param instance storge the index of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param address The start address of the desired NOR flash memory to be erased. - * NOTE: - * It is recommended that use sector-aligned access nor device; - * If dstAddr is not aligned with the sector,The driver automatically - * aligns address down with the sector address. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout - */ -status_t ROM_FLEXSPI_NorFlash_EraseSector(uint32_t instance, flexspi_nor_config_t *config, uint32_t address); -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_SECTOR */ - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL -/*! - * @brief Erase all the Serial NOR flash connected on FLEXSPI. - * - * @param instance storge the instance of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout - */ -status_t ROM_FLEXSPI_NorFlash_EraseAll(uint32_t instance, flexspi_nor_config_t *config); -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_ERASE_ALL */ - -/*! - * @brief Erase Flash Region specified by address and length - * - * This function erases the appropriate number of flash sectors based on the - * desired start address and length. - * - * @param instance storge the index of FLEXSPI. - * @param config A pointer to the storage for the driver runtime state. - * @param start The start address of the desired NOR flash memory to be erased. - * NOTE: - * It is recommended that use sector-aligned access NOR flash; - * If dstAddr is not aligned with the sector,the driver automatically - * aligns address down with the sector address. - * @param length The length, given in bytes to be erased. - * NOTE: - * It is recommended that use sector-aligned access NOR flash; - * If length is not aligned with the sector,the driver automatically - * aligns up with the sector. - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout - */ -status_t ROM_FLEXSPI_NorFlash_Erase(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t length); - -/*@}*/ - -/*! - * @name Command - * @{ - */ - -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER -/*! - * @brief FLEXSPI command - * - * This function is used to perform the command write sequence to the NOR flash. - * - * @param instance storge the index of FLEXSPI. - * @param xfer A pointer to the storage FLEXSPI Transfer Context. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - */ -status_t ROM_FLEXSPI_NorFlash_CommandXfer(uint32_t instance, flexspi_xfer_t *xfer); -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_CMD_XFER */ -/*@}*/ - -/*! - * @name UpdateLut - * @{ - */ -#if defined(FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT) && FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT -/*! - * @brief Configure FLEXSPI Lookup table - * - * @param instance storge the index of FLEXSPI. - * @param seqIndex storge the sequence Id. - * @param lutBase A pointer to the look-up-table for command sequences. - * @param seqNumber storge sequence number. - * - * @retval kStatus_Success Api was executed succesfuly. - * @retval kStatus_InvalidArgument A invalid argument is provided. - * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. - * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. - */ -status_t ROM_FLEXSPI_NorFlash_UpdateLut(uint32_t instance, - uint32_t seqIndex, - const uint32_t *lutBase, - uint32_t seqNumber); -#endif /* FSL_ROM_FLEXSPINOR_API_HAS_FEATURE_UPDATE_LUT */ - -/*@}*/ - -/*! - * @name ClearCache - * @{ - */ - -/*! - * @brief Software reset for the FLEXSPI logic. - * - * This function sets the software reset flags for both AHB and buffer domain and - * resets both AHB buffer and also IP FIFOs. - * - * @param instance storge the index of FLEXSPI. - */ -void ROM_FLEXSPI_NorFlash_ClearCache(uint32_t instance); - -/*@}*/ - -#endif /* FSL_FEATURE_BOOT_ROM_HAS_ROMAPI */ - -#ifdef __cplusplus -} -#endif - -/*! @}*/ - -#endif /* _FSL_ROMAPI_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_rtwdog.c b/devices/MIMXRT1052/drivers/fsl_rtwdog.c deleted file mode 100644 index 4b49280..0000000 --- a/devices/MIMXRT1052/drivers/fsl_rtwdog.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_rtwdog.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.rtwdog" -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Clears the RTWDOG flag. - * - * This function clears the RTWDOG status flag. - * - * Example to clear an interrupt flag: - * code - * RTWDOG_ClearStatusFlags(wdog_base,kRTWDOG_InterruptFlag); - * endcode - * param base RTWDOG peripheral base address. - * param mask The status flags to clear. - * The parameter can be any combination of the following values: - * arg kRTWDOG_InterruptFlag - */ -void RTWDOG_ClearStatusFlags(RTWDOG_Type *base, uint32_t mask) -{ - if ((mask & (uint32_t)kRTWDOG_InterruptFlag) != 0U) - { - base->CS |= RTWDOG_CS_FLG_MASK; - } -} - -/*! - * brief Initializes the RTWDOG configuration structure. - * - * This function initializes the RTWDOG configuration structure to default values. The default - * values are: - * code - * rtwdogConfig->enableRtwdog = true; - * rtwdogConfig->clockSource = kRTWDOG_ClockSource1; - * rtwdogConfig->prescaler = kRTWDOG_ClockPrescalerDivide1; - * rtwdogConfig->workMode.enableWait = true; - * rtwdogConfig->workMode.enableStop = false; - * rtwdogConfig->workMode.enableDebug = false; - * rtwdogConfig->testMode = kRTWDOG_TestModeDisabled; - * rtwdogConfig->enableUpdate = true; - * rtwdogConfig->enableInterrupt = false; - * rtwdogConfig->enableWindowMode = false; - * rtwdogConfig->windowValue = 0U; - * rtwdogConfig->timeoutValue = 0xFFFFU; - * endcode - * - * param config Pointer to the RTWDOG configuration structure. - * see rtwdog_config_t - */ -void RTWDOG_GetDefaultConfig(rtwdog_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableRtwdog = true; - config->clockSource = kRTWDOG_ClockSource1; - config->prescaler = kRTWDOG_ClockPrescalerDivide1; - config->workMode.enableWait = true; - config->workMode.enableStop = false; - config->workMode.enableDebug = false; - config->testMode = kRTWDOG_TestModeDisabled; - config->enableUpdate = true; - config->enableInterrupt = false; - config->enableWindowMode = false; - config->windowValue = 0U; - config->timeoutValue = 0xFFFFU; -} - -/*! - * brief Initializes the RTWDOG module. - * - * This function initializes the RTWDOG. - * To reconfigure the RTWDOG without forcing a reset first, enableUpdate must be set to true - * in the configuration. - * - * Example: - * code - * rtwdog_config_t config; - * RTWDOG_GetDefaultConfig(&config); - * config.timeoutValue = 0x7ffU; - * config.enableUpdate = true; - * RTWDOG_Init(wdog_base,&config); - * endcode - * - * param base RTWDOG peripheral base address. - * param config The configuration of the RTWDOG. - */ -void RTWDOG_Init(RTWDOG_Type *base, const rtwdog_config_t *config) -{ - assert(NULL != config); - - uint32_t value = 0U; - uint32_t primaskValue = 0U; - - value = RTWDOG_CS_EN(config->enableRtwdog) | RTWDOG_CS_CLK(config->clockSource) | - RTWDOG_CS_INT(config->enableInterrupt) | RTWDOG_CS_WIN(config->enableWindowMode) | - RTWDOG_CS_UPDATE(config->enableUpdate) | RTWDOG_CS_DBG(config->workMode.enableDebug) | - RTWDOG_CS_STOP(config->workMode.enableStop) | RTWDOG_CS_WAIT(config->workMode.enableWait) | - RTWDOG_CS_PRES(config->prescaler) | RTWDOG_CS_CMD32EN(1U) | RTWDOG_CS_TST(config->testMode); - - /* Disable the global interrupts. Otherwise, an interrupt could effectively invalidate the unlock sequence - * and the WCT may expire. After the configuration finishes, re-enable the global interrupts. */ - primaskValue = DisableGlobalIRQ(); - RTWDOG_Unlock(base); - base->WIN = config->windowValue; - base->TOVAL = config->timeoutValue; - base->CS = value; - while ((base->CS & RTWDOG_CS_RCS_MASK) == 0U) - { - } - EnableGlobalIRQ(primaskValue); -} - -/*! - * brief De-initializes the RTWDOG module. - * - * This function shuts down the RTWDOG. - * Ensure that the WDOG_CS.UPDATE is 1, which means that the register update is enabled. - * - * param base RTWDOG peripheral base address. - */ -void RTWDOG_Deinit(RTWDOG_Type *base) -{ - uint32_t primaskValue = 0U; - - /* Disable the global interrupts */ - primaskValue = DisableGlobalIRQ(); - RTWDOG_Unlock(base); - RTWDOG_Disable(base); - EnableGlobalIRQ(primaskValue); -} diff --git a/devices/MIMXRT1052/drivers/fsl_rtwdog.h b/devices/MIMXRT1052/drivers/fsl_rtwdog.h deleted file mode 100644 index 5eecb5a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_rtwdog.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_RTWDOG_H_ -#define _FSL_RTWDOG_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup rtwdog - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ -/*! @name Unlock sequence */ -/*@{*/ -#define WDOG_FIRST_WORD_OF_UNLOCK (RTWDOG_UPDATE_KEY & 0xFFFFU) /*!< First word of unlock sequence */ -#define WDOG_SECOND_WORD_OF_UNLOCK ((RTWDOG_UPDATE_KEY >> 16U) & 0xFFFFU) /*!< Second word of unlock sequence */ -/*@}*/ - -/*! @name Refresh sequence */ -/*@{*/ -#define WDOG_FIRST_WORD_OF_REFRESH (RTWDOG_REFRESH_KEY & 0xFFFFU) /*!< First word of refresh sequence */ -#define WDOG_SECOND_WORD_OF_REFRESH ((RTWDOG_REFRESH_KEY >> 16U) & 0xFFFFU) /*!< Second word of refresh sequence */ -/*@}*/ -/*! @name Driver version */ -/*@{*/ -/*! @brief RTWDOG driver version 2.1.2. */ -#define FSL_RTWDOG_DRIVER_VERSION (MAKE_VERSION(2, 1, 2)) -/*@}*/ - -/*! @brief Describes RTWDOG clock source. */ -typedef enum _rtwdog_clock_source -{ - kRTWDOG_ClockSource0 = 0U, /*!< Clock source 0 */ - kRTWDOG_ClockSource1 = 1U, /*!< Clock source 1 */ - kRTWDOG_ClockSource2 = 2U, /*!< Clock source 2 */ - kRTWDOG_ClockSource3 = 3U, /*!< Clock source 3 */ -} rtwdog_clock_source_t; - -/*! @brief Describes the selection of the clock prescaler. */ -typedef enum _rtwdog_clock_prescaler -{ - kRTWDOG_ClockPrescalerDivide1 = 0x0U, /*!< Divided by 1 */ - kRTWDOG_ClockPrescalerDivide256 = 0x1U, /*!< Divided by 256 */ -} rtwdog_clock_prescaler_t; - -/*! @brief Defines RTWDOG work mode. */ -typedef struct _rtwdog_work_mode -{ - bool enableWait; /*!< Enables or disables RTWDOG in wait mode */ - bool enableStop; /*!< Enables or disables RTWDOG in stop mode */ - bool enableDebug; /*!< Enables or disables RTWDOG in debug mode */ -} rtwdog_work_mode_t; - -/*! @brief Describes RTWDOG test mode. */ -typedef enum _rtwdog_test_mode -{ - kRTWDOG_TestModeDisabled = 0U, /*!< Test Mode disabled */ - kRTWDOG_UserModeEnabled = 1U, /*!< User Mode enabled */ - kRTWDOG_LowByteTest = 2U, /*!< Test Mode enabled, only low byte is used */ - kRTWDOG_HighByteTest = 3U, /*!< Test Mode enabled, only high byte is used */ -} rtwdog_test_mode_t; - -/*! @brief Describes RTWDOG configuration structure. */ -typedef struct _rtwdog_config -{ - bool enableRtwdog; /*!< Enables or disables RTWDOG */ - rtwdog_clock_source_t clockSource; /*!< Clock source select */ - rtwdog_clock_prescaler_t prescaler; /*!< Clock prescaler value */ - rtwdog_work_mode_t workMode; /*!< Configures RTWDOG work mode in debug stop and wait mode */ - rtwdog_test_mode_t testMode; /*!< Configures RTWDOG test mode */ - bool enableUpdate; /*!< Update write-once register enable */ - bool enableInterrupt; /*!< Enables or disables RTWDOG interrupt */ - bool enableWindowMode; /*!< Enables or disables RTWDOG window mode */ - uint16_t windowValue; /*!< Window value */ - uint16_t timeoutValue; /*!< Timeout value */ -} rtwdog_config_t; - -/*! - * @brief RTWDOG interrupt configuration structure. - * - * This structure contains the settings for all of the RTWDOG interrupt configurations. - */ -enum _rtwdog_interrupt_enable_t -{ - kRTWDOG_InterruptEnable = RTWDOG_CS_INT_MASK, /*!< Interrupt is generated before forcing a reset */ -}; - -/*! - * @brief RTWDOG status flags. - * - * This structure contains the RTWDOG status flags for use in the RTWDOG functions. - */ -enum _rtwdog_status_flags_t -{ - kRTWDOG_RunningFlag = RTWDOG_CS_EN_MASK, /*!< Running flag, set when RTWDOG is enabled */ - kRTWDOG_InterruptFlag = RTWDOG_CS_FLG_MASK, /*!< Interrupt flag, set when interrupt occurs */ -}; - -/******************************************************************************* - * API - *******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name RTWDOG Initialization and De-initialization - * @{ - */ - -/*! - * @brief Initializes the RTWDOG configuration structure. - * - * This function initializes the RTWDOG configuration structure to default values. The default - * values are: - * @code - * rtwdogConfig->enableRtwdog = true; - * rtwdogConfig->clockSource = kRTWDOG_ClockSource1; - * rtwdogConfig->prescaler = kRTWDOG_ClockPrescalerDivide1; - * rtwdogConfig->workMode.enableWait = true; - * rtwdogConfig->workMode.enableStop = false; - * rtwdogConfig->workMode.enableDebug = false; - * rtwdogConfig->testMode = kRTWDOG_TestModeDisabled; - * rtwdogConfig->enableUpdate = true; - * rtwdogConfig->enableInterrupt = false; - * rtwdogConfig->enableWindowMode = false; - * rtwdogConfig->windowValue = 0U; - * rtwdogConfig->timeoutValue = 0xFFFFU; - * @endcode - * - * @param config Pointer to the RTWDOG configuration structure. - * @see rtwdog_config_t - */ -void RTWDOG_GetDefaultConfig(rtwdog_config_t *config); - -/*! - * @brief Initializes the RTWDOG module. - * - * This function initializes the RTWDOG. - * To reconfigure the RTWDOG without forcing a reset first, enableUpdate must be set to true - * in the configuration. - * - * Example: - * @code - * rtwdog_config_t config; - * RTWDOG_GetDefaultConfig(&config); - * config.timeoutValue = 0x7ffU; - * config.enableUpdate = true; - * RTWDOG_Init(wdog_base,&config); - * @endcode - * - * @param base RTWDOG peripheral base address. - * @param config The configuration of the RTWDOG. - */ - -#if defined(DOXYGEN_OUTPUT) && DOXYGEN_OUTPUT -void RTWDOG_Init(RTWDOG_Type *base, const rtwdog_config_t *config); -#else -AT_QUICKACCESS_SECTION_CODE(void RTWDOG_Init(RTWDOG_Type *base, const rtwdog_config_t *config)); -#endif - -/*! - * @brief De-initializes the RTWDOG module. - * - * This function shuts down the RTWDOG. - * Ensure that the WDOG_CS.UPDATE is 1, which means that the register update is enabled. - * - * @param base RTWDOG peripheral base address. - */ -void RTWDOG_Deinit(RTWDOG_Type *base); - -/* @} */ - -/*! - * @name RTWDOG functional Operation - * @{ - */ - -/*! - * @brief Enables the RTWDOG module. - * - * This function writes a value into the WDOG_CS register to enable the RTWDOG. - * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address. - */ -static inline void RTWDOG_Enable(RTWDOG_Type *base) -{ - base->CS |= RTWDOG_CS_EN_MASK; -} - -/*! - * @brief Disables the RTWDOG module. - * - * This function writes a value into the WDOG_CS register to disable the RTWDOG. - * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address - */ -static inline void RTWDOG_Disable(RTWDOG_Type *base) -{ - base->CS &= ~RTWDOG_CS_EN_MASK; -} - -/*! - * @brief Enables the RTWDOG interrupt. - * - * This function writes a value into the WDOG_CS register to enable the RTWDOG interrupt. - * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address. - * @param mask The interrupts to enable. - * The parameter can be a combination of the following source if defined: - * @arg kRTWDOG_InterruptEnable - */ -static inline void RTWDOG_EnableInterrupts(RTWDOG_Type *base, uint32_t mask) -{ - base->CS |= mask; -} - -/*! - * @brief Disables the RTWDOG interrupt. - * - * This function writes a value into the WDOG_CS register to disable the RTWDOG interrupt. - * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address. - * @param mask The interrupts to disabled. - * The parameter can be a combination of the following source if defined: - * @arg kRTWDOG_InterruptEnable - */ -static inline void RTWDOG_DisableInterrupts(RTWDOG_Type *base, uint32_t mask) -{ - base->CS &= ~mask; -} - -/*! - * @brief Gets the RTWDOG all status flags. - * - * This function gets all status flags. - * - * Example to get the running flag: - * @code - * uint32_t status; - * status = RTWDOG_GetStatusFlags(wdog_base) & kRTWDOG_RunningFlag; - * @endcode - * @param base RTWDOG peripheral base address - * @return State of the status flag: asserted (true) or not-asserted (false). @see _rtwdog_status_flags_t - * - true: related status flag has been set. - * - false: related status flag is not set. - */ -static inline uint32_t RTWDOG_GetStatusFlags(RTWDOG_Type *base) -{ - return (base->CS & (RTWDOG_CS_EN_MASK | RTWDOG_CS_FLG_MASK)); -} - -/*! - * @brief Enables/disables the window mode. - * - * @param base RTWDOG peripheral base address. - * @param enable Enables(true) or disables(false) the feature. - */ -static inline void RTWDOG_EnableWindowMode(RTWDOG_Type *base, bool enable) -{ - if (enable) - { - base->CS |= RTWDOG_CS_WIN_MASK; - } - else - { - base->CS &= ~RTWDOG_CS_WIN_MASK; - } -} - -/*! - * @brief Converts raw count value to millisecond. - * - * Note that if the clock frequency is too high the timeout period can be less than 1 ms. - * In this case this api will return 0 value. - * - * @param base RTWDOG peripheral base address. - * @param count Raw count value. - * @param clockFreqInHz The frequency of the clock source RTWDOG uses. - */ -static inline uint32_t RTWDOG_CountToMesec(RTWDOG_Type *base, uint32_t count, uint32_t clockFreqInHz) -{ - if ((base->CS & RTWDOG_CS_PRES_MASK) != 0U) - { - clockFreqInHz /= 256U; - } - return count * 1000U / clockFreqInHz; -} - -/*! - * @brief Clears the RTWDOG flag. - * - * This function clears the RTWDOG status flag. - * - * Example to clear an interrupt flag: - * @code - * RTWDOG_ClearStatusFlags(wdog_base,kRTWDOG_InterruptFlag); - * @endcode - * @param base RTWDOG peripheral base address. - * @param mask The status flags to clear. - * The parameter can be any combination of the following values: - * @arg kRTWDOG_InterruptFlag - */ -void RTWDOG_ClearStatusFlags(RTWDOG_Type *base, uint32_t mask); - -/*! - * @brief Sets the RTWDOG timeout value. - * - * This function writes a timeout value into the WDOG_TOVAL register. - * The WDOG_TOVAL register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address - * @param timeoutCount RTWDOG timeout value, count of RTWDOG clock ticks. - */ -static inline void RTWDOG_SetTimeoutValue(RTWDOG_Type *base, uint16_t timeoutCount) -{ - base->TOVAL = timeoutCount; -} - -/*! - * @brief Sets the RTWDOG window value. - * - * This function writes a window value into the WDOG_WIN register. - * The WDOG_WIN register is a write-once register. Ensure that the WCT window is still open and - * this register has not been written in this WCT while the function is called. - * - * @param base RTWDOG peripheral base address. - * @param windowValue RTWDOG window value. - */ -static inline void RTWDOG_SetWindowValue(RTWDOG_Type *base, uint16_t windowValue) -{ - base->WIN = windowValue; -} - -/*! - * @brief Unlocks the RTWDOG register written. - * - * This function unlocks the RTWDOG register written. - * - * Before starting the unlock sequence and following the configuration, disable the global interrupts. - * Otherwise, an interrupt could effectively invalidate the unlock sequence and the WCT may expire. - * After the configuration finishes, re-enable the global interrupts. - * - * @param base RTWDOG peripheral base address - */ -__STATIC_FORCEINLINE void RTWDOG_Unlock(RTWDOG_Type *base) -{ - if (((base->CS) & RTWDOG_CS_CMD32EN_MASK) != 0U) - { - base->CNT = RTWDOG_UPDATE_KEY; - } - else - { - base->CNT = WDOG_FIRST_WORD_OF_UNLOCK; - base->CNT = WDOG_SECOND_WORD_OF_UNLOCK; - } - while ((base->CS & RTWDOG_CS_ULK_MASK) == 0U) - { - } -} - -/*! - * @brief Refreshes the RTWDOG timer. - * - * This function feeds the RTWDOG. - * This function should be called before the Watchdog timer is in timeout. Otherwise, a reset is asserted. - * - * @param base RTWDOG peripheral base address - */ -static inline void RTWDOG_Refresh(RTWDOG_Type *base) -{ - uint32_t primaskValue = 0U; - primaskValue = DisableGlobalIRQ(); - if (((base->CS) & RTWDOG_CS_CMD32EN_MASK) != 0U) - { - base->CNT = RTWDOG_REFRESH_KEY; - } - else - { - base->CNT = WDOG_FIRST_WORD_OF_REFRESH; - base->CNT = WDOG_SECOND_WORD_OF_REFRESH; - } - EnableGlobalIRQ(primaskValue); -} - -/*! - * @brief Gets the RTWDOG counter value. - * - * This function gets the RTWDOG counter value. - * - * @param base RTWDOG peripheral base address. - * @return Current RTWDOG counter value. - */ -static inline uint16_t RTWDOG_GetCounterValue(RTWDOG_Type *base) -{ - return (uint16_t)base->CNT; -} - -/*@}*/ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -#endif /* _FSL_RTWDOG_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_sai.c b/devices/MIMXRT1052/drivers/fsl_sai.c deleted file mode 100644 index 9af30dc..0000000 --- a/devices/MIMXRT1052/drivers/fsl_sai.c +++ /dev/null @@ -1,3818 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_sai.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.sai" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ -/*! @brief _sai_transfer_state sai transfer state.*/ -enum -{ - kSAI_Busy = 0x0U, /*!< SAI is busy */ - kSAI_Idle, /*!< Transfer is done. */ - kSAI_Error /*!< Transfer error occurred. */ -}; - -/*! @brief Typedef for sai tx interrupt handler. */ -typedef void (*sai_tx_isr_t)(I2S_Type *base, sai_handle_t *saiHandle); - -/*! @brief Typedef for sai rx interrupt handler. */ -typedef void (*sai_rx_isr_t)(I2S_Type *base, sai_handle_t *saiHandle); - -/*! @brief check flag avalibility */ -#define IS_SAI_FLAG_SET(reg, flag) (((reg) & ((uint32_t)flag)) != 0UL) -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief sai get rx enabled interrupt status. - * - * - * @param base SAI base pointer. - * @param enableFlag enable flag to check. - * @param statusFlag status flag to check. - */ -static bool SAI_RxGetEnabledInterruptStatus(I2S_Type *base, uint32_t enableFlag, uint32_t statusFlag); - -/*! - * @brief sai get tx enabled interrupt status. - * - * - * @param base SAI base pointer. - * @param enableFlag enable flag to check. - * @param statusFlag status flag to check. - */ -static bool SAI_TxGetEnabledInterruptStatus(I2S_Type *base, uint32_t enableFlag, uint32_t statusFlag); - -/*! - * @brief Set the master clock divider. - * - * This API will compute the master clock divider according to master clock frequency and master - * clock source clock source frequency. - * - * @param base SAI base pointer. - * @param mclk_Hz Mater clock frequency in Hz. - * @param mclkSrcClock_Hz Master clock source frequency in Hz. - */ -static bool SAI_TxGetEnabledInterruptStatus(I2S_Type *base, uint32_t enableFlag, uint32_t statusFlag); - -#if ((defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV) && (FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV))) - -/*! - * @brief Set the master clock divider. - * - * This API will compute the master clock divider according to master clock frequency and master - * clock source clock source frequency. - * - * @param base SAI base pointer. - * @param mclk_Hz Mater clock frequency in Hz. - * @param mclkSrcClock_Hz Master clock source frequency in Hz. - */ -static void SAI_SetMasterClockDivider(I2S_Type *base, uint32_t mclk_Hz, uint32_t mclkSrcClock_Hz); -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ - -/*! - * @brief Get the instance number for SAI. - * - * @param base SAI base pointer. - */ -static uint32_t SAI_GetInstance(I2S_Type *base); - -/*! - * @brief sends a piece of data in non-blocking way. - * - * @param base SAI base pointer - * @param channel start channel number. - * @param channelMask enabled channels mask. - * @param endChannel end channel numbers. - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be written. - * @param size Bytes to be written. - */ -static void SAI_WriteNonBlocking(I2S_Type *base, - uint32_t channel, - uint32_t channelMask, - uint32_t endChannel, - uint8_t bitWidth, - uint8_t *buffer, - uint32_t size); - -/*! - * @brief Receive a piece of data in non-blocking way. - * - * @param base SAI base pointer - * @param channel start channel number. - * @param channelMask enabled channels mask. - * @param endChannel end channel numbers. - * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be read. - * @param size Bytes to be read. - */ -static void SAI_ReadNonBlocking(I2S_Type *base, - uint32_t channel, - uint32_t channelMask, - uint32_t endChannel, - uint8_t bitWidth, - uint8_t *buffer, - uint32_t size); - -/*! - * @brief Get classic I2S mode configurations. - * - * @param config transceiver configurations - * @param bitWidth audio data bitWidth. - * @param mode audio data channel - * @param saiChannelMask channel mask value to enable - */ -static void SAI_GetCommonConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask); -/******************************************************************************* - * Variables - ******************************************************************************/ -/* Base pointer array */ -static I2S_Type *const s_saiBases[] = I2S_BASE_PTRS; -/*!@brief SAI handle pointer */ -static sai_handle_t *s_saiHandle[ARRAY_SIZE(s_saiBases)][2]; -/* IRQ number array */ -static const IRQn_Type s_saiTxIRQ[] = I2S_TX_IRQS; -static const IRQn_Type s_saiRxIRQ[] = I2S_RX_IRQS; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Clock name array */ -static const clock_ip_name_t s_saiClock[] = SAI_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -/*! @brief Pointer to tx IRQ handler for each instance. */ -static sai_tx_isr_t s_saiTxIsr; -/*! @brief Pointer to tx IRQ handler for each instance. */ -static sai_rx_isr_t s_saiRxIsr; - -/******************************************************************************* - * Code - ******************************************************************************/ -static bool SAI_RxGetEnabledInterruptStatus(I2S_Type *base, uint32_t enableFlag, uint32_t statusFlag) -{ - uint32_t rcsr = base->RCSR; - - return IS_SAI_FLAG_SET(rcsr, enableFlag) && IS_SAI_FLAG_SET(rcsr, statusFlag); -} - -static bool SAI_TxGetEnabledInterruptStatus(I2S_Type *base, uint32_t enableFlag, uint32_t statusFlag) -{ - uint32_t tcsr = base->TCSR; - - return IS_SAI_FLAG_SET(tcsr, enableFlag) && IS_SAI_FLAG_SET(tcsr, statusFlag); -} - -#if ((defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV) && (FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV))) -static void SAI_SetMasterClockDivider(I2S_Type *base, uint32_t mclk_Hz, uint32_t mclkSrcClock_Hz) -{ - assert(mclk_Hz <= mclkSrcClock_Hz); - - uint32_t sourceFreq = mclkSrcClock_Hz / 100U; /*In order to prevent overflow */ - uint32_t targetFreq = mclk_Hz / 100U; /*In order to prevent overflow */ - -#if FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV - uint32_t postDivider = sourceFreq / targetFreq; - - /* if source equal to target, then disable divider */ - if (postDivider == 1U) - { - base->MCR &= ~I2S_MCR_DIVEN_MASK; - } - else - { - base->MCR = (base->MCR & (~I2S_MCR_DIV_MASK)) | I2S_MCR_DIV(postDivider / 2U - 1U) | I2S_MCR_DIVEN_MASK; - } -#endif -#if FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER - uint16_t fract, divide; - uint32_t remaind = 0; - uint32_t current_remainder = 0xFFFFFFFFU; - uint16_t current_fract = 0; - uint16_t current_divide = 0; - uint32_t mul_freq = 0; - uint32_t max_fract = 256; - - /* Compute the max fract number */ - max_fract = targetFreq * 4096U / sourceFreq + 1U; - if (max_fract > 256U) - { - max_fract = 256U; - } - - /* Looking for the closet frequency */ - for (fract = 1; fract < max_fract; fract++) - { - mul_freq = sourceFreq * fract; - remaind = mul_freq % targetFreq; - divide = (uint16_t)(mul_freq / targetFreq); - - /* Find the exactly frequency */ - if (remaind == 0U) - { - current_fract = fract; - current_divide = (uint16_t)(mul_freq / targetFreq); - break; - } - - /* Closer to next one, set the closest to next data */ - if (remaind > mclk_Hz / 2U) - { - remaind = targetFreq - remaind; - divide += 1U; - } - - /* Update the closest div and fract */ - if (remaind < current_remainder) - { - current_fract = fract; - current_divide = divide; - current_remainder = remaind; - } - } - - /* Fill the computed fract and divider to registers */ - base->MDR = I2S_MDR_DIVIDE(current_divide - 1UL) | I2S_MDR_FRACT(current_fract - 1UL); - - /* Waiting for the divider updated */ - while ((base->MCR & I2S_MCR_DUF_MASK) != 0UL) - { - } -#endif -} -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ - -static uint32_t SAI_GetInstance(I2S_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_saiBases); instance++) - { - if (s_saiBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_saiBases)); - - return instance; -} - -static void SAI_WriteNonBlocking(I2S_Type *base, - uint32_t channel, - uint32_t channelMask, - uint32_t endChannel, - uint8_t bitWidth, - uint8_t *buffer, - uint32_t size) -{ - uint32_t i = 0, j = 0U; - uint8_t m = 0; - uint8_t bytesPerWord = bitWidth / 8U; - uint32_t data = 0; - uint32_t temp = 0; - - for (i = 0; i < size / bytesPerWord; i++) - { - for (j = channel; j <= endChannel; j++) - { - if (IS_SAI_FLAG_SET((1UL << j), channelMask)) - { - for (m = 0; m < bytesPerWord; m++) - { - temp = (uint32_t)(*buffer); - data |= (temp << (8U * m)); - buffer++; - } - base->TDR[j] = data; - data = 0; - } - } - } -} - -static void SAI_ReadNonBlocking(I2S_Type *base, - uint32_t channel, - uint32_t channelMask, - uint32_t endChannel, - uint8_t bitWidth, - uint8_t *buffer, - uint32_t size) -{ - uint32_t i = 0, j = 0; - uint8_t m = 0; - uint8_t bytesPerWord = bitWidth / 8U; - uint32_t data = 0; - - for (i = 0; i < size / bytesPerWord; i++) - { - for (j = channel; j <= endChannel; j++) - { - if (IS_SAI_FLAG_SET((1UL << j), channelMask)) - { - data = base->RDR[j]; - for (m = 0; m < bytesPerWord; m++) - { - *buffer = (uint8_t)(data >> (8U * m)) & 0xFFU; - buffer++; - } - } - } - } -} - -static void SAI_GetCommonConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask) -{ - assert(NULL != config); - assert(saiChannelMask != 0U); - - (void)memset(config, 0, sizeof(sai_transceiver_t)); - - config->channelMask = (uint8_t)saiChannelMask; - /* sync mode default configurations */ - config->syncMode = kSAI_ModeAsync; - - /* master mode default */ - config->masterSlave = kSAI_Master; - - /* bit default configurations */ - config->bitClock.bclkSrcSwap = false; - config->bitClock.bclkInputDelay = false; - config->bitClock.bclkPolarity = kSAI_SampleOnRisingEdge; - config->bitClock.bclkSource = kSAI_BclkSourceMclkDiv; - - /* frame sync default configurations */ - config->frameSync.frameSyncWidth = (uint8_t)bitWidth; - config->frameSync.frameSyncEarly = true; -#if defined(FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND) && FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND - config->frameSync.frameSyncGenerateOnDemand = false; -#endif - config->frameSync.frameSyncPolarity = kSAI_PolarityActiveLow; - - /* serial data default configurations */ -#if defined(FSL_FEATURE_SAI_HAS_CHANNEL_MODE) && FSL_FEATURE_SAI_HAS_CHANNEL_MODE - config->serialData.dataMode = kSAI_DataPinStateOutputZero; -#endif - config->serialData.dataOrder = kSAI_DataMSB; - config->serialData.dataWord0Length = (uint8_t)bitWidth; - config->serialData.dataWordLength = (uint8_t)bitWidth; - config->serialData.dataWordNLength = (uint8_t)bitWidth; - config->serialData.dataFirstBitShifted = (uint8_t)bitWidth; - config->serialData.dataWordNum = 2U; - config->serialData.dataMaskedWord = (uint32_t)mode; - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* fifo configurations */ - config->fifo.fifoWatermark = (uint8_t)((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT / 2U); -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - config->fifo.fifoContinueOneError = true; -#endif -} - -/*! - * brief Initializes the SAI Tx peripheral. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_Init - * - * Ungates the SAI clock, resets the module, and configures SAI Tx with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SAI_TxGetDefaultConfig(). - * - * note This API should be called at the beginning of the application to use - * the SAI driver. Otherwise, accessing the SAIM module can cause a hard fault - * because the clock is not enabled. - * - * param base SAI base pointer - * param config SAI configuration structure. - */ -void SAI_TxInit(I2S_Type *base, const sai_config_t *config) -{ - uint32_t val = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the SAI clock */ - (void)CLOCK_EnableClock(s_saiClock[SAI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - /* Master clock source setting */ - val = (base->MCR & ~I2S_MCR_MICS_MASK); - base->MCR = (val | I2S_MCR_MICS(config->mclkSource)); -#endif - - /* Configure Master clock output enable */ - val = (base->MCR & ~I2S_MCR_MOE_MASK); - base->MCR = (val | I2S_MCR_MOE(config->mclkOutputEnable)); -#endif /* FSL_FEATURE_SAI_HAS_MCR */ - - SAI_TxReset(base); - - /* Configure audio protocol */ - if (config->protocol == kSAI_BusLeftJustified) - { - base->TCR2 |= I2S_TCR2_BCP_MASK; - base->TCR3 &= ~I2S_TCR3_WDFL_MASK; - base->TCR4 = I2S_TCR4_MF(1U) | I2S_TCR4_SYWD(31U) | I2S_TCR4_FSE(0U) | I2S_TCR4_FSP(0U) | I2S_TCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusRightJustified) - { - base->TCR2 |= I2S_TCR2_BCP_MASK; - base->TCR3 &= ~I2S_TCR3_WDFL_MASK; - base->TCR4 = I2S_TCR4_MF(1U) | I2S_TCR4_SYWD(31U) | I2S_TCR4_FSE(0U) | I2S_TCR4_FSP(0U) | I2S_TCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusI2S) - { - base->TCR2 |= I2S_TCR2_BCP_MASK; - base->TCR3 &= ~I2S_TCR3_WDFL_MASK; - base->TCR4 = I2S_TCR4_MF(1U) | I2S_TCR4_SYWD(31U) | I2S_TCR4_FSE(1U) | I2S_TCR4_FSP(1U) | I2S_TCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusPCMA) - { - base->TCR2 &= ~I2S_TCR2_BCP_MASK; - base->TCR3 &= ~I2S_TCR3_WDFL_MASK; - base->TCR4 = I2S_TCR4_MF(1U) | I2S_TCR4_SYWD(0U) | I2S_TCR4_FSE(1U) | I2S_TCR4_FSP(0U) | I2S_TCR4_FRSZ(1U); - } - else - { - base->TCR2 &= ~I2S_TCR2_BCP_MASK; - base->TCR3 &= ~I2S_TCR3_WDFL_MASK; - base->TCR4 = I2S_TCR4_MF(1U) | I2S_TCR4_SYWD(0U) | I2S_TCR4_FSE(0U) | I2S_TCR4_FSP(0U) | I2S_TCR4_FRSZ(1U); - } - - /* Set master or slave */ - if (config->masterSlave == kSAI_Master) - { - base->TCR2 |= I2S_TCR2_BCD_MASK; - base->TCR4 |= I2S_TCR4_FSD_MASK; - - /* Bit clock source setting */ - val = base->TCR2 & (~I2S_TCR2_MSEL_MASK); - base->TCR2 = (val | I2S_TCR2_MSEL(config->bclkSource)); - } - else - { - base->TCR2 &= ~I2S_TCR2_BCD_MASK; - base->TCR4 &= ~I2S_TCR4_FSD_MASK; - } - - /* Set Sync mode */ - if (config->syncMode == kSAI_ModeAsync) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(0U)); - } - if (config->syncMode == kSAI_ModeSync) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(1U)); - /* If sync with Rx, should set Rx to async mode */ - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(0U)); - } -#if defined(FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) && (FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) - if (config->syncMode == kSAI_ModeSyncWithOtherTx) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(2U)); - } - if (config->syncMode == kSAI_ModeSyncWithOtherRx) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(3U)); - } -#endif /* FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI */ - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - SAI_TxSetFIFOErrorContinue(base, true); -#endif /* FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR */ -} - -/*! - * brief Initializes the SAI Rx peripheral. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_Init - * - * Ungates the SAI clock, resets the module, and configures the SAI Rx with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SAI_RxGetDefaultConfig(). - * - * note This API should be called at the beginning of the application to use - * the SAI driver. Otherwise, accessing the SAI module can cause a hard fault - * because the clock is not enabled. - * - * param base SAI base pointer - * param config SAI configuration structure. - */ -void SAI_RxInit(I2S_Type *base, const sai_config_t *config) -{ - uint32_t val = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable SAI clock first. */ - (void)CLOCK_EnableClock(s_saiClock[SAI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - /* Master clock source setting */ - val = (base->MCR & ~I2S_MCR_MICS_MASK); - base->MCR = (val | I2S_MCR_MICS(config->mclkSource)); -#endif - - /* Configure Master clock output enable */ - val = (base->MCR & ~I2S_MCR_MOE_MASK); - base->MCR = (val | I2S_MCR_MOE(config->mclkOutputEnable)); -#endif /* FSL_FEATURE_SAI_HAS_MCR */ - - SAI_RxReset(base); - - /* Configure audio protocol */ - if (config->protocol == kSAI_BusLeftJustified) - { - base->RCR2 |= I2S_RCR2_BCP_MASK; - base->RCR3 &= ~I2S_RCR3_WDFL_MASK; - base->RCR4 = I2S_RCR4_MF(1U) | I2S_RCR4_SYWD(31U) | I2S_RCR4_FSE(0U) | I2S_RCR4_FSP(0U) | I2S_RCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusRightJustified) - { - base->RCR2 |= I2S_RCR2_BCP_MASK; - base->RCR3 &= ~I2S_RCR3_WDFL_MASK; - base->RCR4 = I2S_RCR4_MF(1U) | I2S_RCR4_SYWD(31U) | I2S_RCR4_FSE(0U) | I2S_RCR4_FSP(0U) | I2S_RCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusI2S) - { - base->RCR2 |= I2S_RCR2_BCP_MASK; - base->RCR3 &= ~I2S_RCR3_WDFL_MASK; - base->RCR4 = I2S_RCR4_MF(1U) | I2S_RCR4_SYWD(31U) | I2S_RCR4_FSE(1U) | I2S_RCR4_FSP(1U) | I2S_RCR4_FRSZ(1U); - } - else if (config->protocol == kSAI_BusPCMA) - { - base->RCR2 &= ~I2S_RCR2_BCP_MASK; - base->RCR3 &= ~I2S_RCR3_WDFL_MASK; - base->RCR4 = I2S_RCR4_MF(1U) | I2S_RCR4_SYWD(0U) | I2S_RCR4_FSE(1U) | I2S_RCR4_FSP(0U) | I2S_RCR4_FRSZ(1U); - } - else - { - base->RCR2 &= ~I2S_RCR2_BCP_MASK; - base->RCR3 &= ~I2S_RCR3_WDFL_MASK; - base->RCR4 = I2S_RCR4_MF(1U) | I2S_RCR4_SYWD(0U) | I2S_RCR4_FSE(0U) | I2S_RCR4_FSP(0U) | I2S_RCR4_FRSZ(1U); - } - - /* Set master or slave */ - if (config->masterSlave == kSAI_Master) - { - base->RCR2 |= I2S_RCR2_BCD_MASK; - base->RCR4 |= I2S_RCR4_FSD_MASK; - - /* Bit clock source setting */ - val = base->RCR2 & (~I2S_RCR2_MSEL_MASK); - base->RCR2 = (val | I2S_RCR2_MSEL(config->bclkSource)); - } - else - { - base->RCR2 &= ~I2S_RCR2_BCD_MASK; - base->RCR4 &= ~I2S_RCR4_FSD_MASK; - } - - /* Set Sync mode */ - if (config->syncMode == kSAI_ModeAsync) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(0U)); - } - if (config->syncMode == kSAI_ModeSync) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(1U)); - /* If sync with Tx, should set Tx to async mode */ - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(0U)); - } -#if defined(FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) && (FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) - if (config->syncMode == kSAI_ModeSyncWithOtherTx) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(2U)); - } - if (config->syncMode == kSAI_ModeSyncWithOtherRx) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(3U)); - } -#endif /* FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI */ - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - SAI_RxSetFIFOErrorContinue(base, true); -#endif /* FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR */ -} - -/*! - * brief Initializes the SAI peripheral. - * - * This API gates the SAI clock. The SAI module can't operate unless SAI_Init is called to enable the clock. - * - * param base SAI base pointer - */ -void SAI_Init(I2S_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the SAI clock */ - (void)CLOCK_EnableClock(s_saiClock[SAI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* disable interrupt and DMA request*/ - base->TCSR &= - ~(I2S_TCSR_FRIE_MASK | I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK | I2S_TCSR_FRDE_MASK | I2S_TCSR_FWDE_MASK); - base->RCSR &= - ~(I2S_RCSR_FRIE_MASK | I2S_RCSR_FWIE_MASK | I2S_RCSR_FEIE_MASK | I2S_RCSR_FRDE_MASK | I2S_RCSR_FWDE_MASK); -#else - /* disable interrupt and DMA request*/ - base->TCSR &= ~(I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK | I2S_TCSR_FWDE_MASK); - base->RCSR &= ~(I2S_RCSR_FWIE_MASK | I2S_RCSR_FEIE_MASK | I2S_RCSR_FWDE_MASK); -#endif -} - -/*! - * brief De-initializes the SAI peripheral. - * - * This API gates the SAI clock. The SAI module can't operate unless SAI_TxInit - * or SAI_RxInit is called to enable the clock. - * - * param base SAI base pointer - */ -void SAI_Deinit(I2S_Type *base) -{ - SAI_TxEnable(base, false); - SAI_RxEnable(base, false); -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - (void)CLOCK_DisableClock(s_saiClock[SAI_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Sets the SAI Tx configuration structure to default values. - * - * deprecated Do not use this function. It has been superceded by @ref - * SAI_GetClassicI2SConfig, SAI_GetLeftJustifiedConfig,SAI_GetRightJustifiedConfig, SAI_GetDSPConfig,SAI_GetTDMConfig - * - * This API initializes the configuration structure for use in SAI_TxConfig(). - * The initialized structure can remain unchanged in SAI_TxConfig(), or it can be modified - * before calling SAI_TxConfig(). - * This is an example. - code - sai_config_t config; - SAI_TxGetDefaultConfig(&config); - endcode - * - * param config pointer to master configuration structure - */ -void SAI_TxGetDefaultConfig(sai_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->bclkSource = kSAI_BclkSourceMclkDiv; - config->masterSlave = kSAI_Master; -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) - config->mclkOutputEnable = true; -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - config->mclkSource = kSAI_MclkSourceSysclk; -#endif -#endif /* FSL_FEATURE_SAI_HAS_MCR */ - config->protocol = kSAI_BusI2S; - config->syncMode = kSAI_ModeAsync; -} - -/*! - * brief Sets the SAI Rx configuration structure to default values. - * - * deprecated Do not use this function. It has been superceded by @ref - * SAI_GetClassicI2SConfig,SAI_GetLeftJustifiedConfig,SAI_GetRightJustifiedConfig,SAI_GetDSPConfig,SAI_GetTDMConfig - * - * This API initializes the configuration structure for use in SAI_RxConfig(). - * The initialized structure can remain unchanged in SAI_RxConfig() or it can be modified - * before calling SAI_RxConfig(). - * This is an example. - code - sai_config_t config; - SAI_RxGetDefaultConfig(&config); - endcode - * - * param config pointer to master configuration structure - */ -void SAI_RxGetDefaultConfig(sai_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->bclkSource = kSAI_BclkSourceMclkDiv; - config->masterSlave = kSAI_Master; -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) - config->mclkOutputEnable = true; -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - config->mclkSource = kSAI_MclkSourceSysclk; -#endif -#endif /* FSL_FEATURE_SAI_HAS_MCR */ - config->protocol = kSAI_BusI2S; - config->syncMode = kSAI_ModeSync; -} - -/*! - * brief Resets the SAI Tx. - * - * This function enables the software reset and FIFO reset of SAI Tx. After reset, clear the reset bit. - * - * param base SAI base pointer - */ -void SAI_TxReset(I2S_Type *base) -{ - /* Set the software reset and FIFO reset to clear internal state */ - base->TCSR = I2S_TCSR_SR_MASK | I2S_TCSR_FR_MASK; - - /* Clear software reset bit, this should be done by software */ - base->TCSR &= ~I2S_TCSR_SR_MASK; - - /* Reset all Tx register values */ - base->TCR2 = 0; - base->TCR3 = 0; - base->TCR4 = 0; - base->TCR5 = 0; - base->TMR = 0; -} - -/*! - * brief Resets the SAI Rx. - * - * This function enables the software reset and FIFO reset of SAI Rx. After reset, clear the reset bit. - * - * param base SAI base pointer - */ -void SAI_RxReset(I2S_Type *base) -{ - /* Set the software reset and FIFO reset to clear internal state */ - base->RCSR = I2S_RCSR_SR_MASK | I2S_RCSR_FR_MASK; - - /* Clear software reset bit, this should be done by software */ - base->RCSR &= ~I2S_RCSR_SR_MASK; - - /* Reset all Rx register values */ - base->RCR2 = 0; - base->RCR3 = 0; - base->RCR4 = 0; - base->RCR5 = 0; - base->RMR = 0; -} - -/*! - * brief Enables/disables the SAI Tx. - * - * param base SAI base pointer - * param enable True means enable SAI Tx, false means disable. - */ -void SAI_TxEnable(I2S_Type *base, bool enable) -{ - if (enable) - { - /* If clock is sync with Rx, should enable RE bit. */ - if (((base->TCR2 & I2S_TCR2_SYNC_MASK) >> I2S_TCR2_SYNC_SHIFT) == 0x1U) - { - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | I2S_RCSR_RE_MASK); - } - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | I2S_TCSR_TE_MASK); - /* Also need to clear the FIFO error flag before start */ - SAI_TxClearStatusFlags(base, kSAI_FIFOErrorFlag); - } - else - { - /* If Rx not in sync with Tx, then disable Tx, otherwise, shall not disable Tx */ - if (((base->RCR2 & I2S_RCR2_SYNC_MASK) >> I2S_RCR2_SYNC_SHIFT) != 0x1U) - { - /* Disable TE bit */ - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~I2S_TCSR_TE_MASK)); - } - } -} - -/*! - * brief Enables/disables the SAI Rx. - * - * param base SAI base pointer - * param enable True means enable SAI Rx, false means disable. - */ -void SAI_RxEnable(I2S_Type *base, bool enable) -{ - if (enable) - { - /* If clock is sync with Tx, should enable TE bit. */ - if (((base->RCR2 & I2S_RCR2_SYNC_MASK) >> I2S_RCR2_SYNC_SHIFT) == 0x1U) - { - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | I2S_TCSR_TE_MASK); - } - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | I2S_RCSR_RE_MASK); - /* Also need to clear the FIFO error flag before start */ - SAI_RxClearStatusFlags(base, kSAI_FIFOErrorFlag); - } - else - { - /* If Tx not in sync with Rx, then disable Rx, otherwise, shall not disable Rx */ - if (((base->TCR2 & I2S_TCR2_SYNC_MASK) >> I2S_TCR2_SYNC_SHIFT) != 0x1U) - { - /* Disable RE bit */ - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~I2S_RCSR_RE_MASK)); - } - } -} - -/*! - * brief Do software reset or FIFO reset . - * - * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0. - * Software reset means clear the Tx internal logic, including the bit clock, frame count etc. But software - * reset will not clear any configuration registers like TCR1~TCR5. - * This function will also clear all the error flags such as FIFO error, sync error etc. - * - * param base SAI base pointer - * param type Reset type, FIFO reset or software reset - */ -void SAI_TxSoftwareReset(I2S_Type *base, sai_reset_type_t type) -{ - base->TCSR |= (uint32_t)type; - - /* Clear the software reset */ - base->TCSR &= ~I2S_TCSR_SR_MASK; -} - -/*! - * brief Do software reset or FIFO reset . - * - * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0. - * Software reset means clear the Rx internal logic, including the bit clock, frame count etc. But software - * reset will not clear any configuration registers like RCR1~RCR5. - * This function will also clear all the error flags such as FIFO error, sync error etc. - * - * param base SAI base pointer - * param type Reset type, FIFO reset or software reset - */ -void SAI_RxSoftwareReset(I2S_Type *base, sai_reset_type_t type) -{ - base->RCSR |= (uint32_t)type; - - /* Clear the software reset */ - base->RCSR &= ~I2S_RCSR_SR_MASK; -} - -/*! - * brief Set the Tx channel FIFO enable mask. - * - * param base SAI base pointer - * param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled, - * 3 means both channel 0 and channel 1 enabled. - */ -void SAI_TxSetChannelFIFOMask(I2S_Type *base, uint8_t mask) -{ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; - base->TCR3 |= I2S_TCR3_TCE(mask); -} - -/*! - * brief Set the Rx channel FIFO enable mask. - * - * param base SAI base pointer - * param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled, - * 3 means both channel 0 and channel 1 enabled. - */ -void SAI_RxSetChannelFIFOMask(I2S_Type *base, uint8_t mask) -{ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; - base->RCR3 |= I2S_RCR3_RCE(mask); -} - -/*! - * brief Set the Tx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_TxSetDataOrder(I2S_Type *base, sai_data_order_t order) -{ - uint32_t val = (base->TCR4) & (~I2S_TCR4_MF_MASK); - - val |= I2S_TCR4_MF(order); - base->TCR4 = val; -} - -/*! - * brief Set the Rx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_RxSetDataOrder(I2S_Type *base, sai_data_order_t order) -{ - uint32_t val = (base->RCR4) & (~I2S_RCR4_MF_MASK); - - val |= I2S_RCR4_MF(order); - base->RCR4 = val; -} - -/*! - * brief Set the Tx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_TxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity) -{ - uint32_t val = (base->TCR2) & (~I2S_TCR2_BCP_MASK); - - val |= I2S_TCR2_BCP(polarity); - base->TCR2 = val; -} - -/*! - * brief Set the Rx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_RxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity) -{ - uint32_t val = (base->RCR2) & (~I2S_RCR2_BCP_MASK); - - val |= I2S_RCR2_BCP(polarity); - base->RCR2 = val; -} - -/*! - * brief Set the Tx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_TxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity) -{ - uint32_t val = (base->TCR4) & (~I2S_TCR4_FSP_MASK); - - val |= I2S_TCR4_FSP(polarity); - base->TCR4 = val; -} - -/*! - * brief Set the Rx data order. - * - * param base SAI base pointer - * param order Data order MSB or LSB - */ -void SAI_RxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity) -{ - uint32_t val = (base->RCR4) & (~I2S_RCR4_FSP_MASK); - - val |= I2S_RCR4_FSP(polarity); - base->RCR4 = val; -} - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING -/*! - * brief Set Tx FIFO packing feature. - * - * param base SAI base pointer. - * param pack FIFO pack type. It is element of sai_fifo_packing_t. - */ -void SAI_TxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack) -{ - uint32_t val = base->TCR4; - - val &= ~I2S_TCR4_FPACK_MASK; - val |= I2S_TCR4_FPACK(pack); - base->TCR4 = val; -} - -/*! - * brief Set Rx FIFO packing feature. - * - * param base SAI base pointer. - * param pack FIFO pack type. It is element of sai_fifo_packing_t. - */ -void SAI_RxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack) -{ - uint32_t val = base->RCR4; - - val &= ~I2S_RCR4_FPACK_MASK; - val |= I2S_RCR4_FPACK(pack); - base->RCR4 = val; -} -#endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */ - -/*! - * brief Transmitter bit clock rate configurations. - * - * param base SAI base pointer. - * param sourceClockHz, bit clock source frequency. - * param sampleRate audio data sample rate. - * param bitWidth, audio data bitWidth. - * param channelNumbers, audio channel numbers. - */ -void SAI_TxSetBitClockRate( - I2S_Type *base, uint32_t sourceClockHz, uint32_t sampleRate, uint32_t bitWidth, uint32_t channelNumbers) -{ - uint32_t tcr2 = base->TCR2; - uint32_t bitClockDiv = 0; - uint32_t bitClockFreq = sampleRate * bitWidth * channelNumbers; - - assert(sourceClockHz >= bitClockFreq); - - tcr2 &= ~I2S_TCR2_DIV_MASK; - /* need to check the divided bclk, if bigger than target, then divider need to re-calculate. */ - bitClockDiv = sourceClockHz / bitClockFreq; - /* for the condition where the source clock is smaller than target bclk */ - if (bitClockDiv == 0U) - { - bitClockDiv++; - } - /* recheck the divider if properly or not, to make sure output blck not bigger than target*/ - if ((sourceClockHz / bitClockDiv) > bitClockFreq) - { - bitClockDiv++; - } - -#if defined(FSL_FEATURE_SAI_HAS_BCLK_BYPASS) && (FSL_FEATURE_SAI_HAS_BCLK_BYPASS) - /* if bclk same with MCLK, bypass the divider */ - if (bitClockDiv == 1U) - { - tcr2 |= I2S_TCR2_BYP_MASK; - } - else -#endif - { - tcr2 |= I2S_TCR2_DIV(bitClockDiv / 2U - 1UL); - } - - base->TCR2 = tcr2; -} - -/*! - * brief Receiver bit clock rate configurations. - * - * param base SAI base pointer. - * param sourceClockHz, bit clock source frequency. - * param sampleRate audio data sample rate. - * param bitWidth, audio data bitWidth. - * param channelNumbers, audio channel numbers. - */ -void SAI_RxSetBitClockRate( - I2S_Type *base, uint32_t sourceClockHz, uint32_t sampleRate, uint32_t bitWidth, uint32_t channelNumbers) -{ - uint32_t rcr2 = base->RCR2; - uint32_t bitClockDiv = 0; - uint32_t bitClockFreq = sampleRate * bitWidth * channelNumbers; - - assert(sourceClockHz >= bitClockFreq); - - rcr2 &= ~I2S_RCR2_DIV_MASK; - /* need to check the divided bclk, if bigger than target, then divider need to re-calculate. */ - bitClockDiv = sourceClockHz / bitClockFreq; - /* for the condition where the source clock is smaller than target bclk */ - if (bitClockDiv == 0U) - { - bitClockDiv++; - } - /* recheck the divider if properly or not, to make sure output blck not bigger than target*/ - if ((sourceClockHz / bitClockDiv) > bitClockFreq) - { - bitClockDiv++; - } - -#if defined(FSL_FEATURE_SAI_HAS_BCLK_BYPASS) && (FSL_FEATURE_SAI_HAS_BCLK_BYPASS) - /* if bclk same with MCLK, bypass the divider */ - if (bitClockDiv == 1U) - { - rcr2 |= I2S_RCR2_BYP_MASK; - } - else -#endif - { - rcr2 |= I2S_RCR2_DIV(bitClockDiv / 2U - 1UL); - } - - base->RCR2 = rcr2; -} - -/*! - * brief Transmitter Bit clock configurations. - * - * param base SAI base pointer. - * param masterSlave master or slave. - * param config bit clock other configurations, can be NULL in slave mode. - */ -void SAI_TxSetBitclockConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_bit_clock_t *config) -{ - uint32_t tcr2 = base->TCR2; - - if ((masterSlave == kSAI_Master) || (masterSlave == kSAI_Bclk_Master_FrameSync_Slave)) - { - assert(config != NULL); - - tcr2 &= ~(I2S_TCR2_BCD_MASK | I2S_TCR2_BCP_MASK | I2S_TCR2_BCI_MASK | I2S_TCR2_BCS_MASK | I2S_TCR2_MSEL_MASK); - tcr2 |= I2S_TCR2_BCD(1U) | I2S_TCR2_BCP(config->bclkPolarity) | I2S_TCR2_BCI(config->bclkInputDelay) | - I2S_TCR2_BCS(config->bclkSrcSwap) | I2S_TCR2_MSEL(config->bclkSource); - } - else - { - tcr2 &= ~(I2S_TCR2_BCD_MASK); - tcr2 |= I2S_TCR2_BCP(config->bclkPolarity); - } - - base->TCR2 = tcr2; -} - -/*! - * brief Receiver Bit clock configurations. - * - * param base SAI base pointer. - * param masterSlave master or slave. - * param config bit clock other configurations, can be NULL in slave mode. - */ -void SAI_RxSetBitclockConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_bit_clock_t *config) -{ - uint32_t rcr2 = base->RCR2; - - if ((masterSlave == kSAI_Master) || (masterSlave == kSAI_Bclk_Master_FrameSync_Slave)) - { - assert(config != NULL); - - rcr2 &= ~(I2S_RCR2_BCD_MASK | I2S_RCR2_BCP_MASK | I2S_RCR2_BCI_MASK | I2S_RCR2_BCS_MASK | I2S_RCR2_MSEL_MASK); - rcr2 |= I2S_RCR2_BCD(1U) | I2S_RCR2_BCP(config->bclkPolarity) | I2S_RCR2_BCI(config->bclkInputDelay) | - I2S_RCR2_BCS(config->bclkSrcSwap) | I2S_RCR2_MSEL(config->bclkSource); - } - else - { - rcr2 &= ~(I2S_RCR2_BCD_MASK); - rcr2 |= I2S_RCR2_BCP(config->bclkPolarity); - } - - base->RCR2 = rcr2; -} - -#if (defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) -/*! - * brief Master clock configurations. - * - * param base SAI base pointer. - * param config master clock configurations. - */ -void SAI_SetMasterClockConfig(I2S_Type *base, sai_master_clock_t *config) -{ - assert(config != NULL); - -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) - uint32_t val = 0; -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - /* Master clock source setting */ - val = (base->MCR & ~I2S_MCR_MICS_MASK); - base->MCR = (val | I2S_MCR_MICS(config->mclkSource)); -#endif - - /* Configure Master clock output enable */ - val = (base->MCR & ~I2S_MCR_MOE_MASK); - base->MCR = (val | I2S_MCR_MOE(config->mclkOutputEnable)); -#endif /* FSL_FEATURE_SAI_HAS_MCR */ - -#if ((defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV) && (FSL_FEATURE_SAI_HAS_MCR_MCLK_POST_DIV))) - /* Check if master clock divider enabled, then set master clock divider */ - if (config->mclkOutputEnable) - { - SAI_SetMasterClockDivider(base, config->mclkHz, config->mclkSourceClkHz); - } -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ -} -#endif - -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE -/*! - * brief SAI transmitter fifo configurations. - * - * param base SAI base pointer. - * param config fifo configurations. - */ -void SAI_TxSetFifoConfig(I2S_Type *base, sai_fifo_t *config) -{ - assert(config != NULL); -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - assert(config->fifoWatermark <= (I2S_TCR1_TFW_MASK >> I2S_TCR1_TFW_SHIFT)); -#endif - - uint32_t tcr4 = base->TCR4; - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE - tcr4 &= ~I2S_TCR4_FCOMB_MASK; - tcr4 |= I2S_TCR4_FCOMB(config->fifoCombine); -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - tcr4 &= ~I2S_TCR4_FCONT_MASK; - /* ERR05144: not set FCONT = 1 when TMR > 0, the transmit shift register may not load correctly that will cause TX - * not work */ - if (base->TMR == 0U) - { - tcr4 |= I2S_TCR4_FCONT(config->fifoContinueOneError); - } -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING - tcr4 &= ~I2S_TCR4_FPACK_MASK; - tcr4 |= I2S_TCR4_FPACK(config->fifoPacking); -#endif - - base->TCR4 = tcr4; - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - base->TCR1 = (base->TCR1 & (~I2S_TCR1_TFW_MASK)) | I2S_TCR1_TFW(config->fifoWatermark); -#endif -} - -/*! - * brief SAI receiver fifo configurations. - * - * param base SAI base pointer. - * param config fifo configurations. - */ -void SAI_RxSetFifoConfig(I2S_Type *base, sai_fifo_t *config) -{ - assert(config != NULL); -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - assert(config->fifoWatermark <= (I2S_TCR1_TFW_MASK >> I2S_TCR1_TFW_SHIFT)); -#endif - uint32_t rcr4 = base->RCR4; - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE - rcr4 &= ~I2S_RCR4_FCOMB_MASK; - rcr4 |= I2S_RCR4_FCOMB(config->fifoCombine); -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - rcr4 &= ~I2S_RCR4_FCONT_MASK; - rcr4 |= I2S_RCR4_FCONT(config->fifoContinueOneError); -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING - rcr4 &= ~I2S_RCR4_FPACK_MASK; - rcr4 |= I2S_RCR4_FPACK(config->fifoPacking); -#endif - - base->RCR4 = rcr4; - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - base->RCR1 = (base->RCR1 & (~I2S_RCR1_RFW_MASK)) | I2S_RCR1_RFW(config->fifoWatermark); -#endif -} -#endif - -/*! - * brief SAI transmitter Frame sync configurations. - * - * param base SAI base pointer. - * param masterSlave master or slave. - * param config frame sync configurations, can be NULL in slave mode. - */ -void SAI_TxSetFrameSyncConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_frame_sync_t *config) -{ - assert(config != NULL); - assert((config->frameSyncWidth - 1UL) <= (I2S_TCR4_SYWD_MASK >> I2S_TCR4_SYWD_SHIFT)); - - uint32_t tcr4 = base->TCR4; - - tcr4 &= ~(I2S_TCR4_FSE_MASK | I2S_TCR4_FSP_MASK | I2S_TCR4_FSD_MASK | I2S_TCR4_SYWD_MASK); - -#if defined(FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND) && FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND - tcr4 &= ~I2S_TCR4_ONDEM_MASK; - tcr4 |= I2S_TCR4_ONDEM(config->frameSyncGenerateOnDemand); -#endif - - tcr4 |= - I2S_TCR4_FSE(config->frameSyncEarly) | I2S_TCR4_FSP(config->frameSyncPolarity) | - I2S_TCR4_FSD(((masterSlave == kSAI_Master) || (masterSlave == kSAI_Bclk_Slave_FrameSync_Master)) ? 1UL : 0U) | - I2S_TCR4_SYWD(config->frameSyncWidth - 1UL); - - base->TCR4 = tcr4; -} - -/*! - * brief SAI receiver Frame sync configurations. - * - * param base SAI base pointer. - * param masterSlave master or slave. - * param config frame sync configurations, can be NULL in slave mode. - */ -void SAI_RxSetFrameSyncConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_frame_sync_t *config) -{ - assert(config != NULL); - assert((config->frameSyncWidth - 1UL) <= (I2S_RCR4_SYWD_MASK >> I2S_RCR4_SYWD_SHIFT)); - - uint32_t rcr4 = base->RCR4; - - rcr4 &= ~(I2S_RCR4_FSE_MASK | I2S_RCR4_FSP_MASK | I2S_RCR4_FSD_MASK | I2S_RCR4_SYWD_MASK); - -#if defined(FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND) && FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND - rcr4 &= ~I2S_RCR4_ONDEM_MASK; - rcr4 |= I2S_RCR4_ONDEM(config->frameSyncGenerateOnDemand); -#endif - - rcr4 |= - I2S_RCR4_FSE(config->frameSyncEarly) | I2S_RCR4_FSP(config->frameSyncPolarity) | - I2S_RCR4_FSD(((masterSlave == kSAI_Master) || (masterSlave == kSAI_Bclk_Slave_FrameSync_Master)) ? 1UL : 0U) | - I2S_RCR4_SYWD(config->frameSyncWidth - 1UL); - - base->RCR4 = rcr4; -} - -/*! - * brief SAI transmitter Serial data configurations. - * - * param base SAI base pointer. - * param config serial data configurations. - */ -void SAI_TxSetSerialDataConfig(I2S_Type *base, sai_serial_data_t *config) -{ - assert(config != NULL); - - uint32_t tcr4 = base->TCR4; - - base->TCR5 = I2S_TCR5_WNW(config->dataWordNLength - 1UL) | I2S_TCR5_W0W(config->dataWord0Length - 1UL) | - I2S_TCR5_FBT(config->dataFirstBitShifted - 1UL); - base->TMR = config->dataMaskedWord; -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - /* ERR05144: not set FCONT = 1 when TMR > 0, the transmit shift register may not load correctly that will cause TX - * not work */ - if (config->dataMaskedWord > 0U) - { - tcr4 &= ~I2S_TCR4_FCONT_MASK; - } -#endif - tcr4 &= ~(I2S_TCR4_FRSZ_MASK | I2S_TCR4_MF_MASK); - tcr4 |= I2S_TCR4_FRSZ(config->dataWordNum - 1UL) | I2S_TCR4_MF(config->dataOrder); - -#if defined(FSL_FEATURE_SAI_HAS_CHANNEL_MODE) && FSL_FEATURE_SAI_HAS_CHANNEL_MODE - tcr4 &= ~I2S_TCR4_CHMOD_MASK; - tcr4 |= I2S_TCR4_CHMOD(config->dataMode); -#endif - - base->TCR4 = tcr4; -} - -/*! - * @brief SAI receiver Serial data configurations. - * - * @param base SAI base pointer. - * @param config serial data configurations. - */ -void SAI_RxSetSerialDataConfig(I2S_Type *base, sai_serial_data_t *config) -{ - assert(config != NULL); - - uint32_t rcr4 = base->RCR4; - - base->RCR5 = I2S_RCR5_WNW(config->dataWordNLength - 1UL) | I2S_RCR5_W0W(config->dataWord0Length - 1UL) | - I2S_RCR5_FBT(config->dataFirstBitShifted - 1UL); - base->RMR = config->dataMaskedWord; - - rcr4 &= ~(I2S_RCR4_FRSZ_MASK | I2S_RCR4_MF_MASK); - rcr4 |= I2S_RCR4_FRSZ(config->dataWordNum - 1uL) | I2S_RCR4_MF(config->dataOrder); - - base->RCR4 = rcr4; -} - -/*! - * brief SAI transmitter configurations. - * - * param base SAI base pointer. - * param config transmitter configurations. - */ -void SAI_TxSetConfig(I2S_Type *base, sai_transceiver_t *config) -{ - assert(config != NULL); - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint8_t i = 0U; - uint32_t val = 0U; - uint8_t channelNums = 0U; - - /* reset transmitter */ - SAI_TxReset(base); - - /* if channel mask is not set, then format->channel must be set, - use it to get channel mask value */ - if (config->channelMask == 0U) - { - config->channelMask = 1U << config->startChannel; - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET(1UL << i, config->channelMask)) - { - channelNums++; - config->endChannel = i; - } - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), config->channelMask)) - { - config->startChannel = i; - break; - } - } - - config->channelNums = channelNums; -#if defined(FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) && (FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) - /* make sure combine mode disabled while multipe channel is used */ - if (config->channelNums > 1U) - { - base->TCR4 &= ~I2S_TCR4_FCOMB_MASK; - } -#endif - - /* Set data channel */ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; - base->TCR3 |= I2S_TCR3_TCE(config->channelMask); - - if (config->syncMode == kSAI_ModeAsync) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(0U)); - } - if (config->syncMode == kSAI_ModeSync) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(1U)); - /* If sync with Rx, should set Rx to async mode */ - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(0U)); - } -#if defined(FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) && (FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) - if (config->syncMode == kSAI_ModeSyncWithOtherTx) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(2U)); - } - if (config->syncMode == kSAI_ModeSyncWithOtherRx) - { - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(3U)); - } -#endif /* FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI */ - - /* bit clock configurations */ - SAI_TxSetBitclockConfig(base, config->masterSlave, &config->bitClock); - /* serial data configurations */ - SAI_TxSetSerialDataConfig(base, &config->serialData); - /* frame sync configurations */ - SAI_TxSetFrameSyncConfig(base, config->masterSlave, &config->frameSync); -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE - /* fifo configurations */ - SAI_TxSetFifoConfig(base, &config->fifo); -#endif -} - -/*! - * brief SAI transmitter transfer configurations. - * - * This function initializes the TX, include bit clock, frame sync, master clock, serial data and fifo configurations. - * - * param base SAI base pointer. - * param handle SAI handle pointer. - * param config tranmitter configurations. - */ -void SAI_TransferTxSetConfig(I2S_Type *base, sai_handle_t *handle, sai_transceiver_t *config) -{ - assert(handle != NULL); - assert(config != NULL); - assert(config->channelNums <= (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base)); - - handle->bitWidth = config->frameSync.frameSyncWidth; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->watermark = config->fifo.fifoWatermark; -#endif - - /* transmitter configurations */ - SAI_TxSetConfig(base, config); - - handle->channel = config->startChannel; - /* used for multi channel */ - handle->channelMask = config->channelMask; - handle->channelNums = config->channelNums; - handle->endChannel = config->endChannel; -} - -/*! - * brief SAI receiver configurations. - * - * param base SAI base pointer. - * param config transmitter configurations. - */ -void SAI_RxSetConfig(I2S_Type *base, sai_transceiver_t *config) -{ - assert(config != NULL); - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint8_t i = 0U; - uint32_t val = 0U; - uint8_t channelNums = 0U; - - /* reset receiver */ - SAI_RxReset(base); - - /* if channel mask is not set, then format->channel must be set, - use it to get channel mask value */ - if (config->channelMask == 0U) - { - config->channelMask = 1U << config->startChannel; - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), config->channelMask)) - { - channelNums++; - config->endChannel = i; - } - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), config->channelMask)) - { - config->startChannel = i; - break; - } - } - - config->channelNums = channelNums; -#if defined(FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) && (FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) - /* make sure combine mode disabled while multipe channel is used */ - if (config->channelNums > 1U) - { - base->RCR4 &= ~I2S_RCR4_FCOMB_MASK; - } -#endif - - /* Set data channel */ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; - base->RCR3 |= I2S_RCR3_RCE(config->channelMask); - - /* Set Sync mode */ - if (config->syncMode == kSAI_ModeAsync) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(0U)); - } - if (config->syncMode == kSAI_ModeSync) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(1U)); - /* If sync with Tx, should set Tx to async mode */ - val = base->TCR2; - val &= ~I2S_TCR2_SYNC_MASK; - base->TCR2 = (val | I2S_TCR2_SYNC(0U)); - } -#if defined(FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) && (FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) - if (config->syncMode == kSAI_ModeSyncWithOtherTx) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(2U)); - } - if (config->syncMode == kSAI_ModeSyncWithOtherRx) - { - val = base->RCR2; - val &= ~I2S_RCR2_SYNC_MASK; - base->RCR2 = (val | I2S_RCR2_SYNC(3U)); - } -#endif /* FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI */ - - /* bit clock configurations */ - SAI_RxSetBitclockConfig(base, config->masterSlave, &config->bitClock); - /* serial data configurations */ - SAI_RxSetSerialDataConfig(base, &config->serialData); - /* frame sync configurations */ - SAI_RxSetFrameSyncConfig(base, config->masterSlave, &config->frameSync); -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE - /* fifo configurations */ - SAI_RxSetFifoConfig(base, &config->fifo); -#endif -} - -/*! - * brief SAI receiver transfer configurations. - * - * This function initializes the TX, include bit clock, frame sync, master clock, serial data and fifo configurations. - * - * param base SAI base pointer. - * param handle SAI handle pointer. - * param config tranmitter configurations. - */ -void SAI_TransferRxSetConfig(I2S_Type *base, sai_handle_t *handle, sai_transceiver_t *config) -{ - assert(handle != NULL); - assert(config != NULL); - - handle->bitWidth = config->frameSync.frameSyncWidth; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->watermark = config->fifo.fifoWatermark; -#endif - - /* receiver configurations */ - SAI_RxSetConfig(base, config); - - handle->channel = config->startChannel; - /* used for multi channel */ - handle->channelMask = config->channelMask; - handle->channelNums = config->channelNums; - handle->endChannel = config->endChannel; -} - -/*! - * brief Get classic I2S mode configurations. - * - * param config transceiver configurations. - * param bitWidth audio data bitWidth. - * param mode audio data channel. - * param saiChannelMask channel mask value to enable. - */ -void SAI_GetClassicI2SConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask) -{ - SAI_GetCommonConfig(config, bitWidth, mode, saiChannelMask); -} - -/*! - * brief Get left justified mode configurations. - * - * param config transceiver configurations. - * param bitWidth audio data bitWidth. - * param mode audio data channel. - * param saiChannelMask channel mask value to enable. - */ -void SAI_GetLeftJustifiedConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask) -{ - assert(NULL != config); - assert(saiChannelMask != 0U); - - SAI_GetCommonConfig(config, bitWidth, mode, saiChannelMask); - - config->frameSync.frameSyncEarly = false; - config->frameSync.frameSyncPolarity = kSAI_PolarityActiveHigh; -} - -/*! - * brief Get right justified mode configurations. - * - * param config transceiver configurations. - * param bitWidth audio data bitWidth. - * param mode audio data channel. - * param saiChannelMask channel mask value to enable. - */ -void SAI_GetRightJustifiedConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask) -{ - assert(NULL != config); - assert(saiChannelMask != 0U); - - SAI_GetCommonConfig(config, bitWidth, mode, saiChannelMask); - - config->frameSync.frameSyncEarly = false; - config->frameSync.frameSyncPolarity = kSAI_PolarityActiveHigh; -} - -/*! - * brief Get DSP mode configurations. - * - * note DSP mode is also called PCM mode which support MODE A and MODE B, - * DSP/PCM MODE A configuration flow. RX is similiar but uses SAI_RxSetConfig instead of SAI_TxSetConfig: - * code - * SAI_GetDSPConfig(config, kSAI_FrameSyncLenOneBitClk, bitWidth, kSAI_Stereo, channelMask) - * config->frameSync.frameSyncEarly = true; - * SAI_TxSetConfig(base, config) - * endcode - * - * DSP/PCM MODE B configuration flow for TX. RX is similiar but uses SAI_RxSetConfig instead of SAI_TxSetConfig: - * code - * SAI_GetDSPConfig(config, kSAI_FrameSyncLenOneBitClk, bitWidth, kSAI_Stereo, channelMask) - * SAI_TxSetConfig(base, config) - * endcode - * - * param config transceiver configurations. - * param frameSyncWidth length of frame sync. - * param bitWidth audio data bitWidth. - * param mode audio data channel. - * param saiChannelMask mask value of the channel to enable. - */ -void SAI_GetDSPConfig(sai_transceiver_t *config, - sai_frame_sync_len_t frameSyncWidth, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask) -{ - assert(NULL != config); - assert(saiChannelMask != 0U); - - SAI_GetCommonConfig(config, bitWidth, mode, saiChannelMask); - - /* frame sync default configurations */ - switch (frameSyncWidth) - { - case kSAI_FrameSyncLenOneBitClk: - config->frameSync.frameSyncWidth = 1U; - break; - default: - assert(false); - break; - } - config->frameSync.frameSyncEarly = false; - config->frameSync.frameSyncPolarity = kSAI_PolarityActiveHigh; -} - -/*! - * brief Get TDM mode configurations. - * - * param config transceiver configurations. - * param bitWidth audio data bitWidth. - * param mode audio data channel. - * param saiChannelMask channel mask value to enable. - */ -void SAI_GetTDMConfig(sai_transceiver_t *config, - sai_frame_sync_len_t frameSyncWidth, - sai_word_width_t bitWidth, - uint32_t dataWordNum, - uint32_t saiChannelMask) -{ - assert(NULL != config); - assert(saiChannelMask != 0U); - assert(dataWordNum <= 32U); - - SAI_GetCommonConfig(config, bitWidth, kSAI_Stereo, saiChannelMask); - - /* frame sync default configurations */ - switch (frameSyncWidth) - { - case kSAI_FrameSyncLenOneBitClk: - config->frameSync.frameSyncWidth = 1U; - break; - case kSAI_FrameSyncLenPerWordWidth: - break; - default: - assert(false); - break; - } - config->frameSync.frameSyncEarly = false; - config->frameSync.frameSyncPolarity = kSAI_PolarityActiveHigh; - config->serialData.dataWordNum = (uint8_t)dataWordNum; -} - -/*! - * brief Configures the SAI Tx audio format. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_TxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * param base SAI base pointer. - * param format Pointer to the SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master - * clock, this value should equal the masterClockHz. - */ -void SAI_TxSetFormat(I2S_Type *base, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint32_t bclk = 0; - uint32_t val = 0; - uint8_t i = 0U, channelNums = 0U; - uint32_t divider = 0U; - - if (format->isFrameSyncCompact) - { - bclk = format->sampleRate_Hz * format->bitWidth * (format->stereo == kSAI_Stereo ? 2U : 1U); - val = (base->TCR4 & (~I2S_TCR4_SYWD_MASK)); - val |= I2S_TCR4_SYWD(format->bitWidth - 1U); - base->TCR4 = val; - } - else - { - bclk = format->sampleRate_Hz * 32U * 2U; - } - -/* Compute the mclk */ -#if defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) - /* Check if master clock divider enabled, then set master clock divider */ - if (IS_SAI_FLAG_SET(base->MCR, I2S_MCR_MOE_MASK)) - { - SAI_SetMasterClockDivider(base, format->masterClockHz, mclkSourceClockHz); - } -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ - - /* Set bclk if needed */ - if (IS_SAI_FLAG_SET(base->TCR2, I2S_TCR2_BCD_MASK)) - { - base->TCR2 &= ~I2S_TCR2_DIV_MASK; - /* need to check the divided bclk, if bigger than target, then divider need to re-calculate. */ - divider = bclkSourceClockHz / bclk; - /* for the condition where the source clock is smaller than target bclk */ - if (divider == 0U) - { - divider++; - } - /* recheck the divider if properly or not, to make sure output blck not bigger than target*/ - if ((bclkSourceClockHz / divider) > bclk) - { - divider++; - } - -#if defined(FSL_FEATURE_SAI_HAS_BCLK_BYPASS) && (FSL_FEATURE_SAI_HAS_BCLK_BYPASS) - /* if bclk same with MCLK, bypass the divider */ - if (divider == 1U) - { - base->TCR2 |= I2S_TCR2_BYP_MASK; - } - else -#endif - { - base->TCR2 |= I2S_TCR2_DIV(divider / 2U - 1U); - } - } - - /* Set bitWidth */ - val = (format->isFrameSyncCompact) ? (format->bitWidth - 1U) : 31U; - if (format->protocol == kSAI_BusRightJustified) - { - base->TCR5 = I2S_TCR5_WNW(val) | I2S_TCR5_W0W(val) | I2S_TCR5_FBT(val); - } - else - { - if (IS_SAI_FLAG_SET(base->TCR4, I2S_TCR4_MF_MASK)) - { - base->TCR5 = I2S_TCR5_WNW(val) | I2S_TCR5_W0W(val) | I2S_TCR5_FBT(format->bitWidth - 1UL); - } - else - { - base->TCR5 = I2S_TCR5_WNW(val) | I2S_TCR5_W0W(val) | I2S_TCR5_FBT(0); - } - } - - /* Set mono or stereo */ - base->TMR = (uint32_t)format->stereo; - - /* if channel mask is not set, then format->channel must be set, - use it to get channel mask value */ - if (format->channelMask == 0U) - { - format->channelMask = 1U << format->channel; - } - - /* if channel nums is not set, calculate it here according to channelMask*/ - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), format->channelMask)) - { - channelNums++; - format->endChannel = i; - } - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), format->channelMask)) - { - format->channel = i; - break; - } - } - - format->channelNums = channelNums; -#if defined(FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) && (FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) - /* make sure combine mode disabled while multipe channel is used */ - if (format->channelNums > 1U) - { - base->TCR4 &= ~I2S_TCR4_FCOMB_MASK; - } -#endif - - /* Set data channel */ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; - base->TCR3 |= I2S_TCR3_TCE(format->channelMask); - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Set watermark */ - base->TCR1 = format->watermark; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * brief Configures the SAI Rx audio format. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_RxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * param base SAI base pointer. - * param format Pointer to the SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master - * clock, this value should equal the masterClockHz. - */ -void SAI_RxSetFormat(I2S_Type *base, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint32_t bclk = 0; - uint32_t val = 0; - uint8_t i = 0U, channelNums = 0U; - uint32_t divider = 0U; - - if (format->isFrameSyncCompact) - { - bclk = format->sampleRate_Hz * format->bitWidth * (format->stereo == kSAI_Stereo ? 2U : 1U); - val = (base->RCR4 & (~I2S_RCR4_SYWD_MASK)); - val |= I2S_RCR4_SYWD(format->bitWidth - 1U); - base->RCR4 = val; - } - else - { - bclk = format->sampleRate_Hz * 32U * 2U; - } - -/* Compute the mclk */ -#if defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) - /* Check if master clock divider enabled */ - if (IS_SAI_FLAG_SET(base->MCR, I2S_MCR_MOE_MASK)) - { - SAI_SetMasterClockDivider(base, format->masterClockHz, mclkSourceClockHz); - } -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ - - /* Set bclk if needed */ - if (IS_SAI_FLAG_SET(base->RCR2, I2S_RCR2_BCD_MASK)) - { - base->RCR2 &= ~I2S_RCR2_DIV_MASK; - /* need to check the divided bclk, if bigger than target, then divider need to re-calculate. */ - divider = bclkSourceClockHz / bclk; - /* for the condition where the source clock is smaller than target bclk */ - if (divider == 0U) - { - divider++; - } - /* recheck the divider if properly or not, to make sure output blck not bigger than target*/ - if ((bclkSourceClockHz / divider) > bclk) - { - divider++; - } -#if defined(FSL_FEATURE_SAI_HAS_BCLK_BYPASS) && (FSL_FEATURE_SAI_HAS_BCLK_BYPASS) - /* if bclk same with MCLK, bypass the divider */ - if (divider == 1U) - { - base->RCR2 |= I2S_RCR2_BYP_MASK; - } - else -#endif - { - base->RCR2 |= I2S_RCR2_DIV(divider / 2U - 1U); - } - } - - /* Set bitWidth */ - val = (format->isFrameSyncCompact) ? (format->bitWidth - 1U) : 31U; - if (format->protocol == kSAI_BusRightJustified) - { - base->RCR5 = I2S_RCR5_WNW(val) | I2S_RCR5_W0W(val) | I2S_RCR5_FBT(val); - } - else - { - if (IS_SAI_FLAG_SET(base->RCR4, I2S_RCR4_MF_MASK)) - { - base->RCR5 = I2S_RCR5_WNW(val) | I2S_RCR5_W0W(val) | I2S_RCR5_FBT(format->bitWidth - 1UL); - } - else - { - base->RCR5 = I2S_RCR5_WNW(val) | I2S_RCR5_W0W(val) | I2S_RCR5_FBT(0UL); - } - } - - /* Set mono or stereo */ - base->RMR = (uint32_t)format->stereo; - - /* if channel mask is not set, then format->channel must be set, - use it to get channel mask value */ - if (format->channelMask == 0U) - { - format->channelMask = 1U << format->channel; - } - - /* if channel nums is not set, calculate it here according to channelMask*/ - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), format->channelMask)) - { - channelNums++; - format->endChannel = i; - } - } - - for (i = 0U; i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), format->channelMask)) - { - format->channel = i; - break; - } - } - - format->channelNums = channelNums; - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) && (FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE) - /* make sure combine mode disabled while multipe channel is used */ - if (format->channelNums > 1U) - { - base->RCR4 &= ~I2S_RCR4_FCOMB_MASK; - } -#endif - - /* Set data channel */ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; - /* enable all the channel */ - base->RCR3 |= I2S_RCR3_RCE(format->channelMask); - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Set watermark */ - base->RCR1 = format->watermark; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * brief Sends data using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SAI base pointer. - * param channel Data channel used. - * param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * param buffer Pointer to the data to be written. - * param size Bytes to be written. - */ -void SAI_WriteBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size) -{ - uint32_t i = 0; - uint32_t bytesPerWord = bitWidth / 8U; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - bytesPerWord = (((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT - base->TCR1) * bytesPerWord); -#endif - - while (i < size) - { - /* Wait until it can write data */ - while (!(IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FWF_MASK))) - { - } - - SAI_WriteNonBlocking(base, channel, 1UL << channel, channel, (uint8_t)bitWidth, buffer, bytesPerWord); - buffer = (uint8_t *)((uint32_t)buffer + bytesPerWord); - i += bytesPerWord; - } - - /* Wait until the last data is sent */ - while (!(IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FWF_MASK))) - { - } -} - -/*! - * brief Sends data to multi channel using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SAI base pointer. - * param channel Data channel used. - * param channelMask channel mask. - * param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * param buffer Pointer to the data to be written. - * param size Bytes to be written. - */ -void SAI_WriteMultiChannelBlocking( - I2S_Type *base, uint32_t channel, uint32_t channelMask, uint32_t bitWidth, uint8_t *buffer, uint32_t size) -{ - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint32_t i = 0, j = 0; - uint32_t bytesPerWord = bitWidth / 8U; - uint32_t channelNums = 0U, endChannel = 0U; - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - bytesPerWord = (((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT - base->TCR1) * bytesPerWord); -#endif - - for (i = 0U; (i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base)); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), channelMask)) - { - channelNums++; - endChannel = i; - } - } - - bytesPerWord *= channelNums; - - while (j < size) - { - /* Wait until it can write data */ - while (!(IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FWF_MASK))) - { - } - - SAI_WriteNonBlocking(base, channel, channelMask, endChannel, (uint8_t)bitWidth, buffer, - bytesPerWord * channelNums); - buffer = (uint8_t *)((uint32_t)buffer + bytesPerWord * channelNums); - j += bytesPerWord * channelNums; - } - - /* Wait until the last data is sent */ - while (!(IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FWF_MASK))) - { - } -} - -/*! - * brief Receives multi channel data using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SAI base pointer. - * param channel Data channel used. - * param channelMask channel mask. - * param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * param buffer Pointer to the data to be read. - * param size Bytes to be read. - */ -void SAI_ReadMultiChannelBlocking( - I2S_Type *base, uint32_t channel, uint32_t channelMask, uint32_t bitWidth, uint8_t *buffer, uint32_t size) -{ - assert(FSL_FEATURE_SAI_CHANNEL_COUNTn(base) != -1); - - uint32_t i = 0, j = 0; - uint32_t bytesPerWord = bitWidth / 8U; - uint32_t channelNums = 0U, endChannel = 0U; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - bytesPerWord = base->RCR1 * bytesPerWord; -#endif - for (i = 0U; (i < (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base)); i++) - { - if (IS_SAI_FLAG_SET((1UL << i), channelMask)) - { - channelNums++; - endChannel = i; - } - } - - bytesPerWord *= channelNums; - - while (j < size) - { - /* Wait until data is received */ - while (!(IS_SAI_FLAG_SET(base->RCSR, I2S_RCSR_FWF_MASK))) - { - } - - SAI_ReadNonBlocking(base, channel, channelMask, endChannel, (uint8_t)bitWidth, buffer, - bytesPerWord * channelNums); - buffer = (uint8_t *)((uint32_t)buffer + bytesPerWord * channelNums); - j += bytesPerWord * channelNums; - } -} - -/*! - * brief Receives data using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SAI base pointer. - * param channel Data channel used. - * param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * param buffer Pointer to the data to be read. - * param size Bytes to be read. - */ -void SAI_ReadBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size) -{ - uint32_t i = 0; - uint32_t bytesPerWord = bitWidth / 8U; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - bytesPerWord = base->RCR1 * bytesPerWord; -#endif - - while (i < size) - { - /* Wait until data is received */ - while (!(IS_SAI_FLAG_SET(base->RCSR, I2S_RCSR_FWF_MASK))) - { - } - - SAI_ReadNonBlocking(base, channel, 1UL << channel, channel, (uint8_t)bitWidth, buffer, bytesPerWord); - buffer = (uint8_t *)((uint32_t)buffer + bytesPerWord); - i += bytesPerWord; - } -} - -/*! - * brief Initializes the SAI Tx handle. - * - * This function initializes the Tx handle for the SAI Tx transactional APIs. Call - * this function once to get the handle initialized. - * - * param base SAI base pointer - * param handle SAI handle pointer. - * param callback Pointer to the user callback function. - * param userData User parameter passed to the callback function - */ -void SAI_TransferTxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData) -{ - assert(handle != NULL); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - s_saiHandle[SAI_GetInstance(base)][0] = handle; - - handle->callback = callback; - handle->userData = userData; - handle->base = base; - - /* Set the isr pointer */ - s_saiTxIsr = SAI_TransferTxHandleIRQ; - - /* Enable Tx irq */ - (void)EnableIRQ(s_saiTxIRQ[SAI_GetInstance(base)]); -} - -/*! - * brief Initializes the SAI Rx handle. - * - * This function initializes the Rx handle for the SAI Rx transactional APIs. Call - * this function once to get the handle initialized. - * - * param base SAI base pointer. - * param handle SAI handle pointer. - * param callback Pointer to the user callback function. - * param userData User parameter passed to the callback function. - */ -void SAI_TransferRxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData) -{ - assert(handle != NULL); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - s_saiHandle[SAI_GetInstance(base)][1] = handle; - - handle->callback = callback; - handle->userData = userData; - handle->base = base; - - /* Set the isr pointer */ - s_saiRxIsr = SAI_TransferRxHandleIRQ; - - /* Enable Rx irq */ - (void)EnableIRQ(s_saiRxIRQ[SAI_GetInstance(base)]); -} - -/*! - * brief Configures the SAI Tx audio format. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_TransferTxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * param base SAI base pointer. - * param handle SAI handle pointer. - * param format Pointer to the SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master - * clock, this value should equal the masterClockHz in format. - * return Status of this function. Return value is the status_t. - */ -status_t SAI_TransferTxSetFormat(I2S_Type *base, - sai_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert(handle != NULL); - - if ((bclkSourceClockHz < format->sampleRate_Hz) -#if defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) - || (mclkSourceClockHz < format->sampleRate_Hz) -#endif - ) - { - return kStatus_InvalidArgument; - } - - /* Copy format to handle */ - handle->bitWidth = (uint8_t)format->bitWidth; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->watermark = format->watermark; -#endif - - SAI_TxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz); - - handle->channel = format->channel; - /* used for multi channel */ - handle->channelMask = format->channelMask; - handle->channelNums = format->channelNums; - handle->endChannel = format->endChannel; - - return kStatus_Success; -} - -/*! - * brief Configures the SAI Rx audio format. - * - * deprecated Do not use this function. It has been superceded by @ref SAI_TransferRxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * param base SAI base pointer. - * param handle SAI handle pointer. - * param format Pointer to the SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master - * clock, this value should equal the masterClockHz in format. - * return Status of this function. Return value is one of status_t. - */ -status_t SAI_TransferRxSetFormat(I2S_Type *base, - sai_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert(handle != NULL); - - if ((bclkSourceClockHz < format->sampleRate_Hz) -#if defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) - || (mclkSourceClockHz < format->sampleRate_Hz) -#endif - ) - { - return kStatus_InvalidArgument; - } - - /* Copy format to handle */ - handle->bitWidth = (uint8_t)format->bitWidth; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->watermark = format->watermark; -#endif - - SAI_RxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz); - - handle->channel = format->channel; - /* used for multi channel */ - handle->channelMask = format->channelMask; - handle->channelNums = format->channelNums; - handle->endChannel = format->endChannel; - - return kStatus_Success; -} - -/*! - * brief Performs an interrupt non-blocking send transfer on SAI. - * - * note This API returns immediately after the transfer initiates. - * Call the SAI_TxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer - * is finished. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - * param xfer Pointer to the sai_transfer_t structure. - * retval kStatus_Success Successfully started the data receive. - * retval kStatus_SAI_TxBusy Previous receive still not finished. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SAI_TransferSendNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer) -{ - assert(handle != NULL); - assert(handle->channelNums <= (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base)); - - /* Check if the queue is full */ - if (handle->saiQueue[handle->queueUser].data != NULL) - { - return kStatus_SAI_QueueFull; - } - - /* Add into queue */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->saiQueue[handle->queueUser].data = xfer->data; - handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Set the state to busy */ - handle->state = (uint32_t)kSAI_Busy; - - /* Enable interrupt */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Use FIFO request interrupt and fifo error*/ - SAI_TxEnableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FRIE_MASK); -#else - SAI_TxEnableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FWIE_MASK); -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - /* Enable Tx transfer */ - SAI_TxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Performs an interrupt non-blocking receive transfer on SAI. - * - * note This API returns immediately after the transfer initiates. - * Call the SAI_RxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer - * is finished. - * - * param base SAI base pointer - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - * param xfer Pointer to the sai_transfer_t structure. - * retval kStatus_Success Successfully started the data receive. - * retval kStatus_SAI_RxBusy Previous receive still not finished. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SAI_TransferReceiveNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer) -{ - assert(handle != NULL); - assert(handle->channelNums <= (uint32_t)FSL_FEATURE_SAI_CHANNEL_COUNTn(base)); - - /* Check if the queue is full */ - if (handle->saiQueue[handle->queueUser].data != NULL) - { - return kStatus_SAI_QueueFull; - } - - /* Add into queue */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->saiQueue[handle->queueUser].data = xfer->data; - handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Set state to busy */ - handle->state = (uint32_t)kSAI_Busy; - -/* Enable interrupt */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Use FIFO request interrupt and fifo error*/ - SAI_RxEnableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FRIE_MASK); -#else - SAI_RxEnableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FWIE_MASK); -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - /* Enable Rx transfer */ - SAI_RxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Gets a set byte count. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - * param count Bytes count sent. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SAI_TransferGetSendCount(I2S_Type *base, sai_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint32_t queueDriverIndex = handle->queueDriver; - - if (handle->state != (uint32_t)kSAI_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriverIndex] - handle->saiQueue[queueDriverIndex].dataSize); - } - - return status; -} - -/*! - * brief Gets a received byte count. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - * param count Bytes count received. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SAI_TransferGetReceiveCount(I2S_Type *base, sai_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint32_t queueDriverIndex = handle->queueDriver; - - if (handle->state != (uint32_t)kSAI_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriverIndex] - handle->saiQueue[queueDriverIndex].dataSize); - } - - return status; -} - -/*! - * brief Aborts the current send. - * - * note This API can be called any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - */ -void SAI_TransferAbortSend(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - /* Stop Tx transfer and disable interrupt */ - SAI_TxEnable(base, false); -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Use FIFO request interrupt and fifo error */ - SAI_TxDisableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FRIE_MASK); -#else - SAI_TxDisableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FWIE_MASK); -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - handle->state = (uint32_t)kSAI_Idle; - - /* Clear the queue */ - (void)memset(handle->saiQueue, 0, sizeof(sai_transfer_t) * (uint8_t)SAI_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Aborts the current IRQ receive. - * - * note This API can be called when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base SAI base pointer - * param handle Pointer to the sai_handle_t structure which stores the transfer state. - */ -void SAI_TransferAbortReceive(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - /* Stop Tx transfer and disable interrupt */ - SAI_RxEnable(base, false); -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - /* Use FIFO request interrupt and fifo error */ - SAI_RxDisableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FRIE_MASK); -#else - SAI_RxDisableInterrupts(base, I2S_TCSR_FEIE_MASK | I2S_TCSR_FWIE_MASK); -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - handle->state = (uint32_t)kSAI_Idle; - - /* Clear the queue */ - (void)memset(handle->saiQueue, 0, sizeof(sai_transfer_t) * (uint8_t)SAI_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Terminate all SAI send. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortSend. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateSend(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - /* Abort the current transfer */ - SAI_TransferAbortSend(base, handle); - - /* Clear all the internal information */ - (void)memset(handle->saiQueue, 0, sizeof(handle->saiQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - - handle->queueUser = 0U; - handle->queueDriver = 0U; -} - -/*! - * brief Terminate all SAI receive. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortReceive. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateReceive(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - /* Abort the current transfer */ - SAI_TransferAbortReceive(base, handle); - - /* Clear all the internal information */ - (void)memset(handle->saiQueue, 0, sizeof(handle->saiQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - - handle->queueUser = 0U; - handle->queueDriver = 0U; -} - -/*! - * brief Tx interrupt handler. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure. - */ -void SAI_TransferTxHandleIRQ(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - uint8_t *buffer = handle->saiQueue[handle->queueDriver].data; - uint32_t dataSize = (handle->bitWidth / 8UL) * handle->channelNums; - - /* Handle Error */ - if (IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FEF_MASK)) - { - /* Clear FIFO error flag to continue transfer */ - SAI_TxClearStatusFlags(base, I2S_TCSR_FEF_MASK); - - /* Reset FIFO for safety */ - SAI_TxSoftwareReset(base, kSAI_ResetTypeFIFO); - - /* Call the callback */ - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SAI_TxError, handle->userData); - } - } - -/* Handle transfer */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if (IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FRF_MASK)) - { - /* Judge if the data need to transmit is less than space */ - size_t size = MIN((handle->saiQueue[handle->queueDriver].dataSize), - (size_t)(((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT - handle->watermark) * dataSize)); - - /* Copy the data from sai buffer to FIFO */ - SAI_WriteNonBlocking(base, handle->channel, handle->channelMask, handle->endChannel, handle->bitWidth, buffer, - size); - - /* Update the internal counter */ - handle->saiQueue[handle->queueDriver].dataSize -= size; - handle->saiQueue[handle->queueDriver].data = (uint8_t *)((uint32_t)buffer + size); - } -#else - if (IS_SAI_FLAG_SET(base->TCSR, I2S_TCSR_FWF_MASK)) - { - size_t size = MIN((handle->saiQueue[handle->queueDriver].dataSize), dataSize); - - SAI_WriteNonBlocking(base, handle->channel, handle->channelMask, handle->endChannel, handle->bitWidth, buffer, - size); - - /* Update internal counter */ - handle->saiQueue[handle->queueDriver].dataSize -= size; - handle->saiQueue[handle->queueDriver].data = (uint8_t *)((uint32_t)buffer + size); - } -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - /* If finished a block, call the callback function */ - if (handle->saiQueue[handle->queueDriver].dataSize == 0U) - { - (void)memset(&handle->saiQueue[handle->queueDriver], 0, sizeof(sai_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SAI_TxIdle, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->saiQueue[handle->queueDriver].data == NULL) - { - SAI_TransferAbortSend(base, handle); - } -} - -/*! - * brief Tx interrupt handler. - * - * param base SAI base pointer. - * param handle Pointer to the sai_handle_t structure. - */ -void SAI_TransferRxHandleIRQ(I2S_Type *base, sai_handle_t *handle) -{ - assert(handle != NULL); - - uint8_t *buffer = handle->saiQueue[handle->queueDriver].data; - uint32_t dataSize = (handle->bitWidth / 8UL) * handle->channelNums; - - /* Handle Error */ - if (IS_SAI_FLAG_SET(base->RCSR, I2S_RCSR_FEF_MASK)) - { - /* Clear FIFO error flag to continue transfer */ - SAI_RxClearStatusFlags(base, I2S_TCSR_FEF_MASK); - - /* Reset FIFO for safety */ - SAI_RxSoftwareReset(base, kSAI_ResetTypeFIFO); - - /* Call the callback */ - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SAI_RxError, handle->userData); - } - } - -/* Handle transfer */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if (IS_SAI_FLAG_SET(base->RCSR, I2S_RCSR_FRF_MASK)) - { - /* Judge if the data need to transmit is less than space */ - size_t size = MIN((handle->saiQueue[handle->queueDriver].dataSize), handle->watermark * dataSize); - - /* Copy the data from sai buffer to FIFO */ - SAI_ReadNonBlocking(base, handle->channel, handle->channelMask, handle->endChannel, handle->bitWidth, buffer, - size); - - /* Update the internal counter */ - handle->saiQueue[handle->queueDriver].dataSize -= size; - handle->saiQueue[handle->queueDriver].data = (uint8_t *)((uint32_t)buffer + size); - } -#else - if (IS_SAI_FLAG_SET(base->RCSR, I2S_RCSR_FWF_MASK)) - { - size_t size = MIN((handle->saiQueue[handle->queueDriver].dataSize), dataSize); - - SAI_ReadNonBlocking(base, handle->channel, handle->channelMask, handle->endChannel, handle->bitWidth, buffer, - size); - - /* Update internal state */ - handle->saiQueue[handle->queueDriver].dataSize -= size; - handle->saiQueue[handle->queueDriver].data = (uint8_t *)((uint32_t)buffer + size); - } -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - /* If finished a block, call the callback function */ - if (handle->saiQueue[handle->queueDriver].dataSize == 0U) - { - (void)memset(&handle->saiQueue[handle->queueDriver], 0, sizeof(sai_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SAI_RxIdle, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->saiQueue[handle->queueDriver].data == NULL) - { - SAI_TransferAbortReceive(base, handle); - } -} - -#if defined(I2S0) -void I2S0_DriverIRQHandler(void); -void I2S0_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S0, s_saiHandle[0][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S0, s_saiHandle[0][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S0_Tx_DriverIRQHandler(void); -void I2S0_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[0][0] != NULL); - s_saiTxIsr(I2S0, s_saiHandle[0][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S0_Rx_DriverIRQHandler(void); -void I2S0_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[0][1] != NULL); - s_saiRxIsr(I2S0, s_saiHandle[0][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* I2S0*/ - -#if defined(I2S1) -void I2S1_DriverIRQHandler(void); -void I2S1_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S1, s_saiHandle[1][1]); - } - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S1, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S1_Tx_DriverIRQHandler(void); -void I2S1_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[1][0] != NULL); - s_saiTxIsr(I2S1, s_saiHandle[1][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S1_Rx_DriverIRQHandler(void); -void I2S1_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[1][1] != NULL); - s_saiRxIsr(I2S1, s_saiHandle[1][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* I2S1*/ - -#if defined(I2S2) -void I2S2_DriverIRQHandler(void); -void I2S2_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S2, s_saiHandle[2][1]); - } - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S2, s_saiHandle[2][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S2_Tx_DriverIRQHandler(void); -void I2S2_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[2][0] != NULL); - s_saiTxIsr(I2S2, s_saiHandle[2][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S2_Rx_DriverIRQHandler(void); -void I2S2_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[2][1] != NULL); - s_saiRxIsr(I2S2, s_saiHandle[2][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* I2S2*/ - -#if defined(I2S3) -void I2S3_DriverIRQHandler(void); -void I2S3_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S3, s_saiHandle[3][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S3, s_saiHandle[3][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S3_Tx_DriverIRQHandler(void); -void I2S3_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[3][0] != NULL); - s_saiTxIsr(I2S3, s_saiHandle[3][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S3_Rx_DriverIRQHandler(void); -void I2S3_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[3][1] != NULL); - s_saiRxIsr(I2S3, s_saiHandle[3][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* I2S3*/ - -#if defined(I2S4) -void I2S4_DriverIRQHandler(void); -void I2S4_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[4][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[4][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S4, s_saiHandle[4][1]); - } - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[4][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[4][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S4, s_saiHandle[4][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S4_Tx_DriverIRQHandler(void); -void I2S4_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[4][0] != NULL); - s_saiTxIsr(I2S4, s_saiHandle[4][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S4_Rx_DriverIRQHandler(void); -void I2S4_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[4][1] != NULL); - s_saiRxIsr(I2S4, s_saiHandle[4][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(FSL_FEATURE_SAI_SAI5_SAI6_SHARE_IRQ) && (FSL_FEATURE_SAI_SAI5_SAI6_SHARE_IRQ) && defined(I2S5) && \ - defined(I2S6) -void I2S56_DriverIRQHandler(void); -void I2S56_DriverIRQHandler(void) -{ - /* use index 5 to get handle when I2S5 & I2S6 share IRQ NUMBER */ - I2S_Type *base = s_saiHandle[5][1]->base; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(base, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(base, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(base, s_saiHandle[5][1]); - } - - base = s_saiHandle[5][0]->base; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(base, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(base, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(base, s_saiHandle[5][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S56_Tx_DriverIRQHandler(void); -void I2S56_Tx_DriverIRQHandler(void) -{ - /* use index 5 to get handle when I2S5 & I2S6 share IRQ NUMBER */ - assert(s_saiHandle[5][0] != NULL); - s_saiTxIsr(s_saiHandle[5][0]->base, s_saiHandle[5][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S56_Rx_DriverIRQHandler(void); -void I2S56_Rx_DriverIRQHandler(void) -{ - /* use index 5 to get handle when I2S5 & I2S6 share IRQ NUMBER */ - assert(s_saiHandle[5][1] != NULL); - s_saiRxIsr(s_saiHandle[5][1]->base, s_saiHandle[5][1]); - SDK_ISR_EXIT_BARRIER; -} - -#else - -#if defined(I2S5) -void I2S5_DriverIRQHandler(void); -void I2S5_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S5, s_saiHandle[5][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S5, s_saiHandle[5][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S5_Tx_DriverIRQHandler(void); -void I2S5_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[5][0] != NULL); - s_saiTxIsr(I2S5, s_saiHandle[5][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S5_Rx_DriverIRQHandler(void); -void I2S5_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[5][1] != NULL); - s_saiRxIsr(I2S5, s_saiHandle[5][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(I2S6) -void I2S6_DriverIRQHandler(void); -void I2S6_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][1] != NULL) && SAI_RxGetEnabledInterruptStatus(I2S6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(I2S6, s_saiHandle[6][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][0] != NULL) && SAI_TxGetEnabledInterruptStatus(I2S6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(I2S6, s_saiHandle[6][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void I2S6_Tx_DriverIRQHandler(void); -void I2S6_Tx_DriverIRQHandler(void) -{ - assert(s_saiHandle[6][0] != NULL); - s_saiTxIsr(I2S6, s_saiHandle[6][0]); - SDK_ISR_EXIT_BARRIER; -} - -void I2S6_Rx_DriverIRQHandler(void); -void I2S6_Rx_DriverIRQHandler(void) -{ - assert(s_saiHandle[6][1] != NULL); - s_saiRxIsr(I2S6, s_saiHandle[6][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif -#endif - -#if defined(AUDIO__SAI0) -void AUDIO_SAI0_INT_DriverIRQHandler(void); -void AUDIO_SAI0_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI0, s_saiHandle[0][1]); - } - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI0, s_saiHandle[0][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* AUDIO__SAI0 */ - -#if defined(AUDIO__SAI1) -void AUDIO_SAI1_INT_DriverIRQHandler(void); -void AUDIO_SAI1_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI1, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI1, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* AUDIO__SAI1 */ - -#if defined(AUDIO__SAI2) -void AUDIO_SAI2_INT_DriverIRQHandler(void); -void AUDIO_SAI2_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI2, s_saiHandle[2][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI2, s_saiHandle[2][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* AUDIO__SAI2 */ - -#if defined(AUDIO__SAI3) -void AUDIO_SAI3_INT_DriverIRQHandler(void); -void AUDIO_SAI3_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI3, s_saiHandle[3][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI3, s_saiHandle[3][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif - -#if defined(AUDIO__SAI6) -void AUDIO_SAI6_INT_DriverIRQHandler(void); -void AUDIO_SAI6_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI6, s_saiHandle[6][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI6, s_saiHandle[6][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* AUDIO__SAI6 */ - -#if defined(AUDIO__SAI7) -void AUDIO_SAI7_INT_DriverIRQHandler(void); -void AUDIO_SAI7_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[7][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI7, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[7][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(AUDIO__SAI7, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(AUDIO__SAI7, s_saiHandle[7][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[7][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI7, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[7][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(AUDIO__SAI7, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(AUDIO__SAI7, s_saiHandle[7][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* AUDIO__SAI7 */ - -#if defined(ADMA__SAI0) -void ADMA_SAI0_INT_DriverIRQHandler(void); -void ADMA_SAI0_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI0, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI0, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI0 */ - -#if defined(ADMA__SAI1) -void ADMA_SAI1_INT_DriverIRQHandler(void); -void ADMA_SAI1_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI1, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI1, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI1 */ - -#if defined(ADMA__SAI2) -void ADMA_SAI2_INT_DriverIRQHandler(void); -void ADMA_SAI2_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI2, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI2, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI2 */ - -#if defined(ADMA__SAI3) -void ADMA_SAI3_INT_DriverIRQHandler(void); -void ADMA_SAI3_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI3, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI3, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI3 */ - -#if defined(ADMA__SAI4) -void ADMA_SAI4_INT_DriverIRQHandler(void); -void ADMA_SAI4_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI4, s_saiHandle[1][1]); - } - -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI4, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI4 */ - -#if defined(ADMA__SAI5) -void ADMA_SAI5_INT_DriverIRQHandler(void); -void ADMA_SAI5_INT_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && - SAI_RxGetEnabledInterruptStatus(ADMA__SAI5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(ADMA__SAI5, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && - SAI_TxGetEnabledInterruptStatus(ADMA__SAI5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(ADMA__SAI5, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* ADMA__SAI5 */ - -#if defined(SAI0) -void SAI0_DriverIRQHandler(void); -void SAI0_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI0, s_saiHandle[0][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[0][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI0, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[0][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI0, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI0, s_saiHandle[0][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI0 */ - -#if defined(SAI1) -void SAI1_DriverIRQHandler(void); -void SAI1_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI1, s_saiHandle[1][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[1][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI1, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[1][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI1, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI1, s_saiHandle[1][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI1 */ - -#if defined(SAI2) -void SAI2_DriverIRQHandler(void); -void SAI2_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI2, s_saiHandle[2][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[2][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI2, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[2][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI2, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI2, s_saiHandle[2][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI2 */ - -#if defined(SAI3) -void SAI3_DriverIRQHandler(void); -void SAI3_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI3, s_saiHandle[3][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[3][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI3, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[3][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI3, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI3, s_saiHandle[3][0]); - } - SDK_ISR_EXIT_BARRIER; -} - -void SAI3_TX_DriverIRQHandler(void); -void SAI3_TX_DriverIRQHandler(void) -{ - assert(s_saiHandle[3][0] != NULL); - s_saiTxIsr(SAI3, s_saiHandle[3][0]); - SDK_ISR_EXIT_BARRIER; -} - -void SAI3_RX_DriverIRQHandler(void); -void SAI3_RX_DriverIRQHandler(void) -{ - assert(s_saiHandle[3][1] != NULL); - s_saiRxIsr(SAI3, s_saiHandle[3][1]); - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI3 */ - -#if defined(SAI4) -void SAI4_DriverIRQHandler(void); -void SAI4_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[4][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[4][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI4, s_saiHandle[4][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[4][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI4, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[4][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI4, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI4, s_saiHandle[4][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI4 */ - -#if defined(SAI5) -void SAI5_DriverIRQHandler(void); -void SAI5_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI5, s_saiHandle[5][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI5, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[5][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI5, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI5, s_saiHandle[5][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI5 */ - -#if defined(SAI6) -void SAI6_DriverIRQHandler(void); -void SAI6_DriverIRQHandler(void) -{ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][1] != NULL) && SAI_RxGetEnabledInterruptStatus(SAI6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiRxIsr(SAI6, s_saiHandle[6][1]); - } -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - if ((s_saiHandle[6][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI6, (I2S_TCSR_FRIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FRF_MASK | I2S_TCSR_FEF_MASK))) -#else - if ((s_saiHandle[6][0] != NULL) && SAI_TxGetEnabledInterruptStatus(SAI6, (I2S_TCSR_FWIE_MASK | I2S_TCSR_FEIE_MASK), - (I2S_TCSR_FWF_MASK | I2S_TCSR_FEF_MASK))) -#endif - { - s_saiTxIsr(SAI6, s_saiHandle[6][0]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif /* SAI6 */ diff --git a/devices/MIMXRT1052/drivers/fsl_sai.h b/devices/MIMXRT1052/drivers/fsl_sai.h deleted file mode 100644 index f82830d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_sai.h +++ /dev/null @@ -1,1586 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_SAI_H_ -#define _FSL_SAI_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup sai_driver SAI Driver - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SAI_DRIVER_VERSION (MAKE_VERSION(2, 3, 3)) /*!< Version 2.3.3 */ -/*@}*/ - -/*! @brief _sai_status_t, SAI return status.*/ -enum -{ - kStatus_SAI_TxBusy = MAKE_STATUS(kStatusGroup_SAI, 0), /*!< SAI Tx is busy. */ - kStatus_SAI_RxBusy = MAKE_STATUS(kStatusGroup_SAI, 1), /*!< SAI Rx is busy. */ - kStatus_SAI_TxError = MAKE_STATUS(kStatusGroup_SAI, 2), /*!< SAI Tx FIFO error. */ - kStatus_SAI_RxError = MAKE_STATUS(kStatusGroup_SAI, 3), /*!< SAI Rx FIFO error. */ - kStatus_SAI_QueueFull = MAKE_STATUS(kStatusGroup_SAI, 4), /*!< SAI transfer queue is full. */ - kStatus_SAI_TxIdle = MAKE_STATUS(kStatusGroup_SAI, 5), /*!< SAI Tx is idle */ - kStatus_SAI_RxIdle = MAKE_STATUS(kStatusGroup_SAI, 6) /*!< SAI Rx is idle */ -}; - -/*! @brief _sai_channel_mask,.sai channel mask value, actual channel numbers is depend soc specific */ -enum -{ - kSAI_Channel0Mask = 1 << 0U, /*!< channel 0 mask value */ - kSAI_Channel1Mask = 1 << 1U, /*!< channel 1 mask value */ - kSAI_Channel2Mask = 1 << 2U, /*!< channel 2 mask value */ - kSAI_Channel3Mask = 1 << 3U, /*!< channel 3 mask value */ - kSAI_Channel4Mask = 1 << 4U, /*!< channel 4 mask value */ - kSAI_Channel5Mask = 1 << 5U, /*!< channel 5 mask value */ - kSAI_Channel6Mask = 1 << 6U, /*!< channel 6 mask value */ - kSAI_Channel7Mask = 1 << 7U, /*!< channel 7 mask value */ -}; - -/*! @brief Define the SAI bus type */ -typedef enum _sai_protocol -{ - kSAI_BusLeftJustified = 0x0U, /*!< Uses left justified format.*/ - kSAI_BusRightJustified, /*!< Uses right justified format. */ - kSAI_BusI2S, /*!< Uses I2S format. */ - kSAI_BusPCMA, /*!< Uses I2S PCM A format.*/ - kSAI_BusPCMB /*!< Uses I2S PCM B format. */ -} sai_protocol_t; - -/*! @brief Master or slave mode */ -typedef enum _sai_master_slave -{ - kSAI_Master = 0x0U, /*!< Master mode include bclk and frame sync */ - kSAI_Slave = 0x1U, /*!< Slave mode include bclk and frame sync */ - kSAI_Bclk_Master_FrameSync_Slave = 0x2U, /*!< bclk in master mode, frame sync in slave mode */ - kSAI_Bclk_Slave_FrameSync_Master = 0x3U, /*!< bclk in slave mode, frame sync in master mode */ -} sai_master_slave_t; - -/*! @brief Mono or stereo audio format */ -typedef enum _sai_mono_stereo -{ - kSAI_Stereo = 0x0U, /*!< Stereo sound. */ - kSAI_MonoRight, /*!< Only Right channel have sound. */ - kSAI_MonoLeft /*!< Only left channel have sound. */ -} sai_mono_stereo_t; - -/*! @brief SAI data order, MSB or LSB */ -typedef enum _sai_data_order -{ - kSAI_DataLSB = 0x0U, /*!< LSB bit transferred first */ - kSAI_DataMSB /*!< MSB bit transferred first */ -} sai_data_order_t; - -/*! @brief SAI clock polarity, active high or low */ -typedef enum _sai_clock_polarity -{ - kSAI_PolarityActiveHigh = 0x0U, /*!< Drive outputs on rising edge */ - kSAI_PolarityActiveLow = 0x1U, /*!< Drive outputs on falling edge */ - kSAI_SampleOnFallingEdge = 0x0U, /*!< Sample inputs on falling edge */ - kSAI_SampleOnRisingEdge = 0x1U, /*!< Sample inputs on rising edge */ -} sai_clock_polarity_t; - -/*! @brief Synchronous or asynchronous mode */ -typedef enum _sai_sync_mode -{ - kSAI_ModeAsync = 0x0U, /*!< Asynchronous mode */ - kSAI_ModeSync, /*!< Synchronous mode (with receiver or transmit) */ -#if defined(FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) && (FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI) - kSAI_ModeSyncWithOtherTx, /*!< Synchronous with another SAI transmit */ - kSAI_ModeSyncWithOtherRx /*!< Synchronous with another SAI receiver */ -#endif /* FSL_FEATURE_SAI_HAS_SYNC_WITH_ANOTHER_SAI */ -} sai_sync_mode_t; - -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) -/*! @brief Mater clock source */ -typedef enum _sai_mclk_source -{ - kSAI_MclkSourceSysclk = 0x0U, /*!< Master clock from the system clock */ - kSAI_MclkSourceSelect1, /*!< Master clock from source 1 */ - kSAI_MclkSourceSelect2, /*!< Master clock from source 2 */ - kSAI_MclkSourceSelect3 /*!< Master clock from source 3 */ -} sai_mclk_source_t; -#endif - -/*! @brief Bit clock source */ -typedef enum _sai_bclk_source -{ - kSAI_BclkSourceBusclk = 0x0U, /*!< Bit clock using bus clock */ - /* General device bit source definition */ - kSAI_BclkSourceMclkOption1 = 0x1U, /*!< Bit clock MCLK option 1 */ - kSAI_BclkSourceMclkOption2 = 0x2U, /*!< Bit clock MCLK option2 */ - kSAI_BclkSourceMclkOption3 = 0x3U, /*!< Bit clock MCLK option3 */ - /* Kinetis device bit clock source definition */ - kSAI_BclkSourceMclkDiv = 0x1U, /*!< Bit clock using master clock divider */ - kSAI_BclkSourceOtherSai0 = 0x2U, /*!< Bit clock from other SAI device */ - kSAI_BclkSourceOtherSai1 = 0x3U /*!< Bit clock from other SAI device */ -} sai_bclk_source_t; - -/*! @brief _sai_interrupt_enable_t, The SAI interrupt enable flag */ -enum -{ - kSAI_WordStartInterruptEnable = - I2S_TCSR_WSIE_MASK, /*!< Word start flag, means the first word in a frame detected */ - kSAI_SyncErrorInterruptEnable = I2S_TCSR_SEIE_MASK, /*!< Sync error flag, means the sync error is detected */ - kSAI_FIFOWarningInterruptEnable = I2S_TCSR_FWIE_MASK, /*!< FIFO warning flag, means the FIFO is empty */ - kSAI_FIFOErrorInterruptEnable = I2S_TCSR_FEIE_MASK, /*!< FIFO error flag */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - kSAI_FIFORequestInterruptEnable = I2S_TCSR_FRIE_MASK, /*!< FIFO request, means reached watermark */ -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -}; - -/*! @brief _sai_dma_enable_t, The DMA request sources */ -enum -{ - kSAI_FIFOWarningDMAEnable = I2S_TCSR_FWDE_MASK, /*!< FIFO warning caused by the DMA request */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - kSAI_FIFORequestDMAEnable = I2S_TCSR_FRDE_MASK, /*!< FIFO request caused by the DMA request */ -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -}; - -/*! @brief _sai_flags, The SAI status flag */ -enum -{ - kSAI_WordStartFlag = I2S_TCSR_WSF_MASK, /*!< Word start flag, means the first word in a frame detected */ - kSAI_SyncErrorFlag = I2S_TCSR_SEF_MASK, /*!< Sync error flag, means the sync error is detected */ - kSAI_FIFOErrorFlag = I2S_TCSR_FEF_MASK, /*!< FIFO error flag */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - kSAI_FIFORequestFlag = I2S_TCSR_FRF_MASK, /*!< FIFO request flag. */ -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - kSAI_FIFOWarningFlag = I2S_TCSR_FWF_MASK, /*!< FIFO warning flag */ -}; - -/*! @brief The reset type */ -typedef enum _sai_reset_type -{ - kSAI_ResetTypeSoftware = I2S_TCSR_SR_MASK, /*!< Software reset, reset the logic state */ - kSAI_ResetTypeFIFO = I2S_TCSR_FR_MASK, /*!< FIFO reset, reset the FIFO read and write pointer */ - kSAI_ResetAll = I2S_TCSR_SR_MASK | I2S_TCSR_FR_MASK /*!< All reset. */ -} sai_reset_type_t; - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING -/*! - * @brief The SAI packing mode - * The mode includes 8 bit and 16 bit packing. - */ -typedef enum _sai_fifo_packing -{ - kSAI_FifoPackingDisabled = 0x0U, /*!< Packing disabled */ - kSAI_FifoPacking8bit = 0x2U, /*!< 8 bit packing enabled */ - kSAI_FifoPacking16bit = 0x3U /*!< 16bit packing enabled */ -} sai_fifo_packing_t; -#endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */ - -/*! @brief SAI user configuration structure */ -typedef struct _sai_config -{ - sai_protocol_t protocol; /*!< Audio bus protocol in SAI */ - sai_sync_mode_t syncMode; /*!< SAI sync mode, control Tx/Rx clock sync */ -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) - bool mclkOutputEnable; /*!< Master clock output enable, true means master clock divider enabled */ -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - sai_mclk_source_t mclkSource; /*!< Master Clock source */ -#endif /* FSL_FEATURE_SAI_HAS_MCR */ -#endif - sai_bclk_source_t bclkSource; /*!< Bit Clock source */ - sai_master_slave_t masterSlave; /*!< Master or slave */ -} sai_config_t; - -#ifndef SAI_XFER_QUEUE_SIZE -/*!@brief SAI transfer queue size, user can refine it according to use case. */ -#define SAI_XFER_QUEUE_SIZE (4U) -#endif - -/*! @brief Audio sample rate */ -typedef enum _sai_sample_rate -{ - kSAI_SampleRate8KHz = 8000U, /*!< Sample rate 8000 Hz */ - kSAI_SampleRate11025Hz = 11025U, /*!< Sample rate 11025 Hz */ - kSAI_SampleRate12KHz = 12000U, /*!< Sample rate 12000 Hz */ - kSAI_SampleRate16KHz = 16000U, /*!< Sample rate 16000 Hz */ - kSAI_SampleRate22050Hz = 22050U, /*!< Sample rate 22050 Hz */ - kSAI_SampleRate24KHz = 24000U, /*!< Sample rate 24000 Hz */ - kSAI_SampleRate32KHz = 32000U, /*!< Sample rate 32000 Hz */ - kSAI_SampleRate44100Hz = 44100U, /*!< Sample rate 44100 Hz */ - kSAI_SampleRate48KHz = 48000U, /*!< Sample rate 48000 Hz */ - kSAI_SampleRate96KHz = 96000U, /*!< Sample rate 96000 Hz */ - kSAI_SampleRate192KHz = 192000U, /*!< Sample rate 192000 Hz */ - kSAI_SampleRate384KHz = 384000U, /*!< Sample rate 384000 Hz */ -} sai_sample_rate_t; - -/*! @brief Audio word width */ -typedef enum _sai_word_width -{ - kSAI_WordWidth8bits = 8U, /*!< Audio data width 8 bits */ - kSAI_WordWidth16bits = 16U, /*!< Audio data width 16 bits */ - kSAI_WordWidth24bits = 24U, /*!< Audio data width 24 bits */ - kSAI_WordWidth32bits = 32U /*!< Audio data width 32 bits */ -} sai_word_width_t; - -#if defined(FSL_FEATURE_SAI_HAS_CHANNEL_MODE) && FSL_FEATURE_SAI_HAS_CHANNEL_MODE -/*! @brief sai data pin state definition */ -typedef enum _sai_data_pin_state -{ - kSAI_DataPinStateTriState = - 0U, /*!< transmit data pins are tri-stated when slots are masked or channels are disabled */ - kSAI_DataPinStateOutputZero = 1U, /*!< transmit data pins are never tri-stated and will output zero when slots - are masked or channel disabled */ -} sai_data_pin_state_t; -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE -/*! @brief sai fifo combine mode definition */ -typedef enum _sai_fifo_combine -{ - kSAI_FifoCombineDisabled = 0U, /*!< sai fifo combine mode disabled */ - kSAI_FifoCombineModeEnabledOnRead, /*!< sai fifo combine mode enabled on FIFO reads */ - kSAI_FifoCombineModeEnabledOnWrite, /*!< sai fifo combine mode enabled on FIFO write */ - kSAI_FifoCombineModeEnabledOnReadWrite, /*!< sai fifo combined mode enabled on FIFO read/writes */ -} sai_fifo_combine_t; -#endif - -/*! @brief sai transceiver type */ -typedef enum _sai_transceiver_type -{ - kSAI_Transmitter = 0U, /*!< sai transmitter */ - kSAI_Receiver = 1U, /*!< sai receiver */ -} sai_transceiver_type_t; - -/*! @brief sai frame sync len */ -typedef enum _sai_frame_sync_len -{ - kSAI_FrameSyncLenOneBitClk = 0U, /*!< 1 bit clock frame sync len for DSP mode */ - kSAI_FrameSyncLenPerWordWidth = 1U, /*!< Frame sync length decided by word width */ -} sai_frame_sync_len_t; - -/*! @brief sai transfer format */ -typedef struct _sai_transfer_format -{ - uint32_t sampleRate_Hz; /*!< Sample rate of audio data */ - uint32_t bitWidth; /*!< Data length of audio data, usually 8/16/24/32 bits */ - sai_mono_stereo_t stereo; /*!< Mono or stereo */ -#if defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) - uint32_t masterClockHz; /*!< Master clock frequency in Hz */ -#endif /* FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - uint8_t watermark; /*!< Watermark value */ -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ - - /* for the multi channel usage, user can provide channelMask Oonly, then sai driver will handle - * other parameter carefully, such as - * channelMask = kSAI_Channel0Mask | kSAI_Channel1Mask | kSAI_Channel4Mask - * then in SAI_RxSetFormat/SAI_TxSetFormat function, channel/endChannel/channelNums will be calculated. - * for the single channel usage, user can provide channel or channel mask only, such as, - * channel = 0 or channelMask = kSAI_Channel0Mask. - */ - uint8_t channel; /*!< Transfer start channel */ - uint8_t channelMask; /*!< enabled channel mask value, reference _sai_channel_mask */ - uint8_t endChannel; /*!< end channel number */ - uint8_t channelNums; /*!< Total enabled channel numbers */ - - sai_protocol_t protocol; /*!< Which audio protocol used */ - bool isFrameSyncCompact; /*!< True means Frame sync length is configurable according to bitWidth, false means frame - sync length is 64 times of bit clock. */ -} sai_transfer_format_t; - -#if (defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) -/*! @brief master clock configurations */ -typedef struct _sai_master_clock -{ -#if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR) - bool mclkOutputEnable; /*!< master clock output enable */ -#if !(defined(FSL_FEATURE_SAI_HAS_NO_MCR_MICS) && (FSL_FEATURE_SAI_HAS_NO_MCR_MICS)) - sai_mclk_source_t mclkSource; /*!< Master Clock source */ -#endif -#endif - -#if (defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) - uint32_t mclkHz; /*!< target mclk frequency */ - uint32_t mclkSourceClkHz; /*!< mclk source frequency*/ -#endif -} sai_master_clock_t; -#endif - -/*! @brief sai fifo feature*/ -#if (defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) || \ - (defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) || \ - (defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING) || \ - (defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)) -#define FSL_SAI_HAS_FIFO_EXTEND_FEATURE 1 -#else -#define FSL_SAI_HAS_FIFO_EXTEND_FEATURE 0 -#endif - -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE -/*! @brief sai fifo configurations */ -typedef struct _sai_fifo -{ -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR - bool fifoContinueOneError; /*!< fifo continues when error occur */ -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_COMBINE - sai_fifo_combine_t fifoCombine; /*!< fifo combine mode */ -#endif - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING - sai_fifo_packing_t fifoPacking; /*!< fifo packing mode */ -#endif -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - uint8_t fifoWatermark; /*!< fifo watermark */ -#endif -} sai_fifo_t; -#endif - -/*! @brief sai bit clock configurations */ -typedef struct _sai_bit_clock -{ - bool bclkSrcSwap; /*!< bit clock source swap */ - bool bclkInputDelay; /*!< bit clock actually used by the transmitter is delayed by the pad output delay, - this has effect of decreasing the data input setup time, but increasing the data output valid - time .*/ - sai_clock_polarity_t bclkPolarity; /*!< bit clock polarity */ - sai_bclk_source_t bclkSource; /*!< bit Clock source */ -} sai_bit_clock_t; - -/*! @brief sai frame sync configurations */ -typedef struct _sai_frame_sync -{ - uint8_t frameSyncWidth; /*!< frame sync width in number of bit clocks */ - bool frameSyncEarly; /*!< TRUE is frame sync assert one bit before the first bit of frame - FALSE is frame sync assert with the first bit of the frame */ - -#if defined(FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND) && FSL_FEATURE_SAI_HAS_FRAME_SYNC_ON_DEMAND - bool frameSyncGenerateOnDemand; /*!< internal frame sync is generated when FIFO waring flag is clear */ -#endif - - sai_clock_polarity_t frameSyncPolarity; /*!< frame sync polarity */ - -} sai_frame_sync_t; - -/*! @brief sai serial data configurations */ -typedef struct _sai_serial_data -{ -#if defined(FSL_FEATURE_SAI_HAS_CHANNEL_MODE) && FSL_FEATURE_SAI_HAS_CHANNEL_MODE - sai_data_pin_state_t dataMode; /*!< sai data pin state when slots masked or channel disabled */ -#endif - - sai_data_order_t dataOrder; /*!< configure whether the LSB or MSB is transmitted first */ - uint8_t dataWord0Length; /*!< configure the number of bits in the first word in each frame */ - uint8_t dataWordNLength; /*!< configure the number of bits in the each word in each frame, except the first word */ - uint8_t dataWordLength; /*!< used to record the data length for dma transfer */ - uint8_t - dataFirstBitShifted; /*!< Configure the bit index for the first bit transmitted for each word in the frame */ - uint8_t dataWordNum; /*!< configure the number of words in each frame */ - uint32_t dataMaskedWord; /*!< configure whether the transmit word is masked */ -} sai_serial_data_t; - -/*! @brief sai transceiver configurations */ -typedef struct _sai_transceiver -{ - sai_serial_data_t serialData; /*!< serial data configurations */ - sai_frame_sync_t frameSync; /*!< ws configurations */ - sai_bit_clock_t bitClock; /*!< bit clock configurations */ -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE - sai_fifo_t fifo; /*!< fifo configurations */ -#endif - sai_master_slave_t masterSlave; /*!< transceiver is master or slave */ - - sai_sync_mode_t syncMode; /*!< transceiver sync mode */ - - uint8_t startChannel; /*!< Transfer start channel */ - uint8_t channelMask; /*!< enabled channel mask value, reference _sai_channel_mask */ - uint8_t endChannel; /*!< end channel number */ - uint8_t channelNums; /*!< Total enabled channel numbers */ - -} sai_transceiver_t; - -/*! @brief SAI transfer structure */ -typedef struct _sai_transfer -{ - uint8_t *data; /*!< Data start address to transfer. */ - size_t dataSize; /*!< Transfer size. */ -} sai_transfer_t; - -typedef struct _sai_handle sai_handle_t; - -/*! @brief SAI transfer callback prototype */ -typedef void (*sai_transfer_callback_t)(I2S_Type *base, sai_handle_t *handle, status_t status, void *userData); - -/*! @brief SAI handle structure */ -struct _sai_handle -{ - I2S_Type *base; /*!< base address */ - - uint32_t state; /*!< Transfer status */ - sai_transfer_callback_t callback; /*!< Callback function called at transfer event*/ - void *userData; /*!< Callback parameter passed to callback function*/ - uint8_t bitWidth; /*!< Bit width for transfer, 8/16/24/32 bits */ - - /* for the multi channel usage, user can provide channelMask Oonly, then sai driver will handle - * other parameter carefully, such as - * channelMask = kSAI_Channel0Mask | kSAI_Channel1Mask | kSAI_Channel4Mask - * then in SAI_RxSetFormat/SAI_TxSetFormat function, channel/endChannel/channelNums will be calculated. - * for the single channel usage, user can provide channel or channel mask only, such as, - * channel = 0 or channelMask = kSAI_Channel0Mask. - */ - uint8_t channel; /*!< Transfer start channel */ - uint8_t channelMask; /*!< enabled channel mask value, refernece _sai_channel_mask */ - uint8_t endChannel; /*!< end channel number */ - uint8_t channelNums; /*!< Total enabled channel numbers */ - - sai_transfer_t saiQueue[SAI_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */ - size_t transferSize[SAI_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - uint8_t watermark; /*!< Watermark value */ -#endif -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initializes the SAI Tx peripheral. - * @deprecated Do not use this function. It has been superceded by @ref SAI_Init - * - * Ungates the SAI clock, resets the module, and configures SAI Tx with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SAI_TxGetDefaultConfig(). - * - * @note This API should be called at the beginning of the application to use - * the SAI driver. Otherwise, accessing the SAIM module can cause a hard fault - * because the clock is not enabled. - * - * @param base SAI base pointer - * @param config SAI configuration structure. - */ -void SAI_TxInit(I2S_Type *base, const sai_config_t *config); - -/*! - * @brief Initializes the SAI Rx peripheral. - * @deprecated Do not use this function. It has been superceded by @ref SAI_Init - * - * Ungates the SAI clock, resets the module, and configures the SAI Rx with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SAI_RxGetDefaultConfig(). - * - * @note This API should be called at the beginning of the application to use - * the SAI driver. Otherwise, accessing the SAI module can cause a hard fault - * because the clock is not enabled. - * - * @param base SAI base pointer - * @param config SAI configuration structure. - */ -void SAI_RxInit(I2S_Type *base, const sai_config_t *config); - -/*! - * @brief Sets the SAI Tx configuration structure to default values. - * @deprecated Do not use this function. It has been superceded by - * @ref SAI_GetClassicI2SConfig, @ref SAI_GetLeftJustifiedConfig , @ref SAI_GetRightJustifiedConfig, @ref - SAI_GetDSPConfig, @ref SAI_GetTDMConfig - * - * This API initializes the configuration structure for use in SAI_TxConfig(). - * The initialized structure can remain unchanged in SAI_TxConfig(), or it can be modified - * before calling SAI_TxConfig(). - * This is an example. - @code - sai_config_t config; - SAI_TxGetDefaultConfig(&config); - @endcode - * - * @param config pointer to master configuration structure - */ -void SAI_TxGetDefaultConfig(sai_config_t *config); - -/*! - * @brief Sets the SAI Rx configuration structure to default values. - * @deprecated Do not use this function. It has been superceded by - * @ref SAI_GetClassicI2SConfig, @ref SAI_GetLeftJustifiedConfig , @ref SAI_GetRightJustifiedConfig, @ref - SAI_GetDSPConfig, @ref SAI_GetTDMConfig - * - * This API initializes the configuration structure for use in SAI_RxConfig(). - * The initialized structure can remain unchanged in SAI_RxConfig() or it can be modified - * before calling SAI_RxConfig(). - * This is an example. - @code - sai_config_t config; - SAI_RxGetDefaultConfig(&config); - @endcode - * - * @param config pointer to master configuration structure - */ -void SAI_RxGetDefaultConfig(sai_config_t *config); - -/*! - * @brief Initializes the SAI peripheral. - * - * This API gates the SAI clock. The SAI module can't operate unless SAI_Init is called to enable the clock. - * - * @param base SAI base pointer. - */ -void SAI_Init(I2S_Type *base); - -/*! - * @brief De-initializes the SAI peripheral. - * - * This API gates the SAI clock. The SAI module can't operate unless SAI_TxInit - * or SAI_RxInit is called to enable the clock. - * - * @param base SAI base pointer. - */ -void SAI_Deinit(I2S_Type *base); - -/*! - * @brief Resets the SAI Tx. - * - * This function enables the software reset and FIFO reset of SAI Tx. After reset, clear the reset bit. - * - * @param base SAI base pointer - */ -void SAI_TxReset(I2S_Type *base); - -/*! - * @brief Resets the SAI Rx. - * - * This function enables the software reset and FIFO reset of SAI Rx. After reset, clear the reset bit. - * - * @param base SAI base pointer - */ -void SAI_RxReset(I2S_Type *base); - -/*! - * @brief Enables/disables the SAI Tx. - * - * @param base SAI base pointer. - * @param enable True means enable SAI Tx, false means disable. - */ -void SAI_TxEnable(I2S_Type *base, bool enable); - -/*! - * @brief Enables/disables the SAI Rx. - * - * @param base SAI base pointer. - * @param enable True means enable SAI Rx, false means disable. - */ -void SAI_RxEnable(I2S_Type *base, bool enable); - -/*! - * @brief Set Rx bit clock direction. - * - * Select bit clock direction, master or slave. - * - * @param base SAI base pointer. - * @param masterSlave reference sai_master_slave_t. - */ -static inline void SAI_TxSetBitClockDirection(I2S_Type *base, sai_master_slave_t masterSlave) -{ - if (masterSlave == kSAI_Master) - { - base->TCR2 |= I2S_TCR2_BCD_MASK; - } - else - { - base->TCR2 &= ~I2S_TCR2_BCD_MASK; - } -} - -/*! - * @brief Set Rx bit clock direction. - * - * Select bit clock direction, master or slave. - * - * @param base SAI base pointer. - * @param masterSlave reference sai_master_slave_t. - */ -static inline void SAI_RxSetBitClockDirection(I2S_Type *base, sai_master_slave_t masterSlave) -{ - if (masterSlave == kSAI_Master) - { - base->RCR2 |= I2S_RCR2_BCD_MASK; - } - else - { - base->RCR2 &= ~I2S_RCR2_BCD_MASK; - } -} - -/*! - * @brief Set Rx frame sync direction. - * - * Select frame sync direction, master or slave. - * - * @param base SAI base pointer. - * @param masterSlave reference sai_master_slave_t. - */ -static inline void SAI_RxSetFrameSyncDirection(I2S_Type *base, sai_master_slave_t masterSlave) -{ - if (masterSlave == kSAI_Master) - { - base->RCR4 |= I2S_RCR4_FSD_MASK; - } - else - { - base->RCR4 &= ~I2S_RCR4_FSD_MASK; - } -} - -/*! - * @brief Set Tx frame sync direction. - * - * Select frame sync direction, master or slave. - * - * @param base SAI base pointer. - * @param masterSlave reference sai_master_slave_t. - */ -static inline void SAI_TxSetFrameSyncDirection(I2S_Type *base, sai_master_slave_t masterSlave) -{ - if (masterSlave == kSAI_Master) - { - base->TCR4 |= I2S_TCR4_FSD_MASK; - } - else - { - base->TCR4 &= ~I2S_TCR4_FSD_MASK; - } -} - -/*! - * @brief Transmitter bit clock rate configurations. - * - * @param base SAI base pointer. - * @param sourceClockHz Bit clock source frequency. - * @param sampleRate Audio data sample rate. - * @param bitWidth Audio data bitWidth. - * @param channelNumbers Audio channel numbers. - */ -void SAI_TxSetBitClockRate( - I2S_Type *base, uint32_t sourceClockHz, uint32_t sampleRate, uint32_t bitWidth, uint32_t channelNumbers); - -/*! - * @brief Receiver bit clock rate configurations. - * - * @param base SAI base pointer. - * @param sourceClockHz Bit clock source frequency. - * @param sampleRate Audio data sample rate. - * @param bitWidth Audio data bitWidth. - * @param channelNumbers Audio channel numbers. - */ -void SAI_RxSetBitClockRate( - I2S_Type *base, uint32_t sourceClockHz, uint32_t sampleRate, uint32_t bitWidth, uint32_t channelNumbers); - -/*! - * @brief Transmitter Bit clock configurations. - * - * @param base SAI base pointer. - * @param masterSlave master or slave. - * @param config bit clock other configurations, can be NULL in slave mode. - */ -void SAI_TxSetBitclockConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_bit_clock_t *config); - -/*! - * @brief Receiver Bit clock configurations. - * - * @param base SAI base pointer. - * @param masterSlave master or slave. - * @param config bit clock other configurations, can be NULL in slave mode. - */ -void SAI_RxSetBitclockConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_bit_clock_t *config); - -#if (defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)) || \ - (defined(FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER) && (FSL_FEATURE_SAI_HAS_MCLKDIV_REGISTER)) -/*! - * @brief Master clock configurations. - * - * @param base SAI base pointer. - * @param config master clock configurations. - */ -void SAI_SetMasterClockConfig(I2S_Type *base, sai_master_clock_t *config); -#endif - -#if FSL_SAI_HAS_FIFO_EXTEND_FEATURE -/*! - * @brief SAI transmitter fifo configurations. - * - * @param base SAI base pointer. - * @param config fifo configurations. - */ -void SAI_TxSetFifoConfig(I2S_Type *base, sai_fifo_t *config); - -/*! - * @brief SAI receiver fifo configurations. - * - * @param base SAI base pointer. - * @param config fifo configurations. - */ -void SAI_RxSetFifoConfig(I2S_Type *base, sai_fifo_t *config); -#endif - -/*! - * @brief SAI transmitter Frame sync configurations. - * - * @param base SAI base pointer. - * @param masterSlave master or slave. - * @param config frame sync configurations, can be NULL in slave mode. - */ -void SAI_TxSetFrameSyncConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_frame_sync_t *config); - -/*! - * @brief SAI receiver Frame sync configurations. - * - * @param base SAI base pointer. - * @param masterSlave master or slave. - * @param config frame sync configurations, can be NULL in slave mode. - */ -void SAI_RxSetFrameSyncConfig(I2S_Type *base, sai_master_slave_t masterSlave, sai_frame_sync_t *config); - -/*! - * @brief SAI transmitter Serial data configurations. - * - * @param base SAI base pointer. - * @param config serial data configurations. - */ -void SAI_TxSetSerialDataConfig(I2S_Type *base, sai_serial_data_t *config); - -/*! - * @brief SAI receiver Serial data configurations. - * - * @param base SAI base pointer. - * @param config serial data configurations. - */ -void SAI_RxSetSerialDataConfig(I2S_Type *base, sai_serial_data_t *config); - -/*! - * @brief SAI transmitter configurations. - * - * @param base SAI base pointer. - * @param config transmitter configurations. - */ -void SAI_TxSetConfig(I2S_Type *base, sai_transceiver_t *config); - -/*! - * @brief SAI receiver configurations. - * - * @param base SAI base pointer. - * @param config receiver configurations. - */ -void SAI_RxSetConfig(I2S_Type *base, sai_transceiver_t *config); - -/*! - * @brief Get classic I2S mode configurations. - * - * @param config transceiver configurations. - * @param bitWidth audio data bitWidth. - * @param mode audio data channel. - * @param saiChannelMask mask value of the channel to be enable. - */ -void SAI_GetClassicI2SConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask); - -/*! - * @brief Get left justified mode configurations. - * - * @param config transceiver configurations. - * @param bitWidth audio data bitWidth. - * @param mode audio data channel. - * @param saiChannelMask mask value of the channel to be enable. - */ -void SAI_GetLeftJustifiedConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask); - -/*! - * @brief Get right justified mode configurations. - * - * @param config transceiver configurations. - * @param bitWidth audio data bitWidth. - * @param mode audio data channel. - * @param saiChannelMask mask value of the channel to be enable. - */ -void SAI_GetRightJustifiedConfig(sai_transceiver_t *config, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask); - -/*! - * @brief Get TDM mode configurations. - * - * @param config transceiver configurations. - * @param frameSyncWidth length of frame sync. - * @param bitWidth audio data word width. - * @param dataWordNum word number in one frame. - * @param saiChannelMask mask value of the channel to be enable. - */ -void SAI_GetTDMConfig(sai_transceiver_t *config, - sai_frame_sync_len_t frameSyncWidth, - sai_word_width_t bitWidth, - uint32_t dataWordNum, - uint32_t saiChannelMask); - -/*! - * @brief Get DSP mode configurations. - * - * @note DSP mode is also called PCM mode which support MODE A and MODE B, - * DSP/PCM MODE A configuration flow. RX is similiar but uses SAI_RxSetConfig instead of SAI_TxSetConfig: - * @code - * SAI_GetDSPConfig(config, kSAI_FrameSyncLenOneBitClk, bitWidth, kSAI_Stereo, channelMask) - * config->frameSync.frameSyncEarly = true; - * SAI_TxSetConfig(base, config) - * @endcode - * - * DSP/PCM MODE B configuration flow for TX. RX is similiar but uses SAI_RxSetConfig instead of SAI_TxSetConfig: - * @code - * SAI_GetDSPConfig(config, kSAI_FrameSyncLenOneBitClk, bitWidth, kSAI_Stereo, channelMask) - * SAI_TxSetConfig(base, config) - * @endcode - * - * @param config transceiver configurations. - * @param frameSyncWidth length of frame sync. - * @param bitWidth audio data bitWidth. - * @param mode audio data channel. - * @param saiChannelMask mask value of the channel to enable. - */ -void SAI_GetDSPConfig(sai_transceiver_t *config, - sai_frame_sync_len_t frameSyncWidth, - sai_word_width_t bitWidth, - sai_mono_stereo_t mode, - uint32_t saiChannelMask); -/*! @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the SAI Tx status flag state. - * - * @param base SAI base pointer - * @return SAI Tx status flag value. Use the Status Mask to get the status value needed. - */ -static inline uint32_t SAI_TxGetStatusFlag(I2S_Type *base) -{ - return base->TCSR; -} - -/*! - * @brief Clears the SAI Tx status flag state. - * - * @param base SAI base pointer - * @param mask State mask. It can be a combination of the following source if defined: - * @arg kSAI_WordStartFlag - * @arg kSAI_SyncErrorFlag - * @arg kSAI_FIFOErrorFlag - */ -static inline void SAI_TxClearStatusFlags(I2S_Type *base, uint32_t mask) -{ - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask); -} - -/*! - * @brief Gets the SAI Tx status flag state. - * - * @param base SAI base pointer - * @return SAI Rx status flag value. Use the Status Mask to get the status value needed. - */ -static inline uint32_t SAI_RxGetStatusFlag(I2S_Type *base) -{ - return base->RCSR; -} - -/*! - * @brief Clears the SAI Rx status flag state. - * - * @param base SAI base pointer - * @param mask State mask. It can be a combination of the following sources if defined. - * @arg kSAI_WordStartFlag - * @arg kSAI_SyncErrorFlag - * @arg kSAI_FIFOErrorFlag - */ -static inline void SAI_RxClearStatusFlags(I2S_Type *base, uint32_t mask) -{ - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask); -} - -/*! - * @brief Do software reset or FIFO reset . - * - * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0. - * Software reset means clear the Tx internal logic, including the bit clock, frame count etc. But software - * reset will not clear any configuration registers like TCR1~TCR5. - * This function will also clear all the error flags such as FIFO error, sync error etc. - * - * @param base SAI base pointer - * @param type Reset type, FIFO reset or software reset - */ -void SAI_TxSoftwareReset(I2S_Type *base, sai_reset_type_t type); - -/*! - * @brief Do software reset or FIFO reset . - * - * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0. - * Software reset means clear the Rx internal logic, including the bit clock, frame count etc. But software - * reset will not clear any configuration registers like RCR1~RCR5. - * This function will also clear all the error flags such as FIFO error, sync error etc. - * - * @param base SAI base pointer - * @param type Reset type, FIFO reset or software reset - */ -void SAI_RxSoftwareReset(I2S_Type *base, sai_reset_type_t type); - -/*! - * @brief Set the Tx channel FIFO enable mask. - * - * @param base SAI base pointer - * @param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled, - * 3 means both channel 0 and channel 1 enabled. - */ -void SAI_TxSetChannelFIFOMask(I2S_Type *base, uint8_t mask); - -/*! - * @brief Set the Rx channel FIFO enable mask. - * - * @param base SAI base pointer - * @param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled, - * 3 means both channel 0 and channel 1 enabled. - */ -void SAI_RxSetChannelFIFOMask(I2S_Type *base, uint8_t mask); - -/*! - * @brief Set the Tx data order. - * - * @param base SAI base pointer - * @param order Data order MSB or LSB - */ -void SAI_TxSetDataOrder(I2S_Type *base, sai_data_order_t order); - -/*! - * @brief Set the Rx data order. - * - * @param base SAI base pointer - * @param order Data order MSB or LSB - */ -void SAI_RxSetDataOrder(I2S_Type *base, sai_data_order_t order); - -/*! - * @brief Set the Tx data order. - * - * @param base SAI base pointer - * @param polarity - */ -void SAI_TxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity); - -/*! - * @brief Set the Rx data order. - * - * @param base SAI base pointer - * @param polarity - */ -void SAI_RxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity); - -/*! - * @brief Set the Tx data order. - * - * @param base SAI base pointer - * @param polarity - */ -void SAI_TxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity); - -/*! - * @brief Set the Rx data order. - * - * @param base SAI base pointer - * @param polarity - */ -void SAI_RxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity); - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING -/*! - * @brief Set Tx FIFO packing feature. - * - * @param base SAI base pointer. - * @param pack FIFO pack type. It is element of sai_fifo_packing_t. - */ -void SAI_TxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack); - -/*! - * @brief Set Rx FIFO packing feature. - * - * @param base SAI base pointer. - * @param pack FIFO pack type. It is element of sai_fifo_packing_t. - */ -void SAI_RxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack); -#endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */ - -#if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR -/*! - * @brief Set Tx FIFO error continue. - * - * FIFO error continue mode means SAI will keep running while FIFO error occurred. If this feature - * not enabled, SAI will hang and users need to clear FEF flag in TCSR register. - * - * @param base SAI base pointer. - * @param isEnabled Is FIFO error continue enabled, true means enable, false means disable. - */ -static inline void SAI_TxSetFIFOErrorContinue(I2S_Type *base, bool isEnabled) -{ - if (isEnabled) - { - base->TCR4 |= I2S_TCR4_FCONT_MASK; - } - else - { - base->TCR4 &= ~I2S_TCR4_FCONT_MASK; - } -} - -/*! - * @brief Set Rx FIFO error continue. - * - * FIFO error continue mode means SAI will keep running while FIFO error occurred. If this feature - * not enabled, SAI will hang and users need to clear FEF flag in RCSR register. - * - * @param base SAI base pointer. - * @param isEnabled Is FIFO error continue enabled, true means enable, false means disable. - */ -static inline void SAI_RxSetFIFOErrorContinue(I2S_Type *base, bool isEnabled) -{ - if (isEnabled) - { - base->RCR4 |= I2S_RCR4_FCONT_MASK; - } - else - { - base->RCR4 &= ~I2S_RCR4_FCONT_MASK; - } -} -#endif - -/*! @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the SAI Tx interrupt requests. - * - * @param base SAI base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSAI_WordStartInterruptEnable - * @arg kSAI_SyncErrorInterruptEnable - * @arg kSAI_FIFOWarningInterruptEnable - * @arg kSAI_FIFORequestInterruptEnable - * @arg kSAI_FIFOErrorInterruptEnable - */ -static inline void SAI_TxEnableInterrupts(I2S_Type *base, uint32_t mask) -{ - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask); -} - -/*! - * @brief Enables the SAI Rx interrupt requests. - * - * @param base SAI base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSAI_WordStartInterruptEnable - * @arg kSAI_SyncErrorInterruptEnable - * @arg kSAI_FIFOWarningInterruptEnable - * @arg kSAI_FIFORequestInterruptEnable - * @arg kSAI_FIFOErrorInterruptEnable - */ -static inline void SAI_RxEnableInterrupts(I2S_Type *base, uint32_t mask) -{ - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask); -} - -/*! - * @brief Disables the SAI Tx interrupt requests. - * - * @param base SAI base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSAI_WordStartInterruptEnable - * @arg kSAI_SyncErrorInterruptEnable - * @arg kSAI_FIFOWarningInterruptEnable - * @arg kSAI_FIFORequestInterruptEnable - * @arg kSAI_FIFOErrorInterruptEnable - */ -static inline void SAI_TxDisableInterrupts(I2S_Type *base, uint32_t mask) -{ - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask)); -} - -/*! - * @brief Disables the SAI Rx interrupt requests. - * - * @param base SAI base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSAI_WordStartInterruptEnable - * @arg kSAI_SyncErrorInterruptEnable - * @arg kSAI_FIFOWarningInterruptEnable - * @arg kSAI_FIFORequestInterruptEnable - * @arg kSAI_FIFOErrorInterruptEnable - */ -static inline void SAI_RxDisableInterrupts(I2S_Type *base, uint32_t mask) -{ - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask)); -} - -/*! @} */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables/disables the SAI Tx DMA requests. - * @param base SAI base pointer - * @param mask DMA source - * The parameter can be combination of the following sources if defined. - * @arg kSAI_FIFOWarningDMAEnable - * @arg kSAI_FIFORequestDMAEnable - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void SAI_TxEnableDMA(I2S_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask); - } - else - { - base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask)); - } -} - -/*! - * @brief Enables/disables the SAI Rx DMA requests. - * @param base SAI base pointer - * @param mask DMA source - * The parameter can be a combination of the following sources if defined. - * @arg kSAI_FIFOWarningDMAEnable - * @arg kSAI_FIFORequestDMAEnable - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void SAI_RxEnableDMA(I2S_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask); - } - else - { - base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask)); - } -} - -/*! - * @brief Gets the SAI Tx data register address. - * - * This API is used to provide a transfer address for the SAI DMA transfer configuration. - * - * @param base SAI base pointer. - * @param channel Which data channel used. - * @return data register address. - */ -static inline uint32_t SAI_TxGetDataRegisterAddress(I2S_Type *base, uint32_t channel) -{ - return (uint32_t)(&(base->TDR)[channel]); -} - -/*! - * @brief Gets the SAI Rx data register address. - * - * This API is used to provide a transfer address for the SAI DMA transfer configuration. - * - * @param base SAI base pointer. - * @param channel Which data channel used. - * @return data register address. - */ -static inline uint32_t SAI_RxGetDataRegisterAddress(I2S_Type *base, uint32_t channel) -{ - return (uint32_t)(&(base->RDR)[channel]); -} - -/*! @} */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Configures the SAI Tx audio format. - * @deprecated Do not use this function. It has been superceded by @ref SAI_TxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base SAI base pointer. - * @param format Pointer to the SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master - * clock, this value should equal the masterClockHz. - */ -void SAI_TxSetFormat(I2S_Type *base, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Configures the SAI Rx audio format. - * @deprecated Do not use this function. It has been superceded by @ref SAI_RxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base SAI base pointer. - * @param format Pointer to the SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master - * clock, this value should equal the masterClockHz. - */ -void SAI_RxSetFormat(I2S_Type *base, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Sends data using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be written. - * @param size Bytes to be written. - */ -void SAI_WriteBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size); - -/*! - * @brief Sends data to multi channel using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @param channelMask channel mask. - * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be written. - * @param size Bytes to be written. - */ -void SAI_WriteMultiChannelBlocking( - I2S_Type *base, uint32_t channel, uint32_t channelMask, uint32_t bitWidth, uint8_t *buffer, uint32_t size); - -/*! - * @brief Writes data into SAI FIFO. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @param data Data needs to be written. - */ -static inline void SAI_WriteData(I2S_Type *base, uint32_t channel, uint32_t data) -{ - base->TDR[channel] = data; -} - -/*! - * @brief Receives data using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be read. - * @param size Bytes to be read. - */ -void SAI_ReadBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size); - -/*! - * @brief Receives multi channel data using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @param channelMask channel mask. - * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits. - * @param buffer Pointer to the data to be read. - * @param size Bytes to be read. - */ -void SAI_ReadMultiChannelBlocking( - I2S_Type *base, uint32_t channel, uint32_t channelMask, uint32_t bitWidth, uint8_t *buffer, uint32_t size); - -/*! - * @brief Reads data from the SAI FIFO. - * - * @param base SAI base pointer. - * @param channel Data channel used. - * @return Data in SAI FIFO. - */ -static inline uint32_t SAI_ReadData(I2S_Type *base, uint32_t channel) -{ - return base->RDR[channel]; -} - -/*! @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the SAI Tx handle. - * - * This function initializes the Tx handle for the SAI Tx transactional APIs. Call - * this function once to get the handle initialized. - * - * @param base SAI base pointer - * @param handle SAI handle pointer. - * @param callback Pointer to the user callback function. - * @param userData User parameter passed to the callback function - */ -void SAI_TransferTxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData); - -/*! - * @brief Initializes the SAI Rx handle. - * - * This function initializes the Rx handle for the SAI Rx transactional APIs. Call - * this function once to get the handle initialized. - * - * @param base SAI base pointer. - * @param handle SAI handle pointer. - * @param callback Pointer to the user callback function. - * @param userData User parameter passed to the callback function. - */ -void SAI_TransferRxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData); - -/*! - * @brief SAI transmitter transfer configurations. - * - * This function initializes the Tx, include bit clock, frame sync, master clock, serial data and fifo - * configurations. - * - * @param base SAI base pointer. - * @param handle SAI handle pointer. - * @param config tranmitter configurations. - */ -void SAI_TransferTxSetConfig(I2S_Type *base, sai_handle_t *handle, sai_transceiver_t *config); - -/*! - * @brief SAI receiver transfer configurations. - * - * This function initializes the Rx, include bit clock, frame sync, master clock, serial data and fifo - * configurations. - * - * @param base SAI base pointer. - * @param handle SAI handle pointer. - * @param config receiver configurations. - */ -void SAI_TransferRxSetConfig(I2S_Type *base, sai_handle_t *handle, sai_transceiver_t *config); - -/*! - * @brief Configures the SAI Tx audio format. - * @deprecated Do not use this function. It has been superceded by @ref SAI_TransferTxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base SAI base pointer. - * @param handle SAI handle pointer. - * @param format Pointer to the SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master - * clock, this value should equal the masterClockHz in format. - * @return Status of this function. Return value is the status_t. - */ -status_t SAI_TransferTxSetFormat(I2S_Type *base, - sai_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Configures the SAI Rx audio format. - * @deprecated Do not use this function. It has been superceded by @ref SAI_TransferRxSetConfig - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base SAI base pointer. - * @param handle SAI handle pointer. - * @param format Pointer to the SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master - * clock, this value should equal the masterClockHz in format. - * @return Status of this function. Return value is one of status_t. - */ -status_t SAI_TransferRxSetFormat(I2S_Type *base, - sai_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Performs an interrupt non-blocking send transfer on SAI. - * - * @note This API returns immediately after the transfer initiates. - * Call the SAI_TxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer - * is finished. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - * @param xfer Pointer to the sai_transfer_t structure. - * @retval kStatus_Success Successfully started the data receive. - * @retval kStatus_SAI_TxBusy Previous receive still not finished. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SAI_TransferSendNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer); - -/*! - * @brief Performs an interrupt non-blocking receive transfer on SAI. - * - * @note This API returns immediately after the transfer initiates. - * Call the SAI_RxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer - * is finished. - * - * @param base SAI base pointer - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - * @param xfer Pointer to the sai_transfer_t structure. - * @retval kStatus_Success Successfully started the data receive. - * @retval kStatus_SAI_RxBusy Previous receive still not finished. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SAI_TransferReceiveNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer); - -/*! - * @brief Gets a set byte count. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - * @param count Bytes count sent. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SAI_TransferGetSendCount(I2S_Type *base, sai_handle_t *handle, size_t *count); - -/*! - * @brief Gets a received byte count. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - * @param count Bytes count received. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SAI_TransferGetReceiveCount(I2S_Type *base, sai_handle_t *handle, size_t *count); - -/*! - * @brief Aborts the current send. - * - * @note This API can be called any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - */ -void SAI_TransferAbortSend(I2S_Type *base, sai_handle_t *handle); - -/*! - * @brief Aborts the current IRQ receive. - * - * @note This API can be called when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base SAI base pointer - * @param handle Pointer to the sai_handle_t structure which stores the transfer state. - */ -void SAI_TransferAbortReceive(I2S_Type *base, sai_handle_t *handle); - -/*! - * @brief Terminate all SAI send. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortSend. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateSend(I2S_Type *base, sai_handle_t *handle); - -/*! - * @brief Terminate all SAI receive. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortReceive. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateReceive(I2S_Type *base, sai_handle_t *handle); - -/*! - * @brief Tx interrupt handler. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure. - */ -void SAI_TransferTxHandleIRQ(I2S_Type *base, sai_handle_t *handle); - -/*! - * @brief Tx interrupt handler. - * - * @param base SAI base pointer. - * @param handle Pointer to the sai_handle_t structure. - */ -void SAI_TransferRxHandleIRQ(I2S_Type *base, sai_handle_t *handle); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ - -/*! @} */ - -#endif /* _FSL_SAI_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_sai_edma.c b/devices/MIMXRT1052/drivers/fsl_sai_edma.c deleted file mode 100644 index a317b56..0000000 --- a/devices/MIMXRT1052/drivers/fsl_sai_edma.c +++ /dev/null @@ -1,738 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_sai_edma.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.sai_edma" -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/* Used for 32byte aligned */ -#define STCD_ADDR(address) (edma_tcd_t *)(((uint32_t)(address) + 32UL) & ~0x1FU) - -static I2S_Type *const s_saiBases[] = I2S_BASE_PTRS; - -/*handle; - - (void)memset(&saiHandle->saiQueue[saiHandle->queueDriver], 0, sizeof(sai_transfer_t)); - saiHandle->queueDriver = (saiHandle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* If finished a block, call the callback function */ - if (saiHandle->callback != NULL) - { - (saiHandle->callback)(privHandle->base, saiHandle, kStatus_SAI_TxIdle, saiHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (saiHandle->saiQueue[saiHandle->queueDriver].data == NULL) - { - /* Disable DMA enable bit */ - SAI_TxEnableDMA(privHandle->base, kSAI_FIFORequestDMAEnable, false); - EDMA_AbortTransfer(handle); - } -} - -static void SAI_RxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds) -{ - sai_edma_private_handle_t *privHandle = (sai_edma_private_handle_t *)userData; - sai_edma_handle_t *saiHandle = privHandle->handle; - - (void)memset(&saiHandle->saiQueue[saiHandle->queueDriver], 0, sizeof(sai_transfer_t)); - saiHandle->queueDriver = (saiHandle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - /* If finished a block, call the callback function */ - if (saiHandle->callback != NULL) - { - (saiHandle->callback)(privHandle->base, saiHandle, kStatus_SAI_RxIdle, saiHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (saiHandle->saiQueue[saiHandle->queueDriver].data == NULL) - { - /* Disable DMA enable bit */ - SAI_RxEnableDMA(privHandle->base, kSAI_FIFORequestDMAEnable, false); - EDMA_AbortTransfer(handle); - } -} - -/*! - * brief Initializes the SAI eDMA handle. - * - * This function initializes the SAI master DMA handle, which can be used for other SAI master transactional APIs. - * Usually, for a specified SAI instance, call this API once to get the initialized handle. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param base SAI peripheral base address. - * param callback Pointer to user callback function. - * param userData User parameter passed to the callback function. - * param dmaHandle eDMA handle pointer, this handle shall be static allocated by users. - */ -void SAI_TransferTxCreateHandleEDMA( - I2S_Type *base, sai_edma_handle_t *handle, sai_edma_callback_t callback, void *userData, edma_handle_t *txDmaHandle) -{ - assert((handle != NULL) && (txDmaHandle != NULL)); - - uint32_t instance = SAI_GetInstance(base); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set sai base to handle */ - handle->dmaHandle = txDmaHandle; - handle->callback = callback; - handle->userData = userData; - - /* Set SAI state to idle */ - handle->state = (uint32_t)kSAI_Idle; - - s_edmaPrivateHandle[instance][0].base = base; - s_edmaPrivateHandle[instance][0].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(txDmaHandle, (edma_tcd_t *)(STCD_ADDR(handle->tcd)), SAI_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel */ - EDMA_SetCallback(txDmaHandle, SAI_TxEDMACallback, &s_edmaPrivateHandle[instance][0]); -} - -/*! - * brief Initializes the SAI Rx eDMA handle. - * - * This function initializes the SAI slave DMA handle, which can be used for other SAI master transactional APIs. - * Usually, for a specified SAI instance, call this API once to get the initialized handle. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param base SAI peripheral base address. - * param callback Pointer to user callback function. - * param userData User parameter passed to the callback function. - * param dmaHandle eDMA handle pointer, this handle shall be static allocated by users. - */ -void SAI_TransferRxCreateHandleEDMA( - I2S_Type *base, sai_edma_handle_t *handle, sai_edma_callback_t callback, void *userData, edma_handle_t *rxDmaHandle) -{ - assert((handle != NULL) && (rxDmaHandle != NULL)); - - uint32_t instance = SAI_GetInstance(base); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set sai base to handle */ - handle->dmaHandle = rxDmaHandle; - handle->callback = callback; - handle->userData = userData; - - /* Set SAI state to idle */ - handle->state = (uint32_t)kSAI_Idle; - - s_edmaPrivateHandle[instance][1].base = base; - s_edmaPrivateHandle[instance][1].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(rxDmaHandle, STCD_ADDR(handle->tcd), SAI_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel */ - EDMA_SetCallback(rxDmaHandle, SAI_RxEDMACallback, &s_edmaPrivateHandle[instance][1]); -} - -/*! - * brief Configures the SAI Tx audio format. - * - * deprecated Do not use this function. It has been superceded by ref SAI_TransferTxSetConfigEDMA - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to formatting requirements. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param format Pointer to SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If bit clock source is master - * clock, this value should equals to masterClockHz in format. - * retval kStatus_Success Audio format set successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - */ -void SAI_TransferTxSetFormatEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert((handle != NULL) && (format != NULL)); - - /* Configure the audio format to SAI registers */ - SAI_TxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz); - - /* Get the transfer size from format, this should be used in EDMA configuration */ - if (format->bitWidth == 24U) - { - handle->bytesPerFrame = 4U; - } - else - { - handle->bytesPerFrame = (uint8_t)(format->bitWidth / 8U); - } - - /* Update the data channel SAI used */ - handle->channel = format->channel; - - /* Clear the channel enable bits until do a send/receive */ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->count = (uint8_t)((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT - format->watermark); -#else - handle->count = 1U; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * @brief Configures the SAI Tx. - * - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param saiConfig sai configurations. - */ -void SAI_TransferTxSetConfigEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transceiver_t *saiConfig) -{ - assert((handle != NULL) && (saiConfig != NULL)); - - /* Configure the audio format to SAI registers */ - SAI_TxSetConfig(base, saiConfig); - - /* Get the transfer size from format, this should be used in EDMA configuration */ - if (saiConfig->serialData.dataWordLength == 24U) - { - handle->bytesPerFrame = 4U; - } - else - { - handle->bytesPerFrame = saiConfig->serialData.dataWordLength / 8U; - } - /* Update the data channel SAI used */ - handle->channel = saiConfig->startChannel; - - /* Clear the channel enable bits until do a send/receive */ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->count = (uint8_t)((uint32_t)FSL_FEATURE_SAI_FIFO_COUNT - saiConfig->fifo.fifoWatermark); -#else - handle->count = 1U; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * brief Configures the SAI Rx audio format. - * - * deprecated Do not use this function. It has been superceded by ref SAI_TransferRxSetConfigEDMA - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to formatting requirements. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param format Pointer to SAI audio data format structure. - * param mclkSourceClockHz SAI master clock source frequency in Hz. - * param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is the master - * clock, this value should equal to masterClockHz in format. - * retval kStatus_Success Audio format set successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - */ -void SAI_TransferRxSetFormatEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz) -{ - assert((handle != NULL) && (format != NULL)); - - /* Configure the audio format to SAI registers */ - SAI_RxSetFormat(base, format, mclkSourceClockHz, bclkSourceClockHz); - - /* Get the transfer size from format, this should be used in EDMA configuration */ - if (format->bitWidth == 24U) - { - handle->bytesPerFrame = 4U; - } - else - { - handle->bytesPerFrame = (uint8_t)(format->bitWidth / 8U); - } - - /* Update the data channel SAI used */ - handle->channel = format->channel; - - /* Clear the channel enable bits until do a send/receive */ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->count = format->watermark; -#else - handle->count = 1U; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * @brief Configures the SAI Rx. - * - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param saiConfig sai configurations. - */ -void SAI_TransferRxSetConfigEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transceiver_t *saiConfig) -{ - assert((handle != NULL) && (saiConfig != NULL)); - - /* Configure the audio format to SAI registers */ - SAI_RxSetConfig(base, saiConfig); - - /* Get the transfer size from format, this should be used in EDMA configuration */ - if (saiConfig->serialData.dataWordLength == 24U) - { - handle->bytesPerFrame = 4U; - } - else - { - handle->bytesPerFrame = saiConfig->serialData.dataWordLength / 8U; - } - - /* Update the data channel SAI used */ - handle->channel = saiConfig->startChannel; - - /* Clear the channel enable bits until do a send/receive */ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; -#if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1) - handle->count = saiConfig->fifo.fifoWatermark; -#else - handle->count = 1U; -#endif /* FSL_FEATURE_SAI_FIFO_COUNT */ -} - -/*! - * brief Performs a non-blocking SAI transfer using DMA. - * - * note This interface returns immediately after the transfer initiates. Call - * SAI_GetTransferStatus to poll the transfer status and check whether the SAI transfer is finished. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param xfer Pointer to the DMA transfer structure. - * retval kStatus_Success Start a SAI eDMA send successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - * retval kStatus_TxBusy SAI is busy sending data. - */ -status_t SAI_TransferSendEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer) -{ - assert((handle != NULL) && (xfer != NULL)); - - edma_transfer_config_t config = {0}; - uint32_t destAddr = SAI_TxGetDataRegisterAddress(base, handle->channel); - - /* Check if input parameter invalid */ - if ((xfer->data == NULL) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - if (handle->saiQueue[handle->queueUser].data != NULL) - { - return kStatus_SAI_QueueFull; - } - - /* Change the state of handle */ - handle->state = (uint32_t)kSAI_Busy; - - /* Update the queue state */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->saiQueue[handle->queueUser].data = xfer->data; - handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, xfer->data, handle->bytesPerFrame, (uint32_t *)destAddr, handle->bytesPerFrame, - (uint32_t)handle->count * handle->bytesPerFrame, xfer->dataSize, kEDMA_MemoryToPeripheral); - - /* Store the initially configured eDMA minor byte transfer count into the SAI handle */ - handle->nbytes = handle->count * handle->bytesPerFrame; - - if (EDMA_SubmitTransfer(handle->dmaHandle, &config) != kStatus_Success) - { - return kStatus_SAI_QueueFull; - } - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaHandle); - - /* Enable DMA enable bit */ - SAI_TxEnableDMA(base, kSAI_FIFORequestDMAEnable, true); - - /* Enable SAI Tx clock */ - SAI_TxEnable(base, true); - - /* Enable the channel FIFO */ - base->TCR3 |= I2S_TCR3_TCE(1UL << handle->channel); - - return kStatus_Success; -} - -/*! - * brief Performs a non-blocking SAI receive using eDMA. - * - * note This interface returns immediately after the transfer initiates. Call - * the SAI_GetReceiveRemainingBytes to poll the transfer status and check whether the SAI transfer is finished. - * - * param base SAI base pointer - * param handle SAI eDMA handle pointer. - * param xfer Pointer to DMA transfer structure. - * retval kStatus_Success Start a SAI eDMA receive successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - * retval kStatus_RxBusy SAI is busy receiving data. - */ -status_t SAI_TransferReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer) -{ - assert((handle != NULL) && (xfer != NULL)); - - edma_transfer_config_t config = {0}; - uint32_t srcAddr = SAI_RxGetDataRegisterAddress(base, handle->channel); - - /* Check if input parameter invalid */ - if ((xfer->data == NULL) || (xfer->dataSize == 0U)) - { - return kStatus_InvalidArgument; - } - - if (handle->saiQueue[handle->queueUser].data != NULL) - { - return kStatus_SAI_QueueFull; - } - - /* Change the state of handle */ - handle->state = (uint32_t)kSAI_Busy; - - /* Update queue state */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->saiQueue[handle->queueUser].data = xfer->data; - handle->saiQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->queueUser = (handle->queueUser + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, (uint32_t *)srcAddr, handle->bytesPerFrame, xfer->data, handle->bytesPerFrame, - (uint32_t)handle->count * handle->bytesPerFrame, xfer->dataSize, kEDMA_PeripheralToMemory); - - /* Store the initially configured eDMA minor byte transfer count into the SAI handle */ - handle->nbytes = handle->count * handle->bytesPerFrame; - - if (EDMA_SubmitTransfer(handle->dmaHandle, &config) != kStatus_Success) - { - return kStatus_SAI_QueueFull; - } - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaHandle); - - /* Enable DMA enable bit */ - SAI_RxEnableDMA(base, kSAI_FIFORequestDMAEnable, true); - - /* Enable the channel FIFO */ - base->RCR3 |= I2S_RCR3_RCE(1UL << handle->channel); - - /* Enable SAI Rx clock */ - SAI_RxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Aborts a SAI transfer using eDMA. - * - * This function only aborts the current transfer slots, the other transfer slots' information still kept - * in the handler. If users want to terminate all transfer slots, just call SAI_TransferTerminateSendEDMA. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferAbortSendEDMA(I2S_Type *base, sai_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaHandle); - - /* Disable the channel FIFO */ - base->TCR3 &= ~I2S_TCR3_TCE_MASK; - - /* Disable DMA enable bit */ - SAI_TxEnableDMA(base, kSAI_FIFORequestDMAEnable, false); - - /* Disable Tx */ - SAI_TxEnable(base, false); - - /* If Tx is disabled, reset the FIFO pointer and clear error flags */ - if ((base->TCSR & I2S_TCSR_TE_MASK) == 0UL) - { - base->TCSR |= (I2S_TCSR_FR_MASK | I2S_TCSR_SR_MASK); - base->TCSR &= ~I2S_TCSR_SR_MASK; - } - - /* Handle the queue index */ - (void)memset(&handle->saiQueue[handle->queueDriver], 0, sizeof(sai_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Set the handle state */ - handle->state = (uint32_t)kSAI_Idle; -} - -/*! - * brief Aborts a SAI receive using eDMA. - * - * This function only aborts the current transfer slots, the other transfer slots' information still kept - * in the handler. If users want to terminate all transfer slots, just call SAI_TransferTerminateReceiveEDMA. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferAbortReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaHandle); - - /* Disable the channel FIFO */ - base->RCR3 &= ~I2S_RCR3_RCE_MASK; - - /* Disable DMA enable bit */ - SAI_RxEnableDMA(base, kSAI_FIFORequestDMAEnable, false); - - /* Disable Rx */ - SAI_RxEnable(base, false); - - /* If Rx is disabled, reset the FIFO pointer and clear error flags */ - if ((base->RCSR & I2S_RCSR_RE_MASK) == 0UL) - { - base->RCSR |= (I2S_RCSR_FR_MASK | I2S_RCSR_SR_MASK); - base->RCSR &= ~I2S_RCSR_SR_MASK; - } - - /* Handle the queue index */ - (void)memset(&handle->saiQueue[handle->queueDriver], 0, sizeof(sai_transfer_t)); - handle->queueDriver = (handle->queueDriver + 1U) % (uint8_t)SAI_XFER_QUEUE_SIZE; - - /* Set the handle state */ - handle->state = (uint32_t)kSAI_Idle; -} - -/*! - * brief Terminate all SAI send. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortSendEDMA. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateSendEDMA(I2S_Type *base, sai_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Abort the current transfer */ - SAI_TransferAbortSendEDMA(base, handle); - - /* Clear all the internal information */ - (void)memset(handle->tcd, 0, sizeof(handle->tcd)); - (void)memset(handle->saiQueue, 0, sizeof(handle->saiQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - - handle->queueUser = 0U; - handle->queueDriver = 0U; -} - -/*! - * brief Terminate all SAI receive. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortReceiveEDMA. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Abort the current transfer */ - SAI_TransferAbortReceiveEDMA(base, handle); - - /* Clear all the internal information */ - (void)memset(handle->tcd, 0, sizeof(handle->tcd)); - (void)memset(handle->saiQueue, 0, sizeof(handle->saiQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - - handle->queueUser = 0U; - handle->queueDriver = 0U; -} - -/*! - * brief Gets byte count sent by SAI. - * - * param base SAI base pointer. - * param handle SAI eDMA handle pointer. - * param count Bytes count sent by SAI. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SAI_TransferGetSendCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kSAI_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel)); - } - - return status; -} - -/*! - * brief Gets byte count received by SAI. - * - * param base SAI base pointer - * param handle SAI eDMA handle pointer. - * param count Bytes count received by SAI. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SAI_TransferGetReceiveCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kSAI_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaHandle->base, handle->dmaHandle->channel)); - } - - return status; -} - -/*! - * @rief Gets valid transfer slot. - * - * This function can be used to query the valid transfer request slot that the application can submit. - * It should be called in the critical section, that means the application could call it in the corresponding callback - * function or disable IRQ before calling it in the application, otherwise, the returned value may not correct. - * - * param base SAI base pointer - * param handle SAI eDMA handle pointer. - * retval valid slot count that application submit. - */ -uint32_t SAI_TransferGetValidTransferSlotsEDMA(I2S_Type *base, sai_edma_handle_t *handle) -{ - uint32_t validSlot = 0U; - - for (uint32_t i = 0U; i < (uint32_t)SAI_XFER_QUEUE_SIZE; i++) - { - if (handle->saiQueue[i].data == NULL) - { - validSlot++; - } - } - - return validSlot; -} diff --git a/devices/MIMXRT1052/drivers/fsl_sai_edma.h b/devices/MIMXRT1052/drivers/fsl_sai_edma.h deleted file mode 100644 index 76e5004..0000000 --- a/devices/MIMXRT1052/drivers/fsl_sai_edma.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_SAI_EDMA_H_ -#define _FSL_SAI_EDMA_H_ - -#include "fsl_edma.h" -#include "fsl_sai.h" - -/*! - * @addtogroup sai_edma SAI EDMA Driver - * @ingroup sai - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SAI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) /*!< Version 2.4.0 */ -/*@}*/ - -typedef struct sai_edma_handle sai_edma_handle_t; - -/*! @brief SAI eDMA transfer callback function for finish and error */ -typedef void (*sai_edma_callback_t)(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData); - -/*! @brief SAI DMA transfer handle, users should not touch the content of the handle.*/ -struct sai_edma_handle -{ - edma_handle_t *dmaHandle; /*!< DMA handler for SAI send */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - uint8_t bytesPerFrame; /*!< Bytes in a frame */ - uint8_t channel; /*!< Which data channel */ - uint8_t count; /*!< The transfer data count in a DMA request */ - uint32_t state; /*!< Internal state for SAI eDMA transfer */ - sai_edma_callback_t callback; /*!< Callback for users while transfer finish or error occurs */ - void *userData; /*!< User callback parameter */ - uint8_t tcd[(SAI_XFER_QUEUE_SIZE + 1U) * sizeof(edma_tcd_t)]; /*!< TCD pool for eDMA transfer. */ - sai_transfer_t saiQueue[SAI_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ - size_t transferSize[SAI_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer. */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the SAI eDMA handle. - * - * This function initializes the SAI master DMA handle, which can be used for other SAI master transactional APIs. - * Usually, for a specified SAI instance, call this API once to get the initialized handle. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param base SAI peripheral base address. - * @param callback Pointer to user callback function. - * @param userData User parameter passed to the callback function. - * @param txDmaHandle eDMA handle pointer, this handle shall be static allocated by users. - */ -void SAI_TransferTxCreateHandleEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_edma_callback_t callback, - void *userData, - edma_handle_t *txDmaHandle); - -/*! - * @brief Initializes the SAI Rx eDMA handle. - * - * This function initializes the SAI slave DMA handle, which can be used for other SAI master transactional APIs. - * Usually, for a specified SAI instance, call this API once to get the initialized handle. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param base SAI peripheral base address. - * @param callback Pointer to user callback function. - * @param userData User parameter passed to the callback function. - * @param rxDmaHandle eDMA handle pointer, this handle shall be static allocated by users. - */ -void SAI_TransferRxCreateHandleEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_edma_callback_t callback, - void *userData, - edma_handle_t *rxDmaHandle); - -/*! - * @brief Configures the SAI Tx audio format. - * - * @deprecated Do not use this function. It has been superceded by @ref SAI_TransferTxSetConfigEDMA - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to formatting requirements. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param format Pointer to SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If bit clock source is master - * clock, this value should equals to masterClockHz in format. - * @retval kStatus_Success Audio format set successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - */ -void SAI_TransferTxSetFormatEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Configures the SAI Rx audio format. - * - * @deprecated Do not use this function. It has been superceded by @ref SAI_TransferRxSetConfigEDMA - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. This function also sets the eDMA parameter according to formatting requirements. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param format Pointer to SAI audio data format structure. - * @param mclkSourceClockHz SAI master clock source frequency in Hz. - * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is the master - * clock, this value should equal to masterClockHz in format. - * @retval kStatus_Success Audio format set successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - */ -void SAI_TransferRxSetFormatEDMA(I2S_Type *base, - sai_edma_handle_t *handle, - sai_transfer_format_t *format, - uint32_t mclkSourceClockHz, - uint32_t bclkSourceClockHz); - -/*! - * @brief Configures the SAI Tx. - * - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param saiConfig sai configurations. - */ -void SAI_TransferTxSetConfigEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transceiver_t *saiConfig); - -/*! - * @brief Configures the SAI Rx. - * - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param saiConfig sai configurations. - */ -void SAI_TransferRxSetConfigEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transceiver_t *saiConfig); - -/*! - * @brief Performs a non-blocking SAI transfer using DMA. - * - * @note This interface returns immediately after the transfer initiates. Call - * SAI_GetTransferStatus to poll the transfer status and check whether the SAI transfer is finished. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param xfer Pointer to the DMA transfer structure. - * @retval kStatus_Success Start a SAI eDMA send successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - * @retval kStatus_TxBusy SAI is busy sending data. - */ -status_t SAI_TransferSendEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer); - -/*! - * @brief Performs a non-blocking SAI receive using eDMA. - * - * @note This interface returns immediately after the transfer initiates. Call - * the SAI_GetReceiveRemainingBytes to poll the transfer status and check whether the SAI transfer is finished. - * - * @param base SAI base pointer - * @param handle SAI eDMA handle pointer. - * @param xfer Pointer to DMA transfer structure. - * @retval kStatus_Success Start a SAI eDMA receive successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - * @retval kStatus_RxBusy SAI is busy receiving data. - */ -status_t SAI_TransferReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle, sai_transfer_t *xfer); - -/*! - * @brief Terminate all SAI send. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortSendEDMA. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateSendEDMA(I2S_Type *base, sai_edma_handle_t *handle); - -/*! - * @brief Terminate all SAI receive. - * - * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the - * current transfer slot, please call SAI_TransferAbortReceiveEDMA. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferTerminateReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle); - -/*! - * @brief Aborts a SAI transfer using eDMA. - * - * This function only aborts the current transfer slots, the other transfer slots' information still kept - * in the handler. If users want to terminate all transfer slots, just call SAI_TransferTerminateSendEDMA. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferAbortSendEDMA(I2S_Type *base, sai_edma_handle_t *handle); - -/*! - * @brief Aborts a SAI receive using eDMA. - * - * This function only aborts the current transfer slots, the other transfer slots' information still kept - * in the handler. If users want to terminate all transfer slots, just call SAI_TransferTerminateReceiveEDMA. - * - * @param base SAI base pointer - * @param handle SAI eDMA handle pointer. - */ -void SAI_TransferAbortReceiveEDMA(I2S_Type *base, sai_edma_handle_t *handle); - -/*! - * @brief Gets byte count sent by SAI. - * - * @param base SAI base pointer. - * @param handle SAI eDMA handle pointer. - * @param count Bytes count sent by SAI. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SAI_TransferGetSendCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count); - -/*! - * @brief Gets byte count received by SAI. - * - * @param base SAI base pointer - * @param handle SAI eDMA handle pointer. - * @param count Bytes count received by SAI. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SAI_TransferGetReceiveCountEDMA(I2S_Type *base, sai_edma_handle_t *handle, size_t *count); - -/*! - * @brief Gets valid transfer slot. - * - * This function can be used to query the valid transfer request slot that the application can submit. - * It should be called in the critical section, that means the application could call it in the corresponding callback - * function or disable IRQ before calling it in the application, otherwise, the returned value may not correct. - * - * @param base SAI base pointer - * @param handle SAI eDMA handle pointer. - * @retval valid slot count that application submit. - */ -uint32_t SAI_TransferGetValidTransferSlotsEDMA(I2S_Type *base, sai_edma_handle_t *handle); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_semc.c b/devices/MIMXRT1052/drivers/fsl_semc.c deleted file mode 100644 index dd941e1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_semc.c +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_semc.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.semc" -#endif - -/*! @brief Define macros for SEMC driver. */ -#define SEMC_IPCOMMANDDATASIZEBYTEMAX (4U) -#define SEMC_IPCOMMANDMAGICKEY (0xA55A) -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) -#define SEMC_IOCR_PINMUXBITWIDTH (0x4UL) -#else -#define SEMC_IOCR_PINMUXBITWIDTH (0x3UL) -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ -#define SEMC_IOCR_NAND_CE (4UL) -#define SEMC_IOCR_NOR_CE (5UL) -#define SEMC_IOCR_NOR_CE_A8 (2UL) -#define SEMC_IOCR_PSRAM_CE (6UL) -#define SEMC_IOCR_PSRAM_CE_A8 (3UL) -#define SEMC_IOCR_DBI_CSX (7UL) -#define SEMC_IOCR_DBI_CSX_A8 (4UL) -#define SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE (24U) -#define SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHMAX (28U) -#define SEMC_BMCR0_TYPICAL_WQOS (5U) -#define SEMC_BMCR0_TYPICAL_WAGE (8U) -#define SEMC_BMCR0_TYPICAL_WSH (0x40U) -#define SEMC_BMCR0_TYPICAL_WRWS (0x10U) -#define SEMC_BMCR1_TYPICAL_WQOS (5U) -#define SEMC_BMCR1_TYPICAL_WAGE (8U) -#define SEMC_BMCR1_TYPICAL_WPH (0x60U) -#define SEMC_BMCR1_TYPICAL_WBR (0x40U) -#define SEMC_BMCR1_TYPICAL_WRWS (0x24U) -#define SEMC_STARTADDRESS (0x80000000UL) -#define SEMC_ENDADDRESS (0xDFFFFFFFUL) -#define SEMC_BR_MEMSIZE_MIN (4U) -#define SEMC_BR_MEMSIZE_OFFSET (2U) -#define SEMC_BR_MEMSIZE_MAX (4UL * 1024UL * 1024UL) -#define SEMC_SDRAM_MODESETCAL_OFFSET (4U) -#define SEMC_BR_REG_NUM (9U) -#define SEMC_BYTE_NUMBIT (8U) -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for SEMC module. - * - * @param base SEMC peripheral base address - */ -static uint32_t SEMC_GetInstance(SEMC_Type *base); - -/*! - * @brief Covert the input memory size to internal register set value. - * - * @param base SEMC peripheral base address - * @param size_kbytes SEMC memory size in unit of kbytes. - * @param sizeConverted SEMC converted memory size to 0 ~ 0x1F. - * @return Execution status. - */ -static status_t SEMC_CovertMemorySize(SEMC_Type *base, uint32_t size_kbytes, uint8_t *sizeConverted); - -/*! - * @brief Covert the external timing nanosecond to internal clock cycle. - * - * @param time_ns SEMC external time interval in unit of nanosecond. - * @param clkSrc_Hz SEMC clock source frequency. - * @return The changed internal clock cycle. - */ -static uint8_t SEMC_ConvertTiming(uint32_t time_ns, uint32_t clkSrc_Hz); - -/*! - * @brief Configure IP command. - * - * @param base SEMC peripheral base address. - * @param size_bytes SEMC IP command data size. - * @return Execution status. - */ -static status_t SEMC_ConfigureIPCommand(SEMC_Type *base, uint8_t size_bytes); - -/*! - * @brief Check if the IP command has finished. - * - * @param base SEMC peripheral base address. - * @return Execution status. - */ -static status_t SEMC_IsIPCommandDone(SEMC_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to SEMC clocks for each instance. */ -static const clock_ip_name_t s_semcClock[FSL_FEATURE_SOC_SEMC_COUNT] = SEMC_CLOCKS; -#if (defined(SEMC_EXSC_CLOCKS)) -static const clock_ip_name_t s_semcExtClock[FSL_FEATURE_SOC_SEMC_COUNT] = SEMC_EXSC_CLOCKS; -#endif /* SEMC_EXSC_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! @brief Pointers to SEMC bases for each instance. */ -static SEMC_Type *const s_semcBases[] = SEMC_BASE_PTRS; -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t SEMC_GetInstance(SEMC_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_semcBases); instance++) - { - if (s_semcBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_semcBases)); - - return instance; -} - -static status_t SEMC_CovertMemorySize(SEMC_Type *base, uint32_t size_kbytes, uint8_t *sizeConverted) -{ - assert(sizeConverted != NULL); - uint32_t memsize; - status_t status = kStatus_Success; - - if ((size_kbytes < SEMC_BR_MEMSIZE_MIN) || (size_kbytes > SEMC_BR_MEMSIZE_MAX)) - { - status = kStatus_SEMC_InvalidMemorySize; - } - else - { - *sizeConverted = 0U; - memsize = size_kbytes / 8U; - while (memsize != 0x00U) - { - memsize >>= 1U; - (*sizeConverted)++; - } - } - - return status; -} - -static uint8_t SEMC_ConvertTiming(uint32_t time_ns, uint32_t clkSrc_Hz) -{ - assert(clkSrc_Hz != 0x00U); - - uint8_t clockCycles = 0; - uint32_t tClk_ps; - - clkSrc_Hz /= 1000000U; - /* Using ps for high resolution */ - tClk_ps = 1000000U / clkSrc_Hz; - - while (tClk_ps * clockCycles < time_ns * 1000U) - { - clockCycles++; - } - - return (clockCycles == 0x00U) ? clockCycles : (clockCycles - 0x01U); -} - -static status_t SEMC_ConfigureIPCommand(SEMC_Type *base, uint8_t size_bytes) -{ - status_t status = kStatus_Success; - - if ((size_bytes > SEMC_IPCOMMANDDATASIZEBYTEMAX) || (size_bytes == 0x00U)) - { - status = kStatus_SEMC_InvalidIpcmdDataSize; - } - else - { - /* Set data size. */ - /* Note: It is better to set data size as the device data port width when transferring - * device command data. But for device memory data transfer, it can be set freely. - * Note: If the data size is greater than data port width, for example, datsz = 4, data port = 16bit, - * then the 4-byte data transfer will be split into two 2-byte transfers, the slave address - * will be switched automatically according to connected device type*/ - base->IPCR1 = SEMC_IPCR1_DATSZ(size_bytes); - /* Clear data size. */ - base->IPCR2 = 0; - /* Set data size. */ - if (size_bytes < 4U) - { - base->IPCR2 |= SEMC_IPCR2_BM3_MASK; - } - if (size_bytes < 3U) - { - base->IPCR2 |= SEMC_IPCR2_BM2_MASK; - } - if (size_bytes < 2U) - { - base->IPCR2 |= SEMC_IPCR2_BM1_MASK; - } - } - - return status; -} - -static status_t SEMC_IsIPCommandDone(SEMC_Type *base) -{ - status_t status = kStatus_Success; - - /* Poll status bit till command is done*/ - while ((base->INTR & (uint32_t)SEMC_INTR_IPCMDDONE_MASK) == 0x00U) - { - }; - - /* Clear status bit */ - base->INTR |= SEMC_INTR_IPCMDDONE_MASK; - - /* Check error status */ - if ((base->INTR & (uint32_t)SEMC_INTR_IPCMDERR_MASK) != 0x00U) - { - base->INTR |= SEMC_INTR_IPCMDERR_MASK; - status = kStatus_SEMC_IpCommandExecutionError; - } - - return status; -} - -/*! - * brief Gets the SEMC default basic configuration structure. - * - * The purpose of this API is to get the default SEMC - * configure structure for SEMC_Init(). User may use the initialized - * structure unchanged in SEMC_Init(), or modify some fields of the - * structure before calling SEMC_Init(). - * Example: - code - semc_config_t config; - SEMC_GetDefaultConfig(&config); - endcode - * param config The SEMC configuration structure pointer. - */ -void SEMC_GetDefaultConfig(semc_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->queueWeight.queueaEnable = true; - semc_queuea_weight_struct_t *queueaWeight = &(config->queueWeight.queueaWeight.queueaConfig); - config->queueWeight.queuebEnable = true; - semc_queueb_weight_struct_t *queuebWeight = &(config->queueWeight.queuebWeight.queuebConfig); - - /* Get default settings. */ - config->dqsMode = kSEMC_Loopbackinternal; - config->cmdTimeoutCycles = 0xFF; - config->busTimeoutCycles = 0x1F; - - queueaWeight->qos = SEMC_BMCR0_TYPICAL_WQOS; - queueaWeight->aging = SEMC_BMCR0_TYPICAL_WAGE; - queueaWeight->slaveHitSwith = SEMC_BMCR0_TYPICAL_WSH; - queueaWeight->slaveHitNoswitch = SEMC_BMCR0_TYPICAL_WRWS; - queuebWeight->qos = SEMC_BMCR1_TYPICAL_WQOS; - queuebWeight->aging = SEMC_BMCR1_TYPICAL_WAGE; - queuebWeight->slaveHitSwith = SEMC_BMCR1_TYPICAL_WRWS; - queuebWeight->weightPagehit = SEMC_BMCR1_TYPICAL_WPH; - queuebWeight->bankRotation = SEMC_BMCR1_TYPICAL_WBR; -} - -/*! - * brief Initializes SEMC. - * This function ungates the SEMC clock and initializes SEMC. - * This function must be called before calling any other SEMC driver functions. - * - * param base SEMC peripheral base address. - * param configure The SEMC configuration structure pointer. - */ -void SEMC_Init(SEMC_Type *base, semc_config_t *configure) -{ - assert(configure != NULL); - - uint8_t index = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Un-gate sdram controller clock. */ - CLOCK_EnableClock(s_semcClock[SEMC_GetInstance(base)]); -#if (defined(SEMC_EXSC_CLOCKS)) - CLOCK_EnableClock(s_semcExtClock[SEMC_GetInstance(base)]); -#endif /* SEMC_EXSC_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Initialize all BR to zero due to the default base address set. */ - for (index = 0; index < SEMC_BR_REG_NUM; index++) - { - base->BR[index] = 0; - } - - /* Software reset for SEMC internal logical . */ - base->MCR = SEMC_MCR_SWRST_MASK; - while ((base->MCR & (uint32_t)SEMC_MCR_SWRST_MASK) != 0x00U) - { - } - - /* Configure, disable module first. */ - base->MCR |= SEMC_MCR_MDIS_MASK | SEMC_MCR_BTO(configure->busTimeoutCycles) | - SEMC_MCR_CTO(configure->cmdTimeoutCycles) | SEMC_MCR_DQSMD(configure->dqsMode); - - if (configure->queueWeight.queueaEnable == true) - { - /* Configure Queue A for AXI bus access to SDRAM, NAND, NOR, SRAM and DBI slaves.*/ - base->BMCR0 = (uint32_t)(configure->queueWeight.queueaWeight.queueaValue); - } - else - { - base->BMCR0 = 0x00U; - } - - if (configure->queueWeight.queuebEnable == true) - { - /* Configure Queue B for AXI bus access to SDRAM slave. */ - base->BMCR1 = (uint32_t)(configure->queueWeight.queuebWeight.queuebValue); - } - else - { - base->BMCR1 = 0x00U; - } - - /* Enable SEMC. */ - base->MCR &= ~SEMC_MCR_MDIS_MASK; -} - -/*! - * brief Deinitializes the SEMC module and gates the clock. - * This function gates the SEMC clock. As a result, the SEMC - * module doesn't work after calling this function. - * - * param base SEMC peripheral base address. - */ -void SEMC_Deinit(SEMC_Type *base) -{ - /* Disable module. Check there is no pending command before disable module. */ - while ((base->STS0 & (uint32_t)SEMC_STS0_IDLE_MASK) == 0x00U) - { - ; - } - - base->MCR |= SEMC_MCR_MDIS_MASK | SEMC_MCR_SWRST_MASK; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable SDRAM clock. */ - CLOCK_DisableClock(s_semcClock[SEMC_GetInstance(base)]); -#if (defined(SEMC_EXSC_CLOCKS)) - CLOCK_DisableClock(s_semcExtClock[SEMC_GetInstance(base)]); -#endif /* SEMC_EXSC_CLOCKS */ -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Configures SDRAM controller in SEMC. - * - * param base SEMC peripheral base address. - * param cs The chip selection. - * param config The sdram configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSDRAM(SEMC_Type *base, semc_sdram_cs_t cs, semc_sdram_config_t *config, uint32_t clkSrc_Hz) -{ - assert(config != NULL); - assert(clkSrc_Hz > 0x00U); - assert(config->refreshBurstLen > 0x00U); - - uint8_t memsize; - status_t result = kStatus_Success; - uint16_t prescale = (uint16_t)(config->tPrescalePeriod_Ns / 16U / (1000000000U / clkSrc_Hz)); - uint32_t refresh; - uint32_t urgentRef; - uint32_t idle; - uint32_t mode; - uint32_t timing; - - if ((config->address < SEMC_STARTADDRESS) || (config->address > SEMC_ENDADDRESS)) - { - return kStatus_SEMC_InvalidBaseAddress; - } - - if (config->csxPinMux == kSEMC_MUXA8) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - - if (prescale > 256U) - { - return kStatus_SEMC_InvalidTimerSetting; - } - - refresh = config->refreshPeriod_nsPerRow / config->tPrescalePeriod_Ns; - urgentRef = config->refreshUrgThreshold / config->tPrescalePeriod_Ns; - idle = config->tIdleTimeout_Ns / config->tPrescalePeriod_Ns; - - uint32_t iocReg = base->IOCR & (~(SEMC_IOCR_PINMUXBITWIDTH << (uint32_t)config->csxPinMux)); - - /* Base control. */ - result = SEMC_CovertMemorySize(base, config->memsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - - base->BR[cs] = (config->address & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - -#if defined(FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT) && (FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT) - if (kSEMC_SdramColunm_8bit == config->columnAddrBitNum) - { - base->SDRAMCR0 = SEMC_SDRAMCR0_PS(config->portSize) | SEMC_SDRAMCR0_BL(config->burstLen) | - SEMC_SDRAMCR0_COL8(true) | SEMC_SDRAMCR0_CL(config->casLatency); - } - else -#endif /* FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT */ - { - base->SDRAMCR0 = SEMC_SDRAMCR0_PS(config->portSize) | SEMC_SDRAMCR0_BL(config->burstLen) | - SEMC_SDRAMCR0_COL(config->columnAddrBitNum) | SEMC_SDRAMCR0_CL(config->casLatency); - } - - /* IOMUX setting. */ - if (cs != kSEMC_SDRAM_CS0) - { - base->IOCR = iocReg | ((uint32_t)cs << (uint32_t)config->csxPinMux); - } - - base->IOCR &= ~SEMC_IOCR_MUX_A8_MASK; - -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint32_t tempDelayChain = base->DCCR; - - tempDelayChain &= ~(SEMC_DCCR_SDRAMVAL_MASK | SEMC_DCCR_SDRAMEN_MASK); - /* Configure delay chain. */ - base->DCCR = tempDelayChain | SEMC_DCCR_SDRAMVAL((uint32_t)config->delayChain - 0x01U) | SEMC_DCCR_SDRAMEN_MASK; -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ - - timing = SEMC_SDRAMCR1_PRE2ACT(SEMC_ConvertTiming(config->tPrecharge2Act_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR1_ACT2RW(SEMC_ConvertTiming(config->tAct2ReadWrite_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR1_RFRC(SEMC_ConvertTiming(config->tRefreshRecovery_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR1_WRC(SEMC_ConvertTiming(config->tWriteRecovery_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR1_CKEOFF(SEMC_ConvertTiming(config->tCkeOff_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR1_ACT2PRE(SEMC_ConvertTiming(config->tAct2Prechage_Ns, clkSrc_Hz)); - /* SDRAMCR1 timing setting. */ - base->SDRAMCR1 = timing; - - timing = SEMC_SDRAMCR2_SRRC(SEMC_ConvertTiming(config->tSelfRefRecovery_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR2_REF2REF(SEMC_ConvertTiming(config->tRefresh2Refresh_Ns, clkSrc_Hz)); - timing |= SEMC_SDRAMCR2_ACT2ACT(SEMC_ConvertTiming(config->tAct2Act_Ns, clkSrc_Hz)) | SEMC_SDRAMCR2_ITO(idle); - /* SDRAMCR2 timing setting. */ - base->SDRAMCR2 = timing; - - /* SDRAMCR3 timing setting. */ - base->SDRAMCR3 = SEMC_SDRAMCR3_REBL((uint32_t)config->refreshBurstLen - 1UL) | - /* N * 16 * 1s / clkSrc_Hz = config->tPrescalePeriod_Ns */ - SEMC_SDRAMCR3_PRESCALE(prescale) | SEMC_SDRAMCR3_RT(refresh - 1UL) | SEMC_SDRAMCR3_UT(urgentRef); - - SEMC->IPCR1 = 0x2U; - SEMC->IPCR2 = 0U; - - result = - SEMC_SendIPCommand(base, kSEMC_MemType_SDRAM, config->address, (uint32_t)kSEMC_SDRAMCM_Prechargeall, 0, NULL); - if (result != kStatus_Success) - { - return result; - } - result = - SEMC_SendIPCommand(base, kSEMC_MemType_SDRAM, config->address, (uint32_t)kSEMC_SDRAMCM_AutoRefresh, 0, NULL); - if (result != kStatus_Success) - { - return result; - } - result = - SEMC_SendIPCommand(base, kSEMC_MemType_SDRAM, config->address, (uint32_t)kSEMC_SDRAMCM_AutoRefresh, 0, NULL); - if (result != kStatus_Success) - { - return result; - } - /* Mode setting value. */ - mode = (uint32_t)config->burstLen | (((uint32_t)config->casLatency) << SEMC_SDRAM_MODESETCAL_OFFSET); - result = - SEMC_SendIPCommand(base, kSEMC_MemType_SDRAM, config->address, (uint32_t)kSEMC_SDRAMCM_Modeset, mode, NULL); - if (result != kStatus_Success) - { - return result; - } - /* Enables refresh */ - base->SDRAMCR3 |= SEMC_SDRAMCR3_REN_MASK; - - return kStatus_Success; -} - -/*! - * brief Configures NAND controller in SEMC. - * - * param base SEMC peripheral base address. - * param config The nand configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureNAND(SEMC_Type *base, semc_nand_config_t *config, uint32_t clkSrc_Hz) -{ - assert(config != NULL); - assert(config->timingConfig != NULL); - - uint8_t memsize; - status_t result; - uint32_t timing; - - if ((config->axiAddress < SEMC_STARTADDRESS) || (config->axiAddress > SEMC_ENDADDRESS)) - { - return kStatus_SEMC_InvalidBaseAddress; - } - - if (config->cePinMux == kSEMC_MUXRDY) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - - /* Disable SEMC module during configuring control registers. */ - base->MCR |= SEMC_MCR_MDIS_MASK; - - uint32_t iocReg = - base->IOCR & (~((SEMC_IOCR_PINMUXBITWIDTH << (uint32_t)config->cePinMux) | SEMC_IOCR_MUX_RDY_MASK)); - - /* Base control. */ - if (config->rdyactivePolarity == kSEMC_RdyActivehigh) - { - base->MCR |= SEMC_MCR_WPOL1_MASK; - } - else - { - base->MCR &= ~SEMC_MCR_WPOL1_MASK; - } - result = SEMC_CovertMemorySize(base, config->axiMemsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - base->BR[4] = (config->axiAddress & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - - result = SEMC_CovertMemorySize(base, config->ipgMemsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - base->BR[8] = (config->ipgAddress & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - - /* IOMUX setting. */ - if ((uint32_t)config->cePinMux != 0x00U) - { - base->IOCR = iocReg | (SEMC_IOCR_NAND_CE << (uint32_t)config->cePinMux); - } - else - { - base->IOCR = iocReg | (1UL << (uint32_t)config->cePinMux); - } - - base->NANDCR0 = SEMC_NANDCR0_PS(config->portSize) | SEMC_NANDCR0_BL(config->burstLen) | - SEMC_NANDCR0_EDO(config->edoModeEnabled) | SEMC_NANDCR0_COL(config->columnAddrBitNum); - - timing = SEMC_NANDCR1_CES(SEMC_ConvertTiming(config->timingConfig->tCeSetup_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_CEH(SEMC_ConvertTiming(config->timingConfig->tCeHold_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_WEL(SEMC_ConvertTiming(config->timingConfig->tWeLow_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_WEH(SEMC_ConvertTiming(config->timingConfig->tWeHigh_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_REL(SEMC_ConvertTiming(config->timingConfig->tReLow_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_REH(SEMC_ConvertTiming(config->timingConfig->tReHigh_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_TA(SEMC_ConvertTiming(config->timingConfig->tTurnAround_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR1_CEITV(SEMC_ConvertTiming(config->timingConfig->tCeInterval_Ns, clkSrc_Hz)); - /* NANDCR1 timing setting. */ - base->NANDCR1 = timing; - - timing = SEMC_NANDCR2_TWHR(SEMC_ConvertTiming(config->timingConfig->tWehigh2Relow_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR2_TRHW(SEMC_ConvertTiming(config->timingConfig->tRehigh2Welow_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR2_TADL(SEMC_ConvertTiming(config->timingConfig->tAle2WriteStart_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR2_TRR(SEMC_ConvertTiming(config->timingConfig->tReady2Relow_Ns, clkSrc_Hz)); - timing |= SEMC_NANDCR2_TWB(SEMC_ConvertTiming(config->timingConfig->tWehigh2Busy_Ns, clkSrc_Hz)); - - /* NANDCR2 timing setting. */ - base->NANDCR2 = timing; - - /* NANDCR3 timing setting. */ - base->NANDCR3 = (uint32_t)config->arrayAddrOption; - - /* Enables SEMC module after configuring control registers completely. */ - base->MCR &= ~SEMC_MCR_MDIS_MASK; - - return kStatus_Success; -} - -/*! - * brief Configures NOR controller in SEMC. - * - * param base SEMC peripheral base address. - * param config The nor configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureNOR(SEMC_Type *base, semc_nor_config_t *config, uint32_t clkSrc_Hz) -{ - assert(config != NULL); - - uint8_t memsize; - status_t result; - uint32_t timing; - - if ((config->address < SEMC_STARTADDRESS) || (config->address > SEMC_ENDADDRESS)) - { - return kStatus_SEMC_InvalidBaseAddress; - } - - uint32_t iocReg = base->IOCR & (~(SEMC_IOCR_PINMUXBITWIDTH << (uint32_t)config->cePinMux)); - uint32_t muxCe = (config->cePinMux == kSEMC_MUXRDY) ? - (SEMC_IOCR_NOR_CE - 1U) : - ((config->cePinMux == kSEMC_MUXA8) ? SEMC_IOCR_NOR_CE_A8 : SEMC_IOCR_NOR_CE); - - /* IOMUX setting. */ - base->IOCR = iocReg | (muxCe << (uint32_t)config->cePinMux); - /* Address bit setting. */ - if (config->addrPortWidth > SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE) - { - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 1U)) - { - /* Address bit 24 (A24) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX0_MASK; - if (config->cePinMux == kSEMC_MUXCSX0) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 2U)) - { - /* Address bit 25 (A25) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX1_MASK; - if (config->cePinMux == kSEMC_MUXCSX1) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 3U)) - { - /* Address bit 26 (A26) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX2_MASK; - if (config->cePinMux == kSEMC_MUXCSX2) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 4U)) - { - if (config->addr27 == kSEMC_NORA27_MUXCSX3) - { - /* Address bit 27 (A27) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX3_MASK; - } - else if (config->addr27 == kSEMC_NORA27_MUXRDY) - { - base->IOCR |= SEMC_IOCR_MUX_RDY_MASK; - } - else - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - if (config->cePinMux == kSEMC_MUXCSX3) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth > SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHMAX) - { - return kStatus_SEMC_InvalidAddressPortWidth; - } - } - - /* Base control. */ - if (config->rdyactivePolarity == kSEMC_RdyActivehigh) - { - base->MCR |= SEMC_MCR_WPOL0_MASK; - } - else - { - base->MCR &= ~SEMC_MCR_WPOL0_MASK; - } - result = SEMC_CovertMemorySize(base, config->memsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - base->BR[5] = (config->address & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - base->NORCR0 = SEMC_NORCR0_PS(config->portSize) | SEMC_NORCR0_BL(config->burstLen) | - SEMC_NORCR0_AM(config->addrMode) | SEMC_NORCR0_ADVP(config->advActivePolarity) | - SEMC_NORCR0_COL(config->columnAddrBitNum); - -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint32_t tempDelayChain = base->DCCR; - - tempDelayChain &= ~(SEMC_DCCR_NORVAL_MASK | SEMC_DCCR_NOREN_MASK); - /* Configure delay chain. */ - base->DCCR = tempDelayChain | SEMC_DCCR_NORVAL((uint32_t)config->delayChain - 0x01U) | SEMC_DCCR_NOREN_MASK; -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ - - timing = SEMC_NORCR1_CES(SEMC_ConvertTiming(config->tCeSetup_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_CEH(SEMC_ConvertTiming(config->tCeHold_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_AS(SEMC_ConvertTiming(config->tAddrSetup_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_AH(SEMC_ConvertTiming(config->tAddrHold_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_WEL(SEMC_ConvertTiming(config->tWeLow_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_WEH(SEMC_ConvertTiming(config->tWeHigh_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_REL(SEMC_ConvertTiming(config->tReLow_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR1_REH(SEMC_ConvertTiming(config->tReHigh_Ns, clkSrc_Hz)); - - /* NORCR1 timing setting. */ - base->NORCR1 = timing; - - timing = SEMC_NORCR2_CEITV(SEMC_ConvertTiming(config->tCeInterval_Ns, clkSrc_Hz)); -#if defined(FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME) && (FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME) - timing |= SEMC_NORCR2_WDS(SEMC_ConvertTiming(config->tWriteSetup_Ns, clkSrc_Hz)); -#endif /* FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME */ -#if defined(FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME) && (FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME) - timing |= SEMC_NORCR2_WDH(SEMC_ConvertTiming(config->tWriteHold_Ns, clkSrc_Hz)); -#endif /* FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME */ - timing |= SEMC_NORCR2_TA(SEMC_ConvertTiming(config->tTurnAround_Ns, clkSrc_Hz)); - timing |= SEMC_NORCR2_AWDH((uint32_t)SEMC_ConvertTiming(config->tAddr2WriteHold_Ns, clkSrc_Hz) + 0x01UL); - timing |= SEMC_NORCR2_LC(config->latencyCount) | SEMC_NORCR2_RD((uint32_t)config->readCycle - 0x01UL); - - /* NORCR2 timing setting. */ - base->NORCR2 = timing; - - return SEMC_ConfigureIPCommand(base, ((uint8_t)config->portSize + 1U)); -} - -/*! - * brief Configures SRAM controller in SEMC, which can be used only for specific chip selection CS0. - * - * param base SEMC peripheral base address. - * param config The sram configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSRAM(SEMC_Type *base, semc_sram_config_t *config, uint32_t clkSrc_Hz) -{ - return SEMC_ConfigureSRAMWithChipSelection(base, kSEMC_SRAM_CS0, config, clkSrc_Hz); -} - -/*! - * brief Configures SRAM controller in SEMC, which can be used up to four chip selections CS0/CS1/CS2/CS3.. - * - * param base SEMC peripheral base address. - * param cs The chip selection. - * param config The sram configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSRAMWithChipSelection(SEMC_Type *base, - semc_sram_cs_t cs, - semc_sram_config_t *config, - uint32_t clkSrc_Hz) -{ - assert(config != NULL); - - uint32_t tempBRVal; - uint32_t timing; - uint8_t memsize; - status_t result = kStatus_Success; - - if ((config->address < SEMC_STARTADDRESS) || (config->address > SEMC_ENDADDRESS)) - { - return kStatus_SEMC_InvalidBaseAddress; - } - - uint32_t iocReg = base->IOCR & (~(SEMC_IOCR_PINMUXBITWIDTH << (uint32_t)config->cePinMux)); - - uint32_t muxCe = (config->cePinMux == kSEMC_MUXRDY) ? - (SEMC_IOCR_PSRAM_CE - 1U) : - ((config->cePinMux == kSEMC_MUXA8) ? SEMC_IOCR_PSRAM_CE_A8 : SEMC_IOCR_PSRAM_CE); - - /* IOMUX setting. */ - base->IOCR = iocReg | (muxCe << (uint32_t)config->cePinMux); - /* Address bit setting. */ - if (config->addrPortWidth > SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE) - { - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 1U)) - { - /* Address bit 24 (A24) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX0_MASK; - if (config->cePinMux == kSEMC_MUXCSX0) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 2U)) - { - /* Address bit 25 (A25) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX1_MASK; - if (config->cePinMux == kSEMC_MUXCSX1) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 3U)) - { - /* Address bit 26 (A26) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX2_MASK; - if (config->cePinMux == kSEMC_MUXCSX2) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth >= (SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHBASE + 4U)) - { - if (config->addr27 == kSEMC_NORA27_MUXCSX3) - { - /* Address bit 27 (A27) */ - base->IOCR &= ~(uint32_t)SEMC_IOCR_MUX_CSX3_MASK; - } - else if (config->addr27 == kSEMC_NORA27_MUXRDY) - { - base->IOCR |= SEMC_IOCR_MUX_RDY_MASK; - } - else - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - - if (config->cePinMux == kSEMC_MUXCSX3) - { - return kStatus_SEMC_InvalidSwPinmuxSelection; - } - } - if (config->addrPortWidth > SEMC_NORFLASH_SRAM_ADDR_PORTWIDTHMAX) - { - return kStatus_SEMC_InvalidAddressPortWidth; - } - } - /* Base control. */ - result = SEMC_CovertMemorySize(base, config->memsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - - tempBRVal = (config->address & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - - uint32_t tempCtrlVal; - - switch (cs) - { - case kSEMC_SRAM_CS0: - base->BR[6] = tempBRVal; - break; -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) - case kSEMC_SRAM_CS1: - base->BR9 = tempBRVal; - break; - case kSEMC_SRAM_CS2: - base->BR10 = tempBRVal; - break; - case kSEMC_SRAM_CS3: - base->BR11 = tempBRVal; - break; -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ - default: - assert(NULL); - break; - } - - /* PSRAM0 SRAMCRx timing setting. */ - if (kSEMC_SRAM_CS0 == cs) - { -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) - /* Ready/wait(WAITEN and WAITSP) feature is only for async mode. */ - if (kSEMC_AsyncMode == config->syncMode) - { - tempCtrlVal = SEMC_SRAMCR0_PS(config->portSize) | -#if defined(SEMC_SRAMCR4_SYNCEN_MASK) && (SEMC_SRAMCR4_SYNCEN_MASK) - SEMC_SRAMCR4_SYNCEN(config->syncMode) | -#endif /* SEMC_SRAMCR4_SYNCEN_MASK */ -#if defined(SEMC_SRAMCR0_WAITEN_MASK) && (SEMC_SRAMCR0_WAITEN_MASK) - SEMC_SRAMCR0_WAITEN(config->waitEnable) | -#endif /* SEMC_SRAMCR0_WAITEN_MASK */ -#if defined(SEMC_SRAMCR0_WAITSP_MASK) && (SEMC_SRAMCR0_WAITSP_MASK) - SEMC_SRAMCR0_WAITSP(config->waitSample) | -#endif /* SEMC_SRAMCR0_WAITSP_MASK */ - SEMC_SRAMCR0_BL(config->burstLen) | SEMC_SRAMCR0_AM(config->addrMode) | - SEMC_SRAMCR0_ADVP(config->advActivePolarity) | -#if defined(SEMC_SRAMCR4_ADVH_MASK) && (SEMC_SRAMCR4_ADVH_MASK) - SEMC_SRAMCR4_ADVH(config->advLevelCtrl) | -#endif /* SEMC_SRAMCR4_ADVH_MASK */ - SEMC_SRAMCR0_COL_MASK; - } - else -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ - { - tempCtrlVal = SEMC_SRAMCR0_PS(config->portSize) | -#if defined(SEMC_SRAMCR4_SYNCEN_MASK) && (SEMC_SRAMCR4_SYNCEN_MASK) - SEMC_SRAMCR4_SYNCEN(config->syncMode) | -#endif /* SEMC_SRAMCR4_SYNCEN_MASK */ - SEMC_SRAMCR0_BL(config->burstLen) | SEMC_SRAMCR0_AM(config->addrMode) | - SEMC_SRAMCR0_ADVP(config->advActivePolarity) | -#if defined(SEMC_SRAMCR4_ADVH_MASK) && (SEMC_SRAMCR4_ADVH_MASK) - SEMC_SRAMCR4_ADVH(config->advLevelCtrl) | -#endif /* SEMC_SRAMCR4_ADVH_MASK */ - SEMC_SRAMCR0_COL_MASK; - } - - base->SRAMCR0 = tempCtrlVal; - } -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) - /* PSRAM1~PSRAM3 SRAMCRx timing setting. */ - else - { - /* Ready/wait(WAITEN and WAITSP) feature is only for async mode. */ - if (kSEMC_AsyncMode == config->syncMode) - { - tempCtrlVal = SEMC_SRAMCR4_PS(config->portSize) | SEMC_SRAMCR4_SYNCEN(config->syncMode) | - SEMC_SRAMCR4_WAITEN(config->waitEnable) | SEMC_SRAMCR4_WAITSP(config->waitSample) | - SEMC_SRAMCR4_BL(config->burstLen) | SEMC_SRAMCR4_AM(config->addrMode) | - SEMC_SRAMCR4_ADVP(config->advActivePolarity) | SEMC_SRAMCR4_ADVH(config->advLevelCtrl) | - SEMC_SRAMCR4_COL_MASK; - } - else - { - tempCtrlVal = SEMC_SRAMCR4_PS(config->portSize) | SEMC_SRAMCR4_SYNCEN(config->syncMode) | - SEMC_SRAMCR4_BL(config->burstLen) | SEMC_SRAMCR4_AM(config->addrMode) | - SEMC_SRAMCR4_ADVP(config->advActivePolarity) | SEMC_SRAMCR4_ADVH(config->advLevelCtrl) | - SEMC_SRAMCR4_COL_MASK; - } - - base->SRAMCR4 = tempCtrlVal; - } -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ - -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint32_t tempDelayChain = base->DCCR; - - /* Configure delay chain. */ - switch (cs) - { - case kSEMC_SRAM_CS0: - tempDelayChain &= ~(SEMC_DCCR_SRAM0VAL_MASK | SEMC_DCCR_SRAM0EN_MASK); - base->DCCR = - tempDelayChain | SEMC_DCCR_SRAM0VAL((uint32_t)config->delayChain - 0x01U) | SEMC_DCCR_SRAM0EN_MASK; - break; -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) - case kSEMC_SRAM_CS1: - SUPPRESS_FALL_THROUGH_WARNING(); - case kSEMC_SRAM_CS2: - SUPPRESS_FALL_THROUGH_WARNING(); - case kSEMC_SRAM_CS3: - tempDelayChain &= ~(SEMC_DCCR_SRAMXVAL_MASK | SEMC_DCCR_SRAMXEN_MASK); - base->DCCR = - tempDelayChain | SEMC_DCCR_SRAMXVAL((uint32_t)config->delayChain - 0x01U) | SEMC_DCCR_SRAMXEN_MASK; - break; -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ - default: - assert(NULL); - break; - } -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ - - if (kSEMC_SRAM_CS0 == cs) - { - timing = SEMC_SRAMCR1_CES(SEMC_ConvertTiming(config->tCeSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_CEH(SEMC_ConvertTiming(config->tCeHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_AS(SEMC_ConvertTiming(config->tAddrSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_AH(SEMC_ConvertTiming(config->tAddrHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_WEL(SEMC_ConvertTiming(config->tWeLow_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_WEH(SEMC_ConvertTiming(config->tWeHigh_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_REL(SEMC_ConvertTiming(config->tReLow_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR1_REH(SEMC_ConvertTiming(config->tReHigh_Ns, clkSrc_Hz)); - - /* SRAMCR1 timing setting. */ - base->SRAMCR1 = timing; - - timing = SEMC_SRAMCR2_WDS(SEMC_ConvertTiming(config->tWriteSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR2_WDH((uint32_t)SEMC_ConvertTiming(config->tWriteHold_Ns, clkSrc_Hz) + 1UL); - timing |= SEMC_SRAMCR2_TA(SEMC_ConvertTiming(config->tTurnAround_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR2_AWDH(SEMC_ConvertTiming(config->tAddr2WriteHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR2_LC(config->latencyCount) | SEMC_SRAMCR2_RD((uint32_t)config->readCycle - 1UL); - timing |= SEMC_SRAMCR2_CEITV(SEMC_ConvertTiming(config->tCeInterval_Ns, clkSrc_Hz)); -#if defined(FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) && (FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) - timing |= SEMC_SRAMCR2_RDH((uint32_t)SEMC_ConvertTiming(config->readHoldTime_Ns, clkSrc_Hz) + 0x01U); -#endif /* FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME */ - - /* SRAMCR2 timing setting. */ - base->SRAMCR2 = timing; - } -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT > 0x01U) - else - { - timing = SEMC_SRAMCR5_CES(SEMC_ConvertTiming(config->tCeSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_CEH(SEMC_ConvertTiming(config->tCeHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_AS(SEMC_ConvertTiming(config->tAddrSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_AH(SEMC_ConvertTiming(config->tAddrHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_WEL(SEMC_ConvertTiming(config->tWeLow_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_WEH(SEMC_ConvertTiming(config->tWeHigh_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_REL(SEMC_ConvertTiming(config->tReLow_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR5_REH(SEMC_ConvertTiming(config->tReHigh_Ns, clkSrc_Hz)); - - /* SRAMCR5 timing setting. */ - base->SRAMCR5 = timing; - - timing = SEMC_SRAMCR6_WDS(SEMC_ConvertTiming(config->tWriteSetup_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR6_WDH((uint32_t)SEMC_ConvertTiming(config->tWriteHold_Ns, clkSrc_Hz) + 1UL); - timing |= SEMC_SRAMCR6_TA(SEMC_ConvertTiming(config->tTurnAround_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR6_AWDH(SEMC_ConvertTiming(config->tAddr2WriteHold_Ns, clkSrc_Hz)); - timing |= SEMC_SRAMCR6_LC(config->latencyCount) | SEMC_SRAMCR2_RD((uint32_t)config->readCycle - 1UL); - timing |= SEMC_SRAMCR6_CEITV(SEMC_ConvertTiming(config->tCeInterval_Ns, clkSrc_Hz)); -#if defined(FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) && (FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) - timing |= SEMC_SRAMCR6_RDH((uint32_t)SEMC_ConvertTiming(config->readHoldTime_Ns, clkSrc_Hz) + 0x01U); -#endif /* FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME */ - - /* SRAMCR6 timing setting. */ - base->SRAMCR6 = timing; - } -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ - - return result; -} - -/*! - * brief Configures DBI controller in SEMC. - * - * param base SEMC peripheral base address. - * param config The dbi configuration. - * param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureDBI(SEMC_Type *base, semc_dbi_config_t *config, uint32_t clkSrc_Hz) -{ - assert(config != NULL); - - uint8_t memsize; - status_t result; - uint32_t timing; - - if ((config->address < SEMC_STARTADDRESS) || (config->address > SEMC_ENDADDRESS)) - { - return kStatus_SEMC_InvalidBaseAddress; - } - - uint32_t iocReg = base->IOCR & (~(SEMC_IOCR_PINMUXBITWIDTH << (uint32_t)config->csxPinMux)); - uint32_t muxCsx = (config->csxPinMux == kSEMC_MUXRDY) ? - (SEMC_IOCR_DBI_CSX - 1U) : - ((config->csxPinMux == kSEMC_MUXA8) ? SEMC_IOCR_DBI_CSX_A8 : SEMC_IOCR_DBI_CSX); - - /* IOMUX setting. */ - base->IOCR = iocReg | (muxCsx << (uint32_t)config->csxPinMux); - /* Base control. */ - result = SEMC_CovertMemorySize(base, config->memsize_kbytes, &memsize); - if (result != kStatus_Success) - { - return result; - } - base->BR[7] = (config->address & SEMC_BR_BA_MASK) | SEMC_BR_MS(memsize) | SEMC_BR_VLD_MASK; - - /* DBICR0 timing setting. */ - base->DBICR0 = - SEMC_DBICR0_PS(config->portSize) | SEMC_DBICR0_BL(config->burstLen) | SEMC_DBICR0_COL(config->columnAddrBitNum); - - timing = SEMC_DBICR1_CES(SEMC_ConvertTiming(config->tCsxSetup_Ns, clkSrc_Hz)); - timing |= SEMC_DBICR1_CEH(SEMC_ConvertTiming(config->tCsxHold_Ns, clkSrc_Hz)); - timing |= SEMC_DBICR1_WEL(SEMC_ConvertTiming(config->tWexLow_Ns, clkSrc_Hz)); - timing |= SEMC_DBICR1_WEH(SEMC_ConvertTiming(config->tWexHigh_Ns, clkSrc_Hz)); - timing |= SEMC_DBICR1_REL(SEMC_ConvertTiming(config->tRdxLow_Ns, clkSrc_Hz)); - timing |= SEMC_DBICR1_REH(SEMC_ConvertTiming(config->tRdxHigh_Ns, clkSrc_Hz)); -#if defined(SEMC_DBICR1_CEITV_MASK) - timing |= SEMC_DBICR1_CEITV(SEMC_ConvertTiming(config->tCsxInterval_Ns, clkSrc_Hz)); -#endif /* SEMC_DBICR1_CEITV_MASK */ - - /* DBICR1 timing setting. */ - base->DBICR1 = timing; - -#if defined(SEMC_DBICR2_CEITV_MASK) - timing = SEMC_DBICR2_CEITV(SEMC_ConvertTiming(config->tCsxInterval_Ns, clkSrc_Hz)); - - /* DBICR2 timing setting. */ - base->DBICR2 = timing; -#endif /* SEMC_DBICR2_CEITV_MASK */ - - return SEMC_ConfigureIPCommand(base, ((uint8_t)config->portSize + 1U)); -} - -/*! - * brief SEMC IP command access. - * - * param base SEMC peripheral base address. - * param type SEMC memory type. refer to "semc_mem_type_t" - * param address SEMC device address. - * param command SEMC IP command. - * For NAND device, we should use the SEMC_BuildNandIPCommand to get the right nand command. - * For NOR/DBI device, take refer to "semc_ipcmd_nor_dbi_t". - * For SRAM device, take refer to "semc_ipcmd_sram_t". - * For SDRAM device, take refer to "semc_ipcmd_sdram_t". - * param write Data for write access. - * param read Data pointer for read data out. - */ -status_t SEMC_SendIPCommand( - SEMC_Type *base, semc_mem_type_t type, uint32_t address, uint32_t command, uint32_t write, uint32_t *read) -{ - uint32_t cmdMode; - bool readCmd = false; - bool writeCmd = false; - status_t result; - - /* Clear status bit */ - base->INTR |= SEMC_INTR_IPCMDDONE_MASK; - /* Set address. */ - base->IPCR0 = address; - - /* Check command mode. */ - cmdMode = (uint32_t)command & 0x0FU; - switch (type) - { - case kSEMC_MemType_NAND: - readCmd = (cmdMode == (uint32_t)kSEMC_NANDCM_CommandAddressRead) || - (cmdMode == (uint32_t)kSEMC_NANDCM_CommandRead) || (cmdMode == (uint32_t)kSEMC_NANDCM_Read); - writeCmd = (cmdMode == (uint32_t)kSEMC_NANDCM_CommandAddressWrite) || - (cmdMode == (uint32_t)kSEMC_NANDCM_CommandWrite) || (cmdMode == (uint32_t)kSEMC_NANDCM_Write); - break; - case kSEMC_MemType_NOR: - case kSEMC_MemType_8080: - readCmd = (cmdMode == (uint32_t)kSEMC_NORDBICM_Read); - writeCmd = (cmdMode == (uint32_t)kSEMC_NORDBICM_Write); - break; - case kSEMC_MemType_SRAM: - readCmd = (cmdMode == (uint32_t)kSEMC_SRAMCM_ArrayRead) || (cmdMode == (uint32_t)kSEMC_SRAMCM_RegRead); - writeCmd = (cmdMode == (uint32_t)kSEMC_SRAMCM_ArrayWrite) || (cmdMode == (uint32_t)kSEMC_SRAMCM_RegWrite); - break; - case kSEMC_MemType_SDRAM: - readCmd = (cmdMode == (uint32_t)kSEMC_SDRAMCM_Read); - writeCmd = (cmdMode == (uint32_t)kSEMC_SDRAMCM_Write) || (cmdMode == (uint32_t)kSEMC_SDRAMCM_Modeset); - break; - default: - assert(false); - break; - } - - if (writeCmd) - { - /* Set data. */ - base->IPTXDAT = write; - } - - /* Set command code. */ - base->IPCMD = command | SEMC_IPCMD_KEY(SEMC_IPCOMMANDMAGICKEY); - /* Wait for command done. */ - result = SEMC_IsIPCommandDone(base); - if (result != kStatus_Success) - { - return result; - } - - if (readCmd) - { - /* Get the read data */ - *read = base->IPRXDAT; - } - - return kStatus_Success; -} - -/*! - * brief SEMC NAND device memory write through IP command. - * - * param base SEMC peripheral base address. - * param address SEMC NAND device address. - * param data Data for write access. - * param size_bytes Data length. - */ -status_t SEMC_IPCommandNandWrite(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes) -{ - assert(data != NULL); - - status_t result = kStatus_Success; - uint16_t ipCmd; - uint32_t tempData = 0; - - /* Write command built */ - ipCmd = SEMC_BuildNandIPCommand(0, kSEMC_NANDAM_ColumnRow, kSEMC_NANDCM_Write); - while (size_bytes >= SEMC_IPCOMMANDDATASIZEBYTEMAX) - { - /* Configure IP command data size. */ - (void)SEMC_ConfigureIPCommand(base, SEMC_IPCOMMANDDATASIZEBYTEMAX); - result = SEMC_SendIPCommand(base, kSEMC_MemType_NAND, address, ipCmd, *(uint32_t *)(void *)data, NULL); - if (result != kStatus_Success) - { - break; - } - - data += SEMC_IPCOMMANDDATASIZEBYTEMAX; - size_bytes -= SEMC_IPCOMMANDDATASIZEBYTEMAX; - } - - if ((result == kStatus_Success) && (size_bytes != 0x00U)) - { - (void)SEMC_ConfigureIPCommand(base, (uint8_t)size_bytes); - - while (size_bytes != 0x00U) - { - size_bytes--; - tempData <<= SEMC_BYTE_NUMBIT; - tempData |= data[size_bytes]; - } - - result = SEMC_SendIPCommand(base, kSEMC_MemType_NAND, address, ipCmd, tempData, NULL); - } - - return result; -} - -/*! - * brief SEMC NAND device memory read through IP command. - * - * param base SEMC peripheral base address. - * param address SEMC NAND device address. - * param data Data pointer for data read out. - * param size_bytes Data length. - */ -status_t SEMC_IPCommandNandRead(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes) -{ - assert(data != NULL); - - status_t result = kStatus_Success; - uint16_t ipCmd; - uint32_t tempData = 0; - - /* Configure IP command data size. */ - (void)SEMC_ConfigureIPCommand(base, SEMC_IPCOMMANDDATASIZEBYTEMAX); - /* Read command built */ - ipCmd = SEMC_BuildNandIPCommand(0, kSEMC_NANDAM_ColumnRow, kSEMC_NANDCM_Read); - - while (size_bytes >= SEMC_IPCOMMANDDATASIZEBYTEMAX) - { - result = SEMC_SendIPCommand(base, kSEMC_MemType_NAND, address, ipCmd, 0, (uint32_t *)(void *)data); - if (result != kStatus_Success) - { - break; - } - - data += SEMC_IPCOMMANDDATASIZEBYTEMAX; - size_bytes -= SEMC_IPCOMMANDDATASIZEBYTEMAX; - } - - if ((result == kStatus_Success) && (size_bytes != 0x00U)) - { - (void)SEMC_ConfigureIPCommand(base, (uint8_t)size_bytes); - result = SEMC_SendIPCommand(base, kSEMC_MemType_NAND, address, ipCmd, 0, &tempData); - - while (size_bytes != 0x00U) - { - size_bytes--; - *(data + size_bytes) = (uint8_t)((tempData >> (SEMC_BYTE_NUMBIT * size_bytes)) & 0xFFU); - } - } - - return result; -} - -/*! - * brief SEMC NOR device memory read through IP command. - * - * param base SEMC peripheral base address. - * param address SEMC NOR device address. - * param data Data pointer for data read out. - * param size_bytes Data length. - */ -status_t SEMC_IPCommandNorRead(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes) -{ - assert(data != NULL); - - uint32_t tempData = 0; - status_t result = kStatus_Success; - uint8_t dataSize = (uint8_t)base->NORCR0 & SEMC_NORCR0_PS_MASK; - - /* Configure IP command data size. */ - (void)SEMC_ConfigureIPCommand(base, SEMC_IPCOMMANDDATASIZEBYTEMAX); - - while (size_bytes >= SEMC_IPCOMMANDDATASIZEBYTEMAX) - { - result = SEMC_SendIPCommand(base, kSEMC_MemType_NOR, address, (uint32_t)kSEMC_NORDBICM_Read, 0, - (uint32_t *)(void *)data); - if (result != kStatus_Success) - { - break; - } - - data += SEMC_IPCOMMANDDATASIZEBYTEMAX; - size_bytes -= SEMC_IPCOMMANDDATASIZEBYTEMAX; - } - - if ((result == kStatus_Success) && (size_bytes != 0x00U)) - { - (void)SEMC_ConfigureIPCommand(base, (uint8_t)size_bytes); - result = SEMC_SendIPCommand(base, kSEMC_MemType_NOR, address, (uint16_t)kSEMC_NORDBICM_Read, 0, &tempData); - while (size_bytes != 0x00U) - { - size_bytes--; - *(data + size_bytes) = (uint8_t)((tempData >> (SEMC_BYTE_NUMBIT * size_bytes)) & 0xFFU); - } - } - - (void)SEMC_ConfigureIPCommand(base, dataSize); - return result; -} - -/*! - * brief SEMC NOR device memory write through IP command. - * - * param base SEMC peripheral base address. - * param address SEMC NOR device address. - * param data Data for write access. - * param size_bytes Data length. - */ -status_t SEMC_IPCommandNorWrite(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes) -{ - assert(data != NULL); - - uint32_t tempData = 0; - status_t result = kStatus_Success; - uint8_t dataSize = (uint8_t)base->NORCR0 & SEMC_NORCR0_PS_MASK; - - /* Write command built */ - while (size_bytes >= SEMC_IPCOMMANDDATASIZEBYTEMAX) - { - /* Configure IP command data size. */ - (void)SEMC_ConfigureIPCommand(base, SEMC_IPCOMMANDDATASIZEBYTEMAX); - result = SEMC_SendIPCommand(base, kSEMC_MemType_NOR, address, (uint16_t)kSEMC_NORDBICM_Write, - *(uint32_t *)(void *)data, NULL); - if (result != kStatus_Success) - { - break; - } - size_bytes -= SEMC_IPCOMMANDDATASIZEBYTEMAX; - data += SEMC_IPCOMMANDDATASIZEBYTEMAX; - } - - if ((result == kStatus_Success) && (size_bytes != 0x00U)) - { - (void)SEMC_ConfigureIPCommand(base, (uint8_t)size_bytes); - - while (size_bytes != 0x00U) - { - tempData |= ((uint32_t) * (data + size_bytes - 1U) << ((size_bytes - 1U) * SEMC_BYTE_NUMBIT)); - size_bytes--; - } - - result = SEMC_SendIPCommand(base, kSEMC_MemType_NOR, address, (uint16_t)kSEMC_NORDBICM_Write, tempData, NULL); - } - (void)SEMC_ConfigureIPCommand(base, dataSize); - - return result; -} diff --git a/devices/MIMXRT1052/drivers/fsl_semc.h b/devices/MIMXRT1052/drivers/fsl_semc.h deleted file mode 100644 index d445c9f..0000000 --- a/devices/MIMXRT1052/drivers/fsl_semc.h +++ /dev/null @@ -1,912 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_SEMC_H_ -#define _FSL_SEMC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup semc - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief SEMC driver version 2.3.1. */ -#define FSL_SEMC_DRIVER_VERSION (MAKE_VERSION(2, 3, 1)) -/*@}*/ - -/*! @brief SEMC status, _semc_status. */ -enum -{ - kStatus_SEMC_InvalidDeviceType = MAKE_STATUS(kStatusGroup_SEMC, 0), /*!< Invalid device type. */ - kStatus_SEMC_IpCommandExecutionError = MAKE_STATUS(kStatusGroup_SEMC, 1), /*!< IP command execution error. */ - kStatus_SEMC_AxiCommandExecutionError = MAKE_STATUS(kStatusGroup_SEMC, 2), /*!< AXI command execution error. */ - kStatus_SEMC_InvalidMemorySize = MAKE_STATUS(kStatusGroup_SEMC, 3), /*!< Invalid memory sie. */ - kStatus_SEMC_InvalidIpcmdDataSize = MAKE_STATUS(kStatusGroup_SEMC, 4), /*!< Invalid IP command data size. */ - kStatus_SEMC_InvalidAddressPortWidth = MAKE_STATUS(kStatusGroup_SEMC, 5), /*!< Invalid address port width. */ - kStatus_SEMC_InvalidDataPortWidth = MAKE_STATUS(kStatusGroup_SEMC, 6), /*!< Invalid data port width. */ - kStatus_SEMC_InvalidSwPinmuxSelection = MAKE_STATUS(kStatusGroup_SEMC, 7), /*!< Invalid SW pinmux selection. */ - kStatus_SEMC_InvalidBurstLength = MAKE_STATUS(kStatusGroup_SEMC, 8), /*!< Invalid burst length */ - /*! Invalid column address bit width. */ - kStatus_SEMC_InvalidColumnAddressBitWidth = MAKE_STATUS(kStatusGroup_SEMC, 9), - kStatus_SEMC_InvalidBaseAddress = MAKE_STATUS(kStatusGroup_SEMC, 10), /*!< Invalid base address. */ - kStatus_SEMC_InvalidTimerSetting = MAKE_STATUS(kStatusGroup_SEMC, 11), /*!< Invalid timer setting. */ -}; - -/*! @brief SEMC memory device type. */ -typedef enum _semc_mem_type -{ - kSEMC_MemType_SDRAM = 0, /*!< SDRAM */ - kSEMC_MemType_SRAM, /*!< SRAM */ - kSEMC_MemType_NOR, /*!< NOR */ - kSEMC_MemType_NAND, /*!< NAND */ - kSEMC_MemType_8080 /*!< 8080. */ -} semc_mem_type_t; - -/*! @brief SEMC WAIT/RDY polarity. */ -typedef enum _semc_waitready_polarity -{ - kSEMC_LowActive = 0, /*!< Low active. */ - kSEMC_HighActive, /*!< High active. */ -} semc_waitready_polarity_t; - -/*! @brief SEMC SDRAM Chip selection . */ -typedef enum _semc_sdram_cs -{ - kSEMC_SDRAM_CS0 = 0, /*!< SEMC SDRAM CS0. */ - kSEMC_SDRAM_CS1, /*!< SEMC SDRAM CS1. */ - kSEMC_SDRAM_CS2, /*!< SEMC SDRAM CS2. */ - kSEMC_SDRAM_CS3 /*!< SEMC SDRAM CS3. */ -} semc_sdram_cs_t; - -/*! @brief SEMC SRAM Chip selection . */ -typedef enum _semc_sram_cs -{ -#if defined(FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT) && (FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT == 0x04U) - kSEMC_SRAM_CS0 = 0, /*!< SEMC SRAM CS0. */ - kSEMC_SRAM_CS1, /*!< SEMC SRAM CS1. */ - kSEMC_SRAM_CS2, /*!< SEMC SRAM CS2. */ - kSEMC_SRAM_CS3 /*!< SEMC SRAM CS3. */ -#else - kSEMC_SRAM_CS0 = 0, /*!< SEMC SRAM CS0. */ -#endif /* FSL_FEATURE_SEMC_SUPPORT_SRAM_COUNT */ -} semc_sram_cs_t; - -/*! @brief SEMC NAND device type. */ -typedef enum _semc_nand_access_type -{ - kSEMC_NAND_ACCESS_BY_AXI = 0, /*!< Access to NAND flash by AXI bus. */ - kSEMC_NAND_ACCESS_BY_IPCMD, /*!< Access to NAND flash by IP bus. */ -} semc_nand_access_type_t; - -/*! @brief SEMC interrupts . */ -typedef enum _semc_interrupt_enable -{ - kSEMC_IPCmdDoneInterrupt = SEMC_INTEN_IPCMDDONEEN_MASK, /*!< Ip command done interrupt. */ - kSEMC_IPCmdErrInterrupt = SEMC_INTEN_IPCMDERREN_MASK, /*!< Ip command error interrupt. */ - kSEMC_AXICmdErrInterrupt = SEMC_INTEN_AXICMDERREN_MASK, /*!< AXI command error interrupt. */ - kSEMC_AXIBusErrInterrupt = SEMC_INTEN_AXIBUSERREN_MASK /*!< AXI bus error interrupt. */ -} semc_interrupt_enable_t; - -/*! @brief SEMC IP command data size in bytes. */ -typedef enum _semc_ipcmd_datasize -{ - kSEMC_IPcmdDataSize_1bytes = 1, /*!< The IP command data size 1 byte. */ - kSEMC_IPcmdDataSize_2bytes, /*!< The IP command data size 2 byte. */ - kSEMC_IPcmdDataSize_3bytes, /*!< The IP command data size 3 byte. */ - kSEMC_IPcmdDataSize_4bytes /*!< The IP command data size 4 byte. */ -} semc_ipcmd_datasize_t; - -/*! @brief SEMC auto-refresh timing. */ -typedef enum _semc_refresh_time -{ - kSEMC_RefreshThreeClocks = 0x0U, /*!< The refresh timing with three bus clocks. */ - kSEMC_RefreshSixClocks, /*!< The refresh timing with six bus clocks. */ - kSEMC_RefreshNineClocks /*!< The refresh timing with nine bus clocks. */ -} semc_refresh_time_t; - -/*! @brief CAS latency */ -typedef enum _semc_caslatency -{ - kSEMC_LatencyOne = 1, /*!< Latency 1. */ - kSEMC_LatencyTwo, /*!< Latency 2. */ - kSEMC_LatencyThree, /*!< Latency 3. */ -} semc_caslatency_t; - -/*! @brief SEMC sdram column address bit number. */ -typedef enum _semc_sdram_column_bit_num -{ - kSEMC_SdramColunm_12bit = 0x0U, /*!< 12 bit. */ - kSEMC_SdramColunm_11bit, /*!< 11 bit. */ - kSEMC_SdramColunm_10bit, /*!< 10 bit. */ - kSEMC_SdramColunm_9bit, /*!< 9 bit. */ -#if defined(FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT) && (FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT) - kSEMC_SdramColunm_8bit, /*!< 8 bit. */ -#endif /* FSL_FEATURE_SEMC_SDRAM_SUPPORT_COLUMN_ADDRESS_8BIT */ -} semc_sdram_column_bit_num_t; - -/*! @brief SEMC sdram burst length. */ -typedef enum _semc_sdram_burst_len -{ -/*! According to ERR050577, Auto-refresh command may possibly fail to be triggered during - long time back-to-back write (or read) when SDRAM controller's burst length is greater than 1. */ -#if defined(FSL_FEATURE_SEMC_ERRATA_050577) && (FSL_FEATURE_SEMC_ERRATA_050577 == 0x01U) - kSEMC_Sdram_BurstLen1 = 0, /*!< Burst length 1*/ -#else - kSEMC_Sdram_BurstLen1 = 0, /*!< Burst length 1*/ - kSEMC_Sdram_BurstLen2, /*!< Burst length 2*/ - kSEMC_Sdram_BurstLen4, /*!< Burst length 4*/ - kSEMC_Sdram_BurstLen8 /*!< Burst length 8*/ -#endif /* FSL_FEATURE_SEMC_ERRATA_050577 */ -} sem_sdram_burst_len_t; - -/*! @brief SEMC nand column address bit number. */ -typedef enum _semc_nand_column_bit_num -{ - kSEMC_NandColum_16bit = 0x0U, /*!< 16 bit. */ - kSEMC_NandColum_15bit, /*!< 15 bit. */ - kSEMC_NandColum_14bit, /*!< 14 bit. */ - kSEMC_NandColum_13bit, /*!< 13 bit. */ - kSEMC_NandColum_12bit, /*!< 12 bit. */ - kSEMC_NandColum_11bit, /*!< 11 bit. */ - kSEMC_NandColum_10bit, /*!< 10 bit. */ - kSEMC_NandColum_9bit, /*!< 9 bit. */ -} semc_nand_column_bit_num_t; - -/*! @brief SEMC nand burst length. */ -typedef enum _semc_nand_burst_len -{ - kSEMC_Nand_BurstLen1 = 0, /*!< Burst length 1*/ - kSEMC_Nand_BurstLen2, /*!< Burst length 2*/ - kSEMC_Nand_BurstLen4, /*!< Burst length 4*/ - kSEMC_Nand_BurstLen8, /*!< Burst length 8*/ - kSEMC_Nand_BurstLen16, /*!< Burst length 16*/ - kSEMC_Nand_BurstLen32, /*!< Burst length 32*/ - kSEMC_Nand_BurstLen64 /*!< Burst length 64*/ -} sem_nand_burst_len_t; - -/*! @brief SEMC nor/sram column address bit number. */ -typedef enum _semc_norsram_column_bit_num -{ - kSEMC_NorColum_12bit = 0x0U, /*!< 12 bit. */ - kSEMC_NorColum_11bit, /*!< 11 bit. */ - kSEMC_NorColum_10bit, /*!< 10 bit. */ - kSEMC_NorColum_9bit, /*!< 9 bit. */ - kSEMC_NorColum_8bit, /*!< 8 bit. */ - kSEMC_NorColum_7bit, /*!< 7 bit. */ - kSEMC_NorColum_6bit, /*!< 6 bit. */ - kSEMC_NorColum_5bit, /*!< 5 bit. */ - kSEMC_NorColum_4bit, /*!< 4 bit. */ - kSEMC_NorColum_3bit, /*!< 3 bit. */ - kSEMC_NorColum_2bit /*!< 2 bit. */ -} semc_norsram_column_bit_num_t; - -/*! @brief SEMC nor/sram burst length. */ -typedef enum _semc_norsram_burst_len -{ - kSEMC_Nor_BurstLen1 = 0, /*!< Burst length 1*/ - kSEMC_Nor_BurstLen2, /*!< Burst length 2*/ - kSEMC_Nor_BurstLen4, /*!< Burst length 4*/ - kSEMC_Nor_BurstLen8, /*!< Burst length 8*/ - kSEMC_Nor_BurstLen16, /*!< Burst length 16*/ - kSEMC_Nor_BurstLen32, /*!< Burst length 32*/ - kSEMC_Nor_BurstLen64 /*!< Burst length 64*/ -} sem_norsram_burst_len_t; - -/*! @brief SEMC dbi column address bit number. */ -typedef enum _semc_dbi_column_bit_num -{ - kSEMC_Dbi_Colum_12bit = 0x0U, /*!< 12 bit. */ - kSEMC_Dbi_Colum_11bit, /*!< 11 bit. */ - kSEMC_Dbi_Colum_10bit, /*!< 10 bit. */ - kSEMC_Dbi_Colum_9bit, /*!< 9 bit. */ - kSEMC_Dbi_Colum_8bit, /*!< 8 bit. */ - kSEMC_Dbi_Colum_7bit, /*!< 7 bit. */ - kSEMC_Dbi_Colum_6bit, /*!< 6 bit. */ - kSEMC_Dbi_Colum_5bit, /*!< 5 bit. */ - kSEMC_Dbi_Colum_4bit, /*!< 4 bit. */ - kSEMC_Dbi_Colum_3bit, /*!< 3 bit. */ - kSEMC_Dbi_Colum_2bit /*!< 2 bit. */ -} semc_dbi_column_bit_num_t; - -/*! @brief SEMC dbi burst length. */ -typedef enum _semc_dbi_burst_len -{ - kSEMC_Dbi_BurstLen1 = 0, /*!< Burst length 1*/ - kSEMC_Dbi_BurstLen2, /*!< Burst length 2*/ - kSEMC_Dbi_Dbi_BurstLen4, /*!< Burst length 4*/ - kSEMC_Dbi_BurstLen8, /*!< Burst length 8*/ - kSEMC_Dbi_BurstLen16, /*!< Burst length 16*/ - kSEMC_Dbi_BurstLen32, /*!< Burst length 32*/ - kSEMC_Dbi_BurstLen64 /*!< Burst length 64*/ -} sem_dbi_burst_len_t; - -/*! @brief SEMC IOMUXC. */ -typedef enum _semc_iomux_pin -{ - kSEMC_MUXA8 = SEMC_IOCR_MUX_A8_SHIFT, /*!< MUX A8 pin. */ - kSEMC_MUXCSX0 = SEMC_IOCR_MUX_CSX0_SHIFT, /*!< MUX CSX0 pin */ - kSEMC_MUXCSX1 = SEMC_IOCR_MUX_CSX1_SHIFT, /*!< MUX CSX1 Pin.*/ - kSEMC_MUXCSX2 = SEMC_IOCR_MUX_CSX2_SHIFT, /*!< MUX CSX2 Pin. */ - kSEMC_MUXCSX3 = SEMC_IOCR_MUX_CSX3_SHIFT, /*!< MUX CSX3 Pin. */ - kSEMC_MUXRDY = SEMC_IOCR_MUX_RDY_SHIFT /*!< MUX RDY pin. */ -} semc_iomux_pin; - -/*! @brief SEMC NOR/PSRAM Address bit 27 A27. */ -typedef enum _semc_iomux_nora27_pin -{ - kSEMC_MORA27_NONE = 0, /*!< No NOR/SRAM A27 pin. */ - kSEMC_NORA27_MUXCSX3 = SEMC_IOCR_MUX_CSX3_SHIFT, /*!< MUX CSX3 Pin. */ - kSEMC_NORA27_MUXRDY = SEMC_IOCR_MUX_RDY_SHIFT /*!< MUX RDY pin. */ -} semc_iomux_nora27_pin; - -/*! @brief SEMC port size. */ -typedef enum _semc_port_size -{ - kSEMC_PortSize8Bit = 0, /*!< 8-Bit port size. */ - kSEMC_PortSize16Bit, /*!< 16-Bit port size. */ -#if defined(FSL_FEATURE_SEMC_SUPPORT_SDRAM_PS_BITWIDTH) && (FSL_FEATURE_SEMC_SUPPORT_SDRAM_PS_BITWIDTH == 0x02U) - kSEMC_PortSize32Bit /*!< 32-Bit port size. */ -#endif /* FSL_FEATURE_SEMC_SUPPORT_SDRAM_PS_BITWIDTH */ -} smec_port_size_t; - -/*! @brief SEMC address mode. */ -typedef enum _semc_addr_mode -{ - kSEMC_AddrDataMux = 0, /*!< SEMC address/data mux mode. */ - kSEMC_AdvAddrdataMux, /*!< Advanced address/data mux mode. */ - kSEMC_AddrDataNonMux /*!< Address/data non-mux mode. */ -} semc_addr_mode_t; - -/*! @brief SEMC DQS read strobe mode. */ -typedef enum _semc_dqs_mode -{ - kSEMC_Loopbackinternal = 0, /*!< Dummy read strobe loopbacked internally. */ - kSEMC_Loopbackdqspad, /*!< Dummy read strobe loopbacked from DQS pad. */ -} semc_dqs_mode_t; - -/*! @brief SEMC ADV signal active polarity. */ -typedef enum _semc_adv_polarity -{ - kSEMC_AdvActiveLow = 0, /*!< Adv active low. */ - kSEMC_AdvActiveHigh, /*!< Adv active high. */ -} semc_adv_polarity_t; - -/*! @brief SEMC sync mode. */ -typedef enum _semc_sync_mode -{ - kSEMC_AsyncMode = 0, /*!< Async mode. */ - kSEMC_SyncMode, /*!< Sync mode. */ -} semc_sync_mode_t; - -/*! @brief SEMC ADV signal level control. */ -typedef enum _semc_adv_level_control -{ - kSEMC_AdvHigh = 0, /*!< Adv is high during address hold state. */ - kSEMC_AdvLow, /*!< Adv is low during address hold state. */ -} semc_adv_level_control_t; - -/*! @brief SEMC RDY signal active polarity. */ -typedef enum _semc_rdy_polarity -{ - kSEMC_RdyActiveLow = 0, /*!< Adv active low. */ - kSEMC_RdyActivehigh, /*!< Adv active low. */ -} semc_rdy_polarity_t; - -/*! @brief SEMC IP command for NAND: address mode. */ -typedef enum _semc_ipcmd_nand_addrmode -{ - kSEMC_NANDAM_ColumnRow = 0x0U, /*!< Address mode: column and row address(5Byte-CA0/CA1/RA0/RA1/RA2). */ - kSEMC_NANDAM_ColumnCA0, /*!< Address mode: column address only(1 Byte-CA0). */ - kSEMC_NANDAM_ColumnCA0CA1, /*!< Address mode: column address only(2 Byte-CA0/CA1). */ - kSEMC_NANDAM_RawRA0, /*!< Address mode: row address only(1 Byte-RA0). */ - kSEMC_NANDAM_RawRA0RA1, /*!< Address mode: row address only(2 Byte-RA0/RA1). */ - kSEMC_NANDAM_RawRA0RA1RA2 /*!< Address mode: row address only(3 Byte-RA0). */ -} semc_ipcmd_nand_addrmode_t; - -/*! @brief SEMC IP command for NAND: command mode. */ -typedef enum _semc_ipcmd_nand_cmdmode -{ - kSEMC_NANDCM_Command = 0x2U, /*!< command. */ - kSEMC_NANDCM_CommandHold, /*!< Command hold. */ - kSEMC_NANDCM_CommandAddress, /*!< Command address. */ - kSEMC_NANDCM_CommandAddressHold, /*!< Command address hold. */ - kSEMC_NANDCM_CommandAddressRead, /*!< Command address read. */ - kSEMC_NANDCM_CommandAddressWrite, /*!< Command address write. */ - kSEMC_NANDCM_CommandRead, /*!< Command read. */ - kSEMC_NANDCM_CommandWrite, /*!< Command write. */ - kSEMC_NANDCM_Read, /*!< Read. */ - kSEMC_NANDCM_Write /*!< Write. */ -} semc_ipcmd_nand_cmdmode_t; - -/*! @brief SEMC NAND address option. */ -typedef enum _semc_nand_address_option -{ - kSEMC_NandAddrOption_5byte_CA2RA3 = 0U, /*!< CA0+CA1+RA0+RA1+RA2 */ - kSEMC_NandAddrOption_4byte_CA2RA2 = 2U, /*!< CA0+CA1+RA0+RA1 */ - kSEMC_NandAddrOption_3byte_CA2RA1 = 4U, /*!< CA0+CA1+RA0 */ - kSEMC_NandAddrOption_4byte_CA1RA3 = 1U, /*!< CA0+RA0+RA1+RA2 */ - kSEMC_NandAddrOption_3byte_CA1RA2 = 3U, /*!< CA0+RA0+RA1 */ - kSEMC_NandAddrOption_2byte_CA1RA1 = 7U, /*!< CA0+RA0 */ -} semc_nand_address_option_t; - -/*! @brief SEMC IP command for NOR. */ -typedef enum _semc_ipcmd_nor_dbi -{ - kSEMC_NORDBICM_Read = 0x2U, /*!< NOR read. */ - kSEMC_NORDBICM_Write /*!< NOR write. */ -} semc_ipcmd_nor_dbi_t; - -/*! @brief SEMC IP command for SRAM. */ -typedef enum _semc_ipcmd_sram -{ - kSEMC_SRAMCM_ArrayRead = 0x2U, /*!< SRAM memory array read. */ - kSEMC_SRAMCM_ArrayWrite, /*!< SRAM memory array write. */ - kSEMC_SRAMCM_RegRead, /*!< SRAM memory register read. */ - kSEMC_SRAMCM_RegWrite /*!< SRAM memory register write. */ -} semc_ipcmd_sram_t; - -/*! @brief SEMC IP command for SDARM. */ -typedef enum _semc_ipcmd_sdram -{ - kSEMC_SDRAMCM_Read = 0x8U, /*!< SDRAM memory read. */ - kSEMC_SDRAMCM_Write, /*!< SDRAM memory write. */ - kSEMC_SDRAMCM_Modeset, /*!< SDRAM MODE SET. */ - kSEMC_SDRAMCM_Active, /*!< SDRAM active. */ - kSEMC_SDRAMCM_AutoRefresh, /*!< SDRAM auto-refresh. */ - kSEMC_SDRAMCM_SelfRefresh, /*!< SDRAM self-refresh. */ - kSEMC_SDRAMCM_Precharge, /*!< SDRAM precharge. */ - kSEMC_SDRAMCM_Prechargeall /*!< SDRAM precharge all. */ -} semc_ipcmd_sdram_t; - -/*! @brief SEMC SDRAM configuration structure. - * - * 1. The memory size in the configuration is in the unit of KB. So memsize_kbytes - * should be set as 2^2, 2^3, 2^4 .etc which is base 2KB exponential function. - * Take refer to BR0~BR3 register in RM for details. - * 2. The prescalePeriod_N16Cycle is in unit of 16 clock cycle. It is a exception for prescaleTimer_n16cycle = 0, - * it means the prescaler timer period is 256 * 16 clock cycles. For precalerIf precalerTimer_n16cycle not equal to 0, - * The prescaler timer period is prescalePeriod_N16Cycle * 16 clock cycles. - * idleTimeout_NprescalePeriod, refreshUrgThreshold_NprescalePeriod, refreshPeriod_NprescalePeriod are - * similar to prescalePeriod_N16Cycle. - * - */ -typedef struct _semc_sdram_config -{ - semc_iomux_pin csxPinMux; /*!< CS pin mux. The kSEMC_MUXA8 is not valid in sdram pin mux setting. */ - uint32_t address; /*!< The base address. */ - uint32_t memsize_kbytes; /*!< The memory size in unit of kbytes. */ - smec_port_size_t portSize; /*!< Port size. */ - sem_sdram_burst_len_t burstLen; /*!< Burst length. */ - semc_sdram_column_bit_num_t columnAddrBitNum; /*!< Column address bit number. */ - semc_caslatency_t casLatency; /*!< CAS latency. */ - uint8_t tPrecharge2Act_Ns; /*!< Precharge to active wait time in unit of nanosecond. */ - uint8_t tAct2ReadWrite_Ns; /*!< Act to read/write wait time in unit of nanosecond. */ - uint8_t tRefreshRecovery_Ns; /*!< Refresh recovery time in unit of nanosecond. */ - uint8_t tWriteRecovery_Ns; /*!< write recovery time in unit of nanosecond. */ - uint8_t tCkeOff_Ns; /*!< CKE off minimum time in unit of nanosecond. */ - uint8_t tAct2Prechage_Ns; /*!< Active to precharge in unit of nanosecond. */ - uint8_t tSelfRefRecovery_Ns; /*!< Self refresh recovery time in unit of nanosecond. */ - uint8_t tRefresh2Refresh_Ns; /*!< Refresh to refresh wait time in unit of nanosecond. */ - uint8_t tAct2Act_Ns; /*!< Active to active wait time in unit of nanosecond. */ - uint32_t tPrescalePeriod_Ns; /*!< Prescaler timer period should not be larger than 256 * 16 * clock cycle. */ - uint32_t tIdleTimeout_Ns; /*!< Idle timeout in unit of prescale time period. */ - uint32_t refreshPeriod_nsPerRow; /*!< Refresh timer period like 64ms * 1000000/8192 . */ - uint32_t refreshUrgThreshold; /*!< Refresh urgent threshold. */ - uint8_t refreshBurstLen; /*!< Refresh burst length. */ -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint8_t delayChain; /*!< Delay chain, which adds delays on DQS clock to compensate timings while DQS is faster than - read data. */ -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ -} semc_sdram_config_t; - -/*! @brief SEMC NAND device timing configuration structure. */ -typedef struct _semc_nand_timing_config -{ - uint8_t tCeSetup_Ns; /*!< CE setup time: tCS. */ - uint8_t tCeHold_Ns; /*!< CE hold time: tCH. */ - uint8_t tCeInterval_Ns; /*!< CE interval time:tCEITV. */ - uint8_t tWeLow_Ns; /*!< WE low time: tWP. */ - uint8_t tWeHigh_Ns; /*!< WE high time: tWH. */ - uint8_t tReLow_Ns; /*!< RE low time: tRP. */ - uint8_t tReHigh_Ns; /*!< RE high time: tREH. */ - uint8_t tTurnAround_Ns; /*!< Turnaround time for async mode: tTA. */ - uint8_t tWehigh2Relow_Ns; /*!< WE# high to RE# wait time: tWHR. */ - uint8_t tRehigh2Welow_Ns; /*!< RE# high to WE# low wait time: tRHW. */ - uint8_t tAle2WriteStart_Ns; /*!< ALE to write start wait time: tADL. */ - uint8_t tReady2Relow_Ns; /*!< Ready to RE# low min wait time: tRR. */ - uint8_t tWehigh2Busy_Ns; /*!< WE# high to busy wait time: tWB. */ -} semc_nand_timing_config_t; - -/*! @brief SEMC NAND configuration structure. */ -typedef struct _semc_nand_config -{ - semc_iomux_pin cePinMux; /*!< The CE pin mux setting. The kSEMC_MUXRDY is not valid for CE pin setting. */ - uint32_t axiAddress; /*!< The base address for AXI nand. */ - uint32_t axiMemsize_kbytes; /*!< The memory size in unit of kbytes for AXI nand. */ - uint32_t ipgAddress; /*!< The base address for IPG nand . */ - uint32_t ipgMemsize_kbytes; /*!< The memory size in unit of kbytes for IPG nand. */ - semc_rdy_polarity_t rdyactivePolarity; /*!< Wait ready polarity. */ - bool edoModeEnabled; /*!< EDO mode enabled. */ - semc_nand_column_bit_num_t columnAddrBitNum; /*!< Column address bit number. */ - semc_nand_address_option_t arrayAddrOption; /*!< Address option. */ - sem_nand_burst_len_t burstLen; /*!< Burst length. */ - smec_port_size_t portSize; /*!< Port size. */ - semc_nand_timing_config_t *timingConfig; /*!< SEMC nand timing configuration. */ -} semc_nand_config_t; - -/*! @brief SEMC NOR configuration structure. */ -typedef struct _semc_nor_config -{ - semc_iomux_pin cePinMux; /*!< The CE# pin mux setting. */ - semc_iomux_nora27_pin addr27; /*!< The Addr bit 27 pin mux setting. */ - uint32_t address; /*!< The base address. */ - uint32_t memsize_kbytes; /*!< The memory size in unit of kbytes. */ - uint8_t addrPortWidth; /*!< The address port width. */ - semc_rdy_polarity_t rdyactivePolarity; /*!< Wait ready polarity. */ - semc_adv_polarity_t advActivePolarity; /*!< ADV# polarity. */ - semc_norsram_column_bit_num_t columnAddrBitNum; /*!< Column address bit number. */ - semc_addr_mode_t addrMode; /*!< Address mode. */ - sem_norsram_burst_len_t burstLen; /*!< Burst length. */ - smec_port_size_t portSize; /*!< Port size. */ - uint8_t tCeSetup_Ns; /*!< The CE setup time. */ - uint8_t tCeHold_Ns; /*!< The CE hold time. */ - uint8_t tCeInterval_Ns; /*!< CE interval minimum time. */ - uint8_t tAddrSetup_Ns; /*!< The address setup time. */ - uint8_t tAddrHold_Ns; /*!< The address hold time. */ - uint8_t tWeLow_Ns; /*!< WE low time for async mode. */ - uint8_t tWeHigh_Ns; /*!< WE high time for async mode. */ - uint8_t tReLow_Ns; /*!< RE low time for async mode. */ - uint8_t tReHigh_Ns; /*!< RE high time for async mode. */ - uint8_t tTurnAround_Ns; /*!< Turnaround time for async mode. */ - uint8_t tAddr2WriteHold_Ns; /*!< Address to write data hold time for async mode. */ -#if defined(FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME) && (FSL_FEATURE_SEMC_HAS_NOR_WDS_TIME) - uint8_t tWriteSetup_Ns; /*!< Write data setup time for sync mode.*/ -#endif -#if defined(FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME) && (FSL_FEATURE_SEMC_HAS_NOR_WDH_TIME) - uint8_t tWriteHold_Ns; /*!< Write hold time for sync mode. */ -#endif - uint8_t latencyCount; /*!< Latency count for sync mode. */ - uint8_t readCycle; /*!< Read cycle time for sync mode. */ -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint8_t delayChain; /*!< Delay chain, which adds delays on DQS clock to compensate timings while DQS is faster than - read data. */ -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ -} semc_nor_config_t; - -/*! @brief SEMC SRAM configuration structure. */ -typedef struct _semc_sram_config -{ - semc_iomux_pin cePinMux; /*!< The CE# pin mux setting. */ - semc_iomux_nora27_pin addr27; /*!< The Addr bit 27 pin mux setting. */ - uint32_t address; /*!< The base address. */ - uint32_t memsize_kbytes; /*!< The memory size in unit of kbytes. */ - uint8_t addrPortWidth; /*!< The address port width. */ - semc_adv_polarity_t advActivePolarity; /*!< ADV# polarity 1: active high, 0: active low. */ - semc_addr_mode_t addrMode; /*!< Address mode. */ - sem_norsram_burst_len_t burstLen; /*!< Burst length. */ - smec_port_size_t portSize; /*!< Port size. */ -#if defined(SEMC_SRAMCR4_SYNCEN_MASK) && (SEMC_SRAMCR4_SYNCEN_MASK) - semc_sync_mode_t syncMode; /*!< Sync mode. */ -#endif /* SEMC_SRAMCR4_SYNCEN_MASK */ -#if defined(SEMC_SRAMCR0_WAITEN_MASK) && (SEMC_SRAMCR0_WAITEN_MASK) - bool waitEnable; /*!< Wait enable. */ -#endif /* SEMC_SRAMCR0_WAITEN_MASK */ -#if defined(SEMC_SRAMCR0_WAITSP_MASK) && (SEMC_SRAMCR0_WAITSP_MASK) - uint8_t waitSample; /*!< Wait sample. */ -#endif /* SEMC_SRAMCR0_WAITSP_MASK */ -#if defined(SEMC_SRAMCR4_ADVH_MASK) && (SEMC_SRAMCR4_ADVH_MASK) - semc_adv_level_control_t advLevelCtrl; /*!< ADV# level control during address hold state, 1: low, 0: high. */ -#endif /* SEMC_SRAMCR4_ADVH_MASK */ - uint8_t tCeSetup_Ns; /*!< The CE setup time. */ - uint8_t tCeHold_Ns; /*!< The CE hold time. */ - uint8_t tCeInterval_Ns; /*!< CE interval minimum time. */ -#if defined(FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) && (FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME) - uint8_t readHoldTime_Ns; /*!< read hold time. */ -#endif /* FSL_FEATURE_SEMC_HAS_SRAM_RDH_TIME */ - uint8_t tAddrSetup_Ns; /*!< The address setup time. */ - uint8_t tAddrHold_Ns; /*!< The address hold time. */ - uint8_t tWeLow_Ns; /*!< WE low time for async mode. */ - uint8_t tWeHigh_Ns; /*!< WE high time for async mode. */ - uint8_t tReLow_Ns; /*!< RE low time for async mode. */ - uint8_t tReHigh_Ns; /*!< RE high time for async mode. */ - uint8_t tTurnAround_Ns; /*!< Turnaround time for async mode. */ - uint8_t tAddr2WriteHold_Ns; /*!< Address to write data hold time for async mode. */ - uint8_t tWriteSetup_Ns; /*!< Write data setup time for sync mode.*/ - uint8_t tWriteHold_Ns; /*!< Write hold time for sync mode. */ - uint8_t latencyCount; /*!< Latency count for sync mode. */ - uint8_t readCycle; /*!< Read cycle time for sync mode. */ -#if defined(FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) && (FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL) - uint8_t delayChain; /*!< Delay chain, which adds delays on DQS clock to compensate timings while DQS is faster than - read data. */ -#endif /* FSL_FEATURE_SEMC_HAS_DELAY_CHAIN_CONTROL */ -} semc_sram_config_t; - -/*! @brief SEMC DBI configuration structure. */ -typedef struct _semc_dbi_config -{ - semc_iomux_pin csxPinMux; /*!< The CE# pin mux. */ - uint32_t address; /*!< The base address. */ - uint32_t memsize_kbytes; /*!< The memory size in unit of 4kbytes. */ - semc_dbi_column_bit_num_t columnAddrBitNum; /*!< Column address bit number. */ - sem_dbi_burst_len_t burstLen; /*!< Burst length. */ - smec_port_size_t portSize; /*!< Port size. */ - uint8_t tCsxSetup_Ns; /*!< The CSX setup time. */ - uint8_t tCsxHold_Ns; /*!< The CSX hold time. */ - uint8_t tWexLow_Ns; /*!< WEX low time. */ - uint8_t tWexHigh_Ns; /*!< WEX high time. */ - uint8_t tRdxLow_Ns; /*!< RDX low time. */ - uint8_t tRdxHigh_Ns; /*!< RDX high time. */ - uint8_t tCsxInterval_Ns; /*!< Write data setup time.*/ -} semc_dbi_config_t; - -/*! @brief SEMC AXI queue a weight setting structure. */ -typedef struct _semc_queuea_weight_struct -{ - uint32_t qos : 4; /*!< weight of qos for queue 0 . */ - uint32_t aging : 4; /*!< weight of aging for queue 0.*/ - uint32_t slaveHitSwith : 8; /*!< weight of read/write switch for queue 0.*/ - uint32_t slaveHitNoswitch : 8; /*!< weight of read/write no switch for queue 0 .*/ -} semc_queuea_weight_struct_t; - -/*! @brief SEMC AXI queue a weight setting union. */ -typedef union _semc_queuea_weight -{ - semc_queuea_weight_struct_t queueaConfig; /*!< Structure configuration for queueA. */ - uint32_t queueaValue; /*!< Configuration value for queueA which could directly write to the reg. */ -} semc_queuea_weight_t; - -/*! @brief SEMC AXI queue b weight setting structure. */ -typedef struct _semc_queueb_weight_struct -{ - uint32_t qos : 4; /*!< weight of qos for queue 1. */ - uint32_t aging : 4; /*!< weight of aging for queue 1.*/ - uint32_t slaveHitSwith : 8; /*!< weight of read/write switch for queue 1.*/ - uint32_t weightPagehit : 8; /*!< weight of page hit for queue 1 only .*/ - uint32_t bankRotation : 8; /*!< weight of bank rotation for queue 1 only .*/ -} semc_queueb_weight_struct_t; - -/*! @brief SEMC AXI queue b weight setting union. */ -typedef union _semc_queueb_weight -{ - semc_queueb_weight_struct_t queuebConfig; /*!< Structure configuration for queueB. */ - uint32_t queuebValue; /*!< Configuration value for queueB which could directly write to the reg. */ -} semc_queueb_weight_t; - -/*! @brief SEMC AXI queue weight setting. */ -typedef struct _semc_axi_queueweight -{ - bool queueaEnable; /*!< Enable queue a. */ - semc_queuea_weight_t queueaWeight; /*!< Weight settings for queue a. */ - bool queuebEnable; /*!< Enable queue b. */ - semc_queueb_weight_t queuebWeight; /*!< Weight settings for queue b. */ -} semc_axi_queueweight_t; - -/*! - * @brief SEMC configuration structure. - * - * busTimeoutCycles: when busTimeoutCycles is zero, the bus timeout cycle is - * 255*1024. otherwise the bus timeout cycles is busTimeoutCycles*1024. - * cmdTimeoutCycles: is used for command execution timeout cycles. it's - * similar to the busTimeoutCycles. - */ -typedef struct _semc_config_t -{ - semc_dqs_mode_t dqsMode; /*!< Dummy read strobe mode: use enum in "semc_dqs_mode_t". */ - uint8_t cmdTimeoutCycles; /*!< Command execution timeout cycles. */ - uint8_t busTimeoutCycles; /*!< Bus timeout cycles. */ - semc_axi_queueweight_t queueWeight; /*!< AXI queue weight. */ -} semc_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name SEMC Initialization and De-initialization - * @{ - */ - -/*! - * @brief Gets the SEMC default basic configuration structure. - * - * The purpose of this API is to get the default SEMC - * configure structure for SEMC_Init(). User may use the initialized - * structure unchanged in SEMC_Init(), or modify some fields of the - * structure before calling SEMC_Init(). - * Example: - @code - semc_config_t config; - SEMC_GetDefaultConfig(&config); - @endcode - * @param config The SEMC configuration structure pointer. - */ -void SEMC_GetDefaultConfig(semc_config_t *config); - -/*! - * @brief Initializes SEMC. - * This function ungates the SEMC clock and initializes SEMC. - * This function must be called before calling any other SEMC driver functions. - * - * @param base SEMC peripheral base address. - * @param configure The SEMC configuration structure pointer. - */ -void SEMC_Init(SEMC_Type *base, semc_config_t *configure); - -/*! - * @brief Deinitializes the SEMC module and gates the clock. - * - * This function gates the SEMC clock. As a result, the SEMC module doesn't work after - * calling this function, for some IDE, calling this API may cause the next downloading - * operation failed. so, please call this API cautiously. Additional, users can - * using "#define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL (1)" to disable the clock control - * operation in drivers. - * - * @param base SEMC peripheral base address. - */ -void SEMC_Deinit(SEMC_Type *base); - -/* @} */ - -/*! - * @name SEMC Configuration Operation For Each Memory Type - * @{ - */ - -/*! - * @brief Configures SDRAM controller in SEMC. - * - * @param base SEMC peripheral base address. - * @param cs The chip selection. - * @param config The sdram configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSDRAM(SEMC_Type *base, semc_sdram_cs_t cs, semc_sdram_config_t *config, uint32_t clkSrc_Hz); - -/*! - * @brief Configures NAND controller in SEMC. - * - * @param base SEMC peripheral base address. - * @param config The nand configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureNAND(SEMC_Type *base, semc_nand_config_t *config, uint32_t clkSrc_Hz); - -/*! - * @brief Configures NOR controller in SEMC. - * - * @param base SEMC peripheral base address. - * @param config The nor configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureNOR(SEMC_Type *base, semc_nor_config_t *config, uint32_t clkSrc_Hz); - -/*! - * @brief Configures SRAM controller in SEMC. - * - * @param base SEMC peripheral base address. - * @param cs The chip selection. - * @param config The sram configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSRAMWithChipSelection(SEMC_Type *base, - semc_sram_cs_t cs, - semc_sram_config_t *config, - uint32_t clkSrc_Hz); - -/*! - * @brief Configures SRAM controller in SEMC. - * @deprecated Do not use this function. It has been superceded by @ref SEMC_ConfigureSRAMWithChipSelection. - * @param base SEMC peripheral base address. - * @param config The sram configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureSRAM(SEMC_Type *base, semc_sram_config_t *config, uint32_t clkSrc_Hz); - -/*! - * @brief Configures DBI controller in SEMC. - * - * @param base SEMC peripheral base address. - * @param config The dbi configuration. - * @param clkSrc_Hz The SEMC clock frequency. - */ -status_t SEMC_ConfigureDBI(SEMC_Type *base, semc_dbi_config_t *config, uint32_t clkSrc_Hz); - -/* @} */ - -/*! - * @name SEMC Interrupt Operation - * @{ - */ - -/*! - * @brief Enables the SEMC interrupt. - * - * This function enables the SEMC interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See @ref semc_interrupt_enable_t. - * For example, to enable the IP command done and error interrupt, do the following. - * @code - * SEMC_EnableInterrupts(ENET, kSEMC_IPCmdDoneInterrupt | kSEMC_IPCmdErrInterrupt); - * @endcode - * - * @param base SEMC peripheral base address. - * @param mask SEMC interrupts to enable. This is a logical OR of the - * enumeration :: semc_interrupt_enable_t. - */ -static inline void SEMC_EnableInterrupts(SEMC_Type *base, uint32_t mask) -{ - base->INTEN |= mask; -} - -/*! - * @brief Disables the SEMC interrupt. - * - * This function disables the SEMC interrupts according to the provided mask. The mask - * is a logical OR of enumeration members. See @ref semc_interrupt_enable_t. - * For example, to disable the IP command done and error interrupt, do the following. - * @code - * SEMC_DisableInterrupts(ENET, kSEMC_IPCmdDoneInterrupt | kSEMC_IPCmdErrInterrupt); - * @endcode - * - * @param base SEMC peripheral base address. - * @param mask SEMC interrupts to disable. This is a logical OR of the - * enumeration :: semc_interrupt_enable_t. - */ -static inline void SEMC_DisableInterrupts(SEMC_Type *base, uint32_t mask) -{ - base->INTEN &= ~mask; -} - -/*! - * @brief Gets the SEMC status. - * - * This function gets the SEMC interrupts event status. - * User can use the a logical OR of enumeration member as a mask. - * See @ref semc_interrupt_enable_t. - * - * @param base SEMC peripheral base address. - * @return status flag, use status flag in semc_interrupt_enable_t to get the related status. - */ -static inline bool SEMC_GetStatusFlag(SEMC_Type *base) -{ - return (base->INTR != 0x00U) ? true : false; -} - -/*! - * @brief Clears the SEMC status flag state. - * - * The following status register flags can be cleared SEMC interrupt status. - * - * @param base SEMC base pointer - * @param mask The status flag mask, a logical OR of enumeration member @ref semc_interrupt_enable_t. - */ -static inline void SEMC_ClearStatusFlags(SEMC_Type *base, uint32_t mask) -{ - base->INTR |= mask; -} - -/* @} */ - -/*! - * @name SEMC Memory Access Operation - * @{ - */ - -/*! - * @brief Check if SEMC is in idle. - * - * @param base SEMC peripheral base address. - * @return True SEMC is in idle, false is not in idle. - */ -static inline bool SEMC_IsInIdle(SEMC_Type *base) -{ - return ((base->STS0 & SEMC_STS0_IDLE_MASK) != 0x00U) ? true : false; -} - -/*! - * @brief SEMC IP command access. - * - * @param base SEMC peripheral base address. - * @param type SEMC memory type. refer to "semc_mem_type_t" - * @param address SEMC device address. - * @param command SEMC IP command. - * For NAND device, we should use the SEMC_BuildNandIPCommand to get the right nand command. - * For NOR/DBI device, take refer to "semc_ipcmd_nor_dbi_t". - * For SRAM device, take refer to "semc_ipcmd_sram_t". - * For SDRAM device, take refer to "semc_ipcmd_sdram_t". - * @param write Data for write access. - * @param read Data pointer for read data out. - */ -status_t SEMC_SendIPCommand( - SEMC_Type *base, semc_mem_type_t type, uint32_t address, uint32_t command, uint32_t write, uint32_t *read); - -/*! - * @brief Build SEMC IP command for NAND. - * - * This function build SEMC NAND IP command. The command is build of user command code, - * SEMC address mode and SEMC command mode. - * - * @param userCommand NAND device normal command. - * @param addrMode NAND address mode. Refer to "semc_ipcmd_nand_addrmode_t". - * @param cmdMode NAND command mode. Refer to "semc_ipcmd_nand_cmdmode_t". - */ -static inline uint16_t SEMC_BuildNandIPCommand(uint8_t userCommand, - semc_ipcmd_nand_addrmode_t addrMode, - semc_ipcmd_nand_cmdmode_t cmdMode) -{ - return ((uint16_t)userCommand << 8U) | ((uint16_t)addrMode << 4U) | ((uint16_t)cmdMode & 0x000FU); -} - -/*! - * @brief Check if the NAND device is ready. - * - * @param base SEMC peripheral base address. - * @return True NAND is ready, false NAND is not ready. - */ -static inline bool SEMC_IsNandReady(SEMC_Type *base) -{ - return ((base->STS0 & SEMC_STS0_NARDY_MASK) != 0x00U) ? true : false; -} - -/*! - * @brief SEMC NAND device memory write through IP command. - * - * @param base SEMC peripheral base address. - * @param address SEMC NAND device address. - * @param data Data for write access. - * @param size_bytes Data length. - */ -status_t SEMC_IPCommandNandWrite(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes); - -/*! - * @brief SEMC NAND device memory read through IP command. - * - * @param base SEMC peripheral base address. - * @param address SEMC NAND device address. - * @param data Data pointer for data read out. - * @param size_bytes Data length. - */ -status_t SEMC_IPCommandNandRead(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes); - -/*! - * @brief SEMC NOR device memory write through IP command. - * - * @param base SEMC peripheral base address. - * @param address SEMC NOR device address. - * @param data Data for write access. - * @param size_bytes Data length. - */ -status_t SEMC_IPCommandNorWrite(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes); - -/*! - * @brief SEMC NOR device memory read through IP command. - * - * @param base SEMC peripheral base address. - * @param address SEMC NOR device address. - * @param data Data pointer for data read out. - * @param size_bytes Data length. - */ -status_t SEMC_IPCommandNorRead(SEMC_Type *base, uint32_t address, uint8_t *data, uint32_t size_bytes); - -/* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_SEMC_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_snvs_hp.c b/devices/MIMXRT1052/drivers/fsl_snvs_hp.c deleted file mode 100644 index 2a2e0c7..0000000 --- a/devices/MIMXRT1052/drivers/fsl_snvs_hp.c +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2019, NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_snvs_hp.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.snvs_hp" -#endif - -#define SECONDS_IN_A_DAY (86400U) -#define SECONDS_IN_A_HOUR (3600U) -#define SECONDS_IN_A_MINUTE (60U) -#define DAYS_IN_A_YEAR (365U) -#define YEAR_RANGE_START (1970U) -#define YEAR_RANGE_END (2099U) - -#if !(defined(SNVS_HPSR_PI_MASK)) -#define SNVS_HPSR_PI_MASK (0x2U) -#endif -#if !(defined(SNVS_HPSR_HPTA_MASK)) -#define SNVS_HPSR_HPTA_MASK (0x1U) -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Checks whether the date and time passed in is valid - * - * @param datetime Pointer to structure where the date and time details are stored - * - * @return Returns false if the date & time details are out of range; true if in range - */ -static bool SNVS_HP_CheckDatetimeFormat(const snvs_hp_rtc_datetime_t *datetime); - -/*! - * @brief Converts time data from datetime to seconds - * - * @param datetime Pointer to datetime structure where the date and time details are stored - * - * @return The result of the conversion in seconds - */ -static uint32_t SNVS_HP_ConvertDatetimeToSeconds(const snvs_hp_rtc_datetime_t *datetime); - -/*! - * @brief Converts time data from seconds to a datetime structure - * - * @param seconds Seconds value that needs to be converted to datetime format - * @param datetime Pointer to the datetime structure where the result of the conversion is stored - */ -static void SNVS_HP_ConvertSecondsToDatetime(uint32_t seconds, snvs_hp_rtc_datetime_t *datetime); - -/*! - * @brief Returns RTC time in seconds. - * - * This function is used internally to get actual RTC time in seconds. - * - * @param base SNVS peripheral base address - * - * @return RTC time in seconds - */ -static uint32_t SNVS_HP_RTC_GetSeconds(SNVS_Type *base); - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) -/*! - * @brief Get the SNVS instance from peripheral base address. - * - * @param base SNVS peripheral base address. - * - * @return SNVS instance. - */ -static uint32_t SNVS_HP_GetInstance(SNVS_Type *base); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) -/*! @brief Pointer to snvs_hp clock. */ -static const clock_ip_name_t s_snvsHpClock[] = SNVS_HP_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static bool SNVS_HP_CheckDatetimeFormat(const snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - /* Table of days in a month for a non leap year. First entry in the table is not used, - * valid months start from 1 - */ - uint8_t daysPerMonth[] = {0U, 31U, 28U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U}; - - /* Check year, month, hour, minute, seconds */ - if ((datetime->year < YEAR_RANGE_START) || (datetime->year > YEAR_RANGE_END) || (datetime->month > 12U) || - (datetime->month < 1U) || (datetime->hour >= 24U) || (datetime->minute >= 60U) || (datetime->second >= 60U)) - { - /* If not correct then error*/ - return false; - } - - /* Adjust the days in February for a leap year */ - if ((((datetime->year & 3U) == 0U) && (datetime->year % 100U != 0U)) || (datetime->year % 400U == 0U)) - { - daysPerMonth[2] = 29U; - } - - /* Check the validity of the day */ - if ((datetime->day > daysPerMonth[datetime->month]) || (datetime->day < 1U)) - { - return false; - } - - return true; -} - -static uint32_t SNVS_HP_ConvertDatetimeToSeconds(const snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - /* Number of days from begin of the non Leap-year*/ - /* Number of days from begin of the non Leap-year*/ - uint16_t monthDays[] = {0U, 0U, 31U, 59U, 90U, 120U, 151U, 181U, 212U, 243U, 273U, 304U, 334U}; - uint32_t seconds; - - /* Compute number of days from 1970 till given year*/ - seconds = (((uint32_t)datetime->year - 1970U) * DAYS_IN_A_YEAR); - /* Add leap year days */ - seconds += (((uint32_t)datetime->year / 4U) - (1970U / 4U)); - /* Add number of days till given month*/ - seconds += monthDays[datetime->month]; - /* Add days in given month. We subtract the current day as it is - * represented in the hours, minutes and seconds field*/ - seconds += ((uint32_t)datetime->day - 1U); - /* For leap year if month less than or equal to Febraury, decrement day counter*/ - if ((0U == (datetime->year & 3U)) && (datetime->month <= 2U)) - { - seconds--; - } - - seconds = (seconds * SECONDS_IN_A_DAY) + (datetime->hour * SECONDS_IN_A_HOUR) + - (datetime->minute * SECONDS_IN_A_MINUTE) + datetime->second; - - return seconds; -} - -static void SNVS_HP_ConvertSecondsToDatetime(uint32_t seconds, snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t x; - uint32_t secondsRemaining, days; - uint16_t daysInYear; - /* Table of days in a month for a non leap year. First entry in the table is not used, - * valid months start from 1 - */ - uint8_t daysPerMonth[] = {0U, 31U, 28U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U}; - - /* Start with the seconds value that is passed in to be converted to date time format */ - secondsRemaining = seconds; - - /* Calcuate the number of days, we add 1 for the current day which is represented in the - * hours and seconds field - */ - days = secondsRemaining / SECONDS_IN_A_DAY + 1U; - - /* Update seconds left*/ - secondsRemaining = secondsRemaining % SECONDS_IN_A_DAY; - - /* Calculate the datetime hour, minute and second fields */ - datetime->hour = (uint8_t)(secondsRemaining / SECONDS_IN_A_HOUR); - secondsRemaining = secondsRemaining % SECONDS_IN_A_HOUR; - datetime->minute = (uint8_t)(secondsRemaining / 60U); - datetime->second = (uint8_t)(secondsRemaining % SECONDS_IN_A_MINUTE); - - /* Calculate year */ - daysInYear = DAYS_IN_A_YEAR; - datetime->year = YEAR_RANGE_START; - while (days > daysInYear) - { - /* Decrease day count by a year and increment year by 1 */ - days -= daysInYear; - datetime->year++; - - /* Adjust the number of days for a leap year */ - if ((datetime->year & 3U) != 0U) - { - daysInYear = DAYS_IN_A_YEAR; - } - else - { - daysInYear = DAYS_IN_A_YEAR + 1U; - } - } - - /* Adjust the days in February for a leap year */ - if (0U == (datetime->year & 3U)) - { - daysPerMonth[2] = 29U; - } - - for (x = 1U; x <= 12U; x++) - { - if (days <= daysPerMonth[x]) - { - datetime->month = (uint8_t)x; - break; - } - else - { - days -= daysPerMonth[x]; - } - } - - datetime->day = (uint8_t)days; -} - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) -static uint32_t SNVS_HP_GetInstance(SNVS_Type *base) -{ - return 0U; -} -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! - * brief Initialize the SNVS. - * - * note This API should be called at the beginning of the application using the SNVS driver. - * - * param base SNVS peripheral base address - */ -void SNVS_HP_Init(SNVS_Type *base) -{ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) - uint32_t instance = SNVS_HP_GetInstance(base); - CLOCK_EnableClock(s_snvsHpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Deinitialize the SNVS. - * - * param base SNVS peripheral base address - */ -void SNVS_HP_Deinit(SNVS_Type *base) -{ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) - uint32_t instance = SNVS_HP_GetInstance(base); - CLOCK_DisableClock(s_snvsHpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * note This API should be called at the beginning of the application using the SNVS driver. - * - * param base SNVS peripheral base address - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_HP_RTC_Init(SNVS_Type *base, const snvs_hp_rtc_config_t *config) -{ - assert(config != NULL); - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) - uint32_t instance = SNVS_HP_GetInstance(base); - CLOCK_EnableClock(s_snvsHpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - base->HPCOMR |= SNVS_HPCOMR_NPSWA_EN_MASK; - - base->HPCR = SNVS_HPCR_PI_FREQ(config->periodicInterruptFreq); - - if (config->rtcCalEnable) - { - base->HPCR |= SNVS_HPCR_HPCALB_VAL_MASK & (config->rtcCalValue << SNVS_HPCR_HPCALB_VAL_SHIFT); - base->HPCR |= SNVS_HPCR_HPCALB_EN_MASK; - } -} - -/*! - * brief Stops the RTC and SRTC timers. - * - * param base SNVS peripheral base address - */ -void SNVS_HP_RTC_Deinit(SNVS_Type *base) -{ - base->HPCR &= ~SNVS_HPCR_RTC_EN_MASK; - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_HP_CLOCKS)) - uint32_t instance = SNVS_HP_GetInstance(base); - CLOCK_DisableClock(s_snvsHpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Fills in the SNVS config struct with the default settings. - * - * The default values are as follows. - * code - * config->rtccalenable = false; - * config->rtccalvalue = 0U; - * config->PIFreq = 0U; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_HP_RTC_GetDefaultConfig(snvs_hp_rtc_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->rtcCalEnable = false; - config->rtcCalValue = 0U; - config->periodicInterruptFreq = 0U; -} - -static uint32_t SNVS_HP_RTC_GetSeconds(SNVS_Type *base) -{ - uint32_t seconds = 0; - uint32_t tmp = 0; - - /* Do consecutive reads until value is correct */ - do - { - seconds = tmp; - tmp = (base->HPRTCMR << 17U); - tmp |= (base->HPRTCLR >> 15U); - } while (tmp != seconds); - - return seconds; -} - -/*! - * brief Sets the SNVS RTC date and time according to the given time structure. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the date and time details are stored. - * - * return kStatus_Success: Success in setting the time and starting the SNVS RTC - * kStatus_InvalidArgument: Error because the datetime format is incorrect - */ -status_t SNVS_HP_RTC_SetDatetime(SNVS_Type *base, const snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t seconds = 0U; - uint32_t tmp = base->HPCR; - - /* disable RTC */ - SNVS_HP_RTC_StopTimer(base); - - /* Return error if the time provided is not valid */ - if (!(SNVS_HP_CheckDatetimeFormat(datetime))) - { - return kStatus_InvalidArgument; - } - - /* Set time in seconds */ - seconds = SNVS_HP_ConvertDatetimeToSeconds(datetime); - - base->HPRTCMR = (uint32_t)(seconds >> 17U); - base->HPRTCLR = (uint32_t)(seconds << 15U); - - /* reenable RTC in case that it was enabled before */ - if ((tmp & SNVS_HPCR_RTC_EN_MASK) != 0U) - { - SNVS_HP_RTC_StartTimer(base); - } - - return kStatus_Success; -} - -/*! - * brief Gets the SNVS RTC time and stores it in the given time structure. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the date and time details are stored. - */ -void SNVS_HP_RTC_GetDatetime(SNVS_Type *base, snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - SNVS_HP_ConvertSecondsToDatetime(SNVS_HP_RTC_GetSeconds(base), datetime); -} - -/*! - * brief Sets the SNVS RTC alarm time. - * - * The function sets the RTC alarm. It also checks whether the specified alarm time - * is greater than the present time. If not, the function does not set the alarm - * and returns an error. - * - * param base SNVS peripheral base address - * param alarmTime Pointer to the structure where the alarm time is stored. - * - * return kStatus_Success: success in setting the SNVS RTC alarm - * kStatus_InvalidArgument: Error because the alarm datetime format is incorrect - * kStatus_Fail: Error because the alarm time has already passed - */ -status_t SNVS_HP_RTC_SetAlarm(SNVS_Type *base, const snvs_hp_rtc_datetime_t *alarmTime) -{ - assert(alarmTime != NULL); - - uint32_t alarmSeconds = 0U; - uint32_t currSeconds = 0U; - uint32_t tmp = base->HPCR; - - /* Return error if the alarm time provided is not valid */ - if (!(SNVS_HP_CheckDatetimeFormat(alarmTime))) - { - return kStatus_InvalidArgument; - } - - alarmSeconds = SNVS_HP_ConvertDatetimeToSeconds(alarmTime); - currSeconds = SNVS_HP_RTC_GetSeconds(base); - - /* Return error if the alarm time has passed */ - if (alarmSeconds < currSeconds) - { - return kStatus_Fail; - } - - /* disable RTC alarm interrupt */ - base->HPCR &= ~SNVS_HPCR_HPTA_EN_MASK; - while ((base->HPCR & SNVS_HPCR_HPTA_EN_MASK) != 0U) - { - } - - /* Set alarm in seconds*/ - base->HPTAMR = (uint32_t)(alarmSeconds >> 17U); - base->HPTALR = (uint32_t)(alarmSeconds << 15U); - - /* reenable RTC alarm interrupt in case that it was enabled before */ - base->HPCR = tmp; - - return kStatus_Success; -} - -/*! - * brief Returns the SNVS RTC alarm time. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the alarm date and time details are stored. - */ -void SNVS_HP_RTC_GetAlarm(SNVS_Type *base, snvs_hp_rtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t alarmSeconds = 0U; - - /* Get alarm in seconds */ - alarmSeconds = (base->HPTAMR << 17U); - alarmSeconds |= (base->HPTALR >> 15U); - - SNVS_HP_ConvertSecondsToDatetime(alarmSeconds, datetime); -} - -#if (defined(FSL_FEATURE_SNVS_HAS_SRTC) && (FSL_FEATURE_SNVS_HAS_SRTC > 0)) -/*! - * brief The function synchronizes RTC counter value with SRTC. - * - * param base SNVS peripheral base address - */ -void SNVS_HP_RTC_TimeSynchronize(SNVS_Type *base) -{ - uint32_t tmp = base->HPCR; - - /* disable RTC */ - SNVS_HP_RTC_StopTimer(base); - - base->HPCR |= SNVS_HPCR_HP_TS_MASK; - - /* reenable RTC in case that it was enabled before */ - if ((tmp & SNVS_HPCR_RTC_EN_MASK) != 0U) - { - SNVS_HP_RTC_StartTimer(base); - } -} -#endif /* FSL_FEATURE_SNVS_HAS_SRTC */ - -/*! - * brief Gets the SNVS status flags. - * - * param base SNVS peripheral base address - * - * return The status flags. This is the logical OR of members of the - * enumeration ::snvs_status_flags_t - */ -uint32_t SNVS_HP_RTC_GetStatusFlags(SNVS_Type *base) -{ - uint32_t flags = 0U; - - if ((base->HPSR & SNVS_HPSR_PI_MASK) != 0U) - { - flags |= (uint32_t)kSNVS_RTC_PeriodicInterruptFlag; - } - - if ((base->HPSR & SNVS_HPSR_HPTA_MASK) != 0U) - { - flags |= (uint32_t)kSNVS_RTC_AlarmInterruptFlag; - } - - return flags; -} - -/*! - * brief Gets the enabled SNVS interrupts. - * - * param base SNVS peripheral base address - * - * return The enabled interrupts. This is the logical OR of members of the - * enumeration ::snvs_interrupt_enable_t - */ -uint32_t SNVS_HP_RTC_GetEnabledInterrupts(SNVS_Type *base) -{ - uint32_t val = 0U; - - if ((base->HPCR & SNVS_HPCR_PI_EN_MASK) != 0U) - { - val |= (uint32_t)kSNVS_RTC_PeriodicInterrupt; - } - - if ((base->HPCR & SNVS_HPCR_HPTA_EN_MASK) != 0U) - { - val |= (uint32_t)kSNVS_RTC_AlarmInterrupt; - } - - return val; -} - -#if defined(FSL_FEATURE_SNVS_HAS_SET_LOCK) && (FSL_FEATURE_SNVS_HAS_SET_LOCK > 0) -/*! - * brief Set SNVS HP Set locks. - * - * param base SNVS peripheral base address - * - */ -void SNVS_HP_SetLocks(SNVS_Type *base) -{ - uint32_t sec_config = ((OCOTP_CTRL->HW_OCOTP_OTFAD_CFG3 & OCOTP_CTRL_HW_OCOTP_SEC_CONFIG1_MASK) >> - OCOTP_CTRL_HW_OCOTP_SEC_CONFIG1_SHIFT); - - if (sec_config == SEC_CONFIG_OPEN) - { - /* Enable non-secure SW access */ - base->HPCOMR |= SNVS_HPCOMR_NPSWA_EN(1); - } - - /* Set LP Software Reset Disable lock and ZMK Write Soft Lock */ - base->HPCOMR |= SNVS_HPCOMR_LP_SWR_DIS(1); - base->HPLR |= SNVS_HPLR_ZMK_WSL(1); -} -#endif /* FSL_FEATURE_SNVS_HAS_SET_LOCK */ diff --git a/devices/MIMXRT1052/drivers/fsl_snvs_hp.h b/devices/MIMXRT1052/drivers/fsl_snvs_hp.h deleted file mode 100644 index 7c2f30d..0000000 --- a/devices/MIMXRT1052/drivers/fsl_snvs_hp.h +++ /dev/null @@ -1,649 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2020, NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_SNVS_HP_H_ -#define _FSL_SNVS_HP_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup snvs_hp - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SNVS_HP_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) /*!< Version 2.3.0 */ -/*@}*/ - -/*! @brief List of SNVS interrupts */ -typedef enum _snvs_hp_interrupts -{ - kSNVS_RTC_AlarmInterrupt = SNVS_HPCR_HPTA_EN_MASK, /*!< RTC time alarm */ - kSNVS_RTC_PeriodicInterrupt = SNVS_HPCR_PI_EN_MASK, /*!< RTC periodic interrupt */ -} snvs_hp_interrupts_t; - -/*! @brief List of SNVS flags */ -typedef enum _snvs_hp_status_flags -{ - kSNVS_RTC_AlarmInterruptFlag = SNVS_HPSR_HPTA_MASK, /*!< RTC time alarm flag */ - kSNVS_RTC_PeriodicInterruptFlag = SNVS_HPSR_PI_MASK, /*!< RTC periodic interrupt flag */ - kSNVS_ZMK_ZeroFlag = (int)SNVS_HPSR_ZMK_ZERO_MASK, /*!< The ZMK is zero */ - kSNVS_OTPMK_ZeroFlag = SNVS_HPSR_OTPMK_ZERO_MASK, /*!< The OTPMK is zero */ -} snvs_hp_status_flags_t; - -/* Re-map Security Violation for RT11xx specific violation*/ -#ifndef SNVS_HPSVSR_SV0_MASK -#define SNVS_HPSVSR_SV0_MASK SNVS_HPSVSR_CAAM_MASK -#endif - -#ifndef SNVS_HPSVSR_SV1_MASK -#define SNVS_HPSVSR_SV1_MASK SNVS_HPSVSR_JTAGC_MASK -#endif - -#ifndef SNVS_HPSVSR_SV2_MASK -#define SNVS_HPSVSR_SV2_MASK SNVS_HPSVSR_WDOG2_MASK -#endif - -#ifndef SNVS_HPSVSR_SV4_MASK -#define SNVS_HPSVSR_SV4_MASK SNVS_HPSVSR_SRC_MASK -#endif - -#ifndef SNVS_HPSVSR_SV5_MASK -#define SNVS_HPSVSR_SV5_MASK SNVS_HPSVSR_OCOTP_MASK -#endif - -/*! @brief List of SNVS security violation flags */ -typedef enum _snvs_hp_sv_status_flags -{ - kSNVS_LP_ViolationFlag = SNVS_HPSVSR_SW_LPSV_MASK, /*!< Low Power section Security Violation */ - kSNVS_ZMK_EccFailFlag = SNVS_HPSVSR_ZMK_ECC_FAIL_MASK, /*!< Zeroizable Master Key Error Correcting Code Check - Failure */ - kSNVS_LP_SoftwareViolationFlag = SNVS_HPSVSR_SW_LPSV_MASK, /*!< LP Software Security Violation */ - kSNVS_FatalSoftwareViolationFlag = SNVS_HPSVSR_SW_FSV_MASK, /*!< Software Fatal Security Violation */ - kSNVS_SoftwareViolationFlag = SNVS_HPSVSR_SW_SV_MASK, /*!< Software Security Violation */ - kSNVS_Violation0Flag = SNVS_HPSVSR_SV0_MASK, /*!< Security Violation 0 */ - kSNVS_Violation1Flag = SNVS_HPSVSR_SV1_MASK, /*!< Security Violation 1 */ - kSNVS_Violation2Flag = SNVS_HPSVSR_SV2_MASK, /*!< Security Violation 2 */ -#if defined(SNVS_HPSVSR_SV3_MASK) - kSNVS_Violation3Flag = SNVS_HPSVSR_SV3_MASK, /*!< Security Violation 3 */ -#endif /* SNVS_HPSVSR_SV3_MASK */ - kSNVS_Violation4Flag = SNVS_HPSVSR_SV4_MASK, /*!< Security Violation 4 */ - kSNVS_Violation5Flag = SNVS_HPSVSR_SV5_MASK, /*!< Security Violation 5 */ -} snvs_hp_sv_status_flags_t; - -/*! - * @brief Macro to make security violation flag - * - * Macro help to make security violation flag kSNVS_Violation0Flag to kSNVS_Violation5Flag, - * For example, SNVS_MAKE_HP_SV_FLAG(0) is kSNVS_Violation0Flag. - */ -#define SNVS_MAKE_HP_SV_FLAG(x) (1U << (SNVS_HPSVSR_SV0_SHIFT + (x))) - -/*! @brief Structure is used to hold the date and time */ -typedef struct _snvs_hp_rtc_datetime -{ - uint16_t year; /*!< Range from 1970 to 2099.*/ - uint8_t month; /*!< Range from 1 to 12.*/ - uint8_t day; /*!< Range from 1 to 31 (depending on month).*/ - uint8_t hour; /*!< Range from 0 to 23.*/ - uint8_t minute; /*!< Range from 0 to 59.*/ - uint8_t second; /*!< Range from 0 to 59.*/ -} snvs_hp_rtc_datetime_t; - -/*! - * @brief SNVS config structure - * - * This structure holds the configuration settings for the SNVS peripheral. To initialize this - * structure to reasonable defaults, call the SNVS_GetDefaultConfig() function and pass a - * pointer to your config structure instance. - * - * The config struct can be made const so it resides in flash - */ -typedef struct _snvs_hp_rtc_config -{ - bool rtcCalEnable; /*!< true: RTC calibration mechanism is enabled; - false:No calibration is used */ - uint32_t rtcCalValue; /*!< Defines signed calibration value for nonsecure RTC; - This is a 5-bit 2's complement value, range from -16 to +15 */ - uint32_t periodicInterruptFreq; /*!< Defines frequency of the periodic interrupt; - Range from 0 to 15 */ -} snvs_hp_rtc_config_t; - -/*! @brief List of SNVS Security State Machine State */ -typedef enum _snvs_hp_ssm_state -{ - kSNVS_SSMInit = 0x00, /*!< Init */ - kSNVS_SSMHardFail = 0x01, /*!< Hard Fail */ - kSNVS_SSMSoftFail = 0x03, /*!< Soft Fail */ - kSNVS_SSMInitInter = 0x08, /*!< Init Intermediate (transition state between Init and Check) */ - kSNVS_SSMCheck = 0x09, /*!< Check */ - kSNVS_SSMNonSecure = 0x0B, /*!< Non-Secure */ - kSNVS_SSMTrusted = 0x0D, /*!< Trusted */ - kSNVS_SSMSecure = 0x0F, /*!< Secure */ -} snvs_hp_ssm_state_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initialize the SNVS. - * - * @note This API should be called at the beginning of the application using the SNVS driver. - * - * @param base SNVS peripheral base address - */ -void SNVS_HP_Init(SNVS_Type *base); - -/*! - * @brief Deinitialize the SNVS. - * - * @param base SNVS peripheral base address - */ -void SNVS_HP_Deinit(SNVS_Type *base); - -/*! - * @brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * @note This API should be called at the beginning of the application using the SNVS driver. - * - * @param base SNVS peripheral base address - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_HP_RTC_Init(SNVS_Type *base, const snvs_hp_rtc_config_t *config); - -/*! - * @brief Stops the RTC and SRTC timers. - * - * @param base SNVS peripheral base address - */ -void SNVS_HP_RTC_Deinit(SNVS_Type *base); - -/*! - * @brief Fills in the SNVS config struct with the default settings. - * - * The default values are as follows. - * @code - * config->rtccalenable = false; - * config->rtccalvalue = 0U; - * config->PIFreq = 0U; - * @endcode - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_HP_RTC_GetDefaultConfig(snvs_hp_rtc_config_t *config); - -/*! @}*/ - -/*! - * @name Non secure RTC current Time & Alarm - * @{ - */ - -/*! - * @brief Sets the SNVS RTC date and time according to the given time structure. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the date and time details are stored. - * - * @return kStatus_Success: Success in setting the time and starting the SNVS RTC - * kStatus_InvalidArgument: Error because the datetime format is incorrect - */ -status_t SNVS_HP_RTC_SetDatetime(SNVS_Type *base, const snvs_hp_rtc_datetime_t *datetime); - -/*! - * @brief Gets the SNVS RTC time and stores it in the given time structure. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the date and time details are stored. - */ -void SNVS_HP_RTC_GetDatetime(SNVS_Type *base, snvs_hp_rtc_datetime_t *datetime); - -/*! - * @brief Sets the SNVS RTC alarm time. - * - * The function sets the RTC alarm. It also checks whether the specified alarm time - * is greater than the present time. If not, the function does not set the alarm - * and returns an error. - * - * @param base SNVS peripheral base address - * @param alarmTime Pointer to the structure where the alarm time is stored. - * - * @return kStatus_Success: success in setting the SNVS RTC alarm - * kStatus_InvalidArgument: Error because the alarm datetime format is incorrect - * kStatus_Fail: Error because the alarm time has already passed - */ -status_t SNVS_HP_RTC_SetAlarm(SNVS_Type *base, const snvs_hp_rtc_datetime_t *alarmTime); - -/*! - * @brief Returns the SNVS RTC alarm time. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the alarm date and time details are stored. - */ -void SNVS_HP_RTC_GetAlarm(SNVS_Type *base, snvs_hp_rtc_datetime_t *datetime); - -#if (defined(FSL_FEATURE_SNVS_HAS_SRTC) && (FSL_FEATURE_SNVS_HAS_SRTC > 0)) -/*! - * @brief The function synchronizes RTC counter value with SRTC. - * - * @param base SNVS peripheral base address - */ -void SNVS_HP_RTC_TimeSynchronize(SNVS_Type *base); -#endif /* FSL_FEATURE_SNVS_HAS_SRTC */ - -/*! @}*/ - -/*! - * @name Interrupt Interface - * @{ - */ - -/*! - * @brief Enables the selected SNVS interrupts. - * - * @param base SNVS peripheral base address - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration :: _snvs_hp_interrupts_t - */ -static inline void SNVS_HP_RTC_EnableInterrupts(SNVS_Type *base, uint32_t mask) -{ - base->HPCR |= mask; -} - -/*! - * @brief Disables the selected SNVS interrupts. - * - * @param base SNVS peripheral base address - * @param mask The interrupts to disable. This is a logical OR of members of the - * enumeration :: _snvs_hp_interrupts_t - */ -static inline void SNVS_HP_RTC_DisableInterrupts(SNVS_Type *base, uint32_t mask) -{ - base->HPCR &= ~mask; -} - -/*! - * @brief Gets the enabled SNVS interrupts. - * - * @param base SNVS peripheral base address - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration :: _snvs_hp_interrupts_t - */ -uint32_t SNVS_HP_RTC_GetEnabledInterrupts(SNVS_Type *base); - -/*! @}*/ - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Gets the SNVS status flags. - * - * @param base SNVS peripheral base address - * - * @return The status flags. This is the logical OR of members of the - * enumeration :: _snvs_hp_status_flags_t - */ -uint32_t SNVS_HP_RTC_GetStatusFlags(SNVS_Type *base); - -/*! - * @brief Clears the SNVS status flags. - * - * @param base SNVS peripheral base address - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration :: _snvs_hp_status_flags_t - */ -static inline void SNVS_HP_RTC_ClearStatusFlags(SNVS_Type *base, uint32_t mask) -{ - base->HPSR |= mask; -} - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ - -/*! - * @brief Starts the SNVS RTC time counter. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_RTC_StartTimer(SNVS_Type *base) -{ - base->HPCR |= SNVS_HPCR_RTC_EN_MASK; - while (0U == (base->HPCR & SNVS_HPCR_RTC_EN_MASK)) - { - } -} - -/*! - * @brief Stops the SNVS RTC time counter. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_RTC_StopTimer(SNVS_Type *base) -{ - base->HPCR &= ~SNVS_HPCR_RTC_EN_MASK; - while ((base->HPCR & SNVS_HPCR_RTC_EN_MASK) != 0U) - { - } -} - -/*! @}*/ - -/*! - * @brief Enable or disable master key selection. - * - * @param base SNVS peripheral base address - * @param enable Pass true to enable, false to disable. - */ -static inline void SNVS_HP_EnableMasterKeySelection(SNVS_Type *base, bool enable) -{ - if (enable) - { - base->HPCOMR |= SNVS_HPCOMR_MKS_EN_MASK; - } - else - { - base->HPCOMR &= (~SNVS_HPCOMR_MKS_EN_MASK); - } -} - -/*! - * @brief Trigger to program Zeroizable Master Key. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_ProgramZeroizableMasterKey(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_PROG_ZMK_MASK; -} - -/*! - * @brief Trigger SSM State Transition - * - * Trigger state transition of the system security monitor (SSM). It results only - * the following transitions of the SSM: - * - Check State -> Non-Secure (when Non-Secure Boot and not in Fab Configuration) - * - Check State --> Trusted (when Secure Boot or in Fab Configuration ) - * - Trusted State --> Secure - * - Secure State --> Trusted - * - Soft Fail --> Non-Secure - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_ChangeSSMState(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_SSM_ST_MASK; -} - -/*! - * @brief Trigger Software Fatal Security Violation - * - * The result SSM state transition is: - * - Check State -> Soft Fail - * - Non-Secure State -> Soft Fail - * - Trusted State -> Soft Fail - * - Secure State -> Soft Fail - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_SetSoftwareFatalSecurityViolation(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_SW_FSV_MASK; -} - -/*! - * @brief Trigger Software Security Violation - * - * The result SSM state transition is: - * - Check -> Non-Secure - * - Trusted -> Soft Fail - * - Secure -> Soft Fail - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_SetSoftwareSecurityViolation(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_SW_SV_MASK; -} - -/*! - * @brief Get current SSM State - * - * @param base SNVS peripheral base address - * @return Current SSM state - */ -static inline snvs_hp_ssm_state_t SNVS_HP_GetSSMState(SNVS_Type *base) -{ - return (snvs_hp_ssm_state_t)((uint32_t)((base->HPSR & SNVS_HPSR_SSM_STATE_MASK) >> SNVS_HPSR_SSM_STATE_SHIFT)); -} - -/*! - * @brief Reset the SNVS LP section. - * - * Reset the LP section except SRTC and Time alarm. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_ResetLP(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_LP_SWR_MASK; -} - -/*! - * @name High Assurance Counter (HAC) - * @{ - */ - -/*! - * @brief Enable or disable the High Assurance Counter (HAC) - * - * @param base SNVS peripheral base address - * @param enable Pass true to enable, false to disable. - */ -static inline void SNVS_HP_EnableHighAssuranceCounter(SNVS_Type *base, bool enable) -{ - if (enable) - { - base->HPCOMR |= SNVS_HPCOMR_HAC_EN_MASK; - } - else - { - base->HPCOMR &= (~SNVS_HPCOMR_HAC_EN_MASK); - } -} - -/*! - * @brief Start or stop the High Assurance Counter (HAC) - * - * @param base SNVS peripheral base address - * @param start Pass true to start, false to stop. - */ -static inline void SNVS_HP_StartHighAssuranceCounter(SNVS_Type *base, bool start) -{ - if (start) - { - base->HPCOMR &= (~SNVS_HPCOMR_HAC_STOP_MASK); - } - else - { - base->HPCOMR |= SNVS_HPCOMR_HAC_STOP_MASK; - } -} - -/*! - * @brief Set the High Assurance Counter (HAC) initialize value. - * - * @param base SNVS peripheral base address - * @param value The initial value to set. - */ -static inline void SNVS_HP_SetHighAssuranceCounterInitialValue(SNVS_Type *base, uint32_t value) -{ - base->HPHACIVR = value; -} - -/*! - * @brief Load the High Assurance Counter (HAC) - * - * This function loads the HAC initialize value to counter register. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_LoadHighAssuranceCounter(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_HAC_LOAD_MASK; -} - -/*! - * @brief Get the current High Assurance Counter (HAC) value - * - * @param base SNVS peripheral base address - * @return HAC currnet value. - */ -static inline uint32_t SNVS_HP_GetHighAssuranceCounter(SNVS_Type *base) -{ - return base->HPHACR; -} - -/*! - * @brief Clear the High Assurance Counter (HAC) - * - * This function can be called in a functional or soft fail state. When the HAC - * is enabled: - * - If the HAC is cleared in the soft fail state, the SSM transitions to the - * hard fail state immediately; - * - If the HAC is cleared in functional state, the SSM will transition to - * hard fail immediately after transitioning to soft fail. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_ClearHighAssuranceCounter(SNVS_Type *base) -{ - base->HPCOMR |= SNVS_HPCOMR_HAC_CLEAR_MASK; -} - -/*! - * @brief Lock the High Assurance Counter (HAC) - * - * Once locked, the HAC initialize value could not be changed, the HAC enable - * status could not be changed. This could only be unlocked by system reset. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_HP_LockHighAssuranceCounter(SNVS_Type *base) -{ - base->HPLR |= SNVS_HPLR_HAC_L_MASK; -} - -/*! @}*/ - -/*! - * @brief Get the SNVS HP status flags. - * - * The flags are returned as the OR'ed value f the - * enumeration :: _snvs_hp_status_flags_t. - * - * @param base SNVS peripheral base address - * @return The OR'ed value of status flags. - */ -static inline uint32_t SNVS_HP_GetStatusFlags(SNVS_Type *base) -{ - return base->HPSR; -} - -/*! - * @brief Clear the SNVS HP status flags. - * - * The flags to clear are passed in as the OR'ed value of the - * enumeration :: _snvs_hp_status_flags_t. - * Only these flags could be cleared using this API. - * - @ref kSNVS_RTC_PeriodicInterruptFlag - * - @ref kSNVS_RTC_AlarmInterruptFlag - * - * @param base SNVS peripheral base address - * @param mask OR'ed value of the flags to clear. - */ -static inline void SNVS_HP_ClearStatusFlags(SNVS_Type *base, uint32_t mask) -{ - base->HPSR = mask; -} - -/*! - * @brief Get the SNVS HP security violation status flags. - * - * The flags are returned as the OR'ed value of the - * enumeration :: _snvs_hp_sv_status_flags_t. - * - * @param base SNVS peripheral base address - * @return The OR'ed value of security violation status flags. - */ -static inline uint32_t SNVS_HP_GetSecurityViolationStatusFlags(SNVS_Type *base) -{ - return base->HPSVSR; -} - -/*! - * @brief Clear the SNVS HP security violation status flags. - * - * The flags to clear are passed in as the OR'ed value of the - * enumeration :: _snvs_hp_sv_status_flags_t. - * Only these flags could be cleared using this API. - * - * - @ref kSNVS_ZMK_EccFailFlag - * - @ref kSNVS_Violation0Flag - * - @ref kSNVS_Violation1Flag - * - @ref kSNVS_Violation2Flag - * - kSNVS_Violation3Flag - * - @ref kSNVS_Violation4Flag - * - @ref kSNVS_Violation5Flag - * - * @param base SNVS peripheral base address - * @param mask OR'ed value of the flags to clear. - */ -static inline void SNVS_HP_ClearSecurityViolationStatusFlags(SNVS_Type *base, uint32_t mask) -{ - base->HPSVSR = mask; -} - -#if defined(FSL_FEATURE_SNVS_HAS_SET_LOCK) && (FSL_FEATURE_SNVS_HAS_SET_LOCK > 0) -/*! - * brief Set SNVS HP Set locks. - * - * param base SNVS peripheral base address - * - */ -void SNVS_HP_SetLocks(SNVS_Type *base); -#endif /* FSL_FEATURE_SNVS_HAS_SET_LOCK */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_SNVS_HP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_snvs_lp.c b/devices/MIMXRT1052/drivers/fsl_snvs_lp.c deleted file mode 100644 index 4cd5df1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_snvs_lp.c +++ /dev/null @@ -1,1359 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2021, NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_snvs_lp.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.snvs_lp" -#endif - -#define SECONDS_IN_A_DAY (86400U) -#define SECONDS_IN_A_HOUR (3600U) -#define SECONDS_IN_A_MINUTE (60U) -#define DAYS_IN_A_YEAR (365U) -#define YEAR_RANGE_START (1970U) -#define YEAR_RANGE_END (2099U) - -#define SNVS_DEFAULT_PGD_VALUE (0x41736166U) - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Checks whether the date and time passed in is valid - * - * @param datetime Pointer to structure where the date and time details are stored - * - * @return Returns false if the date & time details are out of range; true if in range - */ -static bool SNVS_LP_CheckDatetimeFormat(const snvs_lp_srtc_datetime_t *datetime); - -/*! - * @brief Converts time data from datetime to seconds - * - * @param datetime Pointer to datetime structure where the date and time details are stored - * - * @return The result of the conversion in seconds - */ -static uint32_t SNVS_LP_ConvertDatetimeToSeconds(const snvs_lp_srtc_datetime_t *datetime); - -/*! - * @brief Converts time data from seconds to a datetime structure - * - * @param seconds Seconds value that needs to be converted to datetime format - * @param datetime Pointer to the datetime structure where the result of the conversion is stored - */ -static void SNVS_LP_ConvertSecondsToDatetime(uint32_t seconds, snvs_lp_srtc_datetime_t *datetime); - -/*! - * @brief Returns SRTC time in seconds. - * - * This function is used internally to get actual SRTC time in seconds. - * - * @param base SNVS peripheral base address - * - * @return SRTC time in seconds - */ -static uint32_t SNVS_LP_SRTC_GetSeconds(SNVS_Type *base); - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) -/*! - * @brief Get the SNVS instance from peripheral base address. - * - * @param base SNVS peripheral base address. - * - * @return SNVS instance. - */ -static uint32_t SNVS_LP_GetInstance(SNVS_Type *base); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Variables - ******************************************************************************/ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) -/*! @brief Pointer to snvs_lp clock. */ -const clock_ip_name_t s_snvsLpClock[] = SNVS_LP_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ -static bool SNVS_LP_CheckDatetimeFormat(const snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - /* Table of days in a month for a non leap year. First entry in the table is not used, - * valid months start from 1 - */ - uint8_t daysPerMonth[] = {0U, 31U, 28U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U}; - - /* Check year, month, hour, minute, seconds */ - if ((datetime->year < YEAR_RANGE_START) || (datetime->year > YEAR_RANGE_END) || (datetime->month > 12U) || - (datetime->month < 1U) || (datetime->hour >= 24U) || (datetime->minute >= 60U) || (datetime->second >= 60U)) - { - /* If not correct then error*/ - return false; - } - - /* Adjust the days in February for a leap year */ - if ((((datetime->year & 3U) == 0U) && (datetime->year % 100U != 0U)) || (datetime->year % 400U == 0U)) - { - daysPerMonth[2] = 29U; - } - - /* Check the validity of the day */ - if ((datetime->day > daysPerMonth[datetime->month]) || (datetime->day < 1U)) - { - return false; - } - - return true; -} - -static uint32_t SNVS_LP_ConvertDatetimeToSeconds(const snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - /* Number of days from begin of the non Leap-year*/ - /* Number of days from begin of the non Leap-year*/ - uint16_t monthDays[] = {0U, 0U, 31U, 59U, 90U, 120U, 151U, 181U, 212U, 243U, 273U, 304U, 334U}; - uint32_t seconds; - - /* Compute number of days from 1970 till given year*/ - seconds = ((uint32_t)datetime->year - 1970U) * DAYS_IN_A_YEAR; - /* Add leap year days */ - seconds += (((uint32_t)datetime->year / 4U) - (1970U / 4U)); - /* Add number of days till given month*/ - seconds += monthDays[datetime->month]; - /* Add days in given month. We subtract the current day as it is - * represented in the hours, minutes and seconds field*/ - seconds += ((uint32_t)datetime->day - 1U); - /* For leap year if month less than or equal to Febraury, decrement day counter*/ - if ((0U == (datetime->year & 3U)) && (datetime->month <= 2U)) - { - seconds--; - } - - seconds = (seconds * SECONDS_IN_A_DAY) + (datetime->hour * SECONDS_IN_A_HOUR) + - (datetime->minute * SECONDS_IN_A_MINUTE) + datetime->second; - - return seconds; -} - -static void SNVS_LP_ConvertSecondsToDatetime(uint32_t seconds, snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t x; - uint32_t secondsRemaining, days; - uint16_t daysInYear; - /* Table of days in a month for a non leap year. First entry in the table is not used, - * valid months start from 1 - */ - uint8_t daysPerMonth[] = {0U, 31U, 28U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U}; - - /* Start with the seconds value that is passed in to be converted to date time format */ - secondsRemaining = seconds; - - /* Calcuate the number of days, we add 1 for the current day which is represented in the - * hours and seconds field - */ - days = secondsRemaining / SECONDS_IN_A_DAY + 1U; - - /* Update seconds left*/ - secondsRemaining = secondsRemaining % SECONDS_IN_A_DAY; - - /* Calculate the datetime hour, minute and second fields */ - datetime->hour = (uint8_t)(secondsRemaining / SECONDS_IN_A_HOUR); - secondsRemaining = secondsRemaining % SECONDS_IN_A_HOUR; - datetime->minute = (uint8_t)(secondsRemaining / 60U); - datetime->second = (uint8_t)(secondsRemaining % SECONDS_IN_A_MINUTE); - - /* Calculate year */ - daysInYear = DAYS_IN_A_YEAR; - datetime->year = YEAR_RANGE_START; - while (days > daysInYear) - { - /* Decrease day count by a year and increment year by 1 */ - days -= daysInYear; - datetime->year++; - - /* Adjust the number of days for a leap year */ - if ((datetime->year & 3U) != 0U) - { - daysInYear = DAYS_IN_A_YEAR; - } - else - { - daysInYear = DAYS_IN_A_YEAR + 1U; - } - } - - /* Adjust the days in February for a leap year */ - if (0U == (datetime->year & 3U)) - { - daysPerMonth[2] = 29U; - } - - for (x = 1U; x <= 12U; x++) - { - if (days <= daysPerMonth[x]) - { - datetime->month = (uint8_t)x; - break; - } - else - { - days -= daysPerMonth[x]; - } - } - - datetime->day = (uint8_t)days; -} - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) -static uint32_t SNVS_LP_GetInstance(SNVS_Type *base) -{ - return 0U; -} -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/*! - * brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * note This API should be called at the beginning of the application using the SNVS driver. - * - * param base SNVS peripheral base address - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_Init(SNVS_Type *base) -{ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) - uint32_t instance = SNVS_LP_GetInstance(base); - CLOCK_EnableClock(s_snvsLpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Power glitch detector: set the PGD/LVD value and clear the previous status. */ -#if defined(SNVS_LPPGDR_PGD) - base->LPPGDR = SNVS_DEFAULT_PGD_VALUE; - base->LPSR = SNVS_LPSR_PGD_MASK; -#elif defined(SNVS_LPLVDR_LVD) - base->LPLVDR = SNVS_DEFAULT_PGD_VALUE; - base->LPSR = SNVS_LPSR_LVD_MASK; -#else -#error "No power/voltage detector register defined" -#endif -} - -/*! - * brief Deinit the SNVS LP section. - * - * param base SNVS peripheral base address - */ -void SNVS_LP_Deinit(SNVS_Type *base) -{ -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) - uint32_t instance = SNVS_LP_GetInstance(base); - CLOCK_DisableClock(s_snvsLpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * note This API should be called at the beginning of the application using the SNVS driver. - * - * param base SNVS peripheral base address - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_SRTC_Init(SNVS_Type *base, const snvs_lp_srtc_config_t *config) -{ - assert(config != NULL); - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) - uint32_t instance = SNVS_LP_GetInstance(base); - CLOCK_EnableClock(s_snvsLpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - int pin; - - if (config->srtcCalEnable) - { - base->LPCR = SNVS_LPCR_LPCALB_VAL_MASK & (config->srtcCalValue << SNVS_LPCR_LPCALB_VAL_SHIFT); - base->LPCR |= SNVS_LPCR_LPCALB_EN_MASK; - } - - for (pin = (int32_t)kSNVS_ExternalTamper1; pin <= (int32_t)SNVS_LP_MAX_TAMPER; pin++) - { - SNVS_LP_DisableExternalTamper(SNVS, (snvs_lp_external_tamper_t)pin); - SNVS_LP_ClearExternalTamperStatus(SNVS, (snvs_lp_external_tamper_t)pin); - } -} - -/*! - * brief Stops the SRTC timer. - * - * param base SNVS peripheral base address - */ -void SNVS_LP_SRTC_Deinit(SNVS_Type *base) -{ - base->LPCR &= ~SNVS_LPCR_SRTC_ENV_MASK; - -#if (!(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && \ - defined(SNVS_LP_CLOCKS)) - uint32_t instance = SNVS_LP_GetInstance(base); - CLOCK_DisableClock(s_snvsLpClock[instance]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Fills in the SNVS_LP config struct with the default settings. - * - * The default values are as follows. - * code - * config->srtccalenable = false; - * config->srtccalvalue = 0U; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_SRTC_GetDefaultConfig(snvs_lp_srtc_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->srtcCalEnable = false; - config->srtcCalValue = 0U; -} - -static uint32_t SNVS_LP_SRTC_GetSeconds(SNVS_Type *base) -{ - uint32_t seconds = 0; - uint32_t tmp = 0; - - /* Do consecutive reads until value is correct */ - do - { - seconds = tmp; - tmp = (base->LPSRTCMR << 17U); - tmp |= (base->LPSRTCLR >> 15U); - } while (tmp != seconds); - - return seconds; -} - -/*! - * brief Sets the SNVS SRTC date and time according to the given time structure. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the date and time details are stored. - * - * return kStatus_Success: Success in setting the time and starting the SNVS SRTC - * kStatus_InvalidArgument: Error because the datetime format is incorrect - */ -status_t SNVS_LP_SRTC_SetDatetime(SNVS_Type *base, const snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t seconds = 0U; - uint32_t tmp = base->LPCR; - - /* disable RTC */ - SNVS_LP_SRTC_StopTimer(base); - - /* Return error if the time provided is not valid */ - if (!(SNVS_LP_CheckDatetimeFormat(datetime))) - { - return kStatus_InvalidArgument; - } - - /* Set time in seconds */ - seconds = SNVS_LP_ConvertDatetimeToSeconds(datetime); - - base->LPSRTCMR = (uint32_t)(seconds >> 17U); - base->LPSRTCLR = (uint32_t)(seconds << 15U); - - /* reenable SRTC in case that it was enabled before */ - if ((tmp & SNVS_LPCR_SRTC_ENV_MASK) != 0U) - { - SNVS_LP_SRTC_StartTimer(base); - } - - return kStatus_Success; -} - -/*! - * brief Gets the SNVS SRTC time and stores it in the given time structure. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the date and time details are stored. - */ -void SNVS_LP_SRTC_GetDatetime(SNVS_Type *base, snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - SNVS_LP_ConvertSecondsToDatetime(SNVS_LP_SRTC_GetSeconds(base), datetime); -} - -/*! - * brief Sets the SNVS SRTC alarm time. - * - * The function sets the SRTC alarm. It also checks whether the specified alarm - * time is greater than the present time. If not, the function does not set the alarm - * and returns an error. - * Please note, that SRTC alarm has limited resolution because only 32 most - * significant bits of SRTC counter are compared to SRTC Alarm register. - * If the alarm time is beyond SRTC resolution, the function does not set the alarm - * and returns an error. - * - * param base SNVS peripheral base address - * param alarmTime Pointer to the structure where the alarm time is stored. - * - * return kStatus_Success: success in setting the SNVS SRTC alarm - * kStatus_InvalidArgument: Error because the alarm datetime format is incorrect - * kStatus_Fail: Error because the alarm time has already passed or is beyond resolution - */ -status_t SNVS_LP_SRTC_SetAlarm(SNVS_Type *base, const snvs_lp_srtc_datetime_t *alarmTime) -{ - assert(alarmTime != NULL); - - uint32_t alarmSeconds = 0U; - uint32_t currSeconds = 0U; - uint32_t tmp = base->LPCR; - - /* Return error if the alarm time provided is not valid */ - if (!(SNVS_LP_CheckDatetimeFormat(alarmTime))) - { - return kStatus_InvalidArgument; - } - - alarmSeconds = SNVS_LP_ConvertDatetimeToSeconds(alarmTime); - currSeconds = SNVS_LP_SRTC_GetSeconds(base); - - /* Return error if the alarm time has passed */ - if (alarmSeconds <= currSeconds) - { - return kStatus_Fail; - } - - /* disable SRTC alarm interrupt */ - base->LPCR &= ~SNVS_LPCR_LPTA_EN_MASK; - while ((base->LPCR & SNVS_LPCR_LPTA_EN_MASK) != 0U) - { - } - - /* Set alarm in seconds*/ - base->LPTAR = alarmSeconds; - - /* reenable SRTC alarm interrupt in case that it was enabled before */ - base->LPCR = tmp; - - return kStatus_Success; -} - -/*! - * brief Returns the SNVS SRTC alarm time. - * - * param base SNVS peripheral base address - * param datetime Pointer to the structure where the alarm date and time details are stored. - */ -void SNVS_LP_SRTC_GetAlarm(SNVS_Type *base, snvs_lp_srtc_datetime_t *datetime) -{ - assert(datetime != NULL); - - uint32_t alarmSeconds = 0U; - - /* Get alarm in seconds */ - alarmSeconds = base->LPTAR; - - SNVS_LP_ConvertSecondsToDatetime(alarmSeconds, datetime); -} - -/*! - * brief Gets the SNVS status flags. - * - * param base SNVS peripheral base address - * - * return The status flags. This is the logical OR of members of the - * enumeration ::snvs_status_flags_t - */ -uint32_t SNVS_LP_SRTC_GetStatusFlags(SNVS_Type *base) -{ - uint32_t flags = 0U; - - if ((base->LPSR & SNVS_LPSR_LPTA_MASK) != 0U) - { - flags |= (uint32_t)kSNVS_SRTC_AlarmInterruptFlag; - } - - return flags; -} - -/*! - * brief Gets the enabled SNVS interrupts. - * - * param base SNVS peripheral base address - * - * return The enabled interrupts. This is the logical OR of members of the - * enumeration ::snvs_interrupt_enable_t - */ -uint32_t SNVS_LP_SRTC_GetEnabledInterrupts(SNVS_Type *base) -{ - uint32_t val = 0U; - - if ((base->LPCR & SNVS_LPCR_LPTA_EN_MASK) != 0U) - { - val |= (uint32_t)kSNVS_SRTC_AlarmInterrupt; - } - - return val; -} - -/*! - * brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->polarity = 0U; - * config->filterenable = 0U; - * config->filter = 0U; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_PassiveTamperPin_GetDefaultConfig(snvs_lp_passive_tamper_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->polarity = 0U; -#if defined(FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER) && (FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER > 0) - config->filterenable = 0U; - config->filter = 0U; -#endif /* FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER */ -} - -#if defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) -/*! - * brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->clock = kSNVS_ActiveTamper16HZ; - * config->seed = 0U; - * config->polynomial = 0U; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_TamperPinTx_GetDefaultConfig(tamper_active_tx_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->clock = kSNVS_ActiveTamper16HZ; - config->seed = 0U; - config->polynomial = 0U; -} - -/*! - * brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->filterenable = 0U; - * config->filter = 0U; - * config->tx = kSNVS_ActiveTamper1; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_TamperPinRx_GetDefaultConfig(tamper_active_rx_config_t *config) -{ - assert(config != NULL); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->filterenable = 0U; - config->filter = 0U; - config->activeTamper = kSNVS_ActiveTamper1; -} -#endif /* FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS */ - -/*! - * brief Enables the specified SNVS external tamper. - * - * param base SNVS peripheral base address - * param pin SNVS external tamper pin - * param config Configuration structure of external passive tamper - */ -void SNVS_LP_EnablePassiveTamper(SNVS_Type *base, snvs_lp_external_tamper_t pin, snvs_lp_passive_tamper_t config) -{ - switch (pin) - { - case (kSNVS_ExternalTamper1): - /* Set polarity */ - if (config.polarity != 0U) - { - SNVS->LPTDCR |= SNVS_LPTDCR_ET1P_MASK; - } - else - { - SNVS->LPTDCR &= ~SNVS_LPTDCR_ET1P_MASK; - } -#if defined(FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER) && (FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER > 0) - /* Enable filter and set it's value, dissable otherwise */ - if (config.filterenable != 0U) - { - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF1_EN_MASK; - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF1(config.filter); - } - else - { - SNVS->LPTGFCR &= ~SNVS_LPTGFCR_ETGF1_EN_MASK; - } -#endif /* FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER */ - /* enable tamper pin */ - base->LPTDCR |= SNVS_LPTDCR_ET1_EN_MASK; - break; -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - case (kSNVS_ExternalTamper2): - /* Set polarity */ - base->LPTDCR = - (base->LPTDCR & ~(SNVS_LPTDCR_ET2P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDCR_ET2P_SHIFT); - /* Enable filter and set it's value, dissable otherwise */ - if (config.filterenable != 0U) - { - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF2_EN_MASK; - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF2(config.filter); - } - else - { - SNVS->LPTGFCR &= ~SNVS_LPTGFCR_ETGF2_EN_MASK; - } - - /* enable tamper pin */ - SNVS->LPTDCR |= SNVS_LPTDCR_ET2_EN_MASK; - - break; - case (kSNVS_ExternalTamper3): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET3P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET3P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF3(config.filter); - /* Enable tamper 3 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF3_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET3_EN_MASK; - break; - case (kSNVS_ExternalTamper4): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET4P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET4P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF4(config.filter); - /* Enable tamper 4 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF4_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET4_EN_MASK; - break; - case (kSNVS_ExternalTamper5): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET5P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET5P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF5(config.filter); - /* Enable tamper 5 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF5_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET5_EN_MASK; - break; - case (kSNVS_ExternalTamper6): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET6P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET6P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF6(config.filter); - /* Enable tamper 6 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF6_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET6_EN_MASK; - break; - case (kSNVS_ExternalTamper7): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET7P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET7P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF7(config.filter); - /* Enable tamper 6 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF7_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET7_EN_MASK; - break; - case (kSNVS_ExternalTamper8): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET8P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET8P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF8(config.filter); - /* Enable tamper 8 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF8_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET8_EN_MASK; - break; - case (kSNVS_ExternalTamper9): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET9P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET9P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF9(config.filter); - /* Enable tamper 9 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF9_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET9_EN_MASK; - break; - case (kSNVS_ExternalTamper10): - /* Set polarity */ - base->LPTDC2R = - (base->LPTDC2R & ~(SNVS_LPTDC2R_ET10P_MASK)) | ((uint32_t)config.polarity << SNVS_LPTDC2R_ET10P_SHIFT); - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF10(config.filter); - /* Enable tamper 10 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF10_EN(1U); - } - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET10_EN_MASK; - break; -#endif - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } -} - -/*! - * brief Disables the specified SNVS external tamper. - * - * param base SNVS peripheral base address - * param pin SNVS external tamper pin - */ -void SNVS_LP_DisableExternalTamper(SNVS_Type *base, snvs_lp_external_tamper_t pin) -{ - switch (pin) - { - case (kSNVS_ExternalTamper1): - base->LPTDCR &= ~SNVS_LPTDCR_ET1_EN_MASK; - break; -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - case (kSNVS_ExternalTamper2): - base->LPTDCR &= ~SNVS_LPTDCR_ET2_EN_MASK; - break; - case (kSNVS_ExternalTamper3): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET3_EN_MASK; - break; - case (kSNVS_ExternalTamper4): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET4_EN_MASK; - break; - case (kSNVS_ExternalTamper5): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET5_EN_MASK; - break; - case (kSNVS_ExternalTamper6): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET6_EN_MASK; - break; - case (kSNVS_ExternalTamper7): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET7_EN_MASK; - break; - case (kSNVS_ExternalTamper8): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET8_EN_MASK; - break; - case (kSNVS_ExternalTamper9): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET9_EN_MASK; - break; - case (kSNVS_ExternalTamper10): - base->LPTDC2R &= ~SNVS_LPTDC2R_ET10_EN_MASK; - break; -#endif - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } -} - -/*! - * brief Disable all external tamper. - * - * param base SNVS peripheral base address - */ -void SNVS_LP_DisableAllExternalTamper(SNVS_Type *base) -{ - for (int pin = (int8_t)kSNVS_ExternalTamper1; pin <= (int8_t)SNVS_LP_MAX_TAMPER; pin++) - { - SNVS_LP_DisableExternalTamper(SNVS, (snvs_lp_external_tamper_t)pin); - } -} - -/*! - * brief Returns status of the specified external tamper. - * - * param base SNVS peripheral base address - * param pin SNVS external tamper pin - * - * return The status flag. This is the enumeration ::snvs_external_tamper_status_t - */ -snvs_lp_external_tamper_status_t SNVS_LP_GetExternalTamperStatus(SNVS_Type *base, snvs_lp_external_tamper_t pin) -{ - snvs_lp_external_tamper_status_t status = kSNVS_TamperNotDetected; - - switch (pin) - { - case (kSNVS_ExternalTamper1): - status = (bool)(base->LPSR & SNVS_LPSR_ET1D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - case (kSNVS_ExternalTamper2): - status = (bool)(base->LPSR & SNVS_LPSR_ET2D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper3): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET3D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper4): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET4D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper5): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET5D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper6): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET6D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper7): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET7D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper8): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET8D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper9): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET9D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; - case (kSNVS_ExternalTamper10): - status = (bool)(base->LPTDSR & SNVS_LPTDSR_ET10D_MASK) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; - break; -#endif - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - return status; -} - -/*! - * brief Clears status of the specified external tamper. - * - * param base SNVS peripheral base address - * param pin SNVS external tamper pin - */ -void SNVS_LP_ClearExternalTamperStatus(SNVS_Type *base, snvs_lp_external_tamper_t pin) -{ - base->LPSR |= SNVS_LPSR_ET1D_MASK; - - switch (pin) - { - case (kSNVS_ExternalTamper1): - base->LPSR |= SNVS_LPSR_ET1D_MASK; - break; -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - case (kSNVS_ExternalTamper2): - base->LPSR |= SNVS_LPSR_ET2D_MASK; - break; - case (kSNVS_ExternalTamper3): - base->LPTDSR |= SNVS_LPTDSR_ET3D_MASK; - break; - case (kSNVS_ExternalTamper4): - base->LPTDSR |= SNVS_LPTDSR_ET4D_MASK; - break; - case (kSNVS_ExternalTamper5): - base->LPTDSR |= SNVS_LPTDSR_ET5D_MASK; - break; - case (kSNVS_ExternalTamper6): - base->LPTDSR |= SNVS_LPTDSR_ET6D_MASK; - break; - case (kSNVS_ExternalTamper7): - base->LPTDSR |= SNVS_LPTDSR_ET7D_MASK; - break; - case (kSNVS_ExternalTamper8): - base->LPTDSR |= SNVS_LPTDSR_ET8D_MASK; - break; - case (kSNVS_ExternalTamper9): - base->LPTDSR |= SNVS_LPTDSR_ET9D_MASK; - break; - case (kSNVS_ExternalTamper10): - base->LPTDSR |= SNVS_LPTDSR_ET10D_MASK; - break; -#endif - default: - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } -} - -/*! - * brief Clears status of the all external tamper. - * - * param base SNVS peripheral base address - */ -void SNVS_LP_ClearAllExternalTamperStatus(SNVS_Type *base) -{ - for (int pin = (int8_t)kSNVS_ExternalTamper1; pin <= (int8_t)SNVS_LP_MAX_TAMPER; pin++) - { - SNVS_LP_ClearExternalTamperStatus(SNVS, (snvs_lp_external_tamper_t)pin); - } -} - -#if defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) -/*! - * brief Enable active tamper tx external pad - * - * param base SNVS peripheral base address - * param pin SNVS external tamper pin - */ -status_t SNVS_LP_EnableTxActiveTamper(SNVS_Type *base, snvs_lp_active_tx_tamper_t pin, tamper_active_tx_config_t config) -{ - status_t status = kStatus_Success; - - switch (pin) - { - case (kSNVS_ActiveTamper1): - { - /* Enable active tamper tx external pad */ - base->LPATCTLR |= SNVS_LPATCTLR_AT1_PAD_EN_MASK; - /* Set seed and polynomial */ - base->LPATCR[0] |= SNVS_LPATCR_Seed(config.seed) | SNVS_LPATCR_Polynomial(config.polynomial); - /* Set clock */ - base->LPATCLKR |= SNVS_LPATCLKR_AT1_CLK_CTL(config.clock); - /* Enable active tamper pin */ - base->LPATCTLR |= SNVS_LPATCTLR_AT1_EN_MASK; - break; - } - case (kSNVS_ActiveTamper2): - { - base->LPATCTLR |= SNVS_LPATCTLR_AT2_PAD_EN_MASK; - base->LPATCR[1] |= SNVS_LPATCR_Seed(config.seed) | SNVS_LPATCR_Polynomial(config.polynomial); - base->LPATCLKR |= SNVS_LPATCLKR_AT2_CLK_CTL(config.clock); - base->LPATCTLR |= SNVS_LPATCTLR_AT2_EN_MASK; - break; - } - case (kSNVS_ActiveTamper3): - { - base->LPATCTLR |= SNVS_LPATCTLR_AT3_PAD_EN_MASK; - base->LPATCR[2] |= SNVS_LPATCR_Seed(config.seed) | SNVS_LPATCR_Polynomial(config.polynomial); - base->LPATCLKR |= SNVS_LPATCLKR_AT3_CLK_CTL(config.clock); - base->LPATCTLR |= SNVS_LPATCTLR_AT3_EN_MASK; - break; - } - case (kSNVS_ActiveTamper4): - { - base->LPATCTLR |= SNVS_LPATCTLR_AT4_PAD_EN_MASK; - base->LPATCR[3] |= SNVS_LPATCR_Seed(config.seed) | SNVS_LPATCR_Polynomial(config.polynomial); - base->LPATCLKR |= SNVS_LPATCLKR_AT4_CLK_CTL(config.clock); - base->LPATCTLR |= SNVS_LPATCTLR_AT4_EN_MASK; - break; - } - case (kSNVS_ActiveTamper5): - { - base->LPATCTLR |= SNVS_LPATCTLR_AT5_PAD_EN_MASK; - base->LPATCR[4] |= SNVS_LPATCR_Seed(config.seed) | SNVS_LPATCR_Polynomial(config.polynomial); - base->LPATCLKR |= SNVS_LPATCLKR_AT5_CLK_CTL(config.clock); - base->LPATCTLR |= SNVS_LPATCTLR_AT5_EN_MASK; - break; - } - default: - status = kStatus_InvalidArgument; - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - return status; -} - -/*! - * brief Enable active tamper rx external pad - * - * param base SNVS peripheral base address - * param rx SNVS external RX tamper pin - * param config SNVS RX tamper config structure - */ -status_t SNVS_LP_EnableRxActiveTamper(SNVS_Type *base, snvs_lp_external_tamper_t rx, tamper_active_rx_config_t config) -{ - status_t status = kStatus_Success; - - switch (rx) - { - case (kSNVS_ExternalTamper1): - /* Enable filter and set it's value, dissable otherwise */ - if (config.filterenable != 0U) - { - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF1_EN_MASK; - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF1(config.filter); - } - else - { - SNVS->LPTGFCR &= ~SNVS_LPTGFCR_ETGF1_EN_MASK; - } - - /* Route TX to external tamper 1 */ - base->LPATRC1R = SNVS_LPATRC1R_ET1RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDCR |= SNVS_LPTDCR_ET1_EN_MASK; - break; -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - case (kSNVS_ExternalTamper2): - /* Enable filter and set it's value, dissable otherwise */ - if (config.filterenable != 0U) - { - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF2_EN_MASK; - SNVS->LPTGFCR |= SNVS_LPTGFCR_ETGF2(config.filter); - } - else - { - SNVS->LPTGFCR &= ~SNVS_LPTGFCR_ETGF2_EN_MASK; - } - - /* Route TX to external tamper 2 */ - base->LPATRC1R = SNVS_LPATRC1R_ET2RCTL(config.activeTamper); - - /* enable tamper pin */ - SNVS->LPTDCR |= SNVS_LPTDCR_ET2_EN_MASK; - - break; - case (kSNVS_ExternalTamper3): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF3(config.filter); - /* Enable tamper 3 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF3_EN(1U); - } - - /* Route TX to external tamper 3 */ - base->LPATRC1R = SNVS_LPATRC1R_ET3RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET3_EN_MASK; - break; - case (kSNVS_ExternalTamper4): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF4(config.filter); - /* Enable tamper 4 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF4_EN(1U); - } - - /* Route TX to external tamper 4 */ - base->LPATRC1R = SNVS_LPATRC1R_ET4RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET4_EN_MASK; - break; - case (kSNVS_ExternalTamper5): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF5(config.filter); - /* Enable tamper 5 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF5_EN(1U); - } - - /* Route TX to external tamper 5 */ - base->LPATRC1R = SNVS_LPATRC1R_ET5RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET5_EN_MASK; - break; - case (kSNVS_ExternalTamper6): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF6(config.filter); - /* Enable tamper 6 glitch filter */ - SNVS->LPTGF1CR |= SNVS_LPTGF1CR_ETGF6_EN(1U); - } - - /* Route TX to external tamper 6 */ - base->LPATRC1R = SNVS_LPATRC1R_ET6RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET6_EN_MASK; - break; - case (kSNVS_ExternalTamper7): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF7(config.filter); - /* Enable tamper 6 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF7_EN(1U); - } - - /* Route TX to external tamper 7 */ - base->LPATRC1R = SNVS_LPATRC1R_ET7RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET7_EN_MASK; - break; - case (kSNVS_ExternalTamper8): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF8(config.filter); - /* Enable tamper 8 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF8_EN(1U); - } - - /* Route TX to external tamper 8 */ - base->LPATRC1R = SNVS_LPATRC1R_ET8RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET8_EN_MASK; - break; - case (kSNVS_ExternalTamper9): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF9(config.filter); - /* Enable tamper 9 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF9_EN(1U); - } - - /* Route TX to external tamper 9 */ - base->LPATRC1R = SNVS_LPATRC2R_ET9RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET9_EN_MASK; - break; - case (kSNVS_ExternalTamper10): - /* Enable filter and set it's value if set */ - if (config.filterenable != 0U) - { - /* Set filter value */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF10(config.filter); - /* Enable tamper 10 glitch filter */ - SNVS->LPTGF2CR |= SNVS_LPTGF2CR_ETGF10_EN(1U); - } - - /* Route TX to external tamper 10 */ - base->LPATRC1R = SNVS_LPATRC2R_ET10RCTL(config.activeTamper); - - /* enable tamper pin */ - base->LPTDC2R |= SNVS_LPTDC2R_ET10_EN_MASK; - break; -#endif - default: - status = kStatus_InvalidArgument; - /* All the cases have been listed above, the default clause should not be reached. */ - break; - } - - return status; -} - -/*! - * brief Sets voltage tamper detect - * - * param base SNVS peripheral base address - * param enable True if enable false if disable - */ -status_t SNVS_LP_SetVoltageTamper(SNVS_Type *base, bool enable) -{ - base->LPTDCR |= SNVS_LPTDCR_VT_EN(enable); - - return kStatus_Success; -} - -/*! - * brief Sets temperature tamper detect - * - * param base SNVS peripheral base address - * param enable True if enable false if disable - */ -status_t SNVS_LP_SetTemperatureTamper(SNVS_Type *base, bool enable) -{ - SNVS->LPTDCR |= SNVS_LPTDCR_TT_EN(enable); - - return kStatus_Success; -} - -/*! - * brief Sets clock tamper detect - * - * param base SNVS peripheral base address - * param enable True if enable false if disable - */ -status_t SNVS_LP_SetClockTamper(SNVS_Type *base, bool enable) -{ - SNVS->LPTDCR |= SNVS_LPTDCR_CT_EN(enable); - - return kStatus_Success; -} - -/*! - * brief Check voltage tamper - * - * param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckVoltageTamper(SNVS_Type *base) -{ - return ((SNVS->LPSR & SNVS_LPSR_VTD_MASK) != 0U) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; -} - -/*! - * brief Check temperature tamper - * - * param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckTemperatureTamper(SNVS_Type *base) -{ - return ((SNVS->LPSR & SNVS_LPSR_TTD_MASK) != 0U) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; -} - -/*! - * brief Check clock tamper - * - * param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckClockTamper(SNVS_Type *base) -{ - return ((SNVS->LPSR & SNVS_LPSR_CTD_MASK) != 0U) ? kSNVS_TamperDetected : kSNVS_TamperNotDetected; -} -#endif /* defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) */ - -/*! - * brief Get the current Monotonic Counter. - * - * param base SNVS peripheral base address - * return Current Monotonic Counter value. - */ -uint64_t SNVS_LP_GetMonotonicCounter(SNVS_Type *base) -{ - uint32_t mc_lsb, mc_msb; - - mc_msb = base->LPSMCMR; - mc_lsb = base->LPSMCLR; - - return ((uint64_t)mc_msb << 32UL) | (uint64_t)mc_lsb; -} - -/*! - * brief Write Zeroizable Master Key (ZMK) to the SNVS registers. - * - * param base SNVS peripheral base address - * param ZMKey The ZMK write to the SNVS register. - */ -void SNVS_LP_WriteZeroizableMasterKey(SNVS_Type *base, uint32_t ZMKey[SNVS_ZMK_REG_COUNT]) -{ - uint8_t i = 0; - - for (i = 0; i < SNVS_ZMK_REG_COUNT; i++) - { - base->LPZMKR[i] = ZMKey[i]; - } -} - -#if defined(FSL_FEATURE_SNVS_HAS_STATE_TRANSITION) && (FSL_FEATURE_SNVS_HAS_STATE_TRANSITION > 0) -/*! - * brief Transition SNVS SSM state to Trusted/Non-secure from Check state - * - * param base SNVS peripheral base address - * - * return kStatus_Success: Success in transitioning SSM State - * kStatus_Fail: SSM State transition failed - */ -status_t SNVS_LP_SSM_State_Transition(SNVS_Type *base) -{ - uint32_t curr_ssm_state = ((base->HPSR & SNVS_HPSR_SSM_STATE_MASK) >> SNVS_HPSR_SSM_STATE_SHIFT); - uint32_t sec_config = ((OCOTP_CTRL->HW_OCOTP_OTFAD_CFG3 & OCOTP_CTRL_HW_OCOTP_SEC_CONFIG1_MASK) >> - OCOTP_CTRL_HW_OCOTP_SEC_CONFIG1_SHIFT); - - /* Check if SSM State is Check state */ - if (curr_ssm_state == SNVS_SSM_STATE_CHECK) - { - if (sec_config == SEC_CONFIG_OPEN) - { - /* Transition to Non-secure state */ - base->HPCOMR |= SNVS_HPCOMR_SW_SV(1); - } - else - { - /* Transition to Trusted state */ - base->HPCOMR |= SNVS_HPCOMR_SSM_ST(1); - } - } - - uint32_t new_ssm_state = ((base->HPSR & SNVS_HPSR_SSM_STATE_MASK) >> SNVS_HPSR_SSM_STATE_SHIFT); - - if (new_ssm_state != SNVS_SSM_STATE_CHECK) - { - return kStatus_Success; - } - else - { - return kStatus_Fail; - } -} -#endif /* FSL_FEATURE_SNVS_HAS_STATE_TRANSITION */ diff --git a/devices/MIMXRT1052/drivers/fsl_snvs_lp.h b/devices/MIMXRT1052/drivers/fsl_snvs_lp.h deleted file mode 100644 index 7936ff6..0000000 --- a/devices/MIMXRT1052/drivers/fsl_snvs_lp.h +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2021, NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_SNVS_LP_H_ -#define _FSL_SNVS_LP_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup snvs_lp - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SNVS_LP_DRIVER_VERSION (MAKE_VERSION(2, 4, 1)) /*!< Version 2.4.1 */ -/*@}*/ - -/*! @brief Define of SNVS_LP Zeroizable Master Key registers */ -#define SNVS_ZMK_REG_COUNT 8U /* 8 Zeroizable Master Key registers. */ - -/*! @brief List of SNVS_LP interrupts */ -typedef enum _snvs_lp_srtc_interrupts -{ - kSNVS_SRTC_AlarmInterrupt = SNVS_LPCR_LPTA_EN_MASK, /*!< SRTC time alarm.*/ -} snvs_lp_srtc_interrupts_t; - -/*! @brief List of SNVS_LP flags */ -typedef enum _snvs_lp_srtc_status_flags -{ - kSNVS_SRTC_AlarmInterruptFlag = SNVS_LPSR_LPTA_MASK, /*!< SRTC time alarm flag */ -} snvs_lp_srtc_status_flags_t; - -/*! @brief List of SNVS_LP external tampers */ -typedef enum _snvs_lp_external_tamper -{ - kSNVS_ExternalTamper1 = 1U, -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) - kSNVS_ExternalTamper2 = 2U, - kSNVS_ExternalTamper3 = 3U, - kSNVS_ExternalTamper4 = 4U, - kSNVS_ExternalTamper5 = 5U, - kSNVS_ExternalTamper6 = 6U, - kSNVS_ExternalTamper7 = 7U, - kSNVS_ExternalTamper8 = 8U, - kSNVS_ExternalTamper9 = 9U, - kSNVS_ExternalTamper10 = 10U -#endif -} snvs_lp_external_tamper_t; - -#if defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) -/*! @brief List of SNVS_LP active tampers */ -typedef enum _snvs_lp_active_tamper -{ - kSNVS_ActiveTamper1 = 1U, - kSNVS_ActiveTamper2 = 2U, - kSNVS_ActiveTamper3 = 3U, - kSNVS_ActiveTamper4 = 4U, - kSNVS_ActiveTamper5 = 5U, -} snvs_lp_active_tx_tamper_t; - -/*! @brief List of SNVS_LP external tampers */ -typedef enum _snvs_lp_active_clock -{ - kSNVS_ActiveTamper16HZ = 0U, - kSNVS_ActiveTamper8HZ = 1U, - kSNVS_ActiveTamper4HZ = 2U, - kSNVS_ActiveTamper2HZ = 3U -} snvs_lp_active_clock_t; - -/*! @brief Structure is used to configure SNVS LP active TX tamper pins */ -typedef struct -{ - uint16_t polynomial; - uint16_t seed; - snvs_lp_active_clock_t clock; -} tamper_active_tx_config_t; - -/*! @brief Structure is used to configure SNVS LP active RX tamper pins */ -typedef struct -{ - uint16_t filterenable; - uint8_t filter; - snvs_lp_active_tx_tamper_t activeTamper; -} tamper_active_rx_config_t; - -#endif /* FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS */ - -/*! @brief Structure is used to configure SNVS LP passive tamper pins */ -typedef struct -{ - uint8_t polarity; -#if defined(FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER) && (FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER > 0) - uint8_t filterenable; - uint8_t filter; -#endif /* FSL_FEATURE_SNVS_PASSIVE_TAMPER_FILTER */ -} snvs_lp_passive_tamper_t; - -/* define max possible tamper present */ -/*! @brief Define of SNVS_LP Max possible tamper */ -#if defined(FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER) && (FSL_FEATURE_SNVS_HAS_MULTIPLE_TAMPER > 1) -#define SNVS_LP_MAX_TAMPER kSNVS_ExternalTamper10 -#else -#define SNVS_LP_MAX_TAMPER kSNVS_ExternalTamper1 -#endif - -/*! @brief List of SNVS_LP external tampers status */ -typedef enum _snvs_lp_external_tamper_status -{ - kSNVS_TamperNotDetected = 0U, - kSNVS_TamperDetected = 1U -} snvs_lp_external_tamper_status_t; - -/*! @brief SNVS_LP external tamper polarity */ -typedef enum _snvs_lp_external_tamper_polarity -{ - kSNVS_ExternalTamperActiveLow = 0U, - kSNVS_ExternalTamperActiveHigh = 1U -} snvs_lp_external_tamper_polarity_t; - -/*! @brief Structure is used to hold the date and time */ -typedef struct _snvs_lp_srtc_datetime -{ - uint16_t year; /*!< Range from 1970 to 2099.*/ - uint8_t month; /*!< Range from 1 to 12.*/ - uint8_t day; /*!< Range from 1 to 31 (depending on month).*/ - uint8_t hour; /*!< Range from 0 to 23.*/ - uint8_t minute; /*!< Range from 0 to 59.*/ - uint8_t second; /*!< Range from 0 to 59.*/ -} snvs_lp_srtc_datetime_t; - -/*! - * @brief SNVS_LP config structure - * - * This structure holds the configuration settings for the SNVS_LP peripheral. To initialize this - * structure to reasonable defaults, call the SNVS_LP_GetDefaultConfig() function and pass a - * pointer to your config structure instance. - * - * The config struct can be made const so it resides in flash - */ -typedef struct _snvs_lp_srtc_config -{ - bool srtcCalEnable; /*!< true: SRTC calibration mechanism is enabled; - false: No calibration is used */ - uint32_t srtcCalValue; /*!< Defines signed calibration value for SRTC; - This is a 5-bit 2's complement value, range from -16 to +15 */ -} snvs_lp_srtc_config_t; - -/*! - * @brief SNVS_LP Zeroizable Master Key programming mode. - */ -typedef enum _snvs_lp_zmk_program_mode -{ - kSNVS_ZMKSoftwareProgram, /*!< Software programming mode. */ - kSNVS_ZMKHardwareProgram, /*!< Hardware programming mode. */ -} snvs_lp_zmk_program_mode_t; - -/*! - * @brief SNVS_LP Master Key mode. - */ -typedef enum _snvs_lp_master_key_mode -{ - kSNVS_OTPMK = 0, /*!< One Time Programmable Master Key. */ - kSNVS_ZMK = 2, /*!< Zeroizable Master Key. */ - kSNVS_CMK = 3, /*!< Combined Master Key, it is XOR of OPTMK and ZMK. */ -} snvs_lp_master_key_mode_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * @note This API should be called at the beginning of the application using the SNVS driver. - * - * @param base SNVS peripheral base address - */ -void SNVS_LP_Init(SNVS_Type *base); - -/*! - * @brief Deinit the SNVS LP section. - * - * @param base SNVS peripheral base address - */ -void SNVS_LP_Deinit(SNVS_Type *base); - -/*! @}*/ - -/*! - * @brief Ungates the SNVS clock and configures the peripheral for basic operation. - * - * @note This API should be called at the beginning of the application using the SNVS driver. - * - * @param base SNVS peripheral base address - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_SRTC_Init(SNVS_Type *base, const snvs_lp_srtc_config_t *config); - -/*! - * @brief Stops the SRTC timer. - * - * @param base SNVS peripheral base address - */ -void SNVS_LP_SRTC_Deinit(SNVS_Type *base); - -/*! - * @brief Fills in the SNVS_LP config struct with the default settings. - * - * The default values are as follows. - * @code - * config->srtccalenable = false; - * config->srtccalvalue = 0U; - * @endcode - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_SRTC_GetDefaultConfig(snvs_lp_srtc_config_t *config); - -/*! - * @name Secure RTC (SRTC) current Time & Alarm - * @{ - */ - -/*! - * @brief Sets the SNVS SRTC date and time according to the given time structure. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the date and time details are stored. - * - * @return kStatus_Success: Success in setting the time and starting the SNVS SRTC - * kStatus_InvalidArgument: Error because the datetime format is incorrect - */ -status_t SNVS_LP_SRTC_SetDatetime(SNVS_Type *base, const snvs_lp_srtc_datetime_t *datetime); - -/*! - * @brief Gets the SNVS SRTC time and stores it in the given time structure. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the date and time details are stored. - */ -void SNVS_LP_SRTC_GetDatetime(SNVS_Type *base, snvs_lp_srtc_datetime_t *datetime); - -/*! - * @brief Sets the SNVS SRTC alarm time. - * - * The function sets the SRTC alarm. It also checks whether the specified alarm - * time is greater than the present time. If not, the function does not set the alarm - * and returns an error. - * Please note, that SRTC alarm has limited resolution because only 32 most - * significant bits of SRTC counter are compared to SRTC Alarm register. - * If the alarm time is beyond SRTC resolution, the function does not set the alarm - * and returns an error. - * - * @param base SNVS peripheral base address - * @param alarmTime Pointer to the structure where the alarm time is stored. - * - * @return kStatus_Success: success in setting the SNVS SRTC alarm - * kStatus_InvalidArgument: Error because the alarm datetime format is incorrect - * kStatus_Fail: Error because the alarm time has already passed or is beyond resolution - */ -status_t SNVS_LP_SRTC_SetAlarm(SNVS_Type *base, const snvs_lp_srtc_datetime_t *alarmTime); - -/*! - * @brief Returns the SNVS SRTC alarm time. - * - * @param base SNVS peripheral base address - * @param datetime Pointer to the structure where the alarm date and time details are stored. - */ -void SNVS_LP_SRTC_GetAlarm(SNVS_Type *base, snvs_lp_srtc_datetime_t *datetime); - -/*! @}*/ - -/*! - * @name Interrupt Interface - * @{ - */ - -/*! - * @brief Enables the selected SNVS interrupts. - * - * @param base SNVS peripheral base address - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration :: _snvs_lp_srtc_interrupts - */ -static inline void SNVS_LP_SRTC_EnableInterrupts(SNVS_Type *base, uint32_t mask) -{ - base->LPCR |= mask; -} - -/*! - * @brief Disables the selected SNVS interrupts. - * - * @param base SNVS peripheral base address - * @param mask The interrupts to enable. This is a logical OR of members of the - * enumeration :: _snvs_lp_srtc_interrupts - */ -static inline void SNVS_LP_SRTC_DisableInterrupts(SNVS_Type *base, uint32_t mask) -{ - base->LPCR &= ~mask; -} - -/*! - * @brief Gets the enabled SNVS interrupts. - * - * @param base SNVS peripheral base address - * - * @return The enabled interrupts. This is the logical OR of members of the - * enumeration :: _snvs_lp_srtc_interrupts - */ -uint32_t SNVS_LP_SRTC_GetEnabledInterrupts(SNVS_Type *base); - -/*! @}*/ - -/*! - * @name Status Interface - * @{ - */ - -/*! - * @brief Gets the SNVS status flags. - * - * @param base SNVS peripheral base address - * - * @return The status flags. This is the logical OR of members of the - * enumeration :: _snvs_lp_srtc_status_flags - */ -uint32_t SNVS_LP_SRTC_GetStatusFlags(SNVS_Type *base); - -/*! - * @brief Clears the SNVS status flags. - * - * @param base SNVS peripheral base address - * @param mask The status flags to clear. This is a logical OR of members of the - * enumeration :: _snvs_lp_srtc_status_flags - */ -static inline void SNVS_LP_SRTC_ClearStatusFlags(SNVS_Type *base, uint32_t mask) -{ - base->LPSR |= mask; -} - -/*! @}*/ - -/*! - * @name Timer Start and Stop - * @{ - */ - -/*! - * @brief Starts the SNVS SRTC time counter. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_LP_SRTC_StartTimer(SNVS_Type *base) -{ - base->LPCR |= SNVS_LPCR_SRTC_ENV_MASK; - while ((0U == (base->LPCR & SNVS_LPCR_SRTC_ENV_MASK))) - { - } -} - -/*! - * @brief Stops the SNVS SRTC time counter. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_LP_SRTC_StopTimer(SNVS_Type *base) -{ - base->LPCR &= ~SNVS_LPCR_SRTC_ENV_MASK; - while ((base->LPCR & SNVS_LPCR_SRTC_ENV_MASK) != 0U) - { - } -} - -/*! @}*/ - -/*! - * @name External tampering - * @{ - */ - -/*! - * @brief Enables the specified SNVS external tamper. - * - * @param base SNVS peripheral base address - * @param pin SNVS external tamper pin - * @param config Configuration structure of external passive tamper - */ -void SNVS_LP_EnablePassiveTamper(SNVS_Type *base, snvs_lp_external_tamper_t pin, snvs_lp_passive_tamper_t config); - -#if defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) -/*! - * @brief Enable active tamper tx external pad - * - * @param base SNVS peripheral base address - * @param pin SNVS active tamper pin - * @param config Configuration structure of external active tamper - */ -status_t SNVS_LP_EnableTxActiveTamper(SNVS_Type *base, - snvs_lp_active_tx_tamper_t pin, - tamper_active_tx_config_t config); - -/*! - * @brief Enable active tamper rx external pad - * - * @param base SNVS peripheral base address - * @param rx SNVS external RX tamper pin - * @param config SNVS RX tamper config structure - */ -status_t SNVS_LP_EnableRxActiveTamper(SNVS_Type *base, snvs_lp_external_tamper_t rx, tamper_active_rx_config_t config); - -/*! - * @brief Sets voltage tamper detect - * - * @param base SNVS peripheral base address - * @param enable True if enable false if disable - */ -status_t SNVS_LP_SetVoltageTamper(SNVS_Type *base, bool enable); - -/*! - * @brief Sets temperature tamper detect - * - * @param base SNVS peripheral base address - * @param enable True if enable false if disable - */ -status_t SNVS_LP_SetTemperatureTamper(SNVS_Type *base, bool enable); - -/*! - * @brief Sets clock tamper detect - * - * @param base SNVS peripheral base address - * @param enable True if enable false if disable - */ -status_t SNVS_LP_SetClockTamper(SNVS_Type *base, bool enable); - -/*! - * brief Check voltage tamper - * - * param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckVoltageTamper(SNVS_Type *base); - -/*! - * @brief Check temperature tamper - * - * @param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckTemperatureTamper(SNVS_Type *base); - -/*! - * brief Check clock tamper - * - * param base SNVS peripheral base address - */ -snvs_lp_external_tamper_status_t SNVS_LP_CheckClockTamper(SNVS_Type *base); - -/*! - * @brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->clock = kSNVS_ActiveTamper16HZ; - * config->seed = 0U; - * config->polynomial = 0U; - * endcode - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_TamperPinTx_GetDefaultConfig(tamper_active_tx_config_t *config); - -/*! - * brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->filterenable = 0U; - * config->filter = 0U; - * config->tx = kSNVS_ActiveTamper1; - * endcode - * param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_TamperPinRx_GetDefaultConfig(tamper_active_rx_config_t *config); -#endif /* defined(FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS) && (FSL_FEATURE_SNVS_HAS_ACTIVE_TAMPERS > 0) */ - -/*! - * @brief Fills in the SNVS tamper pin config struct with the default settings. - * - * The default values are as follows. - * code - * config->polarity = 0U; - * config->filterenable = 0U; if available on SoC - * config->filter = 0U; if available on SoC - * endcode - * @param config Pointer to the user's SNVS configuration structure. - */ -void SNVS_LP_PassiveTamperPin_GetDefaultConfig(snvs_lp_passive_tamper_t *config); - -/*! - * @brief Disables the specified SNVS external tamper. - * - * @param base SNVS peripheral base address - * @param pin SNVS external tamper pin - */ -void SNVS_LP_DisableExternalTamper(SNVS_Type *base, snvs_lp_external_tamper_t pin); - -/*! - * @brief Disable all external tamper. - * - * @param base SNVS peripheral base address - */ -void SNVS_LP_DisableAllExternalTamper(SNVS_Type *base); - -/*! - * @brief Returns status of the specified external tamper. - * - * @param base SNVS peripheral base address - * @param pin SNVS external tamper pin - * - * @return The status flag. This is the enumeration :: _snvs_lp_external_tamper_status - */ -snvs_lp_external_tamper_status_t SNVS_LP_GetExternalTamperStatus(SNVS_Type *base, snvs_lp_external_tamper_t pin); - -/*! - * @brief Clears status of the specified external tamper. - * - * @param base SNVS peripheral base address - * @param pin SNVS external tamper pin - */ -void SNVS_LP_ClearExternalTamperStatus(SNVS_Type *base, snvs_lp_external_tamper_t pin); - -/*! - * @brief Clears status of the all external tamper. - * - * @param base SNVS peripheral base address - */ -void SNVS_LP_ClearAllExternalTamperStatus(SNVS_Type *base); - -/*! @}*/ - -/*! - * @name Monotonic Counter (MC) - * @{ - */ - -/*! - * @brief Enable or disable the Monotonic Counter. - * - * @param base SNVS peripheral base address - * @param enable Pass true to enable, false to disable. - */ -static inline void SNVS_LP_EnableMonotonicCounter(SNVS_Type *base, bool enable) -{ - if (enable) - { - base->LPCR |= SNVS_LPCR_MC_ENV_MASK; - } - else - { - base->LPCR &= (~SNVS_LPCR_MC_ENV_MASK); - } -} - -/*! - * @brief Get the current Monotonic Counter. - * - * @param base SNVS peripheral base address - * @return Current Monotonic Counter value. - */ -uint64_t SNVS_LP_GetMonotonicCounter(SNVS_Type *base); - -/*! - * @brief Increase the Monotonic Counter. - * - * Increase the Monotonic Counter by 1. - * - * @param base SNVS peripheral base address - */ -static inline void SNVS_LP_IncreaseMonotonicCounter(SNVS_Type *base) -{ - /* Write to the LPSMCLR or LPSMCLR, the counter increases. */ - *((volatile uint32_t *)(uint32_t)(&(base->LPSMCLR))) = 0xFFFFFFFFU; -} - -/*! @}*/ - -/*! - * @name Zeroizable Master Key (ZMK) - * @{ - */ - -/*! - * @brief Write Zeroizable Master Key (ZMK) to the SNVS registers. - * - * @param base SNVS peripheral base address - * @param ZMKey The ZMK write to the SNVS register. - */ -void SNVS_LP_WriteZeroizableMasterKey(SNVS_Type *base, uint32_t ZMKey[SNVS_ZMK_REG_COUNT]); - -/*! - * @brief Set Zeroizable Master Key valid. - * - * This API could only be called when using software programming mode. After writing - * ZMK using @ref SNVS_LP_WriteZeroizableMasterKey, call this API to make the ZMK - * valid. - * - * @param base SNVS peripheral base address - * @param valid Pass true to set valid, false to set invalid. - */ -static inline void SNVS_LP_SetZeroizableMasterKeyValid(SNVS_Type *base, bool valid) -{ - if (valid) - { - base->LPMKCR |= SNVS_LPMKCR_ZMK_VAL_MASK; - } - else - { - base->LPMKCR &= (~SNVS_LPMKCR_ZMK_VAL_MASK); - } -} - -/*! - * @brief Get Zeroizable Master Key valid status. - * - * In hardware programming mode, call this API to check whether the ZMK is valid. - * - * @param base SNVS peripheral base address - * @return true if valid, false if invalid. - */ -static inline bool SNVS_LP_GetZeroizableMasterKeyValid(SNVS_Type *base) -{ - return (SNVS_LPMKCR_ZMK_VAL_MASK == (base->LPMKCR & SNVS_LPMKCR_ZMK_VAL_MASK)); -} - -/*! - * @brief Set Zeroizable Master Key programming mode. - * - * @param base SNVS peripheral base address - * @param mode ZMK programming mode. - */ -static inline void SNVS_LP_SetZeroizableMasterKeyProgramMode(SNVS_Type *base, snvs_lp_zmk_program_mode_t mode) -{ - if (kSNVS_ZMKSoftwareProgram == mode) - { - base->LPMKCR &= (~SNVS_LPMKCR_ZMK_HWP_MASK); - } - else - { - base->LPMKCR |= SNVS_LPMKCR_ZMK_HWP_MASK; - } -} - -/*! - * @brief Enable or disable Zeroizable Master Key ECC. - * - * @param base SNVS peripheral base address - * @param enable Pass true to enable, false to disable. - */ -static inline void SNVS_LP_EnableZeroizableMasterKeyECC(SNVS_Type *base, bool enable) -{ - if (enable) - { - base->LPMKCR |= SNVS_LPMKCR_ZMK_ECC_EN_MASK; - } - else - { - base->LPMKCR &= (~SNVS_LPMKCR_ZMK_ECC_EN_MASK); - } -} - -/*! - * @brief Set SNVS Master Key mode. - * - * @param base SNVS peripheral base address - * @param mode Master Key mode. - * @note When @ref kSNVS_ZMK or @ref kSNVS_CMK used, the SNVS_HP must be configured - * to enable the master key selection. - */ -static inline void SNVS_LP_SetMasterKeyMode(SNVS_Type *base, snvs_lp_master_key_mode_t mode) -{ - uint32_t lpmkcr = base->LPMKCR; - lpmkcr = (lpmkcr & (~SNVS_LPMKCR_MASTER_KEY_SEL_MASK)) | SNVS_LPMKCR_MASTER_KEY_SEL(mode); - base->LPMKCR = lpmkcr; -} - -#if defined(FSL_FEATURE_SNVS_HAS_STATE_TRANSITION) && (FSL_FEATURE_SNVS_HAS_STATE_TRANSITION > 0) -/*! - * brief Transition SNVS SSM state to Trusted/Non-secure from Check state - * - * param base SNVS peripheral base address - * - * return kStatus_Success: Success in transitioning SSM State - * kStatus_Fail: SSM State transition failed - */ -status_t SNVS_LP_SSM_State_Transition(SNVS_Type *base); -#endif /* FSL_FEATURE_SNVS_HAS_STATE_TRANSITION */ - -/*! @}*/ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_SNVS_LP_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_spdif.c b/devices/MIMXRT1052/drivers/fsl_spdif.c deleted file mode 100644 index 72f1c60..0000000 --- a/devices/MIMXRT1052/drivers/fsl_spdif.c +++ /dev/null @@ -1,849 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_spdif.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.spdif" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ -/*! @brief spdif transfer state. */ -enum -{ - kSPDIF_Busy = 0x0U, /*!< SPDIF is busy */ - kSPDIF_Idle, /*!< Transfer is done. */ - kSPDIF_Error /*!< Transfer error occurred. */ -}; - -/*! @brief Typedef for spdif tx interrupt handler. */ -typedef void (*spdif_isr_t)(SPDIF_Type *base, spdif_handle_t *handle); -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ -/* Base pointer array */ -static SPDIF_Type *const s_spdifBases[] = SPDIF_BASE_PTRS; -/*! @brief SPDIF handle pointer */ -static spdif_handle_t *s_spdifHandle[ARRAY_SIZE(s_spdifBases)][2]; -/* IRQ number array */ -static const IRQn_Type s_spdifIRQ[] = SPDIF_IRQS; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Clock name array */ -static const clock_ip_name_t s_spdifClock[] = SPDIF_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -/*! @brief Pointer to IRQ handler for each instance. */ -static spdif_isr_t s_spdifTxIsr; -/*! @brief Pointer to IRQ handler for each instance. */ -static spdif_isr_t s_spdifRxIsr; -/*! @brief Used for spdif gain */ -static uint8_t s_spdif_gain[8] = {24U, 16U, 12U, 8U, 6U, 4U, 3U, 1U}; -static uint8_t s_spdif_tx_watermark[4] = {16, 12, 8, 4}; -static uint8_t s_spdif_rx_watermark[4] = {1, 4, 8, 16}; - -/******************************************************************************* - * Code - ******************************************************************************/ -uint32_t SPDIF_GetInstance(SPDIF_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_spdifBases); instance++) - { - if (s_spdifBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_spdifBases)); - - return instance; -} - -/*! - * brief Initializes the SPDIF peripheral. - * - * Ungates the SPDIF clock, resets the module, and configures SPDIF with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SPDIF_GetDefaultConfig(). - * - * note This API should be called at the beginning of the application to use - * the SPDIF driver. Otherwise, accessing the SPDIF module can cause a hard fault - * because the clock is not enabled. - * - * param base SPDIF base pointer - * param config SPDIF configuration structure. - */ -void SPDIF_Init(SPDIF_Type *base, const spdif_config_t *config) -{ - uint32_t val = 0; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the SPDIF clock */ - CLOCK_EnableClock(s_spdifClock[SPDIF_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Reset the internal logic */ - base->SCR |= SPDIF_SCR_SOFT_RESET_MASK; - - /* Waiting for reset finish */ - while ((base->SCR & SPDIF_SCR_SOFT_RESET_MASK) != 0x00U) - { - } - - /* Setting the SPDIF settings */ - base->SCR = SPDIF_SCR_RXFIFOFULL_SEL(config->rxFullSelect) | SPDIF_SCR_RXAUTOSYNC(config->isRxAutoSync) | - SPDIF_SCR_TXAUTOSYNC(config->isRxAutoSync) | SPDIF_SCR_TXFIFOEMPTY_SEL(config->txFullSelect) | - SPDIF_SCR_TXFIFO_CTRL(1U) | SPDIF_SCR_VALCTRL(config->validityConfig) | - SPDIF_SCR_TXSEL(config->txSource) | SPDIF_SCR_USRC_SEL(config->uChannelSrc); - - /* Set DPLL clock source */ - base->SRPC = SPDIF_SRPC_CLKSRC_SEL(config->DPLLClkSource) | SPDIF_SRPC_GAINSEL(config->gain); - - /* Set SPDIF tx clock source */ - val = base->STC & ~SPDIF_STC_TXCLK_SOURCE_MASK; - val |= SPDIF_STC_TXCLK_SOURCE(config->txClkSource); - base->STC = val; - - /* clear and diable all the interrupt */ - base->SIC = (uint32_t)kSPDIF_AllInterrupt; - base->SIE &= ~(uint32_t)kSPDIF_AllInterrupt; -} - -/*! - * brief De-initializes the SPDIF peripheral. - * - * This API gates the SPDIF clock. The SPDIF module can't operate unless SPDIF_Init is called to enable the clock. - * - * param base SPDIF base pointer - */ -void SPDIF_Deinit(SPDIF_Type *base) -{ - SPDIF_TxEnable(base, false); - SPDIF_RxEnable(base, false); -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - CLOCK_DisableClock(s_spdifClock[SPDIF_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Sets the SPDIF configuration structure to default values. - * - * This API initializes the configuration structure for use in SPDIF_Init. - * The initialized structure can remain unchanged in SPDIF_Init, or it can be modified - * before calling SPDIF_Init. - * This is an example. - code - spdif_config_t config; - SPDIF_GetDefaultConfig(&config); - endcode - * - * param config pointer to master configuration structure - */ -void SPDIF_GetDefaultConfig(spdif_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->isTxAutoSync = true; - config->isRxAutoSync = true; - config->DPLLClkSource = 1; - config->txClkSource = 1; - config->rxFullSelect = kSPDIF_RxFull8Samples; - config->txFullSelect = kSPDIF_TxEmpty8Samples; - config->uChannelSrc = kSPDIF_UChannelFromTx; - config->txSource = kSPDIF_txNormal; - config->validityConfig = kSPDIF_validityFlagAlwaysClear; - config->gain = kSPDIF_GAIN_8; -} - -/*! - * brief Enables/disables the SPDIF Tx. - * - * param base SPDIF base pointer - * param enable True means enable SPDIF Tx, false means disable. - */ -void SPDIF_TxEnable(SPDIF_Type *base, bool enable) -{ - uint32_t val = 0; - - if (enable) - { - /* Open Tx FIFO */ - val = base->SCR & (~SPDIF_SCR_TXFIFO_CTRL_MASK); - val |= SPDIF_SCR_TXFIFO_CTRL(1U); - base->SCR = val; - /* Enable transfer clock */ - base->STC |= SPDIF_STC_TX_ALL_CLK_EN_MASK; - } - else - { - base->SCR &= ~(SPDIF_SCR_TXFIFO_CTRL_MASK | SPDIF_SCR_TXSEL_MASK); - /* Disable transfer clock */ - base->STC &= ~SPDIF_STC_TX_ALL_CLK_EN_MASK; - } -} - -/*! - * brief Configures the SPDIF Tx sample rate. - * - * The audio format can be changed at run-time. This function configures the sample rate. - * - * param base SPDIF base pointer. - * param sampleRate_Hz SPDIF sample rate frequency in Hz. - * param sourceClockFreq_Hz SPDIF tx clock source frequency in Hz. - */ -void SPDIF_TxSetSampleRate(SPDIF_Type *base, uint32_t sampleRate_Hz, uint32_t sourceClockFreq_Hz) -{ - uint32_t clkDiv = sourceClockFreq_Hz / (sampleRate_Hz * 64U); - uint32_t mod = sourceClockFreq_Hz % (sampleRate_Hz * 64U); - uint32_t val = 0; - uint8_t clockSource = (uint8_t)(((base->STC) & SPDIF_STC_TXCLK_SOURCE_MASK) >> SPDIF_STC_TXCLK_SOURCE_SHIFT); - - /* Compute the nearest divider */ - if (mod > ((sampleRate_Hz * 64U) / 2U)) - { - clkDiv += 1U; - } - - /* If use divided systeme clock */ - if (clockSource == 5U) - { - if (clkDiv > 256U) - { - val = base->STC & (~(SPDIF_STC_TXCLK_DF_MASK | SPDIF_STC_SYSCLK_DF_MASK)); - val |= SPDIF_STC_SYSCLK_DF((clkDiv / 128U) - 1U) | SPDIF_STC_TXCLK_DF(127U); - base->STC = val; - } - else - { - val = base->STC & (~(SPDIF_STC_TXCLK_DF_MASK | SPDIF_STC_SYSCLK_DF_MASK)); - val |= SPDIF_STC_SYSCLK_DF(1U) | SPDIF_STC_TXCLK_DF(clkDiv - 1U); - base->STC = val; - } - } - else - { - /* Other clock only uses txclk div */ - val = base->STC & (~(SPDIF_STC_TXCLK_DF_MASK | SPDIF_STC_SYSCLK_DF_MASK)); - val |= SPDIF_STC_TXCLK_DF(clkDiv - 1U); - base->STC = val; - } -} - -/*! - * brief Configures the SPDIF Rx audio format. - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * param base SPDIF base pointer. - * param clockSourceFreq_Hz SPDIF system clock frequency in hz. - */ -uint32_t SPDIF_GetRxSampleRate(SPDIF_Type *base, uint32_t clockSourceFreq_Hz) -{ - uint64_t gain = s_spdif_gain[((base->SRPC & SPDIF_SRPC_GAINSEL_MASK) >> SPDIF_SRPC_GAINSEL_SHIFT)]; - uint32_t measure = 0; - uint32_t sampleRate = 0; - uint64_t temp = 0; - - /* Wait the DPLL locked */ - while ((base->SRPC & SPDIF_SRPC_LOCK_MASK) == 0U) - { - } - - /* Get the measure value */ - measure = base->SRFM; - temp = (uint64_t)measure * (uint64_t)clockSourceFreq_Hz; - temp /= 1024U * 1024U * 128U * gain; - sampleRate = (uint32_t)temp; - - return sampleRate; -} - -/*! - * brief Sends data using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SPDIF base pointer. - * param buffer Pointer to the data to be written. - * param size Bytes to be written. - */ -void SPDIF_WriteBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size) -{ - assert(buffer != NULL); - assert((size % 6U) == 0U); - - uint32_t i = 0, j = 0, data = 0; - - while (i < size) - { - /* Wait until it can write data */ - while ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_TxFIFOEmpty) == 0x00U) - { - } - - /* Write left channel data */ - for (j = 0; j < 3U; j++) - { - data |= ((uint32_t)(*buffer) << (j * 8U)); - buffer++; - } - SPDIF_WriteLeftData(base, data); - - /* Write right channel data */ - data = 0; - for (j = 0; j < 3U; j++) - { - data |= ((uint32_t)(*buffer) << (j * 8U)); - buffer++; - } - SPDIF_WriteRightData(base, data); - - i += 6U; - } -} - -/*! - * brief Receives data using a blocking method. - * - * note This function blocks by polling until data is ready to be sent. - * - * param base SPDIF base pointer. - * param buffer Pointer to the data to be read. - * param size Bytes to be read. - */ -void SPDIF_ReadBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size) -{ - assert(buffer != NULL); - assert((size % 6U) == 0U); - - uint32_t i = 0, j = 0, data = 0; - - while (i < size) - { - /* Wait until it can write data */ - while ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxFIFOFull) == 0x00U) - { - } - - /* Write left channel data */ - data = SPDIF_ReadLeftData(base); - for (j = 0; j < 3U; j++) - { - *buffer = ((uint8_t)(data >> (j * 8U)) & 0xFFU); - buffer++; - } - - /* Write right channel data */ - data = SPDIF_ReadRightData(base); - for (j = 0; j < 3U; j++) - { - *buffer = ((uint8_t)(data >> (j * 8U)) & 0xFFU); - buffer++; - } - - i += 6U; - } -} - -/*! - * brief Initializes the SPDIF Tx handle. - * - * This function initializes the Tx handle for the SPDIF Tx transactional APIs. Call - * this function once to get the handle initialized. - * - * param base SPDIF base pointer - * param handle SPDIF handle pointer. - * param callback Pointer to the user callback function. - * param userData User parameter passed to the callback function - */ -void SPDIF_TransferTxCreateHandle(SPDIF_Type *base, - spdif_handle_t *handle, - spdif_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - s_spdifHandle[SPDIF_GetInstance(base)][0] = handle; - - handle->callback = callback; - handle->userData = userData; - handle->watermark = - s_spdif_tx_watermark[(base->SCR & SPDIF_SCR_TXFIFOEMPTY_SEL_MASK) >> SPDIF_SCR_TXFIFOEMPTY_SEL_SHIFT]; - - /* Set the isr pointer */ - s_spdifTxIsr = SPDIF_TransferTxHandleIRQ; - - /* Enable Tx irq */ - (void)EnableIRQ(s_spdifIRQ[SPDIF_GetInstance(base)]); -} - -/*! - * brief Initializes the SPDIF Rx handle. - * - * This function initializes the Rx handle for the SPDIF Rx transactional APIs. Call - * this function once to get the handle initialized. - * - * param base SPDIF base pointer. - * param handle SPDIF handle pointer. - * param callback Pointer to the user callback function. - * param userData User parameter passed to the callback function. - */ -void SPDIF_TransferRxCreateHandle(SPDIF_Type *base, - spdif_handle_t *handle, - spdif_transfer_callback_t callback, - void *userData) -{ - assert(handle != NULL); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - s_spdifHandle[SPDIF_GetInstance(base)][1] = handle; - - handle->callback = callback; - handle->userData = userData; - handle->watermark = - s_spdif_rx_watermark[(base->SCR & SPDIF_SCR_RXFIFOFULL_SEL_MASK) >> SPDIF_SCR_RXFIFOFULL_SEL_SHIFT]; - - /* Set the isr pointer */ - s_spdifRxIsr = SPDIF_TransferRxHandleIRQ; - - /* Enable Rx irq */ - (void)EnableIRQ(s_spdifIRQ[SPDIF_GetInstance(base)]); -} - -/*! - * brief Performs an interrupt non-blocking send transfer on SPDIF. - * - * note This API returns immediately after the transfer initiates. - * Call the SPDIF_TxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer - * is finished. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * param xfer Pointer to the spdif_transfer_t structure. - * retval kStatus_Success Successfully started the data receive. - * retval kStatus_SPDIF_TxBusy Previous receive still not finished. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SPDIF_TransferSendNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer) -{ - assert(handle != NULL); - - /* Check if the queue is full */ - if (handle->spdifQueue[handle->queueUser].data != NULL) - { - return kStatus_SPDIF_QueueFull; - } - - /* Add into queue */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->spdifQueue[handle->queueUser].data = xfer->data; - handle->spdifQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->queueUser = (handle->queueUser + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - - /* Set the state to busy */ - handle->state = kSPDIF_Busy; - - /* Enable interrupt */ - SPDIF_EnableInterrupts(base, kSPDIF_TxFIFOEmpty); - - /* Enable Tx transfer */ - SPDIF_TxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Performs an interrupt non-blocking receive transfer on SPDIF. - * - * note This API returns immediately after the transfer initiates. - * Call the SPDIF_RxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer - * is finished. - * - * param base SPDIF base pointer - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * param xfer Pointer to the spdif_transfer_t structure. - * retval kStatus_Success Successfully started the data receive. - * retval kStatus_SPDIF_RxBusy Previous receive still not finished. - * retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SPDIF_TransferReceiveNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer) -{ - assert(handle != NULL); - - uint32_t enableInterrupts = (uint32_t)kSPDIF_RxFIFOFull | (uint32_t)kSPDIF_RxControlChannelChange; - - /* Check if the queue is full */ - if (handle->spdifQueue[handle->queueUser].data != NULL) - { - return kStatus_SPDIF_QueueFull; - } - - /* Add into queue */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->spdifQueue[handle->queueUser].data = xfer->data; - handle->spdifQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->spdifQueue[handle->queueUser].udata = xfer->udata; - handle->spdifQueue[handle->queueUser].qdata = xfer->qdata; - handle->queueUser = (handle->queueUser + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - - /* Set state to busy */ - handle->state = kSPDIF_Busy; - - if (xfer->qdata != NULL) - { - enableInterrupts |= (uint32_t)kSPDIF_QChannelReceiveRegisterFull; - } - - if (xfer->udata != NULL) - { - enableInterrupts |= (uint32_t)kSPDIF_UChannelReceiveRegisterFull; - } - - /* Enable interrupt */ - SPDIF_EnableInterrupts(base, enableInterrupts); - - /* Enable Rx transfer */ - SPDIF_RxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Gets a set byte count. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * param count Bytes count sent. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SPDIF_TransferGetSendCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint8_t queueDriver = handle->queueDriver; - - if (handle->state != (uint32_t)kSPDIF_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriver] - handle->spdifQueue[queueDriver].dataSize); - } - - return status; -} - -/*! - * brief Gets a received byte count. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * param count Bytes count received. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SPDIF_TransferGetReceiveCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - uint8_t queueDriver = handle->queueDriver; - - if (handle->state != (uint32_t)kSPDIF_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[queueDriver] - handle->spdifQueue[queueDriver].dataSize); - } - - return status; -} - -/*! - * brief Aborts the current send. - * - * note This API can be called any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - */ -void SPDIF_TransferAbortSend(SPDIF_Type *base, spdif_handle_t *handle) -{ - assert(handle != NULL); - - /* Use FIFO request interrupt and fifo error */ - SPDIF_DisableInterrupts(base, kSPDIF_TxFIFOEmpty); - - handle->state = kSPDIF_Idle; - - /* Clear the queue */ - (void)memset(handle->spdifQueue, 0, sizeof(spdif_transfer_t) * SPDIF_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Aborts the current IRQ receive. - * - * note This API can be called when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * param base SPDIF base pointer - * param handle Pointer to the spdif_handle_t structure which stores the transfer state. - */ -void SPDIF_TransferAbortReceive(SPDIF_Type *base, spdif_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable interrupt */ - SPDIF_DisableInterrupts(base, (uint32_t)kSPDIF_UChannelReceiveRegisterFull | - (uint32_t)kSPDIF_QChannelReceiveRegisterFull | (uint32_t)kSPDIF_RxFIFOFull | - (uint32_t)kSPDIF_RxControlChannelChange); - - handle->state = kSPDIF_Idle; - - /* Clear the queue */ - (void)memset(handle->spdifQueue, 0, sizeof(spdif_transfer_t) * SPDIF_XFER_QUEUE_SIZE); - handle->queueDriver = 0; - handle->queueUser = 0; -} - -/*! - * brief Tx interrupt handler. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure. - */ -void SPDIF_TransferTxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle) -{ - assert(handle != NULL); - - uint8_t *buffer = handle->spdifQueue[handle->queueDriver].data; - uint8_t dataSize = 0; - uint32_t i = 0, j = 0, data = 0; - - /* Do Transfer */ - if (((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_TxFIFOEmpty) != 0x00U) && - ((base->SIE & (uint32_t)kSPDIF_TxFIFOEmpty) != 0x00U)) - { - dataSize = handle->watermark; - while (i < dataSize) - { - data = 0; - /* Write left channel data */ - for (j = 0; j < 3U; j++) - { - data |= ((uint32_t)(*buffer) << (j * 8U)); - buffer++; - } - SPDIF_WriteLeftData(base, data); - - /* Write right channel data */ - data = 0; - for (j = 0; j < 3U; j++) - { - data |= ((uint32_t)(*buffer) << (j * 8U)); - buffer++; - } - SPDIF_WriteRightData(base, data); - - i++; - } - handle->spdifQueue[handle->queueDriver].dataSize -= (uint32_t)dataSize * 6U; - handle->spdifQueue[handle->queueDriver].data += dataSize * 6U; - - /* If finished a block, call the callback function */ - if (handle->spdifQueue[handle->queueDriver].dataSize == 0U) - { - (void)memset(&handle->spdifQueue[handle->queueDriver], 0, sizeof(spdif_transfer_t)); - handle->queueDriver = (handle->queueDriver + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_TxIdle, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->spdifQueue[handle->queueDriver].data == NULL) - { - SPDIF_TransferAbortSend(base, handle); - } - } -} - -/*! - * brief Tx interrupt handler. - * - * param base SPDIF base pointer. - * param handle Pointer to the spdif_handle_t structure. - */ -void SPDIF_TransferRxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle) -{ - assert(handle != NULL); - - uint8_t *buffer = NULL; - uint8_t dataSize = 0; - uint32_t i = 0, j = 0, data = 0; - - /* Handle Cnew flag */ - if ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxControlChannelChange) != 0x00U) - { - /* Clear the interrupt flag */ - SPDIF_ClearStatusFlags(base, SPDIF_SIE_CNEW_MASK); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_RxCnew, handle->userData); - } - } - - /* Handle illegal symbol */ - if ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxIllegalSymbol) != 0x00U) - { - SPDIF_ClearStatusFlags(base, kSPDIF_RxIllegalSymbol); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_RxIllegalSymbol, handle->userData); - } - } - - /* Handle Parity Bit Error */ - if ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxParityBitError) != 0x00U) - { - SPDIF_ClearStatusFlags(base, kSPDIF_RxParityBitError); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_RxParityBitError, handle->userData); - } - } - - /* Handle DPlocked */ - if ((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxDPLLLocked) != 0x00U) - { - SPDIF_ClearStatusFlags(base, kSPDIF_RxDPLLLocked); - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_RxDPLLLocked, handle->userData); - } - } - - /* Handle Q channel full flag */ - if (((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_QChannelReceiveRegisterFull) != 0x00U) && - ((base->SIE & (uint32_t)kSPDIF_QChannelReceiveRegisterFull) != 0x00U)) - { - buffer = handle->spdifQueue[handle->queueDriver].qdata; - if (buffer != NULL) - { - data = SPDIF_ReadQChannel(base); - buffer[0] = (uint8_t)data & 0xFFU; - buffer[1] = (uint8_t)(data >> 8U) & 0xFFU; - buffer[2] = (uint8_t)(data >> 16U) & 0xFFU; - } - } - - /* Handle U channel full flag */ - if (((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_UChannelReceiveRegisterFull) != 0x00U) && - ((base->SIE & (uint32_t)kSPDIF_UChannelReceiveRegisterFull) != 0x00U)) - { - buffer = handle->spdifQueue[handle->queueDriver].udata; - if (buffer != NULL) - { - data = SPDIF_ReadUChannel(base); - buffer[0] = (uint8_t)data & 0xFFU; - buffer[1] = (uint8_t)(data >> 8U) & 0xFFU; - buffer[2] = (uint8_t)(data >> 16U) & 0xFFU; - } - } - - /* Handle audio data transfer */ - if (((SPDIF_GetStatusFlag(base) & (uint32_t)kSPDIF_RxFIFOFull) != 0x00U) && - ((base->SIE & (uint32_t)kSPDIF_RxFIFOFull) != 0x00U)) - { - dataSize = handle->watermark; - buffer = handle->spdifQueue[handle->queueDriver].data; - while (i < dataSize) - { - /* Read left channel data */ - data = SPDIF_ReadLeftData(base); - for (j = 0; j < 3U; j++) - { - *buffer = (uint8_t)((data >> (j * 8U)) & 0xFFU); - buffer++; - } - - /* Read right channel data */ - data = SPDIF_ReadRightData(base); - for (j = 0; j < 3U; j++) - { - *buffer = (uint8_t)((data >> (j * 8U)) & 0xFFU); - buffer++; - } - - i++; - } - handle->spdifQueue[handle->queueDriver].dataSize -= (uint32_t)dataSize * 6U; - handle->spdifQueue[handle->queueDriver].data += dataSize * 6U; - - /* If finished a block, call the callback function */ - if (handle->spdifQueue[handle->queueDriver].dataSize == 0x00U) - { - (void)memset(&handle->spdifQueue[handle->queueDriver], 0, sizeof(spdif_transfer_t)); - handle->queueDriver = (handle->queueDriver + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - if (handle->callback != NULL) - { - (handle->callback)(base, handle, kStatus_SPDIF_RxIdle, handle->userData); - } - } - - /* If all data finished, just stop the transfer */ - if (handle->spdifQueue[handle->queueDriver].data == NULL) - { - SPDIF_TransferAbortReceive(base, handle); - } - } -} - -#if defined(SPDIF) -void SPDIF_DriverIRQHandler(void); -void SPDIF_DriverIRQHandler(void) -{ - if ((s_spdifHandle[0][0] != NULL) && (s_spdifTxIsr != NULL)) - { - s_spdifTxIsr(SPDIF, s_spdifHandle[0][0]); - } - - if ((s_spdifHandle[0][1] != NULL) && (s_spdifRxIsr != NULL)) - { - s_spdifRxIsr(SPDIF, s_spdifHandle[0][1]); - } - SDK_ISR_EXIT_BARRIER; -} -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_spdif.h b/devices/MIMXRT1052/drivers/fsl_spdif.h deleted file mode 100644 index c1656c1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_spdif.h +++ /dev/null @@ -1,753 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_SPDIF_H_ -#define _FSL_SPDIF_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup spdif - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SPDIF_DRIVER_VERSION (MAKE_VERSION(2, 0, 6)) /*!< Version 2.0.6 */ -/*@}*/ - -/*! @brief SPDIF return status*/ -enum -{ - kStatus_SPDIF_RxDPLLLocked = MAKE_STATUS(kStatusGroup_SPDIF, 0), /*!< SPDIF Rx PLL locked. */ - kStatus_SPDIF_TxFIFOError = MAKE_STATUS(kStatusGroup_SPDIF, 1), /*!< SPDIF Tx FIFO error. */ - kStatus_SPDIF_TxFIFOResync = MAKE_STATUS(kStatusGroup_SPDIF, 2), /*!< SPDIF Tx left and right FIFO resync. */ - kStatus_SPDIF_RxCnew = MAKE_STATUS(kStatusGroup_SPDIF, 3), /*!< SPDIF Rx status channel value updated. */ - kStatus_SPDIF_ValidatyNoGood = MAKE_STATUS(kStatusGroup_SPDIF, 4), /*!< SPDIF validaty flag not good. */ - kStatus_SPDIF_RxIllegalSymbol = MAKE_STATUS(kStatusGroup_SPDIF, 5), /*!< SPDIF Rx receive illegal symbol. */ - kStatus_SPDIF_RxParityBitError = MAKE_STATUS(kStatusGroup_SPDIF, 6), /*!< SPDIF Rx parity bit error. */ - kStatus_SPDIF_UChannelOverrun = MAKE_STATUS(kStatusGroup_SPDIF, 7), /*!< SPDIF receive U channel overrun. */ - kStatus_SPDIF_QChannelOverrun = MAKE_STATUS(kStatusGroup_SPDIF, 8), /*!< SPDIF receive Q channel overrun. */ - kStatus_SPDIF_UQChannelSync = MAKE_STATUS(kStatusGroup_SPDIF, 9), /*!< SPDIF U/Q channel sync found. */ - kStatus_SPDIF_UQChannelFrameError = MAKE_STATUS(kStatusGroup_SPDIF, 10), /*!< SPDIF U/Q channel frame error. */ - kStatus_SPDIF_RxFIFOError = MAKE_STATUS(kStatusGroup_SPDIF, 11), /*!< SPDIF Rx FIFO error. */ - kStatus_SPDIF_RxFIFOResync = MAKE_STATUS(kStatusGroup_SPDIF, 12), /*!< SPDIF Rx left and right FIFO resync. */ - kStatus_SPDIF_LockLoss = MAKE_STATUS(kStatusGroup_SPDIF, 13), /*!< SPDIF Rx PLL clock lock loss. */ - kStatus_SPDIF_TxIdle = MAKE_STATUS(kStatusGroup_SPDIF, 14), /*!< SPDIF Tx is idle */ - kStatus_SPDIF_RxIdle = MAKE_STATUS(kStatusGroup_SPDIF, 15), /*!< SPDIF Rx is idle */ - kStatus_SPDIF_QueueFull = MAKE_STATUS(kStatusGroup_SPDIF, 16) /*!< SPDIF queue full */ -}; - -/*! @brief SPDIF Rx FIFO full falg select, it decides when assert the rx full flag */ -typedef enum _spdif_rxfull_select -{ - kSPDIF_RxFull1Sample = 0x0u, /*!< Rx full at least 1 sample in left and right FIFO */ - kSPDIF_RxFull4Samples, /*!< Rx full at least 4 sample in left and right FIFO*/ - kSPDIF_RxFull8Samples, /*!< Rx full at least 8 sample in left and right FIFO*/ - kSPDIF_RxFull16Samples, /*!< Rx full at least 16 sample in left and right FIFO*/ -} spdif_rxfull_select_t; - -/*! @brief SPDIF tx FIFO EMPTY falg select, it decides when assert the tx empty flag */ -typedef enum _spdif_txempty_select -{ - kSPDIF_TxEmpty0Sample = 0x0u, /*!< Tx empty at most 0 sample in left and right FIFO */ - kSPDIF_TxEmpty4Samples, /*!< Tx empty at most 4 sample in left and right FIFO*/ - kSPDIF_TxEmpty8Samples, /*!< Tx empty at most 8 sample in left and right FIFO*/ - kSPDIF_TxEmpty12Samples, /*!< Tx empty at most 12 sample in left and right FIFO*/ -} spdif_txempty_select_t; - -/*! @brief SPDIF U channel source */ -typedef enum _spdif_uchannel_source -{ - kSPDIF_NoUChannel = 0x0U, /*!< No embedded U channel */ - kSPDIF_UChannelFromRx = 0x1U, /*!< U channel from receiver, it is CD mode */ - kSPDIF_UChannelFromTx = 0x3U, /*!< U channel from on chip tx */ -} spdif_uchannel_source_t; - -/*! @brief SPDIF clock gain*/ -typedef enum _spdif_gain_select -{ - kSPDIF_GAIN_24 = 0x0U, /*!< Gain select is 24 */ - kSPDIF_GAIN_16, /*!< Gain select is 16 */ - kSPDIF_GAIN_12, /*!< Gain select is 12 */ - kSPDIF_GAIN_8, /*!< Gain select is 8 */ - kSPDIF_GAIN_6, /*!< Gain select is 6 */ - kSPDIF_GAIN_4, /*!< Gain select is 4 */ - kSPDIF_GAIN_3, /*!< Gain select is 3 */ -} spdif_gain_select_t; - -/*! @brief SPDIF tx data source */ -typedef enum _spdif_tx_source -{ - kSPDIF_txFromReceiver = 0x1U, /*!< Tx data directly through SPDIF receiver */ - kSPDIF_txNormal = 0x5U, /*!< Normal operation, data from processor */ -} spdif_tx_source_t; - -/*! @brief SPDIF tx data source */ -typedef enum _spdif_validity_config -{ - kSPDIF_validityFlagAlwaysSet = 0x0U, /*!< Outgoing validity flags always set */ - kSPDIF_validityFlagAlwaysClear, /*!< Outgoing validity flags always clear */ -} spdif_validity_config_t; - -/*! @brief The SPDIF interrupt enable flag */ -enum -{ - kSPDIF_RxDPLLLocked = SPDIF_SIE_LOCK_MASK, /*!< SPDIF DPLL locked */ - kSPDIF_TxFIFOError = SPDIF_SIE_TXUNOV_MASK, /*!< Tx FIFO underrun or overrun */ - kSPDIF_TxFIFOResync = SPDIF_SIE_TXRESYN_MASK, /*!< Tx FIFO left and right channel resync */ - kSPDIF_RxControlChannelChange = SPDIF_SIE_CNEW_MASK, /*!< SPDIF Rx control channel value changed */ - kSPDIF_ValidityFlagNoGood = SPDIF_SIE_VALNOGOOD_MASK, /*!< SPDIF validity flag no good */ - kSPDIF_RxIllegalSymbol = SPDIF_SIE_SYMERR_MASK, /*!< SPDIF receiver found illegal symbol */ - kSPDIF_RxParityBitError = SPDIF_SIE_BITERR_MASK, /*!< SPDIF receiver found parity bit error */ - kSPDIF_UChannelReceiveRegisterFull = SPDIF_SIE_URXFUL_MASK, /*!< SPDIF U channel revceive register full */ - kSPDIF_UChannelReceiveRegisterOverrun = SPDIF_SIE_URXOV_MASK, /*!< SPDIF U channel receive register overrun */ - kSPDIF_QChannelReceiveRegisterFull = SPDIF_SIE_QRXFUL_MASK, /*!< SPDIF Q channel receive reigster full */ - kSPDIF_QChannelReceiveRegisterOverrun = SPDIF_SIE_QRXOV_MASK, /*!< SPDIF Q channel receive register overrun */ - kSPDIF_UQChannelSync = SPDIF_SIE_UQSYNC_MASK, /*!< SPDIF U/Q channel sync found */ - kSPDIF_UQChannelFrameError = SPDIF_SIE_UQERR_MASK, /*!< SPDIF U/Q channel frame error */ - kSPDIF_RxFIFOError = SPDIF_SIE_RXFIFOUNOV_MASK, /*!< SPDIF Rx FIFO underrun/overrun */ - kSPDIF_RxFIFOResync = SPDIF_SIE_RXFIFORESYN_MASK, /*!< SPDIF Rx left and right FIFO resync */ - kSPDIF_LockLoss = SPDIF_SIE_LOCKLOSS_MASK, /*!< SPDIF receiver loss of lock */ - kSPDIF_TxFIFOEmpty = SPDIF_SIE_TXEM_MASK, /*!< SPDIF Tx FIFO empty */ - kSPDIF_RxFIFOFull = SPDIF_SIE_RXFIFOFUL_MASK, /*!< SPDIF Rx FIFO full */ - kSPDIF_AllInterrupt = kSPDIF_RxDPLLLocked | kSPDIF_TxFIFOError | kSPDIF_TxFIFOResync | - kSPDIF_RxControlChannelChange | kSPDIF_ValidityFlagNoGood | kSPDIF_RxIllegalSymbol | - kSPDIF_RxParityBitError | kSPDIF_UChannelReceiveRegisterFull | - kSPDIF_UChannelReceiveRegisterOverrun | kSPDIF_QChannelReceiveRegisterFull | - kSPDIF_QChannelReceiveRegisterOverrun | kSPDIF_UQChannelSync | kSPDIF_UQChannelFrameError | - kSPDIF_RxFIFOError | kSPDIF_RxFIFOResync | kSPDIF_LockLoss | kSPDIF_TxFIFOEmpty | - kSPDIF_RxFIFOFull, /*!< all interrupt */ -}; - -/*! @brief The DMA request sources */ -enum -{ - kSPDIF_RxDMAEnable = SPDIF_SCR_DMA_RX_EN_MASK, /*!< Rx FIFO full */ - kSPDIF_TxDMAEnable = SPDIF_SCR_DMA_TX_EN_MASK, /*!< Tx FIFO empty */ -}; - -/*! @brief SPDIF user configuration structure */ -typedef struct _spdif_config -{ - bool isTxAutoSync; /*!< If auto sync mechanism open */ - bool isRxAutoSync; /*!< If auto sync mechanism open */ - uint8_t DPLLClkSource; /*!< SPDIF DPLL clock source, range from 0~15, meaning is chip-specific */ - uint8_t txClkSource; /*!< SPDIF tx clock source, range from 0~7, meaning is chip-specific */ - spdif_rxfull_select_t rxFullSelect; /*!< SPDIF rx buffer full select */ - spdif_txempty_select_t txFullSelect; /*!< SPDIF tx buffer empty select */ - spdif_uchannel_source_t uChannelSrc; /*!< U channel source */ - spdif_tx_source_t txSource; /*!< SPDIF tx data source */ - spdif_validity_config_t validityConfig; /*!< Validity flag config */ - spdif_gain_select_t gain; /*!< Rx receive clock measure gain parameter. */ -} spdif_config_t; - -/*!@brief SPDIF transfer queue size, user can refine it according to use case. */ -#define SPDIF_XFER_QUEUE_SIZE (4U) - -/*! @brief SPDIF transfer structure */ -typedef struct _spdif_transfer -{ - uint8_t *data; /*!< Data start address to transfer. */ - uint8_t *qdata; /*!< Data buffer for Q channel */ - uint8_t *udata; /*!< Data buffer for C channel */ - size_t dataSize; /*!< Transfer size. */ -} spdif_transfer_t; - -typedef struct _spdif_handle spdif_handle_t; - -/*! @brief SPDIF transfer callback prototype */ -typedef void (*spdif_transfer_callback_t)(SPDIF_Type *base, spdif_handle_t *handle, status_t status, void *userData); - -/*! @brief SPDIF handle structure */ -struct _spdif_handle -{ - uint32_t state; /*!< Transfer status */ - spdif_transfer_callback_t callback; /*!< Callback function called at transfer event*/ - void *userData; /*!< Callback parameter passed to callback function*/ - spdif_transfer_t spdifQueue[SPDIF_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */ - size_t transferSize[SPDIF_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ - uint8_t watermark; /*!< Watermark value */ -}; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /*_cplusplus*/ - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief Initializes the SPDIF peripheral. - * - * Ungates the SPDIF clock, resets the module, and configures SPDIF with a configuration structure. - * The configuration structure can be custom filled or set with default values by - * SPDIF_GetDefaultConfig(). - * - * @note This API should be called at the beginning of the application to use - * the SPDIF driver. Otherwise, accessing the SPDIF module can cause a hard fault - * because the clock is not enabled. - * - * @param base SPDIF base pointer - * @param config SPDIF configuration structure. - */ -void SPDIF_Init(SPDIF_Type *base, const spdif_config_t *config); - -/*! - * @brief Sets the SPDIF configuration structure to default values. - * - * This API initializes the configuration structure for use in SPDIF_Init. - * The initialized structure can remain unchanged in SPDIF_Init, or it can be modified - * before calling SPDIF_Init. - * This is an example. - @code - spdif_config_t config; - SPDIF_GetDefaultConfig(&config); - @endcode - * - * @param config pointer to master configuration structure - */ -void SPDIF_GetDefaultConfig(spdif_config_t *config); - -/*! - * @brief De-initializes the SPDIF peripheral. - * - * This API gates the SPDIF clock. The SPDIF module can't operate unless SPDIF_Init is called to enable the clock. - * - * @param base SPDIF base pointer - */ -void SPDIF_Deinit(SPDIF_Type *base); - -/*! - * @brief Get the instance number for SPDIF. - * - * @param base SPDIF base pointer. - */ -uint32_t SPDIF_GetInstance(SPDIF_Type *base); - -/*! - * @brief Resets the SPDIF Tx. - * - * This function makes Tx FIFO in reset mode. - * - * @param base SPDIF base pointer - */ -static inline void SPDIF_TxFIFOReset(SPDIF_Type *base) -{ - base->SCR |= SPDIF_SCR_RXFIFO_RST_MASK; -} - -/*! - * @brief Resets the SPDIF Rx. - * - * This function enables the software reset and FIFO reset of SPDIF Rx. After reset, clear the reset bit. - * - * @param base SPDIF base pointer - */ -static inline void SPDIF_RxFIFOReset(SPDIF_Type *base) -{ - base->SCR |= SPDIF_SCR_RXFIFO_RST_MASK; -} - -/*! - * @brief Enables/disables the SPDIF Tx. - * - * @param base SPDIF base pointer - * @param enable True means enable SPDIF Tx, false means disable. - */ -void SPDIF_TxEnable(SPDIF_Type *base, bool enable); - -/*! - * @brief Enables/disables the SPDIF Rx. - * - * @param base SPDIF base pointer - * @param enable True means enable SPDIF Rx, false means disable. - */ -static inline void SPDIF_RxEnable(SPDIF_Type *base, bool enable) -{ - if (enable) - { - /* Open Rx FIFO */ - base->SCR &= ~(SPDIF_SCR_RXFIFO_CTRL_MASK | SPDIF_SCR_RXFIFO_OFF_ON_MASK); - } - else - { - base->SCR |= SPDIF_SCR_RXFIFO_OFF_ON_MASK; - } -} - -/*! @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the SPDIF status flag state. - * - * @param base SPDIF base pointer - * @return SPDIF status flag value. Use the _spdif_interrupt_enable_t to get the status value needed. - */ -static inline uint32_t SPDIF_GetStatusFlag(SPDIF_Type *base) -{ - return base->SIS; -} - -/*! - * @brief Clears the SPDIF status flag state. - * - * @param base SPDIF base pointer - * @param mask State mask. It can be a combination of the _spdif_interrupt_enable_t member. Notice these members - * cannot be included, as these flags cannot be cleared by writing 1 to these bits: - * @arg kSPDIF_UChannelReceiveRegisterFull - * @arg kSPDIF_QChannelReceiveRegisterFull - * @arg kSPDIF_TxFIFOEmpty - * @arg kSPDIF_RxFIFOFull - */ -static inline void SPDIF_ClearStatusFlags(SPDIF_Type *base, uint32_t mask) -{ - base->SIC = mask; -} - -/*! @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the SPDIF Tx interrupt requests. - * - * @param base SPDIF base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSPDIF_WordStartInterruptEnable - * @arg kSPDIF_SyncErrorInterruptEnable - * @arg kSPDIF_FIFOWarningInterruptEnable - * @arg kSPDIF_FIFORequestInterruptEnable - * @arg kSPDIF_FIFOErrorInterruptEnable - */ -static inline void SPDIF_EnableInterrupts(SPDIF_Type *base, uint32_t mask) -{ - base->SIE |= mask; -} - -/*! - * @brief Disables the SPDIF Tx interrupt requests. - * - * @param base SPDIF base pointer - * @param mask interrupt source - * The parameter can be a combination of the following sources if defined. - * @arg kSPDIF_WordStartInterruptEnable - * @arg kSPDIF_SyncErrorInterruptEnable - * @arg kSPDIF_FIFOWarningInterruptEnable - * @arg kSPDIF_FIFORequestInterruptEnable - * @arg kSPDIF_FIFOErrorInterruptEnable - */ -static inline void SPDIF_DisableInterrupts(SPDIF_Type *base, uint32_t mask) -{ - base->SIE &= ~mask; -} - -/*! @} */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Enables/disables the SPDIF DMA requests. - * @param base SPDIF base pointer - * @param mask SPDIF DMA enable mask, The parameter can be a combination of the following sources if defined - * @arg kSPDIF_RxDMAEnable - * @arg kSPDIF_TxDMAEnable - * @param enable True means enable DMA, false means disable DMA. - */ -static inline void SPDIF_EnableDMA(SPDIF_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->SCR |= mask; - } - else - { - base->SCR &= ~mask; - } -} - -/*! - * @brief Gets the SPDIF Tx left data register address. - * - * This API is used to provide a transfer address for the SPDIF DMA transfer configuration. - * - * @param base SPDIF base pointer. - * @return data register address. - */ -static inline uint32_t SPDIF_TxGetLeftDataRegisterAddress(SPDIF_Type *base) -{ - return (uint32_t)(&(base->STL)); -} - -/*! - * @brief Gets the SPDIF Tx right data register address. - * - * This API is used to provide a transfer address for the SPDIF DMA transfer configuration. - * - * @param base SPDIF base pointer. - * @return data register address. - */ -static inline uint32_t SPDIF_TxGetRightDataRegisterAddress(SPDIF_Type *base) -{ - return (uint32_t)(&(base->STR)); -} - -/*! - * @brief Gets the SPDIF Rx left data register address. - * - * This API is used to provide a transfer address for the SPDIF DMA transfer configuration. - * - * @param base SPDIF base pointer. - * @return data register address. - */ -static inline uint32_t SPDIF_RxGetLeftDataRegisterAddress(SPDIF_Type *base) -{ - return (uint32_t)(&(base->SRL)); -} - -/*! - * @brief Gets the SPDIF Rx right data register address. - * - * This API is used to provide a transfer address for the SPDIF DMA transfer configuration. - * - * @param base SPDIF base pointer. - * @return data register address. - */ -static inline uint32_t SPDIF_RxGetRightDataRegisterAddress(SPDIF_Type *base) -{ - return (uint32_t)(&(base->SRR)); -} - -/*! @} */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Configures the SPDIF Tx sample rate. - * - * The audio format can be changed at run-time. This function configures the sample rate. - * - * @param base SPDIF base pointer. - * @param sampleRate_Hz SPDIF sample rate frequency in Hz. - * @param sourceClockFreq_Hz SPDIF tx clock source frequency in Hz. - */ -void SPDIF_TxSetSampleRate(SPDIF_Type *base, uint32_t sampleRate_Hz, uint32_t sourceClockFreq_Hz); - -/*! - * @brief Configures the SPDIF Rx audio format. - * - * The audio format can be changed at run-time. This function configures the sample rate and audio data - * format to be transferred. - * - * @param base SPDIF base pointer. - * @param clockSourceFreq_Hz SPDIF system clock frequency in hz. - */ -uint32_t SPDIF_GetRxSampleRate(SPDIF_Type *base, uint32_t clockSourceFreq_Hz); - -/*! - * @brief Sends data using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SPDIF base pointer. - * @param buffer Pointer to the data to be written. - * @param size Bytes to be written. - */ -void SPDIF_WriteBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size); - -/*! - * @brief Writes data into SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @param data Data needs to be written. - */ -static inline void SPDIF_WriteLeftData(SPDIF_Type *base, uint32_t data) -{ - base->STL = data; -} - -/*! - * @brief Writes data into SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @param data Data needs to be written. - */ -static inline void SPDIF_WriteRightData(SPDIF_Type *base, uint32_t data) -{ - base->STR = data; -} - -/*! - * @brief Writes data into SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @param data Data needs to be written. - */ -static inline void SPDIF_WriteChannelStatusHigh(SPDIF_Type *base, uint32_t data) -{ - base->STCSCH = data; -} - -/*! - * @brief Writes data into SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @param data Data needs to be written. - */ -static inline void SPDIF_WriteChannelStatusLow(SPDIF_Type *base, uint32_t data) -{ - base->STCSCL = data; -} - -/*! - * @brief Receives data using a blocking method. - * - * @note This function blocks by polling until data is ready to be sent. - * - * @param base SPDIF base pointer. - * @param buffer Pointer to the data to be read. - * @param size Bytes to be read. - */ -void SPDIF_ReadBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size); - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadLeftData(SPDIF_Type *base) -{ - return base->SRL; -} - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadRightData(SPDIF_Type *base) -{ - return base->SRR; -} - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadChannelStatusHigh(SPDIF_Type *base) -{ - return base->SRCSH; -} - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadChannelStatusLow(SPDIF_Type *base) -{ - return base->SRCSL; -} - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadQChannel(SPDIF_Type *base) -{ - return base->SRQ; -} - -/*! - * @brief Reads data from the SPDIF FIFO. - * - * @param base SPDIF base pointer. - * @return Data in SPDIF FIFO. - */ -static inline uint32_t SPDIF_ReadUChannel(SPDIF_Type *base) -{ - return base->SRU; -} - -/*! @} */ - -/*! - * @name Transactional - * @{ - */ - -/*! - * @brief Initializes the SPDIF Tx handle. - * - * This function initializes the Tx handle for the SPDIF Tx transactional APIs. Call - * this function once to get the handle initialized. - * - * @param base SPDIF base pointer - * @param handle SPDIF handle pointer. - * @param callback Pointer to the user callback function. - * @param userData User parameter passed to the callback function - */ -void SPDIF_TransferTxCreateHandle(SPDIF_Type *base, - spdif_handle_t *handle, - spdif_transfer_callback_t callback, - void *userData); - -/*! - * @brief Initializes the SPDIF Rx handle. - * - * This function initializes the Rx handle for the SPDIF Rx transactional APIs. Call - * this function once to get the handle initialized. - * - * @param base SPDIF base pointer. - * @param handle SPDIF handle pointer. - * @param callback Pointer to the user callback function. - * @param userData User parameter passed to the callback function. - */ -void SPDIF_TransferRxCreateHandle(SPDIF_Type *base, - spdif_handle_t *handle, - spdif_transfer_callback_t callback, - void *userData); - -/*! - * @brief Performs an interrupt non-blocking send transfer on SPDIF. - * - * @note This API returns immediately after the transfer initiates. - * Call the SPDIF_TxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer - * is finished. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * @param xfer Pointer to the spdif_transfer_t structure. - * @retval kStatus_Success Successfully started the data receive. - * @retval kStatus_SPDIF_TxBusy Previous receive still not finished. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SPDIF_TransferSendNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer); - -/*! - * @brief Performs an interrupt non-blocking receive transfer on SPDIF. - * - * @note This API returns immediately after the transfer initiates. - * Call the SPDIF_RxGetTransferStatusIRQ to poll the transfer status and check whether - * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer - * is finished. - * - * @param base SPDIF base pointer - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * @param xfer Pointer to the spdif_transfer_t structure. - * @retval kStatus_Success Successfully started the data receive. - * @retval kStatus_SPDIF_RxBusy Previous receive still not finished. - * @retval kStatus_InvalidArgument The input parameter is invalid. - */ -status_t SPDIF_TransferReceiveNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer); - -/*! - * @brief Gets a set byte count. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * @param count Bytes count sent. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SPDIF_TransferGetSendCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count); - -/*! - * @brief Gets a received byte count. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - * @param count Bytes count received. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. - */ -status_t SPDIF_TransferGetReceiveCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count); - -/*! - * @brief Aborts the current send. - * - * @note This API can be called any time when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - */ -void SPDIF_TransferAbortSend(SPDIF_Type *base, spdif_handle_t *handle); - -/*! - * @brief Aborts the current IRQ receive. - * - * @note This API can be called when an interrupt non-blocking transfer initiates - * to abort the transfer early. - * - * @param base SPDIF base pointer - * @param handle Pointer to the spdif_handle_t structure which stores the transfer state. - */ -void SPDIF_TransferAbortReceive(SPDIF_Type *base, spdif_handle_t *handle); - -/*! - * @brief Tx interrupt handler. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure. - */ -void SPDIF_TransferTxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle); - -/*! - * @brief Tx interrupt handler. - * - * @param base SPDIF base pointer. - * @param handle Pointer to the spdif_handle_t structure. - */ -void SPDIF_TransferRxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /*_cplusplus*/ - -/*! @} */ - -#endif /* _FSL_SPDIF_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_spdif_edma.c b/devices/MIMXRT1052/drivers/fsl_spdif_edma.c deleted file mode 100644 index 88b95bd..0000000 --- a/devices/MIMXRT1052/drivers/fsl_spdif_edma.c +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_spdif_edma.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.spdif_edma" -#endif - -/******************************************************************************* - * Definitations - ******************************************************************************/ -/* Used for 32byte aligned */ -#define STCD_ADDR(address) (edma_tcd_t *)(((uint32_t)(address) + 32U) & ~0x1FU) - -/*handle; - - /* If finished a block, call the callback function */ - (void)memset(&spdifHandle->spdifQueue[spdifHandle->queueDriver], 0, sizeof(spdif_edma_transfer_t)); - spdifHandle->queueDriver = (spdifHandle->queueDriver + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - if (spdifHandle->callback != NULL) - { - (spdifHandle->callback)(privHandle->base, spdifHandle, kStatus_SPDIF_TxIdle, spdifHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (spdifHandle->spdifQueue[spdifHandle->queueDriver].rightData == NULL) - { - SPDIF_TransferAbortSendEDMA(privHandle->base, spdifHandle); - } -} - -static void SPDIF_RxEDMACallback(edma_handle_t *handle, void *userData, bool done, uint32_t tcds) -{ - spdif_edma_private_handle_t *privHandle = (spdif_edma_private_handle_t *)userData; - spdif_edma_handle_t *spdifHandle = privHandle->handle; - - /* If finished a block, call the callback function */ - (void)memset(&spdifHandle->spdifQueue[spdifHandle->queueDriver], 0, sizeof(spdif_edma_transfer_t)); - spdifHandle->queueDriver = (spdifHandle->queueDriver + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - if (spdifHandle->callback != NULL) - { - (spdifHandle->callback)(privHandle->base, spdifHandle, kStatus_SPDIF_RxIdle, spdifHandle->userData); - } - - /* If all data finished, just stop the transfer */ - if (spdifHandle->spdifQueue[spdifHandle->queueDriver].rightData == NULL) - { - SPDIF_TransferAbortReceiveEDMA(privHandle->base, spdifHandle); - } -} - -static status_t SPDIF_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config, uint32_t rightChannel) -{ - edma_tcd_t *tcdRegs = (edma_tcd_t *)(uint32_t)&handle->base->TCD[handle->channel]; - uint32_t primask; - uint16_t csr; - int8_t currentTcd; - int8_t previousTcd; - int8_t nextTcd; - int8_t tcdUsed = handle->tcdUsed; - int8_t tcdSize = handle->tcdSize; - - /* Check if tcd pool is full. */ - primask = DisableGlobalIRQ(); - if (tcdUsed >= tcdSize) - { - EnableGlobalIRQ(primask); - - return kStatus_EDMA_QueueFull; - } - currentTcd = handle->tail; - handle->tcdUsed++; - /* Calculate index of next TCD */ - nextTcd = currentTcd + 0x01; - if (nextTcd == handle->tcdSize) - { - nextTcd = 0x00; - } - /* Advance queue tail index */ - handle->tail = nextTcd; - EnableGlobalIRQ(primask); - /* Calculate index of previous TCD */ - previousTcd = (currentTcd != 0x00) ? (currentTcd - 0x01) : (handle->tcdSize - 0x01); - /* Configure current TCD block. */ - EDMA_TcdReset(&handle->tcdPool[currentTcd]); - EDMA_TcdSetTransferConfig(&handle->tcdPool[currentTcd], config, NULL); - /* Set channel link */ - EDMA_TcdSetChannelLink(&handle->tcdPool[currentTcd], kEDMA_MinorLink, rightChannel); - EDMA_TcdSetChannelLink(&handle->tcdPool[currentTcd], kEDMA_MajorLink, rightChannel); - /* Enable major interrupt */ - handle->tcdPool[currentTcd].CSR |= DMA_CSR_INTMAJOR_MASK; - /* Link current TCD with next TCD for identification of current TCD */ - handle->tcdPool[currentTcd].DLAST_SGA = (uint32_t)&handle->tcdPool[nextTcd]; - /* Chain from previous descriptor unless tcd pool size is 1(this descriptor is its own predecessor). */ - if (currentTcd != previousTcd) - { - /* Enable scatter/gather feature in the previous TCD block. */ - csr = (handle->tcdPool[previousTcd].CSR | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; - handle->tcdPool[previousTcd].CSR = csr; - /* - Check if the TCD block in the registers is the previous one (points to current TCD block). It - is used to check if the previous TCD linked has been loaded in TCD register. If so, it need to - link the TCD register in case link the current TCD with the dead chain when TCD loading occurs - before link the previous TCD block. - */ - if (tcdRegs->DLAST_SGA == (uint32_t)&handle->tcdPool[currentTcd]) - { - /* Enable scatter/gather also in the TCD registers. */ - csr = (tcdRegs->CSR | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; - /* Must write the CSR register one-time, because the transfer maybe finished anytime. */ - tcdRegs->CSR = csr; - /* - It is very important to check the ESG bit! - Because this hardware design: if DONE bit is set, the ESG bit can not be set. So it can - be used to check if the dynamic TCD link operation is successful. If ESG bit is not set - and the DLAST_SGA is not the next TCD address(it means the dynamic TCD link succeed and - the current TCD block has been loaded into TCD registers), it means transfer finished - and TCD link operation fail, so must install TCD content into TCD registers and enable - transfer again. And if ESG is set, it means transfer has notfinished, so TCD dynamic - link succeed. - */ - if ((tcdRegs->CSR & DMA_CSR_ESG_MASK) != 0x00U) - { - return kStatus_Success; - } - /* - Check whether the current TCD block is already loaded in the TCD registers. It is another - condition when ESG bit is not set: it means the dynamic TCD link succeed and the current - TCD block has been loaded into TCD registers. - */ - if (tcdRegs->DLAST_SGA == (uint32_t)&handle->tcdPool[nextTcd]) - { - return kStatus_Success; - } - /* - If go to this, means the previous transfer finished, and the DONE bit is set. - So shall configure TCD registers. - */ - } - else if (tcdRegs->DLAST_SGA != 0x00U) - { - /* The current TCD block has been linked successfully. */ - return kStatus_Success; - } - else - { - /* - DLAST_SGA is 0 and it means the first submit transfer, so shall configure - TCD registers. - */ - } - } - /* There is no live chain, TCD block need to be installed in TCD registers. */ - EDMA_InstallTCD(handle->base, handle->channel, &handle->tcdPool[currentTcd]); - /* Enable channel request again. */ - if ((handle->flags & 0x80U) != 0x00U) - { - handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); - } - else - { - ; /* Intentional empty */ - } - - return kStatus_Success; -} - -/*! - * brief Initializes the SPDIF eDMA handle. - * - * This function initializes the SPDIF master DMA handle, which can be used for other SPDIF master transactional APIs. - * Usually, for a specified SPDIF instance, call this API once to get the initialized handle. - * - * param base SPDIF base pointer. - * param handle SPDIF eDMA handle pointer. - * param base SPDIF peripheral base address. - * param callback Pointer to user callback function. - * param userData User parameter passed to the callback function. - * param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users. - * param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users. - */ -void SPDIF_TransferTxCreateHandleEDMA(SPDIF_Type *base, - spdif_edma_handle_t *handle, - spdif_edma_callback_t callback, - void *userData, - edma_handle_t *dmaLeftHandle, - edma_handle_t *dmaRightHandle) -{ - assert(handle != NULL); - assert(dmaLeftHandle != NULL); - assert(dmaRightHandle != NULL); - - uint32_t instance = SPDIF_GetInstance(base); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set spdif base to handle */ - handle->dmaLeftHandle = dmaLeftHandle; - handle->dmaRightHandle = dmaRightHandle; - handle->callback = callback; - handle->userData = userData; - handle->count = - s_spdif_tx_watermark[(base->SCR & SPDIF_SCR_TXFIFOEMPTY_SEL_MASK) >> SPDIF_SCR_TXFIFOEMPTY_SEL_SHIFT]; - - /* Set SPDIF state to idle */ - handle->state = kSPDIF_Idle; - - s_edmaPrivateHandle[instance][0].base = base; - s_edmaPrivateHandle[instance][0].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(dmaLeftHandle, STCD_ADDR(handle->leftTcd), SPDIF_XFER_QUEUE_SIZE); - EDMA_InstallTCDMemory(dmaRightHandle, STCD_ADDR(handle->rightTcd), SPDIF_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel, only right channel finished, a transfer finished */ - EDMA_SetCallback(dmaRightHandle, SPDIF_TxEDMACallback, &s_edmaPrivateHandle[instance][0]); -} - -/*! - * brief Initializes the SPDIF Rx eDMA handle. - * - * This function initializes the SPDIF slave DMA handle, which can be used for other SPDIF master transactional APIs. - * Usually, for a specified SPDIF instance, call this API once to get the initialized handle. - * - * param base SPDIF base pointer. - * param handle SPDIF eDMA handle pointer. - * param base SPDIF peripheral base address. - * param callback Pointer to user callback function. - * param userData User parameter passed to the callback function. - * param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users. - * param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users. - */ -void SPDIF_TransferRxCreateHandleEDMA(SPDIF_Type *base, - spdif_edma_handle_t *handle, - spdif_edma_callback_t callback, - void *userData, - edma_handle_t *dmaLeftHandle, - edma_handle_t *dmaRightHandle) -{ - assert(handle != NULL); - assert(dmaLeftHandle != NULL); - assert(dmaRightHandle != NULL); - - uint32_t instance = SPDIF_GetInstance(base); - - /* Zero the handle */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set spdif base to handle */ - handle->dmaLeftHandle = dmaLeftHandle; - handle->dmaRightHandle = dmaRightHandle; - handle->callback = callback; - handle->userData = userData; - handle->count = s_spdif_rx_watermark[(base->SCR & SPDIF_SCR_RXFIFOFULL_SEL_MASK) >> SPDIF_SCR_RXFIFOFULL_SEL_SHIFT]; - - /* Set SPDIF state to idle */ - handle->state = kSPDIF_Idle; - - s_edmaPrivateHandle[instance][1].base = base; - s_edmaPrivateHandle[instance][1].handle = handle; - - /* Need to use scatter gather */ - EDMA_InstallTCDMemory(dmaLeftHandle, STCD_ADDR(handle->leftTcd), SPDIF_XFER_QUEUE_SIZE); - EDMA_InstallTCDMemory(dmaRightHandle, STCD_ADDR(handle->rightTcd), SPDIF_XFER_QUEUE_SIZE); - - /* Install callback for Tx dma channel */ - EDMA_SetCallback(dmaRightHandle, SPDIF_RxEDMACallback, &s_edmaPrivateHandle[instance][1]); -} - -/*! - * brief Performs a non-blocking SPDIF transfer using DMA. - * - * note This interface returns immediately after the transfer initiates. Call - * SPDIF_GetTransferStatus to poll the transfer status and check whether the SPDIF transfer is finished. - * - * param base SPDIF base pointer. - * param handle SPDIF eDMA handle pointer. - * param xfer Pointer to the DMA transfer structure. - * retval kStatus_Success Start a SPDIF eDMA send successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - * retval kStatus_TxBusy SPDIF is busy sending data. - */ -status_t SPDIF_TransferSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - pvoid_to_u32_t destAddr; - edma_transfer_config_t config = {0}; - destAddr.u32 = SPDIF_TxGetLeftDataRegisterAddress(base); - - /* Check if input parameter invalid */ - if ((xfer->leftData == NULL) || (xfer->dataSize == 0U) || (xfer->rightData == NULL)) - { - return kStatus_InvalidArgument; - } - - if ((handle->spdifQueue[handle->queueUser].leftData != NULL) || - (handle->spdifQueue[handle->queueUser].rightData != NULL)) - { - return kStatus_SPDIF_QueueFull; - } - - /* Change the state of handle */ - handle->state = kSPDIF_Busy; - - /* Update the queue state */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->spdifQueue[handle->queueUser].leftData = xfer->leftData; - handle->spdifQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->spdifQueue[handle->queueUser].rightData = xfer->rightData; - handle->queueUser = (handle->queueUser + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - - /* Store the initially configured eDMA minor byte transfer count into the SPDIF handle */ - handle->nbytes = handle->count * 8U; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, xfer->leftData, 4U, destAddr.pvoid, 4U, (uint32_t)handle->count * 4U, xfer->dataSize, - kEDMA_MemoryToPeripheral); - (void)SPDIF_SubmitTransfer(handle->dmaLeftHandle, &config, handle->dmaRightHandle->channel); - - /* Prepare right channel */ - destAddr.u32 = SPDIF_TxGetRightDataRegisterAddress(base); - EDMA_PrepareTransfer(&config, xfer->rightData, 4U, destAddr.pvoid, 4U, (uint32_t)handle->count * 4U, xfer->dataSize, - kEDMA_MemoryToPeripheral); - (void)EDMA_SubmitTransfer(handle->dmaRightHandle, &config); - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaLeftHandle); - EDMA_StartTransfer(handle->dmaRightHandle); - - /* Enable DMA enable bit */ - SPDIF_EnableDMA(base, kSPDIF_TxDMAEnable, true); - - /* Enable SPDIF Tx clock */ - SPDIF_TxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Performs a non-blocking SPDIF receive using eDMA. - * - * note This interface returns immediately after the transfer initiates. Call - * the SPDIF_GetReceiveRemainingBytes to poll the transfer status and check whether the SPDIF transfer is finished. - * - * param base SPDIF base pointer - * param handle SPDIF eDMA handle pointer. - * param xfer Pointer to DMA transfer structure. - * retval kStatus_Success Start a SPDIF eDMA receive successfully. - * retval kStatus_InvalidArgument The input argument is invalid. - * retval kStatus_RxBusy SPDIF is busy receiving data. - */ -status_t SPDIF_TransferReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer) -{ - assert(handle != NULL); - assert(xfer != NULL); - - pvoid_to_u32_t srcAddr; - edma_transfer_config_t config = {0}; - srcAddr.u32 = SPDIF_RxGetLeftDataRegisterAddress(base); - - /* Check if input parameter invalid */ - if ((xfer->leftData == NULL) || (xfer->dataSize == 0U) || (xfer->rightData == NULL)) - { - return kStatus_InvalidArgument; - } - - if ((handle->spdifQueue[handle->queueUser].leftData != NULL) || - (handle->spdifQueue[handle->queueUser].rightData != NULL)) - { - return kStatus_SPDIF_QueueFull; - } - - /* Change the state of handle */ - handle->state = kSPDIF_Busy; - - /* Update the queue state */ - handle->transferSize[handle->queueUser] = xfer->dataSize; - handle->spdifQueue[handle->queueUser].leftData = xfer->leftData; - handle->spdifQueue[handle->queueUser].dataSize = xfer->dataSize; - handle->spdifQueue[handle->queueUser].rightData = xfer->rightData; - handle->queueUser = (handle->queueUser + 0x01U) % SPDIF_XFER_QUEUE_SIZE; - - /* Store the initially configured eDMA minor byte transfer count into the SPDIF handle */ - handle->nbytes = handle->count * 8U; - - /* Prepare edma configure */ - EDMA_PrepareTransfer(&config, srcAddr.pvoid, 4U, xfer->leftData, 4U, (uint32_t)handle->count * 4U, xfer->dataSize, - kEDMA_PeripheralToMemory); - /* Use specific submit function to enable channel link */ - (void)SPDIF_SubmitTransfer(handle->dmaLeftHandle, &config, handle->dmaRightHandle->channel); - - /* Prepare right channel */ - srcAddr.u32 = SPDIF_RxGetRightDataRegisterAddress(base); - EDMA_PrepareTransfer(&config, srcAddr.pvoid, 4U, xfer->rightData, 4U, (uint32_t)handle->count * 4U, xfer->dataSize, - kEDMA_PeripheralToMemory); - (void)EDMA_SubmitTransfer(handle->dmaRightHandle, &config); - - /* Start DMA transfer */ - EDMA_StartTransfer(handle->dmaLeftHandle); - EDMA_StartTransfer(handle->dmaRightHandle); - - /* Enable DMA enable bit */ - SPDIF_EnableDMA(base, kSPDIF_RxDMAEnable, true); - - /* Enable SPDIF Rx clock */ - SPDIF_RxEnable(base, true); - - return kStatus_Success; -} - -/*! - * brief Aborts a SPDIF transfer using eDMA. - * - * param base SPDIF base pointer. - * param handle SPDIF eDMA handle pointer. - */ -void SPDIF_TransferAbortSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaLeftHandle); - EDMA_AbortTransfer(handle->dmaRightHandle); - - /* Disable DMA enable bit */ - SPDIF_EnableDMA(base, kSPDIF_TxDMAEnable, false); - - /* Set internal state */ - (void)memset(handle->spdifQueue, 0, sizeof(handle->spdifQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - handle->queueUser = 0U; - handle->queueDriver = 0U; - - /* Set the handle state */ - handle->state = kSPDIF_Idle; -} - -/*! - * brief Aborts a SPDIF receive using eDMA. - * - * param base SPDIF base pointer - * param handle SPDIF eDMA handle pointer. - */ -void SPDIF_TransferAbortReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle) -{ - assert(handle != NULL); - - /* Disable dma */ - EDMA_AbortTransfer(handle->dmaLeftHandle); - EDMA_AbortTransfer(handle->dmaRightHandle); - - /* Disable DMA enable bit */ - SPDIF_EnableDMA(base, kSPDIF_RxDMAEnable, false); - - /* Set internal state */ - (void)memset(handle->spdifQueue, 0, sizeof(handle->spdifQueue)); - (void)memset(handle->transferSize, 0, sizeof(handle->transferSize)); - handle->queueUser = 0U; - handle->queueDriver = 0U; - - /* Set the handle state */ - handle->state = kSPDIF_Idle; -} - -/*! - * brief Gets byte count sent by SPDIF. - * - * param base SPDIF base pointer. - * param handle SPDIF eDMA handle pointer. - * param count Bytes count sent by SPDIF. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SPDIF_TransferGetSendCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kSPDIF_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaRightHandle->base, handle->dmaRightHandle->channel)); - } - - return status; -} - -/*! - * brief Gets byte count received by SPDIF. - * - * param base SPDIF base pointer - * param handle SPDIF eDMA handle pointer. - * param count Bytes count received by SPDIF. - * retval kStatus_Success Succeed get the transfer count. - * retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SPDIF_TransferGetReceiveCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count) -{ - assert(handle != NULL); - - status_t status = kStatus_Success; - - if (handle->state != (uint32_t)kSPDIF_Busy) - { - status = kStatus_NoTransferInProgress; - } - else - { - *count = (handle->transferSize[handle->queueDriver] - - (uint32_t)handle->nbytes * - EDMA_GetRemainingMajorLoopCount(handle->dmaRightHandle->base, handle->dmaRightHandle->channel)); - } - - return status; -} diff --git a/devices/MIMXRT1052/drivers/fsl_spdif_edma.h b/devices/MIMXRT1052/drivers/fsl_spdif_edma.h deleted file mode 100644 index 964bf1e..0000000 --- a/devices/MIMXRT1052/drivers/fsl_spdif_edma.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2017-2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_SPDIF_EDMA_H_ -#define _FSL_SPDIF_EDMA_H_ - -#include "fsl_spdif.h" -#include "fsl_edma.h" - -/*! - * @addtogroup spdif_edma - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_SPDIF_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) /*!< Version 2.0.5 */ -/*@}*/ - -typedef struct _spdif_edma_handle spdif_edma_handle_t; - -/*! @brief SPDIF eDMA transfer callback function for finish and error */ -typedef void (*spdif_edma_callback_t)(SPDIF_Type *base, spdif_edma_handle_t *handle, status_t status, void *userData); - -/*! @brief SPDIF transfer structure */ -typedef struct _spdif_edma_transfer -{ - uint8_t *leftData; /*!< Data start address to transfer. */ - uint8_t *rightData; /*!< Data start address to transfer. */ - size_t dataSize; /*!< Transfer size. */ -} spdif_edma_transfer_t; - -/*! @brief SPDIF DMA transfer handle, users should not touch the content of the handle.*/ -struct _spdif_edma_handle -{ - edma_handle_t *dmaLeftHandle; /*!< DMA handler for SPDIF left channel */ - edma_handle_t *dmaRightHandle; /*!< DMA handler for SPDIF right channel */ - uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ - uint8_t count; /*!< The transfer data count in a DMA request */ - uint32_t state; /*!< Internal state for SPDIF eDMA transfer */ - spdif_edma_callback_t callback; /*!< Callback for users while transfer finish or error occurs */ - void *userData; /*!< User callback parameter */ - edma_tcd_t leftTcd[SPDIF_XFER_QUEUE_SIZE + 1U]; /*!< TCD pool for eDMA transfer. */ - edma_tcd_t rightTcd[SPDIF_XFER_QUEUE_SIZE + 1U]; /*!< TCD pool for eDMA transfer. */ - spdif_edma_transfer_t spdifQueue[SPDIF_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ - size_t transferSize[SPDIF_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer, left and right are the same, so use - one */ - volatile uint8_t queueUser; /*!< Index for user to queue transfer. */ - volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ -}; - -/******************************************************************************* - * APIs - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name eDMA Transactional - * @{ - */ - -/*! - * @brief Initializes the SPDIF eDMA handle. - * - * This function initializes the SPDIF master DMA handle, which can be used for other SPDIF master transactional APIs. - * Usually, for a specified SPDIF instance, call this API once to get the initialized handle. - * - * @param base SPDIF base pointer. - * @param handle SPDIF eDMA handle pointer. - * @param base SPDIF peripheral base address. - * @param callback Pointer to user callback function. - * @param userData User parameter passed to the callback function. - * @param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users. - * @param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users. - */ -void SPDIF_TransferTxCreateHandleEDMA(SPDIF_Type *base, - spdif_edma_handle_t *handle, - spdif_edma_callback_t callback, - void *userData, - edma_handle_t *dmaLeftHandle, - edma_handle_t *dmaRightHandle); - -/*! - * @brief Initializes the SPDIF Rx eDMA handle. - * - * This function initializes the SPDIF slave DMA handle, which can be used for other SPDIF master transactional APIs. - * Usually, for a specified SPDIF instance, call this API once to get the initialized handle. - * - * @param base SPDIF base pointer. - * @param handle SPDIF eDMA handle pointer. - * @param base SPDIF peripheral base address. - * @param callback Pointer to user callback function. - * @param userData User parameter passed to the callback function. - * @param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users. - * @param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users. - */ -void SPDIF_TransferRxCreateHandleEDMA(SPDIF_Type *base, - spdif_edma_handle_t *handle, - spdif_edma_callback_t callback, - void *userData, - edma_handle_t *dmaLeftHandle, - edma_handle_t *dmaRightHandle); - -/*! - * @brief Performs a non-blocking SPDIF transfer using DMA. - * - * @note This interface returns immediately after the transfer initiates. Call - * SPDIF_GetTransferStatus to poll the transfer status and check whether the SPDIF transfer is finished. - * - * @param base SPDIF base pointer. - * @param handle SPDIF eDMA handle pointer. - * @param xfer Pointer to the DMA transfer structure. - * @retval kStatus_Success Start a SPDIF eDMA send successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - * @retval kStatus_TxBusy SPDIF is busy sending data. - */ -status_t SPDIF_TransferSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer); - -/*! - * @brief Performs a non-blocking SPDIF receive using eDMA. - * - * @note This interface returns immediately after the transfer initiates. Call - * the SPDIF_GetReceiveRemainingBytes to poll the transfer status and check whether the SPDIF transfer is finished. - * - * @param base SPDIF base pointer - * @param handle SPDIF eDMA handle pointer. - * @param xfer Pointer to DMA transfer structure. - * @retval kStatus_Success Start a SPDIF eDMA receive successfully. - * @retval kStatus_InvalidArgument The input argument is invalid. - * @retval kStatus_RxBusy SPDIF is busy receiving data. - */ -status_t SPDIF_TransferReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer); - -/*! - * @brief Aborts a SPDIF transfer using eDMA. - * - * @param base SPDIF base pointer. - * @param handle SPDIF eDMA handle pointer. - */ -void SPDIF_TransferAbortSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle); - -/*! - * @brief Aborts a SPDIF receive using eDMA. - * - * @param base SPDIF base pointer - * @param handle SPDIF eDMA handle pointer. - */ -void SPDIF_TransferAbortReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle); - -/*! - * @brief Gets byte count sent by SPDIF. - * - * @param base SPDIF base pointer. - * @param handle SPDIF eDMA handle pointer. - * @param count Bytes count sent by SPDIF. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SPDIF_TransferGetSendCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count); - -/*! - * @brief Gets byte count received by SPDIF. - * - * @param base SPDIF base pointer - * @param handle SPDIF eDMA handle pointer. - * @param count Bytes count received by SPDIF. - * @retval kStatus_Success Succeed get the transfer count. - * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress. - */ -status_t SPDIF_TransferGetReceiveCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count); - -/*! @} */ - -#if defined(__cplusplus) -} -#endif - -/*! - * @} - */ -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_src.c b/devices/MIMXRT1052/drivers/fsl_src.c deleted file mode 100644 index 10af228..0000000 --- a/devices/MIMXRT1052/drivers/fsl_src.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_src.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.src" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Clear the status flags of SRC. - * - * param base SRC peripheral base address. - * param Mask value of status flags to be cleared, see to #_src_reset_status_flags. - */ -void SRC_ClearResetStatusFlags(SRC_Type *base, uint32_t flags) -{ - uint32_t tmp32 = base->SRSR; - - if (0U != (SRC_SRSR_TSR_MASK & flags)) - { - tmp32 &= ~SRC_SRSR_TSR_MASK; /* Write 0 to clear. */ - } - - if (0U != (SRC_SRSR_W1C_BITS_MASK & flags)) - { - tmp32 |= (SRC_SRSR_W1C_BITS_MASK & flags); /* Write 1 to clear. */ - } - - base->SRSR = tmp32; -} diff --git a/devices/MIMXRT1052/drivers/fsl_src.h b/devices/MIMXRT1052/drivers/fsl_src.h deleted file mode 100644 index 33ebf14..0000000 --- a/devices/MIMXRT1052/drivers/fsl_src.h +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_SRC_H_ -#define _FSL_SRC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup src - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief SRC driver version 2.0.1. */ -#define FSL_SRC_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) -/*@}*/ - -/*! - * @brief SRC reset status flags. - */ -enum _src_reset_status_flags -{ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_RESET_OUT) && FSL_FEATURE_SRC_HAS_SRSR_RESET_OUT) - kSRC_ResetOutputEnableFlag = SRC_SRSR_RESET_OUT_MASK, /*!< This bit indicates if RESET status is - driven out on PTE0 pin. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_RESET_OUT */ -#if !(defined(FSL_FEATURE_SRC_HAS_NO_SRSR_WBI) && FSL_FEATURE_SRC_HAS_NO_SRSR_WBI) - kSRC_WarmBootIndicationFlag = SRC_SRSR_WBI_MASK, /*!< WARM boot indication shows that WARM boot - was initiated by software. */ -#endif /* FSL_FEATURE_SRC_HAS_NO_SRSR_WBI */ - kSRC_TemperatureSensorResetFlag = SRC_SRSR_TSR_MASK, /*!< Indicates whether the reset was the - result of software reset from on-chip - Temperature Sensor. Temperature Sensor - Interrupt needs to be served before this - bit can be cleaned.*/ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_WDOG3_RST_B) && FSL_FEATURE_SRC_HAS_SRSR_WDOG3_RST_B) - kSRC_Wdog3ResetFlag = SRC_SRSR_WDOG3_RST_B_MASK, /*!< IC Watchdog3 Time-out reset. Indicates - whether the reset was the result of the - watchdog3 time-out event. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_WDOG3_RST_B */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_SW) && FSL_FEATURE_SRC_HAS_SRSR_SW) - kSRC_SoftwareResetFlag = SRC_SRSR_SW_MASK, /*!< Indicates a reset has been caused by software - setting of SYSRESETREQ bit in Application - Interrupt and Reset Control Register in the - ARM core. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_SW */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_JTAG_SW_RST) && FSL_FEATURE_SRC_HAS_SRSR_JTAG_SW_RST) - kSRC_JTAGSystemResetFlag = - SRC_SRSR_JTAG_SW_RST_MASK, /*!< Indicates whether the reset was the result of software reset form JTAG */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_JTAG_SW_RST */ - kSRC_JTAGSoftwareResetFlag = SRC_SRSR_SJC_MASK, /*!< Indicates whether the reset was the result of - setting SJC_GPCCR bit 31. */ - kSRC_JTAGGeneratedResetFlag = SRC_SRSR_JTAG_MASK, /*!< Indicates a reset has been caused by JTAG - selection of certain IR codes: EXTEST or - HIGHZ. */ - kSRC_WatchdogResetFlag = SRC_SRSR_WDOG_MASK, /*!< Indicates a reset has been caused by the - watchdog timer timing out. This reset source - can be blocked by disabling the watchdog. */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_IPP_USER_RESET_B) && FSL_FEATURE_SRC_HAS_SRSR_IPP_USER_RESET_B) - kSRC_IppUserResetFlag = SRC_SRSR_IPP_USER_RESET_B_MASK, /*!< Indicates whether the reset was the - result of the ipp_user_reset_b - qualified reset. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_IPP_USER_RESET_B */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_SNVS) && FSL_FEATURE_SRC_HAS_SRSR_SNVS) - kSRC_SNVSFailResetFlag = SRC_SRSR_SNVS_MASK, /*!< SNVS hardware failure will always cause a cold - reset. This flag indicates whether the reset - is a result of SNVS hardware failure. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_SNVS */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_CSU_RESET_B) && FSL_FEATURE_SRC_HAS_SRSR_CSU_RESET_B) - kSRC_CsuResetFlag = SRC_SRSR_CSU_RESET_B_MASK, /*!< Indicates whether the reset was the result - of the csu_reset_b input. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_CSU_RESET_B */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_LOCKUP) && FSL_FEATURE_SRC_HAS_SRSR_LOCKUP) - kSRC_CoreLockupResetFlag = SRC_SRSR_LOCKUP_MASK, /*!< Indicates a reset has been caused by the - ARM core indication of a LOCKUP event. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_LOCKUP */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_POR) && FSL_FEATURE_SRC_HAS_SRSR_POR) - kSRC_PowerOnResetFlag = SRC_SRSR_POR_MASK, /*!< Indicates a reset has been caused by the - power-on detection logic. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_POR */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_LOCKUP_SYSRESETREQ) && FSL_FEATURE_SRC_HAS_SRSR_LOCKUP_SYSRESETREQ) - kSRC_LockupSysResetFlag = - SRC_SRSR_LOCKUP_SYSRESETREQ_MASK, /*!< Indicates a reset has been caused by CPU lockup or software - setting of SYSRESETREQ bit in Application Interrupt and - Reset Control Register of the ARM core. */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_LOCKUP_SYSRESETREQ */ -#if (defined(FSL_FEATURE_SRC_HAS_SRSR_IPP_RESET_B) && FSL_FEATURE_SRC_HAS_SRSR_IPP_RESET_B) - kSRC_IppResetPinFlag = SRC_SRSR_IPP_RESET_B_MASK, /*!< Indicates whether reset was the result of - ipp_reset_b pin (Power-up sequence). */ -#endif /* FSL_FEATURE_SRC_HAS_SRSR_IPP_RESET_B */ -}; - -#if (defined(FSL_FEATURE_SRC_HAS_SISR) && FSL_FEATURE_SRC_HAS_SISR) -/*! - * @brief SRC interrupt status flag. - */ -enum _src_status_flags -{ - kSRC_Core0WdogResetReqFlag = - SRC_SISR_CORE0_WDOG_RST_REQ_MASK, /*!< WDOG reset request from core0. Read-only status bit. */ -}; -#endif /* FSL_FEATURE_SRC_HAS_SISR */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH) && FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH) -/*! - * @brief Selection of SoC mix power reset stretch. - * - * This type defines the SoC mix (Audio, ENET, uSDHC, EIM, QSPI, OCRAM, MMDC, etc) power up reset - * stretch mix reset width with the optional count of cycles - */ -typedef enum _src_mix_reset_stretch_cycles -{ - kSRC_MixResetStretchCycleAlt0 = 0U, /*!< mix reset width is 1 x 88 ipg_cycle cycles. */ - kSRC_MixResetStretchCycleAlt1 = 1U, /*!< mix reset width is 2 x 88 ipg_cycle cycles. */ - kSRC_MixResetStretchCycleAlt2 = 2U, /*!< mix reset width is 3 x 88 ipg_cycle cycles. */ - kSRC_MixResetStretchCycleAlt3 = 3U, /*!< mix reset width is 4 x 88 ipg_cycle cycles. */ -} src_mix_reset_stretch_cycles_t; -#endif /* FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN) && FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN) -/*! - * @brief Selection of WDOG3 reset option. - */ -typedef enum _src_wdog3_reset_option -{ - kSRC_Wdog3ResetOptionAlt0 = 0U, /*!< Wdog3_rst_b asserts M4 reset (default). */ - kSRC_Wdog3ResetOptionAlt1 = 1U, /*!< Wdog3_rst_b asserts global reset. */ -} src_wdog3_reset_option_t; -#endif /* FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN */ - -/*! - * @brief Selection of WARM reset bypass count. - * - * This type defines the 32KHz clock cycles to count before bypassing the MMDC acknowledge for WARM - * reset. If the MMDC acknowledge is not asserted before this counter is elapsed, a COLD reset will - * be initiated. - */ -typedef enum _src_warm_reset_bypass_count -{ - kSRC_WarmResetWaitAlways = 0U, /*!< System will wait until MMDC acknowledge is asserted. */ - kSRC_WarmResetWaitClk16 = 1U, /*!< Wait 16 32KHz clock cycles before switching the reset. */ - kSRC_WarmResetWaitClk32 = 2U, /*!< Wait 32 32KHz clock cycles before switching the reset. */ - kSRC_WarmResetWaitClk64 = 3U, /*!< Wait 64 32KHz clock cycles before switching the reset. */ -} src_warm_reset_bypass_count_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_MASK_WDOG3_RST) && FSL_FEATURE_SRC_HAS_SCR_MASK_WDOG3_RST) -/*! - * @brief Enable the WDOG3 reset. - * - * The WDOG3 reset is enabled by default. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableWDOG3Reset(SRC_Type *base, bool enable) -{ - if (enable) - { - base->SCR = (base->SCR & ~SRC_SCR_MASK_WDOG3_RST_MASK) | SRC_SCR_MASK_WDOG3_RST(0xA); - } - else - { - base->SCR = (base->SCR & ~SRC_SCR_MASK_WDOG3_RST_MASK) | SRC_SCR_MASK_WDOG3_RST(0x5); - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_MASK_WDOG3_RST */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH) && FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH) -/*! - * @brief Set the mix power up reset stretch mix reset width. - * - * @param base SRC peripheral base address. - * @param option Setting option, see to #src_mix_reset_stretch_cycles_t. - */ -static inline void SRC_SetMixResetStretchCycles(SRC_Type *base, src_mix_reset_stretch_cycles_t option) -{ - base->SCR = (base->SCR & ~SRC_SCR_MIX_RST_STRCH_MASK) | SRC_SCR_MIX_RST_STRCH(option); -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_MIX_RST_STRCH */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_DBG_RST_MSK_PG) && FSL_FEATURE_SRC_HAS_SCR_DBG_RST_MSK_PG) -/*! - * @brief Debug reset would be asserted after power gating event. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableCoreDebugResetAfterPowerGate(SRC_Type *base, bool enable) -{ - if (enable) - { - base->SCR &= ~SRC_SCR_DBG_RST_MSK_PG_MASK; - } - else - { - base->SCR |= SRC_SCR_DBG_RST_MSK_PG_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_DBG_RST_MSK_PG */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN) && FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN) -/*! - * @brief Set the Wdog3_rst_b option. - * - * @param base SRC peripheral base address. - * @param option Setting option, see to #src_wdog3_reset_option_t. - */ -static inline void SRC_SetWdog3ResetOption(SRC_Type *base, src_wdog3_reset_option_t option) -{ - base->SCR = (base->SCR & ~SRC_SCR_WDOG3_RST_OPTN_MASK) | SRC_SCR_WDOG3_RST_OPTN(option); -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_WDOG3_RST_OPTN */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_CORES_DBG_RST) && FSL_FEATURE_SRC_HAS_SCR_CORES_DBG_RST) -/*! - * @brief Software reset for debug of arm platform only. - * - * @param base SRC peripheral base address. - */ -static inline void SRC_DoSoftwareResetARMCoreDebug(SRC_Type *base) -{ - base->SCR |= SRC_SCR_CORES_DBG_RST_MASK; -} - -/*! - * @brief Check if the software reset for debug of arm platform only is done. - * - * @param base SRC peripheral base address. - */ -static inline bool SRC_GetSoftwareResetARMCoreDebugDone(SRC_Type *base) -{ - return (0U == (base->SCR & SRC_SCR_CORES_DBG_RST_MASK)); -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_CORES_DBG_RST */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_MTSR) && FSL_FEATURE_SRC_HAS_SCR_MTSR) -/*! - * @brief Enable the temperature sensor reset. - * - * The temperature sersor reset is enabled by default. When the sensor reset happens, an flag bit - * would be asserted. This flag bit can be cleared only by the hardware reset. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableTemperatureSensorReset(SRC_Type *base, bool enable) -{ - if (enable) /* Temperature sensor reset is not masked. (default) */ - { - base->SCR = (base->SCR & ~SRC_SCR_MTSR_MASK) | SRC_SCR_MTSR(0x2); - } - else /* The on-chip temperature sensor interrupt will not create a reset to the chip. */ - { - base->SCR = (base->SCR & ~SRC_SCR_MTSR_MASK) | SRC_SCR_MTSR(0x5); - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_MTSR */ - -#if (defined(FSL_FEATURE_SCR_HAS_SCR_CORE0_DBG_RST) && FSL_FEATURE_SCR_HAS_SCR_CORE0_DBG_RST) -/*! - * @brief Do assert the core0 debug reset. - * - * @param base SRC peripheral base address. - */ -static inline void SRC_DoAssertCore0DebugReset(SRC_Type *base) -{ - base->SCR |= SRC_SCR_CORE0_DBG_RST_MASK; -} - -/*! - * @brief Check if the core0 debug reset is done. - * - * @param base SRC peripheral base address. - */ -static inline bool SRC_GetAssertCore0DebugResetDone(SRC_Type *base) -{ - return (0U == (base->SCR & SRC_SCR_CORE0_DBG_RST_MASK)); -} -#endif /* FSL_FEATURE_SCR_HAS_SCR_CORE0_DBG_RST */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_CORE0_RST) && FSL_FEATURE_SRC_HAS_SCR_CORE0_RST) -/*! - * @brief Do software reset the ARM core0 only. - * - * @param base SRC peripheral base address. - */ -static inline void SRC_DoSoftwareResetARMCore0(SRC_Type *base) -{ - base->SCR |= SRC_SCR_CORE0_RST_MASK; -} - -/*! - * @brief Check if the software for ARM core0 is done. - * - * @param base SRC peripheral base address. - * @return If the reset is done. - */ -static inline bool SRC_GetSoftwareResetARMCore0Done(SRC_Type *base) -{ - return (0U == (base->SCR & SRC_SCR_CORE0_RST_MASK)); -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_CORE0_RST */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_SWRC) && FSL_FEATURE_SRC_HAS_SCR_SWRC) -/*! - * @brief Do software reset for ARM core. - * - * This function can be used to assert the ARM core reset. Once it is called, the reset process will - * begin. After the reset process is finished, the command bit would be self cleared. - * - * @param base SRC peripheral base address. - */ -static inline void SRC_DoSoftwareResetARMCore(SRC_Type *base) -{ - base->SCR |= SRC_SCR_SWRC_MASK; -} - -/*! - * @brief Check if the software for ARM core is done. - * - * @param base SRC peripheral base address. - * @return If the reset is done. - */ -static inline bool SRC_GetSoftwareResetARMCoreDone(SRC_Type *base) -{ - return (0U == (base->SCR & SRC_SCR_SWRC_MASK)); -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_SWRC */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_EIM_RST) && FSL_FEATURE_SRC_HAS_SCR_EIM_RST) -/*! - * @brief Assert the EIM reset. - * - * EIM reset is needed in order to reconfigure the EIM chip select. - * The software reset bit must de-asserted since this is not self-refresh. - * - * @param base SRC peripheral base address. - * @param enable Make the assertion or not. - */ -static inline void SRC_AssertEIMReset(SRC_Type *base, bool enable) -{ - if (enable) - { - base->SCR |= SRC_SCR_EIM_RST_MASK; - } - else - { - base->SCR &= ~SRC_SCR_EIM_RST_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_EIM_RST */ - -/*! - * @brief Enable the WDOG Reset in SRC. - * - * WDOG Reset is enabled in SRC by default. If the WDOG event to SRC is masked, it would not create - * a reset to the chip. During the time the WDOG event is masked, when the WDOG event flag is - * asserted, it would remain asserted regardless of servicing the WDOG module. The only way to clear - * that bit is the hardware reset. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableWDOGReset(SRC_Type *base, bool enable) -{ - if (enable) /* WDOG Reset is not masked in SRC (default). */ - { - base->SCR = (base->SCR & ~SRC_SCR_MWDR_MASK) | SRC_SCR_MWDR(0xA); - } - else /* WDOG Reset is masked in SRC. */ - { - base->SCR = (base->SCR & ~SRC_SCR_MWDR_MASK) | SRC_SCR_MWDR(0x5); - } -} - -#if !(defined(FSL_FEATURE_SRC_HAS_NO_SCR_WRBC) && FSL_FEATURE_SRC_HAS_NO_SCR_WRBC) -/*! - * @brief Set the delay count of waiting MMDC's acknowledge. - * - * This function would define the 32KHz clock cycles to count before bypassing the MMDC acknowledge - * for WARM reset. If the MMDC acknowledge is not asserted before this counter is elapsed, a COLD - * reset will be initiated. - * - * @param base SRC peripheral base address. - * @param option The option of setting mode, see to #src_warm_reset_bypass_count_t. - */ -static inline void SRC_SetWarmResetBypassCount(SRC_Type *base, src_warm_reset_bypass_count_t option) -{ - base->SCR = (base->SCR & ~SRC_SCR_WRBC_MASK) | SRC_SCR_WRBC(option); -} -#endif /* FSL_FEATURE_SRC_HAS_NO_SCR_WRBC */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_LOCKUP_RST) && FSL_FEATURE_SRC_HAS_SCR_LOCKUP_RST) -/*! - * @brief Enable the lockup reset. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableLockupReset(SRC_Type *base, bool enable) -{ - if (enable) /* Enable lockup reset. */ - { - base->SCR |= SRC_SCR_LOCKUP_RST_MASK; - } - else /* Disable lockup reset. */ - { - base->SCR &= ~SRC_SCR_LOCKUP_RST_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_LOCKUP_RST */ - -#if (defined(FSL_FEATURE_SRC_HAS_SCR_LUEN) && FSL_FEATURE_SRC_HAS_SCR_LUEN) -/*! - * @brief Enable the core lockup reset. - * - * When enable the core luckup reset, the system would be reset when core luckup event happens. - * - * @param base SRC peripheral base address. - * @param enable Enable the reset or not. - */ -static inline void SRC_EnableCoreLockupReset(SRC_Type *base, bool enable) -{ - if (enable) /* Core lockup will cause system reset. */ - { - base->SCR |= SRC_SCR_LUEN_MASK; - } - else /* Core lockup will not cause system reset. */ - { - base->SCR &= ~SRC_SCR_LUEN_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_SCR_LUEN */ - -#if !(defined(FSL_FEATURE_SRC_HAS_NO_SCR_WRE) && FSL_FEATURE_SRC_HAS_NO_SCR_WRE) -/*! - * @brief Enable the WARM reset. - * - * Only when the WARM reset is enabled, the WARM reset requests would be served by WARM reset. - * Otherwise, all the WARM reset sources would generate COLD reset. - * - * @param base SRC peripheral base address. - * @param enable Enable the WARM reset or not. - */ -static inline void SRC_EnableWarmReset(SRC_Type *base, bool enable) -{ - if (enable) - { - base->SCR |= SRC_SCR_WRE_MASK; - } - else - { - base->SCR &= ~SRC_SCR_WRE_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_NO_SCR_WRE */ - -#if (defined(FSL_FEATURE_SRC_HAS_SISR) && FSL_FEATURE_SRC_HAS_SISR) -/*! - * @brief Get interrupt status flags. - * - * @param base SRC peripheral base address. - * @return Mask value of status flags. See to $_src_status_flags. - */ -static inline uint32_t SRC_GetStatusFlags(SRC_Type *base) -{ - return base->SISR; -} -#endif /* FSL_FEATURE_SRC_HAS_SISR */ - -/*! - * @brief Get the boot mode register 1 value. - * - * The Boot Mode register contains bits that reflect the status of BOOT_CFGx pins of the chip. - * See to chip-specific document for detail information about value. - * - * @param base SRC peripheral base address. - * @return status of BOOT_CFGx pins of the chip. - */ -static inline uint32_t SRC_GetBootModeWord1(SRC_Type *base) -{ - return base->SBMR1; -} - -/*! - * @brief Get the boot mode register 2 value. - * - * The Boot Mode register contains bits that reflect the status of BOOT_MODEx Pins and fuse values - * that controls boot of the chip. See to chip-specific document for detail information about value. - * - * @param base SRC peripheral base address. - * @return status of BOOT_MODEx Pins and fuse values that controls boot of the chip. - */ -static inline uint32_t SRC_GetBootModeWord2(SRC_Type *base) -{ - return base->SBMR2; -} - -#if !(defined(FSL_FEATURE_SRC_HAS_NO_SRSR_WBI) && FSL_FEATURE_SRC_HAS_NO_SRSR_WBI) -/*! - * @brief Set the warm boot indication flag. - * - * WARM boot indication shows that WARM boot was initiated by software. This indicates to the - * software that it saved the needed information in the memory before initiating the WARM reset. - * In this case, software will set this bit to '1', before initiating the WARM reset. The warm_boot - * bit should be used as indication only after a warm_reset sequence. Software should clear this bit - * after warm_reset to indicate that the next warm_reset is not performed with warm_boot. - * - * @param base SRC peripheral base address. - * @param enable Assert the flag or not. - */ -static inline void SRC_SetWarmBootIndication(SRC_Type *base, bool enable) -{ - if (enable) - { - base->SRSR = (base->SRSR & ~SRC_SRSR_W1C_BITS_MASK) | SRC_SRSR_WBI_MASK; - } - else - { - base->SRSR = (base->SRSR & ~SRC_SRSR_W1C_BITS_MASK) & ~SRC_SRSR_WBI_MASK; - } -} -#endif /* FSL_FEATURE_SRC_HAS_NO_SRSR_WBI */ - -/*! - * @brief Get the status flags of SRC. - * - * @param base SRC peripheral base address. - * @return Mask value of status flags, see to #_src_reset_status_flags. - */ -static inline uint32_t SRC_GetResetStatusFlags(SRC_Type *base) -{ - return base->SRSR; -} - -/*! - * @brief Clear the status flags of SRC. - * - * @param base SRC peripheral base address. - * @param flags value of status flags to be cleared, see to #_src_reset_status_flags. - */ -void SRC_ClearResetStatusFlags(SRC_Type *base, uint32_t flags); - -/*! - * @brief Set value to general purpose registers. - * - * General purpose registers (GPRx) would hold the value during reset process. Wakeup function could - * be kept in these register. For example, the GPR1 holds the entry function for waking-up from - * Partial SLEEP mode while the GPR2 holds the argument. Other GPRx register would store the - * arbitray values. - * - * @param base SRC peripheral base address. - * @param index The index of GPRx register array. Note index 0 reponses the GPR1 register. - * @param value Setting value for GPRx register. - */ -static inline void SRC_SetGeneralPurposeRegister(SRC_Type *base, uint32_t index, uint32_t value) -{ - assert(index < SRC_GPR_COUNT); - - base->GPR[index] = value; -} - -/*! - * @brief Get the value from general purpose registers. - * - * @param base SRC peripheral base address. - * @param index The index of GPRx register array. Note index 0 reponses the GPR1 register. - * @return The setting value for GPRx register. - */ -static inline uint32_t SRC_GetGeneralPurposeRegister(SRC_Type *base, uint32_t index) -{ - assert(index < SRC_GPR_COUNT); - - return base->GPR[index]; -} - -#if defined(__cplusplus) -} -#endif -/*! - * @} - */ -#endif /* _FSL_SRC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_tempmon.c b/devices/MIMXRT1052/drivers/fsl_tempmon.c deleted file mode 100644 index dacf986..0000000 --- a/devices/MIMXRT1052/drivers/fsl_tempmon.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2018-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_tempmon.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.tempmon" -#endif - -/*! @brief TEMPMON calibration data mask. */ -#define TEMPMON_HOTTEMPMASK 0xFFU -#define TEMPMON_HOTTEMPSHIFT 0x00U -#define TEMPMON_HOTCOUNTMASK 0xFFF00U -#define TEMPMON_HOTCOUNTSHIFT 0X08U -#define TEMPMON_ROOMCOUNTMASK 0xFFF00000U -#define TEMPMON_ROOMCOUNTSHIFT 0x14U - -/*! @brief the room temperature. */ -#define TEMPMON_ROOMTEMP 25.0f - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -static uint32_t s_hotTemp; /*!< The value of TEMPMON_TEMPSENSE0[TEMP_VALUE] at room temperature .*/ -static uint32_t s_hotCount; /*!< The value of TEMPMON_TEMPSENSE0[TEMP_VALUE] at the hot temperature.*/ -static float s_hotT_ROOM; /*!< The value of s_hotTemp minus room temperature(25��).*/ -static uint32_t s_roomC_hotC; /*!< The value of s_roomCount minus s_hotCount.*/ - -/******************************************************************************* - * Code - ******************************************************************************/ -/*! - * brief Initializes the TEMPMON module. - * - * param base TEMPMON base pointer - * param config Pointer to configuration structure. - */ -void TEMPMON_Init(TEMPMON_Type *base, const tempmon_config_t *config) -{ - assert(NULL != config); - - uint32_t calibrationData; - uint32_t roomCount; - - /* Power on the temperature sensor*/ - base->TEMPSENSE0 &= ~TEMPMON_TEMPSENSE0_POWER_DOWN_MASK; - - /* Set temperature monitor frequency */ - base->TEMPSENSE1 = TEMPMON_TEMPSENSE1_MEASURE_FREQ(config->frequency); - - /* ready to read calibration data */ - calibrationData = OCOTP->ANA1; - s_hotTemp = (uint32_t)(calibrationData & TEMPMON_HOTTEMPMASK) >> TEMPMON_HOTTEMPSHIFT; - s_hotCount = (uint32_t)(calibrationData & TEMPMON_HOTCOUNTMASK) >> TEMPMON_HOTCOUNTSHIFT; - roomCount = (uint32_t)(calibrationData & TEMPMON_ROOMCOUNTMASK) >> TEMPMON_ROOMCOUNTSHIFT; - - s_hotT_ROOM = (float)s_hotTemp - TEMPMON_ROOMTEMP; - s_roomC_hotC = roomCount - s_hotCount; - - /* Set alarm temperature */ - TEMPMON_SetTempAlarm(base, config->highAlarmTemp, kTEMPMON_HighAlarmMode); - TEMPMON_SetTempAlarm(base, config->panicAlarmTemp, kTEMPMON_PanicAlarmMode); - TEMPMON_SetTempAlarm(base, config->lowAlarmTemp, kTEMPMON_LowAlarmMode); -} - -/*! - * brief Deinitializes the TEMPMON module. - * - * param base TEMPMON base pointer - */ -void TEMPMON_Deinit(TEMPMON_Type *base) -{ - base->TEMPSENSE0 |= TEMPMON_TEMPSENSE0_POWER_DOWN_MASK; -} - -/*! - * brief Gets the default configuration structure. - * - * This function initializes the TEMPMON configuration structure to a default value. The default - * values are: - * tempmonConfig->frequency = 0x02U; - * tempmonConfig->highAlarmTemp = 44U; - * tempmonConfig->panicAlarmTemp = 90U; - * tempmonConfig->lowAlarmTemp = 39U; - * - * param config Pointer to a configuration structure. - */ -void TEMPMON_GetDefaultConfig(tempmon_config_t *config) -{ - assert(config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - /* Default measure frequency */ - config->frequency = 0x03U; - /* Default high alarm temperature */ - config->highAlarmTemp = 40U; - /* Default panic alarm temperature */ - config->panicAlarmTemp = 90U; - /* Default low alarm temperature */ - config->lowAlarmTemp = 20U; -} - -/*! - * brief Get current temperature with the fused temperature calibration data. - * - * param base TEMPMON base pointer - * return current temperature with degrees Celsius. - */ -float TEMPMON_GetCurrentTemperature(TEMPMON_Type *base) -{ - /* Check arguments */ - assert(NULL != base); - - uint32_t nmeas; - float tmeas; - - while (0U == (base->TEMPSENSE0 & TEMPMON_TEMPSENSE0_FINISHED_MASK)) - { - } - - /* ready to read temperature code value */ - nmeas = (base->TEMPSENSE0 & TEMPMON_TEMPSENSE0_TEMP_CNT_MASK) >> TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT; - - /* Calculate temperature */ - tmeas = (float)s_hotTemp - (((float)nmeas - (float)s_hotCount) * s_hotT_ROOM / (float)s_roomC_hotC); - - return tmeas; -} - -/*! - * brief Set the temperature count (raw sensor output) that will generate an alarm interrupt. - * - * param base TEMPMON base pointer - * param tempVal The alarm temperature with degrees Celsius - * param alarmMode The alarm mode. - */ -void TEMPMON_SetTempAlarm(TEMPMON_Type *base, uint32_t tempVal, tempmon_alarm_mode alarmMode) -{ - /* Check arguments */ - assert(NULL != base); - /* Different SOC has different qualified temperature level based on AEC-Q100 standard by default, such as Consumer(0 - to +95 degrees celsius)/Industrial(-40 to +105 degrees celsius)/Automotive(-40 to +125 degrees celsius). */ - assert(s_hotTemp >= tempVal); - - uint32_t tempCodeVal; - uint32_t tempRegVal; - - /* Calculate alarm temperature code value */ - tempCodeVal = (uint32_t)(s_hotCount + (s_hotTemp - tempVal) * s_roomC_hotC / (uint32_t)s_hotT_ROOM); - - switch (alarmMode) - { - case kTEMPMON_HighAlarmMode: - /* Clear alarm value and set a new high alarm temperature code value */ - tempRegVal = base->TEMPSENSE0; - tempRegVal = - (tempRegVal & ~TEMPMON_TEMPSENSE0_ALARM_VALUE_MASK) | TEMPMON_TEMPSENSE0_ALARM_VALUE(tempCodeVal); - base->TEMPSENSE0 = tempRegVal; - break; - - case kTEMPMON_PanicAlarmMode: - /* Clear panic alarm value and set a new panic alarm temperature code value */ - tempRegVal = base->TEMPSENSE2; - tempRegVal = (tempRegVal & ~TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE_MASK) | - TEMPMON_TEMPSENSE2_PANIC_ALARM_VALUE(tempCodeVal); - base->TEMPSENSE2 = tempRegVal; - break; - - case kTEMPMON_LowAlarmMode: - /* Clear low alarm value and set a new low alarm temperature code value */ - tempRegVal = base->TEMPSENSE2; - tempRegVal = (tempRegVal & ~TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE_MASK) | - TEMPMON_TEMPSENSE2_LOW_ALARM_VALUE(tempCodeVal); - base->TEMPSENSE2 = tempRegVal; - break; - - default: - assert(false); - break; - } -} diff --git a/devices/MIMXRT1052/drivers/fsl_tempmon.h b/devices/MIMXRT1052/drivers/fsl_tempmon.h deleted file mode 100644 index 84619b1..0000000 --- a/devices/MIMXRT1052/drivers/fsl_tempmon.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2018-2021 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_TEMPMON_H_ -#define _FSL_TEMPMON_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup tempmon - * @{ - */ - -/*! @file */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -#define FSL_TEMPMON_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) /*!< Version 2.0.3 */ -/*@}*/ - -/*! @brief TEMPMON temperature structure. */ -typedef struct _tempmon_config -{ - uint16_t frequency; /*!< The temperature measure frequency.*/ - uint32_t highAlarmTemp; /*!< The high alarm temperature.*/ - uint32_t panicAlarmTemp; /*!< The panic alarm temperature.*/ - uint32_t lowAlarmTemp; /*!< The low alarm temperature.*/ -} tempmon_config_t; - -/*! @brief TEMPMON alarm mode. */ -typedef enum _tempmon_alarm_mode -{ - kTEMPMON_HighAlarmMode = 0U, /*!< The high alarm temperature interrupt mode.*/ - kTEMPMON_PanicAlarmMode = 1U, /*!< The panic alarm temperature interrupt mode.*/ - kTEMPMON_LowAlarmMode = 2U, /*!< The low alarm temperature interrupt mode.*/ -} tempmon_alarm_mode; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Initializes the TEMPMON module. - * - * @param base TEMPMON base pointer - * @param config Pointer to configuration structure. - */ -void TEMPMON_Init(TEMPMON_Type *base, const tempmon_config_t *config); - -/*! - * @brief Deinitializes the TEMPMON module. - * - * @param base TEMPMON base pointer - */ -void TEMPMON_Deinit(TEMPMON_Type *base); - -/*! - * @brief Gets the default configuration structure. - * - * This function initializes the TEMPMON configuration structure to a default value. The default - * values are: - * tempmonConfig->frequency = 0x02U; - * tempmonConfig->highAlarmTemp = 44U; - * tempmonConfig->panicAlarmTemp = 90U; - * tempmonConfig->lowAlarmTemp = 39U; - * - * @param config Pointer to a configuration structure. - */ -void TEMPMON_GetDefaultConfig(tempmon_config_t *config); - -/*! - * @brief start the temperature measurement process. - * - * @param base TEMPMON base pointer. - */ -static inline void TEMPMON_StartMeasure(TEMPMON_Type *base) -{ - base->TEMPSENSE0 |= TEMPMON_TEMPSENSE0_MEASURE_TEMP_MASK; -} - -/*! - * @brief stop the measurement process. - * - * @param base TEMPMON base pointer - */ -static inline void TEMPMON_StopMeasure(TEMPMON_Type *base) -{ - base->TEMPSENSE0 &= ~TEMPMON_TEMPSENSE0_MEASURE_TEMP_MASK; -} - -/*! - * @brief Get current temperature with the fused temperature calibration data. - * - * @param base TEMPMON base pointer - * @return current temperature with degrees Celsius. - */ -float TEMPMON_GetCurrentTemperature(TEMPMON_Type *base); - -/*! - * @brief Set the temperature count (raw sensor output) that will generate an alarm interrupt. - * - * @param base TEMPMON base pointer - * @param tempVal The alarm temperature with degrees Celsius - * @param alarmMode The alarm mode. - */ -void TEMPMON_SetTempAlarm(TEMPMON_Type *base, uint32_t tempVal, tempmon_alarm_mode alarmMode); - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* _FSL_TEMPMON_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_trng.c b/devices/MIMXRT1052/drivers/fsl_trng.c deleted file mode 100644 index b6acf42..0000000 --- a/devices/MIMXRT1052/drivers/fsl_trng.c +++ /dev/null @@ -1,1945 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017, 2020-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#include "fsl_trng.h" - -#if defined(FSL_FEATURE_SOC_TRNG_COUNT) && FSL_FEATURE_SOC_TRNG_COUNT - -/******************************************************************************* - * Definitions - *******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.trng" -#endif - -/* Default values for user configuration structure.*/ -#if (defined(KW40Z4_SERIES) || defined(KW41Z4_SERIES) || defined(KW31Z4_SERIES) || defined(KW21Z4_SERIES) || \ - defined(MCIMX7U5_M4_SERIES) || defined(KW36Z4_SERIES) || defined(KW37A4_SERIES) || defined(KW37Z4_SERIES) || \ - defined(KW38A4_SERIES) || defined(KW38Z4_SERIES) || defined(KW39A4_SERIES) || defined(KW35Z4_SERIES) || \ - defined(KW36A4_SERIES) || defined(KW35A4_SERIES) || defined(KW34A4_SERIES)) -#define TRNG_USER_CONFIG_DEFAULT_OSC_DIV kTRNG_RingOscDiv8 -#elif (defined(KV56F24_SERIES) || defined(KV58F24_SERIES) || defined(KL28Z7_SERIES) || defined(KL81Z7_SERIES) || \ - defined(KL82Z7_SERIES) || defined(K32L2A41A_SERIES)) -#define TRNG_USER_CONFIG_DEFAULT_OSC_DIV kTRNG_RingOscDiv4 -#elif defined(K81F25615_SERIES) -#define TRNG_USER_CONFIG_DEFAULT_OSC_DIV kTRNG_RingOscDiv2 -#else -/* Default value for the TRNG user configuration structure can be optionally - defined by device specific preprocessor macros. */ -#if defined(FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_OSC_DIV) && \ - (FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_OSC_DIV > 0) -#define TRNG_USER_CONFIG_DEFAULT_OSC_DIV (FSL_FEATURE_TRNG_USER_CONFIG_DEFAULT_OSC_DIV_VALUE) -#else -#define TRNG_USER_CONFIG_DEFAULT_OSC_DIV kTRNG_RingOscDiv0 -#endif -#endif - -#define TRNG_USER_CONFIG_DEFAULT_LOCK 0 -#define TRNG_USER_CONFIG_DEFAULT_ENTROPY_DELAY 3200 -#define TRNG_USER_CONFIG_DEFAULT_SAMPLE_SIZE 2500 -#define TRNG_USER_CONFIG_DEFAULT_SPARSE_BIT_LIMIT 63 -#define TRNG_USER_CONFIG_DEFAULT_RETRY_COUNT 1 -#define TRNG_USER_CONFIG_DEFAULT_RUN_MAX_LIMIT 34 - -#define TRNG_USER_CONFIG_DEFAULT_MONOBIT_MAXIMUM 1384 -#define TRNG_USER_CONFIG_DEFAULT_MONOBIT_MINIMUM (TRNG_USER_CONFIG_DEFAULT_MONOBIT_MAXIMUM - 268) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT1_MAXIMUM 405 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT1_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT1_MAXIMUM - 178) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT2_MAXIMUM 220 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT2_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT2_MAXIMUM - 122) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT3_MAXIMUM 125 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT3_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT3_MAXIMUM - 88) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT4_MAXIMUM 75 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT4_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT4_MAXIMUM - 64) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT5_MAXIMUM 47 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT5_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT5_MAXIMUM - 46) -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT6PLUS_MAXIMUM 47 -#define TRNG_USER_CONFIG_DEFAULT_RUNBIT6PLUS_MINIMUM (TRNG_USER_CONFIG_DEFAULT_RUNBIT6PLUS_MAXIMUM - 46) -#define TRNG_USER_CONFIG_DEFAULT_POKER_MAXIMUM 26912 -#define TRNG_USER_CONFIG_DEFAULT_POKER_MINIMUM (TRNG_USER_CONFIG_DEFAULT_POKER_MAXIMUM - 2467) - -#if defined(FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM) && \ - (FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM > 0) -#define TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM (FSL_FEATURE_TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM_VALUE) -#else -#define TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM 25600 -#endif - -#if defined(FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM) && \ - (FSL_FEATURE_TRNG_FORCE_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM > 0) -#define TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM (FSL_FEATURE_TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM_VALUE) -#else -#define TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM 1600 -#endif - -/*! @brief TRNG work mode */ -typedef enum _trng_work_mode -{ - kTRNG_WorkModeRun = 0U, /*!< Run Mode. */ - kTRNG_WorkModeProgram = 1U /*!< Program Mode. */ -} trng_work_mode_t; - -/*! @brief TRNG statistical check type*/ -typedef enum _trng_statistical_check -{ - kTRNG_StatisticalCheckMonobit = - 1U, /*!< Statistical check of number of ones/zero detected during entropy generation. */ - kTRNG_StatisticalCheckRunBit1, /*!< Statistical check of number of runs of length 1 detected during entropy - generation. */ - kTRNG_StatisticalCheckRunBit2, /*!< Statistical check of number of runs of length 2 detected during entropy - generation. */ - kTRNG_StatisticalCheckRunBit3, /*!< Statistical check of number of runs of length 3 detected during entropy - generation. */ - kTRNG_StatisticalCheckRunBit4, /*!< Statistical check of number of runs of length 4 detected during entropy - generation. */ - kTRNG_StatisticalCheckRunBit5, /*!< Statistical check of number of runs of length 5 detected during entropy - generation. */ - kTRNG_StatisticalCheckRunBit6Plus, /*!< Statistical check of number of runs of length 6 or more detected during - entropy generation. */ - kTRNG_StatisticalCheckPoker, /*!< Statistical check of "Poker Test". */ - kTRNG_StatisticalCheckFrequencyCount /*!< Statistical check of entropy sample frequency count. */ -} trng_statistical_check_t; - -/******************************************************************************* - * TRNG_SCMISC - RNG Statistical Check Miscellaneous Register - ******************************************************************************/ -/*! - * @name Register TRNG_SCMISC, field RTY_CT[19:16] (RW) - * - * RETRY COUNT. If a statistical check fails during the TRNG Entropy Generation, - * the RTY_CT value indicates the number of times a retry should occur before - * generating an error. This field is writable only if MCTL[PRGM] bit is 1. This - * field will read zeroes if MCTL[PRGM] = 0. This field is cleared to 1h by writing - * the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCMISC_RTY_CT field. */ -#define TRNG_RD_SCMISC_RTY_CT(base) ((TRNG_SCMISC_REG(base) & TRNG_SCMISC_RTY_CT_MASK) >> TRNG_SCMISC_RTY_CT_SHIFT) - -/*! @brief Set the RTY_CT field to a new value. */ -#define TRNG_WR_SCMISC_RTY_CT(base, value) (TRNG_RMW_SCMISC(base, TRNG_SCMISC_RTY_CT_MASK, TRNG_SCMISC_RTY_CT(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCML - RNG Statistical Check Monobit Limit Register - ******************************************************************************/ -/*! - * @brief TRNG_SCML - RNG Statistical Check Monobit Limit Register (RW) - * - * Reset value: 0x010C0568U - * - * The RNG Statistical Check Monobit Limit Register defines the allowable - * maximum and minimum number of ones/zero detected during entropy generation. To pass - * the test, the number of ones/zeroes generated must be less than the programmed - * maximum value, and the number of ones/zeroes generated must be greater than - * (maximum - range). If this test fails, the Retry Counter in SCMISC will be - * decremented, and a retry will occur if the Retry Count has not reached zero. If - * the Retry Count has reached zero, an error will be generated. Note that this - * offset (0xBASE_0620) is used as SCML only if MCTL[PRGM] is 1. If MCTL[PRGM] is 0, - * this offset is used as SCMC readback register. - */ -/*! - * @name Constants and macros for entire TRNG_SCML register - */ -/*@{*/ -#define TRNG_SCML_REG(base) ((base)->SCML) -#define TRNG_RD_SCML(base) (TRNG_SCML_REG(base)) -#define TRNG_WR_SCML(base, value) (TRNG_SCML_REG(base) = (value)) -#define TRNG_RMW_SCML(base, mask, value) (TRNG_WR_SCML(base, (TRNG_RD_SCML(base) & ~(mask)) | (value))) -/*@}*/ -/*! - * @name Register TRNG_SCML, field MONO_MAX[15:0] (RW) - * - * Monobit Maximum Limit. Defines the maximum allowable count taken during - * entropy generation. The number of ones/zeroes detected during entropy generation - * must be less than MONO_MAX, else a retry or error will occur. This register is - * cleared to 00056Bh (decimal 1387) by writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCML_MONO_MAX field. */ -#define TRNG_RD_SCML_MONO_MAX(base) ((TRNG_SCML_REG(base) & TRNG_SCML_MONO_MAX_MASK) >> TRNG_SCML_MONO_MAX_SHIFT) - -/*! @brief Set the MONO_MAX field to a new value. */ -#define TRNG_WR_SCML_MONO_MAX(base, value) (TRNG_RMW_SCML(base, TRNG_SCML_MONO_MAX_MASK, TRNG_SCML_MONO_MAX(value))) -/*@}*/ -/*! - * @name Register TRNG_SCML, field MONO_RNG[31:16] (RW) - * - * Monobit Range. The number of ones/zeroes detected during entropy generation - * must be greater than MONO_MAX - MONO_RNG, else a retry or error will occur. - * This register is cleared to 000112h (decimal 274) by writing the MCTL[RST_DEF] - * bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCML_MONO_RNG field. */ -#define TRNG_RD_SCML_MONO_RNG(base) ((TRNG_SCML_REG(base) & TRNG_SCML_MONO_RNG_MASK) >> TRNG_SCML_MONO_RNG_SHIFT) - -/*! @brief Set the MONO_RNG field to a new value. */ -#define TRNG_WR_SCML_MONO_RNG(base, value) (TRNG_RMW_SCML(base, TRNG_SCML_MONO_RNG_MASK, TRNG_SCML_MONO_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR1L - RNG Statistical Check Run Length 1 Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR1L - RNG Statistical Check Run Length 1 Limit Register (RW) - * - * Reset value: 0x00B20195U - * - * The RNG Statistical Check Run Length 1 Limit Register defines the allowable - * maximum and minimum number of runs of length 1 detected during entropy - * generation. To pass the test, the number of runs of length 1 (for samples of both 0 - * and 1) must be less than the programmed maximum value, and the number of runs of - * length 1 must be greater than (maximum - range). If this test fails, the - * Retry Counter in SCMISC will be decremented, and a retry will occur if the Retry - * Count has not reached zero. If the Retry Count has reached zero, an error will - * be generated. Note that this address (0xBASE_0624) is used as SCR1L only if - * MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this address is used as SCR1C readback - * register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR1L register - */ -/*@{*/ -#define TRNG_SCR1L_REG(base) ((base)->SCR1L) -#define TRNG_RD_SCR1L(base) (TRNG_SCR1L_REG(base)) -#define TRNG_WR_SCR1L(base, value) (TRNG_SCR1L_REG(base) = (value)) -#define TRNG_RMW_SCR1L(base, mask, value) (TRNG_WR_SCR1L(base, (TRNG_RD_SCR1L(base) & ~(mask)) | (value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR1L, field RUN1_MAX[14:0] (RW) - * - * Run Length 1 Maximum Limit. Defines the maximum allowable runs of length 1 - * (for both 0 and 1) detected during entropy generation. The number of runs of - * length 1 detected during entropy generation must be less than RUN1_MAX, else a - * retry or error will occur. This register is cleared to 01E5h (decimal 485) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR1L_RUN1_MAX field. */ -#define TRNG_RD_SCR1L_RUN1_MAX(base) ((TRNG_SCR1L_REG(base) & TRNG_SCR1L_RUN1_MAX_MASK) >> TRNG_SCR1L_RUN1_MAX_SHIFT) - -/*! @brief Set the RUN1_MAX field to a new value. */ -#define TRNG_WR_SCR1L_RUN1_MAX(base, value) (TRNG_RMW_SCR1L(base, TRNG_SCR1L_RUN1_MAX_MASK, TRNG_SCR1L_RUN1_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR1L, field RUN1_RNG[30:16] (RW) - * - * Run Length 1 Range. The number of runs of length 1 (for both 0 and 1) - * detected during entropy generation must be greater than RUN1_MAX - RUN1_RNG, else a - * retry or error will occur. This register is cleared to 0102h (decimal 258) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR1L_RUN1_RNG field. */ -#define TRNG_RD_SCR1L_RUN1_RNG(base) ((TRNG_SCR1L_REG(base) & TRNG_SCR1L_RUN1_RNG_MASK) >> TRNG_SCR1L_RUN1_RNG_SHIFT) - -/*! @brief Set the RUN1_RNG field to a new value. */ -#define TRNG_WR_SCR1L_RUN1_RNG(base, value) (TRNG_RMW_SCR1L(base, TRNG_SCR1L_RUN1_RNG_MASK, TRNG_SCR1L_RUN1_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR2L - RNG Statistical Check Run Length 2 Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR2L - RNG Statistical Check Run Length 2 Limit Register (RW) - * - * Reset value: 0x007A00DCU - * - * The RNG Statistical Check Run Length 2 Limit Register defines the allowable - * maximum and minimum number of runs of length 2 detected during entropy - * generation. To pass the test, the number of runs of length 2 (for samples of both 0 - * and 1) must be less than the programmed maximum value, and the number of runs of - * length 2 must be greater than (maximum - range). If this test fails, the - * Retry Counter in SCMISC will be decremented, and a retry will occur if the Retry - * Count has not reached zero. If the Retry Count has reached zero, an error will - * be generated. Note that this address (0xBASE_0628) is used as SCR2L only if - * MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this address is used as SCR2C readback - * register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR2L register - */ -/*@{*/ -#define TRNG_SCR2L_REG(base) ((base)->SCR2L) -#define TRNG_RD_SCR2L(base) (TRNG_SCR2L_REG(base)) -#define TRNG_WR_SCR2L(base, value) (TRNG_SCR2L_REG(base) = (value)) -#define TRNG_RMW_SCR2L(base, mask, value) (TRNG_WR_SCR2L(base, (TRNG_RD_SCR2L(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCR2L bitfields - */ - -/*! - * @name Register TRNG_SCR2L, field RUN2_MAX[13:0] (RW) - * - * Run Length 2 Maximum Limit. Defines the maximum allowable runs of length 2 - * (for both 0 and 1) detected during entropy generation. The number of runs of - * length 2 detected during entropy generation must be less than RUN2_MAX, else a - * retry or error will occur. This register is cleared to 00DCh (decimal 220) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR2L_RUN2_MAX field. */ -#define TRNG_RD_SCR2L_RUN2_MAX(base) ((TRNG_SCR2L_REG(base) & TRNG_SCR2L_RUN2_MAX_MASK) >> TRNG_SCR2L_RUN2_MAX_SHIFT) - -/*! @brief Set the RUN2_MAX field to a new value. */ -#define TRNG_WR_SCR2L_RUN2_MAX(base, value) (TRNG_RMW_SCR2L(base, TRNG_SCR2L_RUN2_MAX_MASK, TRNG_SCR2L_RUN2_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR2L, field RUN2_RNG[29:16] (RW) - * - * Run Length 2 Range. The number of runs of length 2 (for both 0 and 1) - * detected during entropy generation must be greater than RUN2_MAX - RUN2_RNG, else a - * retry or error will occur. This register is cleared to 007Ah (decimal 122) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR2L_RUN2_RNG field. */ -#define TRNG_RD_SCR2L_RUN2_RNG(base) ((TRNG_SCR2L_REG(base) & TRNG_SCR2L_RUN2_RNG_MASK) >> TRNG_SCR2L_RUN2_RNG_SHIFT) - -/*! @brief Set the RUN2_RNG field to a new value. */ -#define TRNG_WR_SCR2L_RUN2_RNG(base, value) (TRNG_RMW_SCR2L(base, TRNG_SCR2L_RUN2_RNG_MASK, TRNG_SCR2L_RUN2_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR3L - RNG Statistical Check Run Length 3 Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR3L - RNG Statistical Check Run Length 3 Limit Register (RW) - * - * Reset value: 0x0058007DU - * - * The RNG Statistical Check Run Length 3 Limit Register defines the allowable - * maximum and minimum number of runs of length 3 detected during entropy - * generation. To pass the test, the number of runs of length 3 (for samples of both 0 - * and 1) must be less than the programmed maximum value, and the number of runs of - * length 3 must be greater than (maximum - range). If this test fails, the - * Retry Counter in SCMISC will be decremented, and a retry will occur if the Retry - * Count has not reached zero. If the Retry Count has reached zero, an error will - * be generated. Note that this address (0xBASE_062C) is used as SCR3L only if - * MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this address is used as SCR3C readback - * register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR3L register - */ -/*@{*/ -#define TRNG_SCR3L_REG(base) ((base)->SCR3L) -#define TRNG_RD_SCR3L(base) (TRNG_SCR3L_REG(base)) -#define TRNG_WR_SCR3L(base, value) (TRNG_SCR3L_REG(base) = (value)) -#define TRNG_RMW_SCR3L(base, mask, value) (TRNG_WR_SCR3L(base, (TRNG_RD_SCR3L(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCR3L bitfields - */ - -/*! - * @name Register TRNG_SCR3L, field RUN3_MAX[12:0] (RW) - * - * Run Length 3 Maximum Limit. Defines the maximum allowable runs of length 3 - * (for both 0 and 1) detected during entropy generation. The number of runs of - * length 3 detected during entropy generation must be less than RUN3_MAX, else a - * retry or error will occur. This register is cleared to 007Dh (decimal 125) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR3L_RUN3_MAX field. */ -#define TRNG_RD_SCR3L_RUN3_MAX(base) ((TRNG_SCR3L_REG(base) & TRNG_SCR3L_RUN3_MAX_MASK) >> TRNG_SCR3L_RUN3_MAX_SHIFT) - -/*! @brief Set the RUN3_MAX field to a new value. */ -#define TRNG_WR_SCR3L_RUN3_MAX(base, value) (TRNG_RMW_SCR3L(base, TRNG_SCR3L_RUN3_MAX_MASK, TRNG_SCR3L_RUN3_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR3L, field RUN3_RNG[28:16] (RW) - * - * Run Length 3 Range. The number of runs of length 3 (for both 0 and 1) - * detected during entropy generation must be greater than RUN3_MAX - RUN3_RNG, else a - * retry or error will occur. This register is cleared to 0058h (decimal 88) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR3L_RUN3_RNG field. */ -#define TRNG_RD_SCR3L_RUN3_RNG(base) ((TRNG_SCR3L_REG(base) & TRNG_SCR3L_RUN3_RNG_MASK) >> TRNG_SCR3L_RUN3_RNG_SHIFT) - -/*! @brief Set the RUN3_RNG field to a new value. */ -#define TRNG_WR_SCR3L_RUN3_RNG(base, value) (TRNG_RMW_SCR3L(base, TRNG_SCR3L_RUN3_RNG_MASK, TRNG_SCR3L_RUN3_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR4L - RNG Statistical Check Run Length 4 Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR4L - RNG Statistical Check Run Length 4 Limit Register (RW) - * - * Reset value: 0x0040004BU - * - * The RNG Statistical Check Run Length 4 Limit Register defines the allowable - * maximum and minimum number of runs of length 4 detected during entropy - * generation. To pass the test, the number of runs of length 4 (for samples of both 0 - * and 1) must be less than the programmed maximum value, and the number of runs of - * length 4 must be greater than (maximum - range). If this test fails, the - * Retry Counter in SCMISC will be decremented, and a retry will occur if the Retry - * Count has not reached zero. If the Retry Count has reached zero, an error will - * be generated. Note that this address (0xBASE_0630) is used as SCR4L only if - * MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this address is used as SCR4C readback - * register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR4L register - */ -/*@{*/ -#define TRNG_SCR4L_REG(base) ((base)->SCR4L) -#define TRNG_RD_SCR4L(base) (TRNG_SCR4L_REG(base)) -#define TRNG_WR_SCR4L(base, value) (TRNG_SCR4L_REG(base) = (value)) -#define TRNG_RMW_SCR4L(base, mask, value) (TRNG_WR_SCR4L(base, (TRNG_RD_SCR4L(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCR4L bitfields - */ - -/*! - * @name Register TRNG_SCR4L, field RUN4_MAX[11:0] (RW) - * - * Run Length 4 Maximum Limit. Defines the maximum allowable runs of length 4 - * (for both 0 and 1) detected during entropy generation. The number of runs of - * length 4 detected during entropy generation must be less than RUN4_MAX, else a - * retry or error will occur. This register is cleared to 004Bh (decimal 75) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR4L_RUN4_MAX field. */ -#define TRNG_RD_SCR4L_RUN4_MAX(base) ((TRNG_SCR4L_REG(base) & TRNG_SCR4L_RUN4_MAX_MASK) >> TRNG_SCR4L_RUN4_MAX_SHIFT) - -/*! @brief Set the RUN4_MAX field to a new value. */ -#define TRNG_WR_SCR4L_RUN4_MAX(base, value) (TRNG_RMW_SCR4L(base, TRNG_SCR4L_RUN4_MAX_MASK, TRNG_SCR4L_RUN4_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR4L, field RUN4_RNG[27:16] (RW) - * - * Run Length 4 Range. The number of runs of length 4 (for both 0 and 1) - * detected during entropy generation must be greater than RUN4_MAX - RUN4_RNG, else a - * retry or error will occur. This register is cleared to 0040h (decimal 64) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR4L_RUN4_RNG field. */ -#define TRNG_RD_SCR4L_RUN4_RNG(base) ((TRNG_SCR4L_REG(base) & TRNG_SCR4L_RUN4_RNG_MASK) >> TRNG_SCR4L_RUN4_RNG_SHIFT) - -/*! @brief Set the RUN4_RNG field to a new value. */ -#define TRNG_WR_SCR4L_RUN4_RNG(base, value) (TRNG_RMW_SCR4L(base, TRNG_SCR4L_RUN4_RNG_MASK, TRNG_SCR4L_RUN4_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR5L - RNG Statistical Check Run Length 5 Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR5L - RNG Statistical Check Run Length 5 Limit Register (RW) - * - * Reset value: 0x002E002FU - * - * The RNG Statistical Check Run Length 5 Limit Register defines the allowable - * maximum and minimum number of runs of length 5 detected during entropy - * generation. To pass the test, the number of runs of length 5 (for samples of both 0 - * and 1) must be less than the programmed maximum value, and the number of runs of - * length 5 must be greater than (maximum - range). If this test fails, the - * Retry Counter in SCMISC will be decremented, and a retry will occur if the Retry - * Count has not reached zero. If the Retry Count has reached zero, an error will - * be generated. Note that this address (0xBASE_0634) is used as SCR5L only if - * MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this address is used as SCR5C readback - * register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR5L register - */ -/*@{*/ -#define TRNG_SCR5L_REG(base) ((base)->SCR5L) -#define TRNG_RD_SCR5L(base) (TRNG_SCR5L_REG(base)) -#define TRNG_WR_SCR5L(base, value) (TRNG_SCR5L_REG(base) = (value)) -#define TRNG_RMW_SCR5L(base, mask, value) (TRNG_WR_SCR5L(base, (TRNG_RD_SCR5L(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCR5L bitfields - */ - -/*! - * @name Register TRNG_SCR5L, field RUN5_MAX[10:0] (RW) - * - * Run Length 5 Maximum Limit. Defines the maximum allowable runs of length 5 - * (for both 0 and 1) detected during entropy generation. The number of runs of - * length 5 detected during entropy generation must be less than RUN5_MAX, else a - * retry or error will occur. This register is cleared to 002Fh (decimal 47) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR5L_RUN5_MAX field. */ -#define TRNG_RD_SCR5L_RUN5_MAX(base) ((TRNG_SCR5L_REG(base) & TRNG_SCR5L_RUN5_MAX_MASK) >> TRNG_SCR5L_RUN5_MAX_SHIFT) - -/*! @brief Set the RUN5_MAX field to a new value. */ -#define TRNG_WR_SCR5L_RUN5_MAX(base, value) (TRNG_RMW_SCR5L(base, TRNG_SCR5L_RUN5_MAX_MASK, TRNG_SCR5L_RUN5_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR5L, field RUN5_RNG[26:16] (RW) - * - * Run Length 5 Range. The number of runs of length 5 (for both 0 and 1) - * detected during entropy generation must be greater than RUN5_MAX - RUN5_RNG, else a - * retry or error will occur. This register is cleared to 002Eh (decimal 46) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR5L_RUN5_RNG field. */ -#define TRNG_RD_SCR5L_RUN5_RNG(base) ((TRNG_SCR5L_REG(base) & TRNG_SCR5L_RUN5_RNG_MASK) >> TRNG_SCR5L_RUN5_RNG_SHIFT) - -/*! @brief Set the RUN5_RNG field to a new value. */ -#define TRNG_WR_SCR5L_RUN5_RNG(base, value) (TRNG_RMW_SCR5L(base, TRNG_SCR5L_RUN5_RNG_MASK, TRNG_SCR5L_RUN5_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCR6PL - RNG Statistical Check Run Length 6+ Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCR6PL - RNG Statistical Check Run Length 6+ Limit Register (RW) - * - * Reset value: 0x002E002FU - * - * The RNG Statistical Check Run Length 6+ Limit Register defines the allowable - * maximum and minimum number of runs of length 6 or more detected during entropy - * generation. To pass the test, the number of runs of length 6 or more (for - * samples of both 0 and 1) must be less than the programmed maximum value, and the - * number of runs of length 6 or more must be greater than (maximum - range). If - * this test fails, the Retry Counter in SCMISC will be decremented, and a retry - * will occur if the Retry Count has not reached zero. If the Retry Count has - * reached zero, an error will be generated. Note that this offset (0xBASE_0638) is - * used as SCR6PL only if MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this offset is - * used as SCR6PC readback register. - */ -/*! - * @name Constants and macros for entire TRNG_SCR6PL register - */ -/*@{*/ -#define TRNG_SCR6PL_REG(base) ((base)->SCR6PL) -#define TRNG_RD_SCR6PL(base) (TRNG_SCR6PL_REG(base)) -#define TRNG_WR_SCR6PL(base, value) (TRNG_SCR6PL_REG(base) = (value)) -#define TRNG_RMW_SCR6PL(base, mask, value) (TRNG_WR_SCR6PL(base, (TRNG_RD_SCR6PL(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCR6PL bitfields - */ - -/*! - * @name Register TRNG_SCR6PL, field RUN6P_MAX[10:0] (RW) - * - * Run Length 6+ Maximum Limit. Defines the maximum allowable runs of length 6 - * or more (for both 0 and 1) detected during entropy generation. The number of - * runs of length 6 or more detected during entropy generation must be less than - * RUN6P_MAX, else a retry or error will occur. This register is cleared to 002Fh - * (decimal 47) by writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR6PL_RUN6P_MAX field. */ -#define TRNG_RD_SCR6PL_RUN6P_MAX(base) \ - ((TRNG_SCR6PL_REG(base) & TRNG_SCR6PL_RUN6P_MAX_MASK) >> TRNG_SCR6PL_RUN6P_MAX_SHIFT) - -/*! @brief Set the RUN6P_MAX field to a new value. */ -#define TRNG_WR_SCR6PL_RUN6P_MAX(base, value) \ - (TRNG_RMW_SCR6PL(base, TRNG_SCR6PL_RUN6P_MAX_MASK, TRNG_SCR6PL_RUN6P_MAX(value))) -/*@}*/ - -/*! - * @name Register TRNG_SCR6PL, field RUN6P_RNG[26:16] (RW) - * - * Run Length 6+ Range. The number of runs of length 6 or more (for both 0 and - * 1) detected during entropy generation must be greater than RUN6P_MAX - - * RUN6P_RNG, else a retry or error will occur. This register is cleared to 002Eh - * (decimal 46) by writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCR6PL_RUN6P_RNG field. */ -#define TRNG_RD_SCR6PL_RUN6P_RNG(base) \ - ((TRNG_SCR6PL_REG(base) & TRNG_SCR6PL_RUN6P_RNG_MASK) >> TRNG_SCR6PL_RUN6P_RNG_SHIFT) - -/*! @brief Set the RUN6P_RNG field to a new value. */ -#define TRNG_WR_SCR6PL_RUN6P_RNG(base, value) \ - (TRNG_RMW_SCR6PL(base, TRNG_SCR6PL_RUN6P_RNG_MASK, TRNG_SCR6PL_RUN6P_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_PKRMAX - RNG Poker Maximum Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_PKRMAX - RNG Poker Maximum Limit Register (RW) - * - * Reset value: 0x00006920U - * - * The RNG Poker Maximum Limit Register defines Maximum Limit allowable during - * the TRNG Statistical Check Poker Test. Note that this offset (0xBASE_060C) is - * used as PKRMAX only if MCTL[PRGM] is 1. If MCTL[PRGM] is 0, this offset is used - * as the PKRSQ readback register. - */ -/*! - * @name Constants and macros for entire TRNG_PKRMAX register - */ -/*@{*/ -#define TRNG_PKRMAX_REG(base) ((base)->PKRMAX) -#define TRNG_RD_PKRMAX(base) (TRNG_PKRMAX_REG(base)) -#define TRNG_WR_PKRMAX(base, value) (TRNG_PKRMAX_REG(base) = (value)) -#define TRNG_RMW_PKRMAX(base, mask, value) (TRNG_WR_PKRMAX(base, (TRNG_RD_PKRMAX(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_PKRMAX bitfields - */ - -/*! - * @name Register TRNG_PKRMAX, field PKR_MAX[23:0] (RW) - * - * Poker Maximum Limit. During the TRNG Statistical Checks, a "Poker Test" is - * run which requires a maximum and minimum limit. The maximum allowable result is - * programmed in the PKRMAX[PKR_MAX] register. This field is writable only if - * MCTL[PRGM] bit is 1. This register is cleared to 006920h (decimal 26912) by - * writing the MCTL[RST_DEF] bit to 1. Note that the PKRMAX and PKRRNG registers - * combined are used to define the minimum allowable Poker result, which is PKR_MAX - - * PKR_RNG + 1. Note that if MCTL[PRGM] bit is 0, this register address is used - * to read the Poker Test Square Calculation result in register PKRSQ, as defined - * in the following section. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_PKRMAX_PKR_MAX field. */ -#define TRNG_RD_PKRMAX_PKR_MAX(base) ((TRNG_PKRMAX_REG(base) & TRNG_PKRMAX_PKR_MAX_MASK) >> TRNG_PKRMAX_PKR_MAX_SHIFT) - -/*! @brief Set the PKR_MAX field to a new value. */ -#define TRNG_WR_PKRMAX_PKR_MAX(base, value) \ - (TRNG_RMW_PKRMAX(base, TRNG_PKRMAX_PKR_MAX_MASK, TRNG_PKRMAX_PKR_MAX(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_PKRRNG - RNG Poker Range Register - ******************************************************************************/ - -/*! - * @brief TRNG_PKRRNG - RNG Poker Range Register (RW) - * - * Reset value: 0x000009A3U - * - * The RNG Poker Range Register defines the difference between the TRNG Poker - * Maximum Limit and the minimum limit. These limits are used during the TRNG - * Statistical Check Poker Test. - */ -/*! - * @name Constants and macros for entire TRNG_PKRRNG register - */ -/*@{*/ -#define TRNG_PKRRNG_REG(base) ((base)->PKRRNG) -#define TRNG_RD_PKRRNG(base) (TRNG_PKRRNG_REG(base)) -#define TRNG_WR_PKRRNG(base, value) (TRNG_PKRRNG_REG(base) = (value)) -#define TRNG_RMW_PKRRNG(base, mask, value) (TRNG_WR_PKRRNG(base, (TRNG_RD_PKRRNG(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_PKRRNG bitfields - */ - -/*! - * @name Register TRNG_PKRRNG, field PKR_RNG[15:0] (RW) - * - * Poker Range. During the TRNG Statistical Checks, a "Poker Test" is run which - * requires a maximum and minimum limit. The maximum is programmed in the - * RTPKRMAX[PKR_MAX] register, and the minimum is derived by subtracting the PKR_RNG - * value from the programmed maximum value. This field is writable only if - * MCTL[PRGM] bit is 1. This field will read zeroes if MCTL[PRGM] = 0. This field is - * cleared to 09A3h (decimal 2467) by writing the MCTL[RST_DEF] bit to 1. Note that - * the minimum allowable Poker result is PKR_MAX - PKR_RNG + 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_PKRRNG_PKR_RNG field. */ -#define TRNG_RD_PKRRNG_PKR_RNG(base) ((TRNG_PKRRNG_REG(base) & TRNG_PKRRNG_PKR_RNG_MASK) >> TRNG_PKRRNG_PKR_RNG_SHIFT) - -/*! @brief Set the PKR_RNG field to a new value. */ -#define TRNG_WR_PKRRNG_PKR_RNG(base, value) \ - (TRNG_RMW_PKRRNG(base, TRNG_PKRRNG_PKR_RNG_MASK, TRNG_PKRRNG_PKR_RNG(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_FRQMAX - RNG Frequency Count Maximum Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_FRQMAX - RNG Frequency Count Maximum Limit Register (RW) - * - * Reset value: 0x00006400U - * - * The RNG Frequency Count Maximum Limit Register defines the maximum allowable - * count taken by the Entropy sample counter during each Entropy sample. During - * any sample period, if the count is greater than this programmed maximum, a - * Frequency Count Fail is flagged in MCTL[FCT_FAIL] and an error is generated. Note - * that this address (061C) is used as FRQMAX only if MCTL[PRGM] is 1. If - * MCTL[PRGM] is 0, this address is used as FRQCNT readback register. - */ -/*! - * @name Constants and macros for entire TRNG_FRQMAX register - */ -/*@{*/ -#define TRNG_FRQMAX_REG(base) ((base)->FRQMAX) -#define TRNG_RD_FRQMAX(base) (TRNG_FRQMAX_REG(base)) -#define TRNG_WR_FRQMAX(base, value) (TRNG_FRQMAX_REG(base) = (value)) -#define TRNG_RMW_FRQMAX(base, mask, value) (TRNG_WR_FRQMAX(base, (TRNG_RD_FRQMAX(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_FRQMAX bitfields - */ - -/*! - * @name Register TRNG_FRQMAX, field FRQ_MAX[21:0] (RW) - * - * Frequency Counter Maximum Limit. Defines the maximum allowable count taken - * during each entropy sample. This field is writable only if MCTL[PRGM] bit is 1. - * This register is cleared to 000640h by writing the MCTL[RST_DEF] bit to 1. - * Note that if MCTL[PRGM] bit is 0, this register address is used to read the - * Frequency Count result in register FRQCNT, as defined in the following section. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_FRQMAX_FRQ_MAX field. */ -#define TRNG_RD_FRQMAX_FRQ_MAX(base) ((TRNG_FRQMAX_REG(base) & TRNG_FRQMAX_FRQ_MAX_MASK) >> TRNG_FRQMAX_FRQ_MAX_SHIFT) - -/*! @brief Set the FRQ_MAX field to a new value. */ -#define TRNG_WR_FRQMAX_FRQ_MAX(base, value) \ - (TRNG_RMW_FRQMAX(base, TRNG_FRQMAX_FRQ_MAX_MASK, TRNG_FRQMAX_FRQ_MAX(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_FRQMIN - RNG Frequency Count Minimum Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_FRQMIN - RNG Frequency Count Minimum Limit Register (RW) - * - * Reset value: 0x00000640U - * - * The RNG Frequency Count Minimum Limit Register defines the minimum allowable - * count taken by the Entropy sample counter during each Entropy sample. During - * any sample period, if the count is less than this programmed minimum, a - * Frequency Count Fail is flagged in MCTL[FCT_FAIL] and an error is generated. - */ -/*! - * @name Constants and macros for entire TRNG_FRQMIN register - */ -/*@{*/ -#define TRNG_FRQMIN_REG(base) ((base)->FRQMIN) -#define TRNG_RD_FRQMIN(base) (TRNG_FRQMIN_REG(base)) -#define TRNG_WR_FRQMIN(base, value) (TRNG_FRQMIN_REG(base) = (value)) -#define TRNG_RMW_FRQMIN(base, mask, value) (TRNG_WR_FRQMIN(base, (TRNG_RD_FRQMIN(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_FRQMIN bitfields - */ - -/*! - * @name Register TRNG_FRQMIN, field FRQ_MIN[21:0] (RW) - * - * Frequency Count Minimum Limit. Defines the minimum allowable count taken - * during each entropy sample. This field is writable only if MCTL[PRGM] bit is 1. - * This field will read zeroes if MCTL[PRGM] = 0. This field is cleared to 0000h64 - * by writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_FRQMIN_FRQ_MIN field. */ -#define TRNG_RD_FRQMIN_FRQ_MIN(base) ((TRNG_FRQMIN_REG(base) & TRNG_FRQMIN_FRQ_MIN_MASK) >> TRNG_FRQMIN_FRQ_MIN_SHIFT) - -/*! @brief Set the FRQ_MIN field to a new value. */ -#define TRNG_WR_FRQMIN_FRQ_MIN(base, value) \ - (TRNG_RMW_FRQMIN(base, TRNG_FRQMIN_FRQ_MIN_MASK, TRNG_FRQMIN_FRQ_MIN(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_MCTL - RNG Miscellaneous Control Register - ******************************************************************************/ - -/*! - * @brief TRNG_MCTL - RNG Miscellaneous Control Register (RW) - * - * Reset value: 0x00012001U - * - * This register is intended to be used for programming, configuring and testing - * the RNG. It is the main register to read/write, in order to enable Entropy - * generation, to stop entropy generation and to block access to entropy registers. - * This is done via the special TRNG_ACC and PRGM bits below. The RNG - * Miscellaneous Control Register is a read/write register used to control the RNG's True - * Random Number Generator (TRNG) access, operation and test. Note that in many - * cases two RNG registers share the same address, and a particular register at the - * shared address is selected based upon the value in the PRGM field of the MCTL - * register. - */ -/*! - * @name Constants and macros for entire TRNG_MCTL register - */ -/*@{*/ -#define TRNG_MCTL_REG(base) ((base)->MCTL) -#define TRNG_RD_MCTL(base) (TRNG_MCTL_REG(base)) -#define TRNG_WR_MCTL(base, value) (TRNG_MCTL_REG(base) = (value)) -#define TRNG_RMW_MCTL(base, mask, value) (TRNG_WR_MCTL(base, (TRNG_RD_MCTL(base) & ~(mask)) | (value))) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field FOR_SCLK[7] (RW) - * - * Force System Clock. If set, the system clock is used to operate the TRNG, - * instead of the ring oscillator. This is for test use only, and indeterminate - * results may occur. This bit is writable only if PRGM bit is 1, or PRGM bit is - * being written to 1 simultaneously to writing this bit. This bit is cleared by - * writing the RST_DEF bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_FOR_SCLK field. */ -#define TRNG_RD_MCTL_FOR_SCLK(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_FOR_SCLK_MASK) >> TRNG_MCTL_FOR_SCLK_SHIFT) - -/*! @brief Set the FOR_SCLK field to a new value. */ -#define TRNG_WR_MCTL_FOR_SCLK(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_FOR_SCLK_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_FOR_SCLK(value))) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field OSC_DIV[3:2] (RW) - * - * Oscillator Divide. Determines the amount of dividing done to the ring - * oscillator before it is used by the TRNG.This field is writable only if PRGM bit is - * 1, or PRGM bit is being written to 1 simultaneously to writing this field. This - * field is cleared to 00 by writing the RST_DEF bit to 1. - * - * Values: - * - 0b00 - use ring oscillator with no divide - * - 0b01 - use ring oscillator divided-by-2 - * - 0b10 - use ring oscillator divided-by-4 - * - 0b11 - use ring oscillator divided-by-8 - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_OSC_DIV field. */ -#define TRNG_RD_MCTL_OSC_DIV(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_OSC_DIV_MASK) >> TRNG_MCTL_OSC_DIV_SHIFT) - -/*! @brief Set the OSC_DIV field to a new value. */ -#define TRNG_WR_MCTL_OSC_DIV(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_OSC_DIV_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_OSC_DIV(value))) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field SAMP_MODE[1:0] (RW) - * - * Sample Mode. Determines the method of sampling the ring oscillator while - * generating the Entropy value:This field is writable only if PRGM bit is 1, or PRGM - * bit is being written to 1 simultaneously with writing this field. This field - * is cleared to 01 by writing the RST_DEF bit to 1. - * - * Values: - * - 0b00 - use Von Neumann data into both Entropy shifter and Statistical - * Checker - * - 0b01 - use raw data into both Entropy shifter and Statistical Checker - * - 0b10 - use Von Neumann data into Entropy shifter. Use raw data into - * Statistical Checker - * - 0b11 - reserved. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_SAMP_MODE field. */ -#define TRNG_RD_MCTL_SAMP_MODE(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_SAMP_MODE_MASK) >> TRNG_MCTL_SAMP_MODE_SHIFT) - -/*! @brief Set the SAMP_MODE field to a new value. */ -#define TRNG_WR_MCTL_SAMP_MODE(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_SAMP_MODE_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_SAMP_MODE(value))) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field PRGM[16] (RW) - * - * Programming Mode Select. When this bit is 1, the TRNG is in Program Mode, - * otherwise it is in Run Mode. No Entropy value will be generated while the TRNG is - * in Program Mode. Note that different RNG registers are accessible at the same - * address depending on whether PRGM is set to 1 or 0. This is noted in the RNG - * register descriptions. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_PRGM field. */ -#define TRNG_RD_MCTL_PRGM(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_PRGM_MASK) >> TRNG_MCTL_PRGM_SHIFT) - -/*! @brief Set the PRGM field to a new value. */ -#define TRNG_WR_MCTL_PRGM(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_PRGM_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_PRGM(value))) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field RST_DEF[6] (WO) - * - * Reset Defaults. Writing a 1 to this bit clears various TRNG registers, and - * bits within registers, to their default state. This bit is writable only if PRGM - * bit is 1, or PRGM bit is being written to 1 simultaneously to writing this - * bit. Reading this bit always produces a 0. - */ -/*@{*/ -/*! @brief Set the RST_DEF field to a new value. */ -#define TRNG_WR_MCTL_RST_DEF(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_RST_DEF_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_RST_DEF(value))) -/*@}*/ - -#if !(defined(FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC) && (FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC > 0)) -/*! - * @name Register TRNG_MCTL, field TRNG_ACC[5] (RW) - * - * TRNG Access Mode. If this bit is set to 1, the TRNG will generate an Entropy - * value that can be read via the ENT0-ENT15 registers. The Entropy value may be - * read once the ENT VAL bit is asserted. Also see ENTa register descriptions - * (For a = 0 to 15). - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_TRNG_ACC field. */ -#define TRNG_RD_MCTL_TRNG_ACC(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_TRNG_ACC_MASK) >> TRNG_MCTL_TRNG_ACC_SHIFT) - -/*! @brief Set the TRNG_ACC field to a new value. */ -#define TRNG_WR_MCTL_TRNG_ACC(base, value) \ - (TRNG_RMW_MCTL(base, (TRNG_MCTL_TRNG_ACC_MASK | TRNG_MCTL_ERR_MASK), TRNG_MCTL_TRNG_ACC(value))) -/*@}*/ -#endif - -/*! - * @name Register TRNG_MCTL, field TSTOP_OK[13] (RO) - * - * TRNG_OK_TO_STOP. Software should check that this bit is a 1 before - * transitioning RNG to low power mode (RNG clock stopped). RNG turns on the TRNG - * free-running ring oscillator whenever new entropy is being generated and turns off the - * ring oscillator when entropy generation is complete. If the RNG clock is - * stopped while the TRNG ring oscillator is running, the oscillator will continue - * running even though the RNG clock is stopped. TSTOP_OK is asserted when the TRNG - * ring oscillator is not running. and therefore it is ok to stop the RNG clock. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_TSTOP_OK field. */ -#define TRNG_RD_MCTL_TSTOP_OK(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_TSTOP_OK_MASK) >> TRNG_MCTL_TSTOP_OK_SHIFT) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field ENT_VAL[10] (RO) - * - * Read only: Entropy Valid. Will assert only if TRNG ACC bit is set, and then - * after an entropy value is generated. Will be cleared when ENT15 is read. (ENT0 - * through ENT14 should be read before reading ENT15). - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_ENT_VAL field. */ -#define TRNG_RD_MCTL_ENT_VAL(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_ENT_VAL_MASK) >> TRNG_MCTL_ENT_VAL_SHIFT) -/*@}*/ - -/*! - * @name Register TRNG_MCTL, field ERR[12] (W1C) - * - * Read: Error status. 1 = error detected. 0 = no error.Write: Write 1 to clear - * errors. Writing 0 has no effect. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_MCTL_ERR field. */ -#define TRNG_RD_MCTL_ERR(base) ((TRNG_MCTL_REG(base) & TRNG_MCTL_ERR_MASK) >> TRNG_MCTL_ERR_SHIFT) - -/*! @brief Set the ERR field to a new value. */ -#define TRNG_WR_MCTL_ERR(base, value) (TRNG_RMW_MCTL(base, TRNG_MCTL_ERR_MASK, TRNG_MCTL_ERR(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SDCTL - RNG Seed Control Register - ******************************************************************************/ - -/*! - * @brief TRNG_SDCTL - RNG Seed Control Register (RW) - * - * Reset value: 0x0C8009C4U - * - * The RNG Seed Control Register contains two fields. One field defines the - * length (in system clocks) of each Entropy sample (ENT_DLY), and the other field - * indicates the number of samples that will taken during each TRNG Entropy - * generation (SAMP_SIZE). - */ -/*! - * @name Constants and macros for entire TRNG_SDCTL register - */ -/*@{*/ -#define TRNG_SDCTL_REG(base) ((base)->SDCTL) -#define TRNG_RD_SDCTL(base) (TRNG_SDCTL_REG(base)) -#define TRNG_WR_SDCTL(base, value) (TRNG_SDCTL_REG(base) = (value)) -#define TRNG_RMW_SDCTL(base, mask, value) (TRNG_WR_SDCTL(base, (TRNG_RD_SDCTL(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SDCTL bitfields - */ - -/*! - * @name Register TRNG_SDCTL, field SAMP_SIZE[15:0] (RW) - * - * Sample Size. Defines the total number of Entropy samples that will be taken - * during Entropy generation. This field is writable only if MCTL[PRGM] bit is 1. - * This field will read zeroes if MCTL[PRGM] = 0. This field is cleared to 09C4h - * (decimal 2500) by writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SDCTL_SAMP_SIZE field. */ -#define TRNG_RD_SDCTL_SAMP_SIZE(base) ((TRNG_SDCTL_REG(base) & TRNG_SDCTL_SAMP_SIZE_MASK) >> TRNG_SDCTL_SAMP_SIZE_SHIFT) - -/*! @brief Set the SAMP_SIZE field to a new value. */ -#define TRNG_WR_SDCTL_SAMP_SIZE(base, value) \ - (TRNG_RMW_SDCTL(base, TRNG_SDCTL_SAMP_SIZE_MASK, TRNG_SDCTL_SAMP_SIZE(value))) -/*@}*/ - -/*! - * @name Register TRNG_SDCTL, field ENT_DLY[31:16] (RW) - * - * Entropy Delay. Defines the length (in system clocks) of each Entropy sample - * taken. This field is writable only if MCTL[PRGM] bit is 1. This field will read - * zeroes if MCTL[PRGM] = 0. This field is cleared to 0C80h (decimal 3200) by - * writing the MCTL[RST_DEF] bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SDCTL_ENT_DLY field. */ -#define TRNG_RD_SDCTL_ENT_DLY(base) ((TRNG_SDCTL_REG(base) & TRNG_SDCTL_ENT_DLY_MASK) >> TRNG_SDCTL_ENT_DLY_SHIFT) - -/*! @brief Set the ENT_DLY field to a new value. */ -#define TRNG_WR_SDCTL_ENT_DLY(base, value) (TRNG_RMW_SDCTL(base, TRNG_SDCTL_ENT_DLY_MASK, TRNG_SDCTL_ENT_DLY(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SBLIM - RNG Sparse Bit Limit Register - ******************************************************************************/ - -/*! - * @brief TRNG_SBLIM - RNG Sparse Bit Limit Register (RW) - * - * Reset value: 0x0000003FU - * - * The RNG Sparse Bit Limit Register is used when Von Neumann sampling is - * selected during Entropy Generation. It defines the maximum number of consecutive Von - * Neumann samples which may be discarded before an error is generated. Note - * that this address (0xBASE_0614) is used as SBLIM only if MCTL[PRGM] is 1. If - * MCTL[PRGM] is 0, this address is used as TOTSAM readback register. - */ -/*! - * @name Constants and macros for entire TRNG_SBLIM register - */ -/*@{*/ -#define TRNG_SBLIM_REG(base) ((base)->SBLIM) -#define TRNG_RD_SBLIM(base) (TRNG_SBLIM_REG(base)) -#define TRNG_WR_SBLIM(base, value) (TRNG_SBLIM_REG(base) = (value)) -#define TRNG_RMW_SBLIM(base, mask, value) (TRNG_WR_SBLIM(base, (TRNG_RD_SBLIM(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SBLIM bitfields - */ - -/*! - * @name Register TRNG_SBLIM, field SB_LIM[9:0] (RW) - * - * Sparse Bit Limit. During Von Neumann sampling (if enabled by MCTL[SAMP_MODE], - * samples are discarded if two consecutive raw samples are both 0 or both 1. If - * this discarding occurs for a long period of time, it indicates that there is - * insufficient Entropy. The Sparse Bit Limit defines the maximum number of - * consecutive samples that may be discarded before an error is generated. This field - * is writable only if MCTL[PRGM] bit is 1. This register is cleared to 03hF by - * writing the MCTL[RST_DEF] bit to 1. Note that if MCTL[PRGM] bit is 0, this - * register address is used to read the Total Samples count in register TOTSAM, as - * defined in the following section. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SBLIM_SB_LIM field. */ -#define TRNG_RD_SBLIM_SB_LIM(base) ((TRNG_SBLIM_REG(base) & TRNG_SBLIM_SB_LIM_MASK) >> TRNG_SBLIM_SB_LIM_SHIFT) - -/*! @brief Set the SB_LIM field to a new value. */ -#define TRNG_WR_SBLIM_SB_LIM(base, value) (TRNG_RMW_SBLIM(base, TRNG_SBLIM_SB_LIM_MASK, TRNG_SBLIM_SB_LIM(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_SCMISC - RNG Statistical Check Miscellaneous Register - ******************************************************************************/ - -/*! - * @brief TRNG_SCMISC - RNG Statistical Check Miscellaneous Register (RW) - * - * Reset value: 0x0001001FU - * - * The RNG Statistical Check Miscellaneous Register contains the Long Run - * Maximum Limit value and the Retry Count value. This register is accessible only when - * the MCTL[PRGM] bit is 1, otherwise this register will read zeroes, and cannot - * be written. - */ -/*! - * @name Constants and macros for entire TRNG_SCMISC register - */ -/*@{*/ -#define TRNG_SCMISC_REG(base) ((base)->SCMISC) -#define TRNG_RD_SCMISC(base) (TRNG_SCMISC_REG(base)) -#define TRNG_WR_SCMISC(base, value) (TRNG_SCMISC_REG(base) = (value)) -#define TRNG_RMW_SCMISC(base, mask, value) (TRNG_WR_SCMISC(base, (TRNG_RD_SCMISC(base) & ~(mask)) | (value))) -/*@}*/ - -/* - * Constants & macros for individual TRNG_SCMISC bitfields - */ - -/*! - * @name Register TRNG_SCMISC, field LRUN_MAX[7:0] (RW) - * - * LONG RUN MAX LIMIT. This value is the largest allowable number of consecutive - * samples of all 1, or all 0, that is allowed during the Entropy generation. - * This field is writable only if MCTL[PRGM] bit is 1. This field will read zeroes - * if MCTL[PRGM] = 0. This field is cleared to 22h by writing the MCTL[RST_DEF] - * bit to 1. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SCMISC_LRUN_MAX field. */ -#define TRNG_RD_SCMISC_LRUN_MAX(base) \ - ((TRNG_SCMISC_REG(base) & TRNG_SCMISC_LRUN_MAX_MASK) >> TRNG_SCMISC_LRUN_MAX_SHIFT) - -/*! @brief Set the LRUN_MAX field to a new value. */ -#define TRNG_WR_SCMISC_LRUN_MAX(base, value) \ - (TRNG_RMW_SCMISC(base, TRNG_SCMISC_LRUN_MAX_MASK, TRNG_SCMISC_LRUN_MAX(value))) -/*@}*/ - -/******************************************************************************* - * TRNG_ENT - RNG TRNG Entropy Read Register - ******************************************************************************/ - -/*! - * @brief TRNG_ENT - RNG TRNG Entropy Read Register (RO) - * - * Reset value: 0x00000000U - * - * The RNG TRNG can be programmed to generate an entropy value that is readable - * via the SkyBlue bus. To do this, set the MCTL[TRNG_ACC] bit to 1. Once the - * entropy value has been generated, the MCTL[ENT_VAL] bit will be set to 1. At this - * point, ENT0 through ENT15 may be read to retrieve the 512-bit entropy value. - * Note that once ENT15 is read, the entropy value will be cleared and a new - * value will begin generation, so it is important that ENT15 be read last. These - * registers are readable only when MCTL[PRGM] = 0 (Run Mode), MCTL[TRNG_ACC] = 1 - * (TRNG access mode) and MCTL[ENT_VAL] = 1, otherwise zeroes will be read. - */ -/*! - * @name Constants and macros for entire TRNG_ENT register - */ -/*@{*/ -#define TRNG_ENT_REG(base, index) ((base)->ENT[index]) -#define TRNG_RD_ENT(base, index) (TRNG_ENT_REG(base, index)) -/*@}*/ - -/******************************************************************************* - * TRNG_SEC_CFG - RNG Security Configuration Register - ******************************************************************************/ - -/*! - * @brief TRNG_SEC_CFG - RNG Security Configuration Register (RW) - * - * Reset value: 0x00000000U - * - * The RNG Security Configuration Register is a read/write register used to - * control the test mode, programmability and state modes of the RNG. Many bits are - * place holders for this version. More configurability will be added here. Clears - * on asynchronous reset. For SA-TRNG releases before 2014/July/01, offsets 0xA0 - * to 0xAC used to be 0xB0 to 0xBC respectively. So, update newer tests that use - * these registers, if hard coded. - */ -/*! - * @name Constants and macros for entire TRNG_SEC_CFG register - */ -/*@{*/ -#define TRNG_SEC_CFG_REG(base) ((base)->SEC_CFG) -#define TRNG_RD_SEC_CFG(base) (TRNG_SEC_CFG_REG(base)) -#define TRNG_WR_SEC_CFG(base, value) (TRNG_SEC_CFG_REG(base) = (value)) -#define TRNG_RMW_SEC_CFG(base, mask, value) (TRNG_WR_SEC_CFG(base, (TRNG_RD_SEC_CFG(base) & ~(mask)) | (value))) -/*@}*/ - -/*! - * @name Register TRNG_SEC_CFG, field NO_PRGM[1] (RW) - * - * If set the TRNG registers cannot be programmed. That is, regardless of the - * TRNG access mode in the SA-TRNG Miscellaneous Control Register. - * - * Values: - * - 0b0 - Programability of registers controlled only by the RNG Miscellaneous - * Control Register's access mode bit. - * - 0b1 - Overides RNG Miscellaneous Control Register access mode and prevents - * TRNG register programming. - */ -/*@{*/ -/*! @brief Read current value of the TRNG_SEC_CFG_NO_PRGM field. */ -#define TRNG_RD_SEC_CFG_NO_PRGM(base) \ - ((TRNG_SEC_CFG_REG(base) & TRNG_SEC_CFG_NO_PRGM_MASK) >> TRNG_SEC_CFG_NO_PRGM_SHIFT) - -/*! @brief Set the NO_PRGM field to a new value. */ -#define TRNG_WR_SEC_CFG_NO_PRGM(base, value) \ - (TRNG_RMW_SEC_CFG(base, TRNG_SEC_CFG_NO_PRGM_MASK, TRNG_SEC_CFG_NO_PRGM(value))) -/*@}*/ - -/*! @brief Array to map TRNG instance number to base pointer. */ -static TRNG_Type *const s_trngBases[] = TRNG_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Clock array name */ -static const clock_ip_name_t s_trngClock[] = TRNG_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Prototypes - *******************************************************************************/ -static status_t trng_ApplyUserConfig(TRNG_Type *base, const trng_config_t *userConfig); -static status_t trng_SetRetryCount(TRNG_Type *base, uint8_t retry_count); -static status_t trng_SetMonobitLimit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit1Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit2Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit3Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit4Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit5Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetRunBit6Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetPokerMaxLimit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum); -static status_t trng_SetFrequencyCountMaxLimit(TRNG_Type *base, uint32_t limit_minimum, uint32_t limit_maximum); -static status_t trng_SetStatisticalCheckLimit(TRNG_Type *base, - trng_statistical_check_t statistical_check, - const trng_statistical_check_limit_t *limit); -static uint32_t trng_ReadEntropy(TRNG_Type *base, uint32_t index); -static uint32_t trng_GetInstance(TRNG_Type *base); - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t trng_GetInstance(TRNG_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_trngBases); instance++) - { - if (s_trngBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_trngBases)); - - return instance; -} - -/*FUNCTION********************************************************************* - * - * Function Name : TRNG_InitUserConfigDefault - * Description : Initializes user configuration structure to default settings. - * - *END*************************************************************************/ -/*! - * brief Initializes the user configuration structure to default values. - * - * This function initializes the configuration structure to default values. The default - * values are as follows. - * code - * userConfig->lock = 0; - * userConfig->clockMode = kTRNG_ClockModeRingOscillator; - * userConfig->ringOscDiv = kTRNG_RingOscDiv0; Or to other kTRNG_RingOscDiv[2|8] depending on the platform. - * userConfig->sampleMode = kTRNG_SampleModeRaw; - * userConfig->entropyDelay = 3200; - * userConfig->sampleSize = 2500; - * userConfig->sparseBitLimit = TRNG_USER_CONFIG_DEFAULT_SPARSE_BIT_LIMIT; - * userConfig->retryCount = 63; - * userConfig->longRunMaxLimit = 34; - * userConfig->monobitLimit.maximum = 1384; - * userConfig->monobitLimit.minimum = 1116; - * userConfig->runBit1Limit.maximum = 405; - * userConfig->runBit1Limit.minimum = 227; - * userConfig->runBit2Limit.maximum = 220; - * userConfig->runBit2Limit.minimum = 98; - * userConfig->runBit3Limit.maximum = 125; - * userConfig->runBit3Limit.minimum = 37; - * userConfig->runBit4Limit.maximum = 75; - * userConfig->runBit4Limit.minimum = 11; - * userConfig->runBit5Limit.maximum = 47; - * userConfig->runBit5Limit.minimum = 1; - * userConfig->runBit6PlusLimit.maximum = 47; - * userConfig->runBit6PlusLimit.minimum = 1; - * userConfig->pokerLimit.maximum = 26912; - * userConfig->pokerLimit.minimum = 24445; - * userConfig->frequencyCountLimit.maximum = 25600; - * userConfig->frequencyCountLimit.minimum = 1600; - * endcode - * - * param userConfig User configuration structure. - * return If successful, returns the kStatus_TRNG_Success. Otherwise, it returns an error. - */ -status_t TRNG_GetDefaultConfig(trng_config_t *userConfig) -{ - status_t result; - - if (userConfig != NULL) - { - /* Initializes the configuration structure to default values. */ - - /* Lock programmability of TRNG registers. */ - userConfig->lock = (bool)TRNG_USER_CONFIG_DEFAULT_LOCK; - /* Clock settings */ - userConfig->clockMode = kTRNG_ClockModeRingOscillator; - userConfig->ringOscDiv = TRNG_USER_CONFIG_DEFAULT_OSC_DIV; - userConfig->sampleMode = kTRNG_SampleModeRaw; - /* Seed control*/ - userConfig->entropyDelay = TRNG_USER_CONFIG_DEFAULT_ENTROPY_DELAY; - userConfig->sampleSize = TRNG_USER_CONFIG_DEFAULT_SAMPLE_SIZE; - userConfig->sparseBitLimit = TRNG_USER_CONFIG_DEFAULT_SPARSE_BIT_LIMIT; - - /* Statistical Check Parameters.*/ - userConfig->retryCount = TRNG_USER_CONFIG_DEFAULT_RETRY_COUNT; - userConfig->longRunMaxLimit = TRNG_USER_CONFIG_DEFAULT_RUN_MAX_LIMIT; - - userConfig->monobitLimit.maximum = TRNG_USER_CONFIG_DEFAULT_MONOBIT_MAXIMUM; - userConfig->monobitLimit.minimum = TRNG_USER_CONFIG_DEFAULT_MONOBIT_MINIMUM; - userConfig->runBit1Limit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT1_MAXIMUM; - userConfig->runBit1Limit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT1_MINIMUM; - userConfig->runBit2Limit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT2_MAXIMUM; - userConfig->runBit2Limit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT2_MINIMUM; - userConfig->runBit3Limit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT3_MAXIMUM; - userConfig->runBit3Limit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT3_MINIMUM; - userConfig->runBit4Limit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT4_MAXIMUM; - userConfig->runBit4Limit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT4_MINIMUM; - userConfig->runBit5Limit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT5_MAXIMUM; - userConfig->runBit5Limit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT5_MINIMUM; - userConfig->runBit6PlusLimit.maximum = TRNG_USER_CONFIG_DEFAULT_RUNBIT6PLUS_MAXIMUM; - userConfig->runBit6PlusLimit.minimum = TRNG_USER_CONFIG_DEFAULT_RUNBIT6PLUS_MINIMUM; - /* Limits for statistical check of "Poker Test". */ - userConfig->pokerLimit.maximum = TRNG_USER_CONFIG_DEFAULT_POKER_MAXIMUM; - userConfig->pokerLimit.minimum = TRNG_USER_CONFIG_DEFAULT_POKER_MINIMUM; - /* Limits for statistical check of entropy sample frequency count. */ - userConfig->frequencyCountLimit.maximum = TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MAXIMUM; - userConfig->frequencyCountLimit.minimum = TRNG_USER_CONFIG_DEFAULT_FREQUENCY_MINIMUM; - - result = kStatus_Success; - } - else - { - result = kStatus_InvalidArgument; - } - - return result; -} - -/*! - * @brief Sets the TRNG retry count. - * - * This function sets the retry counter which defines the number of times a - * statistical check may fails during the TRNG Entropy Generation before - * generating an error. - */ -static status_t trng_SetRetryCount(TRNG_Type *base, uint8_t retry_count) -{ - status_t status; - - if ((retry_count >= 1u) && (retry_count <= 15u)) - { - /* Set retry count.*/ - TRNG_WR_SCMISC_RTY_CT(base, retry_count); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Check Monobit Limit Register . - * - * This function set register TRNG_SCML - Statistical Check Monobit Limit Register - */ -static status_t trng_SetMonobitLimit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0xffffu) && (limit_maximum <= 0xffffu)) - - { - /* Set TRNG_SCML register */ - TRNG_WR_SCML_MONO_MAX(base, limit_maximum); - TRNG_WR_SCML_MONO_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 1 Limit Register . - * - * This function set register TRNG_SCR1L - Statistical Check Run Length 1 Limit Register - */ -static status_t trng_SetRunBit1Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0x7fffu) && (limit_maximum <= 0x7fffu)) - { - /* Set TRNG_SCR1L register */ - TRNG_WR_SCR1L_RUN1_MAX(base, limit_maximum); - TRNG_WR_SCR1L_RUN1_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 2 Limit Register . - * - * This function set register TRNG_SCR2L - Statistical Check Run Length 2 Limit Register - */ -static status_t trng_SetRunBit2Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0x3fffu) && (limit_maximum <= 0x3fffu)) - { - /* Set TRNG_SCR2L register */ - TRNG_WR_SCR2L_RUN2_MAX(base, limit_maximum); - TRNG_WR_SCR2L_RUN2_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 3 Limit Register . - * - * This function set register TRNG_SCR3L - Statistical Check Run Length 3 Limit Register - */ -static status_t trng_SetRunBit3Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0x1fffu) && (limit_maximum <= 0x1fffu)) - { - /* Set TRNG_SCR3L register */ - TRNG_WR_SCR3L_RUN3_MAX(base, limit_maximum); - TRNG_WR_SCR3L_RUN3_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 4 Limit Register . - * This function set register TRNG_SCR4L - Statistical Check Run Length 4 Limit Register - */ -static status_t trng_SetRunBit4Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0xfffu) && (limit_maximum <= 0xfffu)) - { - /* Set TRNG_SCR4L register */ - TRNG_WR_SCR4L_RUN4_MAX(base, limit_maximum); - TRNG_WR_SCR4L_RUN4_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 5 Limit Register . - * This function set register TRNG_SCR5L - Statistical Check Run Length 5 Limit Register - */ -static status_t trng_SetRunBit5Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0x7ffu) && (limit_maximum <= 0x7ffu)) - { - /* Set TRNG_SCR5L register */ - TRNG_WR_SCR5L_RUN5_MAX(base, limit_maximum); - TRNG_WR_SCR5L_RUN5_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Statistical Check Run Length 6 Limit Register . - * This function set register TRNG_SCR6L - Statistical Check Run Length 6 Limit Register - */ -static status_t trng_SetRunBit6Limit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0x7ffu) && (limit_maximum <= 0x7ffu)) - { - /* Set TRNG_SCR6L register */ - TRNG_WR_SCR6PL_RUN6P_MAX(base, limit_maximum); - TRNG_WR_SCR6PL_RUN6P_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Poker Maximum Limit Register. - * This function set register TRNG_PKRMAX - Poker Maximum Limit Register - */ -static status_t trng_SetPokerMaxLimit(TRNG_Type *base, uint32_t range, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((range <= 0xffffu) && (limit_maximum <= 0xffffffu)) - { - /* Set TRNG_PKRMAX register */ - TRNG_WR_PKRMAX_PKR_MAX(base, limit_maximum); - TRNG_WR_PKRRNG_PKR_RNG(base, range); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical Frequency Count Maximum Limit Register. - * This function set register TRNG_FRQMAX - Frequency Count Maximum Limit Register - */ -static status_t trng_SetFrequencyCountMaxLimit(TRNG_Type *base, uint32_t limit_minimum, uint32_t limit_maximum) -{ - status_t status; - - /* Check input parameters*/ - if ((limit_minimum <= 0x3fffffu) && (limit_maximum <= 0x3fffffu)) - { - /* Set FRQMAX register */ - TRNG_WR_FRQMAX_FRQ_MAX(base, limit_maximum); - TRNG_WR_FRQMIN_FRQ_MIN(base, limit_minimum); - status = kStatus_Success; - } - else - { - status = kStatus_InvalidArgument; - } - return status; -} - -/*! - * @brief Sets statistical check limits. - * - * This function is used to set minimum and maximum limits of statistical checks. - * - */ -static status_t trng_SetStatisticalCheckLimit(TRNG_Type *base, - trng_statistical_check_t statistical_check, - const trng_statistical_check_limit_t *limit) -{ - uint32_t range; - status_t status = kStatus_Success; - - if ((NULL != limit) && (limit->maximum > limit->minimum)) - { - range = limit->maximum - limit->minimum; /* Registers use range instead of minimum value.*/ - - if (statistical_check == kTRNG_StatisticalCheckMonobit) /* Allowable maximum and minimum number of ones/zero - detected during entropy generation. */ - { - status = trng_SetMonobitLimit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit1) /* Allowable maximum and minimum number of runs of - length 1 detected during entropy generation. */ - { - status = trng_SetRunBit1Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit2) /* Allowable maximum and minimum number of runs of - length 2 detected during entropy generation. */ - { - status = trng_SetRunBit2Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit3) /* Allowable maximum and minimum number of runs of - length 3 detected during entropy generation. */ - { - status = trng_SetRunBit3Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit4) /* Allowable maximum and minimum number of runs of - length 4 detected during entropy generation. */ - { - status = trng_SetRunBit4Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit5) /* Allowable maximum and minimum number of runs of - length 5 detected during entropy generation. */ - { - status = trng_SetRunBit5Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckRunBit6Plus) /* Allowable maximum and minimum number of - length 6 or more detected during entropy - generation */ - { - status = trng_SetRunBit6Limit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckPoker) /* Allowable maximum and minimum limit of "Poker - Test" detected during entropy generation . */ - { - status = trng_SetPokerMaxLimit(base, range, limit->maximum); - } - else if (statistical_check == kTRNG_StatisticalCheckFrequencyCount) /* Allowable maximum and minimum limit of - entropy sample frquency count during - entropy generation . */ - { - status = trng_SetFrequencyCountMaxLimit(base, limit->minimum, limit->maximum); - } - else - { - status = kStatus_InvalidArgument; - } - } - - return status; -} - -/*FUNCTION********************************************************************* - * - * Function Name : trng_ApplyUserConfig - * Description : Apply user configuration settings to TRNG module. - * - *END*************************************************************************/ -static status_t trng_ApplyUserConfig(TRNG_Type *base, const trng_config_t *userConfig) -{ - status_t status; - - /* Set retry count */ - status = trng_SetRetryCount(base, userConfig->retryCount); - - /* Set statistical check limit */ - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckMonobit, &userConfig->monobitLimit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit1, &userConfig->runBit1Limit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit2, &userConfig->runBit2Limit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit3, &userConfig->runBit3Limit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit4, &userConfig->runBit4Limit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit5, &userConfig->runBit5Limit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckRunBit6Plus, &userConfig->runBit6PlusLimit); - } - - if (kStatus_Success == status) - { - status = trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckPoker, &userConfig->pokerLimit); - } - - if (kStatus_Success == status) - { - status = - trng_SetStatisticalCheckLimit(base, kTRNG_StatisticalCheckFrequencyCount, &userConfig->frequencyCountLimit); - } - - if (kStatus_Success == status) - { - /* Set clock mode used to operate TRNG */ - TRNG_WR_MCTL_FOR_SCLK(base, userConfig->clockMode); - /* Set ring oscillator divider used by TRNG */ - TRNG_WR_MCTL_OSC_DIV(base, userConfig->ringOscDiv); - /* Set sample mode of the TRNG ring oscillator. */ - TRNG_WR_MCTL_SAMP_MODE(base, userConfig->sampleMode); - /* Set length of each Entropy sample taken */ - TRNG_WR_SDCTL_ENT_DLY(base, userConfig->entropyDelay); - /* Set number of entropy samples that will be taken during Entropy generation */ - TRNG_WR_SDCTL_SAMP_SIZE(base, userConfig->sampleSize); - /* Set Sparse Bit Limit */ - TRNG_WR_SBLIM_SB_LIM(base, userConfig->sparseBitLimit); - TRNG_WR_SCMISC_LRUN_MAX(base, userConfig->longRunMaxLimit); - } - - return status; -} - -/*! - * @brief Gets a entry data from the TRNG. - * - * This function gets an entropy data from TRNG. - * Entropy data is spread over TRNG_ENT_COUNT registers. - * Read register number is defined by index parameter. - */ -static uint32_t trng_ReadEntropy(TRNG_Type *base, uint32_t index) -{ - uint32_t data; - - index = index % TRNG_ENT_COUNT; /* This way we can use incremental index without limit control from application.*/ - - data = TRNG_RD_ENT(base, index); - - if (index == (TRNG_ENT_COUNT - 1u)) - { - /* Dummy read. Defect workaround. - * TRNG could not clear ENT_VAL flag automatically, application - * had to do a dummy reading operation for anyone TRNG register - * to clear it firstly, then to read the RTENT0 to RTENT15 again */ - index = TRNG_RD_ENT(base, 0); - } - - return data; -} - -/*! - * brief Initializes the TRNG. - * - * This function initializes the TRNG. - * When called, the TRNG entropy generation starts immediately. - * - * param base TRNG base address - * param userConfig Pointer to the initialization configuration structure. - * return If successful, returns the kStatus_TRNG_Success. Otherwise, it returns an error. - */ -status_t TRNG_Init(TRNG_Type *base, const trng_config_t *userConfig) -{ - status_t result; - - /* Check input parameters.*/ - if ((base != NULL) && (userConfig != NULL)) - { -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the clock gate. */ - CLOCK_EnableClock(s_trngClock[trng_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - - /* Clear pending errors, set program mode and reset the registers to default values.*/ - /* MCTL[PRGM] = 1 (kTRNG_WorkModeProgram); MCTL[ERR] = 1; MCTL[RST_DEF] = 1 */ - TRNG_RMW_MCTL(base, (TRNG_MCTL_PRGM_MASK | TRNG_MCTL_ERR_MASK | TRNG_MCTL_RST_DEF_MASK), - TRNG_MCTL_PRGM(kTRNG_WorkModeProgram) | TRNG_MCTL_ERR(1) | TRNG_MCTL_RST_DEF(1)); - - /* Set configuration.*/ - if ((result = trng_ApplyUserConfig(base, userConfig)) == kStatus_Success) - { - /* Start entropy generation.*/ - /* Set to Run mode.*/ - TRNG_WR_MCTL_PRGM(base, kTRNG_WorkModeRun); -#if !(defined(FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC) && (FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC > 0)) - /* Enable TRNG Access Mode. To generate an Entropy - * value that can be read via the true0-true15 registers.*/ - TRNG_WR_MCTL_TRNG_ACC(base, 1); -#endif /* !FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC */ - - (void)trng_ReadEntropy(base, (TRNG_ENT_COUNT - 1u)); - - if (true == userConfig->lock) /* Disable programmability of TRNG registers. */ - { - TRNG_WR_SEC_CFG_NO_PRGM(base, 1); - } - - result = kStatus_Success; - } - } - else - { - result = kStatus_InvalidArgument; - } - - return result; -} - -/*! - * brief Shuts down the TRNG. - * - * This function shuts down the TRNG. - * - * param base TRNG base address. - */ -void TRNG_Deinit(TRNG_Type *base) -{ - /* Check input parameters.*/ - if (NULL != base) - { - /* Move to program mode. Stop entropy generation.*/ - TRNG_WR_MCTL_PRGM(base, kTRNG_WorkModeProgram); - - /* Check before clock stop. - TRNG turns on the TRNG free-running ring oscillator whenever new entropy - is being generated and turns off the ring oscillator when entropy generation - is complete. If the TRNG clock is stopped while the TRNG ring oscillator - is running, the oscillator continues running though the RNG clock. - is stopped. */ - while (TRNG_RD_MCTL_TSTOP_OK(base) == 0u) - { - } - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable Clock*/ - CLOCK_DisableClock(s_trngClock[trng_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - } -} - -/*! - * brief Gets random data. - * - * This function gets random data from the TRNG. - * - * param base TRNG base address. - * param data Pointer address used to store random data. - * param dataSize Size of the buffer pointed by the data parameter. - * return random data - */ -status_t TRNG_GetRandomData(TRNG_Type *base, void *data, size_t dataSize) -{ - status_t result = kStatus_Success; - uint32_t random_32; - uint8_t *random_p; - uint32_t random_size; - uint8_t *data_p = (uint8_t *)data; - uint32_t i; - uint32_t tmpValidFlag; - uint32_t tmpErrorFlag; - - int index = 0; - - /* Check input parameters.*/ - if ((NULL != base) && (NULL != data) && (0U != dataSize)) - { - /* After a deepsleep exit some errors bits are set in MCTL and must be cleared before processing further. - Also, trigger new 512 bits entropy generation to be sure we will have fresh bits.*/ - if (0U != TRNG_RD_MCTL_ERR(base)) - { - /* clear errors bits */ - TRNG_WR_MCTL_ERR(base, 1); - /* restart new entropy generation */ - trng_ReadEntropy(base, (TRNG_ENT_COUNT - 1u)); - } - - do - { - /* Wait for Valid or Error flag*/ - tmpValidFlag = TRNG_RD_MCTL_ENT_VAL(base); - tmpErrorFlag = TRNG_RD_MCTL_ERR(base); - while ((tmpValidFlag == 0u) && (tmpErrorFlag == 0u)) - { - tmpValidFlag = TRNG_RD_MCTL_ENT_VAL(base); - tmpErrorFlag = TRNG_RD_MCTL_ERR(base); - } - - /* Check HW error.*/ - if (0U != TRNG_RD_MCTL_ERR(base)) - { - result = kStatus_Fail; /* TRNG module error occurred */ - /* Clear error.*/ - TRNG_WR_MCTL_ERR(base, 1); - break; /* No sense stay here.*/ - } - - /* Read Entropy.*/ - random_32 = trng_ReadEntropy(base, (uint32_t)index++); - - random_p = (uint8_t *)&random_32; - - if (dataSize < sizeof(random_32)) - { - random_size = dataSize; - } - else - { - random_size = sizeof(random_32); - } - - for (i = 0U; i < random_size; i++) - { - *data_p++ = *random_p++; - } - - dataSize -= random_size; - } while (dataSize > 0u); - - /* Start a new entropy generation. - It is done by reading of the last entropy register.*/ - if (((unsigned)index % TRNG_ENT_COUNT) != 0U) - { - (void)trng_ReadEntropy(base, (TRNG_ENT_COUNT - 1u)); - } - } - else - { - result = kStatus_InvalidArgument; - } - - return result; -} - -#endif /* FSL_FEATURE_SOC_TRNG_COUNT */ diff --git a/devices/MIMXRT1052/drivers/fsl_trng.h b/devices/MIMXRT1052/drivers/fsl_trng.h deleted file mode 100644 index cf154e4..0000000 --- a/devices/MIMXRT1052/drivers/fsl_trng.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. - * Copyright 2016-2018, 2020-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_TRNG_DRIVER_H_ -#define _FSL_TRNG_DRIVER_H_ - -#include "fsl_common.h" - -#if defined(FSL_FEATURE_SOC_TRNG_COUNT) && FSL_FEATURE_SOC_TRNG_COUNT - -/*! - * @addtogroup trng - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief TRNG driver version 2.0.13. - * - * Current version: 2.0.13 - * - - * Change log: - * - version 2.0.13 - * - After deepsleep it might return error, added clearing bits in TRNG_GetRandomData() and generating new entropy. - * - Modified reloading entropy in TRNG_GetRandomData(), for some data length it doesn't reloading entropy correctly. - * - version 2.0.12 - * - For KW34A4_SERIES, KW35A4_SERIES, KW36A4_SERIES set TRNG_USER_CONFIG_DEFAULT_OSC_DIV to kTRNG_RingOscDiv8. - * - version 2.0.11 - * - Add clearing pending errors in TRNG_Init(). - * - version 2.0.10 - * - Fixed doxygen issues. - * - version 2.0.9 - * - Fix HIS_CCM metrics issues. - * - version 2.0.8 - * - For K32L2A41A_SERIES set TRNG_USER_CONFIG_DEFAULT_OSC_DIV to kTRNG_RingOscDiv4. - * - version 2.0.7 - * - Fix MISRA 2004 issue rule 12.5. - * - version 2.0.6 - * - For KW35Z4_SERIES set TRNG_USER_CONFIG_DEFAULT_OSC_DIV to kTRNG_RingOscDiv8. - * - version 2.0.5 - * - Add possibility to define default TRNG configuration by device specific preprocessor macros - * for FRQMIN, FRQMAX and OSCDIV. - * - version 2.0.4 - * - Fix MISRA-2012 issues. - * - Version 2.0.3 - * - update TRNG_Init to restart entropy generation - * - Version 2.0.2 - * - fix MISRA issues - * - Version 2.0.1 - * - add support for KL8x and KL28Z - * - update default OSCDIV for K81 to divide by 2 - */ -#define FSL_TRNG_DRIVER_VERSION (MAKE_VERSION(2, 0, 13)) -/*@}*/ - -/*! @brief TRNG sample mode. Used by trng_config_t. */ -typedef enum _trng_sample_mode -{ - kTRNG_SampleModeVonNeumann = 0U, /*!< Use von Neumann data in both Entropy shifter and Statistical Checker. */ - kTRNG_SampleModeRaw = 1U, /*!< Use raw data into both Entropy shifter and Statistical Checker. */ - kTRNG_SampleModeVonNeumannRaw = - 2U /*!< Use von Neumann data in Entropy shifter. Use raw data into Statistical Checker. */ -} trng_sample_mode_t; - -/*! @brief TRNG clock mode. Used by trng_config_t. */ -typedef enum _trng_clock_mode -{ - kTRNG_ClockModeRingOscillator = 0U, /*!< Ring oscillator is used to operate the TRNG (default). */ - kTRNG_ClockModeSystem = 1U /*!< System clock is used to operate the TRNG. This is for test use only, and - indeterminate results may occur. */ -} trng_clock_mode_t; - -/*! @brief TRNG ring oscillator divide. Used by trng_config_t. */ -typedef enum _trng_ring_osc_div -{ - kTRNG_RingOscDiv0 = 0U, /*!< Ring oscillator with no divide */ - kTRNG_RingOscDiv2 = 1U, /*!< Ring oscillator divided-by-2. */ - kTRNG_RingOscDiv4 = 2U, /*!< Ring oscillator divided-by-4. */ - kTRNG_RingOscDiv8 = 3U /*!< Ring oscillator divided-by-8. */ -} trng_ring_osc_div_t; - -/*! @brief Data structure for definition of statistical check limits. Used by trng_config_t. */ -typedef struct _trng_statistical_check_limit -{ - uint32_t maximum; /*!< Maximum limit.*/ - uint32_t minimum; /*!< Minimum limit.*/ -} trng_statistical_check_limit_t; - -/*! - * @brief Data structure for the TRNG initialization - * - * This structure initializes the TRNG by calling the TRNG_Init() function. - * It contains all TRNG configurations. - */ -typedef struct _trng_user_config -{ - bool lock; /*!< @brief Disable programmability of TRNG registers. */ - trng_clock_mode_t clockMode; /*!< @brief Clock mode used to operate TRNG.*/ - trng_ring_osc_div_t ringOscDiv; /*!< @brief Ring oscillator divide used by TRNG. */ - trng_sample_mode_t sampleMode; /*!< @brief Sample mode of the TRNG ring oscillator. */ - /* Seed Control*/ - uint16_t - entropyDelay; /*!< @brief Entropy Delay. Defines the length (in system clocks) of each Entropy sample taken. */ - uint16_t sampleSize; /*!< @brief Sample Size. Defines the total number of Entropy samples that will be taken during - Entropy generation. */ - uint16_t sparseBitLimit; /*!< @brief Sparse Bit Limit which defines the maximum number of - * consecutive samples that may be discarded before an error is generated. - * This limit is used only for during von Neumann sampling (enabled by - * TRNG_HAL_SetSampleMode()). Samples are discarded if two consecutive raw samples are both - * 0 or both 1. If this discarding occurs for a long period of time, it indicates that - * there is insufficient Entropy. */ - /* Statistical Check Parameters.*/ - uint8_t retryCount; /*!< @brief Retry count. It defines the number of times a statistical check may fails - * during the TRNG Entropy Generation before generating an error. */ - uint8_t longRunMaxLimit; /*!< @brief Largest allowable number of consecutive samples of all 1, or all 0, - * that is allowed during the Entropy generation. */ - trng_statistical_check_limit_t monobitLimit; /*!< @brief Maximum and minimum limits for statistical check of number - of ones/zero detected during entropy generation. */ - trng_statistical_check_limit_t runBit1Limit; /*!< @brief Maximum and minimum limits for statistical check of number - of runs of length 1 detected during entropy generation. */ - trng_statistical_check_limit_t runBit2Limit; /*!< @brief Maximum and minimum limits for statistical check of number - of runs of length 2 detected during entropy generation. */ - trng_statistical_check_limit_t runBit3Limit; /*!< @brief Maximum and minimum limits for statistical check of number - of runs of length 3 detected during entropy generation. */ - trng_statistical_check_limit_t runBit4Limit; /*!< @brief Maximum and minimum limits for statistical check of number - of runs of length 4 detected during entropy generation. */ - trng_statistical_check_limit_t runBit5Limit; /*!< @brief Maximum and minimum limits for statistical check of number - of runs of length 5 detected during entropy generation. */ - trng_statistical_check_limit_t runBit6PlusLimit; /*!< @brief Maximum and minimum limits for statistical check of - number of runs of length 6 or more detected during entropy - generation. */ - trng_statistical_check_limit_t - pokerLimit; /*!< @brief Maximum and minimum limits for statistical check of "Poker Test". */ - trng_statistical_check_limit_t frequencyCountLimit; /*!< @brief Maximum and minimum limits for statistical check of - entropy sample frequency count. */ -} trng_config_t; - -/******************************************************************************* - * API - *******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Initializes the user configuration structure to default values. - * - * This function initializes the configuration structure to default values. The default - * values are as follows. - * @code - * userConfig->lock = 0; - * userConfig->clockMode = kTRNG_ClockModeRingOscillator; - * userConfig->ringOscDiv = kTRNG_RingOscDiv0; Or to other kTRNG_RingOscDiv[2|8] depending on the platform. - * userConfig->sampleMode = kTRNG_SampleModeRaw; - * userConfig->entropyDelay = 3200; - * userConfig->sampleSize = 2500; - * userConfig->sparseBitLimit = TRNG_USER_CONFIG_DEFAULT_SPARSE_BIT_LIMIT; - * userConfig->retryCount = 63; - * userConfig->longRunMaxLimit = 34; - * userConfig->monobitLimit.maximum = 1384; - * userConfig->monobitLimit.minimum = 1116; - * userConfig->runBit1Limit.maximum = 405; - * userConfig->runBit1Limit.minimum = 227; - * userConfig->runBit2Limit.maximum = 220; - * userConfig->runBit2Limit.minimum = 98; - * userConfig->runBit3Limit.maximum = 125; - * userConfig->runBit3Limit.minimum = 37; - * userConfig->runBit4Limit.maximum = 75; - * userConfig->runBit4Limit.minimum = 11; - * userConfig->runBit5Limit.maximum = 47; - * userConfig->runBit5Limit.minimum = 1; - * userConfig->runBit6PlusLimit.maximum = 47; - * userConfig->runBit6PlusLimit.minimum = 1; - * userConfig->pokerLimit.maximum = 26912; - * userConfig->pokerLimit.minimum = 24445; - * userConfig->frequencyCountLimit.maximum = 25600; - * userConfig->frequencyCountLimit.minimum = 1600; - * @endcode - * - * @param userConfig User configuration structure. - * @return If successful, returns the kStatus_TRNG_Success. Otherwise, it returns an error. - */ -status_t TRNG_GetDefaultConfig(trng_config_t *userConfig); - -/*! - * @brief Initializes the TRNG. - * - * This function initializes the TRNG. - * When called, the TRNG entropy generation starts immediately. - * - * @param base TRNG base address - * @param userConfig Pointer to the initialization configuration structure. - * @return If successful, returns the kStatus_TRNG_Success. Otherwise, it returns an error. - */ -status_t TRNG_Init(TRNG_Type *base, const trng_config_t *userConfig); - -/*! - * @brief Shuts down the TRNG. - * - * This function shuts down the TRNG. - * - * @param base TRNG base address. - */ -void TRNG_Deinit(TRNG_Type *base); - -/*! - * @brief Gets random data. - * - * This function gets random data from the TRNG. - * - * @param base TRNG base address. - * @param data Pointer address used to store random data. - * @param dataSize Size of the buffer pointed by the data parameter. - * @return random data - */ -status_t TRNG_GetRandomData(TRNG_Type *base, void *data, size_t dataSize); - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* FSL_FEATURE_SOC_TRNG_COUNT */ -#endif /*_FSL_TRNG_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_tsc.c b/devices/MIMXRT1052/drivers/fsl_tsc.c deleted file mode 100644 index 403f661..0000000 --- a/devices/MIMXRT1052/drivers/fsl_tsc.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_tsc.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.tsc" -#endif - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get instance number for TSC module. - * - * @param base TSC peripheral base address - */ -static uint32_t TSC_GetInstance(TSC_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief Pointers to TSC bases for each instance. */ -static TSC_Type *const s_tscBases[] = TSC_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief Pointers to ADC clocks for each instance. */ -static const clock_ip_name_t s_tscClocks[] = TSC_CLOCKS; -#endif - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t TSC_GetInstance(TSC_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_tscBases); instance++) - { - if (s_tscBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_tscBases)); - - return instance; -} - -/*! - * brief Initialize the TSC module. - * - * param base TSC peripheral base address. - * param config Pointer to "tsc_config_t" structure. - */ -void TSC_Init(TSC_Type *base, const tsc_config_t *config) -{ - assert(NULL != config); - assert(config->measureDelayTime <= 0xFFFFFFU); - - uint32_t tmp32; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable the TSC clock. */ - CLOCK_EnableClock(s_tscClocks[TSC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - /* Configure TSC_BASIC_SETTING register. */ - tmp32 = TSC_BASIC_SETTING_MEASURE_DELAY_TIME(config->measureDelayTime) | - TSC_BASIC_SETTING__4_5_WIRE(config->detectionMode); - if (config->enableAutoMeasure) - { - tmp32 |= TSC_BASIC_SETTING_AUTO_MEASURE_MASK; - } - base->BASIC_SETTING = tmp32; - /* Configure TSC_PS_INPUT_BUFFER_ADDR register. */ - base->PRE_CHARGE_TIME = TSC_PRE_CHARGE_TIME_PRE_CHARGE_TIME(config->prechargeTime); -} - -/*! - * brief De-initializes the TSC module. - * - * param base TSC peripheral base address. - */ -void TSC_Deinit(TSC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable the TSC clcok. */ - CLOCK_DisableClock(s_tscClocks[TSC_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Gets an available pre-defined settings for the controller's configuration. - * - * This function initializes the converter configuration structure with available settings. - * The default values of measureDelayTime and prechargeTime is tested on LCD8000-43T screen and work normally. - * The default values are: - * code - * config->enableAutoMeausre = false; - * config->measureDelayTime = 0xFFFFU; - * config->prechargeTime = 0xFFFFU; - * config->detectionMode = kTSC_4WireDetectionMode; - * endCode - * param config Pointer to "tsc_config_t" structure. - */ -void TSC_GetDefaultConfig(tsc_config_t *config) -{ - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableAutoMeasure = false; - config->measureDelayTime = 0xFFFFU; - config->prechargeTime = 0xFFFFU; - config->detectionMode = kTSC_Detection4WireMode; -} - -/*! - * brief Get Y coordinate value or X coordinate value. The value is an ADC conversion value. - * - * param base TSC peripheral base address. - * param selection Select alternative measure value which is Y coordinate value or X coordinate value. - * See "tsc_corrdinate_value_selection_t". - * return If selection is "kTSC_XCoordinateValueSelection", the API returns x-coordinate vlaue. - * If selection is "kTSC_YCoordinateValueSelection", the API returns y-coordinate vlaue. - */ -uint32_t TSC_GetMeasureValue(TSC_Type *base, tsc_corrdinate_value_selection_t selection) -{ - uint32_t tmp32 = 0; - - if (selection == kTSC_XCoordinateValueSelection) - { - tmp32 = ((base->MEASEURE_VALUE) & TSC_MEASEURE_VALUE_X_VALUE_MASK) >> TSC_MEASEURE_VALUE_X_VALUE_SHIFT; - } - else if (selection == kTSC_YCoordinateValueSelection) - { - tmp32 = ((base->MEASEURE_VALUE) & TSC_MEASEURE_VALUE_Y_VALUE_MASK) >> TSC_MEASEURE_VALUE_Y_VALUE_SHIFT; - } - else - { - /* Intentional empty */ - } - - return tmp32; -} - -/*! - * brief Send hardware trigger signal to ADC in debug mode. The trigger signal must last at least 1 ips clock period. - * - * param base TSC peripheral base address. - * param hwts Hardware trigger select signal, select which channel to start conversion. See "tsc_trigger_signal_t". - * On ADC side, HWTS = 1 << x indicates the x logic channel is selected to start hardware ADC conversion. - * param enable Switcher of the trigger signal. "true" means generate trigger signal, "false" means don't generate - * trigger signal. - */ -void TSC_DebugTriggerSignalToADC(TSC_Type *base, tsc_trigger_signal_t hwts, bool enable) -{ - if (enable) - { - /* TSC_DEBUG_MODE_EXT_HWTS field should be writed before writing TSC_DEBUG_MODE_TRIGGER field. - If the two fields are writed at the same time, the trigger couldn't work as expect. */ - base->DEBUG_MODE &= ~TSC_DEBUG_MODE_EXT_HWTS_MASK; - base->DEBUG_MODE |= TSC_DEBUG_MODE_EXT_HWTS(hwts); - base->DEBUG_MODE |= TSC_DEBUG_MODE_TRIGGER_MASK; - } - else - { - base->DEBUG_MODE &= ~TSC_DEBUG_MODE_TRIGGER_MASK; - } -} - -/*! - * brief Enable/Disable detection in debug mode. - * - * param base TSC peripheral base address. - * param detectionMode Set detect mode. See "tsc_detection_mode_t" - * param enable Switcher of detect enable. "true" means enable detection, "false" means disable detection. - */ -void TSC_DebugEnableDetection(TSC_Type *base, tsc_detection_mode_t detectionMode, bool enable) -{ - if (detectionMode == kTSC_Detection4WireMode) - { - if (enable) - { - base->DEBUG_MODE2 |= TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_MASK; - } - else - { - base->DEBUG_MODE2 &= ~TSC_DEBUG_MODE2_DETECT_ENABLE_FOUR_WIRE_MASK; - } - } - else if (detectionMode == kTSC_Detection5WireMode) - { - if (enable) - { - base->DEBUG_MODE2 |= TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_MASK; - } - else - { - base->DEBUG_MODE2 &= ~TSC_DEBUG_MODE2_DETECT_ENABLE_FIVE_WIRE_MASK; - } - } - else - { - /* Intentional empty */ - } -} - -/*! - * brief Set TSC port mode in debug mode.(pull down, pull up and 200k-pull up) - * - * param base TSC peripheral base address. - * param port TSC controller ports. - * param mode TSC port mode.(pull down, pull up and 200k-pull up) - */ -void TSC_DebugSetPortMode(TSC_Type *base, tsc_port_source_t port, tsc_port_mode_t mode) -{ - uint32_t tmp32; - - tmp32 = base->DEBUG_MODE2; - switch (port) - { - case kTSC_WiperPortSource: - tmp32 &= ~(TSC_DEBUG_MODE2_WIPER_200K_PULL_UP_MASK | TSC_DEBUG_MODE2_WIPER_PULL_UP_MASK | - TSC_DEBUG_MODE2_WIPER_PULL_DOWN_MASK); - tmp32 |= ((uint32_t)mode << TSC_DEBUG_MODE2_WIPER_PULL_DOWN_SHIFT); - break; - case kTSC_YnlrPortSource: - tmp32 &= ~(TSC_DEBUG_MODE2_YNLR_200K_PULL_UP_MASK | TSC_DEBUG_MODE2_YNLR_PULL_UP_MASK | - TSC_DEBUG_MODE2_YNLR_PULL_DOWN_MASK); - tmp32 |= ((uint32_t)mode << TSC_DEBUG_MODE2_YNLR_PULL_DOWN_SHIFT); - break; - case kTSC_YpllPortSource: - tmp32 &= ~(TSC_DEBUG_MODE2_YPLL_200K_PULL_UP_MASK | TSC_DEBUG_MODE2_YPLL_PULL_UP_MASK | - TSC_DEBUG_MODE2_YPLL_PULL_DOWN_MASK); - tmp32 |= ((uint32_t)mode << TSC_DEBUG_MODE2_YPLL_PULL_DOWN_SHIFT); - break; - case kTSC_XnurPortSource: - tmp32 &= ~(TSC_DEBUG_MODE2_XNUR_200K_PULL_UP_MASK | TSC_DEBUG_MODE2_XNUR_PULL_UP_MASK | - TSC_DEBUG_MODE2_XNUR_PULL_DOWN_MASK); - tmp32 |= ((uint32_t)mode << TSC_DEBUG_MODE2_XNUR_PULL_DOWN_SHIFT); - break; - case kTSC_XpulPortSource: - tmp32 &= ~(TSC_DEBUG_MODE2_XPUL_200K_PULL_UP_MASK | TSC_DEBUG_MODE2_XPUL_PULL_UP_MASK | - TSC_DEBUG_MODE2_XPUL_PULL_DOWN_MASK); - tmp32 |= ((uint32_t)mode << TSC_DEBUG_MODE2_XPUL_PULL_DOWN_SHIFT); - break; - default: - assert(false); - break; - } - base->DEBUG_MODE2 = tmp32; -} diff --git a/devices/MIMXRT1052/drivers/fsl_tsc.h b/devices/MIMXRT1052/drivers/fsl_tsc.h deleted file mode 100644 index c43fc39..0000000 --- a/devices/MIMXRT1052/drivers/fsl_tsc.h +++ /dev/null @@ -1,524 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_TSC_H_ -#define _FSL_TSC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup tsc - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ -/*! @brief TSC driver version */ -#define FSL_TSC_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) /*!< Version 2.0.3. */ - -/*! - * @ Controller detection mode. - */ -typedef enum _tsc_detection_mode -{ - kTSC_Detection4WireMode = 0U, /*!< 4-Wire Detection Mode. */ - kTSC_Detection5WireMode = 1U, /*!< 5-Wire Detection Mode. */ -} tsc_detection_mode_t; - -/*! - * @ Coordinate value mask. - */ -typedef enum _tsc_corrdinate_value_selection -{ - kTSC_XCoordinateValueSelection = 0U, /*!< X coordinate value is selected. */ - kTSC_YCoordinateValueSelection = 1U, /*!< Y coordinate value is selected. */ -} tsc_corrdinate_value_selection_t; - -/*! - * @ Interrupt signal enable/disable mask. - */ -enum _tsc_interrupt_signal_mask -{ - kTSC_IdleSoftwareSignalEnable = TSC_INT_SIG_EN_IDLE_SW_SIG_EN_MASK, /*!< Enable the interrupt signal when the - controller has return to idle status. - The signal is only valid after using - TSC_ReturnToIdleStatus API. */ - kTSC_ValidSignalEnable = TSC_INT_SIG_EN_VALID_SIG_EN_MASK, /*!< Enable the interrupt signal when controller receives - a detect signal after measurement. */ - kTSC_DetectSignalEnable = - TSC_INT_SIG_EN_DETECT_SIG_EN_MASK, /*!< Enable the interrupt signal when controller receives a detect signal. */ - kTSC_MeasureSignalEnable = TSC_INT_SIG_EN_MEASURE_SIG_EN_MASK, /*!< Enable the interrupt signal after the touch - detection which follows measurement. */ -}; - -/*! - * @ Interrupt enable/disable mask. - */ -enum _tsc_interrupt_mask -{ - kTSC_IdleSoftwareInterruptEnable = - TSC_INT_EN_IDLE_SW_INT_EN_MASK, /*!< Enable the interrupt when the controller has return to idle status. - The interrupt is only valid after using TSC_ReturnToIdleStatus API. */ - kTSC_DetectInterruptEnable = - TSC_INT_EN_DETECT_INT_EN_MASK, /*!< Enable the interrupt when controller receive a detect signal. */ - kTSC_MeasureInterruptEnable = TSC_INT_EN_MEASURE_INT_EN_MASK, /*!< Enable the interrupt after the touch detection - which follows measurement. */ -}; - -/*! - * @ Interrupt Status flag mask. - */ -enum _tsc_interrupt_status_flag_mask -{ - kTSC_IdleSoftwareFlag = - TSC_INT_STATUS_IDLE_SW_MASK, /*!< This flag is set if the controller has return to idle status. - The flag is only valid after using TSC_ReturnToIdleStatus API. */ - kTSC_ValidSignalFlag = - TSC_INT_STATUS_VALID_MASK, /*!< This flag is set if controller receives a detect signal after measurement. */ - kTSC_DetectSignalFlag = TSC_INT_STATUS_DETECT_MASK, /*!< This flag is set if controller receives a detect signal. */ - kTSC_MeasureSignalFlag = - TSC_INT_STATUS_MEASURE_MASK, /*!< This flag is set after the touch detection which follows measurement. - Note: Valid signal falg will be cleared along with measure signal flag. */ -}; - -/*! - * @ ADC status flag mask. - */ -enum _tsc_adc_status_flag_mask -{ - kTSC_ADCCOCOSignalFlag = - TSC_DEBUG_MODE_ADC_COCO_MASK, /*!< This signal is generated by ADC when a conversion is completed. */ - kTSC_ADCConversionValueFlag = TSC_DEBUG_MODE_ADC_CONV_VALUE_MASK, /*!< This signal is generated by ADC and indicates - the result of an ADC conversion. */ -}; - -/*! - * @ TSC status flag mask. - */ -enum _tsc_status_flag_mask -{ - kTSC_IntermediateStateFlag = TSC_DEBUG_MODE2_INTERMEDIATE_MASK, /*!< This flag is set if TSC is in intermediate - state, between two state machine states. */ - kTSC_DetectFiveWireFlag = TSC_DEBUG_MODE2_DETECT_FIVE_WIRE_MASK, /*!< This flag is set if TSC receives a 5-wire - detect signal. It is only valid when the TSC in - detect state and DETECT_ENABLE_FIVE_WIRE bit is - set. */ - kTSC_DetectFourWireFlag = TSC_DEBUG_MODE2_DETECT_FOUR_WIRE_MASK, /*!< This flag is set if TSC receives a 4-wire - detect signal. It is only valid when the TSC in - detect state and DETECT_ENABLE_FOUR_WIRE bit is - set. */ - kTSC_GlitchThresholdFlag = TSC_DEBUG_MODE2_DE_GLITCH_MASK, /*!< This field indicates glitch threshold.The threshold - is defined by number of clock cycles. See - "tsc_glitch_threshold_t". - If value = 00, Normal function: 0x1fff ipg clock - cycles, Low power mode: 0x9 low power clock cycles. - If value = 01, Normal function: 0xfff ipg clock - cycles, Low power mode: :0x7 low power clock cycles. - If value = 10, Normal function: 0x7ff ipg clock - cycles, Low power mode:0x5 low power clock cycles. - If value = 11, Normal function: 0x3 ipg clock - cycles, Low power mode:0x3 low power clock cycles. */ - kTSC_StateMachineFlag = - TSC_DEBUG_MODE2_STATE_MACHINE_MASK, /*!< This field indicates the state of TSC. See "tsc_state_machine_t"; - if value = 000, Controller is in idle state. - if value = 001, Controller is in 1st-Pre-charge state. - if value = 010, Controller is in 1st-detect state. - if value = 011, Controller is in x-measure state. - if value = 100, Controller is in y-measure state. - if value = 101, Controller is in 2nd-Pre-charge state. - if value = 110, Controller is in 2nd-detect state. */ -}; - -/*! - * @brief TSC state machine. These seven states are TSC complete workflow. - */ -typedef enum _tsc_state_machine -{ - kTSC_IdleState = 0U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in idle state. */ - kTSC_1stPreChargeState = 1U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in 1st-Pre-charge state. */ - kTSC_1stDetectState = 2U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in 1st-detect state. */ - kTSC_XMeasureState = 3U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in x-measure state. */ - kTSC_YMeasureState = 4U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in y-measure state. */ - kTSC_2ndPreChargeState = 5U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in 2nd-Pre-charge state. */ - kTSC_2ndDetectState = 6U << TSC_DEBUG_MODE2_STATE_MACHINE_SHIFT, /*!< Controller is in 2nd-detect state. */ -} tsc_state_machine_t; - -/*! - * @brief TSC glitch threshold. - */ -typedef enum _tsc_glitch_threshold -{ - kTSC_glitchThresholdALT0 = 0U << TSC_DEBUG_MODE2_DE_GLITCH_SHIFT, /*!< Normal function: 0x1fff ipg clock cycles, Low - power mode: 0x9 low power clock cycles. */ - kTSC_glitchThresholdALT1 = 1U << TSC_DEBUG_MODE2_DE_GLITCH_SHIFT, /*!< Normal function: 0xfff ipg clock cycles, Low - power mode: :0x7 low power clock cycles. */ - kTSC_glitchThresholdALT2 = 2U << TSC_DEBUG_MODE2_DE_GLITCH_SHIFT, /*!< Normal function: 0x7ff ipg clock cycles, Low - power mode: :0x5 low power clock cycles. */ - kTSC_glitchThresholdALT3 = - 3U << TSC_DEBUG_MODE2_DE_GLITCH_SHIFT, /*!< Normal function: 0x3 ipg clock cycles, Low - power mode: :0x3 low power clock cycles. */ -} tsc_glitch_threshold_t; - -/*! - * @ Hardware trigger select signal, select which ADC channel to start conversion. - */ -typedef enum _tsc_trigger_signal -{ - kTSC_TriggerToChannel0 = 1U << 0U, /*!< Trigger to ADC channel0. ADC_HC0 register will be used to conversion. */ - kTSC_TriggerToChannel1 = 1U << 1U, /*!< Trigger to ADC channel1. ADC_HC1 register will be used to conversion. */ - kTSC_TriggerToChannel2 = 1U << 2U, /*!< Trigger to ADC channel2. ADC_HC2 register will be used to conversion. */ - kTSC_TriggerToChannel3 = 1U << 3U, /*!< Trigger to ADC channel3. ADC_HC3 register will be used to conversion. */ - kTSC_TriggerToChannel4 = 1U << 4U, /*!< Trigger to ADC channel4. ADC_HC4 register will be used to conversion. */ -} tsc_trigger_signal_t; - -/*! - * @ TSC controller ports. - */ -typedef enum _tsc_port_source -{ - kTSC_WiperPortSource = 0U, /*!< TSC controller wiper port. */ - kTSC_YnlrPortSource = 1U, /*!< TSC controller ynlr port. */ - kTSC_YpllPortSource = 2U, /*!< TSC controller ypll port. */ - kTSC_XnurPortSource = 3U, /*!< TSC controller xnur port. */ - kTSC_XpulPortSource = 4U, /*!< TSC controller xpul port. */ -} tsc_port_source_t; - -/*! - * @ TSC port mode. - */ -typedef enum _tsc_port_mode -{ - kTSC_PortOffMode = 0U, /*!< Disable pull up/down mode. */ - kTSC_Port200k_PullUpMode = 1U << 2U, /*!< 200k-pull up mode. */ - kTSC_PortPullUpMode = 1U << 1U, /*!< Pull up mode. */ - kTSC_PortPullDownMode = 1U << 0U, /*!< Pull down mode. */ -} tsc_port_mode_t; - -/*! - * @ Controller configuration. - */ -typedef struct _tsc_config -{ - bool enableAutoMeasure; /*!< Enable the auto-measure. It indicates after detect touch, whether automatic start - measurement */ - uint32_t measureDelayTime; /*!< Set delay time(0U~0xFFFFFFU) to even potential distribution ready.It is a - preparation for measure stage. If measure dalay time is too short, maybe it would - have an undesired effect on measure value. */ - uint32_t prechargeTime; /*!< Set pre-charge time(1U~0xFFFFFFFFU) to make the upper layer of - screen to charge to positive high. It is a preparation for detection stage. - Pre-charge time must is greater than 0U, otherwise TSC could not work normally. - If pre-charge dalay time is too short, maybe it would have an undesired effect on - generation of valid signal(kTSC_ValidSignalFlag).*/ - tsc_detection_mode_t detectionMode; /*!< Select the detection mode. See "tsc_detection_mode_t". */ -} tsc_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Initialize the TSC module. - * - * @param base TSC peripheral base address. - * @param config Pointer to "tsc_config_t" structure. - */ -void TSC_Init(TSC_Type *base, const tsc_config_t *config); - -/*! - * @brief De-initializes the TSC module. - * - * @param base TSC peripheral base address. - */ -void TSC_Deinit(TSC_Type *base); - -/*! - * @brief Gets an available pre-defined settings for the controller's configuration. - * - * This function initializes the converter configuration structure with available settings. - * The default values of measureDelayTime and prechargeTime is tested on LCD8000-43T screen and work normally. - * The default values are: - * @code - * config->enableAutoMeausre = false; - * config->measureDelayTime = 0xFFFFU; - * config->prechargeTime = 0xFFFFU; - * config->detectionMode = kTSC_4WireDetectionMode; - * @endcode - * @param config Pointer to "tsc_config_t" structure. - */ -void TSC_GetDefaultConfig(tsc_config_t *config); - -/*! - * @brief Make the TSC module return to idle status after finish the current state operation. - * Application could check TSC status to confirm that the controller has return to idle status. - * - * @param base TSC peripheral base address. - */ -static inline void TSC_ReturnToIdleStatus(TSC_Type *base) -{ - /* TSC_FLOW_CONTROL_DISABLE_MASK is a HW self-clean bit. */ - base->FLOW_CONTROL |= TSC_FLOW_CONTROL_DISABLE_MASK; -} - -/*! - * @brief Start sense detection and (if work in auto-measure mode) measure after detect a touch. - * - * @param base TSC peripheral base address. - */ -static inline void TSC_StartSenseDetection(TSC_Type *base) -{ - /* TSC_FLOW_CONTROL_START_SENSE_MASK is a HW self-clean bit. */ - base->FLOW_CONTROL |= TSC_FLOW_CONTROL_START_SENSE_MASK; -} - -/*! - * @brief start measure X/Y coordinate value after detect a touch. - * - * @param base TSC peripheral base address. - */ -static inline void TSC_StartMeasure(TSC_Type *base) -{ - /* TSC_FLOW_CONTROL_START_MEASURE_MASK is a HW self-clean bit. */ - base->FLOW_CONTROL |= TSC_FLOW_CONTROL_START_MEASURE_MASK; -} - -/*! - * @brief Drop measure X/Y coordinate value after detect a touch and controller return to idle status. - * - * @param base TSC peripheral base address. - */ -static inline void TSC_DropMeasure(TSC_Type *base) -{ - /* TSC_FLOW_CONTROL_DROP_MEASURE_MASK is a HW self-clean bit. */ - base->FLOW_CONTROL |= TSC_FLOW_CONTROL_DROP_MEASURE_MASK; -} - -/*! - * @brief This is a synchronization reset, which resets every register except IPS directly access ones. - * - * @param base TSC peripheral base address. - */ -static inline void TSC_SoftwareReset(TSC_Type *base) -{ - /* TSC_FLOW_CONTROL_SW_RST_MASK is a HW self-clean bit. */ - base->FLOW_CONTROL |= TSC_FLOW_CONTROL_SW_RST_MASK; -} - -/*! - * @brief Get Y coordinate value or X coordinate value. The value is an ADC conversion value. - * - * @param base TSC peripheral base address. - * @param selection Select alternative measure value which is Y coordinate value or X coordinate value. - * See "tsc_corrdinate_value_selection_t". - * @return If selection is "kTSC_XCoordinateValueSelection", the API returns x-coordinate vlaue. - * If selection is "kTSC_YCoordinateValueSelection", the API returns y-coordinate vlaue. - */ -uint32_t TSC_GetMeasureValue(TSC_Type *base, tsc_corrdinate_value_selection_t selection); - -/*! - * @brief Enable the interrupt signals. Interrupt signal will be set when corresponding event happens. - * Specific events point to "_tsc_interrupt_signal_mask" . - * Specific interrupt signal point to "_tsc_interrupt_status_flag_mask"; - * - * @param base TSC peripheral base address. - * @param mask Interrupt signals mask. See "_tsc_interrupt_signal_mask". - */ -static inline void TSC_EnableInterruptSignals(TSC_Type *base, uint32_t mask) -{ - base->INT_SIG_EN |= mask; -} - -/*! - * @brief Disable the interrupt signals. Interrupt signal will be set when corresponding event happens. - * Specific events point to "_tsc_interrupt_signal_mask". - * Specific interrupt signal point to "_tsc_interrupt_status_flag_mask"; - * - * @param base TSC peripheral base address. - * @param mask Interrupt signals mask. See "_tsc_interrupt_signal_mask". - */ -static inline void TSC_DisableInterruptSignals(TSC_Type *base, uint32_t mask) -{ - base->INT_SIG_EN &= ~mask; -} - -/*! - * @brief Enable the interrupts. Notice: Only interrupts and signals are all enabled, interrupts - * could work normally. - * - * @param base TSC peripheral base address. - * @param mask Interrupts mask. See "_tsc_interrupt_mask". - */ -static inline void TSC_EnableInterrupts(TSC_Type *base, uint32_t mask) -{ - base->INT_EN |= mask; -} - -/*! - * @brief Disable the interrupts. - * - * @param base TSC peripheral base address. - * @param mask Interrupts mask. See "_tsc_interrupt_mask". - */ -static inline void TSC_DisableInterrupts(TSC_Type *base, uint32_t mask) -{ - base->INT_EN &= ~mask; -} - -/*! - * @brief Get interrupt status flags. Interrupt status falgs are valid when corresponding - * interrupt signals are enabled. - * - * @param base TSC peripheral base address. - * @return Status flags asserted mask. See "_tsc_interrupt_status_flag_mask". - */ -static inline uint32_t TSC_GetInterruptStatusFlags(TSC_Type *base) -{ - return base->INT_STATUS; -} - -/*! - * @brief Clear interrupt status flags. Interrupt status falgs are valid when corresponding - * interrupt signals are enabled. - * - * @param base TSC peripheral base address. - * @param mask Status flags mask. See "_tsc_interrupt_status_flag_mask". - */ -static inline void TSC_ClearInterruptStatusFlags(TSC_Type *base, uint32_t mask) -{ - base->INT_STATUS = mask; -} - -/*! - * @brief Get the status flags of ADC working with TSC. - * - * @param base TSC peripheral base address. - * @return Status flags asserted mask. See "_tsc_adc_status_flag_mask". - */ -static inline uint32_t TSC_GetADCStatusFlags(TSC_Type *base) -{ - return base->DEBUG_MODE; -} - -/*! - * @brief Get the status flags of TSC. - * - * @param base TSC peripheral base address. - * @return Status flags asserted mask. See "_tsc_status_flag_mask". - */ -static inline uint32_t TSC_GetStatusFlags(TSC_Type *base) -{ - return base->DEBUG_MODE2; -} - -/*! - *@} - */ - -/******************************************************************************* - * Debug API - ******************************************************************************/ - -/*! - * @brief Enable/Disable debug mode. Once work in debug mode, then all - * TSC outputs will be controlled by software. Software can also observe all TSC inputs - * through debug interface. Furthermore, the debug registers also provides current state - * machine states. Software can always check the current hardware state. - * - * @param base TSC peripheral base address. - * @param enable Switcher of the debug mode. "true" means debug mode,"false" means non-debug mode. - */ -static inline void TSC_EnableDebugMode(TSC_Type *base, bool enable) -{ - if (enable) - { - base->DEBUG_MODE |= TSC_DEBUG_MODE_DEBUG_EN_MASK; - } - else - { - base->DEBUG_MODE &= ~TSC_DEBUG_MODE_DEBUG_EN_MASK; - } -} - -/*! - * @brief Send hardware trigger signal to ADC in debug mode. The trigger signal must last at least 1 ips clock period. - * - * @param base TSC peripheral base address. - * @param hwts Hardware trigger select signal, select which channel to start conversion. See "tsc_trigger_signal_t". - * On ADC side, HWTS = 1 << x indicates the x logic channel is selected to start hardware ADC conversion. - * @param enable Switcher of the trigger signal. "true" means generate trigger signal, "false" means don't generate - * trigger signal. - */ -void TSC_DebugTriggerSignalToADC(TSC_Type *base, tsc_trigger_signal_t hwts, bool enable); - -/*! - * @brief Enable/Disable hardware generates an ADC COCO clear signal in debug mode. - * - * @param base TSC peripheral base address. - * @param enable Switcher of the function of hardware generating an ADC COCO clear signal. - * "true" means prevent TSC from generate ADC COCO clear signal. - * "false" means allow TSC hardware generates ADC COCO clear. - */ -static inline void TSC_DebugDisableHWClear(TSC_Type *base, bool enable) -{ - if (enable) - { - base->DEBUG_MODE |= TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_MASK; - } - else - { - base->DEBUG_MODE &= ~TSC_DEBUG_MODE_ADC_COCO_CLEAR_DISABLE_MASK; - } -} - -/*! - * @brief Send clear ADC COCO signal to ADC in debug mode. The signal must hold a while. - * - * @param base TSC peripheral base address. - * @param enable Switcher of the clear signal."true" means generate clear signal, "false" means don't generate - * clear signal. - */ -static inline void TSC_DebugClearSignalToADC(TSC_Type *base, bool enable) -{ - if (enable) - { - base->DEBUG_MODE |= TSC_DEBUG_MODE_ADC_COCO_CLEAR_MASK; - } - else - { - base->DEBUG_MODE &= ~TSC_DEBUG_MODE_ADC_COCO_CLEAR_MASK; - } -} - -/*! - * @brief Enable/Disable detection in debug mode. - * - * @param base TSC peripheral base address. - * @param detectionMode Set detect mode. See "tsc_detection_mode_t" - * @param enable Switcher of detect enable. "true" means enable detection, "false" means disable detection. - */ -void TSC_DebugEnableDetection(TSC_Type *base, tsc_detection_mode_t detectionMode, bool enable); - -/*! - * @brief Set TSC port mode in debug mode.(pull down, pull up and 200k-pull up) - * - * @param base TSC peripheral base address. - * @param port TSC controller ports. - * @param mode TSC port mode.(pull down, pull up and 200k-pull up) - */ -void TSC_DebugSetPortMode(TSC_Type *base, tsc_port_source_t port, tsc_port_mode_t mode); - -#if defined(__cplusplus) -} -#endif - -/* @} */ - -#endif /* _FSL_TSC_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_usdhc.c b/devices/MIMXRT1052/drivers/fsl_usdhc.c deleted file mode 100644 index ec90b5f..0000000 --- a/devices/MIMXRT1052/drivers/fsl_usdhc.c +++ /dev/null @@ -1,2480 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_usdhc.h" -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL -#include "fsl_cache.h" -#endif /* FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL */ -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#include "fsl_memory.h" -#endif -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.usdhc" -#endif - -/*! @brief Clock setting */ -/* Max SD clock divisor from base clock */ -#define USDHC_MAX_DVS ((USDHC_SYS_CTRL_DVS_MASK >> USDHC_SYS_CTRL_DVS_SHIFT) + 1U) -#define USDHC_MAX_CLKFS ((USDHC_SYS_CTRL_SDCLKFS_MASK >> USDHC_SYS_CTRL_SDCLKFS_SHIFT) + 1U) -#define USDHC_PREV_DVS(x) ((x) -= 1U) -#define USDHC_PREV_CLKFS(x, y) ((x) >>= (y)) -/*! @brief USDHC ADMA table address align size */ -#define USDHC_ADMA_TABLE_ADDRESS_ALIGN (4U) - -/* Typedef for interrupt handler. */ -typedef void (*usdhc_isr_t)(USDHC_Type *base, usdhc_handle_t *handle); -/*! @brief check flag avalibility */ -#define IS_USDHC_FLAG_SET(reg, flag) (((reg) & ((uint32_t)flag)) != 0UL) - -/*! @brief usdhc transfer flags */ -enum _usdhc_transfer_flags -{ - kUSDHC_CommandOnly = 1U, /*!< transfer command only */ - kUSDHC_CommandAndTxData = 2U, /*!< transfer command and transmit data */ - kUSDHC_CommandAndRxData = 4U, /*!< transfer command and receive data */ - kUSDHC_DataWithAutoCmd12 = 8U, /*!< transfer data with auto cmd12 enabled */ - kUSDHC_DataWithAutoCmd23 = 16U, /*!< transfer data with auto cmd23 enabled */ - kUSDHC_BootData = 32U, /*!< transfer boot data */ - kUSDHC_BootDataContinuous = 64U, /*!< transfer boot data continuous */ -}; - -#if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET -#define USDHC_ADDR_CPU_2_DMA(addr) (MEMORY_ConvertMemoryMapAddress((addr), kMEMORY_Local2DMA)) -#else -#define USDHC_ADDR_CPU_2_DMA(addr) (addr) -#endif -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief Get the instance. - * - * @param base USDHC peripheral base address. - * @return Instance number. - */ -static uint32_t USDHC_GetInstance(USDHC_Type *base); - -/*! - * @brief Start transfer according to current transfer state - * - * @param base USDHC peripheral base address. - * @param transferFlags transfer flags, @ref _usdhc_transfer_flags. - * @param blockSize block size. - * @param blockCount block count. - */ -static status_t USDHC_SetTransferConfig(USDHC_Type *base, - uint32_t transferFlags, - size_t blockSize, - uint32_t blockCount); - -/*! - * @brief Receive command response - * - * @param base USDHC peripheral base address. - * @param command Command to be sent. - */ -static status_t USDHC_ReceiveCommandResponse(USDHC_Type *base, usdhc_command_t *command); - -/*! - * @brief Read DATAPORT when buffer enable bit is set. - * - * @param base USDHC peripheral base address. - * @param data Data to be read. - * @param transferredWords The number of data words have been transferred last time transaction. - * @return The number of total data words have been transferred after this time transaction. - */ -static uint32_t USDHC_ReadDataPort(USDHC_Type *base, usdhc_data_t *data, uint32_t transferredWords); - -/*! - * @brief Read data by using DATAPORT polling way. - * - * @param base USDHC peripheral base address. - * @param data Data to be read. - * @retval kStatus_Fail Read DATAPORT failed. - * @retval kStatus_Success Operate successfully. - */ -static status_t USDHC_ReadByDataPortBlocking(USDHC_Type *base, usdhc_data_t *data); - -/*! - * @brief Write DATAPORT when buffer enable bit is set. - * - * @param base USDHC peripheral base address. - * @param data Data to be read. - * @param transferredWords The number of data words have been transferred last time. - * @return The number of total data words have been transferred after this time transaction. - */ -static uint32_t USDHC_WriteDataPort(USDHC_Type *base, usdhc_data_t *data, uint32_t transferredWords); - -/*! - * @brief Write data by using DATAPORT polling way. - * - * @param base USDHC peripheral base address. - * @param data Data to be transferred. - * @retval kStatus_Fail Write DATAPORT failed. - * @retval kStatus_Success Operate successfully. - */ -static status_t USDHC_WriteByDataPortBlocking(USDHC_Type *base, usdhc_data_t *data); - -/*! - * @brief Transfer data by polling way. - * - * @param base USDHC peripheral base address. - * @param data Data to be transferred. - * @param use DMA flag. - * @retval kStatus_Fail Transfer data failed. - * @retval kStatus_InvalidArgument Argument is invalid. - * @retval kStatus_Success Operate successfully. - */ -static status_t USDHC_TransferDataBlocking(USDHC_Type *base, usdhc_data_t *data, bool enDMA); - -/*! - * @brief wait command done - * - * @param base USDHC peripheral base address. - * @param command configuration - * @param pollingCmdDone polling command done flag - */ -static status_t USDHC_WaitCommandDone(USDHC_Type *base, usdhc_command_t *command, bool pollingCmdDone); - -/*! - * @brief Handle card detect interrupt. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param interruptFlags Card detect related interrupt flags. - */ -static void USDHC_TransferHandleCardDetect(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags); - -/*! - * @brief Handle command interrupt. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param interruptFlags Command related interrupt flags. - */ -static void USDHC_TransferHandleCommand(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags); - -/*! - * @brief Handle data interrupt. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param interruptFlags Data related interrupt flags. - */ -static void USDHC_TransferHandleData(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags); - -/*! - * @brief Handle SDIO card interrupt signal. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - */ -static void USDHC_TransferHandleSdioInterrupt(USDHC_Type *base, usdhc_handle_t *handle); - -/*! - * @brief Handle SDIO block gap event. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - */ -static void USDHC_TransferHandleBlockGap(USDHC_Type *base, usdhc_handle_t *handle); - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) -/*! - * @brief Handle retuning - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param interrupt flags - */ -static void USDHC_TransferHandleReTuning(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags); -#endif -/******************************************************************************* - * Variables - ******************************************************************************/ -/*! @brief USDHC base pointer array */ -static USDHC_Type *const s_usdhcBase[] = USDHC_BASE_PTRS; - -/*! @brief USDHC internal handle pointer array */ -static usdhc_handle_t *s_usdhcHandle[ARRAY_SIZE(s_usdhcBase)] = {NULL}; - -/*! @brief USDHC IRQ name array */ -static const IRQn_Type s_usdhcIRQ[] = USDHC_IRQS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/*! @brief USDHC clock array name */ -static const clock_ip_name_t s_usdhcClock[] = USDHC_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -#if (defined(FSL_FEATURE_USDHC_HAS_RESET) && FSL_FEATURE_USDHC_HAS_RESET) -/*! @brief Pointers to USDHC resets for each instance. */ -static const reset_ip_name_t s_usdhcResets[] = USDHC_RSTS; -#endif - -/* USDHC ISR for transactional APIs. */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -static usdhc_isr_t s_usdhcIsr = (usdhc_isr_t)DefaultISR; -#else -static usdhc_isr_t s_usdhcIsr; -#endif -/*! @brief Dummy data buffer for mmc boot mode */ -AT_NONCACHEABLE_SECTION_ALIGN(static uint32_t s_usdhcBootDummy, USDHC_ADMA2_ADDRESS_ALIGN); - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t USDHC_GetInstance(USDHC_Type *base) -{ - uint8_t instance = 0; - - while ((instance < ARRAY_SIZE(s_usdhcBase)) && (s_usdhcBase[instance] != base)) - { - instance++; - } - - assert(instance < ARRAY_SIZE(s_usdhcBase)); - - return instance; -} - -static status_t USDHC_SetTransferConfig(USDHC_Type *base, uint32_t transferFlags, size_t blockSize, uint32_t blockCount) -{ - uint32_t mixCtrl = base->MIX_CTRL; - - if (((uint32_t)kUSDHC_CommandOnly & transferFlags) != 0U) - { - /* clear data flags */ - mixCtrl &= ~(USDHC_MIX_CTRL_MSBSEL_MASK | USDHC_MIX_CTRL_BCEN_MASK | USDHC_MIX_CTRL_DTDSEL_MASK | - USDHC_MIX_CTRL_AC12EN_MASK | USDHC_MIX_CTRL_AC23EN_MASK); - - if (IS_USDHC_FLAG_SET(base->PRES_STATE, kUSDHC_CommandInhibitFlag)) - { - return kStatus_USDHC_BusyTransferring; - } - } - else - { - /* if transfer boot continous, only need set the CREQ bit, leave others as it is */ - if ((transferFlags & (uint32_t)kUSDHC_BootDataContinuous) != 0U) - { - /* clear stop at block gap request */ - base->PROT_CTRL &= ~USDHC_PROT_CTRL_SABGREQ_MASK; - /* continous transfer data */ - base->PROT_CTRL |= USDHC_PROT_CTRL_CREQ_MASK; - return kStatus_Success; - } - - /* check data inhibit flag */ - if (IS_USDHC_FLAG_SET(base->PRES_STATE, kUSDHC_DataInhibitFlag)) - { - return kStatus_USDHC_BusyTransferring; - } - /* check transfer block count */ - if ((blockCount > USDHC_MAX_BLOCK_COUNT)) - { - return kStatus_InvalidArgument; - } - - /* config mix parameter */ - mixCtrl &= ~(USDHC_MIX_CTRL_MSBSEL_MASK | USDHC_MIX_CTRL_BCEN_MASK | USDHC_MIX_CTRL_DTDSEL_MASK | - USDHC_MIX_CTRL_AC12EN_MASK); - - if ((transferFlags & (uint32_t)kUSDHC_CommandAndRxData) != 0U) - { - mixCtrl |= USDHC_MIX_CTRL_DTDSEL_MASK; - } - - if (blockCount > 1U) - { - mixCtrl |= USDHC_MIX_CTRL_MSBSEL_MASK | USDHC_MIX_CTRL_BCEN_MASK; - /* auto command 12 */ - if ((transferFlags & (uint32_t)kUSDHC_DataWithAutoCmd12) != 0U) - { - mixCtrl |= USDHC_MIX_CTRL_AC12EN_MASK; - } - } - - /* auto command 23, auto send set block count cmd before multiple read/write */ - if ((transferFlags & (uint32_t)kUSDHC_DataWithAutoCmd23) != 0U) - { - mixCtrl |= USDHC_MIX_CTRL_AC23EN_MASK; - base->VEND_SPEC2 |= USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_MASK; - /* config the block count to DS_ADDR */ - base->DS_ADDR = blockCount; - } - else - { - mixCtrl &= ~USDHC_MIX_CTRL_AC23EN_MASK; - base->VEND_SPEC2 &= ~USDHC_VEND_SPEC2_ACMD23_ARGU2_EN_MASK; - } - - /* if transfer boot data, leave the block count to USDHC_SetMmcBootConfig function */ - if ((transferFlags & (uint32_t)kUSDHC_BootData) == 0U) - { - /* config data block size/block count */ - base->BLK_ATT = ((base->BLK_ATT & ~(USDHC_BLK_ATT_BLKSIZE_MASK | USDHC_BLK_ATT_BLKCNT_MASK)) | - (USDHC_BLK_ATT_BLKSIZE(blockSize) | USDHC_BLK_ATT_BLKCNT(blockCount))); - } - else - { - mixCtrl |= USDHC_MIX_CTRL_MSBSEL_MASK | USDHC_MIX_CTRL_BCEN_MASK; - base->PROT_CTRL |= USDHC_PROT_CTRL_RD_DONE_NO_8CLK_MASK; - } - } - /* config the mix parameter */ - base->MIX_CTRL = mixCtrl; - - return kStatus_Success; -} - -void USDHC_SetDataConfig(USDHC_Type *base, - usdhc_transfer_direction_t dataDirection, - uint32_t blockCount, - uint32_t blockSize) -{ - assert(blockCount <= USDHC_MAX_BLOCK_COUNT); - - uint32_t mixCtrl = base->MIX_CTRL; - - /* block attribute configuration */ - base->BLK_ATT = ((base->BLK_ATT & ~(USDHC_BLK_ATT_BLKSIZE_MASK | USDHC_BLK_ATT_BLKCNT_MASK)) | - (USDHC_BLK_ATT_BLKSIZE(blockSize) | USDHC_BLK_ATT_BLKCNT(blockCount))); - - /* config mix parameter */ - mixCtrl &= ~(USDHC_MIX_CTRL_MSBSEL_MASK | USDHC_MIX_CTRL_BCEN_MASK | USDHC_MIX_CTRL_DTDSEL_MASK); - - mixCtrl |= USDHC_MIX_CTRL_DTDSEL(dataDirection) | (blockCount > 1U ? USDHC_MIX_CTRL_MSBSEL_MASK : 0U); - - base->MIX_CTRL = mixCtrl; -} - -static status_t USDHC_ReceiveCommandResponse(USDHC_Type *base, usdhc_command_t *command) -{ - assert(command != NULL); - - uint32_t response0 = base->CMD_RSP0; - uint32_t response1 = base->CMD_RSP1; - uint32_t response2 = base->CMD_RSP2; - - if (command->responseType != kCARD_ResponseTypeNone) - { - command->response[0U] = response0; - if (command->responseType == kCARD_ResponseTypeR2) - { - /* R3-R2-R1-R0(lowest 8 bit is invalid bit) has the same format as R2 format in SD specification document - after removed internal CRC7 and end bit. */ - command->response[0U] <<= 8U; - command->response[1U] = (response1 << 8U) | ((response0 & 0xFF000000U) >> 24U); - command->response[2U] = (response2 << 8U) | ((response1 & 0xFF000000U) >> 24U); - command->response[3U] = (base->CMD_RSP3 << 8U) | ((response2 & 0xFF000000U) >> 24U); - } - } - - /* check response error flag */ - if ((command->responseErrorFlags != 0U) && - ((command->responseType == kCARD_ResponseTypeR1) || (command->responseType == kCARD_ResponseTypeR1b) || - (command->responseType == kCARD_ResponseTypeR6) || (command->responseType == kCARD_ResponseTypeR5))) - { - if (((command->responseErrorFlags) & (command->response[0U])) != 0U) - { - return kStatus_USDHC_SendCommandFailed; - } - } - - return kStatus_Success; -} - -static uint32_t USDHC_ReadDataPort(USDHC_Type *base, usdhc_data_t *data, uint32_t transferredWords) -{ - uint32_t i; - uint32_t totalWords; - uint32_t wordsCanBeRead; /* The words can be read at this time. */ - uint32_t readWatermark = ((base->WTMK_LVL & USDHC_WTMK_LVL_RD_WML_MASK) >> USDHC_WTMK_LVL_RD_WML_SHIFT); - - /* If DMA is enable, do not need to polling data port */ - if ((base->MIX_CTRL & USDHC_MIX_CTRL_DMAEN_MASK) == 0U) - { - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (data->blockSize % sizeof(uint32_t) != 0U) - { - data->blockSize += - sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ - } - - totalWords = ((data->blockCount * data->blockSize) / sizeof(uint32_t)); - - /* If watermark level is equal or bigger than totalWords, transfers totalWords data. */ - if (readWatermark >= totalWords) - { - wordsCanBeRead = totalWords; - } - /* If watermark level is less than totalWords and left words to be sent is equal or bigger than readWatermark, - transfers watermark level words. */ - else if ((readWatermark < totalWords) && ((totalWords - transferredWords) >= readWatermark)) - { - wordsCanBeRead = readWatermark; - } - /* If watermark level is less than totalWords and left words to be sent is less than readWatermark, transfers - left - words. */ - else - { - wordsCanBeRead = (totalWords - transferredWords); - } - - i = 0U; - while (i < wordsCanBeRead) - { - data->rxData[transferredWords++] = USDHC_ReadData(base); - i++; - } - } - - return transferredWords; -} - -static status_t USDHC_ReadByDataPortBlocking(USDHC_Type *base, usdhc_data_t *data) -{ - uint32_t totalWords; - uint32_t transferredWords = 0U, interruptStatus = 0U; - status_t error = kStatus_Success; - - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (data->blockSize % sizeof(uint32_t) != 0U) - { - data->blockSize += - sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ - } - - totalWords = ((data->blockCount * data->blockSize) / sizeof(uint32_t)); - - while ((error == kStatus_Success) && (transferredWords < totalWords)) - { - while ( - !(IS_USDHC_FLAG_SET(interruptStatus, ((uint32_t)kUSDHC_BufferReadReadyFlag | - (uint32_t)kUSDHC_DataErrorFlag | (uint32_t)kUSDHC_TuningErrorFlag)))) - { - interruptStatus = USDHC_GetInterruptStatusFlags(base); - } - - /* during std tuning process, software do not need to read data, but wait BRR is enough */ - if ((data->dataType == (uint32_t)kUSDHC_TransferDataTuning) && - (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_BufferReadReadyFlag))) - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_BufferReadReadyFlag); - - return kStatus_Success; - } -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - else if (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_TuningErrorFlag)) - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_TuningErrorFlag); - /* if tuning error occur ,return directly */ - error = kStatus_USDHC_TuningError; - } -#endif - else if (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_DataErrorFlag)) - { - if (!(data->enableIgnoreError)) - { - error = kStatus_Fail; - } - /* clear data error flag */ - USDHC_ClearInterruptStatusFlags(base, kUSDHC_DataErrorFlag); - } - else - { - /* Intentional empty */ - } - - if (error == kStatus_Success) - { - transferredWords = USDHC_ReadDataPort(base, data, transferredWords); - /* clear buffer read ready */ - USDHC_ClearInterruptStatusFlags(base, kUSDHC_BufferReadReadyFlag); - interruptStatus = 0U; - } - } - - /* Clear data complete flag after the last read operation. */ - USDHC_ClearInterruptStatusFlags(base, kUSDHC_DataCompleteFlag); - - return error; -} - -static uint32_t USDHC_WriteDataPort(USDHC_Type *base, usdhc_data_t *data, uint32_t transferredWords) -{ - uint32_t i; - uint32_t totalWords; - uint32_t wordsCanBeWrote; /* Words can be wrote at this time. */ - uint32_t writeWatermark = ((base->WTMK_LVL & USDHC_WTMK_LVL_WR_WML_MASK) >> USDHC_WTMK_LVL_WR_WML_SHIFT); - - /* If DMA is enable, do not need to polling data port */ - if ((base->MIX_CTRL & USDHC_MIX_CTRL_DMAEN_MASK) == 0U) - { - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (data->blockSize % sizeof(uint32_t) != 0U) - { - data->blockSize += - sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ - } - - totalWords = ((data->blockCount * data->blockSize) / sizeof(uint32_t)); - - /* If watermark level is equal or bigger than totalWords, transfers totalWords data.*/ - if (writeWatermark >= totalWords) - { - wordsCanBeWrote = totalWords; - } - /* If watermark level is less than totalWords and left words to be sent is equal or bigger than watermark, - transfers watermark level words. */ - else if ((writeWatermark < totalWords) && ((totalWords - transferredWords) >= writeWatermark)) - { - wordsCanBeWrote = writeWatermark; - } - /* If watermark level is less than totalWords and left words to be sent is less than watermark, transfers left - words. */ - else - { - wordsCanBeWrote = (totalWords - transferredWords); - } - - i = 0U; - while (i < wordsCanBeWrote) - { - USDHC_WriteData(base, data->txData[transferredWords++]); - i++; - } - } - - return transferredWords; -} - -static status_t USDHC_WriteByDataPortBlocking(USDHC_Type *base, usdhc_data_t *data) -{ - uint32_t totalWords; - - uint32_t transferredWords = 0U, interruptStatus = 0U; - status_t error = kStatus_Success; - - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (data->blockSize % sizeof(uint32_t) != 0U) - { - data->blockSize += - sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ - } - - totalWords = (data->blockCount * data->blockSize) / sizeof(uint32_t); - - while ((error == kStatus_Success) && (transferredWords < totalWords)) - { - while (!(IS_USDHC_FLAG_SET(interruptStatus, (uint32_t)kUSDHC_BufferWriteReadyFlag | - (uint32_t)kUSDHC_DataErrorFlag | - (uint32_t)kUSDHC_TuningErrorFlag))) - { - interruptStatus = USDHC_GetInterruptStatusFlags(base); - } -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - if (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_TuningErrorFlag)) - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_TuningErrorFlag); - /* if tuning error occur ,return directly */ - return kStatus_USDHC_TuningError; - } - else -#endif - if (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_DataErrorFlag)) - { - if (!(data->enableIgnoreError)) - { - error = kStatus_Fail; - } - /* clear data error flag */ - USDHC_ClearInterruptStatusFlags(base, kUSDHC_DataErrorFlag); - } - else - { - /* Intentional empty */ - } - - if (error == kStatus_Success) - { - transferredWords = USDHC_WriteDataPort(base, data, transferredWords); - /* clear buffer write ready */ - USDHC_ClearInterruptStatusFlags(base, kUSDHC_BufferWriteReadyFlag); - interruptStatus = 0U; - } - } - - /* Wait write data complete or data transfer error after the last writing operation. */ - while (!(IS_USDHC_FLAG_SET(interruptStatus, (uint32_t)kUSDHC_DataCompleteFlag | (uint32_t)kUSDHC_DataErrorFlag))) - { - interruptStatus = USDHC_GetInterruptStatusFlags(base); - } - - if ((interruptStatus & (uint32_t)kUSDHC_DataErrorFlag) != 0UL) - { - if (!(data->enableIgnoreError)) - { - error = kStatus_Fail; - } - } - USDHC_ClearInterruptStatusFlags(base, ((uint32_t)kUSDHC_DataCompleteFlag | (uint32_t)kUSDHC_DataErrorFlag)); - - return error; -} - -/*! - * brief send command function - * - * param base USDHC peripheral base address. - * param command configuration - */ -void USDHC_SendCommand(USDHC_Type *base, usdhc_command_t *command) -{ - assert(NULL != command); - - uint32_t xferType = base->CMD_XFR_TYP, flags = command->flags; - - if (((base->PRES_STATE & (uint32_t)kUSDHC_CommandInhibitFlag) == 0U) && (command->type != kCARD_CommandTypeEmpty)) - { - if ((command->responseType == kCARD_ResponseTypeR1) || (command->responseType == kCARD_ResponseTypeR5) || - (command->responseType == kCARD_ResponseTypeR6) || (command->responseType == kCARD_ResponseTypeR7)) - { - flags |= ((uint32_t)kUSDHC_ResponseLength48Flag | (uint32_t)kUSDHC_EnableCrcCheckFlag | - (uint32_t)kUSDHC_EnableIndexCheckFlag); - } - else if ((command->responseType == kCARD_ResponseTypeR1b) || (command->responseType == kCARD_ResponseTypeR5b)) - { - flags |= ((uint32_t)kUSDHC_ResponseLength48BusyFlag | (uint32_t)kUSDHC_EnableCrcCheckFlag | - (uint32_t)kUSDHC_EnableIndexCheckFlag); - } - else if (command->responseType == kCARD_ResponseTypeR2) - { - flags |= ((uint32_t)kUSDHC_ResponseLength136Flag | (uint32_t)kUSDHC_EnableCrcCheckFlag); - } - else if ((command->responseType == kCARD_ResponseTypeR3) || (command->responseType == kCARD_ResponseTypeR4)) - { - flags |= ((uint32_t)kUSDHC_ResponseLength48Flag); - } - else - { - /* Intentional empty */ - } - - if (command->type == kCARD_CommandTypeAbort) - { - flags |= (uint32_t)kUSDHC_CommandTypeAbortFlag; - } - - /* config cmd index */ - xferType &= ~(USDHC_CMD_XFR_TYP_CMDINX_MASK | USDHC_CMD_XFR_TYP_CMDTYP_MASK | USDHC_CMD_XFR_TYP_CICEN_MASK | - USDHC_CMD_XFR_TYP_CCCEN_MASK | USDHC_CMD_XFR_TYP_RSPTYP_MASK | USDHC_CMD_XFR_TYP_DPSEL_MASK); - - xferType |= - (((command->index << USDHC_CMD_XFR_TYP_CMDINX_SHIFT) & USDHC_CMD_XFR_TYP_CMDINX_MASK) | - ((flags) & (USDHC_CMD_XFR_TYP_CMDTYP_MASK | USDHC_CMD_XFR_TYP_CICEN_MASK | USDHC_CMD_XFR_TYP_CCCEN_MASK | - USDHC_CMD_XFR_TYP_RSPTYP_MASK | USDHC_CMD_XFR_TYP_DPSEL_MASK))); - - /* config the command xfertype and argument */ - base->CMD_ARG = command->argument; - base->CMD_XFR_TYP = xferType; - } - - if (command->type == kCARD_CommandTypeEmpty) - { - /* disable CMD done interrupt for empty command */ - base->INT_SIGNAL_EN &= ~USDHC_INT_SIGNAL_EN_CCIEN_MASK; - } -} - -static status_t USDHC_WaitCommandDone(USDHC_Type *base, usdhc_command_t *command, bool pollingCmdDone) -{ - assert(NULL != command); - - status_t error = kStatus_Success; - uint32_t interruptStatus = 0U; - /* check if need polling command done or not */ - if (pollingCmdDone) - { - /* Wait command complete or USDHC encounters error. */ - while (!(IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_CommandFlag))) - { - interruptStatus = USDHC_GetInterruptStatusFlags(base); - } - - if ((interruptStatus & (uint32_t)kUSDHC_CommandErrorFlag) != 0UL) - { - error = kStatus_Fail; - } - - /* Receive response when command completes successfully. */ - if (error == kStatus_Success) - { - error = USDHC_ReceiveCommandResponse(base, command); - } - - USDHC_ClearInterruptStatusFlags(base, kUSDHC_CommandFlag); - } - - return error; -} - -static status_t USDHC_TransferDataBlocking(USDHC_Type *base, usdhc_data_t *data, bool enDMA) -{ - status_t error = kStatus_Success; - uint32_t interruptStatus = 0U; - - if (enDMA) - { - /* Wait data complete or USDHC encounters error. */ - while (!(IS_USDHC_FLAG_SET(interruptStatus, ((uint32_t)kUSDHC_DataDMAFlag | (uint32_t)kUSDHC_TuningErrorFlag)))) - { - interruptStatus = USDHC_GetInterruptStatusFlags(base); - } - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - if (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_TuningErrorFlag)) - { - error = kStatus_USDHC_TuningError; - } - else -#endif - if (IS_USDHC_FLAG_SET(interruptStatus, ((uint32_t)kUSDHC_DataErrorFlag | (uint32_t)kUSDHC_DmaErrorFlag))) - { - if ((!(data->enableIgnoreError)) || (IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_DataTimeoutFlag))) - { - error = kStatus_USDHC_TransferDataFailed; - } - } - else - { - /* Intentional empty */ - } - /* load dummy data */ - if ((data->dataType == (uint32_t)kUSDHC_TransferDataBootcontinous) && (error == kStatus_Success)) - { - *(data->rxData) = s_usdhcBootDummy; - } - - USDHC_ClearInterruptStatusFlags(base, ((uint32_t)kUSDHC_DataDMAFlag | (uint32_t)kUSDHC_TuningErrorFlag)); - } - else - { - if (data->rxData != NULL) - { - error = USDHC_ReadByDataPortBlocking(base, data); - if (error != kStatus_Success) - { - return error; - } - } - else - { - error = USDHC_WriteByDataPortBlocking(base, data); - if (error != kStatus_Success) - { - return error; - } - } - } - - return error; -} - -/*! - * brief USDHC module initialization function. - * - * Configures the USDHC according to the user configuration. - * - * Example: - code - usdhc_config_t config; - config.cardDetectDat3 = false; - config.endianMode = kUSDHC_EndianModeLittle; - config.dmaMode = kUSDHC_DmaModeAdma2; - config.readWatermarkLevel = 128U; - config.writeWatermarkLevel = 128U; - USDHC_Init(USDHC, &config); - endcode - * - * param base USDHC peripheral base address. - * param config USDHC configuration information. - * retval kStatus_Success Operate successfully. - */ -void USDHC_Init(USDHC_Type *base, const usdhc_config_t *config) -{ - assert(config != NULL); - assert((config->writeWatermarkLevel >= 1U) && (config->writeWatermarkLevel <= 128U)); - assert((config->readWatermarkLevel >= 1U) && (config->readWatermarkLevel <= 128U)); -#if !(defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) - assert(config->writeBurstLen <= 16U); -#endif - uint32_t proctl, sysctl, wml; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable USDHC clock. */ - CLOCK_EnableClock(s_usdhcClock[USDHC_GetInstance(base)]); -#endif - -#if (defined(FSL_FEATURE_USDHC_HAS_RESET) && FSL_FEATURE_USDHC_HAS_RESET) - /* Reset the USDHC module */ - RESET_PeripheralReset(s_usdhcResets[USDHC_GetInstance(base)]); -#endif - - /* Reset ALL USDHC. */ - base->SYS_CTRL |= USDHC_SYS_CTRL_RSTA_MASK | USDHC_SYS_CTRL_RSTC_MASK | USDHC_SYS_CTRL_RSTD_MASK; - - proctl = base->PROT_CTRL; - wml = base->WTMK_LVL; - sysctl = base->SYS_CTRL; - - proctl &= ~(USDHC_PROT_CTRL_EMODE_MASK | USDHC_PROT_CTRL_DMASEL_MASK); - /* Endian mode*/ - proctl |= USDHC_PROT_CTRL_EMODE(config->endianMode); - -#if (defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) - /* Watermark level */ - wml &= ~(USDHC_WTMK_LVL_RD_WML_MASK | USDHC_WTMK_LVL_WR_WML_MASK); - wml |= (USDHC_WTMK_LVL_RD_WML(config->readWatermarkLevel) | USDHC_WTMK_LVL_WR_WML(config->writeWatermarkLevel)); -#else - /* Watermark level */ - wml &= ~(USDHC_WTMK_LVL_RD_WML_MASK | USDHC_WTMK_LVL_WR_WML_MASK | USDHC_WTMK_LVL_RD_BRST_LEN_MASK | - USDHC_WTMK_LVL_WR_BRST_LEN_MASK); - wml |= (USDHC_WTMK_LVL_RD_WML(config->readWatermarkLevel) | USDHC_WTMK_LVL_WR_WML(config->writeWatermarkLevel) | - USDHC_WTMK_LVL_RD_BRST_LEN(config->readBurstLen) | USDHC_WTMK_LVL_WR_BRST_LEN(config->writeBurstLen)); -#endif - - /* config the data timeout value */ - sysctl &= ~USDHC_SYS_CTRL_DTOCV_MASK; - sysctl |= USDHC_SYS_CTRL_DTOCV(config->dataTimeout); - - base->SYS_CTRL = sysctl; - base->WTMK_LVL = wml; - base->PROT_CTRL = proctl; - -#if FSL_FEATURE_USDHC_HAS_EXT_DMA - /* disable external DMA */ - base->VEND_SPEC &= ~USDHC_VEND_SPEC_EXT_DMA_EN_MASK; -#endif - /* disable internal DMA and DDR mode */ - base->MIX_CTRL &= ~(USDHC_MIX_CTRL_DMAEN_MASK | USDHC_MIX_CTRL_DDR_EN_MASK); - /* disable interrupt, enable all the interrupt status, clear status. */ - base->INT_STATUS_EN = kUSDHC_AllInterruptFlags; - base->INT_SIGNAL_EN = 0UL; - base->INT_STATUS = kUSDHC_AllInterruptFlags; -} - -/*! - * brief Deinitializes the USDHC. - * - * param base USDHC peripheral base address. - */ -void USDHC_Deinit(USDHC_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable clock. */ - CLOCK_DisableClock(s_usdhcClock[USDHC_GetInstance(base)]); -#endif -} - -/*! - * brief Resets the USDHC. - * - * param base USDHC peripheral base address. - * param mask The reset type mask(_usdhc_reset). - * param timeout Timeout for reset. - * retval true Reset successfully. - * retval false Reset failed. - */ -bool USDHC_Reset(USDHC_Type *base, uint32_t mask, uint32_t timeout) -{ - base->SYS_CTRL |= (mask & (USDHC_SYS_CTRL_RSTA_MASK | USDHC_SYS_CTRL_RSTC_MASK | USDHC_SYS_CTRL_RSTD_MASK -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - | USDHC_SYS_CTRL_RSTT_MASK -#endif - )); - /* Delay some time to wait reset success. */ - while (IS_USDHC_FLAG_SET(base->SYS_CTRL, mask)) - { - if (timeout == 0UL) - { - break; - } - timeout--; - } - - return ((0UL == timeout) ? false : true); -} - -/*! - * brief Gets the capability information. - * - * param base USDHC peripheral base address. - * param capability Structure to save capability information. - */ -void USDHC_GetCapability(USDHC_Type *base, usdhc_capability_t *capability) -{ - assert(capability != NULL); - - uint32_t htCapability; - uint32_t maxBlockLength; - - htCapability = base->HOST_CTRL_CAP; - - /* Get the capability of USDHC. */ - maxBlockLength = ((htCapability & USDHC_HOST_CTRL_CAP_MBL_MASK) >> USDHC_HOST_CTRL_CAP_MBL_SHIFT); - capability->maxBlockLength = (512UL << maxBlockLength); - /* Other attributes not in HTCAPBLT register. */ - capability->maxBlockCount = USDHC_MAX_BLOCK_COUNT; - capability->flags = - (htCapability & (USDHC_HOST_CTRL_CAP_ADMAS_MASK | USDHC_HOST_CTRL_CAP_HSS_MASK | USDHC_HOST_CTRL_CAP_DMAS_MASK | - USDHC_HOST_CTRL_CAP_SRS_MASK | USDHC_HOST_CTRL_CAP_VS33_MASK)); - capability->flags |= htCapability & USDHC_HOST_CTRL_CAP_VS30_MASK; - capability->flags |= htCapability & USDHC_HOST_CTRL_CAP_VS18_MASK; - capability->flags |= htCapability & USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_MASK; -#if defined(FSL_FEATURE_USDHC_HAS_SDR104_MODE) && FSL_FEATURE_USDHC_HAS_SDR104_MODE - capability->flags |= USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_MASK; -#endif - -#if defined(FSL_FEATURE_USDHC_HAS_SDR104_MODE) && FSL_FEATURE_USDHC_HAS_SDR50_MODE - capability->flags |= USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_MASK; -#endif - /* USDHC support 4/8 bit data bus width. */ - capability->flags |= (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 0UL) | (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 1UL); -} - -/*! - * brief Sets the SD bus clock frequency. - * - * param base USDHC peripheral base address. - * param srcClock_Hz USDHC source clock frequency united in Hz. - * param busClock_Hz SD bus clock frequency united in Hz. - * - * return The nearest frequency of busClock_Hz configured to SD bus. - */ -uint32_t USDHC_SetSdClock(USDHC_Type *base, uint32_t srcClock_Hz, uint32_t busClock_Hz) -{ - assert(srcClock_Hz != 0U); - assert(busClock_Hz != 0U); - - uint32_t totalDiv = 0UL; - uint32_t divisor = 0UL; - uint32_t prescaler = 0UL; - uint32_t sysctl = 0UL; - uint32_t nearestFrequency = 0UL; - - if (busClock_Hz > srcClock_Hz) - { - busClock_Hz = srcClock_Hz; - } - - totalDiv = srcClock_Hz / busClock_Hz; - - /* calucate total divisor first */ - if (totalDiv > (USDHC_MAX_CLKFS * USDHC_MAX_DVS)) - { - return 0UL; - } - - if (totalDiv != 0UL) - { - /* calucate the divisor (srcClock_Hz / divisor) <= busClock_Hz */ - if ((srcClock_Hz / totalDiv) > busClock_Hz) - { - totalDiv++; - } - - /* divide the total divisor to div and prescaler */ - if (totalDiv > USDHC_MAX_DVS) - { - prescaler = totalDiv / USDHC_MAX_DVS; - /* prescaler must be a value which equal 2^n and smaller than SDHC_MAX_CLKFS */ - while (((USDHC_MAX_CLKFS % prescaler) != 0UL) || (prescaler == 1UL)) - { - prescaler++; - } - /* calucate the divisor */ - divisor = totalDiv / prescaler; - /* fine tuning the divisor until divisor * prescaler >= totalDiv */ - while ((divisor * prescaler) < totalDiv) - { - divisor++; - if (divisor > USDHC_MAX_DVS) - { - prescaler <<= 1UL; - if (prescaler > USDHC_MAX_CLKFS) - { - return 0UL; - } - divisor = totalDiv / prescaler; - } - } - } - else - { - /* in this situation , divsior and SDCLKFS can generate same clock - use SDCLKFS*/ - if (((totalDiv % 2UL) != 0UL) && (totalDiv != 1UL)) - { - divisor = totalDiv; - prescaler = 1UL; - } - else - { - divisor = 1UL; - prescaler = totalDiv; - } - } - nearestFrequency = srcClock_Hz / (divisor == 0UL ? 1UL : divisor) / prescaler; - } - /* in this condition , srcClock_Hz = busClock_Hz, */ - else - { - /* in DDR mode , set SDCLKFS to 0, divisor = 0, actually the - totoal divider = 2U */ - divisor = 0UL; - prescaler = 0UL; - nearestFrequency = srcClock_Hz; - } - - /* calucate the value write to register */ - if (divisor != 0UL) - { - USDHC_PREV_DVS(divisor); - } - /* calucate the value write to register */ - if (prescaler != 0UL) - { - USDHC_PREV_CLKFS(prescaler, 1UL); - } - - /* Set the SD clock frequency divisor, SD clock frequency select, data timeout counter value. */ - sysctl = base->SYS_CTRL; - sysctl &= ~(USDHC_SYS_CTRL_DVS_MASK | USDHC_SYS_CTRL_SDCLKFS_MASK); - sysctl |= (USDHC_SYS_CTRL_DVS(divisor) | USDHC_SYS_CTRL_SDCLKFS(prescaler)); - base->SYS_CTRL = sysctl; - - /* Wait until the SD clock is stable. */ - while (!IS_USDHC_FLAG_SET(base->PRES_STATE, USDHC_PRES_STATE_SDSTB_MASK)) - { - } - - return nearestFrequency; -} - -/*! - * brief Sends 80 clocks to the card to set it to the active state. - * - * This function must be called each time the card is inserted to ensure that the card can receive the command - * correctly. - * - * param base USDHC peripheral base address. - * param timeout Timeout to initialize card. - * retval true Set card active successfully. - * retval false Set card active failed. - */ -bool USDHC_SetCardActive(USDHC_Type *base, uint32_t timeout) -{ - base->SYS_CTRL |= USDHC_SYS_CTRL_INITA_MASK; - /* Delay some time to wait card become active state. */ - while (IS_USDHC_FLAG_SET(base->SYS_CTRL, USDHC_SYS_CTRL_INITA_MASK)) - { - if (0UL == timeout) - { - break; - } - timeout--; - } - - return ((0UL == timeout) ? false : true); -} - -/*! - * brief the enable/disable DDR mode - * - * param base USDHC peripheral base address. - * param enable/disable flag - * param nibble position - */ -void USDHC_EnableDDRMode(USDHC_Type *base, bool enable, uint32_t nibblePos) -{ - uint32_t prescaler = (base->SYS_CTRL & USDHC_SYS_CTRL_SDCLKFS_MASK) >> USDHC_SYS_CTRL_SDCLKFS_SHIFT; - - if (enable) - { - base->MIX_CTRL &= ~USDHC_MIX_CTRL_NIBBLE_POS_MASK; - base->MIX_CTRL |= (USDHC_MIX_CTRL_DDR_EN_MASK | USDHC_MIX_CTRL_NIBBLE_POS(nibblePos)); - prescaler >>= 1UL; - } - else - { - base->MIX_CTRL &= ~USDHC_MIX_CTRL_DDR_EN_MASK; - - if (prescaler == 0UL) - { - prescaler += 1UL; - } - else - { - prescaler <<= 1UL; - } - } - - base->SYS_CTRL = (base->SYS_CTRL & (~USDHC_SYS_CTRL_SDCLKFS_MASK)) | USDHC_SYS_CTRL_SDCLKFS(prescaler); -} - -/*! - * brief Configures the MMC boot feature. - * - * Example: - code - usdhc_boot_config_t config; - config.ackTimeoutCount = 4; - config.bootMode = kUSDHC_BootModeNormal; - config.blockCount = 5; - config.enableBootAck = true; - config.enableBoot = true; - config.enableAutoStopAtBlockGap = true; - USDHC_SetMmcBootConfig(USDHC, &config); - endcode - * - * param base USDHC peripheral base address. - * param config The MMC boot configuration information. - */ -void USDHC_SetMmcBootConfig(USDHC_Type *base, const usdhc_boot_config_t *config) -{ - assert(config != NULL); - assert(config->ackTimeoutCount <= (USDHC_MMC_BOOT_DTOCV_ACK_MASK >> USDHC_MMC_BOOT_DTOCV_ACK_SHIFT)); - assert(config->blockCount <= (USDHC_MMC_BOOT_BOOT_BLK_CNT_MASK >> USDHC_MMC_BOOT_BOOT_BLK_CNT_SHIFT)); - - uint32_t mmcboot = base->MMC_BOOT; - - mmcboot &= ~(USDHC_MMC_BOOT_DTOCV_ACK_MASK | USDHC_MMC_BOOT_BOOT_MODE_MASK | USDHC_MMC_BOOT_BOOT_BLK_CNT_MASK); - mmcboot |= USDHC_MMC_BOOT_DTOCV_ACK(config->ackTimeoutCount) | USDHC_MMC_BOOT_BOOT_MODE(config->bootMode); - - if (config->enableBootAck) - { - mmcboot |= USDHC_MMC_BOOT_BOOT_ACK_MASK; - } - if (config->enableAutoStopAtBlockGap) - { - mmcboot |= - USDHC_MMC_BOOT_AUTO_SABG_EN_MASK | USDHC_MMC_BOOT_BOOT_BLK_CNT(USDHC_MAX_BLOCK_COUNT - config->blockCount); - /* always set the block count to USDHC_MAX_BLOCK_COUNT to use auto stop at block gap feature */ - base->BLK_ATT = ((base->BLK_ATT & ~(USDHC_BLK_ATT_BLKSIZE_MASK | USDHC_BLK_ATT_BLKCNT_MASK)) | - (USDHC_BLK_ATT_BLKSIZE(config->blockSize) | USDHC_BLK_ATT_BLKCNT(USDHC_MAX_BLOCK_COUNT))); - } - else - { - base->BLK_ATT = ((base->BLK_ATT & ~(USDHC_BLK_ATT_BLKSIZE_MASK | USDHC_BLK_ATT_BLKCNT_MASK)) | - (USDHC_BLK_ATT_BLKSIZE(config->blockSize) | USDHC_BLK_ATT_BLKCNT(config->blockCount))); - } - - base->MMC_BOOT = mmcboot; -} - -/*! - * brief Sets the ADMA1 descriptor table configuration. - * - * param admaTable Adma table address. - * param admaTableWords Adma table length. - * param dataBufferAddr Data buffer address. - * param dataBytes Data length. - * param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * reference _usdhc_adma_flag. - * retval kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_SetADMA1Descriptor( - uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags) -{ - assert(NULL != admaTable); - assert(NULL != dataBufferAddr); - - uint32_t miniEntries, startEntries = 0UL, - maxEntries = (admaTableWords * sizeof(uint32_t)) / sizeof(usdhc_adma1_descriptor_t); - usdhc_adma1_descriptor_t *adma1EntryAddress = (usdhc_adma1_descriptor_t *)(uint32_t)(admaTable); - uint32_t i, dmaBufferLen = 0UL; - const uint32_t *data = dataBufferAddr; - - if (((uint32_t)data % USDHC_ADMA1_ADDRESS_ALIGN) != 0UL) - { - return kStatus_USDHC_DMADataAddrNotAlign; - } - - if (flags == (uint32_t)kUSDHC_AdmaDescriptorMultipleFlag) - { - return kStatus_USDHC_NotSupport; - } - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (dataBytes % sizeof(uint32_t) != 0UL) - { - /* make the data length as word-aligned */ - dataBytes += sizeof(uint32_t) - (dataBytes % sizeof(uint32_t)); - } - - /* Check if ADMA descriptor's number is enough. */ - if ((dataBytes % USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) == 0UL) - { - miniEntries = dataBytes / USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY; - } - else - { - miniEntries = ((dataBytes / USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) + 1UL); - } - - /* ADMA1 needs two descriptors to finish a transfer */ - miniEntries <<= 1UL; - - if (miniEntries + startEntries > maxEntries) - { - return kStatus_OutOfRange; - } - - for (i = startEntries; i < (miniEntries + startEntries); i += 2UL) - { - if (dataBytes > USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) - { - dmaBufferLen = USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY; - } - else - { - dmaBufferLen = dataBytes; - } - - adma1EntryAddress[i] = (dmaBufferLen << USDHC_ADMA1_DESCRIPTOR_LENGTH_SHIFT); - adma1EntryAddress[i] |= (uint32_t)kUSDHC_Adma1DescriptorTypeSetLength; - adma1EntryAddress[i + 1UL] = (uint32_t)(data); - adma1EntryAddress[i + 1UL] |= - (uint32_t)kUSDHC_Adma1DescriptorTypeTransfer | (uint32_t)kUSDHC_Adma1DescriptorInterrupFlag; - data = (uint32_t *)((uint32_t)data + dmaBufferLen); - dataBytes -= dmaBufferLen; - } - /* the end of the descriptor */ - adma1EntryAddress[i - 1UL] |= (uint32_t)kUSDHC_Adma1DescriptorEndFlag; - - return kStatus_Success; -} - -/*! - * brief Sets the ADMA2 descriptor table configuration. - * - * param admaTable Adma table address. - * param admaTableWords Adma table length. - * param dataBufferAddr Data buffer address. - * param dataBytes Data Data length. - * param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * reference _usdhc_adma_flag. - * retval kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_SetADMA2Descriptor( - uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags) -{ - assert(NULL != admaTable); - assert(NULL != dataBufferAddr); - - uint32_t miniEntries, startEntries = 0UL, - maxEntries = (admaTableWords * sizeof(uint32_t)) / sizeof(usdhc_adma2_descriptor_t); - usdhc_adma2_descriptor_t *adma2EntryAddress = (usdhc_adma2_descriptor_t *)(uint32_t)(admaTable); - uint32_t i, dmaBufferLen = 0UL; - const uint32_t *data = dataBufferAddr; - - if (((uint32_t)data % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL) - { - return kStatus_USDHC_DMADataAddrNotAlign; - } - /* - * Add non aligned access support ,user need make sure your buffer size is big - * enough to hold the data,in other words,user need make sure the buffer size - * is 4 byte aligned - */ - if (dataBytes % sizeof(uint32_t) != 0UL) - { - /* make the data length as word-aligned */ - dataBytes += sizeof(uint32_t) - (dataBytes % sizeof(uint32_t)); - } - - /* Check if ADMA descriptor's number is enough. */ - if ((dataBytes % USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) == 0UL) - { - miniEntries = dataBytes / USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY; - } - else - { - miniEntries = ((dataBytes / USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) + 1UL); - } - /* calucate the start entry for multiple descriptor mode, ADMA engine is not stop, so update the descriptor - data adress and data size is enough */ - if (flags == (uint32_t)kUSDHC_AdmaDescriptorMultipleFlag) - { - for (i = 0UL; i < maxEntries; i++) - { - if ((adma2EntryAddress[i].attribute & (uint32_t)kUSDHC_Adma2DescriptorValidFlag) == 0UL) - { - break; - } - } - startEntries = i; - /* add one entry for dummy entry */ - miniEntries += 1UL; - } - - if ((miniEntries + startEntries) > maxEntries) - { - return kStatus_OutOfRange; - } - - for (i = startEntries; i < (miniEntries + startEntries); i++) - { - if (dataBytes > USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY) - { - dmaBufferLen = USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY; - } - else - { - dmaBufferLen = (dataBytes == 0UL ? sizeof(uint32_t) : - dataBytes); /* adma don't support 0 data length transfer descriptor */ - } - - /* Each descriptor for ADMA2 is 64-bit in length */ - adma2EntryAddress[i].address = (dataBytes == 0UL) ? &s_usdhcBootDummy : data; - adma2EntryAddress[i].attribute = (dmaBufferLen << USDHC_ADMA2_DESCRIPTOR_LENGTH_SHIFT); - adma2EntryAddress[i].attribute |= - (dataBytes == 0UL) ? - 0UL : - ((uint32_t)kUSDHC_Adma2DescriptorTypeTransfer | (uint32_t)kUSDHC_Adma2DescriptorInterruptFlag); - data = (uint32_t *)((uint32_t)data + dmaBufferLen); - - if (dataBytes != 0UL) - { - dataBytes -= dmaBufferLen; - } - } - - /* add a dummy valid ADMA descriptor for multiple descriptor mode, this is useful when transfer boot data, the ADMA - engine - will not stop at block gap */ - if (flags == (uint32_t)kUSDHC_AdmaDescriptorMultipleFlag) - { - adma2EntryAddress[startEntries + 1UL].attribute |= (uint32_t)kUSDHC_Adma2DescriptorTypeTransfer; - } - else - { - /* set the end bit */ - adma2EntryAddress[i - 1UL].attribute |= (uint32_t)kUSDHC_Adma2DescriptorEndFlag; - } - - return kStatus_Success; -} - -/*! - * brief Internal DMA configuration. - * This function is used to config the USDHC DMA related registers. - * param base USDHC peripheral base address. - * param adma configuration - * param dataAddr transfer data address, a simple DMA parameter, if ADMA is used, leave it to NULL. - * param enAutoCmd23 flag to indicate Auto CMD23 is enable or not, a simple DMA parameter,if ADMA is used, leave it to - * false. - * retval kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_SetInternalDmaConfig(USDHC_Type *base, - usdhc_adma_config_t *dmaConfig, - const uint32_t *dataAddr, - bool enAutoCmd23) -{ - assert(dmaConfig != NULL); - assert(dataAddr != NULL); - assert((NULL != dmaConfig->admaTable) && - (((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uint32_t)dmaConfig->admaTable) == 0UL)); - -#if FSL_FEATURE_USDHC_HAS_EXT_DMA - /* disable the external DMA if support */ - base->VEND_SPEC &= ~USDHC_VEND_SPEC_EXT_DMA_EN_MASK; -#endif - - if (dmaConfig->dmaMode == kUSDHC_DmaModeSimple) - { - /* check DMA data buffer address align or not */ - if (((uint32_t)dataAddr % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL) - { - return kStatus_USDHC_DMADataAddrNotAlign; - } - /* in simple DMA mode if use auto CMD23, address should load to ADMA addr, - and block count should load to DS_ADDR*/ - if (enAutoCmd23) - { - base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)dataAddr); - } - else - { - base->DS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)dataAddr); - } - } - else - { - /* When use ADMA, disable simple DMA */ - base->DS_ADDR = 0UL; - base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)(dmaConfig->admaTable)); - } - -#if (defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) - /* select DMA mode and config the burst length */ - base->PROT_CTRL &= ~(USDHC_PROT_CTRL_DMASEL_MASK); - base->PROT_CTRL |= USDHC_PROT_CTRL_DMASEL(dmaConfig->dmaMode); -#else - /* select DMA mode and config the burst length */ - base->PROT_CTRL &= ~(USDHC_PROT_CTRL_DMASEL_MASK | USDHC_PROT_CTRL_BURST_LEN_EN_MASK); - base->PROT_CTRL |= USDHC_PROT_CTRL_DMASEL(dmaConfig->dmaMode) | USDHC_PROT_CTRL_BURST_LEN_EN(dmaConfig->burstLen); -#endif - /* enable DMA */ - base->MIX_CTRL |= USDHC_MIX_CTRL_DMAEN_MASK; - - return kStatus_Success; -} - -/*! - * brief Sets the DMA descriptor table configuration. - * A high level DMA descriptor configuration function. - * param base USDHC peripheral base address. - * param adma configuration - * param data Data descriptor - * param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * reference _usdhc_adma_flag - * retval kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_SetAdmaTableConfig(USDHC_Type *base, - usdhc_adma_config_t *dmaConfig, - usdhc_data_t *dataConfig, - uint32_t flags) -{ - assert(NULL != dmaConfig); - assert((NULL != dmaConfig->admaTable) && - (((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uint32_t)dmaConfig->admaTable) == 0UL)); - assert(NULL != dataConfig); - - status_t error = kStatus_Fail; - uint32_t bootDummyOffset = - dataConfig->dataType == (uint32_t)kUSDHC_TransferDataBootcontinous ? sizeof(uint32_t) : 0UL; - const uint32_t *data = (const uint32_t *)USDHC_ADDR_CPU_2_DMA((uint32_t)( - (uint32_t)((dataConfig->rxData == NULL) ? dataConfig->txData : dataConfig->rxData) + bootDummyOffset)); - uint32_t blockSize = dataConfig->blockSize * dataConfig->blockCount - bootDummyOffset; - -#if FSL_FEATURE_USDHC_HAS_EXT_DMA - if (dmaConfig->dmaMode == kUSDHC_ExternalDMA) - { - /* enable the external DMA */ - base->VEND_SPEC |= USDHC_VEND_SPEC_EXT_DMA_EN_MASK; - } - else -#endif - if (dmaConfig->dmaMode == kUSDHC_DmaModeSimple) - { - error = kStatus_Success; - } - else if (dmaConfig->dmaMode == kUSDHC_DmaModeAdma1) - { - error = USDHC_SetADMA1Descriptor(dmaConfig->admaTable, dmaConfig->admaTableWords, data, blockSize, flags); - } - /* ADMA2 */ - else - { - error = USDHC_SetADMA2Descriptor(dmaConfig->admaTable, dmaConfig->admaTableWords, data, blockSize, flags); - } - - /* for internal dma, internal DMA configurations should not update the configurations when continous transfer the - * boot data, only the DMA descriptor need update */ - if ((dmaConfig->dmaMode != kUSDHC_ExternalDMA) && (error == kStatus_Success) && - (dataConfig->dataType != (uint32_t)kUSDHC_TransferDataBootcontinous)) - { - error = USDHC_SetInternalDmaConfig(base, dmaConfig, data, dataConfig->enableAutoCommand23); - } - - return error; -} - -/*! - * brief Transfers the command/data using a blocking method. - * - * This function waits until the command response/data is received or the USDHC encounters an error by polling the - * status - * flag. - * The application must not call this API in multiple threads at the same time. Because of that this API doesn't support - * the re-entry mechanism. - * - * note There is no need to call the API 'USDHC_TransferCreateHandle' when calling this API. - * - * param base USDHC peripheral base address. - * param adma configuration - * param transfer Transfer content. - * retval kStatus_InvalidArgument Argument is invalid. - * retval kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * retval kStatus_USDHC_SendCommandFailed Send command failed. - * retval kStatus_USDHC_TransferDataFailed Transfer data failed. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_TransferBlocking(USDHC_Type *base, usdhc_adma_config_t *dmaConfig, usdhc_transfer_t *transfer) -{ - assert(transfer != NULL); - - status_t error = kStatus_Fail; - usdhc_command_t *command = transfer->command; - usdhc_data_t *data = transfer->data; - bool enDMA = true; - bool executeTuning = ((data == NULL) ? false : data->dataType == (uint32_t)kUSDHC_TransferDataTuning); - uint32_t transferFlags = (uint32_t)kUSDHC_CommandOnly; - size_t blockSize = 0U; - size_t blockCount = 0U; - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - /*check re-tuning request*/ - if ((USDHC_GetInterruptStatusFlags(base) & (uint32_t)kUSDHC_ReTuningEventFlag) != 0UL) - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_ReTuningEventFlag); - return kStatus_USDHC_ReTuningRequest; - } -#endif - - if (data != NULL) - { - /* Update ADMA descriptor table according to different DMA mode(no DMA, ADMA1, ADMA2).*/ - if ((dmaConfig != NULL) && (!executeTuning)) - { - error = USDHC_SetAdmaTableConfig(base, dmaConfig, data, - (uint32_t)(IS_USDHC_FLAG_SET(data->dataType, kUSDHC_TransferDataBoot) ? - kUSDHC_AdmaDescriptorMultipleFlag : - kUSDHC_AdmaDescriptorSingleFlag)); - } - blockSize = data->blockSize; - blockCount = data->blockCount; - transferFlags = data->enableAutoCommand12 ? (uint32_t)kUSDHC_DataWithAutoCmd12 : 0U; - transferFlags |= data->enableAutoCommand23 ? (uint32_t)kUSDHC_DataWithAutoCmd23 : 0U; - transferFlags |= data->txData != NULL ? (uint32_t)kUSDHC_CommandAndTxData : (uint32_t)kUSDHC_CommandAndRxData; - transferFlags |= data->dataType == (uint8_t)kUSDHC_TransferDataBoot ? (uint32_t)kUSDHC_BootData : 0U; - transferFlags |= - data->dataType == (uint8_t)kUSDHC_TransferDataBootcontinous ? (uint32_t)kUSDHC_BootDataContinuous : 0U; - - command->flags |= (uint32_t)kUSDHC_DataPresentFlag; - } - - /* if the DMA desciptor configure fail or not needed , disable it */ - if (error != kStatus_Success) - { - enDMA = false; - /* disable DMA, using polling mode in this situation */ - USDHC_EnableInternalDMA(base, false); - } -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - else - { - if (data->txData != NULL) - { - /* clear the DCACHE */ - DCACHE_CleanByRange((uint32_t)data->txData, (data->blockSize) * (data->blockCount)); - } - else - { - /* clear the DCACHE */ - DCACHE_CleanInvalidateByRange((uint32_t)data->rxData, (data->blockSize) * (data->blockCount)); - } - } -#endif - - /* config the data transfer parameter */ - error = USDHC_SetTransferConfig(base, transferFlags, blockSize, blockCount); - if (error != kStatus_Success) - { - return error; - } - /* send command first */ - USDHC_SendCommand(base, command); - /* wait command done */ - error = - USDHC_WaitCommandDone(base, command, (data == NULL) || (data->dataType == (uint32_t)kUSDHC_TransferDataNormal)); - if (kStatus_Success != error) - { - return kStatus_USDHC_SendCommandFailed; - } - - /* wait transfer data finsih */ - if (data != NULL) - { - error = USDHC_TransferDataBlocking(base, data, enDMA); - if (kStatus_Success != error) - { - return error; - } - } - - return kStatus_Success; -} - -#if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER -static status_t USDHC_SetScatterGatherAdmaTableConfig(USDHC_Type *base, - usdhc_adma_config_t *dmaConfig, - usdhc_scatter_gather_data_t *dataConfig, - uint32_t *totalTransferSize) -{ - assert(NULL != dmaConfig); - assert((NULL != dmaConfig->admaTable) && - (((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uint32_t)dmaConfig->admaTable) == 0UL)); - assert(NULL != dataConfig); - - status_t error = kStatus_Fail; - uint32_t *admaDesBuffer = dmaConfig->admaTable; - uint32_t admaDesLen = dmaConfig->admaTableWords; - usdhc_scatter_gather_data_list_t *sgDataList = &dataConfig->sgData; - uint32_t oneDescriptorMaxTransferSize = dmaConfig->dmaMode == kUSDHC_DmaModeAdma1 ? - USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY : - USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY; - uint32_t miniEntries = 0U; - - while (sgDataList != NULL) - { - if (dmaConfig->dmaMode == kUSDHC_DmaModeAdma1) - { - error = USDHC_SetADMA1Descriptor(admaDesBuffer, admaDesLen, sgDataList->dataAddr, sgDataList->dataSize, 0U); - } - /* ADMA2 */ - else - { - error = USDHC_SetADMA2Descriptor(admaDesBuffer, admaDesLen, sgDataList->dataAddr, sgDataList->dataSize, 0U); - } - - if (error != kStatus_Success) - { - return kStatus_USDHC_PrepareAdmaDescriptorFailed; - } - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (dataConfig->dataDirection == kUSDHC_TransferDirectionSend) - { - /* clear the DCACHE */ - DCACHE_CleanByRange((uint32_t)sgDataList->dataAddr, sgDataList->dataSize); - } - else - { - /* clear the DCACHE */ - DCACHE_CleanInvalidateByRange((uint32_t)sgDataList->dataAddr, sgDataList->dataSize); - } -#endif - - *totalTransferSize += sgDataList->dataSize; - if (sgDataList->dataList != NULL) - { - if ((sgDataList->dataSize % oneDescriptorMaxTransferSize) == 0UL) - { - miniEntries = sgDataList->dataSize / oneDescriptorMaxTransferSize; - } - else - { - miniEntries = ((sgDataList->dataSize / oneDescriptorMaxTransferSize) + 1UL); - } - if (dmaConfig->dmaMode == kUSDHC_DmaModeAdma1) - { - admaDesBuffer[miniEntries * 2U - 1U] &= ~kUSDHC_Adma1DescriptorEndFlag; - } - else - { - admaDesBuffer[miniEntries * 2U - 2U] &= ~kUSDHC_Adma2DescriptorEndFlag; - } - admaDesBuffer += miniEntries * 2U; - admaDesLen -= miniEntries * 2U; - } - - sgDataList = sgDataList->dataList; - } - - base->DS_ADDR = 0UL; - base->ADMA_SYS_ADDR = (uint32_t)(dmaConfig->admaTable); - - /* select DMA mode and config the burst length */ - base->PROT_CTRL &= ~(USDHC_PROT_CTRL_DMASEL_MASK); - base->PROT_CTRL |= USDHC_PROT_CTRL_DMASEL(dmaConfig->dmaMode); - - /* enable DMA */ - base->MIX_CTRL |= USDHC_MIX_CTRL_DMAEN_MASK; - - return error; -} - -/*! - * brief Transfers the command/scatter gather data using an interrupt and an asynchronous method. - * - * This function sends a command and data and returns immediately. It doesn't wait for the transfer to complete or - * to encounter an error. The application must not call this API in multiple threads at the same time. Because of that - * this API doesn't support the re-entry mechanism. - * This function is target for the application would like to have scatter gather buffer to be transferred within one - * read/write request, non scatter gather buffer is support by this function also. - * - * note Call API @ref USDHC_TransferCreateHandle when calling this API. - * - * param base USDHC peripheral base address. - * param handle USDHC handle. - * param dmaConfig adma configurations, must be not NULL, since the function is target for ADMA only. - * param transfer scatter gather transfer content. - * - * retval #kStatus_InvalidArgument Argument is invalid. - * retval #kStatus_USDHC_BusyTransferring Busy transferring. - * retval #kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * retval #kStatus_Success Operate successfully. - */ -status_t USDHC_TransferScatterGatherADMANonBlocking(USDHC_Type *base, - usdhc_handle_t *handle, - usdhc_adma_config_t *dmaConfig, - usdhc_scatter_gather_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - assert(dmaConfig != NULL); - - status_t error = kStatus_Fail; - usdhc_command_t *command = transfer->command; - uint32_t totalTransferSize = 0U; - uint32_t transferFlags = kUSDHC_CommandOnly; - size_t blockSize = 0U; - size_t blockCount = 0U; - usdhc_scatter_gather_data_t *scatterGatherData = transfer->data; - bool enDMA = false; - - /* check data inhibit flag */ - if (IS_USDHC_FLAG_SET(base->PRES_STATE, kUSDHC_CommandInhibitFlag)) - { - return kStatus_USDHC_BusyTransferring; - } - - handle->command = command; - handle->data = scatterGatherData; - /* transferredWords will only be updated in ISR when transfer way is DATAPORT. */ - handle->transferredWords = 0UL; - - /* Update ADMA descriptor table according to different DMA mode(ADMA1, ADMA2).*/ - if (scatterGatherData != NULL) - { - if (scatterGatherData->sgData.dataAddr == NULL) - { - return kStatus_InvalidArgument; - } - - if (scatterGatherData->dataType != (uint32_t)kUSDHC_TransferDataTuning) - { - if (USDHC_SetScatterGatherAdmaTableConfig(base, dmaConfig, transfer->data, &totalTransferSize) != - kStatus_Success) - { - return kStatus_USDHC_PrepareAdmaDescriptorFailed; - } - - enDMA = true; - } - blockSize = scatterGatherData->blockSize; - blockCount = totalTransferSize / scatterGatherData->blockSize; - transferFlags = scatterGatherData->enableAutoCommand12 ? kUSDHC_DataWithAutoCmd12 : 0U; - transferFlags |= scatterGatherData->enableAutoCommand23 ? kUSDHC_DataWithAutoCmd23 : 0U; - transferFlags |= scatterGatherData->dataDirection == kUSDHC_TransferDirectionSend ? kUSDHC_CommandAndTxData : - kUSDHC_CommandAndRxData; - command->flags |= kUSDHC_DataPresentFlag; - } - - error = USDHC_SetTransferConfig(base, transferFlags, blockSize, blockCount); - if (error != kStatus_Success) - { - return error; - } - - /* enable interrupt per transfer request */ - if (scatterGatherData != NULL) - { - USDHC_ClearInterruptStatusFlags( - base, (uint32_t)(enDMA == false ? kUSDHC_DataFlag : kUSDHC_DataDMAFlag | kUSDHC_DmaCompleteFlag) | - (uint32_t)kUSDHC_CommandFlag); - USDHC_EnableInterruptSignal( - base, (uint32_t)(enDMA == false ? kUSDHC_DataFlag : kUSDHC_DataDMAFlag | kUSDHC_DmaCompleteFlag) | - (uint32_t)kUSDHC_CommandFlag); - } - else - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_CommandFlag); - USDHC_EnableInterruptSignal(base, kUSDHC_CommandFlag); - } - - /* send command first */ - USDHC_SendCommand(base, command); - - return kStatus_Success; -} -#else -/*! - * brief Transfers the command/data using an interrupt and an asynchronous method. - * - * This function sends a command and data and returns immediately. It doesn't wait the transfer complete or encounter an - * error. - * The application must not call this API in multiple threads at the same time. Because of that this API doesn't support - * the re-entry mechanism. - * - * note Call the API 'USDHC_TransferCreateHandle' when calling this API. - * - * param base USDHC peripheral base address. - * param handle USDHC handle. - * param adma configuration. - * param transfer Transfer content. - * retval kStatus_InvalidArgument Argument is invalid. - * retval kStatus_USDHC_BusyTransferring Busy transferring. - * retval kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * retval kStatus_Success Operate successfully. - */ -status_t USDHC_TransferNonBlocking(USDHC_Type *base, - usdhc_handle_t *handle, - usdhc_adma_config_t *dmaConfig, - usdhc_transfer_t *transfer) -{ - assert(handle != NULL); - assert(transfer != NULL); - - status_t error = kStatus_Fail; - usdhc_command_t *command = transfer->command; - usdhc_data_t *data = transfer->data; - bool executeTuning = ((data == NULL) ? false : data->dataType == (uint32_t)kUSDHC_TransferDataTuning); - bool enDMA = true; - uint32_t transferFlags = (uint32_t)kUSDHC_CommandOnly; - size_t blockSize = 0U; - size_t blockCount = 0U; - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - /*check re-tuning request*/ - if ((USDHC_GetInterruptStatusFlags(base) & ((uint32_t)kUSDHC_ReTuningEventFlag)) != 0UL) - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_ReTuningEventFlag); - return kStatus_USDHC_ReTuningRequest; - } -#endif - /* Save command and data into handle before transferring. */ - - handle->command = command; - handle->data = data; - /* transferredWords will only be updated in ISR when transfer way is DATAPORT. */ - handle->transferredWords = 0UL; - - if (data != NULL) - { - /* Update ADMA descriptor table according to different DMA mode(no DMA, ADMA1, ADMA2).*/ - if ((dmaConfig != NULL) && (!executeTuning)) - { - error = USDHC_SetAdmaTableConfig( - base, dmaConfig, data, - (uint32_t)(IS_USDHC_FLAG_SET(data->dataType, (uint32_t)kUSDHC_TransferDataBoot) ? - kUSDHC_AdmaDescriptorMultipleFlag : - kUSDHC_AdmaDescriptorSingleFlag)); - } - - blockSize = data->blockSize; - blockCount = data->blockCount; - transferFlags = data->enableAutoCommand12 ? (uint32_t)kUSDHC_DataWithAutoCmd12 : 0U; - transferFlags |= data->enableAutoCommand23 ? (uint32_t)kUSDHC_DataWithAutoCmd23 : 0U; - transferFlags |= data->txData != NULL ? (uint32_t)kUSDHC_CommandAndTxData : (uint32_t)kUSDHC_CommandAndRxData; - transferFlags |= data->dataType == (uint8_t)kUSDHC_TransferDataBoot ? (uint32_t)kUSDHC_BootData : 0U; - transferFlags |= - data->dataType == (uint8_t)kUSDHC_TransferDataBootcontinous ? (uint32_t)kUSDHC_BootDataContinuous : 0U; - - command->flags |= (uint32_t)kUSDHC_DataPresentFlag; - } - - /* if the DMA desciptor configure fail or not needed , disable it */ - if (error != kStatus_Success) - { - /* disable DMA, using polling mode in this situation */ - USDHC_EnableInternalDMA(base, false); - enDMA = false; - } -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - else - { - if (data->txData != NULL) - { - /* clear the DCACHE */ - DCACHE_CleanByRange((uint32_t)data->txData, (data->blockSize) * (data->blockCount)); - } - else - { - /* clear the DCACHE */ - DCACHE_CleanInvalidateByRange((uint32_t)data->rxData, (data->blockSize) * (data->blockCount)); - } - } -#endif - - /* config the data transfer parameter */ - error = USDHC_SetTransferConfig(base, transferFlags, blockSize, blockCount); - if (error != kStatus_Success) - { - return error; - } - - /* enable interrupt per transfer request */ - if (handle->data != NULL) - { - USDHC_ClearInterruptStatusFlags( - base, (uint32_t)(enDMA == false ? kUSDHC_DataFlag : kUSDHC_DataDMAFlag) | (uint32_t)kUSDHC_CommandFlag | - (uint32_t)(data->dataType == (uint8_t)kUSDHC_TransferDataBootcontinous ? - (uint32_t)kUSDHC_DmaCompleteFlag : - 0U)); - USDHC_EnableInterruptSignal(base, (uint32_t)(enDMA == false ? kUSDHC_DataFlag : kUSDHC_DataDMAFlag) | - (uint32_t)kUSDHC_CommandFlag | - (uint32_t)(data->dataType == (uint8_t)kUSDHC_TransferDataBootcontinous ? - (uint32_t)kUSDHC_DmaCompleteFlag : - 0U)); - } - else - { - USDHC_ClearInterruptStatusFlags(base, kUSDHC_CommandFlag); - USDHC_EnableInterruptSignal(base, kUSDHC_CommandFlag); - } - - /* send command first */ - USDHC_SendCommand(base, command); - - return kStatus_Success; -} -#endif - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) -/*! - * brief manual tuning trigger or abort - * User should handle the tuning cmd and find the boundary of the delay - * then calucate a average value which will be config to the CLK_TUNE_CTRL_STATUS - * This function should called before USDHC_AdjustDelayforSDR104 function - * param base USDHC peripheral base address. - * param tuning enable flag - */ -void USDHC_EnableManualTuning(USDHC_Type *base, bool enable) -{ - if (enable) - { - /* make sure std_tun_en bit is clear */ - base->TUNING_CTRL &= ~USDHC_TUNING_CTRL_STD_TUNING_EN_MASK; - /* disable auto tuning here */ - base->MIX_CTRL &= ~USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK; - /* execute tuning for SDR104 mode */ - base->MIX_CTRL |= USDHC_MIX_CTRL_EXE_TUNE_MASK | USDHC_MIX_CTRL_SMP_CLK_SEL_MASK; - } - else - { /* abort the tuning */ - base->MIX_CTRL &= ~USDHC_MIX_CTRL_EXE_TUNE_MASK; - } -} - -/*! - * brief the SDR104 mode delay setting adjust - * This function should called after USDHC_ManualTuningForSDR104 - * param base USDHC peripheral base address. - * param delay setting configuration - * retval kStatus_Fail config the delay setting fail - * retval kStatus_Success config the delay setting success - */ -status_t USDHC_AdjustDelayForManualTuning(USDHC_Type *base, uint32_t delay) -{ - uint32_t clkTuneCtrl = 0UL; - - clkTuneCtrl = base->CLK_TUNE_CTRL_STATUS; - - clkTuneCtrl &= ~USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_MASK; - - clkTuneCtrl |= USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE(delay); - - /* load the delay setting */ - base->CLK_TUNE_CTRL_STATUS = clkTuneCtrl; - /* check delat setting error */ - if (IS_USDHC_FLAG_SET(base->CLK_TUNE_CTRL_STATUS, - USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK | USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK)) - { - return kStatus_Fail; - } - - return kStatus_Success; -} - -/*! - * brief The tuning delay cell setting. - * - * param base USDHC peripheral base address. - * param preDelay Set the number of delay cells on the feedback clock between the feedback clock and CLK_PRE. - * param outDelay Set the number of delay cells on the feedback clock between CLK_PRE and CLK_OUT. - * param postDelay Set the number of delay cells on the feedback clock between CLK_OUT and CLK_POST. - * retval kStatus_Fail config the delay setting fail - * retval kStatus_Success config the delay setting success - */ -status_t USDHC_SetTuningDelay(USDHC_Type *base, uint32_t preDelay, uint32_t outDelay, uint32_t postDelay) -{ - assert(preDelay <= - (USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_MASK >> USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_SHIFT)); - assert(outDelay <= - (USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_MASK >> USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_SHIFT)); - assert(postDelay <= - (USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_MASK >> USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_SHIFT)); - - uint32_t clkTuneCtrl = 0UL; - - clkTuneCtrl = base->CLK_TUNE_CTRL_STATUS; - - clkTuneCtrl &= - ~(USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE_MASK | USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT_MASK | - USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST_MASK); - - clkTuneCtrl |= USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_PRE(preDelay) | - USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_OUT(outDelay) | - USDHC_CLK_TUNE_CTRL_STATUS_DLY_CELL_SET_POST(postDelay); - - /* load the delay setting */ - base->CLK_TUNE_CTRL_STATUS = clkTuneCtrl; - /* check delat setting error */ - if (IS_USDHC_FLAG_SET(base->CLK_TUNE_CTRL_STATUS, - USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK | USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK)) - { - return kStatus_Fail; - } - - return kStatus_Success; -} - -/*! - * brief the enable standard tuning function - * The standard tuning window and tuning counter use the default config - * tuning cmd is send by the software, user need to check the tuning result - * can be used for SDR50,SDR104,HS200 mode tuning - * param base USDHC peripheral base address. - * param tuning start tap - * param tuning step - * param enable/disable flag - */ -void USDHC_EnableStandardTuning(USDHC_Type *base, uint32_t tuningStartTap, uint32_t step, bool enable) -{ - uint32_t tuningCtrl = 0UL; - - if (enable) - { - /* feedback clock */ - base->MIX_CTRL |= USDHC_MIX_CTRL_FBCLK_SEL_MASK; - /* config tuning start and step */ - tuningCtrl = base->TUNING_CTRL; - tuningCtrl &= ~(USDHC_TUNING_CTRL_TUNING_START_TAP_MASK | USDHC_TUNING_CTRL_TUNING_STEP_MASK); - tuningCtrl |= (USDHC_TUNING_CTRL_TUNING_START_TAP(tuningStartTap) | USDHC_TUNING_CTRL_TUNING_STEP(step) | - USDHC_TUNING_CTRL_STD_TUNING_EN_MASK); - base->TUNING_CTRL = tuningCtrl; - - /* excute tuning */ - base->AUTOCMD12_ERR_STATUS |= - (USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK | USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK); - } - else - { - /* disable the standard tuning */ - base->TUNING_CTRL &= ~USDHC_TUNING_CTRL_STD_TUNING_EN_MASK; - /* clear excute tuning */ - base->AUTOCMD12_ERR_STATUS &= - ~(USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK | USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK); - } -} - -#if FSL_FEATURE_USDHC_HAS_HS400_MODE -/*! - * brief config the strobe DLL delay target and update interval - * - * param base USDHC peripheral base address. - * param delayTarget delay target - * param updateInterval update interval - */ -void USDHC_ConfigStrobeDLL(USDHC_Type *base, uint32_t delayTarget, uint32_t updateInterval) -{ - assert(delayTarget <= (USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_DLY_TARGET_MASK >> - USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_DLY_TARGET_SHIFT)); - - /* reset strobe dll firstly */ - base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_RESET_MASK; - /* clear reset and other register fields */ - base->STROBE_DLL_CTRL = 0; - /* configure the DELAY target and update interval */ - base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK | - USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_UPDATE_INT(updateInterval) | - USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_DLY_TARGET(delayTarget); - - while ( - (USDHC_GetStrobeDLLStatus(base) & (USDHC_STROBE_DLL_STATUS_STROBE_DLL_STS_SLV_LOCK_MASK | - USDHC_STROBE_DLL_STATUS_STROBE_DLL_STS_REF_LOCK_MASK)) != - ((USDHC_STROBE_DLL_STATUS_STROBE_DLL_STS_SLV_LOCK_MASK | USDHC_STROBE_DLL_STATUS_STROBE_DLL_STS_REF_LOCK_MASK))) - { - } -} -#endif - -/*! - * brief the auto tuning enbale for CMD/DATA line - * - * param base USDHC peripheral base address. - */ -void USDHC_EnableAutoTuningForCmdAndData(USDHC_Type *base) -{ - uint32_t busWidth = (base->PROT_CTRL & USDHC_PROT_CTRL_DTW_MASK) >> USDHC_PROT_CTRL_DTW_SHIFT; - - base->VEND_SPEC2 |= USDHC_VEND_SPEC2_TUNING_CMD_EN_MASK; - - /* 1bit data width */ - if (busWidth == 0UL) - { - base->VEND_SPEC2 &= ~USDHC_VEND_SPEC2_TUNING_8bit_EN_MASK; - base->VEND_SPEC2 |= USDHC_VEND_SPEC2_TUNING_1bit_EN_MASK; - } - /* 4bit data width */ - else if (busWidth == 1UL) - { - base->VEND_SPEC2 &= ~USDHC_VEND_SPEC2_TUNING_8bit_EN_MASK; - base->VEND_SPEC2 &= ~USDHC_VEND_SPEC2_TUNING_1bit_EN_MASK; - } - /* 8bit data width */ - else - { - base->VEND_SPEC2 |= USDHC_VEND_SPEC2_TUNING_8bit_EN_MASK; - base->VEND_SPEC2 &= ~USDHC_VEND_SPEC2_TUNING_1bit_EN_MASK; - } -} -#endif /* FSL_FEATURE_USDHC_HAS_SDR50_MODE */ - -static void USDHC_TransferHandleCardDetect(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags) -{ - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_CardInsertionFlag)) - { - if (handle->callback.CardInserted != NULL) - { - handle->callback.CardInserted(base, handle->userData); - } - } - else - { - if (handle->callback.CardRemoved != NULL) - { - handle->callback.CardRemoved(base, handle->userData); - } - } -} - -static void USDHC_TransferHandleCommand(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags) -{ - assert(handle->command != NULL); - - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_CommandErrorFlag)) - { - if (handle->callback.TransferComplete != NULL) - { - handle->callback.TransferComplete(base, handle, kStatus_USDHC_SendCommandFailed, handle->userData); - } - } - else - { - /* Receive response */ - if (kStatus_Success != USDHC_ReceiveCommandResponse(base, handle->command)) - { - if (handle->callback.TransferComplete != NULL) - { - handle->callback.TransferComplete(base, handle, kStatus_USDHC_SendCommandFailed, handle->userData); - } - } - else - { - if (handle->callback.TransferComplete != NULL) - { - handle->callback.TransferComplete(base, handle, kStatus_USDHC_SendCommandSuccess, handle->userData); - } - } - } - /* disable interrupt signal and reset command pointer */ - USDHC_DisableInterruptSignal(base, kUSDHC_CommandFlag); - handle->command = NULL; -} - -#if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER -static void USDHC_TransferHandleData(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags) -{ - assert(handle->data != NULL); - - status_t transferStatus = kStatus_USDHC_BusyTransferring; - - if ((!(handle->data->enableIgnoreError)) && - (IS_USDHC_FLAG_SET(interruptFlags, (uint32_t)kUSDHC_DataErrorFlag | (uint32_t)kUSDHC_DmaErrorFlag))) - { - transferStatus = kStatus_USDHC_TransferDataFailed; - } - else - { - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_BufferReadReadyFlag)) - { - /* std tuning process only need to wait BRR */ - if (handle->data->dataType == (uint32_t)kUSDHC_TransferDataTuning) - { - transferStatus = kStatus_USDHC_TransferDataComplete; - } - } - else - { - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_DmaCompleteFlag)) - { - transferStatus = kStatus_USDHC_TransferDMAComplete; - } - - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_DataCompleteFlag)) - { - transferStatus = kStatus_USDHC_TransferDataComplete; - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->data->dataDirection == kUSDHC_TransferDirectionReceive) - { - usdhc_scatter_gather_data_list_t *sgDataList = &handle->data->sgData; - while (sgDataList != NULL) - { - DCACHE_InvalidateByRange((uint32_t)sgDataList->dataAddr, sgDataList->dataSize); - sgDataList = sgDataList->dataList; - } - } -#endif - } - } - } - - if ((handle->callback.TransferComplete != NULL) && (transferStatus != kStatus_USDHC_BusyTransferring)) - { - handle->callback.TransferComplete(base, handle, transferStatus, handle->userData); - USDHC_DisableInterruptSignal( - base, (uint32_t)kUSDHC_DataFlag | (uint32_t)kUSDHC_DataDMAFlag | (uint32_t)kUSDHC_DmaCompleteFlag); - handle->data = NULL; - } -} - -#else -static void USDHC_TransferHandleData(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags) -{ - assert(handle->data != NULL); - - status_t transferStatus = kStatus_USDHC_BusyTransferring; - uint32_t transferredWords = handle->transferredWords; - - if ((!(handle->data->enableIgnoreError)) && - (IS_USDHC_FLAG_SET(interruptFlags, (uint32_t)kUSDHC_DataErrorFlag | (uint32_t)kUSDHC_DmaErrorFlag))) - { - transferStatus = kStatus_USDHC_TransferDataFailed; - } - else - { - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_BufferReadReadyFlag)) - { - /* std tuning process only need to wait BRR */ - if (handle->data->dataType == (uint32_t)kUSDHC_TransferDataTuning) - { - transferStatus = kStatus_USDHC_TransferDataComplete; - } - else - { - handle->transferredWords = USDHC_ReadDataPort(base, handle->data, transferredWords); - } - } - else if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_BufferWriteReadyFlag)) - { - handle->transferredWords = USDHC_WriteDataPort(base, handle->data, transferredWords); - } - else - { - if ((IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_DmaCompleteFlag)) && - (handle->data->dataType == (uint32_t)kUSDHC_TransferDataBootcontinous)) - { - *(handle->data->rxData) = s_usdhcBootDummy; - } - - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_DataCompleteFlag)) - { - transferStatus = kStatus_USDHC_TransferDataComplete; - -#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL - if (handle->data->rxData != NULL) - { - DCACHE_InvalidateByRange((uint32_t)(handle->data->rxData), - (handle->data->blockSize) * (handle->data->blockCount)); - } -#endif - } - } - } - - if ((handle->callback.TransferComplete != NULL) && (transferStatus != kStatus_USDHC_BusyTransferring)) - { - handle->callback.TransferComplete(base, handle, transferStatus, handle->userData); - USDHC_DisableInterruptSignal(base, (uint32_t)kUSDHC_DataFlag | (uint32_t)kUSDHC_DataDMAFlag); - handle->data = NULL; - } -} -#endif - -static void USDHC_TransferHandleSdioInterrupt(USDHC_Type *base, usdhc_handle_t *handle) -{ - if (handle->callback.SdioInterrupt != NULL) - { - handle->callback.SdioInterrupt(base, handle->userData); - } -} - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) -static void USDHC_TransferHandleReTuning(USDHC_Type *base, usdhc_handle_t *handle, uint32_t interruptFlags) -{ - assert(handle->callback.ReTuning != NULL); - /* retuning request */ - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_TuningErrorFlag)) - { - handle->callback.ReTuning(base, handle->userData); /* retuning fail */ - } -} -#endif - -static void USDHC_TransferHandleBlockGap(USDHC_Type *base, usdhc_handle_t *handle) -{ - if (handle->callback.BlockGap != NULL) - { - handle->callback.BlockGap(base, handle->userData); - } -} - -/*! - * brief Creates the USDHC handle. - * - * param base USDHC peripheral base address. - * param handle USDHC handle pointer. - * param callback Structure pointer to contain all callback functions. - * param userData Callback function parameter. - */ -void USDHC_TransferCreateHandle(USDHC_Type *base, - usdhc_handle_t *handle, - const usdhc_transfer_callback_t *callback, - void *userData) -{ - assert(handle != NULL); - assert(callback != NULL); - - /* Zero the handle. */ - (void)memset(handle, 0, sizeof(*handle)); - - /* Set the callback. */ - handle->callback.CardInserted = callback->CardInserted; - handle->callback.CardRemoved = callback->CardRemoved; - handle->callback.SdioInterrupt = callback->SdioInterrupt; - handle->callback.BlockGap = callback->BlockGap; - handle->callback.TransferComplete = callback->TransferComplete; - handle->callback.ReTuning = callback->ReTuning; - handle->userData = userData; - - /* Save the handle in global variables to support the double weak mechanism. */ - s_usdhcHandle[USDHC_GetInstance(base)] = handle; - - /* save IRQ handler */ - s_usdhcIsr = USDHC_TransferHandleIRQ; - - (void)EnableIRQ(s_usdhcIRQ[USDHC_GetInstance(base)]); -} - -/*! - * brief IRQ handler for the USDHC. - * - * This function deals with the IRQs on the given host controller. - * - * param base USDHC peripheral base address. - * param handle USDHC handle. - */ -void USDHC_TransferHandleIRQ(USDHC_Type *base, usdhc_handle_t *handle) -{ - assert(handle != NULL); - - uint32_t interruptFlags; - - interruptFlags = USDHC_GetEnabledInterruptStatusFlags(base); - - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_CardDetectFlag)) - { - USDHC_TransferHandleCardDetect(base, handle, interruptFlags); - } - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_CommandFlag)) - { - USDHC_TransferHandleCommand(base, handle, interruptFlags); - } - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_DataFlag)) - { - USDHC_TransferHandleData(base, handle, interruptFlags); - } - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_CardInterruptFlag)) - { - USDHC_TransferHandleSdioInterrupt(base, handle); - } - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_BlockGapEventFlag)) - { - USDHC_TransferHandleBlockGap(base, handle); - } -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) - if (IS_USDHC_FLAG_SET(interruptFlags, kUSDHC_SDR104TuningFlag)) - { - USDHC_TransferHandleReTuning(base, handle, interruptFlags); - } -#endif - USDHC_ClearInterruptStatusFlags(base, interruptFlags); -} - -#ifdef USDHC0 -void USDHC0_DriverIRQHandler(void); -void USDHC0_DriverIRQHandler(void) -{ - s_usdhcIsr(s_usdhcBase[0U], s_usdhcHandle[0U]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#ifdef USDHC1 -void USDHC1_DriverIRQHandler(void); -void USDHC1_DriverIRQHandler(void) -{ - s_usdhcIsr(s_usdhcBase[1U], s_usdhcHandle[1U]); - SDK_ISR_EXIT_BARRIER; -} -#endif - -#ifdef USDHC2 -void USDHC2_DriverIRQHandler(void); -void USDHC2_DriverIRQHandler(void) -{ - s_usdhcIsr(s_usdhcBase[2U], s_usdhcHandle[2U]); - SDK_ISR_EXIT_BARRIER; -} - -#endif diff --git a/devices/MIMXRT1052/drivers/fsl_usdhc.h b/devices/MIMXRT1052/drivers/fsl_usdhc.h deleted file mode 100644 index bdc0267..0000000 --- a/devices/MIMXRT1052/drivers/fsl_usdhc.h +++ /dev/null @@ -1,1701 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_USDHC_H_ -#define _FSL_USDHC_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup usdhc - * @{ - */ - -/****************************************************************************** - * Definitions. - *****************************************************************************/ - -/*! @name Driver version */ -/*@{*/ -/*! @brief Driver version 2.8.0. */ -#define FSL_USDHC_DRIVER_VERSION (MAKE_VERSION(2U, 8U, 0U)) -/*@}*/ - -/*! @brief Maximum block count can be set one time */ -#define USDHC_MAX_BLOCK_COUNT (USDHC_BLK_ATT_BLKCNT_MASK >> USDHC_BLK_ATT_BLKCNT_SHIFT) - -/*! @brief USDHC scatter gather feature control macro */ -#ifndef FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER -#define FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER 0U -#endif - -/*! @brief Enum _usdhc_status. USDHC status. */ -enum -{ - kStatus_USDHC_BusyTransferring = MAKE_STATUS(kStatusGroup_USDHC, 0U), /*!< Transfer is on-going. */ - kStatus_USDHC_PrepareAdmaDescriptorFailed = MAKE_STATUS(kStatusGroup_USDHC, 1U), /*!< Set DMA descriptor failed. */ - kStatus_USDHC_SendCommandFailed = MAKE_STATUS(kStatusGroup_USDHC, 2U), /*!< Send command failed. */ - kStatus_USDHC_TransferDataFailed = MAKE_STATUS(kStatusGroup_USDHC, 3U), /*!< Transfer data failed. */ - kStatus_USDHC_DMADataAddrNotAlign = MAKE_STATUS(kStatusGroup_USDHC, 4U), /*!< Data address not aligned. */ - kStatus_USDHC_ReTuningRequest = MAKE_STATUS(kStatusGroup_USDHC, 5U), /*!< Re-tuning request. */ - kStatus_USDHC_TuningError = MAKE_STATUS(kStatusGroup_USDHC, 6U), /*!< Tuning error. */ - kStatus_USDHC_NotSupport = MAKE_STATUS(kStatusGroup_USDHC, 7U), /*!< Not support. */ - kStatus_USDHC_TransferDataComplete = MAKE_STATUS(kStatusGroup_USDHC, 8U), /*!< Transfer data complete. */ - kStatus_USDHC_SendCommandSuccess = MAKE_STATUS(kStatusGroup_USDHC, 9U), /*!< Transfer command complete. */ - kStatus_USDHC_TransferDMAComplete = MAKE_STATUS(kStatusGroup_USDHC, 10U), /*!< Transfer DMA complete. */ -}; - -/*! @brief Enum _usdhc_capability_flag. Host controller capabilities flag mask. - * @anchor _usdhc_capability_flag - */ -enum -{ - kUSDHC_SupportAdmaFlag = USDHC_HOST_CTRL_CAP_ADMAS_MASK, /*!< Support ADMA. */ - kUSDHC_SupportHighSpeedFlag = USDHC_HOST_CTRL_CAP_HSS_MASK, /*!< Support high-speed. */ - kUSDHC_SupportDmaFlag = USDHC_HOST_CTRL_CAP_DMAS_MASK, /*!< Support DMA. */ - kUSDHC_SupportSuspendResumeFlag = USDHC_HOST_CTRL_CAP_SRS_MASK, /*!< Support suspend/resume. */ - kUSDHC_SupportV330Flag = USDHC_HOST_CTRL_CAP_VS33_MASK, /*!< Support voltage 3.3V. */ - kUSDHC_SupportV300Flag = USDHC_HOST_CTRL_CAP_VS30_MASK, /*!< Support voltage 3.0V. */ - kUSDHC_SupportV180Flag = USDHC_HOST_CTRL_CAP_VS18_MASK, /*!< Support voltage 1.8V. */ - kUSDHC_Support4BitFlag = (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 0U), - /*!< Flag in HTCAPBLT_MBL's position, supporting 4-bit mode. */ - kUSDHC_Support8BitFlag = (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 1U), - /*!< Flag in HTCAPBLT_MBL's position, supporting 8-bit mode. */ - kUSDHC_SupportDDR50Flag = USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_MASK, -/*!< SD version 3.0 new feature, supporting DDR50 mode. */ - -#if defined(FSL_FEATURE_USDHC_HAS_SDR104_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR104_MODE) - kUSDHC_SupportSDR104Flag = 0, /*!< not support SDR104 mode */ -#else - kUSDHC_SupportSDR104Flag = USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_MASK, /*!< Support SDR104 mode. */ -#endif -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_SupportSDR50Flag = 0U, /*!< not support SDR50 mode */ -#else - kUSDHC_SupportSDR50Flag = USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_MASK, /*!< Support SDR50 mode. */ -#endif -}; - -/*! @brief Enum _usdhc_wakeup_event. Wakeup event mask. - * @anchor _usdhc_wakeup_event - */ -enum -{ - kUSDHC_WakeupEventOnCardInt = USDHC_PROT_CTRL_WECINT_MASK, /*!< Wakeup on card interrupt. */ - kUSDHC_WakeupEventOnCardInsert = USDHC_PROT_CTRL_WECINS_MASK, /*!< Wakeup on card insertion. */ - kUSDHC_WakeupEventOnCardRemove = USDHC_PROT_CTRL_WECRM_MASK, /*!< Wakeup on card removal. */ - kUSDHC_WakeupEventsAll = - (kUSDHC_WakeupEventOnCardInt | kUSDHC_WakeupEventOnCardInsert | kUSDHC_WakeupEventOnCardRemove), - /*!< All wakeup events */ -}; - -/*! @brief Enum _usdhc_reset. Reset type mask. - * @anchor _usdhc_reset - */ -enum -{ - kUSDHC_ResetAll = USDHC_SYS_CTRL_RSTA_MASK, /*!< Reset all except card detection. */ - kUSDHC_ResetCommand = USDHC_SYS_CTRL_RSTC_MASK, /*!< Reset command line. */ - kUSDHC_ResetData = USDHC_SYS_CTRL_RSTD_MASK, /*!< Reset data line. */ - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_ResetTuning = 0U, /*!< no reset tuning circuit bit */ -#else - kUSDHC_ResetTuning = USDHC_SYS_CTRL_RSTT_MASK, /*!< Reset tuning circuit. */ -#endif - - kUSDHC_ResetsAll = (kUSDHC_ResetAll | kUSDHC_ResetCommand | kUSDHC_ResetData | kUSDHC_ResetTuning), - /*!< All reset types */ -}; - -/*! @brief Enum _usdhc_transfer_flag. Transfer flag mask. */ -enum -{ - kUSDHC_EnableDmaFlag = USDHC_MIX_CTRL_DMAEN_MASK, /*!< Enable DMA. */ - - kUSDHC_CommandTypeSuspendFlag = USDHC_CMD_XFR_TYP_CMDTYP(1U), /*!< Suspend command. */ - kUSDHC_CommandTypeResumeFlag = USDHC_CMD_XFR_TYP_CMDTYP(2U), /*!< Resume command. */ - kUSDHC_CommandTypeAbortFlag = USDHC_CMD_XFR_TYP_CMDTYP(3U), /*!< Abort command. */ - - kUSDHC_EnableBlockCountFlag = USDHC_MIX_CTRL_BCEN_MASK, /*!< Enable block count. */ - kUSDHC_EnableAutoCommand12Flag = USDHC_MIX_CTRL_AC12EN_MASK, /*!< Enable auto CMD12. */ - kUSDHC_DataReadFlag = USDHC_MIX_CTRL_DTDSEL_MASK, /*!< Enable data read. */ - kUSDHC_MultipleBlockFlag = USDHC_MIX_CTRL_MSBSEL_MASK, /*!< Multiple block data read/write. */ - kUSDHC_EnableAutoCommand23Flag = USDHC_MIX_CTRL_AC23EN_MASK, /*!< Enable auto CMD23. */ - - kUSDHC_ResponseLength136Flag = USDHC_CMD_XFR_TYP_RSPTYP(1U), /*!< 136-bit response length. */ - kUSDHC_ResponseLength48Flag = USDHC_CMD_XFR_TYP_RSPTYP(2U), /*!< 48-bit response length. */ - kUSDHC_ResponseLength48BusyFlag = USDHC_CMD_XFR_TYP_RSPTYP(3U), /*!< 48-bit response length with busy status. */ - - kUSDHC_EnableCrcCheckFlag = USDHC_CMD_XFR_TYP_CCCEN_MASK, /*!< Enable CRC check. */ - kUSDHC_EnableIndexCheckFlag = USDHC_CMD_XFR_TYP_CICEN_MASK, /*!< Enable index check. */ - kUSDHC_DataPresentFlag = USDHC_CMD_XFR_TYP_DPSEL_MASK, /*!< Data present flag. */ -}; - -/*! @brief Enum _usdhc_present_status_flag. Present status flag mask. - * @anchor _usdhc_present_status_flag - */ -enum -{ - kUSDHC_CommandInhibitFlag = USDHC_PRES_STATE_CIHB_MASK, /*!< Command inhibit. */ - kUSDHC_DataInhibitFlag = USDHC_PRES_STATE_CDIHB_MASK, /*!< Data inhibit. */ - kUSDHC_DataLineActiveFlag = USDHC_PRES_STATE_DLA_MASK, /*!< Data line active. */ - kUSDHC_SdClockStableFlag = USDHC_PRES_STATE_SDSTB_MASK, /*!< SD bus clock stable. */ - kUSDHC_WriteTransferActiveFlag = USDHC_PRES_STATE_WTA_MASK, /*!< Write transfer active. */ - kUSDHC_ReadTransferActiveFlag = USDHC_PRES_STATE_RTA_MASK, /*!< Read transfer active. */ - kUSDHC_BufferWriteEnableFlag = USDHC_PRES_STATE_BWEN_MASK, /*!< Buffer write enable. */ - kUSDHC_BufferReadEnableFlag = USDHC_PRES_STATE_BREN_MASK, /*!< Buffer read enable. */ - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_DelaySettingFinishedFlag = 0U, /*!< not support */ - kUSDHC_ReTuningRequestFlag = 0U, /*!< not support */ -#else - kUSDHC_ReTuningRequestFlag = USDHC_PRES_STATE_RTR_MASK, /*!< Re-tuning request flag, only used for SDR104 mode. */ - kUSDHC_DelaySettingFinishedFlag = USDHC_PRES_STATE_TSCD_MASK, /*!< Delay setting finished flag. */ -#endif - - kUSDHC_CardInsertedFlag = USDHC_PRES_STATE_CINST_MASK, /*!< Card inserted. */ - kUSDHC_CommandLineLevelFlag = USDHC_PRES_STATE_CLSL_MASK, /*!< Command line signal level. */ - - kUSDHC_Data0LineLevelFlag = 1U << USDHC_PRES_STATE_DLSL_SHIFT, /*!< Data0 line signal level. */ - kUSDHC_Data1LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 1U), /*!< Data1 line signal level. */ - kUSDHC_Data2LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 2U), /*!< Data2 line signal level. */ - kUSDHC_Data3LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 3U), /*!< Data3 line signal level. */ - kUSDHC_Data4LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 4U), /*!< Data4 line signal level. */ - kUSDHC_Data5LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 5U), /*!< Data5 line signal level. */ - kUSDHC_Data6LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 6U), /*!< Data6 line signal level. */ - kUSDHC_Data7LineLevelFlag = (int)(1U << (USDHC_PRES_STATE_DLSL_SHIFT + 7U)), /*!< Data7 line signal level. */ -}; - -/*! @brief Enum _usdhc_interrupt_status_flag. Interrupt status flag mask. - * @anchor _usdhc_interrupt_status_flag - */ -enum -{ - kUSDHC_CommandCompleteFlag = USDHC_INT_STATUS_CC_MASK, /*!< Command complete. */ - kUSDHC_DataCompleteFlag = USDHC_INT_STATUS_TC_MASK, /*!< Data complete. */ - kUSDHC_BlockGapEventFlag = USDHC_INT_STATUS_BGE_MASK, /*!< Block gap event. */ - kUSDHC_DmaCompleteFlag = USDHC_INT_STATUS_DINT_MASK, /*!< DMA interrupt. */ - kUSDHC_BufferWriteReadyFlag = USDHC_INT_STATUS_BWR_MASK, /*!< Buffer write ready. */ - kUSDHC_BufferReadReadyFlag = USDHC_INT_STATUS_BRR_MASK, /*!< Buffer read ready. */ - kUSDHC_CardInsertionFlag = USDHC_INT_STATUS_CINS_MASK, /*!< Card inserted. */ - kUSDHC_CardRemovalFlag = USDHC_INT_STATUS_CRM_MASK, /*!< Card removed. */ - kUSDHC_CardInterruptFlag = USDHC_INT_STATUS_CINT_MASK, /*!< Card interrupt. */ - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_ReTuningEventFlag = 0U, /*!< Re-Tuning event, only for SD3.0 SDR104 mode. */ - kUSDHC_TuningPassFlag = 0U, /*!< SDR104 mode tuning pass flag. */ - kUSDHC_TuningErrorFlag = 0U, /*!< SDR104 tuning error flag. */ -#else - kUSDHC_ReTuningEventFlag = USDHC_INT_STATUS_RTE_MASK, /*!< Re-Tuning event, only for SD3.0 SDR104 mode. */ - kUSDHC_TuningPassFlag = USDHC_INT_STATUS_TP_MASK, /*!< SDR104 mode tuning pass flag. */ - kUSDHC_TuningErrorFlag = USDHC_INT_STATUS_TNE_MASK, /*!< SDR104 tuning error flag. */ -#endif - - kUSDHC_CommandTimeoutFlag = USDHC_INT_STATUS_CTOE_MASK, /*!< Command timeout error. */ - kUSDHC_CommandCrcErrorFlag = USDHC_INT_STATUS_CCE_MASK, /*!< Command CRC error. */ - kUSDHC_CommandEndBitErrorFlag = USDHC_INT_STATUS_CEBE_MASK, /*!< Command end bit error. */ - kUSDHC_CommandIndexErrorFlag = USDHC_INT_STATUS_CIE_MASK, /*!< Command index error. */ - kUSDHC_DataTimeoutFlag = USDHC_INT_STATUS_DTOE_MASK, /*!< Data timeout error. */ - kUSDHC_DataCrcErrorFlag = USDHC_INT_STATUS_DCE_MASK, /*!< Data CRC error. */ - kUSDHC_DataEndBitErrorFlag = USDHC_INT_STATUS_DEBE_MASK, /*!< Data end bit error. */ - kUSDHC_AutoCommand12ErrorFlag = USDHC_INT_STATUS_AC12E_MASK, /*!< Auto CMD12 error. */ - kUSDHC_DmaErrorFlag = USDHC_INT_STATUS_DMAE_MASK, /*!< DMA error. */ - - kUSDHC_CommandErrorFlag = (kUSDHC_CommandTimeoutFlag | kUSDHC_CommandCrcErrorFlag | kUSDHC_CommandEndBitErrorFlag | - kUSDHC_CommandIndexErrorFlag), /*!< Command error */ - kUSDHC_DataErrorFlag = (kUSDHC_DataTimeoutFlag | kUSDHC_DataCrcErrorFlag | kUSDHC_DataEndBitErrorFlag | - kUSDHC_AutoCommand12ErrorFlag), /*!< Data error */ - kUSDHC_ErrorFlag = (kUSDHC_CommandErrorFlag | kUSDHC_DataErrorFlag | kUSDHC_DmaErrorFlag), /*!< All error */ - - kUSDHC_DataFlag = (kUSDHC_DataCompleteFlag | kUSDHC_BufferWriteReadyFlag | kUSDHC_BufferReadReadyFlag | - kUSDHC_DataErrorFlag), /*!< Data interrupts */ - - kUSDHC_DataDMAFlag = (kUSDHC_DataCompleteFlag | kUSDHC_DataErrorFlag | kUSDHC_DmaErrorFlag), /*!< Data interrupts */ - - kUSDHC_CommandFlag = (kUSDHC_CommandErrorFlag | kUSDHC_CommandCompleteFlag), /*!< Command interrupts */ - kUSDHC_CardDetectFlag = (kUSDHC_CardInsertionFlag | kUSDHC_CardRemovalFlag), /*!< Card detection interrupts */ - kUSDHC_SDR104TuningFlag = (kUSDHC_TuningErrorFlag | kUSDHC_TuningPassFlag | kUSDHC_ReTuningEventFlag), - /*!< SDR104 tuning flag. */ - kUSDHC_AllInterruptFlags = - (kUSDHC_BlockGapEventFlag | kUSDHC_CardInterruptFlag | kUSDHC_CommandFlag | kUSDHC_DataFlag | kUSDHC_ErrorFlag | - kUSDHC_SDR104TuningFlag | kUSDHC_DmaCompleteFlag), /*!< All flags mask */ -}; - -/*! @brief Enum _usdhc_auto_command12_error_status_flag. Auto CMD12 error status flag mask. - * @anchor _usdhc_auto_command12_error_status_flag - */ -enum -{ - kUSDHC_AutoCommand12NotExecutedFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12NE_MASK, /*!< Not executed error. */ - kUSDHC_AutoCommand12TimeoutFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_MASK, /*!< Timeout error. */ - kUSDHC_AutoCommand12EndBitErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_MASK, /*!< End bit error. */ - kUSDHC_AutoCommand12CrcErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12CE_MASK, /*!< CRC error. */ - kUSDHC_AutoCommand12IndexErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12IE_MASK, /*!< Index error. */ - kUSDHC_AutoCommand12NotIssuedFlag = USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_MASK, /*!< Not issued error. */ -}; - -/*! @brief Enum _usdhc_standard_tuning. Standard tuning flag. */ -enum -{ -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_ExecuteTuning = 0U, /*!< not support */ - kUSDHC_TuningSampleClockSel = 0U, /*!< not support */ -#else - kUSDHC_ExecuteTuning = USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK, /*!< Used to start tuning procedure. */ - kUSDHC_TuningSampleClockSel = - USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK, /*!< When std_tuning_en bit is set, this - bit is used to select sampleing clock. */ -#endif -}; - -/*! @brief Enum _usdhc_adma_error_status_flag. ADMA error status flag mask. - * @anchor _usdhc_adma_error_status_flag - */ -enum -{ - kUSDHC_AdmaLenghMismatchFlag = USDHC_ADMA_ERR_STATUS_ADMALME_MASK, /*!< Length mismatch error. */ - kUSDHC_AdmaDescriptorErrorFlag = USDHC_ADMA_ERR_STATUS_ADMADCE_MASK, /*!< Descriptor error. */ -}; - -/*! - * @brief Enum _usdhc_adma_error_state. ADMA error state. - * - * This state is the detail state when ADMA error has occurred. - */ -enum -{ - kUSDHC_AdmaErrorStateStopDma = 0x00U, - /*!< Stop DMA, previous location set in the ADMA system address is errored address. */ - kUSDHC_AdmaErrorStateFetchDescriptor = 0x01U, - /*!< Fetch descriptor, current location set in the ADMA system address is errored address. */ - kUSDHC_AdmaErrorStateChangeAddress = 0x02U, /*!< Change address, no DMA error has occurred. */ - kUSDHC_AdmaErrorStateTransferData = 0x03U, - /*!< Transfer data, previous location set in the ADMA system address is errored address. */ - kUSDHC_AdmaErrorStateInvalidLength = 0x04U, /*!< Invalid length in ADMA descriptor. */ - kUSDHC_AdmaErrorStateInvalidDescriptor = 0x08U, /*!< Invalid descriptor fetched by ADMA. */ - - kUSDHC_AdmaErrorState = kUSDHC_AdmaErrorStateInvalidLength | kUSDHC_AdmaErrorStateInvalidDescriptor | - kUSDHC_AdmaErrorStateFetchDescriptor, /*!< ADMA error state */ -}; - -/*! @brief Enum _usdhc_force_event. Force event bit position. - * @anchor _usdhc_force_event - */ -enum -{ - kUSDHC_ForceEventAutoCommand12NotExecuted = - USDHC_FORCE_EVENT_FEVTAC12NE_MASK, /*!< Auto CMD12 not executed error. */ - kUSDHC_ForceEventAutoCommand12Timeout = USDHC_FORCE_EVENT_FEVTAC12TOE_MASK, /*!< Auto CMD12 timeout error. */ - kUSDHC_ForceEventAutoCommand12CrcError = USDHC_FORCE_EVENT_FEVTAC12CE_MASK, /*!< Auto CMD12 CRC error. */ - kUSDHC_ForceEventEndBitError = USDHC_FORCE_EVENT_FEVTAC12EBE_MASK, /*!< Auto CMD12 end bit error. */ - kUSDHC_ForceEventAutoCommand12IndexError = USDHC_FORCE_EVENT_FEVTAC12IE_MASK, /*!< Auto CMD12 index error. */ - kUSDHC_ForceEventAutoCommand12NotIssued = USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK, /*!< Auto CMD12 not issued error. */ - kUSDHC_ForceEventCommandTimeout = USDHC_FORCE_EVENT_FEVTCTOE_MASK, /*!< Command timeout error. */ - kUSDHC_ForceEventCommandCrcError = USDHC_FORCE_EVENT_FEVTCCE_MASK, /*!< Command CRC error. */ - kUSDHC_ForceEventCommandEndBitError = USDHC_FORCE_EVENT_FEVTCEBE_MASK, /*!< Command end bit error. */ - kUSDHC_ForceEventCommandIndexError = USDHC_FORCE_EVENT_FEVTCIE_MASK, /*!< Command index error. */ - kUSDHC_ForceEventDataTimeout = USDHC_FORCE_EVENT_FEVTDTOE_MASK, /*!< Data timeout error. */ - kUSDHC_ForceEventDataCrcError = USDHC_FORCE_EVENT_FEVTDCE_MASK, /*!< Data CRC error. */ - kUSDHC_ForceEventDataEndBitError = USDHC_FORCE_EVENT_FEVTDEBE_MASK, /*!< Data end bit error. */ - kUSDHC_ForceEventAutoCommand12Error = USDHC_FORCE_EVENT_FEVTAC12E_MASK, /*!< Auto CMD12 error. */ - kUSDHC_ForceEventCardInt = (int)USDHC_FORCE_EVENT_FEVTCINT_MASK, /*!< Card interrupt. */ - kUSDHC_ForceEventDmaError = USDHC_FORCE_EVENT_FEVTDMAE_MASK, /*!< Dma error. */ -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE) - kUSDHC_ForceEventTuningError = 0U, /*!< not support */ -#else - kUSDHC_ForceEventTuningError = USDHC_FORCE_EVENT_FEVTTNE_MASK, /*!< Tuning error. */ -#endif - - kUSDHC_ForceEventsAll = - (int)(USDHC_FORCE_EVENT_FEVTAC12NE_MASK | USDHC_FORCE_EVENT_FEVTAC12TOE_MASK | - USDHC_FORCE_EVENT_FEVTAC12CE_MASK | USDHC_FORCE_EVENT_FEVTAC12EBE_MASK | - USDHC_FORCE_EVENT_FEVTAC12IE_MASK | USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK | - USDHC_FORCE_EVENT_FEVTCTOE_MASK | USDHC_FORCE_EVENT_FEVTCCE_MASK | USDHC_FORCE_EVENT_FEVTCEBE_MASK | - USDHC_FORCE_EVENT_FEVTCIE_MASK | USDHC_FORCE_EVENT_FEVTDTOE_MASK | USDHC_FORCE_EVENT_FEVTDCE_MASK | - USDHC_FORCE_EVENT_FEVTDEBE_MASK | USDHC_FORCE_EVENT_FEVTAC12E_MASK | USDHC_FORCE_EVENT_FEVTCINT_MASK | - USDHC_FORCE_EVENT_FEVTDMAE_MASK | kUSDHC_ForceEventTuningError), /*!< All force event flags mask. */ -}; - -/*! @brief Data transfer direction. */ -typedef enum _usdhc_transfer_direction -{ - kUSDHC_TransferDirectionReceive = 1U, /*!< USDHC transfer direction receive. */ - kUSDHC_TransferDirectionSend = 0U, /*!< USDHC transfer direction send. */ -} usdhc_transfer_direction_t; - -/*! @brief Data transfer width. */ -typedef enum _usdhc_data_bus_width -{ - kUSDHC_DataBusWidth1Bit = 0U, /*!< 1-bit mode */ - kUSDHC_DataBusWidth4Bit = 1U, /*!< 4-bit mode */ - kUSDHC_DataBusWidth8Bit = 2U, /*!< 8-bit mode */ -} usdhc_data_bus_width_t; - -/*! @brief Endian mode */ -typedef enum _usdhc_endian_mode -{ - kUSDHC_EndianModeBig = 0U, /*!< Big endian mode. */ - kUSDHC_EndianModeHalfWordBig = 1U, /*!< Half word big endian mode. */ - kUSDHC_EndianModeLittle = 2U, /*!< Little endian mode. */ -} usdhc_endian_mode_t; - -/*! @brief DMA mode */ -typedef enum _usdhc_dma_mode -{ - kUSDHC_DmaModeSimple = 0U, /*!< External DMA. */ - kUSDHC_DmaModeAdma1 = 1U, /*!< ADMA1 is selected. */ - kUSDHC_DmaModeAdma2 = 2U, /*!< ADMA2 is selected. */ - kUSDHC_ExternalDMA = 3U, /*!< External DMA mode selected. */ -} usdhc_dma_mode_t; - -/*! @brief Enum _usdhc_sdio_control_flag. SDIO control flag mask. - * @anchor _usdhc_sdio_control_flag - */ -enum -{ - kUSDHC_StopAtBlockGapFlag = USDHC_PROT_CTRL_SABGREQ_MASK, /*!< Stop at block gap. */ - kUSDHC_ReadWaitControlFlag = USDHC_PROT_CTRL_RWCTL_MASK, /*!< Read wait control. */ - kUSDHC_InterruptAtBlockGapFlag = USDHC_PROT_CTRL_IABG_MASK, /*!< Interrupt at block gap. */ - kUSDHC_ReadDoneNo8CLK = USDHC_PROT_CTRL_RD_DONE_NO_8CLK_MASK, /*!< Read done without 8 clk for block gap. */ - kUSDHC_ExactBlockNumberReadFlag = USDHC_PROT_CTRL_NON_EXACT_BLK_RD_MASK, /*!< Exact block number read. */ -}; - -/*! @brief MMC card boot mode */ -typedef enum _usdhc_boot_mode -{ - kUSDHC_BootModeNormal = 0U, /*!< Normal boot */ - kUSDHC_BootModeAlternative = 1U, /*!< Alternative boot */ -} usdhc_boot_mode_t; - -/*! @brief The command type */ -typedef enum _usdhc_card_command_type -{ - kCARD_CommandTypeNormal = 0U, /*!< Normal command */ - kCARD_CommandTypeSuspend = 1U, /*!< Suspend command */ - kCARD_CommandTypeResume = 2U, /*!< Resume command */ - kCARD_CommandTypeAbort = 3U, /*!< Abort command */ - kCARD_CommandTypeEmpty = 4U, /*!< Empty command */ -} usdhc_card_command_type_t; - -/*! - * @brief The command response type. - * - * Defines the command response type from card to host controller. - */ -typedef enum _usdhc_card_response_type -{ - kCARD_ResponseTypeNone = 0U, /*!< Response type: none */ - kCARD_ResponseTypeR1 = 1U, /*!< Response type: R1 */ - kCARD_ResponseTypeR1b = 2U, /*!< Response type: R1b */ - kCARD_ResponseTypeR2 = 3U, /*!< Response type: R2 */ - kCARD_ResponseTypeR3 = 4U, /*!< Response type: R3 */ - kCARD_ResponseTypeR4 = 5U, /*!< Response type: R4 */ - kCARD_ResponseTypeR5 = 6U, /*!< Response type: R5 */ - kCARD_ResponseTypeR5b = 7U, /*!< Response type: R5b */ - kCARD_ResponseTypeR6 = 8U, /*!< Response type: R6 */ - kCARD_ResponseTypeR7 = 9U, /*!< Response type: R7 */ -} usdhc_card_response_type_t; - -/*! @brief The alignment size for ADDRESS filed in ADMA1's descriptor. */ -#define USDHC_ADMA1_ADDRESS_ALIGN (4096U) -/*! @brief The alignment size for LENGTH field in ADMA1's descriptor. */ -#define USDHC_ADMA1_LENGTH_ALIGN (4096U) -/*! @brief The alignment size for ADDRESS field in ADMA2's descriptor. */ -#define USDHC_ADMA2_ADDRESS_ALIGN (4U) -/*! @brief The alignment size for LENGTH filed in ADMA2's descriptor. */ -#define USDHC_ADMA2_LENGTH_ALIGN (4U) - -/* ADMA1 descriptor table: - * |------------------------|---------|--------------------------| - * | Address/page field |Reserved | Attribute | - * |------------------------|---------|--------------------------| - * |31 12|11 6|05 |04 |03|02 |01 |00 | - * |------------------------|---------|----|----|--|---|---|-----| - * | address or data length | 000000 |Act2|Act1| 0|Int|End|Valid| - * |------------------------|---------|----|----|--|---|---|-----| - * - * ADMA2 action table: - * |------|------|-----------------|-------|-------------| - * | Act2 | Act1 | Comment | 31-28 | 27 - 12 | - * |------|------|-----------------|---------------------| - * | 0 | 0 | No op | Don't care | - * |------|------|-----------------|-------|-------------| - * | 0 | 1 | Set data length | 0000 | Data Length | - * |------|------|-----------------|-------|-------------| - * | 1 | 0 | Transfer data | Data address | - * |------|------|-----------------|---------------------| - * | 1 | 1 | Link descriptor | Descriptor address | - * |------|------|-----------------|---------------------| - */ -/****************************tables below are created only for Doxygen*********************************/ -/*! @brief The bit shift for ADDRESS filed in ADMA1's descriptor. - * - * - *
ADMA1 descriptor table
Address/page field Reserved Attribute - *
31 12 11 6 05 04 03 02 01 00 - *
address or data length 000000 Act2 Act1 0 Int End Valid - *
- * - * - * - *
ADMA2 action
Act2 Act1 Comment 31-28 27-12 - *
0 0 No op Don't care - *
0 1 Set data length 0000 Data Length - *
1 0 Transfer data Data address - *
1 1 Link descriptor Descriptor address - *
- */ -#define USDHC_ADMA1_DESCRIPTOR_ADDRESS_SHIFT (12U) -/*! @brief The bit mask for ADDRESS field in ADMA1's descriptor. */ -#define USDHC_ADMA1_DESCRIPTOR_ADDRESS_MASK (0xFFFFFU) -/*! @brief The bit shift for LENGTH filed in ADMA1's descriptor. */ -#define USDHC_ADMA1_DESCRIPTOR_LENGTH_SHIFT (12U) -/*! @brief The mask for LENGTH field in ADMA1's descriptor. */ -#define USDHC_ADMA1_DESCRIPTOR_LENGTH_MASK (0xFFFFU) -/*! @brief The maximum value of LENGTH filed in ADMA1's descriptor. - * Since the max transfer size ADMA1 support is 65535 which is indivisible by - * 4096, so to make sure a large data load transfer (>64KB) continuously (require the data - * address be always align with 4096), software will set the maximum data length - * for ADMA1 to (64 - 4)KB. - */ -#define USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY (USDHC_ADMA1_DESCRIPTOR_LENGTH_MASK + 1U - 4096U) - -/*! @brief Enum _usdhc_adma1_descriptor_flag. The mask for the control/status field in ADMA1 descriptor. */ -enum -{ - kUSDHC_Adma1DescriptorValidFlag = (1U << 0U), /*!< Valid flag. */ - kUSDHC_Adma1DescriptorEndFlag = (1U << 1U), /*!< End flag. */ - kUSDHC_Adma1DescriptorInterrupFlag = (1U << 2U), /*!< Interrupt flag. */ - kUSDHC_Adma1DescriptorActivity1Flag = (1U << 4U), /*!< Activity 1 flag. */ - kUSDHC_Adma1DescriptorActivity2Flag = (1U << 5U), /*!< Activity 2 flag. */ - kUSDHC_Adma1DescriptorTypeNop = (kUSDHC_Adma1DescriptorValidFlag), /*!< No operation. */ - kUSDHC_Adma1DescriptorTypeTransfer = (kUSDHC_Adma1DescriptorActivity2Flag | kUSDHC_Adma1DescriptorValidFlag), - /*!< Transfer data. */ - kUSDHC_Adma1DescriptorTypeLink = (kUSDHC_Adma1DescriptorActivity1Flag | kUSDHC_Adma1DescriptorActivity2Flag | - kUSDHC_Adma1DescriptorValidFlag), /*!< Link descriptor. */ - kUSDHC_Adma1DescriptorTypeSetLength = (kUSDHC_Adma1DescriptorActivity1Flag | kUSDHC_Adma1DescriptorValidFlag), - /*!< Set data length. */ -}; - -/* ADMA2 descriptor table: - * |----------------|---------------|-------------|--------------------------| - * | Address field | Length | Reserved | Attribute | - * |----------------|---------------|-------------|--------------------------| - * |63 32|31 16|15 06|05 |04 |03|02 |01 |00 | - * |----------------|---------------|-------------|----|----|--|---|---|-----| - * | 32-bit address | 16-bit length | 0000000000 |Act2|Act1| 0|Int|End|Valid| - * |----------------|---------------|-------------|----|----|--|---|---|-----| - * - * ADMA2 action table: - * | Act2 | Act1 | Comment | Operation | - * |------|------|-----------------|-------------------------------------------------------------------| - * | 0 | 0 | No op | Don't care | - * |------|------|-----------------|-------------------------------------------------------------------| - * | 0 | 1 | Reserved | Read this line and go to next one | - * |------|------|-----------------|-------------------------------------------------------------------| - * | 1 | 0 | Transfer data | Transfer data with address and length set in this descriptor line | - * |------|------|-----------------|-------------------------------------------------------------------| - * | 1 | 1 | Link descriptor | Link to another descriptor | - * |------|------|-----------------|-------------------------------------------------------------------| - */ -/**********************************tables below are created only for Doxygen***********************************/ -/*! @brief The bit shift for LENGTH field in ADMA2's descriptor. - * - * - * - *
ADMA2 descriptor table
Address field Length Reserved Attribute - *
63 32 31 16 15 06 05 04 03 02 01 00 - *
32-bit address 16-bit length 0000000000 Act2 Act1 0 Int End Valid - *
- * - * - * - *
ADMA2 action
Act2 Act1 Comment Operation - *
0 0 No op Don't care - *
0 1 Reserved Read this line and go to next one - *
1 0 Transfer data Transfer data with address and length set in this descriptor line - *
1 1 Link descriptor Link to another descriptor - *
- */ -#define USDHC_ADMA2_DESCRIPTOR_LENGTH_SHIFT (16U) -/*! @brief The bit mask for LENGTH field in ADMA2's descriptor. */ -#define USDHC_ADMA2_DESCRIPTOR_LENGTH_MASK (0xFFFFU) -/*! @brief The maximum value of LENGTH field in ADMA2's descriptor. */ -#define USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY (USDHC_ADMA2_DESCRIPTOR_LENGTH_MASK - 3U) - -/*! @brief Enum _usdhc_adma2_descriptor_flag. ADMA1 descriptor control and status mask. */ -enum -{ - kUSDHC_Adma2DescriptorValidFlag = (1U << 0U), /*!< Valid flag. */ - kUSDHC_Adma2DescriptorEndFlag = (1U << 1U), /*!< End flag. */ - kUSDHC_Adma2DescriptorInterruptFlag = (1U << 2U), /*!< Interrupt flag. */ - kUSDHC_Adma2DescriptorActivity1Flag = (1U << 4U), /*!< Activity 1 mask. */ - kUSDHC_Adma2DescriptorActivity2Flag = (1U << 5U), /*!< Activity 2 mask. */ - - kUSDHC_Adma2DescriptorTypeNop = (kUSDHC_Adma2DescriptorValidFlag), /*!< No operation. */ - kUSDHC_Adma2DescriptorTypeReserved = (kUSDHC_Adma2DescriptorActivity1Flag | kUSDHC_Adma2DescriptorValidFlag), - /*!< Reserved. */ - kUSDHC_Adma2DescriptorTypeTransfer = (kUSDHC_Adma2DescriptorActivity2Flag | kUSDHC_Adma2DescriptorValidFlag), - /*!< Transfer type. */ - kUSDHC_Adma2DescriptorTypeLink = (kUSDHC_Adma2DescriptorActivity1Flag | kUSDHC_Adma2DescriptorActivity2Flag | - kUSDHC_Adma2DescriptorValidFlag), /*!< Link type. */ -}; - -/*! @brief Enum _usdhc_adma_flag. ADMA descriptor configuration flag. - * @anchor _usdhc_adma_flag - */ -enum -{ - kUSDHC_AdmaDescriptorSingleFlag = 0U, - /*!< Try to finish the transfer in a single ADMA descriptor. If transfer size is bigger than one - ADMA descriptor's ability, new another descriptor for data transfer. */ - kUSDHC_AdmaDescriptorMultipleFlag = - 1U, /*!< Create multiple ADMA descriptors within the ADMA table, this is used for - mmc boot mode specifically, which need - to modify the ADMA descriptor on the fly, so the flag should be used - combining with stop at block gap feature. */ -}; - -/*! @brief DMA transfer burst len config. */ -typedef enum _usdhc_burst_len -{ - kUSDHC_EnBurstLenForINCR = 0x01U, /*!< Enable burst len for INCR. */ - kUSDHC_EnBurstLenForINCR4816 = 0x02U, /*!< Enable burst len for INCR4/INCR8/INCR16. */ - kUSDHC_EnBurstLenForINCR4816WRAP = 0x04U, /*!< Enable burst len for INCR4/8/16 WRAP. */ -} usdhc_burst_len_t; - -/*! @brief Enum _usdhc_transfer_data_type. Tansfer data type definition. */ -enum -{ - kUSDHC_TransferDataNormal = 0U, /*!< Transfer normal read/write data. */ - kUSDHC_TransferDataTuning = 1U, /*!< Transfer tuning data. */ - kUSDHC_TransferDataBoot = 2U, /*!< Transfer boot data. */ - kUSDHC_TransferDataBootcontinous = 3U, /*!< Transfer boot data continuously. */ -}; - -/*! @brief Defines the ADMA1 descriptor structure. */ -typedef uint32_t usdhc_adma1_descriptor_t; - -/*! @brief Defines the ADMA2 descriptor structure. */ -typedef struct _usdhc_adma2_descriptor -{ - uint32_t attribute; /*!< The control and status field. */ - const uint32_t *address; /*!< The address field. */ -} usdhc_adma2_descriptor_t; - -/*! - * @brief USDHC capability information. - * - * Defines a structure to save the capability information of USDHC. - */ -typedef struct _usdhc_capability -{ - uint32_t sdVersion; /*!< Support SD card/sdio version. */ - uint32_t mmcVersion; /*!< Support EMMC card version. */ - uint32_t maxBlockLength; /*!< Maximum block length united as byte. */ - uint32_t maxBlockCount; /*!< Maximum block count can be set one time. */ - uint32_t flags; /*!< Capability flags to indicate the support information(@ref _usdhc_capability_flag). */ -} usdhc_capability_t; - -/*! @brief Data structure to configure the MMC boot feature. */ -typedef struct _usdhc_boot_config -{ - uint32_t ackTimeoutCount; /*!< Timeout value for the boot ACK. The available range is 0 ~ 15. */ - usdhc_boot_mode_t bootMode; /*!< Boot mode selection. */ - uint32_t blockCount; /*!< Stop at block gap value of automatic mode. Available range is 0 ~ 65535. */ - size_t blockSize; /*!< Block size. */ - bool enableBootAck; /*!< Enable or disable boot ACK. */ - bool enableAutoStopAtBlockGap; /*!< Enable or disable auto stop at block gap function in boot period. */ -} usdhc_boot_config_t; - -/*! @brief Data structure to initialize the USDHC. */ -typedef struct _usdhc_config -{ - uint32_t dataTimeout; /*!< Data timeout value. */ - usdhc_endian_mode_t endianMode; /*!< Endian mode. */ - uint8_t readWatermarkLevel; /*!< Watermark level for DMA read operation. Available range is 1 ~ 128. */ - uint8_t writeWatermarkLevel; /*!< Watermark level for DMA write operation. Available range is 1 ~ 128. */ -#if !(defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) - uint8_t readBurstLen; /*!< Read burst len. */ - uint8_t writeBurstLen; /*!< Write burst len. */ -#endif -} usdhc_config_t; - -/*! - * @brief Card command descriptor. - * - * Defines card command-related attribute. - */ -typedef struct _usdhc_command -{ - uint32_t index; /*!< Command index. */ - uint32_t argument; /*!< Command argument. */ - usdhc_card_command_type_t type; /*!< Command type. */ - usdhc_card_response_type_t responseType; /*!< Command response type. */ - uint32_t response[4U]; /*!< Response for this command. */ - uint32_t responseErrorFlags; /*!< Response error flag, which need to check - the command reponse. */ - uint32_t flags; /*!< Cmd flags. */ -} usdhc_command_t; - -/*! @brief ADMA configuration. */ -typedef struct _usdhc_adma_config -{ - usdhc_dma_mode_t dmaMode; /*!< DMA mode. */ -#if !(defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) - usdhc_burst_len_t burstLen; /*!< Burst len config. */ -#endif - uint32_t *admaTable; /*!< ADMA table address, can't be null if transfer way is ADMA1/ADMA2. */ - uint32_t admaTableWords; /*!< ADMA table length united as words, can't be 0 if transfer way is ADMA1/ADMA2. */ -} usdhc_adma_config_t; - -/*! - * @brief Card scatter gather data list. - * - * Allow application register uncontinuous data buffer for data transfer. - */ -typedef struct _usdhc_scatter_gather_data_list -{ - uint32_t *dataAddr; - uint32_t dataSize; - struct _usdhc_scatter_gather_data_list *dataList; -} usdhc_scatter_gather_data_list_t; - -/*! - * @brief Card scatter gather data descriptor. - * - * Defines a structure to contain data-related attribute. The 'enableIgnoreError' is used when upper card - * driver wants to ignore the error event to read/write all the data and not to stop read/write immediately when an - * error event happens. For example, bus testing procedure for MMC card. - */ -typedef struct _usdhc_scatter_gather_data -{ - bool enableAutoCommand12; /*!< Enable auto CMD12. */ - bool enableAutoCommand23; /*!< Enable auto CMD23. */ - bool enableIgnoreError; /*!< Enable to ignore error event to read/write all the data. */ - - usdhc_transfer_direction_t dataDirection; /*!< data direction */ - uint8_t dataType; /*!< this is used to distinguish the normal/tuning/boot data. */ - size_t blockSize; /*!< Block size. */ - - usdhc_scatter_gather_data_list_t sgData; /*!< scatter gather data */ -} usdhc_scatter_gather_data_t; - -/*! @brief usdhc scatter gather transfer. */ -typedef struct _usdhc_scatter_gather_transfer -{ - usdhc_scatter_gather_data_t *data; /*!< Data to transfer. */ - usdhc_command_t *command; /*!< Command to send. */ -} usdhc_scatter_gather_transfer_t; - -/*! - * @brief Card data descriptor. - * - * Defines a structure to contain data-related attribute. The 'enableIgnoreError' is used when upper card - * driver wants to ignore the error event to read/write all the data and not to stop read/write immediately when an - * error event happens. For example, bus testing procedure for MMC card. - */ -typedef struct _usdhc_data -{ - bool enableAutoCommand12; /*!< Enable auto CMD12. */ - bool enableAutoCommand23; /*!< Enable auto CMD23. */ - bool enableIgnoreError; /*!< Enable to ignore error event to read/write all the data. */ - uint8_t dataType; /*!< this is used to distinguish the normal/tuning/boot data. */ - size_t blockSize; /*!< Block size. */ - uint32_t blockCount; /*!< Block count. */ - uint32_t *rxData; /*!< Buffer to save data read. */ - const uint32_t *txData; /*!< Data buffer to write. */ -} usdhc_data_t; - -/*! @brief Transfer state. */ -typedef struct _usdhc_transfer -{ - usdhc_data_t *data; /*!< Data to transfer. */ - usdhc_command_t *command; /*!< Command to send. */ -} usdhc_transfer_t; - -/*! @brief USDHC handle typedef. */ -typedef struct _usdhc_handle usdhc_handle_t; - -/*! @brief USDHC callback functions. */ -typedef struct _usdhc_transfer_callback -{ - void (*CardInserted)(USDHC_Type *base, - void *userData); /*!< Card inserted occurs when DAT3/CD pin is for card detect */ - void (*CardRemoved)(USDHC_Type *base, void *userData); /*!< Card removed occurs */ - void (*SdioInterrupt)(USDHC_Type *base, void *userData); /*!< SDIO card interrupt occurs */ - void (*BlockGap)(USDHC_Type *base, void *userData); /*!< stopped at block gap event */ - void (*TransferComplete)(USDHC_Type *base, - usdhc_handle_t *handle, - status_t status, - void *userData); /*!< Transfer complete callback. */ - void (*ReTuning)(USDHC_Type *base, void *userData); /*!< Handle the re-tuning. */ -} usdhc_transfer_callback_t; - -/*! - * @brief USDHC handle. - * - * Defines the structure to save the USDHC state information and callback function. - * - * @note All the fields except interruptFlags and transferredWords must be allocated by the user. - */ -struct _usdhc_handle -{ -#if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER - usdhc_scatter_gather_data_t *volatile data; /*!< scatter gather data pointer */ -#else - usdhc_data_t *volatile data; /*!< Transfer parameter. Data to transfer. */ -#endif - usdhc_command_t *volatile command; /*!< Transfer parameter. Command to send. */ - - volatile uint32_t transferredWords; /*!< Transfer status. Words transferred by DATAPORT way. */ - - usdhc_transfer_callback_t callback; /*!< Callback function. */ - void *userData; /*!< Parameter for transfer complete callback. */ -}; - -/*! @brief USDHC transfer function. */ -typedef status_t (*usdhc_transfer_function_t)(USDHC_Type *base, usdhc_transfer_t *content); - -/*! @brief USDHC host descriptor. */ -typedef struct _usdhc_host -{ - USDHC_Type *base; /*!< USDHC peripheral base address. */ - uint32_t sourceClock_Hz; /*!< USDHC source clock frequency united in Hz. */ - usdhc_config_t config; /*!< USDHC configuration. */ - usdhc_capability_t capability; /*!< USDHC capability information. */ - usdhc_transfer_function_t transfer; /*!< USDHC transfer function. */ -} usdhc_host_t; - -/************************************************************************************************* - * API - ************************************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @name Initialization and deinitialization - * @{ - */ - -/*! - * @brief USDHC module initialization function. - * - * Configures the USDHC according to the user configuration. - * - * Example: - @code - usdhc_config_t config; - config.cardDetectDat3 = false; - config.endianMode = kUSDHC_EndianModeLittle; - config.dmaMode = kUSDHC_DmaModeAdma2; - config.readWatermarkLevel = 128U; - config.writeWatermarkLevel = 128U; - USDHC_Init(USDHC, &config); - @endcode - * - * @param base USDHC peripheral base address. - * @param config USDHC configuration information. - * @retval #kStatus_Success Operate successfully. - */ -void USDHC_Init(USDHC_Type *base, const usdhc_config_t *config); - -/*! - * @brief Deinitializes the USDHC. - * - * @param base USDHC peripheral base address. - */ -void USDHC_Deinit(USDHC_Type *base); - -/*! - * @brief Resets the USDHC. - * - * @param base USDHC peripheral base address. - * @param mask The reset type mask(@ref _usdhc_reset). - * @param timeout Timeout for reset. - * @retval true Reset successfully. - * @retval false Reset failed. - */ -bool USDHC_Reset(USDHC_Type *base, uint32_t mask, uint32_t timeout); - -/* @} */ - -/*! - * @name DMA Control - * @{ - */ - -/*! - * @brief Sets the DMA descriptor table configuration. - * A high level DMA descriptor configuration function. - * @param base USDHC peripheral base address. - * @param dmaConfig ADMA configuration - * @param dataConfig Data descriptor - * @param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * refer to enum @ref _usdhc_adma_flag. - * @retval #kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_SetAdmaTableConfig(USDHC_Type *base, - usdhc_adma_config_t *dmaConfig, - usdhc_data_t *dataConfig, - uint32_t flags); - -/*! - * @brief Internal DMA configuration. - * This function is used to config the USDHC DMA related registers. - * @param base USDHC peripheral base address. - * @param dmaConfig ADMA configuration. - * @param dataAddr Transfer data address, a simple DMA parameter, if ADMA is used, leave it to NULL. - * @param enAutoCmd23 Flag to indicate Auto CMD23 is enable or not, a simple DMA parameter, if ADMA is used, leave it - * to false. - * @retval #kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_SetInternalDmaConfig(USDHC_Type *base, - usdhc_adma_config_t *dmaConfig, - const uint32_t *dataAddr, - bool enAutoCmd23); - -/*! - * @brief Sets the ADMA2 descriptor table configuration. - * - * @param admaTable ADMA table address. - * @param admaTableWords ADMA table length. - * @param dataBufferAddr Data buffer address. - * @param dataBytes Data Data length. - * @param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * refer to enum @ref _usdhc_adma_flag. - * @retval #kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_SetADMA2Descriptor( - uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags); - -/*! - * @brief Sets the ADMA1 descriptor table configuration. - * - * @param admaTable ADMA table address. - * @param admaTableWords ADMA table length. - * @param dataBufferAddr Data buffer address. - * @param dataBytes Data length. - * @param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor, please - * refer to enum @ref _usdhc_adma_flag. - * @retval #kStatus_OutOfRange ADMA descriptor table length isn't enough to describe data. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_SetADMA1Descriptor( - uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags); - -/*! - * @brief Enables internal DMA. - * - * @param base USDHC peripheral base address. - * @param enable enable or disable flag - */ -static inline void USDHC_EnableInternalDMA(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->MIX_CTRL |= USDHC_MIX_CTRL_DMAEN_MASK; - } - else - { - base->MIX_CTRL &= ~USDHC_MIX_CTRL_DMAEN_MASK; - base->PROT_CTRL &= ~USDHC_PROT_CTRL_DMASEL_MASK; - } -} - -/* @} */ - -/*! - * @name Interrupts - * @{ - */ - -/*! - * @brief Enables the interrupt status. - * - * @param base USDHC peripheral base address. - * @param mask Interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline void USDHC_EnableInterruptStatus(USDHC_Type *base, uint32_t mask) -{ - base->INT_STATUS_EN |= mask; -} - -/*! - * @brief Disables the interrupt status. - * - * @param base USDHC peripheral base address. - * @param mask The interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline void USDHC_DisableInterruptStatus(USDHC_Type *base, uint32_t mask) -{ - base->INT_STATUS_EN &= ~mask; -} - -/*! - * @brief Enables the interrupt signal corresponding to the interrupt status flag. - * - * @param base USDHC peripheral base address. - * @param mask The interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline void USDHC_EnableInterruptSignal(USDHC_Type *base, uint32_t mask) -{ - base->INT_SIGNAL_EN |= mask; -} - -/*! - * @brief Disables the interrupt signal corresponding to the interrupt status flag. - * - * @param base USDHC peripheral base address. - * @param mask The interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline void USDHC_DisableInterruptSignal(USDHC_Type *base, uint32_t mask) -{ - base->INT_SIGNAL_EN &= ~mask; -} - -/* @} */ - -/*! - * @name Status - * @{ - */ - -/*! - * @brief Gets the enabled interrupt status. - * - * @param base USDHC peripheral base address. - * @return Current interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline uint32_t USDHC_GetEnabledInterruptStatusFlags(USDHC_Type *base) -{ - uint32_t intStatus = base->INT_STATUS; - - return intStatus & base->INT_SIGNAL_EN; -} - -/*! - * @brief Gets the current interrupt status. - * - * @param base USDHC peripheral base address. - * @return Current interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline uint32_t USDHC_GetInterruptStatusFlags(USDHC_Type *base) -{ - return base->INT_STATUS; -} - -/*! - * @brief Clears a specified interrupt status. - * write 1 clears - * @param base USDHC peripheral base address. - * @param mask The interrupt status flags mask(@ref _usdhc_interrupt_status_flag). - */ -static inline void USDHC_ClearInterruptStatusFlags(USDHC_Type *base, uint32_t mask) -{ - base->INT_STATUS = mask; -} - -/*! - * @brief Gets the status of auto command 12 error. - * - * @param base USDHC peripheral base address. - * @return Auto command 12 error status flags mask(@ref _usdhc_auto_command12_error_status_flag). - */ -static inline uint32_t USDHC_GetAutoCommand12ErrorStatusFlags(USDHC_Type *base) -{ - return base->AUTOCMD12_ERR_STATUS; -} - -/*! - * @brief Gets the status of the ADMA error. - * - * @param base USDHC peripheral base address. - * @return ADMA error status flags mask(@ref _usdhc_adma_error_status_flag). - */ -static inline uint32_t USDHC_GetAdmaErrorStatusFlags(USDHC_Type *base) -{ - return base->ADMA_ERR_STATUS & 0xFUL; -} - -/*! - * @brief Gets a present status. - * - * This function gets the present USDHC's status except for an interrupt status and an error status. - * - * @param base USDHC peripheral base address. - * @return Present USDHC's status flags mask(@ref _usdhc_present_status_flag). - */ -static inline uint32_t USDHC_GetPresentStatusFlags(USDHC_Type *base) -{ - return base->PRES_STATE; -} - -/* @} */ - -/*! - * @name Bus Operations - * @{ - */ - -/*! - * @brief Gets the capability information. - * - * @param base USDHC peripheral base address. - * @param capability Structure to save capability information. - */ -void USDHC_GetCapability(USDHC_Type *base, usdhc_capability_t *capability); - -/*! - * @brief Forces the card clock on. - * - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - */ -static inline void USDHC_ForceClockOn(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->VEND_SPEC |= USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK; - } - else - { - base->VEND_SPEC &= ~USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK; - } -} - -/*! - * @brief Sets the SD bus clock frequency. - * - * @param base USDHC peripheral base address. - * @param srcClock_Hz USDHC source clock frequency united in Hz. - * @param busClock_Hz SD bus clock frequency united in Hz. - * - * @return The nearest frequency of busClock_Hz configured for SD bus. - */ -uint32_t USDHC_SetSdClock(USDHC_Type *base, uint32_t srcClock_Hz, uint32_t busClock_Hz); - -/*! - * @brief Sends 80 clocks to the card to set it to the active state. - * - * This function must be called each time the card is inserted to ensure that the card can receive the command - * correctly. - * - * @param base USDHC peripheral base address. - * @param timeout Timeout to initialize card. - * @retval true Set card active successfully. - * @retval false Set card active failed. - */ -bool USDHC_SetCardActive(USDHC_Type *base, uint32_t timeout); - -/*! - * @brief Triggers a hardware reset. - * - * @param base USDHC peripheral base address. - * @param high 1 or 0 level - */ -static inline void USDHC_AssertHardwareReset(USDHC_Type *base, bool high) -{ - if (high) - { - base->SYS_CTRL |= USDHC_SYS_CTRL_IPP_RST_N_MASK; - } - else - { - base->SYS_CTRL &= ~USDHC_SYS_CTRL_IPP_RST_N_MASK; - } -} - -/*! - * @brief Sets the data transfer width. - * - * @param base USDHC peripheral base address. - * @param width Data transfer width. - */ -static inline void USDHC_SetDataBusWidth(USDHC_Type *base, usdhc_data_bus_width_t width) -{ - base->PROT_CTRL = ((base->PROT_CTRL & ~USDHC_PROT_CTRL_DTW_MASK) | USDHC_PROT_CTRL_DTW(width)); -} - -/*! - * @brief Fills the data port. - * - * This function is used to implement the data transfer by Data Port instead of DMA. - * - * @param base USDHC peripheral base address. - * @param data The data about to be sent. - */ -static inline void USDHC_WriteData(USDHC_Type *base, uint32_t data) -{ - base->DATA_BUFF_ACC_PORT = data; -} - -/*! - * @brief Retrieves the data from the data port. - * - * This function is used to implement the data transfer by Data Port instead of DMA. - * - * @param base USDHC peripheral base address. - * @return The data has been read. - */ -static inline uint32_t USDHC_ReadData(USDHC_Type *base) -{ - return base->DATA_BUFF_ACC_PORT; -} - -/*! - * @brief Sends command function. - * - * @param base USDHC peripheral base address. - * @param command configuration - */ -void USDHC_SendCommand(USDHC_Type *base, usdhc_command_t *command); - -/*! - * @brief Enables or disables a wakeup event in low-power mode. - * - * @param base USDHC peripheral base address. - * @param mask Wakeup events mask(@ref _usdhc_wakeup_event). - * @param enable True to enable, false to disable. - */ -static inline void USDHC_EnableWakeupEvent(USDHC_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->PROT_CTRL |= mask; - } - else - { - base->PROT_CTRL &= ~mask; - } -} - -/*! - * @brief Detects card insert status. - * - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - */ -static inline void USDHC_CardDetectByData3(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->PROT_CTRL |= USDHC_PROT_CTRL_D3CD_MASK; - } - else - { - base->PROT_CTRL &= ~USDHC_PROT_CTRL_D3CD_MASK; - } -} - -/*! - * @brief Detects card insert status. - * - * @param base USDHC peripheral base address. - */ -static inline bool USDHC_DetectCardInsert(USDHC_Type *base) -{ - return ((base->PRES_STATE & (uint32_t)kUSDHC_CardInsertedFlag) != 0UL) ? true : false; -} - -/*! - * @brief Enables or disables the SDIO card control. - * - * @param base USDHC peripheral base address. - * @param mask SDIO card control flags mask(@ref _usdhc_sdio_control_flag). - * @param enable True to enable, false to disable. - */ -static inline void USDHC_EnableSdioControl(USDHC_Type *base, uint32_t mask, bool enable) -{ - if (enable) - { - base->PROT_CTRL |= mask; - } - else - { - base->PROT_CTRL &= ~mask; - } -} - -/*! - * @brief Restarts a transaction which has stopped at the block GAP for the SDIO card. - * - * @param base USDHC peripheral base address. - */ -static inline void USDHC_SetContinueRequest(USDHC_Type *base) -{ - base->PROT_CTRL |= USDHC_PROT_CTRL_CREQ_MASK; -} - -/*! - * @brief Request stop at block gap function. - * - * @param base USDHC peripheral base address. - * @param enable True to stop at block gap, false to normal transfer. - */ -static inline void USDHC_RequestStopAtBlockGap(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->PROT_CTRL |= USDHC_PROT_CTRL_SABGREQ_MASK; - } - else - { - base->PROT_CTRL &= ~USDHC_PROT_CTRL_SABGREQ_MASK; - } -} - -/*! - * @brief Configures the MMC boot feature. - * - * Example: - @code - usdhc_boot_config_t config; - config.ackTimeoutCount = 4; - config.bootMode = kUSDHC_BootModeNormal; - config.blockCount = 5; - config.enableBootAck = true; - config.enableBoot = true; - config.enableAutoStopAtBlockGap = true; - USDHC_SetMmcBootConfig(USDHC, &config); - @endcode - * - * @param base USDHC peripheral base address. - * @param config The MMC boot configuration information. - */ -void USDHC_SetMmcBootConfig(USDHC_Type *base, const usdhc_boot_config_t *config); - -/*! - * @brief Enables or disables the mmc boot mode. - * - * @param base USDHC peripheral base address. - * @param enable True to enable, false to disable. - */ -static inline void USDHC_EnableMmcBoot(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->MMC_BOOT |= USDHC_MMC_BOOT_BOOT_EN_MASK; - } - else - { - base->MMC_BOOT &= ~USDHC_MMC_BOOT_BOOT_EN_MASK; - } -} - -/*! - * @brief Forces generating events according to the given mask. - * - * @param base USDHC peripheral base address. - * @param mask The force events bit posistion (_usdhc_force_event). - */ -static inline void USDHC_SetForceEvent(USDHC_Type *base, uint32_t mask) -{ - base->FORCE_EVENT = mask; -} - -/*! - * @brief Selects the USDHC output voltage. - * - * @param base USDHC peripheral base address. - * @param en18v True means 1.8V, false means 3.0V. - */ -static inline void UDSHC_SelectVoltage(USDHC_Type *base, bool en18v) -{ - if (en18v) - { - base->VEND_SPEC |= USDHC_VEND_SPEC_VSELECT_MASK; - } - else - { - base->VEND_SPEC &= ~USDHC_VEND_SPEC_VSELECT_MASK; - } -} - -#if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE) -/*! - * @brief Checks the SDR50 mode request tuning bit. - * When this bit set, application shall perform tuning for SDR50 mode. - * @param base USDHC peripheral base address. - */ -static inline bool USDHC_RequestTuningForSDR50(USDHC_Type *base) -{ - return ((base->HOST_CTRL_CAP & USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_MASK) != 0UL) ? true : false; -} - -/*! - * @brief Checks the request re-tuning bit. - * When this bit is set, user should do manual tuning or standard tuning function. - * @param base USDHC peripheral base address. - */ -static inline bool USDHC_RequestReTuning(USDHC_Type *base) -{ - return ((base->PRES_STATE & USDHC_PRES_STATE_RTR_MASK) != 0UL) ? true : false; -} - -/*! - * @brief The SDR104 mode auto tuning enable and disable. - * This function should be called after tuning function execute pass, auto tuning will handle - * by hardware. - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - */ -static inline void USDHC_EnableAutoTuning(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->MIX_CTRL |= USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK; - } - else - { - base->MIX_CTRL &= ~USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK; - } -} - -#if !(defined(FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_NO_RETUNING_TIME_COUNTER) && \ - FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_NO_RETUNING_TIME_COUNTER) -/*! - * @brief Configs the re-tuning timer for mode 1 and mode 3. - * This timer is used for standard tuning auto re-tuning, - * @param base USDHC peripheral base address. - * @param counter timer counter value - */ -static inline void USDHC_SetRetuningTimer(USDHC_Type *base, uint32_t counter) -{ - base->HOST_CTRL_CAP &= ~USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_MASK; - base->HOST_CTRL_CAP |= USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING(counter); -} -#endif /* FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_RETUNING_TIME_COUNTER */ - -/*! - * @brief The auto tuning enbale for CMD/DATA line. - * - * @param base USDHC peripheral base address. - */ -void USDHC_EnableAutoTuningForCmdAndData(USDHC_Type *base); - -/*! - * @brief Manual tuning trigger or abort. - * User should handle the tuning cmd and find the boundary of the delay - * then calucate a average value which will be configured to the CLK_TUNE_CTRL_STATUS - * This function should be called before function @ref USDHC_AdjustDelayForManualTuning. - * @param base USDHC peripheral base address. - * @param enable tuning enable flag - */ -void USDHC_EnableManualTuning(USDHC_Type *base, bool enable); - -/*! - * @brief Get the tuning delay cell setting. - * - * @param base USDHC peripheral base address. - * @retval CLK Tuning Control and Status register value. - */ -static inline uint32_t USDHC_GetTuningDelayStatus(USDHC_Type *base) -{ - return base->CLK_TUNE_CTRL_STATUS >> 16U; -} - -/*! - * @brief The tuning delay cell setting. - * - * @param base USDHC peripheral base address. - * @param preDelay Set the number of delay cells on the feedback clock between the feedback clock and CLK_PRE. - * @param outDelay Set the number of delay cells on the feedback clock between CLK_PRE and CLK_OUT. - * @param postDelay Set the number of delay cells on the feedback clock between CLK_OUT and CLK_POST. - * @retval kStatus_Fail config the delay setting fail - * @retval kStatus_Success config the delay setting success - */ -status_t USDHC_SetTuningDelay(USDHC_Type *base, uint32_t preDelay, uint32_t outDelay, uint32_t postDelay); - -/*! - * @brief Adjusts delay for mannual tuning. - * @deprecated Do not use this function. It has been superceded by USDHC_SetTuingDelay - * @param base USDHC peripheral base address. - * @param delay setting configuration - * @retval #kStatus_Fail config the delay setting fail - * @retval #kStatus_Success config the delay setting success - */ -status_t USDHC_AdjustDelayForManualTuning(USDHC_Type *base, uint32_t delay); - -/*! - * @brief set tuning counter tuning. - * @param base USDHC peripheral base address. - * @param counter tuning counter - * @retval #kStatus_Fail config the delay setting fail - * @retval #kStatus_Success config the delay setting success - */ -static inline void USDHC_SetStandardTuningCounter(USDHC_Type *base, uint8_t counter) -{ - base->TUNING_CTRL = - (base->TUNING_CTRL & (~USDHC_TUNING_CTRL_TUNING_COUNTER_MASK)) | USDHC_TUNING_CTRL_TUNING_COUNTER(counter); -} - -/*! - * @brief The enable standard tuning function. - * The standard tuning window and tuning counter using the default config - * tuning cmd is sent by the software, user need to check whether the tuning result - * can be used for SDR50, SDR104, and HS200 mode tuning. - * @param base USDHC peripheral base address. - * @param tuningStartTap start tap - * @param step tuning step - * @param enable enable/disable flag - */ -void USDHC_EnableStandardTuning(USDHC_Type *base, uint32_t tuningStartTap, uint32_t step, bool enable); - -/*! - * @brief Gets execute STD tuning status. - * - * @param base USDHC peripheral base address. - */ -static inline uint32_t USDHC_GetExecuteStdTuningStatus(USDHC_Type *base) -{ - return (base->AUTOCMD12_ERR_STATUS & USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK); -} - -/*! - * @brief Checks STD tuning result. - * - * @param base USDHC peripheral base address. - */ -static inline uint32_t USDHC_CheckStdTuningResult(USDHC_Type *base) -{ - return (base->AUTOCMD12_ERR_STATUS & USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK); -} - -/*! - * @brief Checks tuning error. - * - * @param base USDHC peripheral base address. - */ -static inline uint32_t USDHC_CheckTuningError(USDHC_Type *base) -{ - return (base->CLK_TUNE_CTRL_STATUS & - (USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK | USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK)); -} - -#endif -/*! - * @brief The enable/disable DDR mode. - * - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - * @param nibblePos nibble position - */ -void USDHC_EnableDDRMode(USDHC_Type *base, bool enable, uint32_t nibblePos); - -#if FSL_FEATURE_USDHC_HAS_HS400_MODE -/*! - * @brief The enable/disable HS400 mode. - * - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - */ -static inline void USDHC_EnableHS400Mode(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->MIX_CTRL |= USDHC_MIX_CTRL_HS400_MODE_MASK; - } - else - { - base->MIX_CTRL &= ~USDHC_MIX_CTRL_HS400_MODE_MASK; - } -} - -/*! - * @brief Resets the strobe DLL. - * - * @param base USDHC peripheral base address. - */ -static inline void USDHC_ResetStrobeDLL(USDHC_Type *base) -{ - base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_RESET_MASK; -} - -/*! - * @brief Enables/disables the strobe DLL. - * - * @param base USDHC peripheral base address. - * @param enable enable/disable flag - */ -static inline void USDHC_EnableStrobeDLL(USDHC_Type *base, bool enable) -{ - if (enable) - { - base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK; - } - else - { - base->STROBE_DLL_CTRL &= ~USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK; - } -} - -/*! - * @brief Configs the strobe DLL delay target and update interval. - * - * @param base USDHC peripheral base address. - * @param delayTarget delay target - * @param updateInterval update interval - */ -void USDHC_ConfigStrobeDLL(USDHC_Type *base, uint32_t delayTarget, uint32_t updateInterval); - -/*! - * @brief Enables manual override for slave delay chain using STROBE_SLV_OVERRIDE_VAL. - * - * @param base USDHC peripheral base address. - * @param delayTaps Valid delay taps range from 1 - 128 taps. A value of 0 selects tap 1, and a value of 0x7F selects - * tap 128. - */ -static inline void USDHC_SetStrobeDllOverride(USDHC_Type *base, uint32_t delayTaps) -{ - base->STROBE_DLL_CTRL &= (USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK | - USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_VAL_MASK); - - base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_MASK | - USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_VAL(delayTaps); -} - -/*! - * @brief Gets the strobe DLL status. - * - * @param base USDHC peripheral base address. - */ -static inline uint32_t USDHC_GetStrobeDLLStatus(USDHC_Type *base) -{ - return base->STROBE_DLL_STATUS; -} - -#endif - -/*! - * @brief USDHC data configuration. - * - * @param base USDHC peripheral base address. - * @param dataDirection Data direction, tx or rx. - * @param blockCount Data block count. - * @param blockSize Data block size. - * - */ -void USDHC_SetDataConfig(USDHC_Type *base, - usdhc_transfer_direction_t dataDirection, - uint32_t blockCount, - uint32_t blockSize); -/* @} */ - -/*! - * @name Transactional functions - * @{ - */ - -/*! - * @brief Creates the USDHC handle. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle pointer. - * @param callback Structure pointer to contain all callback functions. - * @param userData Callback function parameter. - */ -void USDHC_TransferCreateHandle(USDHC_Type *base, - usdhc_handle_t *handle, - const usdhc_transfer_callback_t *callback, - void *userData); - -#if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER -/*! - * @brief Transfers the command/scatter gather data using an interrupt and an asynchronous method. - * - * This function sends a command and data and returns immediately. It doesn't wait for the transfer to complete or - * to encounter an error. The application must not call this API in multiple threads at the same time. Because of that - * this API doesn't support the re-entry mechanism. - * This function is target for the application would like to have scatter gather buffer to be transferred within one - * read/write request, non scatter gather buffer is support by this function also. - * - * @note Call API @ref USDHC_TransferCreateHandle when calling this API. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param dmaConfig adma configurations, must be not NULL, since the function is target for ADMA only. - * @param transfer scatter gather transfer content. - * - * @retval #kStatus_InvalidArgument Argument is invalid. - * @retval #kStatus_USDHC_BusyTransferring Busy transferring. - * @retval #kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_TransferScatterGatherADMANonBlocking(USDHC_Type *base, - usdhc_handle_t *handle, - usdhc_adma_config_t *dmaConfig, - usdhc_scatter_gather_transfer_t *transfer); -#else -/*! - * @brief Transfers the command/data using an interrupt and an asynchronous method. - * - * This function sends a command and data and returns immediately. It doesn't wait for the transfer to complete or - * to encounter an error. The application must not call this API in multiple threads at the same time. Because of that - * this API doesn't support the re-entry mechanism. - * - * @note Call API @ref USDHC_TransferCreateHandle when calling this API. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - * @param dmaConfig ADMA configuration. - * @param transfer Transfer content. - * @retval #kStatus_InvalidArgument Argument is invalid. - * @retval #kStatus_USDHC_BusyTransferring Busy transferring. - * @retval #kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_TransferNonBlocking(USDHC_Type *base, - usdhc_handle_t *handle, - usdhc_adma_config_t *dmaConfig, - usdhc_transfer_t *transfer); -#endif - -/*! - * @brief Transfers the command/data using a blocking method. - * - * This function waits until the command response/data is received or the USDHC encounters an error by polling the - * status flag. \n - * The application must not call this API in multiple threads at the same time. Because this API doesn't - * support the re-entry mechanism. - * - * @note There is no need to call API @ref USDHC_TransferCreateHandle when calling this API. - * - * @param base USDHC peripheral base address. - * @param dmaConfig adma configuration - * @param transfer Transfer content. - * @retval #kStatus_InvalidArgument Argument is invalid. - * @retval #kStatus_USDHC_PrepareAdmaDescriptorFailed Prepare ADMA descriptor failed. - * @retval #kStatus_USDHC_SendCommandFailed Send command failed. - * @retval #kStatus_USDHC_TransferDataFailed Transfer data failed. - * @retval #kStatus_Success Operate successfully. - */ -status_t USDHC_TransferBlocking(USDHC_Type *base, usdhc_adma_config_t *dmaConfig, usdhc_transfer_t *transfer); - -/*! - * @brief IRQ handler for the USDHC. - * - * This function deals with the IRQs on the given host controller. - * - * @param base USDHC peripheral base address. - * @param handle USDHC handle. - */ -void USDHC_TransferHandleIRQ(USDHC_Type *base, usdhc_handle_t *handle); - -/* @} */ - -#if defined(__cplusplus) -} -#endif -/*! @} */ - -#endif /* _FSL_USDHC_H_*/ diff --git a/devices/MIMXRT1052/drivers/fsl_wdog.c b/devices/MIMXRT1052/drivers/fsl_wdog.c deleted file mode 100644 index ea6c970..0000000 --- a/devices/MIMXRT1052/drivers/fsl_wdog.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_wdog.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.wdog01" -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ -static WDOG_Type *const s_wdogBases[] = WDOG_BASE_PTRS; -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of WDOG clock name. */ -static const clock_ip_name_t s_wdogClock[] = WDOG_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -static const IRQn_Type s_wdogIRQ[] = WDOG_IRQS; - -/******************************************************************************* - * Code - ******************************************************************************/ -static uint32_t WDOG_GetInstance(WDOG_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_wdogBases); instance++) - { - if (s_wdogBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_wdogBases)); - - return instance; -} - -/*! - * brief Initializes the WDOG configuration structure. - * - * This function initializes the WDOG configuration structure to default values. The default - * values are as follows. - * code - * wdogConfig->enableWdog = true; - * wdogConfig->workMode.enableWait = true; - * wdogConfig->workMode.enableStop = false; - * wdogConfig->workMode.enableDebug = false; - * wdogConfig->enableInterrupt = false; - * wdogConfig->enablePowerdown = false; - * wdogConfig->resetExtension = flase; - * wdogConfig->timeoutValue = 0xFFU; - * wdogConfig->interruptTimeValue = 0x04u; - * endcode - * - * param config Pointer to the WDOG configuration structure. - * see wdog_config_t - */ -void WDOG_GetDefaultConfig(wdog_config_t *config) -{ - assert(NULL != config); - - /* Initializes the configure structure to zero. */ - (void)memset(config, 0, sizeof(*config)); - - config->enableWdog = true; - config->workMode.enableWait = false; - config->workMode.enableStop = false; - config->workMode.enableDebug = false; - config->enableInterrupt = false; - config->softwareResetExtension = false; - config->enablePowerDown = false; - config->timeoutValue = 0xffu; - config->interruptTimeValue = 0x04u; - config->enableTimeOutAssert = false; -} - -/*! - * brief Initializes the WDOG. - * - * This function initializes the WDOG. When called, the WDOG runs according to the configuration. - * - * This is an example. - * code - * wdog_config_t config; - * WDOG_GetDefaultConfig(&config); - * config.timeoutValue = 0xffU; - * config->interruptTimeValue = 0x04u; - * WDOG_Init(wdog_base,&config); - * endcode - * - * param base WDOG peripheral base address - * param config The configuration of WDOG - */ -void WDOG_Init(WDOG_Type *base, const wdog_config_t *config) -{ - assert(NULL != config); - - uint16_t value = 0u; - uint32_t primaskValue = 0U; - - value = WDOG_WCR_WDE(config->enableWdog) | WDOG_WCR_WDW(config->workMode.enableWait) | - WDOG_WCR_WDZST(config->workMode.enableStop) | WDOG_WCR_WDBG(config->workMode.enableDebug) | - WDOG_WCR_SRE(config->softwareResetExtension) | WDOG_WCR_WT(config->timeoutValue) | - WDOG_WCR_WDT(config->enableTimeOutAssert) | WDOG_WCR_SRS_MASK | WDOG_WCR_WDA_MASK; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Set configuration */ - CLOCK_EnableClock(s_wdogClock[WDOG_GetInstance(base)]); -#endif - - primaskValue = DisableGlobalIRQ(); - base->WICR = WDOG_WICR_WICT(config->interruptTimeValue) | WDOG_WICR_WIE(config->enableInterrupt); - base->WMCR = WDOG_WMCR_PDE(config->enablePowerDown); - base->WCR = value; - EnableGlobalIRQ(primaskValue); - if (config->enableInterrupt) - { - (void)EnableIRQ(s_wdogIRQ[WDOG_GetInstance(base)]); - } -} - -/*! - * brief Shuts down the WDOG. - * - * This function shuts down the WDOG. - * Watchdog Enable bit is a write one once only bit. It is not - * possible to clear this bit by a software write, once the bit is set. - * This bit(WDE) can be set/reset only in debug mode(exception). - */ -void WDOG_Deinit(WDOG_Type *base) -{ - if (0U != (base->WCR & WDOG_WCR_WDBG_MASK)) - { - WDOG_Disable(base); - } -} - -/*! - * brief Gets the WDOG all reset status flags. - * - * This function gets all reset status flags. - * - * code - * uint16_t status; - * status = WDOG_GetStatusFlags (wdog_base); - * endcode - * param base WDOG peripheral base address - * return State of the status flag: asserted (true) or not-asserted (false).see _wdog_status_flags - * - true: a related status flag has been set. - * - false: a related status flag is not set. - */ -uint16_t WDOG_GetStatusFlags(WDOG_Type *base) -{ - uint16_t status_flag = 0U; - - status_flag |= (base->WCR & WDOG_WCR_WDE_MASK); - status_flag |= (base->WRSR & WDOG_WRSR_POR_MASK); - status_flag |= (base->WRSR & WDOG_WRSR_TOUT_MASK); - status_flag |= (base->WRSR & WDOG_WRSR_SFTW_MASK); - status_flag |= (base->WICR & WDOG_WICR_WTIS_MASK); - - return status_flag; -} - -/*! - * brief Clears the WDOG flag. - * - * This function clears the WDOG status flag. - * - * This is an example for clearing the interrupt flag. - * code - * WDOG_ClearStatusFlags(wdog_base,KWDOG_InterruptFlag); - * endcode - * param base WDOG peripheral base address - * param mask The status flags to clear. - * The parameter could be any combination of the following values. - * kWDOG_TimeoutFlag - */ -void WDOG_ClearInterruptStatus(WDOG_Type *base, uint16_t mask) -{ - if (0U != (mask & (uint16_t)kWDOG_InterruptFlag)) - { - base->WICR |= WDOG_WICR_WTIS_MASK; - } -} - -/*! - * brief Refreshes the WDOG timer. - * - * This function feeds the WDOG. - * This function should be called before the WDOG timer is in timeout. Otherwise, a reset is asserted. - * - * param base WDOG peripheral base address - */ -void WDOG_Refresh(WDOG_Type *base) -{ - uint32_t primaskValue = 0U; - - /* Disable the global interrupt to protect refresh sequence */ - primaskValue = DisableGlobalIRQ(); - base->WSR = WDOG_REFRESH_KEY & 0xFFFFU; - base->WSR = (WDOG_REFRESH_KEY >> 16U) & 0xFFFFU; - EnableGlobalIRQ(primaskValue); -} diff --git a/devices/MIMXRT1052/drivers/fsl_wdog.h b/devices/MIMXRT1052/drivers/fsl_wdog.h deleted file mode 100644 index c49b39a..0000000 --- a/devices/MIMXRT1052/drivers/fsl_wdog.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (c) 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_WDOG_H_ -#define _FSL_WDOG_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup wdog - * @{ - */ - -/******************************************************************************* - * Definitions - *******************************************************************************/ -/*! @name Driver version */ -/*@{*/ -/*! @brief Defines WDOG driver version */ -#define FSL_WDOG_DRIVER_VERSION (MAKE_VERSION(2, 1, 1)) -/*@}*/ -/*! @name Refresh sequence */ -/*@{*/ -#define WDOG_REFRESH_KEY (0xAAAA5555U) -/*@}*/ - -/*! @brief Defines WDOG work mode. */ -typedef struct _wdog_work_mode -{ - bool enableWait; /*!< continue or suspend WDOG in wait mode */ - bool enableStop; /*!< continue or suspend WDOG in stop mode */ - bool enableDebug; /*!< continue or suspend WDOG in debug mode */ -} wdog_work_mode_t; - -/*! @brief Describes WDOG configuration structure. */ -typedef struct _wdog_config -{ - bool enableWdog; /*!< Enables or disables WDOG */ - wdog_work_mode_t workMode; /*!< Configures WDOG work mode in debug stop and wait mode */ - bool enableInterrupt; /*!< Enables or disables WDOG interrupt */ - uint16_t timeoutValue; /*!< Timeout value */ - uint16_t interruptTimeValue; /*!< Interrupt count timeout value */ - bool softwareResetExtension; /*!< software reset extension */ - bool enablePowerDown; /*!< power down enable bit */ - bool enableTimeOutAssert; /*!< Enable WDOG_B timeout assertion. */ -} wdog_config_t; - -/*! - * @brief WDOG interrupt configuration structure, default settings all disabled. - * - * This structure contains the settings for all of the WDOG interrupt configurations. - */ -enum _wdog_interrupt_enable -{ - kWDOG_InterruptEnable = WDOG_WICR_WIE_MASK /*!< WDOG timeout generates an interrupt before reset*/ -}; - -/*! - * @brief WDOG status flags. - * - * This structure contains the WDOG status flags for use in the WDOG functions. - */ -enum _wdog_status_flags -{ - kWDOG_RunningFlag = WDOG_WCR_WDE_MASK, /*!< Running flag, set when WDOG is enabled*/ - kWDOG_PowerOnResetFlag = WDOG_WRSR_POR_MASK, /*!< Power On flag, set when reset is the result of a powerOnReset*/ - kWDOG_TimeoutResetFlag = WDOG_WRSR_TOUT_MASK, /*!< Timeout flag, set when reset is the result of a timeout*/ - kWDOG_SoftwareResetFlag = WDOG_WRSR_SFTW_MASK, /*!< Software flag, set when reset is the result of a software*/ - kWDOG_InterruptFlag = WDOG_WICR_WTIS_MASK /*!< interrupt flag,whether interrupt has occurred or not*/ -}; - -/******************************************************************************* - * API - *******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name WDOG Initialization and De-initialization. - * @{ - */ - -/*! - * @brief Initializes the WDOG configuration structure. - * - * This function initializes the WDOG configuration structure to default values. The default - * values are as follows. - * @code - * wdogConfig->enableWdog = true; - * wdogConfig->workMode.enableWait = true; - * wdogConfig->workMode.enableStop = false; - * wdogConfig->workMode.enableDebug = false; - * wdogConfig->enableInterrupt = false; - * wdogConfig->enablePowerdown = false; - * wdogConfig->resetExtension = flase; - * wdogConfig->timeoutValue = 0xFFU; - * wdogConfig->interruptTimeValue = 0x04u; - * @endcode - * - * @param config Pointer to the WDOG configuration structure. - * @see wdog_config_t - */ -void WDOG_GetDefaultConfig(wdog_config_t *config); - -/*! - * @brief Initializes the WDOG. - * - * This function initializes the WDOG. When called, the WDOG runs according to the configuration. - * - * This is an example. - * @code - * wdog_config_t config; - * WDOG_GetDefaultConfig(&config); - * config.timeoutValue = 0xffU; - * config->interruptTimeValue = 0x04u; - * WDOG_Init(wdog_base,&config); - * @endcode - * - * @param base WDOG peripheral base address - * @param config The configuration of WDOG - */ -void WDOG_Init(WDOG_Type *base, const wdog_config_t *config); - -/*! - * @brief Shuts down the WDOG. - * - * This function shuts down the WDOG. - * Watchdog Enable bit is a write one once only bit. It is not - * possible to clear this bit by a software write, once the bit is set. - * This bit(WDE) can be set/reset only in debug mode(exception). - */ -void WDOG_Deinit(WDOG_Type *base); - -/*! - * @brief Enables the WDOG module. - * - * This function writes a value into the WDOG_WCR register to enable the WDOG. - * This is a write one once only bit. It is not possible to clear this bit by a software write, - * once the bit is set. only debug mode exception. - * @param base WDOG peripheral base address - */ -static inline void WDOG_Enable(WDOG_Type *base) -{ - base->WCR |= WDOG_WCR_WDE_MASK; -} - -/*! - * @brief Disables the WDOG module. - * - * This function writes a value into the WDOG_WCR register to disable the WDOG. - * This is a write one once only bit. It is not possible to clear this bit by a software write,once the bit is set. - * only debug mode exception - * @param base WDOG peripheral base address - */ -static inline void WDOG_Disable(WDOG_Type *base) -{ - base->WCR &= ~(uint16_t)WDOG_WCR_WDE_MASK; -} - -/*! - * @brief Trigger the system software reset. - * - * This function will write to the WCR[SRS] bit to trigger a software system reset. - * This bit will automatically resets to "1" after it has been asserted to "0". - * Note: Calling this API will reset the system right now, please using it with more attention. - * - * @param base WDOG peripheral base address - */ -static inline void WDOG_TriggerSystemSoftwareReset(WDOG_Type *base) -{ - base->WCR &= ~(uint16_t)WDOG_WCR_SRS_MASK; -} - -/*! - * @brief Trigger an output assertion. - * - * This function will write to the WCR[WDA] bit to trigger WDOG_B signal assertion. - * The WDOG_B signal can be routed to external pin of the chip, the output pin will turn to - * assertion along with WDOG_B signal. - * Note: The WDOG_B signal will remain assert until a power on reset occurred, so, please - * take more attention while calling it. - * - * @param base WDOG peripheral base address - */ -static inline void WDOG_TriggerSoftwareSignal(WDOG_Type *base) -{ - base->WCR &= ~(uint16_t)WDOG_WCR_WDA_MASK; -} - -/*! - * @brief Enables the WDOG interrupt. - * - *This bit is a write once only bit. Once the software does a write access to this bit, it will get - *locked and cannot be reprogrammed until the next system reset assertion - * - * @param base WDOG peripheral base address - * @param mask The interrupts to enable - * The parameter can be combination of the following source if defined. - * @arg kWDOG_InterruptEnable - */ -static inline void WDOG_EnableInterrupts(WDOG_Type *base, uint16_t mask) -{ - base->WICR |= mask; -} - -/*! - * @brief Gets the WDOG all reset status flags. - * - * This function gets all reset status flags. - * - * @code - * uint16_t status; - * status = WDOG_GetStatusFlags (wdog_base); - * @endcode - * @param base WDOG peripheral base address - * @return State of the status flag: asserted (true) or not-asserted (false).@see _wdog_status_flags - * - true: a related status flag has been set. - * - false: a related status flag is not set. - */ -uint16_t WDOG_GetStatusFlags(WDOG_Type *base); - -/*! - * @brief Clears the WDOG flag. - * - * This function clears the WDOG status flag. - * - * This is an example for clearing the interrupt flag. - * @code - * WDOG_ClearStatusFlags(wdog_base,KWDOG_InterruptFlag); - * @endcode - * @param base WDOG peripheral base address - * @param mask The status flags to clear. - * The parameter could be any combination of the following values. - * kWDOG_TimeoutFlag - */ -void WDOG_ClearInterruptStatus(WDOG_Type *base, uint16_t mask); - -/*! - * @brief Sets the WDOG timeout value. - * - * This function sets the timeout value. - * This function writes a value into WCR registers. - * The time-out value can be written at any point of time but it is loaded to the counter at the time - * when WDOG is enabled or after the service routine has been performed. - * - * @param base WDOG peripheral base address - * @param timeoutCount WDOG timeout value; count of WDOG clock tick. - */ -static inline void WDOG_SetTimeoutValue(WDOG_Type *base, uint16_t timeoutCount) -{ - base->WCR = (base->WCR & (uint16_t)~WDOG_WCR_WT_MASK) | WDOG_WCR_WT(timeoutCount); -} - -/*! - * @brief Sets the WDOG interrupt count timeout value. - * - * This function sets the interrupt count timeout value. - * This function writes a value into WIC registers which are wirte-once. - * This field is write once only. Once the software does a write access to this field, it will get locked - * and cannot be reprogrammed until the next system reset assertion. - * @param base WDOG peripheral base address - * @param timeoutCount WDOG timeout value; count of WDOG clock tick. - */ -static inline void WDOG_SetInterrputTimeoutValue(WDOG_Type *base, uint16_t timeoutCount) -{ - base->WICR = (base->WICR & ~(uint16_t)WDOG_WICR_WICT_MASK) | WDOG_WICR_WICT(timeoutCount); -} - -/*! - * @brief Disable the WDOG power down enable bit. - * - * This function disable the WDOG power down enable(PDE). - * This function writes a value into WMCR registers which are wirte-once. - * This field is write once only. Once software sets this bit it cannot be reset until the next system reset. - * @param base WDOG peripheral base address - */ -static inline void WDOG_DisablePowerDownEnable(WDOG_Type *base) -{ - base->WMCR &= ~(uint16_t)WDOG_WMCR_PDE_MASK; -} - -/*! - * @brief Refreshes the WDOG timer. - * - * This function feeds the WDOG. - * This function should be called before the WDOG timer is in timeout. Otherwise, a reset is asserted. - * - * @param base WDOG peripheral base address - */ -void WDOG_Refresh(WDOG_Type *base); -/*@}*/ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -#endif /* _FSL_WDOG_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_xbara.c b/devices/MIMXRT1052/drivers/fsl_xbara.c deleted file mode 100644 index cc6307b..0000000 --- a/devices/MIMXRT1052/drivers/fsl_xbara.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_xbara.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.xbara" -#endif - -/* Macros for entire XBARA_CTRL register. */ -#define XBARA_CTRLx(base, index) (((volatile uint16_t *)(&((base)->CTRL0)))[(index)]) - -typedef union -{ - uint8_t _u8[2]; - uint16_t _u16; -} xbara_u8_u16_t; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get the XBARA instance from peripheral base address. - * - * @param base XBARA peripheral base address. - * @return XBARA instance. - */ -static uint32_t XBARA_GetInstance(XBARA_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* Array of XBARA peripheral base address. */ -static XBARA_Type *const s_xbaraBases[] = XBARA_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of XBARA clock name. */ -static const clock_ip_name_t s_xbaraClock[] = XBARA_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t XBARA_GetInstance(XBARA_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_xbaraBases); instance++) - { - if (s_xbaraBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_xbaraBases)); - - return instance; -} - -/*! - * brief Initializes the XBARA module. - * - * This function un-gates the XBARA clock. - * - * param base XBARA peripheral address. - */ -void XBARA_Init(XBARA_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable XBARA module clock. */ - CLOCK_EnableClock(s_xbaraClock[XBARA_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Shuts down the XBARA module. - * - * This function disables XBARA clock. - * - * param base XBARA peripheral address. - */ -void XBARA_Deinit(XBARA_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable XBARA module clock. */ - CLOCK_DisableClock(s_xbaraClock[XBARA_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Sets a connection between the selected XBARA_IN[*] input and the XBARA_OUT[*] output signal. - * - * This function connects the XBARA input to the selected XBARA output. - * If more than one XBARA module is available, only the inputs and outputs from the same module - * can be connected. - * - * Example: - code - XBARA_SetSignalsConnection(XBARA, kXBARA_InputPIT_TRG0, kXBARA_OutputDMAMUX18); - endcode - * - * param base XBARA peripheral address. - * param input XBARA input signal. - * param output XBARA output signal. - */ -void XBARA_SetSignalsConnection(XBARA_Type *base, xbar_input_signal_t input, xbar_output_signal_t output) -{ - xbara_u8_u16_t regVal; - uint8_t byteInReg; - uint8_t outputIndex = (uint8_t)output; - - byteInReg = outputIndex % 2U; - - regVal._u16 = XBARA_SELx(base, outputIndex); - - regVal._u8[byteInReg] = (uint8_t)input; - - XBARA_SELx(base, outputIndex) = regVal._u16; -} - -/*! - * brief Gets the active edge detection status. - * - * This function gets the active edge detect status of all XBARA_OUTs. If the - * active edge occurs, the return value is asserted. When the interrupt or the DMA - * functionality is enabled for the XBARA_OUTx, this field is 1 when the interrupt - * or DMA request is asserted and 0 when the interrupt or DMA request has been - * cleared. - * - * param base XBARA peripheral address. - * return the mask of these status flag bits. - */ -uint32_t XBARA_GetStatusFlags(XBARA_Type *base) -{ - uint32_t status_flag; - - status_flag = ((uint32_t)base->CTRL0 & (XBARA_CTRL0_STS0_MASK | XBARA_CTRL0_STS1_MASK)); - - status_flag |= (((uint32_t)base->CTRL1 & (XBARA_CTRL1_STS2_MASK | XBARA_CTRL1_STS3_MASK)) << 16U); - - return status_flag; -} - -/*! - * brief Clears the edge detection status flags of relative mask. - * - * param base XBARA peripheral address. - * param mask the status flags to clear. - */ -void XBARA_ClearStatusFlags(XBARA_Type *base, uint32_t mask) -{ - uint16_t regVal; - - /* Assign regVal to CTRL0 register's value */ - regVal = (base->CTRL0); - /* Perform this command to avoid writing 1 into interrupt flag bits */ - regVal &= (uint16_t)(~(XBARA_CTRL0_STS0_MASK | XBARA_CTRL0_STS1_MASK)); - /* Write 1 to interrupt flag bits corresponding to mask */ - regVal |= (uint16_t)(mask & (XBARA_CTRL0_STS0_MASK | XBARA_CTRL0_STS1_MASK)); - /* Write regVal value into CTRL0 register */ - base->CTRL0 = regVal; - - /* Assign regVal to CTRL1 register's value */ - regVal = (base->CTRL1); - /* Perform this command to avoid writing 1 into interrupt flag bits */ - regVal &= (uint16_t)(~(XBARA_CTRL1_STS2_MASK | XBARA_CTRL1_STS3_MASK)); - /* Write 1 to interrupt flag bits corresponding to mask */ - regVal |= (uint16_t)((mask >> 16U) & (XBARA_CTRL1_STS2_MASK | XBARA_CTRL1_STS3_MASK)); - /* Write regVal value into CTRL1 register */ - base->CTRL1 = regVal; -} - -/*! - * brief Configures the XBARA control register. - * - * This function configures an XBARA control register. The active edge detection - * and the DMA/IRQ function on the corresponding XBARA output can be set. - * - * Example: - code - xbara_control_config_t userConfig; - userConfig.activeEdge = kXBARA_EdgeRising; - userConfig.requestType = kXBARA_RequestInterruptEnalbe; - XBARA_SetOutputSignalConfig(XBARA, kXBARA_OutputDMAMUX18, &userConfig); - endcode - * - * param base XBARA peripheral address. - * param output XBARA output number. - * param controlConfig Pointer to structure that keeps configuration of control register. - */ -void XBARA_SetOutputSignalConfig(XBARA_Type *base, - xbar_output_signal_t output, - const xbara_control_config_t *controlConfig) -{ - uint8_t outputIndex = (uint8_t)output; - uint8_t regIndex; - uint8_t byteInReg; - xbara_u8_u16_t regVal; - - assert(outputIndex < (uint32_t)FSL_FEATURE_XBARA_INTERRUPT_COUNT); - - regIndex = outputIndex / 2U; - byteInReg = outputIndex % 2U; - - regVal._u16 = XBARA_CTRLx(base, regIndex); - - /* Don't clear the status flags. */ - regVal._u16 &= (uint16_t)(~(XBARA_CTRL0_STS0_MASK | XBARA_CTRL0_STS1_MASK)); - - regVal._u8[byteInReg] = (uint8_t)(XBARA_CTRL0_EDGE0(controlConfig->activeEdge) | - (uint16_t)(((uint32_t)controlConfig->requestType) << XBARA_CTRL0_DEN0_SHIFT)); - - XBARA_CTRLx(base, regIndex) = regVal._u16; -} diff --git a/devices/MIMXRT1052/drivers/fsl_xbara.h b/devices/MIMXRT1052/drivers/fsl_xbara.h deleted file mode 100644 index 1aeb4fc..0000000 --- a/devices/MIMXRT1052/drivers/fsl_xbara.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_XBARA_H_ -#define _FSL_XBARA_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup xbara - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -#define FSL_XBARA_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) - -/* Macros for entire XBARA_SELx register. */ -#define XBARA_SELx(base, output) (((volatile uint16_t *)(&((base)->SEL0)))[(uint32_t)(output) / 2UL]) - -/* Set the XBARA_SELx_SELx field to a new value. */ -#define XBARA_WR_SELx_SELx(base, input, output) XBARA_SetSignalsConnection((base), (input), (output)) - -/*! - * @brief XBARA active edge for detection - */ -typedef enum _xbara_active_edge -{ - kXBARA_EdgeNone = 0U, /*!< Edge detection status bit never asserts. */ - kXBARA_EdgeRising = 1U, /*!< Edge detection status bit asserts on rising edges. */ - kXBARA_EdgeFalling = 2U, /*!< Edge detection status bit asserts on falling edges. */ - kXBARA_EdgeRisingAndFalling = 3U /*!< Edge detection status bit asserts on rising and falling edges. */ -} xbara_active_edge_t; - -/*! - * @brief Defines the XBARA DMA and interrupt configurations. - */ -typedef enum _xbar_request -{ - kXBARA_RequestDisable = 0U, /*!< Interrupt and DMA are disabled. */ - kXBARA_RequestDMAEnable = 1U, /*!< DMA enabled, interrupt disabled. */ - kXBARA_RequestInterruptEnalbe = 2U /*!< Interrupt enabled, DMA disabled. */ -} xbara_request_t; - -/*! - * @brief XBARA status flags. - * - * This provides constants for the XBARA status flags for use in the XBARA functions. - */ -typedef enum _xbara_status_flag_t -{ - kXBARA_EdgeDetectionOut0 = - (XBARA_CTRL0_STS0_MASK), /*!< XBAR_OUT0 active edge interrupt flag, sets when active edge detected. */ - kXBARA_EdgeDetectionOut1 = - (XBARA_CTRL0_STS1_MASK), /*!< XBAR_OUT1 active edge interrupt flag, sets when active edge detected. */ - kXBARA_EdgeDetectionOut2 = - (XBARA_CTRL1_STS2_MASK << 16U), /*!< XBAR_OUT2 active edge interrupt flag, sets when active edge detected. */ - kXBARA_EdgeDetectionOut3 = - (XBARA_CTRL1_STS3_MASK << 16U), /*!< XBAR_OUT3 active edge interrupt flag, sets when active edge detected. */ -} xbara_status_flag_t; - -/*! - * @brief Defines the configuration structure of the XBARA control register. - * - * This structure keeps the configuration of XBARA control register for one output. - * Control registers are available only for a few outputs. Not every XBARA module has - * control registers. - */ -typedef struct XBARAControlConfig -{ - xbara_active_edge_t activeEdge; /*!< Active edge to be detected. */ - xbara_request_t requestType; /*!< Selects DMA/Interrupt request. */ -} xbara_control_config_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name XBARA functional Operation. - * @{ - */ - -/*! - * @brief Initializes the XBARA module. - * - * This function un-gates the XBARA clock. - * - * @param base XBARA peripheral address. - */ -void XBARA_Init(XBARA_Type *base); - -/*! - * @brief Shuts down the XBARA module. - * - * This function disables XBARA clock. - * - * @param base XBARA peripheral address. - */ -void XBARA_Deinit(XBARA_Type *base); - -/*! - * @brief Sets a connection between the selected XBARA_IN[*] input and the XBARA_OUT[*] output signal. - * - * This function connects the XBARA input to the selected XBARA output. - * If more than one XBARA module is available, only the inputs and outputs from the same module - * can be connected. - * - * Example: - @code - XBARA_SetSignalsConnection(XBARA, kXBARA_InputPIT_TRG0, kXBARA_OutputDMAMUX18); - @endcode - * - * @param base XBARA peripheral address. - * @param input XBARA input signal. - * @param output XBARA output signal. - */ -void XBARA_SetSignalsConnection(XBARA_Type *base, xbar_input_signal_t input, xbar_output_signal_t output); - -/*! - * @brief Gets the active edge detection status. - * - * This function gets the active edge detect status of all XBARA_OUTs. If the - * active edge occurs, the return value is asserted. When the interrupt or the DMA - * functionality is enabled for the XBARA_OUTx, this field is 1 when the interrupt - * or DMA request is asserted and 0 when the interrupt or DMA request has been - * cleared. - * - * @param base XBARA peripheral address. - * @return the mask of these status flag bits. - */ -uint32_t XBARA_GetStatusFlags(XBARA_Type *base); - -/*! - * @brief Clears the edge detection status flags of relative mask. - * - * @param base XBARA peripheral address. - * @param mask the status flags to clear. - */ -void XBARA_ClearStatusFlags(XBARA_Type *base, uint32_t mask); - -/*! - * @brief Configures the XBARA control register. - * - * This function configures an XBARA control register. The active edge detection - * and the DMA/IRQ function on the corresponding XBARA output can be set. - * - * Example: - @code - xbara_control_config_t userConfig; - userConfig.activeEdge = kXBARA_EdgeRising; - userConfig.requestType = kXBARA_RequestInterruptEnalbe; - XBARA_SetOutputSignalConfig(XBARA, kXBARA_OutputDMAMUX18, &userConfig); - @endcode - * - * @param base XBARA peripheral address. - * @param output XBARA output number. - * @param controlConfig Pointer to structure that keeps configuration of control register. - */ -void XBARA_SetOutputSignalConfig(XBARA_Type *base, - xbar_output_signal_t output, - const xbara_control_config_t *controlConfig); - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -/*!* @} */ - -#endif /* _FSL_XBARA_H_ */ diff --git a/devices/MIMXRT1052/drivers/fsl_xbarb.c b/devices/MIMXRT1052/drivers/fsl_xbarb.c deleted file mode 100644 index c1878a2..0000000 --- a/devices/MIMXRT1052/drivers/fsl_xbarb.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_xbarb.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.xbarb" -#endif - -typedef union -{ - uint8_t _u8[2]; - uint16_t _u16; -} xbarb_u8_u16_t; - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/*! - * @brief Get the XBARB instance from peripheral base address. - * - * @param base XBARB peripheral base address. - * @return XBARB instance. - */ -static uint32_t XBARB_GetInstance(XBARB_Type *base); - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/* Array of XBARB peripheral base address. */ -static XBARB_Type *const s_xbarbBases[] = XBARB_BASE_PTRS; - -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) -/* Array of XBARB clock name. */ -static const clock_ip_name_t s_xbarbClock[] = XBARB_CLOCKS; -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ - -/******************************************************************************* - * Code - ******************************************************************************/ - -static uint32_t XBARB_GetInstance(XBARB_Type *base) -{ - uint32_t instance; - - /* Find the instance index from base address mappings. */ - for (instance = 0; instance < ARRAY_SIZE(s_xbarbBases); instance++) - { - if (s_xbarbBases[instance] == base) - { - break; - } - } - - assert(instance < ARRAY_SIZE(s_xbarbBases)); - - return instance; -} - -/*! - * brief Initializes the XBARB module. - * - * This function un-gates the XBARB clock. - * - * param base XBARB peripheral address. - */ -void XBARB_Init(XBARB_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Enable XBARB module clock. */ - CLOCK_EnableClock(s_xbarbClock[XBARB_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Shuts down the XBARB module. - * - * This function disables XBARB clock. - * - * param base XBARB peripheral address. - */ -void XBARB_Deinit(XBARB_Type *base) -{ -#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) - /* Disable XBARB module clock. */ - CLOCK_DisableClock(s_xbarbClock[XBARB_GetInstance(base)]); -#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ -} - -/*! - * brief Configures a connection between the selected XBARB_IN[*] input and the XBARB_OUT[*] output signal. - * - * This function configures which XBARB input is connected to the selected XBARB output. - * If more than one XBARB module is available, only the inputs and outputs from the same module - * can be connected. - * - * param base XBARB peripheral address. - * param input XBARB input signal. - * param output XBARB output signal. - */ -void XBARB_SetSignalsConnection(XBARB_Type *base, xbar_input_signal_t input, xbar_output_signal_t output) -{ - xbarb_u8_u16_t regVal; - uint8_t byteInReg; - uint8_t outputIndex = (uint8_t)output; - - byteInReg = outputIndex % 2U; - - regVal._u16 = XBARB_SELx(base, outputIndex); - - regVal._u8[byteInReg] = (uint8_t)input; - - XBARB_SELx(base, outputIndex) = regVal._u16; -} diff --git a/devices/MIMXRT1052/drivers/fsl_xbarb.h b/devices/MIMXRT1052/drivers/fsl_xbarb.h deleted file mode 100644 index def13c3..0000000 --- a/devices/MIMXRT1052/drivers/fsl_xbarb.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2019 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_XBARB_H_ -#define _FSL_XBARB_H_ - -#include "fsl_common.h" - -/*! - * @addtogroup xbarb - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -#define FSL_XBARB_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) - -/* Macros for entire XBARB_SELx register. */ -#define XBARB_SELx(base, output) (((volatile uint16_t *)(&((base)->SEL0)))[(uint32_t)(output) / 2UL]) -/* Set the SELx field to a new value. */ -#define XBARB_WR_SELx_SELx(base, input, output) XBARB_SetSignalsConnection((base), (input), (output)) - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @name XBARB functional Operation. - * @{ - */ - -/*! - * @brief Initializes the XBARB module. - * - * This function un-gates the XBARB clock. - * - * @param base XBARB peripheral address. - */ -void XBARB_Init(XBARB_Type *base); - -/*! - * @brief Shuts down the XBARB module. - * - * This function disables XBARB clock. - * - * @param base XBARB peripheral address. - */ -void XBARB_Deinit(XBARB_Type *base); - -/*! - * @brief Configures a connection between the selected XBARB_IN[*] input and the XBARB_OUT[*] output signal. - * - * This function configures which XBARB input is connected to the selected XBARB output. - * If more than one XBARB module is available, only the inputs and outputs from the same module - * can be connected. - * - * @param base XBARB peripheral address. - * @param input XBARB input signal. - * @param output XBARB output signal. - */ -void XBARB_SetSignalsConnection(XBARB_Type *base, xbar_input_signal_t input, xbar_output_signal_t output); - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -/*!* @} */ - -#endif /* _FSL_XBARB_H_ */ diff --git a/devices/MIMXRT1052/fsl_device_registers.h b/devices/MIMXRT1052/fsl_device_registers.h deleted file mode 100644 index 54caf43..0000000 --- a/devices/MIMXRT1052/fsl_device_registers.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2014-2016 Freescale Semiconductor, Inc. - * Copyright 2016-2018 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#ifndef __FSL_DEVICE_REGISTERS_H__ -#define __FSL_DEVICE_REGISTERS_H__ - -/* - * Include the cpu specific register header files. - * - * The CPU macro should be declared in the project or makefile. - */ -#if (defined(CPU_MIMXRT1052CVJ5B) || defined(CPU_MIMXRT1052CVL5B) || defined(CPU_MIMXRT1052DVJ6B) || \ - defined(CPU_MIMXRT1052DVL6B)) - -#define MIMXRT1052_SERIES - -/* CMSIS-style register definitions */ -#include "MIMXRT1052.h" -/* CPU specific feature definitions */ -#include "MIMXRT1052_features.h" - -#else - #error "No valid CPU defined!" -#endif - -#endif /* __FSL_DEVICE_REGISTERS_H__ */ - -/******************************************************************************* - * EOF - ******************************************************************************/ diff --git a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld b/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld deleted file mode 100644 index 8159ff6..0000000 --- a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor.ld +++ /dev/null @@ -1,271 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compiler: GNU C Compiler -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.0, 2018-09-21 -** Build: b210227 -** -** Abstract: -** Linker file for the GNU C Compiler -** -** 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 -** -** ################################################################### -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; -STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; -VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x00000400 : 0; - -/* Specify the memory areas */ -MEMORY -{ - m_flash_config (RX) : ORIGIN = 0x60000000, LENGTH = 0x00001000 - m_ivt (RX) : ORIGIN = 0x60001000, LENGTH = 0x00001000 - m_interrupts (RX) : ORIGIN = 0x60002000, LENGTH = 0x00000400 - m_text (RX) : ORIGIN = 0x60002400, LENGTH = 0x03FFDC00 - m_qacode (RX) : ORIGIN = 0x00000000, LENGTH = 0x00020000 - m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 - m_data2 (RW) : ORIGIN = 0x20200000, LENGTH = 0x00040000 -} - -/* Define output sections */ -SECTIONS -{ - __NCACHE_REGION_START = ORIGIN(m_data2); - __NCACHE_REGION_SIZE = 0; - - .flash_config : - { - . = ALIGN(4); - __FLASH_BASE = .; - KEEP(* (.boot_hdr.conf)) /* flash config section */ - . = ALIGN(4); - } > m_flash_config - - ivt_begin = ORIGIN(m_flash_config) + LENGTH(m_flash_config); - - .ivt : AT(ivt_begin) - { - . = ALIGN(4); - KEEP(* (.boot_hdr.ivt)) /* ivt section */ - KEEP(* (.boot_hdr.boot_data)) /* boot section */ - KEEP(* (.boot_hdr.dcd_data)) /* dcd section */ - . = ALIGN(4); - } > m_ivt - - /* The startup code goes first into internal RAM */ - .interrupts : - { - __VECTOR_TABLE = .; - __Vectors = .; - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } > m_interrupts - - /* The program code and other data goes into internal RAM */ - .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 */ - - .interrupts_ram : - { - . = ALIGN(4); - __VECTOR_RAM__ = .; - __interrupts_ram_start__ = .; /* Create a global symbol at data start */ - *(.m_interrupts_ram) /* This is a user defined section */ - . += VECTOR_RAM_SIZE; - . = ALIGN(4); - __interrupts_ram_end__ = .; /* Define a global symbol at data end */ - } > m_data - - __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts); - __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0; - - .data : AT(__DATA_ROM) - { - . = ALIGN(4); - __DATA_RAM = .; - __data_start__ = .; /* create a global symbol at data start */ - *(m_usb_dma_init_data) - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; /* define a global symbol at data end */ - } > m_data - - __ram_function_flash_start = __DATA_ROM + (__data_end__ - __data_start__); /* Symbol is used by startup for TCM data initialization */ - - .ram_function : AT(__ram_function_flash_start) - { - . = ALIGN(32); - __ram_function_start__ = .; - *(CodeQuickAccess) - . = ALIGN(128); - __ram_function_end__ = .; - } > m_qacode - - __NDATA_ROM = __ram_function_flash_start + (__ram_function_end__ - __ram_function_start__); - .ncache.init : AT(__NDATA_ROM) - { - __noncachedata_start__ = .; /* create a global symbol at ncache data start */ - *(NonCacheable.init) - . = ALIGN(4); - __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */ - } > m_data - . = __noncachedata_init_end__; - .ncache : - { - *(NonCacheable) - . = ALIGN(4); - __noncachedata_end__ = .; /* define a global symbol at ncache data end */ - } > m_data - - __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_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__ = .; - *(m_usb_dma_noninit_data) - *(.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/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor_sdram.ld b/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor_sdram.ld deleted file mode 100644 index cce072b..0000000 --- a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_flexspi_nor_sdram.ld +++ /dev/null @@ -1,274 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compiler: GNU C Compiler -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.0, 2018-09-21 -** Build: b210227 -** -** Abstract: -** Linker file for the GNU C Compiler -** -** 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 -** -** ################################################################### -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x80000; -STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x10000; -VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x00000400 : 0; -NCACHE_HEAP_START = DEFINED(__heap_noncacheable__) ? 0x82000000 - HEAP_SIZE : 0x81E00000 - HEAP_SIZE; -NCACHE_HEAP_SIZE = DEFINED(__heap_noncacheable__) ? HEAP_SIZE : 0x0000; - -/* Specify the memory areas */ -MEMORY -{ - m_flash_config (RX) : ORIGIN = 0x60000000, LENGTH = 0x00001000 - m_ivt (RX) : ORIGIN = 0x60001000, LENGTH = 0x00001000 - m_interrupts (RX) : ORIGIN = 0x60002000, LENGTH = 0x00000400 - m_text (RX) : ORIGIN = 0x60002400, LENGTH = 0x03FFDC00 - m_qacode (RX) : ORIGIN = 0x00000000, LENGTH = 0x00020000 - m_data (RW) : ORIGIN = 0x80000000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x01E00000 : 0x01E00000 - HEAP_SIZE - m_ncache (RW) : ORIGIN = 0x81E00000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00200000 - HEAP_SIZE : 0x00200000 - m_data2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 - m_data3 (RW) : ORIGIN = 0x20200000, LENGTH = 0x00040000 - m_heap (RW) : ORIGIN = NCACHE_HEAP_START, LENGTH = HEAP_SIZE -} - -/* Define output sections */ -SECTIONS -{ - __NCACHE_REGION_START = ORIGIN(m_ncache); - __NCACHE_REGION_SIZE = LENGTH(m_ncache) + NCACHE_HEAP_SIZE; - - .flash_config : - { - . = ALIGN(4); - __FLASH_BASE = .; - KEEP(* (.boot_hdr.conf)) /* flash config section */ - . = ALIGN(4); - } > m_flash_config - - ivt_begin = ORIGIN(m_flash_config) + LENGTH(m_flash_config); - - .ivt : AT(ivt_begin) - { - . = ALIGN(4); - KEEP(* (.boot_hdr.ivt)) /* ivt section */ - KEEP(* (.boot_hdr.boot_data)) /* boot section */ - KEEP(* (.boot_hdr.dcd_data)) /* dcd section */ - . = ALIGN(4); - } > m_ivt - - /* The startup code goes first into internal RAM */ - .interrupts : - { - __VECTOR_TABLE = .; - __Vectors = .; - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } > m_interrupts - - /* The program code and other data goes into internal RAM */ - .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 */ - - .interrupts_ram : - { - . = ALIGN(4); - __VECTOR_RAM__ = .; - __interrupts_ram_start__ = .; /* Create a global symbol at data start */ - *(.m_interrupts_ram) /* This is a user defined section */ - . += VECTOR_RAM_SIZE; - . = ALIGN(4); - __interrupts_ram_end__ = .; /* Define a global symbol at data end */ - } > m_data - - __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts); - __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0; - - .data : AT(__DATA_ROM) - { - . = ALIGN(4); - __DATA_RAM = .; - __data_start__ = .; /* create a global symbol at data start */ - *(m_usb_dma_init_data) - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; /* define a global symbol at data end */ - } > m_data - - __ram_function_flash_start = __DATA_ROM + (__data_end__ - __data_start__); /* Symbol is used by startup for TCM data initialization */ - - .ram_function : AT(__ram_function_flash_start) - { - . = ALIGN(32); - __ram_function_start__ = .; - *(CodeQuickAccess) - . = ALIGN(128); - __ram_function_end__ = .; - } > m_qacode - - __NDATA_ROM = __ram_function_flash_start + (__ram_function_end__ - __ram_function_start__); - .ncache.init : AT(__NDATA_ROM) - { - __noncachedata_start__ = .; /* create a global symbol at ncache data start */ - *(NonCacheable.init) - . = ALIGN(4); - __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */ - } > m_ncache - . = __noncachedata_init_end__; - .ncache : - { - *(NonCacheable) - . = ALIGN(4); - __noncachedata_end__ = .; /* define a global symbol at ncache data end */ - } > m_ncache - - __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_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__ = .; - *(m_usb_dma_noninit_data) - *(.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_heap - - .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) } -} - diff --git a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld b/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld deleted file mode 100644 index 27f74e4..0000000 --- a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld +++ /dev/null @@ -1,225 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compiler: GNU C Compiler -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.0, 2018-09-21 -** Build: b210227 -** -** Abstract: -** Linker file for the GNU C Compiler -** -** 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 -** -** ################################################################### -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; -STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; - -/* Specify the memory areas */ -MEMORY -{ - m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400 - m_text (RX) : ORIGIN = 0x00000400, LENGTH = 0x0001FC00 - m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 - m_data2 (RW) : ORIGIN = 0x20200000, LENGTH = 0x00040000 -} - -/* Define output sections */ -SECTIONS -{ - __NCACHE_REGION_START = ORIGIN(m_data2); - __NCACHE_REGION_SIZE = 0; - - /* The startup code goes first into internal RAM */ - .interrupts : - { - __VECTOR_TABLE = .; - __Vectors = .; - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } > m_interrupts - - /* The program code and other data goes into internal RAM */ - .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 */ - - __VECTOR_RAM = ORIGIN(m_interrupts); - __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; - - .data : AT(__DATA_ROM) - { - . = ALIGN(4); - __DATA_RAM = .; - __data_start__ = .; /* create a global symbol at data start */ - *(m_usb_dma_init_data) - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; /* define a global symbol at data end */ - } > m_data - __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__); - .ncache.init : AT(__NDATA_ROM) - { - __noncachedata_start__ = .; /* create a global symbol at ncache data start */ - *(NonCacheable.init) - . = ALIGN(4); - __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */ - } > m_data - . = __noncachedata_init_end__; - .ncache : - { - *(NonCacheable) - . = ALIGN(4); - __noncachedata_end__ = .; /* define a global symbol at ncache data end */ - } > m_data - - __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_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__ = .; - *(m_usb_dma_noninit_data) - *(.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/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld b/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld deleted file mode 100644 index dbb182f..0000000 --- a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram.ld +++ /dev/null @@ -1,228 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compiler: GNU C Compiler -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.0, 2018-09-21 -** Build: b210227 -** -** Abstract: -** Linker file for the GNU C Compiler -** -** 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 -** -** ################################################################### -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; -STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; -NCACHE_HEAP_START = DEFINED(__heap_noncacheable__) ? 0x82000000 - HEAP_SIZE : 0x81E00000 - HEAP_SIZE; -NCACHE_HEAP_SIZE = DEFINED(__heap_noncacheable__) ? HEAP_SIZE : 0x0000; - -/* Specify the memory areas */ -MEMORY -{ - m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400 - m_text (RX) : ORIGIN = 0x00000400, LENGTH = 0x0001FC00 - m_data (RW) : ORIGIN = 0x80000000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x01E00000 : 0x01E00000 - HEAP_SIZE - m_ncache (RW) : ORIGIN = 0x81E00000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00200000 - HEAP_SIZE : 0x00200000 - m_data2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 - m_data3 (RW) : ORIGIN = 0x20200000, LENGTH = 0x00040000 - m_heap (RW) : ORIGIN = NCACHE_HEAP_START, LENGTH = HEAP_SIZE -} - -/* Define output sections */ -SECTIONS -{ - __NCACHE_REGION_START = ORIGIN(m_ncache); - __NCACHE_REGION_SIZE = LENGTH(m_ncache) + NCACHE_HEAP_SIZE; - - /* The startup code goes first into internal RAM */ - .interrupts : - { - __VECTOR_TABLE = .; - __Vectors = .; - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } > m_interrupts - - /* The program code and other data goes into internal RAM */ - .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 */ - - __VECTOR_RAM = ORIGIN(m_interrupts); - __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; - - .data : AT(__DATA_ROM) - { - . = ALIGN(4); - __DATA_RAM = .; - __data_start__ = .; /* create a global symbol at data start */ - *(m_usb_dma_init_data) - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; /* define a global symbol at data end */ - } > m_data - __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__); - .ncache.init : AT(__NDATA_ROM) - { - __noncachedata_start__ = .; /* create a global symbol at ncache data start */ - *(NonCacheable.init) - . = ALIGN(4); - __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */ - } > m_ncache - . = __noncachedata_init_end__; - .ncache : - { - *(NonCacheable) - . = ALIGN(4); - __noncachedata_end__ = .; /* define a global symbol at ncache data end */ - } > m_ncache - - __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_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__ = .; - *(m_usb_dma_noninit_data) - *(.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_heap - - .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) } -} - diff --git a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram_txt.ld b/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram_txt.ld deleted file mode 100644 index 422a440..0000000 --- a/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_sdram_txt.ld +++ /dev/null @@ -1,241 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compiler: GNU C Compiler -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.0, 2018-09-21 -** Build: b210227 -** -** Abstract: -** Linker file for the GNU C Compiler -** -** 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 -** -** ################################################################### -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; -STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; -NCACHE_HEAP_START = DEFINED(__heap_noncacheable__) ? 0x82000000 - HEAP_SIZE : 0x20240000 - HEAP_SIZE; -NCACHE_HEAP_SIZE = DEFINED(__heap_noncacheable__) ? HEAP_SIZE : 0x0000; - -/* Specify the memory areas */ -MEMORY -{ - m_interrupts (RX) : ORIGIN = 0x80000000, LENGTH = 0x00000400 - m_text (RX) : ORIGIN = 0x80000400, LENGTH = 0x001FFC00 - m_qacode (RX) : ORIGIN = 0x00000000, LENGTH = 0x00020000 - m_data (RW) : ORIGIN = 0x20200000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00040000 : 0x00040000 - HEAP_SIZE - m_data2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 - m_data3 (RW) : ORIGIN = 0x80200000, LENGTH = 0x01C00000 - m_ncache (RW) : ORIGIN = 0x81E00000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00200000 - HEAP_SIZE : 0x00200000 - m_heap (RW) : ORIGIN = NCACHE_HEAP_START, LENGTH = HEAP_SIZE -} - -/* Define output sections */ -SECTIONS -{ - __NCACHE_REGION_START = ORIGIN(m_ncache); - __NCACHE_REGION_SIZE = LENGTH(m_ncache) + NCACHE_HEAP_SIZE; - - /* The startup code goes first into internal RAM */ - .interrupts : - { - __VECTOR_TABLE = .; - __Vectors = .; - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } > m_interrupts - - /* The program code and other data goes into internal RAM */ - .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 */ - - __VECTOR_RAM = ORIGIN(m_interrupts); - __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; - - .data : AT(__DATA_ROM) - { - . = ALIGN(4); - __DATA_RAM = .; - __data_start__ = .; /* create a global symbol at data start */ - *(m_usb_dma_init_data) - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; /* define a global symbol at data end */ - } > m_data - - __ram_function_flash_start = __DATA_ROM + (__data_end__ - __data_start__); /* Symbol is used by startup for TCM data initialization */ - - .ram_function : AT(__ram_function_flash_start) - { - . = ALIGN(32); - __ram_function_start__ = .; - *(CodeQuickAccess) - . = ALIGN(128); - __ram_function_end__ = .; - } > m_qacode - - __NDATA_ROM = __ram_function_flash_start + (__ram_function_end__ - __ram_function_start__); - .ncache.init : AT(__NDATA_ROM) - { - __noncachedata_start__ = .; /* create a global symbol at ncache data start */ - *(NonCacheable.init) - . = ALIGN(4); - __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */ - } > m_ncache - . = __noncachedata_init_end__; - .ncache : - { - *(NonCacheable) - . = ALIGN(4); - __noncachedata_end__ = .; /* define a global symbol at ncache data end */ - } > m_ncache - - __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_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__ = .; - *(m_usb_dma_noninit_data) - *(.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_heap - - .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) } -} - diff --git a/devices/MIMXRT1052/gcc/startup_MIMXRT1052.S b/devices/MIMXRT1052/gcc/startup_MIMXRT1052.S deleted file mode 100644 index 42279f1..0000000 --- a/devices/MIMXRT1052/gcc/startup_MIMXRT1052.S +++ /dev/null @@ -1,1077 +0,0 @@ -/* ------------------------------------------------------------------------- */ -/* @file: startup_MIMXRT1052.s */ -/* @purpose: CMSIS Cortex-M7 Core Device Startup File */ -/* MIMXRT1052 */ -/* @version: 1.3 */ -/* @date: 2019-4-29 */ -/* @build: b190919 */ -/* ------------------------------------------------------------------------- */ -/* */ -/* Copyright 1997-2016 Freescale Semiconductor, Inc. */ -/* Copyright 2016-2019 NXP */ -/* All rights reserved. */ -/* */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*****************************************************************************/ -/* Version: GCC for ARM Embedded Processors */ -/*****************************************************************************/ - .syntax unified - .arch armv7-m - - .section .isr_vector, "a" - .align 2 - .globl __isr_vector -__isr_vector: - .long __StackTop /* Top of Stack */ - .long Reset_Handler /* Reset Handler */ - .long NMI_Handler /* NMI Handler*/ - .long HardFault_Handler /* Hard Fault Handler*/ - .long MemManage_Handler /* MPU Fault Handler*/ - .long BusFault_Handler /* Bus Fault Handler*/ - .long UsageFault_Handler /* Usage Fault Handler*/ - .long 0 /* Reserved*/ - .long 0 /* Reserved*/ - .long 0 /* Reserved*/ - .long 0 /* Reserved*/ - .long SVC_Handler /* SVCall Handler*/ - .long DebugMon_Handler /* Debug Monitor Handler*/ - .long 0 /* Reserved*/ - .long PendSV_Handler /* PendSV Handler*/ - .long SysTick_Handler /* SysTick Handler*/ - - /* External Interrupts*/ - .long DMA0_DMA16_IRQHandler /* DMA channel 0/16 transfer complete*/ - .long DMA1_DMA17_IRQHandler /* DMA channel 1/17 transfer complete*/ - .long DMA2_DMA18_IRQHandler /* DMA channel 2/18 transfer complete*/ - .long DMA3_DMA19_IRQHandler /* DMA channel 3/19 transfer complete*/ - .long DMA4_DMA20_IRQHandler /* DMA channel 4/20 transfer complete*/ - .long DMA5_DMA21_IRQHandler /* DMA channel 5/21 transfer complete*/ - .long DMA6_DMA22_IRQHandler /* DMA channel 6/22 transfer complete*/ - .long DMA7_DMA23_IRQHandler /* DMA channel 7/23 transfer complete*/ - .long DMA8_DMA24_IRQHandler /* DMA channel 8/24 transfer complete*/ - .long DMA9_DMA25_IRQHandler /* DMA channel 9/25 transfer complete*/ - .long DMA10_DMA26_IRQHandler /* DMA channel 10/26 transfer complete*/ - .long DMA11_DMA27_IRQHandler /* DMA channel 11/27 transfer complete*/ - .long DMA12_DMA28_IRQHandler /* DMA channel 12/28 transfer complete*/ - .long DMA13_DMA29_IRQHandler /* DMA channel 13/29 transfer complete*/ - .long DMA14_DMA30_IRQHandler /* DMA channel 14/30 transfer complete*/ - .long DMA15_DMA31_IRQHandler /* DMA channel 15/31 transfer complete*/ - .long DMA_ERROR_IRQHandler /* DMA error interrupt channels 0-15 / 16-31*/ - .long CTI0_ERROR_IRQHandler /* CTI0_Error*/ - .long CTI1_ERROR_IRQHandler /* CTI1_Error*/ - .long CORE_IRQHandler /* CorePlatform exception IRQ*/ - .long LPUART1_IRQHandler /* LPUART1 TX interrupt and RX interrupt*/ - .long LPUART2_IRQHandler /* LPUART2 TX interrupt and RX interrupt*/ - .long LPUART3_IRQHandler /* LPUART3 TX interrupt and RX interrupt*/ - .long LPUART4_IRQHandler /* LPUART4 TX interrupt and RX interrupt*/ - .long LPUART5_IRQHandler /* LPUART5 TX interrupt and RX interrupt*/ - .long LPUART6_IRQHandler /* LPUART6 TX interrupt and RX interrupt*/ - .long LPUART7_IRQHandler /* LPUART7 TX interrupt and RX interrupt*/ - .long LPUART8_IRQHandler /* LPUART8 TX interrupt and RX interrupt*/ - .long LPI2C1_IRQHandler /* LPI2C1 interrupt*/ - .long LPI2C2_IRQHandler /* LPI2C2 interrupt*/ - .long LPI2C3_IRQHandler /* LPI2C3 interrupt*/ - .long LPI2C4_IRQHandler /* LPI2C4 interrupt*/ - .long LPSPI1_IRQHandler /* LPSPI1 single interrupt vector for all sources*/ - .long LPSPI2_IRQHandler /* LPSPI2 single interrupt vector for all sources*/ - .long LPSPI3_IRQHandler /* LPSPI3 single interrupt vector for all sources*/ - .long LPSPI4_IRQHandler /* LPSPI4 single interrupt vector for all sources*/ - .long CAN1_IRQHandler /* CAN1 interrupt*/ - .long CAN2_IRQHandler /* CAN2 interrupt*/ - .long FLEXRAM_IRQHandler /* FlexRAM address out of range Or access hit IRQ*/ - .long KPP_IRQHandler /* Keypad nterrupt*/ - .long TSC_DIG_IRQHandler /* TSC interrupt*/ - .long GPR_IRQ_IRQHandler /* GPR interrupt*/ - .long LCDIF_IRQHandler /* LCDIF interrupt*/ - .long CSI_IRQHandler /* CSI interrupt*/ - .long PXP_IRQHandler /* PXP interrupt*/ - .long WDOG2_IRQHandler /* WDOG2 interrupt*/ - .long SNVS_HP_WRAPPER_IRQHandler /* SRTC Consolidated Interrupt. Non TZ*/ - .long SNVS_HP_WRAPPER_TZ_IRQHandler /* SRTC Security Interrupt. TZ*/ - .long SNVS_LP_WRAPPER_IRQHandler /* ON-OFF button press shorter than 5 secs (pulse event)*/ - .long CSU_IRQHandler /* CSU interrupt*/ - .long DCP_IRQHandler /* DCP_IRQ interrupt*/ - .long DCP_VMI_IRQHandler /* DCP_VMI_IRQ interrupt*/ - .long Reserved68_IRQHandler /* Reserved interrupt*/ - .long TRNG_IRQHandler /* TRNG interrupt*/ - .long SJC_IRQHandler /* SJC interrupt*/ - .long BEE_IRQHandler /* BEE interrupt*/ - .long SAI1_IRQHandler /* SAI1 interrupt*/ - .long SAI2_IRQHandler /* SAI1 interrupt*/ - .long SAI3_RX_IRQHandler /* SAI3 interrupt*/ - .long SAI3_TX_IRQHandler /* SAI3 interrupt*/ - .long SPDIF_IRQHandler /* SPDIF interrupt*/ - .long PMU_EVENT_IRQHandler /* Brown-out event interrupt*/ - .long Reserved78_IRQHandler /* Reserved interrupt*/ - .long TEMP_LOW_HIGH_IRQHandler /* TempSensor low/high interrupt*/ - .long TEMP_PANIC_IRQHandler /* TempSensor panic interrupt*/ - .long USB_PHY1_IRQHandler /* USBPHY (UTMI0), Interrupt*/ - .long USB_PHY2_IRQHandler /* USBPHY (UTMI0), Interrupt*/ - .long ADC1_IRQHandler /* ADC1 interrupt*/ - .long ADC2_IRQHandler /* ADC2 interrupt*/ - .long DCDC_IRQHandler /* DCDC interrupt*/ - .long Reserved86_IRQHandler /* Reserved interrupt*/ - .long Reserved87_IRQHandler /* Reserved interrupt*/ - .long GPIO1_INT0_IRQHandler /* Active HIGH Interrupt from INT0 from GPIO*/ - .long GPIO1_INT1_IRQHandler /* Active HIGH Interrupt from INT1 from GPIO*/ - .long GPIO1_INT2_IRQHandler /* Active HIGH Interrupt from INT2 from GPIO*/ - .long GPIO1_INT3_IRQHandler /* Active HIGH Interrupt from INT3 from GPIO*/ - .long GPIO1_INT4_IRQHandler /* Active HIGH Interrupt from INT4 from GPIO*/ - .long GPIO1_INT5_IRQHandler /* Active HIGH Interrupt from INT5 from GPIO*/ - .long GPIO1_INT6_IRQHandler /* Active HIGH Interrupt from INT6 from GPIO*/ - .long GPIO1_INT7_IRQHandler /* Active HIGH Interrupt from INT7 from GPIO*/ - .long GPIO1_Combined_0_15_IRQHandler /* Combined interrupt indication for GPIO1 signal 0 throughout 15*/ - .long GPIO1_Combined_16_31_IRQHandler /* Combined interrupt indication for GPIO1 signal 16 throughout 31*/ - .long GPIO2_Combined_0_15_IRQHandler /* Combined interrupt indication for GPIO2 signal 0 throughout 15*/ - .long GPIO2_Combined_16_31_IRQHandler /* Combined interrupt indication for GPIO2 signal 16 throughout 31*/ - .long GPIO3_Combined_0_15_IRQHandler /* Combined interrupt indication for GPIO3 signal 0 throughout 15*/ - .long GPIO3_Combined_16_31_IRQHandler /* Combined interrupt indication for GPIO3 signal 16 throughout 31*/ - .long GPIO4_Combined_0_15_IRQHandler /* Combined interrupt indication for GPIO4 signal 0 throughout 15*/ - .long GPIO4_Combined_16_31_IRQHandler /* Combined interrupt indication for GPIO4 signal 16 throughout 31*/ - .long GPIO5_Combined_0_15_IRQHandler /* Combined interrupt indication for GPIO5 signal 0 throughout 15*/ - .long GPIO5_Combined_16_31_IRQHandler /* Combined interrupt indication for GPIO5 signal 16 throughout 31*/ - .long FLEXIO1_IRQHandler /* FLEXIO1 interrupt*/ - .long FLEXIO2_IRQHandler /* FLEXIO2 interrupt*/ - .long WDOG1_IRQHandler /* WDOG1 interrupt*/ - .long RTWDOG_IRQHandler /* RTWDOG interrupt*/ - .long EWM_IRQHandler /* EWM interrupt*/ - .long CCM_1_IRQHandler /* CCM IRQ1 interrupt*/ - .long CCM_2_IRQHandler /* CCM IRQ2 interrupt*/ - .long GPC_IRQHandler /* GPC interrupt*/ - .long SRC_IRQHandler /* SRC interrupt*/ - .long Reserved115_IRQHandler /* Reserved interrupt*/ - .long GPT1_IRQHandler /* GPT1 interrupt*/ - .long GPT2_IRQHandler /* GPT2 interrupt*/ - .long PWM1_0_IRQHandler /* PWM1 capture 0, compare 0, or reload 0 interrupt*/ - .long PWM1_1_IRQHandler /* PWM1 capture 1, compare 1, or reload 0 interrupt*/ - .long PWM1_2_IRQHandler /* PWM1 capture 2, compare 2, or reload 0 interrupt*/ - .long PWM1_3_IRQHandler /* PWM1 capture 3, compare 3, or reload 0 interrupt*/ - .long PWM1_FAULT_IRQHandler /* PWM1 fault or reload error interrupt*/ - .long Reserved123_IRQHandler /* Reserved interrupt*/ - .long FLEXSPI_IRQHandler /* FlexSPI0 interrupt*/ - .long SEMC_IRQHandler /* Reserved interrupt*/ - .long USDHC1_IRQHandler /* USDHC1 interrupt*/ - .long USDHC2_IRQHandler /* USDHC2 interrupt*/ - .long USB_OTG2_IRQHandler /* USBO2 USB OTG2*/ - .long USB_OTG1_IRQHandler /* USBO2 USB OTG1*/ - .long ENET_IRQHandler /* ENET interrupt*/ - .long ENET_1588_Timer_IRQHandler /* ENET_1588_Timer interrupt*/ - .long XBAR1_IRQ_0_1_IRQHandler /* XBAR1 interrupt*/ - .long XBAR1_IRQ_2_3_IRQHandler /* XBAR1 interrupt*/ - .long ADC_ETC_IRQ0_IRQHandler /* ADCETC IRQ0 interrupt*/ - .long ADC_ETC_IRQ1_IRQHandler /* ADCETC IRQ1 interrupt*/ - .long ADC_ETC_IRQ2_IRQHandler /* ADCETC IRQ2 interrupt*/ - .long ADC_ETC_ERROR_IRQ_IRQHandler /* ADCETC Error IRQ interrupt*/ - .long PIT_IRQHandler /* PIT interrupt*/ - .long ACMP1_IRQHandler /* ACMP interrupt*/ - .long ACMP2_IRQHandler /* ACMP interrupt*/ - .long ACMP3_IRQHandler /* ACMP interrupt*/ - .long ACMP4_IRQHandler /* ACMP interrupt*/ - .long Reserved143_IRQHandler /* Reserved interrupt*/ - .long Reserved144_IRQHandler /* Reserved interrupt*/ - .long ENC1_IRQHandler /* ENC1 interrupt*/ - .long ENC2_IRQHandler /* ENC2 interrupt*/ - .long ENC3_IRQHandler /* ENC3 interrupt*/ - .long ENC4_IRQHandler /* ENC4 interrupt*/ - .long TMR1_IRQHandler /* TMR1 interrupt*/ - .long TMR2_IRQHandler /* TMR2 interrupt*/ - .long TMR3_IRQHandler /* TMR3 interrupt*/ - .long TMR4_IRQHandler /* TMR4 interrupt*/ - .long PWM2_0_IRQHandler /* PWM2 capture 0, compare 0, or reload 0 interrupt*/ - .long PWM2_1_IRQHandler /* PWM2 capture 1, compare 1, or reload 0 interrupt*/ - .long PWM2_2_IRQHandler /* PWM2 capture 2, compare 2, or reload 0 interrupt*/ - .long PWM2_3_IRQHandler /* PWM2 capture 3, compare 3, or reload 0 interrupt*/ - .long PWM2_FAULT_IRQHandler /* PWM2 fault or reload error interrupt*/ - .long PWM3_0_IRQHandler /* PWM3 capture 0, compare 0, or reload 0 interrupt*/ - .long PWM3_1_IRQHandler /* PWM3 capture 1, compare 1, or reload 0 interrupt*/ - .long PWM3_2_IRQHandler /* PWM3 capture 2, compare 2, or reload 0 interrupt*/ - .long PWM3_3_IRQHandler /* PWM3 capture 3, compare 3, or reload 0 interrupt*/ - .long PWM3_FAULT_IRQHandler /* PWM3 fault or reload error interrupt*/ - .long PWM4_0_IRQHandler /* PWM4 capture 0, compare 0, or reload 0 interrupt*/ - .long PWM4_1_IRQHandler /* PWM4 capture 1, compare 1, or reload 0 interrupt*/ - .long PWM4_2_IRQHandler /* PWM4 capture 2, compare 2, or reload 0 interrupt*/ - .long PWM4_3_IRQHandler /* PWM4 capture 3, compare 3, or reload 0 interrupt*/ - .long PWM4_FAULT_IRQHandler /* PWM4 fault or reload error interrupt*/ - .long DefaultISR /* 168*/ - .long DefaultISR /* 169*/ - .long DefaultISR /* 170*/ - .long DefaultISR /* 171*/ - .long DefaultISR /* 172*/ - .long DefaultISR /* 173*/ - .long DefaultISR /* 174*/ - .long DefaultISR /* 175*/ - .long DefaultISR /* 176*/ - .long DefaultISR /* 177*/ - .long DefaultISR /* 178*/ - .long DefaultISR /* 179*/ - .long DefaultISR /* 180*/ - .long DefaultISR /* 181*/ - .long DefaultISR /* 182*/ - .long DefaultISR /* 183*/ - .long DefaultISR /* 184*/ - .long DefaultISR /* 185*/ - .long DefaultISR /* 186*/ - .long DefaultISR /* 187*/ - .long DefaultISR /* 188*/ - .long DefaultISR /* 189*/ - .long DefaultISR /* 190*/ - .long DefaultISR /* 191*/ - .long DefaultISR /* 192*/ - .long DefaultISR /* 193*/ - .long DefaultISR /* 194*/ - .long DefaultISR /* 195*/ - .long DefaultISR /* 196*/ - .long DefaultISR /* 197*/ - .long DefaultISR /* 198*/ - .long DefaultISR /* 199*/ - .long DefaultISR /* 200*/ - .long DefaultISR /* 201*/ - .long DefaultISR /* 202*/ - .long DefaultISR /* 203*/ - .long DefaultISR /* 204*/ - .long DefaultISR /* 205*/ - .long DefaultISR /* 206*/ - .long DefaultISR /* 207*/ - .long DefaultISR /* 208*/ - .long DefaultISR /* 209*/ - .long DefaultISR /* 210*/ - .long DefaultISR /* 211*/ - .long DefaultISR /* 212*/ - .long DefaultISR /* 213*/ - .long DefaultISR /* 214*/ - .long DefaultISR /* 215*/ - .long DefaultISR /* 216*/ - .long DefaultISR /* 217*/ - .long DefaultISR /* 218*/ - .long DefaultISR /* 219*/ - .long DefaultISR /* 220*/ - .long DefaultISR /* 221*/ - .long DefaultISR /* 222*/ - .long DefaultISR /* 223*/ - .long DefaultISR /* 224*/ - .long DefaultISR /* 225*/ - .long DefaultISR /* 226*/ - .long DefaultISR /* 227*/ - .long DefaultISR /* 228*/ - .long DefaultISR /* 229*/ - .long DefaultISR /* 230*/ - .long DefaultISR /* 231*/ - .long DefaultISR /* 232*/ - .long DefaultISR /* 233*/ - .long DefaultISR /* 234*/ - .long DefaultISR /* 235*/ - .long DefaultISR /* 236*/ - .long DefaultISR /* 237*/ - .long DefaultISR /* 238*/ - .long DefaultISR /* 239*/ - .long DefaultISR /* 240*/ - .long DefaultISR /* 241*/ - .long DefaultISR /* 242*/ - .long DefaultISR /* 243*/ - .long DefaultISR /* 244*/ - .long DefaultISR /* 245*/ - .long DefaultISR /* 246*/ - .long DefaultISR /* 247*/ - .long DefaultISR /* 248*/ - .long DefaultISR /* 249*/ - .long DefaultISR /* 250*/ - .long DefaultISR /* 251*/ - .long DefaultISR /* 252*/ - .long DefaultISR /* 253*/ - .long DefaultISR /* 254*/ - .long 0xFFFFFFFF /* Reserved for user TRIM value*/ - - .size __isr_vector, . - __isr_vector - - .text - .thumb - -/* Reset Handler */ - - .thumb_func - .align 2 - .globl Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - cpsid i /* Mask interrupts */ - .equ VTOR, 0xE000ED08 - ldr r0, =VTOR - ldr r1, =__isr_vector - str r1, [r0] - ldr r2, [r1] - msr msp, r2 -#ifndef __NO_SYSTEM_INIT - ldr r0,=SystemInit - blx r0 -#endif -/* Loop to copy data from read only memory to RAM. The ranges - * of copy from/to are specified by following symbols evaluated in - * linker script. - * __etext: End of code section, i.e., begin of data sections to copy from. - * __data_start__/__data_end__: RAM address range that data should be - * __noncachedata_start__/__noncachedata_end__ : none cachable region - * __ram_function_start__/__ram_function_end__ : ramfunction region - * copied to. Both must be aligned to 4 bytes boundary. */ - - ldr r1, =__etext - ldr r2, =__data_start__ - ldr r3, =__data_end__ - -#ifdef __PERFORMANCE_IMPLEMENTATION -/* Here are two copies of loop implementations. First one favors performance - * and the second one favors code size. Default uses the second one. - * Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */ - subs r3, r2 - ble .LC1 -.LC0: - subs r3, #4 - ldr r0, [r1, r3] - str r0, [r2, r3] - bgt .LC0 -.LC1: -#else /* code size implemenation */ -.LC0: - cmp r2, r3 - ittt lt - ldrlt r0, [r1], #4 - strlt r0, [r2], #4 - blt .LC0 -#endif -#ifdef __STARTUP_INITIALIZE_RAMFUNCTION - ldr r2, =__ram_function_start__ - ldr r3, =__ram_function_end__ -#ifdef __PERFORMANCE_IMPLEMENTATION -/* Here are two copies of loop implementations. First one favors performance - * and the second one favors code size. Default uses the second one. - * Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */ - subs r3, r2 - ble .LC_ramfunc_copy_end -.LC_ramfunc_copy_start: - subs r3, #4 - ldr r0, [r1, r3] - str r0, [r2, r3] - bgt .LC_ramfunc_copy_start -.LC_ramfunc_copy_end: -#else /* code size implemenation */ -.LC_ramfunc_copy_start: - cmp r2, r3 - ittt lt - ldrlt r0, [r1], #4 - strlt r0, [r2], #4 - blt .LC_ramfunc_copy_start -#endif -#endif /* __STARTUP_INITIALIZE_RAMFUNCTION */ -#ifdef __STARTUP_INITIALIZE_NONCACHEDATA - ldr r2, =__noncachedata_start__ - ldr r3, =__noncachedata_init_end__ -#ifdef __PERFORMANCE_IMPLEMENTATION -/* Here are two copies of loop implementations. First one favors performance - * and the second one favors code size. Default uses the second one. - * Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */ - subs r3, r2 - ble .LC3 -.LC2: - subs r3, #4 - ldr r0, [r1, r3] - str r0, [r2, r3] - bgt .LC2 -.LC3: -#else /* code size implemenation */ -.LC2: - cmp r2, r3 - ittt lt - ldrlt r0, [r1], #4 - strlt r0, [r2], #4 - blt .LC2 -#endif -/* zero inited ncache section initialization */ - ldr r3, =__noncachedata_end__ - movs r0,0 -.LC4: - cmp r2,r3 - itt lt - strlt r0,[r2],#4 - blt .LC4 -#endif /* __STARTUP_INITIALIZE_NONCACHEDATA */ - -#ifdef __STARTUP_CLEAR_BSS -/* This part of work usually is done in C library startup code. Otherwise, - * define this macro to enable it in this startup. - * - * Loop to zero out BSS section, which uses following symbols - * in linker script: - * __bss_start__: start of BSS section. Must align to 4 - * __bss_end__: end of BSS section. Must align to 4 - */ - ldr r1, =__bss_start__ - ldr r2, =__bss_end__ - - movs r0, 0 -.LC5: - cmp r1, r2 - itt lt - strlt r0, [r1], #4 - blt .LC5 -#endif /* __STARTUP_CLEAR_BSS */ - - cpsie i /* Unmask interrupts */ -#ifndef __START -#define __START _start -#endif -#ifndef __ATOLLIC__ - ldr r0,=__START - blx r0 -#else - ldr r0,=__libc_init_array - blx r0 - ldr r0,=main - bx r0 -#endif - .pool - .size Reset_Handler, . - Reset_Handler - - .align 1 - .thumb_func - .weak DefaultISR - .type DefaultISR, %function -DefaultISR: - b DefaultISR - .size DefaultISR, . - DefaultISR - - .align 1 - .thumb_func - .weak NMI_Handler - .type NMI_Handler, %function -NMI_Handler: - ldr r0,=NMI_Handler - bx r0 - .size NMI_Handler, . - NMI_Handler - - .align 1 - .thumb_func - .weak HardFault_Handler - .type HardFault_Handler, %function -HardFault_Handler: - ldr r0,=HardFault_Handler - bx r0 - .size HardFault_Handler, . - HardFault_Handler - - .align 1 - .thumb_func - .weak SVC_Handler - .type SVC_Handler, %function -SVC_Handler: - ldr r0,=SVC_Handler - bx r0 - .size SVC_Handler, . - SVC_Handler - - .align 1 - .thumb_func - .weak PendSV_Handler - .type PendSV_Handler, %function -PendSV_Handler: - ldr r0,=PendSV_Handler - bx r0 - .size PendSV_Handler, . - PendSV_Handler - - .align 1 - .thumb_func - .weak SysTick_Handler - .type SysTick_Handler, %function -SysTick_Handler: - ldr r0,=SysTick_Handler - bx r0 - .size SysTick_Handler, . - SysTick_Handler - - .align 1 - .thumb_func - .weak DMA0_DMA16_IRQHandler - .type DMA0_DMA16_IRQHandler, %function -DMA0_DMA16_IRQHandler: - ldr r0,=DMA0_DMA16_DriverIRQHandler - bx r0 - .size DMA0_DMA16_IRQHandler, . - DMA0_DMA16_IRQHandler - - .align 1 - .thumb_func - .weak DMA1_DMA17_IRQHandler - .type DMA1_DMA17_IRQHandler, %function -DMA1_DMA17_IRQHandler: - ldr r0,=DMA1_DMA17_DriverIRQHandler - bx r0 - .size DMA1_DMA17_IRQHandler, . - DMA1_DMA17_IRQHandler - - .align 1 - .thumb_func - .weak DMA2_DMA18_IRQHandler - .type DMA2_DMA18_IRQHandler, %function -DMA2_DMA18_IRQHandler: - ldr r0,=DMA2_DMA18_DriverIRQHandler - bx r0 - .size DMA2_DMA18_IRQHandler, . - DMA2_DMA18_IRQHandler - - .align 1 - .thumb_func - .weak DMA3_DMA19_IRQHandler - .type DMA3_DMA19_IRQHandler, %function -DMA3_DMA19_IRQHandler: - ldr r0,=DMA3_DMA19_DriverIRQHandler - bx r0 - .size DMA3_DMA19_IRQHandler, . - DMA3_DMA19_IRQHandler - - .align 1 - .thumb_func - .weak DMA4_DMA20_IRQHandler - .type DMA4_DMA20_IRQHandler, %function -DMA4_DMA20_IRQHandler: - ldr r0,=DMA4_DMA20_DriverIRQHandler - bx r0 - .size DMA4_DMA20_IRQHandler, . - DMA4_DMA20_IRQHandler - - .align 1 - .thumb_func - .weak DMA5_DMA21_IRQHandler - .type DMA5_DMA21_IRQHandler, %function -DMA5_DMA21_IRQHandler: - ldr r0,=DMA5_DMA21_DriverIRQHandler - bx r0 - .size DMA5_DMA21_IRQHandler, . - DMA5_DMA21_IRQHandler - - .align 1 - .thumb_func - .weak DMA6_DMA22_IRQHandler - .type DMA6_DMA22_IRQHandler, %function -DMA6_DMA22_IRQHandler: - ldr r0,=DMA6_DMA22_DriverIRQHandler - bx r0 - .size DMA6_DMA22_IRQHandler, . - DMA6_DMA22_IRQHandler - - .align 1 - .thumb_func - .weak DMA7_DMA23_IRQHandler - .type DMA7_DMA23_IRQHandler, %function -DMA7_DMA23_IRQHandler: - ldr r0,=DMA7_DMA23_DriverIRQHandler - bx r0 - .size DMA7_DMA23_IRQHandler, . - DMA7_DMA23_IRQHandler - - .align 1 - .thumb_func - .weak DMA8_DMA24_IRQHandler - .type DMA8_DMA24_IRQHandler, %function -DMA8_DMA24_IRQHandler: - ldr r0,=DMA8_DMA24_DriverIRQHandler - bx r0 - .size DMA8_DMA24_IRQHandler, . - DMA8_DMA24_IRQHandler - - .align 1 - .thumb_func - .weak DMA9_DMA25_IRQHandler - .type DMA9_DMA25_IRQHandler, %function -DMA9_DMA25_IRQHandler: - ldr r0,=DMA9_DMA25_DriverIRQHandler - bx r0 - .size DMA9_DMA25_IRQHandler, . - DMA9_DMA25_IRQHandler - - .align 1 - .thumb_func - .weak DMA10_DMA26_IRQHandler - .type DMA10_DMA26_IRQHandler, %function -DMA10_DMA26_IRQHandler: - ldr r0,=DMA10_DMA26_DriverIRQHandler - bx r0 - .size DMA10_DMA26_IRQHandler, . - DMA10_DMA26_IRQHandler - - .align 1 - .thumb_func - .weak DMA11_DMA27_IRQHandler - .type DMA11_DMA27_IRQHandler, %function -DMA11_DMA27_IRQHandler: - ldr r0,=DMA11_DMA27_DriverIRQHandler - bx r0 - .size DMA11_DMA27_IRQHandler, . - DMA11_DMA27_IRQHandler - - .align 1 - .thumb_func - .weak DMA12_DMA28_IRQHandler - .type DMA12_DMA28_IRQHandler, %function -DMA12_DMA28_IRQHandler: - ldr r0,=DMA12_DMA28_DriverIRQHandler - bx r0 - .size DMA12_DMA28_IRQHandler, . - DMA12_DMA28_IRQHandler - - .align 1 - .thumb_func - .weak DMA13_DMA29_IRQHandler - .type DMA13_DMA29_IRQHandler, %function -DMA13_DMA29_IRQHandler: - ldr r0,=DMA13_DMA29_DriverIRQHandler - bx r0 - .size DMA13_DMA29_IRQHandler, . - DMA13_DMA29_IRQHandler - - .align 1 - .thumb_func - .weak DMA14_DMA30_IRQHandler - .type DMA14_DMA30_IRQHandler, %function -DMA14_DMA30_IRQHandler: - ldr r0,=DMA14_DMA30_DriverIRQHandler - bx r0 - .size DMA14_DMA30_IRQHandler, . - DMA14_DMA30_IRQHandler - - .align 1 - .thumb_func - .weak DMA15_DMA31_IRQHandler - .type DMA15_DMA31_IRQHandler, %function -DMA15_DMA31_IRQHandler: - ldr r0,=DMA15_DMA31_DriverIRQHandler - bx r0 - .size DMA15_DMA31_IRQHandler, . - DMA15_DMA31_IRQHandler - - .align 1 - .thumb_func - .weak DMA_ERROR_IRQHandler - .type DMA_ERROR_IRQHandler, %function -DMA_ERROR_IRQHandler: - ldr r0,=DMA_ERROR_DriverIRQHandler - bx r0 - .size DMA_ERROR_IRQHandler, . - DMA_ERROR_IRQHandler - - .align 1 - .thumb_func - .weak LPUART1_IRQHandler - .type LPUART1_IRQHandler, %function -LPUART1_IRQHandler: - ldr r0,=LPUART1_DriverIRQHandler - bx r0 - .size LPUART1_IRQHandler, . - LPUART1_IRQHandler - - .align 1 - .thumb_func - .weak LPUART2_IRQHandler - .type LPUART2_IRQHandler, %function -LPUART2_IRQHandler: - ldr r0,=LPUART2_DriverIRQHandler - bx r0 - .size LPUART2_IRQHandler, . - LPUART2_IRQHandler - - .align 1 - .thumb_func - .weak LPUART3_IRQHandler - .type LPUART3_IRQHandler, %function -LPUART3_IRQHandler: - ldr r0,=LPUART3_DriverIRQHandler - bx r0 - .size LPUART3_IRQHandler, . - LPUART3_IRQHandler - - .align 1 - .thumb_func - .weak LPUART4_IRQHandler - .type LPUART4_IRQHandler, %function -LPUART4_IRQHandler: - ldr r0,=LPUART4_DriverIRQHandler - bx r0 - .size LPUART4_IRQHandler, . - LPUART4_IRQHandler - - .align 1 - .thumb_func - .weak LPUART5_IRQHandler - .type LPUART5_IRQHandler, %function -LPUART5_IRQHandler: - ldr r0,=LPUART5_DriverIRQHandler - bx r0 - .size LPUART5_IRQHandler, . - LPUART5_IRQHandler - - .align 1 - .thumb_func - .weak LPUART6_IRQHandler - .type LPUART6_IRQHandler, %function -LPUART6_IRQHandler: - ldr r0,=LPUART6_DriverIRQHandler - bx r0 - .size LPUART6_IRQHandler, . - LPUART6_IRQHandler - - .align 1 - .thumb_func - .weak LPUART7_IRQHandler - .type LPUART7_IRQHandler, %function -LPUART7_IRQHandler: - ldr r0,=LPUART7_DriverIRQHandler - bx r0 - .size LPUART7_IRQHandler, . - LPUART7_IRQHandler - - .align 1 - .thumb_func - .weak LPUART8_IRQHandler - .type LPUART8_IRQHandler, %function -LPUART8_IRQHandler: - ldr r0,=LPUART8_DriverIRQHandler - bx r0 - .size LPUART8_IRQHandler, . - LPUART8_IRQHandler - - .align 1 - .thumb_func - .weak LPI2C1_IRQHandler - .type LPI2C1_IRQHandler, %function -LPI2C1_IRQHandler: - ldr r0,=LPI2C1_DriverIRQHandler - bx r0 - .size LPI2C1_IRQHandler, . - LPI2C1_IRQHandler - - .align 1 - .thumb_func - .weak LPI2C2_IRQHandler - .type LPI2C2_IRQHandler, %function -LPI2C2_IRQHandler: - ldr r0,=LPI2C2_DriverIRQHandler - bx r0 - .size LPI2C2_IRQHandler, . - LPI2C2_IRQHandler - - .align 1 - .thumb_func - .weak LPI2C3_IRQHandler - .type LPI2C3_IRQHandler, %function -LPI2C3_IRQHandler: - ldr r0,=LPI2C3_DriverIRQHandler - bx r0 - .size LPI2C3_IRQHandler, . - LPI2C3_IRQHandler - - .align 1 - .thumb_func - .weak LPI2C4_IRQHandler - .type LPI2C4_IRQHandler, %function -LPI2C4_IRQHandler: - ldr r0,=LPI2C4_DriverIRQHandler - bx r0 - .size LPI2C4_IRQHandler, . - LPI2C4_IRQHandler - - .align 1 - .thumb_func - .weak LPSPI1_IRQHandler - .type LPSPI1_IRQHandler, %function -LPSPI1_IRQHandler: - ldr r0,=LPSPI1_DriverIRQHandler - bx r0 - .size LPSPI1_IRQHandler, . - LPSPI1_IRQHandler - - .align 1 - .thumb_func - .weak LPSPI2_IRQHandler - .type LPSPI2_IRQHandler, %function -LPSPI2_IRQHandler: - ldr r0,=LPSPI2_DriverIRQHandler - bx r0 - .size LPSPI2_IRQHandler, . - LPSPI2_IRQHandler - - .align 1 - .thumb_func - .weak LPSPI3_IRQHandler - .type LPSPI3_IRQHandler, %function -LPSPI3_IRQHandler: - ldr r0,=LPSPI3_DriverIRQHandler - bx r0 - .size LPSPI3_IRQHandler, . - LPSPI3_IRQHandler - - .align 1 - .thumb_func - .weak LPSPI4_IRQHandler - .type LPSPI4_IRQHandler, %function -LPSPI4_IRQHandler: - ldr r0,=LPSPI4_DriverIRQHandler - bx r0 - .size LPSPI4_IRQHandler, . - LPSPI4_IRQHandler - - .align 1 - .thumb_func - .weak CAN1_IRQHandler - .type CAN1_IRQHandler, %function -CAN1_IRQHandler: - ldr r0,=CAN1_DriverIRQHandler - bx r0 - .size CAN1_IRQHandler, . - CAN1_IRQHandler - - .align 1 - .thumb_func - .weak CAN2_IRQHandler - .type CAN2_IRQHandler, %function -CAN2_IRQHandler: - ldr r0,=CAN2_DriverIRQHandler - bx r0 - .size CAN2_IRQHandler, . - CAN2_IRQHandler - - .align 1 - .thumb_func - .weak SAI1_IRQHandler - .type SAI1_IRQHandler, %function -SAI1_IRQHandler: - ldr r0,=SAI1_DriverIRQHandler - bx r0 - .size SAI1_IRQHandler, . - SAI1_IRQHandler - - .align 1 - .thumb_func - .weak SAI2_IRQHandler - .type SAI2_IRQHandler, %function -SAI2_IRQHandler: - ldr r0,=SAI2_DriverIRQHandler - bx r0 - .size SAI2_IRQHandler, . - SAI2_IRQHandler - - .align 1 - .thumb_func - .weak SAI3_RX_IRQHandler - .type SAI3_RX_IRQHandler, %function -SAI3_RX_IRQHandler: - ldr r0,=SAI3_RX_DriverIRQHandler - bx r0 - .size SAI3_RX_IRQHandler, . - SAI3_RX_IRQHandler - - .align 1 - .thumb_func - .weak SAI3_TX_IRQHandler - .type SAI3_TX_IRQHandler, %function -SAI3_TX_IRQHandler: - ldr r0,=SAI3_TX_DriverIRQHandler - bx r0 - .size SAI3_TX_IRQHandler, . - SAI3_TX_IRQHandler - - .align 1 - .thumb_func - .weak SPDIF_IRQHandler - .type SPDIF_IRQHandler, %function -SPDIF_IRQHandler: - ldr r0,=SPDIF_DriverIRQHandler - bx r0 - .size SPDIF_IRQHandler, . - SPDIF_IRQHandler - - .align 1 - .thumb_func - .weak FLEXIO1_IRQHandler - .type FLEXIO1_IRQHandler, %function -FLEXIO1_IRQHandler: - ldr r0,=FLEXIO1_DriverIRQHandler - bx r0 - .size FLEXIO1_IRQHandler, . - FLEXIO1_IRQHandler - - .align 1 - .thumb_func - .weak FLEXIO2_IRQHandler - .type FLEXIO2_IRQHandler, %function -FLEXIO2_IRQHandler: - ldr r0,=FLEXIO2_DriverIRQHandler - bx r0 - .size FLEXIO2_IRQHandler, . - FLEXIO2_IRQHandler - - .align 1 - .thumb_func - .weak FLEXSPI_IRQHandler - .type FLEXSPI_IRQHandler, %function -FLEXSPI_IRQHandler: - ldr r0,=FLEXSPI_DriverIRQHandler - bx r0 - .size FLEXSPI_IRQHandler, . - FLEXSPI_IRQHandler - - .align 1 - .thumb_func - .weak USDHC1_IRQHandler - .type USDHC1_IRQHandler, %function -USDHC1_IRQHandler: - ldr r0,=USDHC1_DriverIRQHandler - bx r0 - .size USDHC1_IRQHandler, . - USDHC1_IRQHandler - - .align 1 - .thumb_func - .weak USDHC2_IRQHandler - .type USDHC2_IRQHandler, %function -USDHC2_IRQHandler: - ldr r0,=USDHC2_DriverIRQHandler - bx r0 - .size USDHC2_IRQHandler, . - USDHC2_IRQHandler - - .align 1 - .thumb_func - .weak ENET_IRQHandler - .type ENET_IRQHandler, %function -ENET_IRQHandler: - ldr r0,=ENET_DriverIRQHandler - bx r0 - .size ENET_IRQHandler, . - ENET_IRQHandler - - .align 1 - .thumb_func - .weak ENET_1588_Timer_IRQHandler - .type ENET_1588_Timer_IRQHandler, %function -ENET_1588_Timer_IRQHandler: - ldr r0,=ENET_1588_Timer_DriverIRQHandler - bx r0 - .size ENET_1588_Timer_IRQHandler, . - ENET_1588_Timer_IRQHandler - - -/* Macro to define default handlers. Default handler - * will be weak symbol and just dead loops. They can be - * overwritten by other handlers */ - .macro def_irq_handler handler_name - .weak \handler_name - .set \handler_name, DefaultISR - .endm - -/* Exception Handlers */ - def_irq_handler MemManage_Handler - def_irq_handler BusFault_Handler - def_irq_handler UsageFault_Handler - def_irq_handler DebugMon_Handler - def_irq_handler DMA0_DMA16_DriverIRQHandler - def_irq_handler DMA1_DMA17_DriverIRQHandler - def_irq_handler DMA2_DMA18_DriverIRQHandler - def_irq_handler DMA3_DMA19_DriverIRQHandler - def_irq_handler DMA4_DMA20_DriverIRQHandler - def_irq_handler DMA5_DMA21_DriverIRQHandler - def_irq_handler DMA6_DMA22_DriverIRQHandler - def_irq_handler DMA7_DMA23_DriverIRQHandler - def_irq_handler DMA8_DMA24_DriverIRQHandler - def_irq_handler DMA9_DMA25_DriverIRQHandler - def_irq_handler DMA10_DMA26_DriverIRQHandler - def_irq_handler DMA11_DMA27_DriverIRQHandler - def_irq_handler DMA12_DMA28_DriverIRQHandler - def_irq_handler DMA13_DMA29_DriverIRQHandler - def_irq_handler DMA14_DMA30_DriverIRQHandler - def_irq_handler DMA15_DMA31_DriverIRQHandler - def_irq_handler DMA_ERROR_DriverIRQHandler - def_irq_handler CTI0_ERROR_IRQHandler - def_irq_handler CTI1_ERROR_IRQHandler - def_irq_handler CORE_IRQHandler - def_irq_handler LPUART1_DriverIRQHandler - def_irq_handler LPUART2_DriverIRQHandler - def_irq_handler LPUART3_DriverIRQHandler - def_irq_handler LPUART4_DriverIRQHandler - def_irq_handler LPUART5_DriverIRQHandler - def_irq_handler LPUART6_DriverIRQHandler - def_irq_handler LPUART7_DriverIRQHandler - def_irq_handler LPUART8_DriverIRQHandler - def_irq_handler LPI2C1_DriverIRQHandler - def_irq_handler LPI2C2_DriverIRQHandler - def_irq_handler LPI2C3_DriverIRQHandler - def_irq_handler LPI2C4_DriverIRQHandler - def_irq_handler LPSPI1_DriverIRQHandler - def_irq_handler LPSPI2_DriverIRQHandler - def_irq_handler LPSPI3_DriverIRQHandler - def_irq_handler LPSPI4_DriverIRQHandler - def_irq_handler CAN1_DriverIRQHandler - def_irq_handler CAN2_DriverIRQHandler - def_irq_handler FLEXRAM_IRQHandler - def_irq_handler KPP_IRQHandler - def_irq_handler TSC_DIG_IRQHandler - def_irq_handler GPR_IRQ_IRQHandler - def_irq_handler LCDIF_IRQHandler - def_irq_handler CSI_IRQHandler - def_irq_handler PXP_IRQHandler - def_irq_handler WDOG2_IRQHandler - def_irq_handler SNVS_HP_WRAPPER_IRQHandler - def_irq_handler SNVS_HP_WRAPPER_TZ_IRQHandler - def_irq_handler SNVS_LP_WRAPPER_IRQHandler - def_irq_handler CSU_IRQHandler - def_irq_handler DCP_IRQHandler - def_irq_handler DCP_VMI_IRQHandler - def_irq_handler Reserved68_IRQHandler - def_irq_handler TRNG_IRQHandler - def_irq_handler SJC_IRQHandler - def_irq_handler BEE_IRQHandler - def_irq_handler SAI1_DriverIRQHandler - def_irq_handler SAI2_DriverIRQHandler - def_irq_handler SAI3_RX_DriverIRQHandler - def_irq_handler SAI3_TX_DriverIRQHandler - def_irq_handler SPDIF_DriverIRQHandler - def_irq_handler PMU_EVENT_IRQHandler - def_irq_handler Reserved78_IRQHandler - def_irq_handler TEMP_LOW_HIGH_IRQHandler - def_irq_handler TEMP_PANIC_IRQHandler - def_irq_handler USB_PHY1_IRQHandler - def_irq_handler USB_PHY2_IRQHandler - def_irq_handler ADC1_IRQHandler - def_irq_handler ADC2_IRQHandler - def_irq_handler DCDC_IRQHandler - def_irq_handler Reserved86_IRQHandler - def_irq_handler Reserved87_IRQHandler - def_irq_handler GPIO1_INT0_IRQHandler - def_irq_handler GPIO1_INT1_IRQHandler - def_irq_handler GPIO1_INT2_IRQHandler - def_irq_handler GPIO1_INT3_IRQHandler - def_irq_handler GPIO1_INT4_IRQHandler - def_irq_handler GPIO1_INT5_IRQHandler - def_irq_handler GPIO1_INT6_IRQHandler - def_irq_handler GPIO1_INT7_IRQHandler - def_irq_handler GPIO1_Combined_0_15_IRQHandler - def_irq_handler GPIO1_Combined_16_31_IRQHandler - def_irq_handler GPIO2_Combined_0_15_IRQHandler - def_irq_handler GPIO2_Combined_16_31_IRQHandler - def_irq_handler GPIO3_Combined_0_15_IRQHandler - def_irq_handler GPIO3_Combined_16_31_IRQHandler - def_irq_handler GPIO4_Combined_0_15_IRQHandler - def_irq_handler GPIO4_Combined_16_31_IRQHandler - def_irq_handler GPIO5_Combined_0_15_IRQHandler - def_irq_handler GPIO5_Combined_16_31_IRQHandler - def_irq_handler FLEXIO1_DriverIRQHandler - def_irq_handler FLEXIO2_DriverIRQHandler - def_irq_handler WDOG1_IRQHandler - def_irq_handler RTWDOG_IRQHandler - def_irq_handler EWM_IRQHandler - def_irq_handler CCM_1_IRQHandler - def_irq_handler CCM_2_IRQHandler - def_irq_handler GPC_IRQHandler - def_irq_handler SRC_IRQHandler - def_irq_handler Reserved115_IRQHandler - def_irq_handler GPT1_IRQHandler - def_irq_handler GPT2_IRQHandler - def_irq_handler PWM1_0_IRQHandler - def_irq_handler PWM1_1_IRQHandler - def_irq_handler PWM1_2_IRQHandler - def_irq_handler PWM1_3_IRQHandler - def_irq_handler PWM1_FAULT_IRQHandler - def_irq_handler Reserved123_IRQHandler - def_irq_handler FLEXSPI_DriverIRQHandler - def_irq_handler SEMC_IRQHandler - def_irq_handler USDHC1_DriverIRQHandler - def_irq_handler USDHC2_DriverIRQHandler - def_irq_handler USB_OTG2_IRQHandler - def_irq_handler USB_OTG1_IRQHandler - def_irq_handler ENET_DriverIRQHandler - def_irq_handler ENET_1588_Timer_DriverIRQHandler - def_irq_handler XBAR1_IRQ_0_1_IRQHandler - def_irq_handler XBAR1_IRQ_2_3_IRQHandler - def_irq_handler ADC_ETC_IRQ0_IRQHandler - def_irq_handler ADC_ETC_IRQ1_IRQHandler - def_irq_handler ADC_ETC_IRQ2_IRQHandler - def_irq_handler ADC_ETC_ERROR_IRQ_IRQHandler - def_irq_handler PIT_IRQHandler - def_irq_handler ACMP1_IRQHandler - def_irq_handler ACMP2_IRQHandler - def_irq_handler ACMP3_IRQHandler - def_irq_handler ACMP4_IRQHandler - def_irq_handler Reserved143_IRQHandler - def_irq_handler Reserved144_IRQHandler - def_irq_handler ENC1_IRQHandler - def_irq_handler ENC2_IRQHandler - def_irq_handler ENC3_IRQHandler - def_irq_handler ENC4_IRQHandler - def_irq_handler TMR1_IRQHandler - def_irq_handler TMR2_IRQHandler - def_irq_handler TMR3_IRQHandler - def_irq_handler TMR4_IRQHandler - def_irq_handler PWM2_0_IRQHandler - def_irq_handler PWM2_1_IRQHandler - def_irq_handler PWM2_2_IRQHandler - def_irq_handler PWM2_3_IRQHandler - def_irq_handler PWM2_FAULT_IRQHandler - def_irq_handler PWM3_0_IRQHandler - def_irq_handler PWM3_1_IRQHandler - def_irq_handler PWM3_2_IRQHandler - def_irq_handler PWM3_3_IRQHandler - def_irq_handler PWM3_FAULT_IRQHandler - def_irq_handler PWM4_0_IRQHandler - def_irq_handler PWM4_1_IRQHandler - def_irq_handler PWM4_2_IRQHandler - def_irq_handler PWM4_3_IRQHandler - def_irq_handler PWM4_FAULT_IRQHandler - - .end diff --git a/devices/MIMXRT1052/system_MIMXRT1052.c b/devices/MIMXRT1052/system_MIMXRT1052.c deleted file mode 100644 index d002078..0000000 --- a/devices/MIMXRT1052/system_MIMXRT1052.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compilers: Freescale C/C++ for Embedded ARM -** GNU C Compiler -** IAR ANSI C/C++ Compiler for ARM -** Keil ARM C/C++ Compiler -** MCUXpresso Compiler -** -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.3, 2019-04-29 -** Build: b201012 -** -** 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-2020 NXP -** All rights reserved. -** -** SPDX-License-Identifier: BSD-3-Clause -** -** http: www.nxp.com -** mail: support@nxp.com -** -** Revisions: -** - rev. 0.1 (2017-01-10) -** Initial version. -** - rev. 1.0 (2018-09-21) -** Update interrupt vector table and dma request source. -** Update register BEE_ADDR_OFFSET1's bitfield name to ADDR_OFFSET1. -** Split GPIO_COMBINED_IRQS to GPIO_COMBINED_LOW_IRQS and GPIO_COMBINED_HIGH_IRQS. -** - rev. 1.1 (2018-11-16) -** Update header files to align with IMXRT1050RM Rev.1. -** - rev. 1.2 (2018-11-27) -** Update header files to align with IMXRT1050RM Rev.2.1. -** - rev. 1.3 (2019-04-29) -** Add SET/CLR/TOG register group to register CTRL, STAT, CHANNELCTRL, CH0STAT, CH0OPTS, CH1STAT, CH1OPTS, CH2STAT, CH2OPTS, CH3STAT, CH3OPTS of DCP module. -** -** ################################################################### -*/ - -/*! - * @file MIMXRT1052 - * @version 1.3 - * @date 2019-04-29 - * @brief Device specific configuration file for MIMXRT1052 (implementation 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. - */ - -#include -#include "fsl_device_registers.h" - - - -/* ---------------------------------------------------------------------------- - -- Core clock - ---------------------------------------------------------------------------- */ - -uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; - -/* ---------------------------------------------------------------------------- - -- SystemInit() - ---------------------------------------------------------------------------- */ - -void SystemInit (void) { -#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) - SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Secure mode */ - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - SCB_NS->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Non-secure mode */ - #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */ - -#if defined(__MCUXPRESSO) - extern uint32_t g_pfnVectors[]; // Vector table defined in startup code - SCB->VTOR = (uint32_t)g_pfnVectors; -#endif - -/* Disable Watchdog Power Down Counter */ - WDOG1->WMCR &= ~(uint16_t) WDOG_WMCR_PDE_MASK; - WDOG2->WMCR &= ~(uint16_t) WDOG_WMCR_PDE_MASK; - -/* Watchdog disable */ - -#if (DISABLE_WDOG) - if ((WDOG1->WCR & WDOG_WCR_WDE_MASK) != 0U) - { - WDOG1->WCR &= ~(uint16_t) WDOG_WCR_WDE_MASK; - } - if ((WDOG2->WCR & WDOG_WCR_WDE_MASK) != 0U) - { - WDOG2->WCR &= ~(uint16_t) WDOG_WCR_WDE_MASK; - } - if ((RTWDOG->CS & RTWDOG_CS_CMD32EN_MASK) != 0U) - { - RTWDOG->CNT = 0xD928C520U; /* 0xD928C520U is the update key */ - } - else - { - RTWDOG->CNT = 0xC520U; - RTWDOG->CNT = 0xD928U; - } - RTWDOG->TOVAL = 0xFFFF; - RTWDOG->CS = (uint32_t) ((RTWDOG->CS) & ~RTWDOG_CS_EN_MASK) | RTWDOG_CS_UPDATE_MASK; -#endif /* (DISABLE_WDOG) */ - - /* Disable Systick which might be enabled by bootrom */ - if ((SysTick->CTRL & SysTick_CTRL_ENABLE_Msk) != 0U) - { - SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; - } - -/* Enable instruction and data caches */ -#if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT - if (SCB_CCR_IC_Msk != (SCB_CCR_IC_Msk & SCB->CCR)) { - SCB_EnableICache(); - } -#endif -#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT - if (SCB_CCR_DC_Msk != (SCB_CCR_DC_Msk & SCB->CCR)) { - SCB_EnableDCache(); - } -#endif - - SystemInitHook(); -} - -/* ---------------------------------------------------------------------------- - -- SystemCoreClockUpdate() - ---------------------------------------------------------------------------- */ - -void SystemCoreClockUpdate (void) { - - uint32_t freq; - uint32_t PLL1MainClock; - uint32_t PLL2MainClock; - - /* Periph_clk2_clk ---> Periph_clk */ - if ((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK_SEL_MASK) != 0U) - { - switch (CCM->CBCMR & CCM_CBCMR_PERIPH_CLK2_SEL_MASK) - { - /* Pll3_sw_clk ---> Periph_clk2_clk ---> Periph_clk */ - case CCM_CBCMR_PERIPH_CLK2_SEL(0U): - if((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_BYPASS_MASK) != 0U) - { - freq = (((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_MASK) >> CCM_ANALOG_PLL_USB1_BYPASS_CLK_SRC_SHIFT) == 0U) ? - CPU_XTAL_CLK_HZ : CPU_CLK1_HZ; - } - else - { - freq = (CPU_XTAL_CLK_HZ * (((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK) != 0U) ? 22U : 20U)); - } - break; - - /* Osc_clk ---> Periph_clk2_clk ---> Periph_clk */ - case CCM_CBCMR_PERIPH_CLK2_SEL(1U): - freq = CPU_XTAL_CLK_HZ; - break; - - case CCM_CBCMR_PERIPH_CLK2_SEL(2U): - freq = (((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK) >> CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_SHIFT) == 0U) ? - CPU_XTAL_CLK_HZ : CPU_CLK1_HZ; - break; - - case CCM_CBCMR_PERIPH_CLK2_SEL(3U): - default: - freq = 0U; - break; - } - - freq /= (((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) >> CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT) + 1U); - } - /* Pre_Periph_clk ---> Periph_clk */ - else - { - /* check if pll is bypassed */ - if((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_BYPASS_MASK) != 0U) - { - PLL1MainClock = (((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_MASK) >> CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_SHIFT) == 0U) ? - CPU_XTAL_CLK_HZ : CPU_CLK1_HZ; - } - else - { - PLL1MainClock = ((CPU_XTAL_CLK_HZ * ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) >> - CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT)) >> 1U); - } - - /* check if pll is bypassed */ - if((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_BYPASS_MASK) != 0U) - { - PLL2MainClock = (((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK) >> CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_SHIFT) == 0U) ? - CPU_XTAL_CLK_HZ : CPU_CLK1_HZ; - } - else - { - PLL2MainClock = (CPU_XTAL_CLK_HZ * (((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK) != 0U) ? 22U : 20U)); - } - PLL2MainClock += (uint32_t)(((uint64_t)CPU_XTAL_CLK_HZ * ((uint64_t)(CCM_ANALOG->PLL_SYS_NUM))) / ((uint64_t)(CCM_ANALOG->PLL_SYS_DENOM))); - - - switch (CCM->CBCMR & CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK) - { - /* PLL2 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(0U): - freq = PLL2MainClock; - break; - - /* PLL2 PFD2 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(1U): - freq = PLL2MainClock / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT) * 18U; - break; - - /* PLL2 PFD0 ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(2U): - freq = PLL2MainClock / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD0_FRAC_SHIFT) * 18U; - break; - - /* PLL1 divided(/2) ---> Pre_Periph_clk ---> Periph_clk */ - case CCM_CBCMR_PRE_PERIPH_CLK_SEL(3U): - freq = PLL1MainClock / (((CCM->CACRR & CCM_CACRR_ARM_PODF_MASK) >> CCM_CACRR_ARM_PODF_SHIFT) + 1U); - break; - - default: - freq = 0U; - break; - } - } - - SystemCoreClock = (freq / (((CCM->CBCDR & CCM_CBCDR_AHB_PODF_MASK) >> CCM_CBCDR_AHB_PODF_SHIFT) + 1U)); - -} - -/* ---------------------------------------------------------------------------- - -- SystemInitHook() - ---------------------------------------------------------------------------- */ - -__attribute__ ((weak)) void SystemInitHook (void) { - /* Void implementation of the weak function. */ -} diff --git a/devices/MIMXRT1052/system_MIMXRT1052.h b/devices/MIMXRT1052/system_MIMXRT1052.h deleted file mode 100644 index b4e7030..0000000 --- a/devices/MIMXRT1052/system_MIMXRT1052.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -** ################################################################### -** Processors: MIMXRT1052CVJ5B -** MIMXRT1052CVL5B -** MIMXRT1052DVJ6B -** MIMXRT1052DVL6B -** -** Compilers: Freescale C/C++ for Embedded ARM -** GNU C Compiler -** IAR ANSI C/C++ Compiler for ARM -** Keil ARM C/C++ Compiler -** MCUXpresso Compiler -** -** Reference manual: IMXRT1050RM Rev.2.1, 12/2018 | IMXRT1050SRM Rev.2 -** Version: rev. 1.3, 2019-04-29 -** Build: b191113 -** -** 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-2019 NXP -** All rights reserved. -** -** SPDX-License-Identifier: BSD-3-Clause -** -** http: www.nxp.com -** mail: support@nxp.com -** -** Revisions: -** - rev. 0.1 (2017-01-10) -** Initial version. -** - rev. 1.0 (2018-09-21) -** Update interrupt vector table and dma request source. -** Update register BEE_ADDR_OFFSET1's bitfield name to ADDR_OFFSET1. -** Split GPIO_COMBINED_IRQS to GPIO_COMBINED_LOW_IRQS and GPIO_COMBINED_HIGH_IRQS. -** - rev. 1.1 (2018-11-16) -** Update header files to align with IMXRT1050RM Rev.1. -** - rev. 1.2 (2018-11-27) -** Update header files to align with IMXRT1050RM Rev.2.1. -** - rev. 1.3 (2019-04-29) -** Add SET/CLR/TOG register group to register CTRL, STAT, CHANNELCTRL, CH0STAT, CH0OPTS, CH1STAT, CH1OPTS, CH2STAT, CH2OPTS, CH3STAT, CH3OPTS of DCP module. -** -** ################################################################### -*/ - -/*! - * @file MIMXRT1052 - * @version 1.3 - * @date 2019-04-29 - * @brief Device specific configuration file for MIMXRT1052 (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_MIMXRT1052_H_ -#define _SYSTEM_MIMXRT1052_H_ /**< Symbol preventing repeated inclusion */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - - -#ifndef DISABLE_WDOG - #define DISABLE_WDOG 1 -#endif - -/* Define clock source values */ - -#define CPU_XTAL_CLK_HZ 24000000UL /* Value of the external crystal or oscillator clock frequency in Hz */ - -#define CPU_CLK1_HZ 0UL /* Value of the CLK1 (select the CLK1_N/CLK1_P as source) frequency in Hz */ - /* If CLOCK1_P,CLOCK1_N is choose as the pll bypass clock source, please implement the CLKPN_FREQ define, otherwise 0 will be returned. */ - -#define DEFAULT_SYSTEM_CLOCK 528000000UL /* Default System clock value */ - - -/** - * @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_MIMXRT1052_H_ */ diff --git a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.c b/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.c deleted file mode 100644 index 9eb416c..0000000 --- a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.c +++ /dev/null @@ -1,1356 +0,0 @@ -/* - * This is a modified version of the file printf.c, which was distributed - * by Motorola as part of the M5407C3BOOT.zip package used to initialize - * the M5407C3 evaluation board. - * - * Copyright: - * 1999-2000 MOTOROLA, INC. All Rights Reserved. - * You are hereby granted a copyright license to use, modify, and - * distribute the SOFTWARE so long as this entire notice is - * retained without alteration in any modified and/or redistributed - * versions, and that such modified versions are clearly identified - * as such. No licenses are granted by implication, estoppel or - * otherwise under any patents or trademarks of Motorola, Inc. This - * software is provided on an "AS IS" basis and without warranty. - * - * To the maximum extent permitted by applicable law, MOTOROLA - * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING - * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR - * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE - * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY - * ACCOMPANYING WRITTEN MATERIALS. - * - * To the maximum extent permitted by applicable law, IN NO EVENT - * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING - * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS - * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY - * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. - * - * Motorola assumes no responsibility for the maintenance and support - * of this software - - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#if defined(__CC_ARM) || defined(__ARMCC_VERSION) -#include -#endif - -#ifdef SDK_OS_FREE_RTOS -#include "FreeRTOS.h" -#include "semphr.h" -#include "task.h" -#endif - -#include "fsl_debug_console_conf.h" -#include "fsl_str.h" - -#include "fsl_common.h" -#include "fsl_component_serial_manager.h" - -#include "fsl_debug_console.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ -#ifndef NDEBUG -#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U)) -#undef assert -#define assert(n) -#else -/* MISRA C-2012 Rule 17.2 */ -#undef assert -#define assert(n) \ - while (!(n)) \ - { \ - ; \ - } -#endif -#endif - -#if SDK_DEBUGCONSOLE -#define DEBUG_CONSOLE_FUNCTION_PREFIX -#else -#define DEBUG_CONSOLE_FUNCTION_PREFIX static -#endif - -/*! @brief character backspace ASCII value */ -#define DEBUG_CONSOLE_BACKSPACE 127U - -/* lock definition */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - -static SemaphoreHandle_t s_debugConsoleReadSemaphore; -#if configSUPPORT_STATIC_ALLOCATION -static StaticSemaphore_t s_debugConsoleReadSemaphoreStatic; -#endif -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) -static SemaphoreHandle_t s_debugConsoleReadWaitSemaphore; -#if configSUPPORT_STATIC_ALLOCATION -static StaticSemaphore_t s_debugConsoleReadWaitSemaphoreStatic; -#endif -#endif - -#elif (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) - -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) -static volatile bool s_debugConsoleReadWaitSemaphore; -#endif - -#else - -#endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */ - -/*! @brief get current runing environment is ISR or not */ -#ifdef __CA7_REV -#define IS_RUNNING_IN_ISR() SystemGetIRQNestingLevel() -#else -#define IS_RUNNING_IN_ISR() __get_IPSR() -#endif /* __CA7_REV */ - -/* semaphore definition */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - -/* mutex semaphore */ -/* clang-format off */ -#if configSUPPORT_STATIC_ALLOCATION -#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex, stack) ((mutex) = xSemaphoreCreateMutexStatic(stack)) -#else -#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) ((mutex) = xSemaphoreCreateMutex()) -#endif -#define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex) \ - do \ - { \ - if(NULL != (mutex)) \ - { \ - vSemaphoreDelete(mutex); \ - (mutex) = NULL; \ - } \ - } while(false) - -#define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) \ -{ \ - if (IS_RUNNING_IN_ISR() == 0U) \ - { \ - (void)xSemaphoreGive(mutex); \ - } \ -} - -#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) \ -{ \ - if (IS_RUNNING_IN_ISR() == 0U) \ - { \ - (void)xSemaphoreTake(mutex, portMAX_DELAY); \ - } \ -} - -#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) \ -{ \ - if (IS_RUNNING_IN_ISR() == 0U) \ - { \ - result = xSemaphoreTake(mutex, 0U); \ - } \ - else \ - { \ - result = 1U; \ - } \ -} - -/* Binary semaphore */ -#if configSUPPORT_STATIC_ALLOCATION -#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary,stack) ((binary) = xSemaphoreCreateBinaryStatic(stack)) -#else -#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) ((binary) = xSemaphoreCreateBinary()) -#endif -#define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) \ - do \ - { \ - if(NULL != (binary)) \ - { \ - vSemaphoreDelete((binary)); \ - (binary) = NULL; \ - } \ - } while(false) -#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) ((void)xSemaphoreTake((binary), portMAX_DELAY)) -#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) ((void)xSemaphoreGiveFromISR((binary), NULL)) - -#elif (DEBUG_CONSOLE_SYNCHRONIZATION_BM == DEBUG_CONSOLE_SYNCHRONIZATION_MODE) - -#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) (void)(mutex) -#define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex) (void)(mutex) -#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) (void)(mutex) -#define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) (void)(mutex) -#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) (result = 1U) - -#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) (void)(binary) -#define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) (void)(binary) -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) \ - { \ - while (!(binary)) \ - { \ - } \ - (binary) = false; \ - } -#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) \ - do \ - { \ - (binary) = true; \ - } while(false) -#else -#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) (void)(binary) -#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) (void)(binary) -#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ -/* clang-format on */ - -/* add other implementation here - *such as : - * #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_xxx) - */ - -#else - -#error RTOS type is not defined by DEBUG_CONSOLE_SYNCHRONIZATION_MODE. - -#endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */ - -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -/* receive state structure */ -typedef struct _debug_console_write_ring_buffer -{ - uint32_t ringBufferSize; - volatile uint32_t ringHead; - volatile uint32_t ringTail; - uint8_t ringBuffer[DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN]; -} debug_console_write_ring_buffer_t; -#endif - -typedef struct _debug_console_state_struct -{ - serial_handle_t serialHandle; /*!< serial manager handle */ -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING - SERIAL_MANAGER_HANDLE_DEFINE(serialHandleBuffer); - debug_console_write_ring_buffer_t writeRingBuffer; - uint8_t readRingBuffer[DEBUG_CONSOLE_RECEIVE_BUFFER_LEN]; - SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialWriteHandleBuffer); - SERIAL_MANAGER_READ_HANDLE_DEFINE(serialReadHandleBuffer); -#else - SERIAL_MANAGER_BLOCK_HANDLE_DEFINE(serialHandleBuffer); - SERIAL_MANAGER_WRITE_BLOCK_HANDLE_DEFINE(serialWriteHandleBuffer); - SERIAL_MANAGER_READ_BLOCK_HANDLE_DEFINE(serialReadHandleBuffer); -#endif -} debug_console_state_struct_t; - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/*! @brief Debug console state information. */ -#if (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE > 0)) -AT_NONCACHEABLE_SECTION(static debug_console_state_struct_t s_debugConsoleState); -#else -static debug_console_state_struct_t s_debugConsoleState; -#endif -serial_handle_t g_serialHandle; /*!< serial manager handle */ - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @brief This is a printf call back function which is used to relocate the log to buffer - * or print the log immediately when the local buffer is full. - * - * @param[in] buf Buffer to store log. - * @param[in] indicator Buffer index. - * @param[in] val Target character to store. - * @param[in] len length of the character - * - */ -#if SDK_DEBUGCONSOLE -static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len); -#endif - -status_t DbgConsole_ReadOneCharacter(uint8_t *ch); -int DbgConsole_SendData(uint8_t *ch, size_t size); -int DbgConsole_SendDataReliable(uint8_t *ch, size_t size); -int DbgConsole_ReadLine(uint8_t *buf, size_t size); -int DbgConsole_ReadCharacter(uint8_t *ch); - -#if ((SDK_DEBUGCONSOLE == 0U) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \ - (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))) -DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void); -#endif -/******************************************************************************* - * Code - ******************************************************************************/ - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - -static void DbgConsole_SerialManagerTxCallback(void *callbackParam, - serial_manager_callback_message_t *message, - serial_manager_status_t status) -{ - debug_console_state_struct_t *ioState; - uint32_t sendDataLength; - - if ((NULL == callbackParam) || (NULL == message)) - { - return; - } - - ioState = (debug_console_state_struct_t *)callbackParam; - - ioState->writeRingBuffer.ringTail += message->length; - if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize) - { - ioState->writeRingBuffer.ringTail = 0U; - } - - if (kStatus_SerialManager_Success == status) - { - if (ioState->writeRingBuffer.ringTail != ioState->writeRingBuffer.ringHead) - { - if (ioState->writeRingBuffer.ringHead > ioState->writeRingBuffer.ringTail) - { - sendDataLength = ioState->writeRingBuffer.ringHead - ioState->writeRingBuffer.ringTail; - } - else - { - sendDataLength = ioState->writeRingBuffer.ringBufferSize - ioState->writeRingBuffer.ringTail; - } - - (void)SerialManager_WriteNonBlocking( - ((serial_write_handle_t)&ioState->serialWriteHandleBuffer[0]), - &ioState->writeRingBuffer.ringBuffer[ioState->writeRingBuffer.ringTail], sendDataLength); - } - } - else if (kStatus_SerialManager_Canceled == status) - { - ioState->writeRingBuffer.ringTail = 0U; - ioState->writeRingBuffer.ringHead = 0U; - } - else - { - /*MISRA rule 16.4*/ - } -} - -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - -static void DbgConsole_SerialManagerRxCallback(void *callbackParam, - serial_manager_callback_message_t *message, - serial_manager_status_t status) -{ - if ((NULL == callbackParam) || (NULL == message)) - { - return; - } - - if (kStatus_SerialManager_Notify == status) - { - } - else if (kStatus_SerialManager_Success == status) - { - /* release s_debugConsoleReadWaitSemaphore from RX callback */ - DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(s_debugConsoleReadWaitSemaphore); - } - else - { - /*MISRA rule 16.4*/ - } -} -#endif - -#endif - -status_t DbgConsole_ReadOneCharacter(uint8_t *ch) -{ -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \ - (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED) - return (status_t)kStatus_Fail; -#else /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \ - DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/ - serial_manager_status_t status = kStatus_SerialManager_Error; - -/* recieve one char every time */ -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - status = - SerialManager_ReadNonBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1); -#else /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/ - status = SerialManager_ReadBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1); -#endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/ - if (kStatus_SerialManager_Success != status) - { - status = (serial_manager_status_t)kStatus_Fail; - } - else - { - /* wait s_debugConsoleReadWaitSemaphore from RX callback */ - DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(s_debugConsoleReadWaitSemaphore); - status = (serial_manager_status_t)kStatus_Success; - } - return (status_t)status; -#endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \ - DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/ - -#else /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/ - - return (status_t)kStatus_Fail; - -#endif /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/ -} - -#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION -static status_t DbgConsole_EchoCharacter(uint8_t *ch, bool isGetChar, int *index) -{ - /* Due to scanf take \n and \r as end of string,should not echo */ - if (((*ch != (uint8_t)'\r') && (*ch != (uint8_t)'\n')) || (isGetChar)) - { - /* recieve one char every time */ - if (1 != DbgConsole_SendDataReliable(ch, 1U)) - { - return (status_t)kStatus_Fail; - } - } - - if ((!isGetChar) && (index != NULL)) - { - if (DEBUG_CONSOLE_BACKSPACE == *ch) - { - if ((*index >= 2)) - { - *index -= 2; - } - else - { - *index = 0; - } - } - } - - return (status_t)kStatus_Success; -} -#endif - -int DbgConsole_SendData(uint8_t *ch, size_t size) -{ - status_t status; -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - uint32_t sendDataLength; - int txBusy = 0; -#endif - assert(NULL != ch); - assert(0U != size); - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - uint32_t regPrimask = DisableGlobalIRQ(); - if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail) - { - txBusy = 1; - sendDataLength = - (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize - - s_debugConsoleState.writeRingBuffer.ringTail) % - s_debugConsoleState.writeRingBuffer.ringBufferSize; - } - else - { - sendDataLength = 0U; - } - sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U; - if (sendDataLength < size) - { - EnableGlobalIRQ(regPrimask); - return -1; - } - for (int i = 0; i < (int)size; i++) - { - s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringHead++] = ch[i]; - if (s_debugConsoleState.writeRingBuffer.ringHead >= s_debugConsoleState.writeRingBuffer.ringBufferSize) - { - s_debugConsoleState.writeRingBuffer.ringHead = 0U; - } - } - - status = (status_t)kStatus_SerialManager_Success; - - if (txBusy == 0) - { - if (s_debugConsoleState.writeRingBuffer.ringHead > s_debugConsoleState.writeRingBuffer.ringTail) - { - sendDataLength = - s_debugConsoleState.writeRingBuffer.ringHead - s_debugConsoleState.writeRingBuffer.ringTail; - } - else - { - sendDataLength = - s_debugConsoleState.writeRingBuffer.ringBufferSize - s_debugConsoleState.writeRingBuffer.ringTail; - } - - status = (status_t)SerialManager_WriteNonBlocking( - ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), - &s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringTail], - sendDataLength); - } - EnableGlobalIRQ(regPrimask); -#else - status = (status_t)SerialManager_WriteBlocking( - ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size); -#endif - return (((status_t)kStatus_Success == status) ? (int)size : -1); -} - -int DbgConsole_SendDataReliable(uint8_t *ch, size_t size) -{ -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) -#if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U)) - serial_manager_status_t status = kStatus_SerialManager_Error; - uint32_t sendDataLength; - uint32_t totalLength = size; - int sentLength; -#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */ -#else /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ - serial_manager_status_t status; -#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ - - assert(NULL != ch); - - if (0U == size) - { - return 0; - } - - if (NULL == g_serialHandle) - { - return 0; - } - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - -#if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U)) - do - { - uint32_t regPrimask = DisableGlobalIRQ(); - if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail) - { - sendDataLength = - (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize - - s_debugConsoleState.writeRingBuffer.ringTail) % - s_debugConsoleState.writeRingBuffer.ringBufferSize; - } - else - { - sendDataLength = 0U; - } - sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U; - - if (sendDataLength > 0U) - { - if (sendDataLength > totalLength) - { - sendDataLength = totalLength; - } - - sentLength = DbgConsole_SendData(&ch[size - totalLength], sendDataLength); - if (sentLength > 0) - { - totalLength = totalLength - (uint32_t)sentLength; - } - } - EnableGlobalIRQ(regPrimask); - - if (totalLength != 0U) - { - status = (serial_manager_status_t)DbgConsole_Flush(); - if (kStatus_SerialManager_Success != status) - { - break; - } - } - } while (totalLength != 0U); - return ((int)size - (int)totalLength); -#else /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */ - return DbgConsole_SendData(ch, size); -#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */ - -#else /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ - status = - SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size); - return ((kStatus_SerialManager_Success == status) ? (int)size : -1); -#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ -} - -int DbgConsole_ReadLine(uint8_t *buf, size_t size) -{ - int i = 0; - - assert(buf != NULL); - - if (NULL == g_serialHandle) - { - return -1; - } - - /* take mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore); -#endif - - do - { - /* recieve one char every time */ - if ((status_t)kStatus_Success != DbgConsole_ReadOneCharacter(&buf[i])) - { - /* release mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif - i = -1; - break; - } -#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION - (void)DbgConsole_EchoCharacter(&buf[i], false, &i); -#endif - /* analysis data */ - if (((uint8_t)'\r' == buf[i]) || ((uint8_t)'\n' == buf[i])) - { - /* End of Line. */ - if (0 == i) - { - buf[i] = (uint8_t)'\0'; - continue; - } - else - { - break; - } - } - i++; - } while (i < (int)size); - - /* get char should not add '\0'*/ - if (i == (int)size) - { - buf[i] = (uint8_t)'\0'; - } - else - { - buf[i + 1] = (uint8_t)'\0'; - } - - /* release mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif - - return i; -} - -int DbgConsole_ReadCharacter(uint8_t *ch) -{ - int ret; - - assert(ch); - - if (NULL == g_serialHandle) - { - return -1; - } - - /* take mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore); -#endif - /* read one character */ - if ((status_t)kStatus_Success == DbgConsole_ReadOneCharacter(ch)) - { - ret = 1; -#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION - (void)DbgConsole_EchoCharacter(ch, true, NULL); -#endif - } - else - { - ret = -1; - } - - /* release mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif - - return ret; -} - -#if SDK_DEBUGCONSOLE -static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len) -{ - int i = 0; - - for (i = 0; i < len; i++) - { - if (((uint32_t)*indicator + 1UL) >= (uint32_t)DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN) - { - (void)DbgConsole_SendDataReliable((uint8_t *)buf, (uint32_t)(*indicator)); - *indicator = 0; - } - - buf[*indicator] = dbgVal; - (*indicator)++; - } -} -#endif - -/*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/ -#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) -#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U)) -#include "board.h" -#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) -static const serial_port_uart_config_t uartConfig = {.instance = BOARD_DEBUG_UART_INSTANCE, - .clockRate = BOARD_DEBUG_UART_CLK_FREQ, - .baudRate = BOARD_DEBUG_UART_BAUDRATE, - .parityMode = kSerialManager_UartParityDisabled, - .stopBitCount = kSerialManager_UartOneStopBit, -#if !defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) -#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) - .mode = kSerialManager_UartBlockMode, -#endif -#endif - .enableRx = 1U, - .enableTx = 1U, - .enableRxRTS = 0U, - .enableTxCTS = 0U, -#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u)) - .txFifoWatermark = 0U, - .rxFifoWatermark = 0U -#endif -}; -#endif -#endif -/* 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) -{ - serial_manager_config_t serialConfig; - serial_manager_status_t status = kStatus_SerialManager_Success; - -#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE == 0U)) -#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) - serial_port_uart_config_t uartConfig = { - .instance = instance, - .clockRate = clkSrcFreq, - .baudRate = baudRate, - .parityMode = kSerialManager_UartParityDisabled, - .stopBitCount = kSerialManager_UartOneStopBit, -#if !defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) -#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) - .mode = kSerialManager_UartBlockMode, -#endif -#endif - .enableRx = 1, - .enableTx = 1, - .enableRxRTS = 0U, - .enableTxCTS = 0U, -#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u)) - .txFifoWatermark = 0U, - .rxFifoWatermark = 0U -#endif - }; -#endif -#endif - -#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) - serial_port_usb_cdc_config_t usbCdcConfig = { - .controllerIndex = (serial_port_usb_cdc_controller_index_t)instance, - }; -#endif - -#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) - serial_port_swo_config_t swoConfig = { - .clockRate = clkSrcFreq, - .baudRate = baudRate, - .port = instance, - .protocol = kSerialManager_SwoProtocolNrz, - }; -#endif - -#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U)) - serial_port_virtual_config_t serialPortVirtualConfig = { - .controllerIndex = (serial_port_virtual_controller_index_t)instance, - }; -#endif - - serialConfig.type = device; -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - serialConfig.ringBuffer = &s_debugConsoleState.readRingBuffer[0]; - serialConfig.ringBufferSize = DEBUG_CONSOLE_RECEIVE_BUFFER_LEN; - serialConfig.blockType = kSerialManager_NonBlocking; -#else - serialConfig.blockType = kSerialManager_Blocking; -#endif - - if (kSerialPort_Uart == device) - { -#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) -#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U)) - serialConfig.portConfig = (void *)&uartConfig; -#else - serialConfig.portConfig = &uartConfig; -#endif -#else - status = kStatus_SerialManager_Error; -#endif - } - else if (kSerialPort_UsbCdc == device) - { -#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) - serialConfig.portConfig = &usbCdcConfig; -#else - status = kStatus_SerialManager_Error; -#endif - } - else if (kSerialPort_Swo == device) - { -#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) - serialConfig.portConfig = &swoConfig; -#else - status = kStatus_SerialManager_Error; -#endif - } - else if (kSerialPort_Virtual == device) - { -#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U)) - serialConfig.portConfig = &serialPortVirtualConfig; -#else - status = kStatus_SerialManager_Error; -#endif - } - else - { - status = kStatus_SerialManager_Error; - } - - if (kStatus_SerialManager_Error != status) - { - (void)memset(&s_debugConsoleState, 0, sizeof(s_debugConsoleState)); - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - s_debugConsoleState.writeRingBuffer.ringBufferSize = DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN; -#endif - - s_debugConsoleState.serialHandle = (serial_handle_t)&s_debugConsoleState.serialHandleBuffer[0]; - status = SerialManager_Init(s_debugConsoleState.serialHandle, &serialConfig); - - assert(kStatus_SerialManager_Success == status); - -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) -#if configSUPPORT_STATIC_ALLOCATION - DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore, &s_debugConsoleReadSemaphoreStatic); -#else - DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif -#endif -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) && configSUPPORT_STATIC_ALLOCATION - DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore, &s_debugConsoleReadWaitSemaphoreStatic); -#else - DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore); -#endif -#endif - - { - status = - SerialManager_OpenWriteHandle(s_debugConsoleState.serialHandle, - ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0])); - assert(kStatus_SerialManager_Success == status); -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - (void)SerialManager_InstallTxCallback( - ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), - DbgConsole_SerialManagerTxCallback, &s_debugConsoleState); -#endif - } - -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - { - status = - SerialManager_OpenReadHandle(s_debugConsoleState.serialHandle, - ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0])); - assert(kStatus_SerialManager_Success == status); -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - (void)SerialManager_InstallRxCallback( - ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), - DbgConsole_SerialManagerRxCallback, &s_debugConsoleState); -#endif - } -#endif - - g_serialHandle = s_debugConsoleState.serialHandle; - } - return (status_t)status; -} - -/* See fsl_debug_console.h for documentation of this function. */ -status_t DbgConsole_EnterLowpower(void) -{ - serial_manager_status_t status = kStatus_SerialManager_Error; - if (s_debugConsoleState.serialHandle != NULL) - { - status = SerialManager_EnterLowpower(s_debugConsoleState.serialHandle); - } - return (status_t)status; -} - -/* See fsl_debug_console.h for documentation of this function. */ -status_t DbgConsole_ExitLowpower(void) -{ - serial_manager_status_t status = kStatus_SerialManager_Error; - - if (s_debugConsoleState.serialHandle != NULL) - { - status = SerialManager_ExitLowpower(s_debugConsoleState.serialHandle); - } - return (status_t)status; -} -/* See fsl_debug_console.h for documentation of this function. */ -status_t DbgConsole_Deinit(void) -{ - { - if (s_debugConsoleState.serialHandle != NULL) - { - (void)SerialManager_CloseWriteHandle( - ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0])); - } - } -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - { - if (s_debugConsoleState.serialHandle != NULL) - { - (void)SerialManager_CloseReadHandle(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0])); - } - } -#endif - if (NULL != s_debugConsoleState.serialHandle) - { - if (kStatus_SerialManager_Success == SerialManager_Deinit(s_debugConsoleState.serialHandle)) - { - s_debugConsoleState.serialHandle = NULL; - g_serialHandle = NULL; - } - } -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore); -#endif -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif - - return (status_t)kStatus_Success; -} -#endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */ - -#if ((SDK_DEBUGCONSOLE > 0U) || \ - ((SDK_DEBUGCONSOLE == 0U) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \ - (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U)))) -DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void) -{ -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED) - - if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail) - { - return (status_t)kStatus_Fail; - } - -#else - - while (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail) - { -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - if (0U == IS_RUNNING_IN_ISR()) - { - if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState()) - { - vTaskDelay(1); - } - } - else - { - return (status_t)kStatus_Fail; - } -#endif - } - -#endif - -#endif - return (status_t)kStatus_Success; -} -#endif - -#if SDK_DEBUGCONSOLE -/* See fsl_debug_console.h for documentation of this function. */ -int DbgConsole_Printf(const char *fmt_s, ...) -{ - va_list ap; - int logLength = 0, dbgResult = 0; - char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'}; - - if (NULL != g_serialHandle) - { - va_start(ap, fmt_s); - /* format print log first */ - logLength = StrFormatPrintf(fmt_s, ap, printBuf, DbgConsole_PrintCallback); - /* print log */ - dbgResult = DbgConsole_SendDataReliable((uint8_t *)printBuf, (size_t)logLength); - - va_end(ap); - } - return dbgResult; -} - -/* See fsl_debug_console.h for documentation of this function. */ -int DbgConsole_Putchar(int ch) -{ - /* print char */ - return DbgConsole_SendDataReliable((uint8_t *)&ch, 1U); -} - -/* See fsl_debug_console.h for documentation of this function. */ -int DbgConsole_Scanf(char *formatString, ...) -{ - va_list ap; - int formatResult; - char scanfBuf[DEBUG_CONSOLE_SCANF_MAX_LOG_LEN + 1U] = {'\0'}; - - /* scanf log */ - (void)DbgConsole_ReadLine((uint8_t *)scanfBuf, DEBUG_CONSOLE_SCANF_MAX_LOG_LEN); - /* get va_list */ - va_start(ap, formatString); - /* format scanf log */ - formatResult = StrFormatScanf(scanfBuf, formatString, ap); - - va_end(ap); - - return formatResult; -} -/* See fsl_debug_console.h for documentation of this function. */ -int DbgConsole_BlockingPrintf(const char *formatString, ...) -{ - va_list ap; - status_t status; - int logLength = 0, dbgResult = 0; - char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'}; - - if (NULL == g_serialHandle) - { - return 0; - } - - va_start(ap, formatString); - /* format print log first */ - logLength = StrFormatPrintf(formatString, ap, printBuf, DbgConsole_PrintCallback); - -#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) - (void)SerialManager_CancelWriting(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0])); -#endif - /* print log */ - status = - (status_t)SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), - (uint8_t *)printBuf, (size_t)logLength); - dbgResult = (((status_t)kStatus_Success == status) ? (int)logLength : -1); - va_end(ap); - - return dbgResult; -} - -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -status_t DbgConsole_TryGetchar(char *ch) -{ -#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U)) - uint32_t length = 0; - status_t status = (status_t)kStatus_Fail; - - assert(ch); - - if (NULL == g_serialHandle) - { - return kStatus_Fail; - } - - /* take mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore); -#endif - - if (kStatus_SerialManager_Success == - SerialManager_TryRead(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), (uint8_t *)ch, 1, - &length)) - { - if (length != 0U) - { -#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION - (void)DbgConsole_EchoCharacter((uint8_t *)ch, true, NULL); -#endif - status = (status_t)kStatus_Success; - } - } - /* release mutex lock function */ -#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) - DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore); -#endif - return status; -#else - return (status_t)kStatus_Fail; -#endif -} -#endif - -/* See fsl_debug_console.h for documentation of this function. */ -int DbgConsole_Getchar(void) -{ - int ret = -1; - uint8_t ch = 0U; - - /* Get char */ - if (DbgConsole_ReadCharacter(&ch) > 0) - { - ret = (int)ch; - } - - return ret; -} - -#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 = 0U; - } - 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 - { - /* Send data. */ - uint8_t buff[512]; - (void)memcpy(buff, buffer, size); - (void)DbgConsole_SendDataReliable((uint8_t *)buff, 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) -{ - uint8_t ch = 0U; - int actualSize = 0; - - /* This function only reads from "standard in", for all other file handles it returns failure. */ - if (0 != handle) - { - actualSize = -1; - } - else - { - /* Receive data.*/ - for (; size > 0U; size--) - { - (void)DbgConsole_ReadCharacter(&ch); - if (0U == ch) - { - break; - } - - *buffer++ = ch; - actualSize++; - } - } - return (size_t)actualSize; -} -#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; - } - - /* Send data. */ - DbgConsole_SendDataReliable((uint8_t *)buffer, size); - - return 0; -} - -int __attribute__((weak)) __sys_readc(void) -{ - char tmp; - - /* Receive data. */ - DbgConsole_ReadCharacter((uint8_t *)&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) -{ - /* Send data. */ - return DbgConsole_SendDataReliable((uint8_t *)(&ch), 1); -} - -#pragma weak fgetc -int fgetc(FILE *f) -{ - char ch; - - /* Receive data. */ - DbgConsole_ReadCharacter((uint8_t *)&ch); - - 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; - DbgConsole_SendDataReliable((uint8_t *)(&ench), 1); -} - -char *_sys_command_string(char *cmd, int len) -{ - return (cmd); -} -#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; - } - - /* Send data. */ - (void)DbgConsole_SendDataReliable((uint8_t *)buffer, (size_t)size); - - return size; -} - -int __attribute__((weak)) _read(int handle, char *buffer, int size); -int __attribute__((weak)) _read(int handle, char *buffer, int size) -{ - uint8_t ch = 0U; - int actualSize = 0; - - /* This function only reads from "standard in", for all other file handles it returns failure. */ - if (handle != 0) - { - return -1; - } - - /* Receive data. */ - for (; size > 0; size--) - { - if (DbgConsole_ReadCharacter(&ch) < 0) - { - break; - } - - *buffer++ = (char)ch; - actualSize++; - - if ((ch == 0U) || (ch == (uint8_t)'\n') || (ch == (uint8_t)'\r')) - { - break; - } - } - - return (actualSize > 0) ? actualSize : -1; -} -#endif - -#endif /* __ICCARM__ */ diff --git a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.h b/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.h deleted file mode 100644 index 45daa81..0000000 --- a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc. - * Copyright 2016-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" -#include "fsl_component_serial_manager.h" - -/*! - * @addtogroup debugconsole - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -extern serial_handle_t g_serialHandle; /*!< serial manager handle */ - -/*! @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. The macro only support - * to be redefined in project setting. - */ -#ifndef SDK_DEBUGCONSOLE -#define SDK_DEBUGCONSOLE DEBUGCONSOLE_REDIRECT_TO_SDK -#endif - -#if defined(SDK_DEBUGCONSOLE) && !(SDK_DEBUGCONSOLE) -#include -#endif - -/*! @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 */ -static inline int DbgConsole_Disabled(void) -{ - return -1; -} -#define PRINTF(...) DbgConsole_Disabled() -#define SCANF(...) DbgConsole_Disabled() -#define PUTCHAR(...) DbgConsole_Disabled() -#define GETCHAR() DbgConsole_Disabled() -#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 */ - -/******************************************************************************* - * 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 - * initialized by the serial manager module. - * 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, - * @arg kSerialPort_UsbCdc - * @param clkSrcFreq Frequency of peripheral source clock. - * - * @return Indicates whether initialization was successful or not. - * @retval kStatus_Success Execution successfully - */ -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 - * initialized by the serial manager module. - * - * @return Indicates whether de-initialization was successful or not. - */ -status_t DbgConsole_Deinit(void); -/*! - * @brief Prepares to enter low power consumption. - * - * This function is used to prepare to enter low power consumption. - * - * @return Indicates whether de-initialization was successful or not. - */ -status_t DbgConsole_EnterLowpower(void); - -/*! - * @brief Restores from low power consumption. - * - * This function is used to restore from low power consumption. - * - * @return Indicates whether de-initialization was successful or not. - */ -status_t DbgConsole_ExitLowpower(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; -} - -/*! - * Use an error to replace the DbgConsole_EnterLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and - * SDK_DEBUGCONSOLE_UART is not defined. - */ -static inline status_t DbgConsole_EnterLowpower(void) -{ - return (status_t)kStatus_Fail; -} - -/*! - * Use an error to replace the DbgConsole_ExitLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and - * SDK_DEBUGCONSOLE_UART is not defined. - */ -static inline status_t DbgConsole_ExitLowpower(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 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. - * - * @note Due the limitation in the BM OSA environment (CPU is blocked in the function, - * other tasks will not be scheduled), the function cannot be used when the - * DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment. - * And an error is returned when the function called in this case. The suggestion - * is that polling the non-blocking function DbgConsole_TryGetchar to get the input char. - * - * @param formatString Format control string. - * @return Returns the number of fields successfully converted and assigned. - */ -int DbgConsole_Scanf(char *formatString, ...); - -/*! - * @brief Reads a character from standard input. - * - * Call this function to read a character from standard input. - * - * @note Due the limitation in the BM OSA environment (CPU is blocked in the function, - * other tasks will not be scheduled), the function cannot be used when the - * DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment. - * And an error is returned when the function called in this case. The suggestion - * is that polling the non-blocking function DbgConsole_TryGetchar to get the input char. - * - * @return Returns the character read. - */ -int DbgConsole_Getchar(void); - -/*! - * @brief Writes formatted output to the standard output stream with the blocking mode. - * - * Call this function to write a formatted output to the standard output stream with the blocking mode. - * The function will send data with blocking mode no matter the DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set - * or not. - * The function could be used in system ISR mode with DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set. - * - * @param formatString Format control string. - * @return Returns the number of characters printed or a negative value if an error occurs. - */ -int DbgConsole_BlockingPrintf(const char *formatString, ...); - -/*! - * @brief Debug console flush. - * - * Call this function to wait the tx buffer empty. - * If interrupt transfer is using, make sure the global IRQ is enable before call this function - * This function should be called when - * 1, before enter power down mode - * 2, log is required to print to terminal immediately - * @return Indicates whether wait idle was successful or not. - */ -status_t DbgConsole_Flush(void); - -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -/*! - * @brief Debug console try to get char - * This function provides a API which will not block current task, if character is - * available return it, otherwise return fail. - * @param ch the address of char to receive - * @return Indicates get char was successful or not. - */ -status_t DbgConsole_TryGetchar(char *ch); -#endif - -#endif /* SDK_DEBUGCONSOLE */ - -/*! @} */ - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @} */ - -#endif /* _FSL_DEBUGCONSOLE_H_ */ diff --git a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console_conf.h b/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console_conf.h deleted file mode 100644 index fd235b1..0000000 --- a/devices/MIMXRT1052/utilities/debug_console/fsl_debug_console_conf.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2017 - 2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef _FSL_DEBUG_CONSOLE_CONF_H_ -#define _FSL_DEBUG_CONSOLE_CONF_H_ - -#include "fsl_common.h" - -/****************Debug console configuration********************/ - -/*! @brief If Non-blocking mode is needed, please define it at project setting, - * otherwise blocking mode is the default transfer mode. - * Warning: If you want to use non-blocking transfer,please make sure the corresponding - * IO interrupt is enable, otherwise there is no output. - * And non-blocking is combine with buffer, no matter bare-metal or rtos. - * Below shows how to configure in your project if you want to use non-blocking mode. - * For IAR, right click project and select "Options", define it in "C/C++ Compiler->Preprocessor->Defined symbols". - * For KEIL, click "Options for Target…", define it in "C/C++->Preprocessor Symbols->Define". - * For ARMGCC, open CmakeLists.txt and add the following lines, - * "SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING")" for debug target. - * "SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING")" for release target. - * For MCUxpresso, right click project and select "Properties", define it in "C/C++ Build->Settings->MCU C - * Complier->Preprocessor". - * - */ -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -/*! @brief define the transmit buffer length which is used to store the multi task log, buffer is enabled automatically - * when - * non-blocking transfer is using, - * This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement. - * If it is configured too small, log maybe missed , because the log will not be - * buffered if the buffer is full, and the print will return immediately with -1. - * And this value should be multiple of 4 to meet memory alignment. - * - */ -#ifndef DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN -#define DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN (512U) -#endif /* DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN */ - -/*! @brief define the receive buffer length which is used to store the user input, buffer is enabled automatically when - * non-blocking transfer is using, - * This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement. - * If it is configured too small, log maybe missed, because buffer will be overwrited if buffer is too small. - * And this value should be multiple of 4 to meet memory alignment. - * - */ -#ifndef DEBUG_CONSOLE_RECEIVE_BUFFER_LEN -#define DEBUG_CONSOLE_RECEIVE_BUFFER_LEN (1024U) -#endif /* DEBUG_CONSOLE_RECEIVE_BUFFER_LEN */ - -/*!@ brief Whether enable the reliable TX function - * If the macro is zero, the reliable TX function of the debug console is disabled. - * When the macro is zero, the string of PRINTF will be thrown away after the transmit buffer is full. - */ -#ifndef DEBUG_CONSOLE_TX_RELIABLE_ENABLE -#define DEBUG_CONSOLE_TX_RELIABLE_ENABLE (1U) -#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */ - -#else -#define DEBUG_CONSOLE_TRANSFER_BLOCKING -#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ - -/*!@ brief Whether enable the RX function - * If the macro is zero, the receive function of the debug console is disabled. - */ -#ifndef DEBUG_CONSOLE_RX_ENABLE -#define DEBUG_CONSOLE_RX_ENABLE (1U) -#endif /* DEBUG_CONSOLE_RX_ENABLE */ - -/*!@ brief define the MAX log length debug console support , that is when you call printf("log", x);, the log - * length can not bigger than this value. - * This macro decide the local log buffer length, the buffer locate at stack, the stack maybe overflow if - * the buffer is too big and current task stack size not big enough. - */ -#ifndef DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN -#define DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN (128U) -#endif /* DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN */ - -/*!@ brief define the buffer support buffer scanf log length, that is when you call scanf("log", &x);, the log - * length can not bigger than this value. - * As same as the DEBUG_CONSOLE_BUFFER_PRINTF_MAX_LOG_LEN. - */ -#ifndef DEBUG_CONSOLE_SCANF_MAX_LOG_LEN -#define DEBUG_CONSOLE_SCANF_MAX_LOG_LEN (20U) -#endif /* DEBUG_CONSOLE_SCANF_MAX_LOG_LEN */ - -/*! @brief Debug console synchronization - * User should not change these macro for synchronization mode, but add the - * corresponding synchronization mechanism per different software environment. - * Such as, if another RTOS is used, - * add: - * \#define DEBUG_CONSOLE_SYNCHRONIZATION_XXXX 3 - * in this configuration file and implement the synchronization in fsl.log.c. - */ -/*! @brief synchronization for baremetal software */ -#define DEBUG_CONSOLE_SYNCHRONIZATION_BM 0 -/*! @brief synchronization for freertos software */ -#define DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS 1 - -/*! @brief RTOS synchronization mechanism disable - * If not defined, default is enable, to avoid multitask log print mess. - * If other RTOS is used, you can implement the RTOS's specific synchronization mechanism in fsl.log.c - * If synchronization is disabled, log maybe messed on terminal. - */ -#ifndef DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION -#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING -#ifdef SDK_OS_FREE_RTOS -#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS -#else -#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM -#endif /* SDK_OS_FREE_RTOS */ -#else -#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM -#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */ -#endif /* DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION */ - -/*! @brief echo function support - * If you want to use the echo function,please define DEBUG_CONSOLE_ENABLE_ECHO - * at your project setting. - */ -#ifndef DEBUG_CONSOLE_ENABLE_ECHO -#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 0 -#else -#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 1 -#endif /* DEBUG_CONSOLE_ENABLE_ECHO */ - -/*********************************************************************/ - -/***************Debug console other configuration*********************/ -/*! @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 virtual com(USB CDC) as the debug console. */ -#ifndef BOARD_USE_VIRTUALCOM -#define BOARD_USE_VIRTUALCOM 0U -#endif -/*******************************************************************/ - -#endif /* _FSL_DEBUG_CONSOLE_CONF_H_ */ diff --git a/devices/MIMXRT1052/utilities/debug_console_lite/fsl_assert.c b/devices/MIMXRT1052/utilities/debug_console_lite/fsl_assert.c deleted file mode 100644 index d2cbe28..0000000 --- a/devices/MIMXRT1052/utilities/debug_console_lite/fsl_assert.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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__) */ -#endif /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */ -#endif /* NDEBUG */ diff --git a/devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.c b/devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.c deleted file mode 100644 index 790610f..0000000 --- a/devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.c +++ /dev/null @@ -1,1877 +0,0 @@ -/* - * 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; - - /* Do nothing if the debug UART is not initialized. */ - if (kSerialPort_None == s_debugConsole.type) - { - return -1; - } - va_start(ap, fmt_s); - result = DbgConsole_PrintfFormattedData(DbgConsole_Putchar, fmt_s, ap); - va_end(ap); - - 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_ptr, ...) -{ - /* 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_ptr); - 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_ptr, 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 - int64_t a; - int64_t b; - int64_t c; - - uint64_t ua; - uint64_t ub; - uint64_t uc; -#else - int32_t a; - int32_t b; - int32_t c; - - uint32_t ua; - uint32_t ub; - uint32_t uc; -#endif /* PRINTF_ADVANCED_ENABLE */ - - int32_t nlen; - char *nstrp; - - nlen = 0; - nstrp = numstr; - *nstrp++ = '\0'; - -#if !(PRINTF_ADVANCED_ENABLE > 0) - neg = 0; -#endif - - if (0 != neg) - { -#if PRINTF_ADVANCED_ENABLE - a = *(int64_t *)nump; -#else - a = *(int32_t *)nump; -#endif /* PRINTF_ADVANCED_ENABLE */ - if (a == 0) - { - *nstrp = '0'; - ++nlen; - return nlen; - } - while (a != 0) - { -#if PRINTF_ADVANCED_ENABLE - b = (int64_t)a / (int64_t)radix; - c = (int64_t)a - ((int64_t)b * (int64_t)radix); - if (c < 0) - { - c = (int64_t)'0' - c; - } -#else - b = a / radix; - c = a - (b * radix); - if (c < 0) - { - c = (int32_t)'0' - c; - } -#endif /* PRINTF_ADVANCED_ENABLE */ - else - { - c = c + '0'; - } - a = b; - *nstrp++ = (char)c; - ++nlen; - } - } - else - { -#if PRINTF_ADVANCED_ENABLE - ua = *(uint64_t *)nump; -#else - ua = *(uint32_t *)nump; -#endif /* PRINTF_ADVANCED_ENABLE */ - if (ua == 0U) - { - *nstrp = '0'; - ++nlen; - return nlen; - } - while (ua != 0U) - { -#if PRINTF_ADVANCED_ENABLE - ub = (uint64_t)ua / (uint64_t)radix; - uc = (uint64_t)ua - ((uint64_t)ub * (uint64_t)radix); -#else - ub = ua / (uint32_t)radix; - uc = ua - (ub * (uint32_t)radix); -#endif /* PRINTF_ADVANCED_ENABLE */ - - if (uc < 10U) - { - uc = uc + '0'; - } - else - { - uc = uc - 10U + (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)(int64_t)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_ptr Format string for printf. - * @param[in] args_ptr 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; - int64_t ival; - uint64_t uval = 0; - bool valid_precision_width; -#else - int32_t ival; - uint32_t 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, uint32_t); - } -#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, uint32_t); - 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 = (int64_t)va_arg(ap, int64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - ival = (int32_t)va_arg(ap, int32_t); - } - 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 = (uint64_t)va_arg(ap, uint64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - uval = (uint32_t)va_arg(ap, uint32_t); - } - 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 PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) - { - uval = (uint64_t)va_arg(ap, uint64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - uval = (uint32_t)va_arg(ap, uint32_t); - } - 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, uint32_t); - (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/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.h b/devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.h deleted file mode 100644 index 755b434..0000000 --- a/devices/MIMXRT1052/utilities/debug_console_lite/fsl_debug_console.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - * 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 -#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 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_ptr Format control string. - * @return Returns the number of fields successfully converted and assigned. - */ -int DbgConsole_Scanf(char *fmt_ptr, ...); - -/*! - * @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/MIMXRT1052/utilities/fsl_assert.c b/devices/MIMXRT1052/utilities/fsl_assert.c deleted file mode 100644 index d2cbe28..0000000 --- a/devices/MIMXRT1052/utilities/fsl_assert.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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__) */ -#endif /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */ -#endif /* NDEBUG */ diff --git a/devices/MIMXRT1052/utilities/fsl_notifier.c b/devices/MIMXRT1052/utilities/fsl_notifier.c deleted file mode 100644 index 7b7c02d..0000000 --- a/devices/MIMXRT1052/utilities/fsl_notifier.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_notifier.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/******************************************************************************* - * Prototypes - ******************************************************************************/ - -/******************************************************************************* - * Variables - ******************************************************************************/ - -/******************************************************************************* - * Code - ******************************************************************************/ - -/*! - * brief Creates a Notifier handle. - * - * param notifierHandle A pointer to the notifier handle. - * param configs A pointer to an array with references to all configurations which is handled by the Notifier. - * param configsNumber Number of configurations. Size of the configuration array. - * param callbacks A pointer to an array of callback configurations. - * If there are no callbacks to register during Notifier initialization, use NULL value. - * param callbacksNumber Number of registered callbacks. Size of the callbacks array. - * param userFunction User function. - * param userData User data passed to user function. - * return An error Code or kStatus_Success. - */ -status_t NOTIFIER_CreateHandle(notifier_handle_t *notifierHandle, - notifier_user_config_t **configs, - uint8_t configsNumber, - notifier_callback_config_t *callbacks, - uint8_t callbacksNumber, - notifier_user_function_t userFunction, - void *userData) -{ - /* Check input parameter - at least one configuration is required and userFunction must exist */ - if ((configs == NULL) || (configsNumber == 0U) || (userFunction == NULL)) - { - return kStatus_Fail; - } - /* Initialize handle structure */ - (void)memset(notifierHandle, 0, sizeof(notifier_handle_t)); - /* Store references to user-defined configurations */ - notifierHandle->configsTable = configs; - notifierHandle->configsNumber = configsNumber; - /* Store references to user-defined callback configurations */ - if (callbacks != NULL) - { - notifierHandle->callbacksTable = callbacks; - notifierHandle->callbacksNumber = callbacksNumber; - /* If all callbacks return success, then the errorCallbackIndex is callbacksNumber */ - notifierHandle->errorCallbackIndex = callbacksNumber; - } - notifierHandle->userFunction = userFunction; - notifierHandle->userData = userData; - - return kStatus_Success; -} - -/*! - * brief Switches the configuration according to a pre-defined structure. - * - * This function sets the system to the target configuration. Before transition, - * the Notifier sends notifications to all callbacks registered to the callback table. - * Callbacks are invoked in the following order: All registered callbacks are notified - * ordered by index in the callbacks array. The same order is used for before and after switch notifications. - * The notifications before the configuration switch can be used to obtain confirmation about - * the change from registered callbacks. If any registered callback denies the - * configuration change, further execution of this function depends on the notifier policy: the - * configuration change is either forced (kNOTIFIER_PolicyForcible) or exited (kNOTIFIER_PolicyAgreement). - * When configuration change is forced, the result of the before switch notifications are ignored. If an - * agreement is required, if any callback returns an error code, further notifications - * before switch notifications are cancelled and all already notified callbacks are re-invoked. - * The index of the callback which returned error code during pre-switch notifications is stored - * (any error codes during callbacks re-invocation are ignored) and NOTIFIER_GetErrorCallback() can be used to get it. - * Regardless of the policies, if any callback returns an error code, an error code indicating in which phase - * the error occurred is returned when NOTIFIER_SwitchConfig() exits. - * param notifierHandle pointer to notifier handle - * param configIndex Index of the target configuration. - * param policy Transaction policy, kNOTIFIER_PolicyAgreement or kNOTIFIER_PolicyForcible. - * - * return An error code or kStatus_Success. - * - */ -status_t NOTIFIER_SwitchConfig(notifier_handle_t *notifierHandle, uint8_t configIndex, notifier_policy_t policy) -{ - uint8_t currentStaticCallback = 0U; /* Index to array of statically registered call-backs */ - status_t returnCode = kStatus_Success; /* Function return */ - - notifier_notification_block_t notifyBlock; /* Callback notification block */ - notifier_callback_config_t *callbackConfig; /* Pointer to callback configuration */ - - /* Set errorcallbackindex as callbacksNumber, which means no callback error now */ - notifierHandle->errorCallbackIndex = notifierHandle->callbacksNumber; - - /* Requested configuration availability check */ - if (configIndex >= notifierHandle->configsNumber) - { - return kStatus_OutOfRange; - } - - /* Initialization of local variables from the Notifier handle structure */ - - notifyBlock.policy = policy; - notifyBlock.targetConfig = notifierHandle->configsTable[configIndex]; - notifyBlock.notifyType = kNOTIFIER_NotifyBefore; - - /* From all statically registered call-backs... */ - for (currentStaticCallback = 0U; currentStaticCallback < notifierHandle->callbacksNumber; currentStaticCallback++) - { - callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); - /* ...notify only those which asked to be called before the configuration switch */ - if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackBefore) != 0U) - { - /* In case that call-back returned error code mark it, store the call-back handle and eventually cancel - * the configuration switch */ - if (callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData) != kStatus_Success) - { - returnCode = (status_t)kStatus_NOTIFIER_ErrorNotificationBefore; - notifierHandle->errorCallbackIndex = currentStaticCallback; - /* If not forcing configuration switch, call all already notified call-backs to revert their state - * as the switch is canceled */ - if (policy != kNOTIFIER_PolicyForcible) - { - break; - } - } - } - } - - /* Set configuration */ - - /* In case that any call-back returned error code and policy doesn't force the configuration set, go to after - * switch call-backs */ - if ((policy == kNOTIFIER_PolicyForcible) || (returnCode == kStatus_Success)) - { - returnCode = notifierHandle->userFunction(notifierHandle->configsTable[configIndex], notifierHandle->userData); - if (returnCode != kStatus_Success) - { - return returnCode; - } - /* Update current configuration index */ - notifierHandle->currentConfigIndex = configIndex; - notifyBlock.notifyType = kNOTIFIER_NotifyAfter; - /* From all statically registered call-backs... */ - for (currentStaticCallback = 0U; currentStaticCallback < notifierHandle->callbacksNumber; - currentStaticCallback++) - { - callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); - /* ...notify only those which asked to be called after the configuration switch */ - if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackAfter) != 0U) - { - /* In case that call-back returned error code mark it and store the call-back handle */ - if (callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData) != kStatus_Success) - { - returnCode = (status_t)kStatus_NOTIFIER_ErrorNotificationAfter; - notifierHandle->errorCallbackIndex = currentStaticCallback; - if (policy != kNOTIFIER_PolicyForcible) - { - break; - } - } - } - } - } - else - { - /* End of unsuccessful switch */ - notifyBlock.notifyType = kNOTIFIER_NotifyRecover; - while (currentStaticCallback-- > 0U) - { - callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); - if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackBefore) != 0U) - { - (void)callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData); - } - } - } - - return returnCode; -} - -/*! - * brief This function returns the last failed notification callback. - * - * This function returns an index of the last callback that failed during the configuration switch while - * the last NOTIFIER_SwitchConfig() was called. If the last NOTIFIER_SwitchConfig() call ended successfully - * value equal to callbacks number is returned. The returned value represents an index in the array of - * static call-backs. - * - * param notifierHandle Pointer to the notifier handle - * return Callback Index of the last failed callback or value equal to callbacks count. - */ -uint8_t NOTIFIER_GetErrorCallbackIndex(notifier_handle_t *notifierHandle) -{ - return notifierHandle->errorCallbackIndex; -} diff --git a/devices/MIMXRT1052/utilities/fsl_notifier.h b/devices/MIMXRT1052/utilities/fsl_notifier.h deleted file mode 100644 index d93578c..0000000 --- a/devices/MIMXRT1052/utilities/fsl_notifier.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _FSL_NOTIFIER_H_ -#define _FSL_NOTIFIER_H_ - -#include "fsl_common.h" -/*! - * @addtogroup notifier - * @{ - */ - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! - * @brief Notifier error codes. - * - * Used as return value of Notifier functions. - */ -enum _notifier_status -{ - kStatus_NOTIFIER_ErrorNotificationBefore = - MAKE_STATUS(kStatusGroup_NOTIFIER, 0), /*!< An error occurs during send "BEFORE" notification. */ - kStatus_NOTIFIER_ErrorNotificationAfter = - MAKE_STATUS(kStatusGroup_NOTIFIER, 1), /*!< An error occurs during send "AFTER" notification. */ -}; - -/*! - * @brief Notifier policies. - * - * Defines whether the user function execution is forced or not. - * For kNOTIFIER_PolicyForcible, the user function is executed regardless of the callback results, - * while kNOTIFIER_PolicyAgreement policy is used to exit NOTIFIER_SwitchConfig() - * when any of the callbacks returns error code. - * See also NOTIFIER_SwitchConfig() description. - */ -typedef enum _notifier_policy -{ - kNOTIFIER_PolicyAgreement, /*!< NOTIFIER_SwitchConfig() method is exited when any of the callbacks returns error - code. */ - kNOTIFIER_PolicyForcible, /*!< The user function is executed regardless of the results. */ -} notifier_policy_t; - -/*! @brief Notification type. Used to notify registered callbacks */ -typedef enum _notifier_notification_type -{ - kNOTIFIER_NotifyRecover = 0x00U, /*!< Notify IP to recover to previous work state. */ - kNOTIFIER_NotifyBefore = 0x01U, /*!< Notify IP that configuration setting is going to change. */ - kNOTIFIER_NotifyAfter = 0x02U, /*!< Notify IP that configuration setting has been changed. */ -} notifier_notification_type_t; - -/*! - * @brief The callback type, which indicates kinds of notification the callback handles. - * - * Used in the callback configuration structure (notifier_callback_config_t) - * to specify when the registered callback is called during configuration switch initiated by the - * NOTIFIER_SwitchConfig(). - * Callback can be invoked in following situations. - * - Before the configuration switch (Callback return value can affect NOTIFIER_SwitchConfig() - * execution. See the NOTIFIER_SwitchConfig() and notifier_policy_t documentation). - * - After an unsuccessful attempt to switch configuration - * - After a successful configuration switch - */ -typedef enum _notifier_callback_type -{ - kNOTIFIER_CallbackBefore = 0x01U, /*!< Callback handles BEFORE notification. */ - kNOTIFIER_CallbackAfter = 0x02U, /*!< Callback handles AFTER notification. */ - kNOTIFIER_CallbackBeforeAfter = 0x03U, /*!< Callback handles BEFORE and AFTER notification. */ -} notifier_callback_type_t; - -/*! @brief Notifier user configuration type. - * - * Reference of the user defined configuration is stored in an array; the notifier switches between these configurations - * based on this array. - */ -typedef void notifier_user_config_t; - -/*! @brief Notifier user function prototype - * Use this function to execute specific operations in configuration switch. - * Before and after this function execution, different notification is sent to registered callbacks. - * If this function returns any error code, NOTIFIER_SwitchConfig() exits. - * - * @param targetConfig target Configuration. - * @param userData Refers to other specific data passed to user function. - * @return An error code or kStatus_Success. - */ -typedef status_t (*notifier_user_function_t)(notifier_user_config_t *targetConfig, void *userData); - -/*! @brief notification block passed to the registered callback function. */ -typedef struct _notifier_notification_block -{ - notifier_user_config_t *targetConfig; /*!< Pointer to target configuration. */ - notifier_policy_t policy; /*!< Configure transition policy. */ - notifier_notification_type_t notifyType; /*!< Configure notification type. */ -} notifier_notification_block_t; - -/*! - * @brief Callback prototype. - * - * Declaration of a callback. It is common for registered callbacks. - * Reference to function of this type is part of the notifier_callback_config_t callback configuration structure. - * Depending on callback type, function of this prototype is called (see NOTIFIER_SwitchConfig()) - * before configuration switch, after it or in both use cases to notify about - * the switch progress (see notifier_callback_type_t). When called, the type of the notification - * is passed as a parameter along with the reference to the target configuration structure (see - * notifier_notification_block_t) and any data passed during the callback registration. When notified before the - * configuration switch, depending on the configuration switch policy (see notifier_policy_t), the callback may deny the - * execution of the user function by returning an error code different than kStatus_Success (see - * NOTIFIER_SwitchConfig()). - * - * @param notify Notification block. - * @param data Callback data. Refers to the data passed during callback registration. Intended to - * pass any driver or application data such as internal state information. - * @return An error code or kStatus_Success. - */ -typedef status_t (*notifier_callback_t)(notifier_notification_block_t *notify, void *data); - -/*! - * @brief Callback configuration structure. - * - * This structure holds the configuration of callbacks. - * Callbacks of this type are expected to be statically allocated. - * This structure contains the following application-defined data. - * callback - pointer to the callback function - * callbackType - specifies when the callback is called - * callbackData - pointer to the data passed to the callback. - */ -typedef struct _notifier_callback_config -{ - notifier_callback_t callback; /*!< Pointer to the callback function. */ - notifier_callback_type_t callbackType; /*!< Callback type. */ - void *callbackData; /*!< Pointer to the data passed to the callback. */ -} notifier_callback_config_t; - -/*! - * @brief Notifier handle structure. - * - * Notifier handle structure. Contains data necessary for the Notifier proper function. - * Stores references to registered configurations, callbacks, information about their numbers, - * user function, user data, and other internal data. - * NOTIFIER_CreateHandle() must be called to initialize this handle. - */ -typedef struct _notifier_handle -{ - notifier_user_config_t **configsTable; /*!< Pointer to configure table. */ - uint8_t configsNumber; /*!< Number of configurations. */ - notifier_callback_config_t *callbacksTable; /*!< Pointer to callback table. */ - uint8_t callbacksNumber; /*!< Maximum number of callback configurations. */ - uint8_t errorCallbackIndex; /*!< Index of callback returns error. */ - uint8_t currentConfigIndex; /*!< Index of current configuration. */ - notifier_user_function_t userFunction; /*!< User function. */ - void *userData; /*!< User data passed to user function. */ -} notifier_handle_t; - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! - * @brief Creates a Notifier handle. - * - * @param notifierHandle A pointer to the notifier handle. - * @param configs A pointer to an array with references to all configurations which is handled by the Notifier. - * @param configsNumber Number of configurations. Size of the configuration array. - * @param callbacks A pointer to an array of callback configurations. - * If there are no callbacks to register during Notifier initialization, use NULL value. - * @param callbacksNumber Number of registered callbacks. Size of the callbacks array. - * @param userFunction User function. - * @param userData User data passed to user function. - * @return An error Code or kStatus_Success. - */ -status_t NOTIFIER_CreateHandle(notifier_handle_t *notifierHandle, - notifier_user_config_t **configs, - uint8_t configsNumber, - notifier_callback_config_t *callbacks, - uint8_t callbacksNumber, - notifier_user_function_t userFunction, - void *userData); - -/*! - * @brief Switches the configuration according to a pre-defined structure. - * - * This function sets the system to the target configuration. Before transition, - * the Notifier sends notifications to all callbacks registered to the callback table. - * Callbacks are invoked in the following order: All registered callbacks are notified - * ordered by index in the callbacks array. The same order is used for before and after switch notifications. - * The notifications before the configuration switch can be used to obtain confirmation about - * the change from registered callbacks. If any registered callback denies the - * configuration change, further execution of this function depends on the notifier policy: the - * configuration change is either forced (kNOTIFIER_PolicyForcible) or exited (kNOTIFIER_PolicyAgreement). - * When configuration change is forced, the result of the before switch notifications are ignored. If an - * agreement is required, if any callback returns an error code, further notifications - * before switch notifications are cancelled and all already notified callbacks are re-invoked. - * The index of the callback which returned error code during pre-switch notifications is stored - * (any error codes during callbacks re-invocation are ignored) and NOTIFIER_GetErrorCallback() can be used to get it. - * Regardless of the policies, if any callback returns an error code, an error code indicating in which phase - * the error occurred is returned when NOTIFIER_SwitchConfig() exits. - * @param notifierHandle pointer to notifier handle - * @param configIndex Index of the target configuration. - * @param policy Transaction policy, kNOTIFIER_PolicyAgreement or kNOTIFIER_PolicyForcible. - * - * @return An error code or kStatus_Success. - * - */ -status_t NOTIFIER_SwitchConfig(notifier_handle_t *notifierHandle, uint8_t configIndex, notifier_policy_t policy); - -/*! - * @brief This function returns the last failed notification callback. - * - * This function returns an index of the last callback that failed during the configuration switch while - * the last NOTIFIER_SwitchConfig() was called. If the last NOTIFIER_SwitchConfig() call ended successfully - * value equal to callbacks number is returned. The returned value represents an index in the array of - * static call-backs. - * - * @param notifierHandle Pointer to the notifier handle - * @return Callback Index of the last failed callback or value equal to callbacks count. - */ -uint8_t NOTIFIER_GetErrorCallbackIndex(notifier_handle_t *notifierHandle); - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @}*/ - -#endif /* _FSL_NOTIFIER_H_ */ diff --git a/devices/MIMXRT1052/utilities/fsl_sbrk.c b/devices/MIMXRT1052/utilities/fsl_sbrk.c deleted file mode 100644 index 5727b2f..0000000 --- a/devices/MIMXRT1052/utilities/fsl_sbrk.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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/MIMXRT1052/utilities/fsl_shell.c b/devices/MIMXRT1052/utilities/fsl_shell.c deleted file mode 100644 index de25d5d..0000000 --- a/devices/MIMXRT1052/utilities/fsl_shell.c +++ /dev/null @@ -1,1070 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2021 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - * POSIX getopt for Windows - * Code given out at the 1985 UNIFORUM conference in Dallas. - * - * From std-unix@ut-sally.UUCP (Moderator, John Quarterman) Sun Nov 3 14:34:15 1985 - * Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site gatech.CSNET - * Posting-Version: version B 2.10.2 9/18/84; site ut-sally.UUCP - * Path: gatech!akgua!mhuxv!mhuxt!mhuxr!ulysses!allegra!mit-eddie!genrad!panda!talcott!harvard!seismo!ut-sally!std-unix - * From: std-unix@ut-sally.UUCP (Moderator, John Quarterman) - * Newsgroups: mod.std.unix - * Subject: public domain AT&T getopt source - * Message-ID: <3352@ut-sally.UUCP> - * Date: 3 Nov 85 19:34:15 GMT - * Date-Received: 4 Nov 85 12:25:09 GMT - * Organization: IEEE/P1003 Portable Operating System Environment Committee - * Lines: 91 - * Approved: jsq@ut-sally.UUC - * Here's something you've all been waiting for: the AT&T public domain - * source for getopt(3). It is the code which was given out at the 1985 - * UNIFORUM conference in Dallas. I obtained it by electronic mail - * directly from AT&T. The people there assure me that it is indeed - * in the public domain - * There is no manual page. That is because the one they gave out at - * UNIFORUM was slightly different from the current System V Release 2 - * manual page. The difference apparently involved a note about the - * famous rules 5 and 6, recommending using white space between an option - * and its first argument, and not grouping options that have arguments. - * Getopt itself is currently lenient about both of these things White - * space is allowed, but not mandatory, and the last option in a group can - * have an argument. That particular version of the man page evidently - * has no official existence, and my source at AT&T did not send a copy. - * The current SVR2 man page reflects the actual behavor of this getopt. - * However, I am not about to post a copy of anything licensed by AT&T. - */ - -#include -#include -#include -#include - -#include "fsl_common.h" -#include "fsl_str.h" - -#include "fsl_component_generic_list.h" -#include "fsl_component_serial_manager.h" - -#include "fsl_shell.h" - -/* - * The OSA_USED macro can only be defined when the OSA component is used. - * If the source code of the OSA component does not exist, the OSA_USED cannot be defined. - * OR, If OSA component is not added into project event the OSA source code exists, the OSA_USED - * also cannot be defined. - * The source code path of the OSA component is /components/osa. - * - */ -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) -#include "fsl_component_common_task.h" -#else -#include "fsl_os_abstraction.h" -#endif - -#endif - -/******************************************************************************* - * Definitions - ******************************************************************************/ -#define KEY_ESC (0x1BU) -#define KET_DEL (0x7FU) - -#define SHELL_EVENT_DATA_ARRIVED (1U << 0) -#define SHELL_EVENT_DATA_SENT (1U << 1) - -#define SHELL_SPRINTF_BUFFER_SIZE (64U) - -/*! @brief A type for the handle special key. */ -typedef enum _fun_key_status -{ - kSHELL_Normal = 0U, /*!< Normal key */ - kSHELL_Special = 1U, /*!< Special key */ - kSHELL_Function = 2U, /*!< Function key */ -} fun_key_status_t; - -/*! @brief Data structure for Shell environment. */ -typedef struct _shell_context_handle -{ - list_label_t commandContextListHead; /*!< Command shellContextHandle list queue head */ - serial_handle_t serialHandle; /*!< Serial manager handle */ - uint8_t - serialWriteHandleBuffer[SERIAL_MANAGER_WRITE_HANDLE_SIZE]; /*!< The buffer for serial manager write handle */ - serial_write_handle_t serialWriteHandle; /*!< The serial manager write handle */ - uint8_t serialReadHandleBuffer[SERIAL_MANAGER_READ_HANDLE_SIZE]; /*!< The buffer for serial manager read handle */ - serial_read_handle_t serialReadHandle; /*!< The serial manager read handle */ - char *prompt; /*!< Prompt string */ -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) - common_task_message_t commontaskMsg; /*!< Message for common task */ -#else - uint8_t event[OSA_EVENT_HANDLE_SIZE]; /*!< Event instance */ - uint8_t taskId[OSA_TASK_HANDLE_SIZE]; /*!< Task handle */ -#endif - -#endif - -#endif - char line[SHELL_BUFFER_SIZE]; /*!< Consult buffer */ - char hist_buf[SHELL_HISTORY_COUNT][SHELL_BUFFER_SIZE]; /*!< History buffer*/ - char printBuffer[SHELL_SPRINTF_BUFFER_SIZE]; /*!< Buffer for print */ - uint32_t printLength; /*!< All length has been printed */ - uint16_t hist_current; /*!< Current history command in hist buff*/ - uint16_t hist_count; /*!< Total history command in hist buff*/ - enum _fun_key_status stat; /*!< Special key status */ - uint8_t cmd_num; /*!< Number of user commands */ - uint8_t l_pos; /*!< Total line position */ - uint8_t c_pos; /*!< Current line position */ - volatile uint8_t notificationPost; /*!< The serial manager notification is post */ - uint8_t exit; /*!< Exit Flag*/ - uint8_t printBusy; /*!< Print is busy */ -} shell_context_handle_t; - -#if 0 -#define SHELL_STRUCT_OFFSET(type, field) ((size_t) & (((type *)0)->field)) -#define SHEEL_COMMAND_POINTER(node) \ - ((shell_command_t *)(((uint32_t)(node)) - SHELL_STRUCT_OFFSET(shell_command_t, link))) -#else -#define SHEEL_COMMAND_POINTER(node) \ - ((shell_command_t *)(((uint32_t)(node)) - (sizeof(shell_command_t) - sizeof(list_element_t)))) -#endif -/******************************************************************************* - * Prototypes - ******************************************************************************/ -static shell_status_t SHELL_HelpCommand(shell_handle_t shellHandle, int32_t argc, char **argv); /*!< help command */ - -static shell_status_t SHELL_ExitCommand(shell_handle_t shellHandle, int32_t argc, char **argv); /*!< exit command */ - -static int32_t SHELL_ParseLine(const char *cmd, uint32_t len, char *argv[]); /*!< parse line command */ - -static int32_t SHELL_StringCompare(const char *str1, const char *str2, int32_t count); /*!< compare string command */ - -static void SHELL_ProcessCommand(shell_context_handle_t *shellContextHandle, const char *cmd); /*!< process a command */ - -static void SHELL_GetHistoryCommand(shell_context_handle_t *shellContextHandle, - uint8_t hist_pos); /*!< get commands history */ - -static void SHELL_AutoComplete(shell_context_handle_t *shellContextHandle); /*!< auto complete command */ - -static shell_status_t SHELL_GetChar(shell_context_handle_t *shellContextHandle, - uint8_t *ch); /*!< get a char from communication interface */ - -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) -static void SHELL_Task(void *param); /*!< Shell task*/ -#endif - -/******************************************************************************* - * Variables - ******************************************************************************/ - -static SHELL_COMMAND_DEFINE(help, "\r\n\"help\": List all the registered commands\r\n", SHELL_HelpCommand, 0); -static SHELL_COMMAND_DEFINE(exit, "\r\n\"exit\": Exit program\r\n", SHELL_ExitCommand, 0); - -static char s_paramBuffer[SHELL_BUFFER_SIZE]; - -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) -#if defined(OSA_USED) -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) -#else -/* - * \brief Defines the serial manager task's stack - */ -static OSA_TASK_DEFINE(SHELL_Task, SHELL_TASK_PRIORITY, 1, SHELL_TASK_STACK_SIZE, false); -#endif -#endif /* OSA_USED */ -#endif /* SHELL_NON_BLOCKING_MODE */ -/******************************************************************************* - * Code - ******************************************************************************/ - -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) -static void SHELL_SerialManagerRxCallback(void *callbackParam, - serial_manager_callback_message_t *message, - serial_manager_status_t status) -{ - shell_context_handle_t *shellHandle; - - assert(callbackParam); - assert(message); - - shellHandle = (shell_context_handle_t *)callbackParam; - - if (0U == shellHandle->notificationPost) - { - shellHandle->notificationPost = 1U; -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) - shellHandle->commontaskMsg.callback = SHELL_Task; - shellHandle->commontaskMsg.callbackParam = shellHandle; - (void)COMMON_TASK_post_message(&shellHandle->commontaskMsg); -#else - (void)OSA_EventSet((osa_event_handle_t)shellHandle->event, SHELL_EVENT_DATA_ARRIVED); -#endif - -#else - SHELL_Task(shellHandle); -#endif - } -} -#endif - -static void SHELL_WriteBuffer(char *buffer, int32_t *indicator, char val, int len) -{ - shell_context_handle_t *shellContextHandle; - int i = 0; - shellContextHandle = (shell_context_handle_t *)(void *)buffer; - - for (i = 0; i < len; i++) - { - if ((*indicator + 1) >= (int32_t)SHELL_SPRINTF_BUFFER_SIZE) - { -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == shellContextHandle->serialHandle) - { - for (uint32_t index = 0; index < ((uint32_t)*indicator); index++) - { - (void)putchar(shellContextHandle->printBuffer[index]); - } - } - else -#endif - { - (void)SerialManager_WriteBlocking(shellContextHandle->serialWriteHandle, - (uint8_t *)shellContextHandle->printBuffer, (uint32_t)*indicator); - } - - shellContextHandle->printLength += (uint32_t)*indicator; - *indicator = 0; - } - - shellContextHandle->printBuffer[*indicator] = val; - (*indicator)++; - } -} - -static int SHELL_Sprintf(void *buffer, const char *formatString, va_list ap) -{ - shell_context_handle_t *shellContextHandle; - uint32_t length; - shellContextHandle = (shell_context_handle_t *)buffer; - - length = (uint32_t)StrFormatPrintf(formatString, ap, (char *)buffer, SHELL_WriteBuffer); - shellContextHandle->printLength += length; - return (int32_t)length; -} - -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) -static void SHELL_Task(void *param) -#else -void SHELL_Task(shell_handle_t shellHandle) -#endif -{ -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - shell_context_handle_t *shellContextHandle = (shell_context_handle_t *)param; -#else - shell_context_handle_t *shellContextHandle = (shell_context_handle_t *)shellHandle; -#endif - uint8_t ch; - - if (NULL != shellContextHandle) - { -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) -#else - osa_event_flags_t ev = 0; - - do - { - if (KOSA_StatusSuccess == OSA_EventWait((osa_event_handle_t)shellContextHandle->event, osaEventFlagsAll_c, - 0U, osaWaitForever_c, &ev)) - { - if (0U != (ev & SHELL_EVENT_DATA_ARRIVED)) -#endif - -#endif - -#endif - { - shellContextHandle->notificationPost = 0; - do - { - if ((bool)shellContextHandle->exit) - { - if (shellContextHandle->serialReadHandle != NULL) - { - (void)SerialManager_CloseReadHandle(shellContextHandle->serialReadHandle); - shellContextHandle->serialReadHandle = NULL; - } - if (shellContextHandle->serialWriteHandle != NULL) - { - (void)SerialManager_CloseWriteHandle(shellContextHandle->serialWriteHandle); - shellContextHandle->serialWriteHandle = NULL; - } - break; - } - if (kStatus_SHELL_Success != (shell_status_t)SHELL_GetChar(shellContextHandle, &ch)) - { - /* If error occurred when getting a char, exit the task and waiting the new data arriving. */ - break; - } - - /* Special key */ - if (ch == KEY_ESC) - { - shellContextHandle->stat = kSHELL_Special; - continue; - } - else if (shellContextHandle->stat == kSHELL_Special) - { - /* Function key */ - if ((char)ch == '[') - { - shellContextHandle->stat = kSHELL_Function; - continue; - } - shellContextHandle->stat = kSHELL_Normal; - } - else if (shellContextHandle->stat == kSHELL_Function) - { - shellContextHandle->stat = kSHELL_Normal; - - switch ((char)ch) - { - /* History operation here */ - case 'A': /* Up key */ - SHELL_GetHistoryCommand(shellContextHandle, (uint8_t)shellContextHandle->hist_current); - if (shellContextHandle->hist_current < (shellContextHandle->hist_count - 1U)) - { - shellContextHandle->hist_current++; - } - break; - case 'B': /* Down key */ - SHELL_GetHistoryCommand(shellContextHandle, (uint8_t)shellContextHandle->hist_current); - if (shellContextHandle->hist_current > 0U) - { - shellContextHandle->hist_current--; - } - break; - case 'D': /* Left key */ - if ((bool)shellContextHandle->c_pos) - { - (void)SHELL_Write(shellContextHandle, "\b", 1); - shellContextHandle->c_pos--; - } - break; - case 'C': /* Right key */ - if (shellContextHandle->c_pos < shellContextHandle->l_pos) - { - (void)SHELL_Write(shellContextHandle, - &shellContextHandle->line[shellContextHandle->c_pos], 1); - shellContextHandle->c_pos++; - } - break; - default: - /* MISRA C-2012 Rule 16.4 */ - break; - } - continue; - } - /* Handle tab key */ - else if ((char)ch == '\t') - { -#if SHELL_AUTO_COMPLETE - /* Move the cursor to the beginning of line */ - uint32_t i; - for (i = 0; i < (uint32_t)shellContextHandle->c_pos; i++) - { - (void)SHELL_Write(shellContextHandle, "\b", 1); - } - /* Do auto complete */ - SHELL_AutoComplete(shellContextHandle); - /* Move position to end */ - shellContextHandle->l_pos = (uint8_t)strlen(shellContextHandle->line); - shellContextHandle->c_pos = shellContextHandle->l_pos; -#endif - continue; - } - /* Handle backspace key */ - else if ((ch == KET_DEL) || ((char)ch == '\b')) - { - /* There must be at last one char */ - if (shellContextHandle->c_pos == 0U) - { - continue; - } - - shellContextHandle->l_pos--; - shellContextHandle->c_pos--; - - if (shellContextHandle->l_pos > shellContextHandle->c_pos) - { - (void)memmove(&shellContextHandle->line[shellContextHandle->c_pos], - &shellContextHandle->line[shellContextHandle->c_pos + 1U], - (uint32_t)shellContextHandle->l_pos - (uint32_t)shellContextHandle->c_pos); - shellContextHandle->line[shellContextHandle->l_pos] = '\0'; - (void)SHELL_Write(shellContextHandle, "\b", 1); - (void)SHELL_Write(shellContextHandle, &shellContextHandle->line[shellContextHandle->c_pos], - strlen(&shellContextHandle->line[shellContextHandle->c_pos])); - (void)SHELL_Write(shellContextHandle, " \b", 3); - - /* Reset position */ - uint32_t i; - for (i = (uint32_t)shellContextHandle->c_pos; i <= (uint32_t)shellContextHandle->l_pos; i++) - { - (void)SHELL_Write(shellContextHandle, "\b", 1); - } - } - else /* Normal backspace operation */ - { - (void)SHELL_Write(shellContextHandle, "\b \b", 3); - shellContextHandle->line[shellContextHandle->l_pos] = '\0'; - } - continue; - } - else - { - /* MISRA C-2012 Rule 15.7 */ - } - - /* Input too long */ - if (shellContextHandle->l_pos >= (SHELL_BUFFER_SIZE - 1U)) - { - shellContextHandle->l_pos = 0U; - } - - /* Handle end of line, break */ - if (((char)ch == '\r') || ((char)ch == '\n')) - { - static char endoflinechar = '\0'; - - if (((uint8_t)endoflinechar != 0U) && ((uint8_t)endoflinechar != ch)) - { - continue; - } - else - { - endoflinechar = (char)ch; - /* Print new line. */ - (void)SHELL_Write(shellContextHandle, "\r\n", 2U); - /* If command line is not NULL, will start process it. */ - if (0U != strlen(shellContextHandle->line)) - { - SHELL_ProcessCommand(shellContextHandle, shellContextHandle->line); - } - /* Print prompt. */ - (void)SHELL_Write(shellContextHandle, shellContextHandle->prompt, - strlen(shellContextHandle->prompt)); - /* Reset all params */ - shellContextHandle->c_pos = shellContextHandle->l_pos = 0; - shellContextHandle->hist_current = 0; - (void)memset(shellContextHandle->line, 0, sizeof(shellContextHandle->line)); - continue; - } - } - - /* Normal character */ - if (shellContextHandle->c_pos < shellContextHandle->l_pos) - { - (void)memmove(&shellContextHandle->line[shellContextHandle->c_pos + 1U], - &shellContextHandle->line[shellContextHandle->c_pos], - (uint32_t)shellContextHandle->l_pos - (uint32_t)shellContextHandle->c_pos); - shellContextHandle->line[shellContextHandle->c_pos] = (char)ch; - (void)SHELL_Write(shellContextHandle, &shellContextHandle->line[shellContextHandle->c_pos], - strlen(&shellContextHandle->line[shellContextHandle->c_pos])); - /* Move the cursor to new position */ - uint32_t i; - for (i = (uint32_t)shellContextHandle->c_pos; i < (uint32_t)shellContextHandle->l_pos; i++) - { - (void)SHELL_Write(shellContextHandle, "\b", 1); - } - } - else - { - shellContextHandle->line[shellContextHandle->l_pos] = (char)ch; - (void)SHELL_Write(shellContextHandle, &shellContextHandle->line[shellContextHandle->l_pos], 1); - } - - ch = 0; - shellContextHandle->l_pos++; - shellContextHandle->c_pos++; - } while (0U == shellContextHandle->exit); - } -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) -#else - } - } while (1U == gUseRtos_c); /* USE_RTOS = 0 for BareMetal and 1 for OS */ -#endif - -#endif - -#endif - } -} - -static shell_status_t SHELL_HelpCommand(shell_handle_t shellHandle, int32_t argc, char **argv) -{ - shell_context_handle_t *shellContextHandle = (shell_context_handle_t *)shellHandle; - shell_command_t *shellCommandContextHandle; - list_element_handle_t p = LIST_GetHead(&shellContextHandle->commandContextListHead); - - while (p != NULL) - { - shellCommandContextHandle = SHEEL_COMMAND_POINTER(p); - if ((shellCommandContextHandle->pcHelpString != NULL) && (bool)strlen(shellCommandContextHandle->pcHelpString)) - { - (void)SHELL_Write(shellContextHandle, shellCommandContextHandle->pcHelpString, - strlen(shellCommandContextHandle->pcHelpString)); - } - - p = LIST_GetNext(p); - } - return kStatus_SHELL_Success; -} - -static shell_status_t SHELL_ExitCommand(shell_handle_t shellHandle, int32_t argc, char **argv) -{ - shell_context_handle_t *shellContextHandle = (shell_context_handle_t *)shellHandle; - /* Skip warning */ - (void)SHELL_Write(shellContextHandle, "\r\nSHELL exited\r\n", strlen("\r\nSHELL exited\r\n")); - shellContextHandle->exit = (uint8_t) true; - return kStatus_SHELL_Success; -} - -static void SHELL_ProcessCommand(shell_context_handle_t *shellContextHandle, const char *cmd) -{ - shell_command_t *tmpCommand = NULL; - const char *tmpCommandString; - int32_t argc; - char *argv[SHELL_BUFFER_SIZE] = {0}; - list_element_handle_t p; - uint8_t flag = 1; - uint8_t tmpCommandLen; - uint8_t tmpLen; - uint8_t i = 0; - - tmpLen = (uint8_t)strlen(cmd); - argc = SHELL_ParseLine(cmd, tmpLen, argv); - - if ((argc > 0)) - { - p = LIST_GetHead(&shellContextHandle->commandContextListHead); - while (p != NULL) - { - tmpCommand = SHEEL_COMMAND_POINTER(p); - tmpCommandString = tmpCommand->pcCommand; - tmpCommandLen = (uint8_t)strlen(tmpCommandString); - /* Compare with space or end of string */ - if ((cmd[tmpCommandLen] == ' ') || (cmd[tmpCommandLen] == (char)0x00)) - { - if (SHELL_StringCompare(tmpCommandString, argv[0], (int32_t)tmpCommandLen) == 0) - { - /* support commands with optional number of parameters */ - if (tmpCommand->cExpectedNumberOfParameters == (uint8_t)SHELL_IGNORE_PARAMETER_COUNT) - { - flag = 0; - } - else if ((tmpCommand->cExpectedNumberOfParameters == 0U) && (argc == 1)) - { - flag = 0; - } - else if (tmpCommand->cExpectedNumberOfParameters > 0U) - { - if ((argc - 1) == (int32_t)tmpCommand->cExpectedNumberOfParameters) - { - flag = 0; - } - } - else - { - flag = 1; - } - break; - } - } - p = LIST_GetNext(p); - } - if (NULL == p) - { - tmpCommand = NULL; - } - } - - if ((tmpCommand != NULL) && (flag == 1U)) - { - (void)SHELL_Write( - shellContextHandle, - "\r\nIncorrect command parameter(s). Enter \"help\" to view a list of available commands.\r\n\r\n", - strlen( - "\r\nIncorrect command parameter(s). Enter \"help\" to view a list of available commands.\r\n\r\n")); - } - else if (tmpCommand != NULL) - { - tmpLen = (uint8_t)strlen(cmd); - /* Compare with last command. Push back to history buffer if different */ - if (tmpLen != (uint8_t)SHELL_StringCompare(cmd, shellContextHandle->hist_buf[0], (int32_t)strlen(cmd))) - { - for (i = SHELL_HISTORY_COUNT - 1U; i > 0U; i--) - { - (void)memset(shellContextHandle->hist_buf[i], (int)'\0', SHELL_BUFFER_SIZE); - tmpLen = (uint8_t)strlen(shellContextHandle->hist_buf[i - 1U]); - (void)memcpy(shellContextHandle->hist_buf[i], shellContextHandle->hist_buf[i - 1U], tmpLen); - } - (void)memset(shellContextHandle->hist_buf[0], (int)'\0', SHELL_BUFFER_SIZE); - tmpLen = (uint8_t)strlen(cmd); - (void)memcpy(shellContextHandle->hist_buf[0], cmd, tmpLen); - if (shellContextHandle->hist_count < SHELL_HISTORY_COUNT) - { - shellContextHandle->hist_count++; - } - } - (void)tmpCommand->pFuncCallBack(shellContextHandle, argc, argv); - } - else - { - (void)SHELL_Write( - shellContextHandle, - "\r\nCommand not recognized. Enter 'help' to view a list of available commands.\r\n\r\n", - strlen("\r\nCommand not recognized. Enter 'help' to view a list of available commands.\r\n\r\n")); - } -} - -static void SHELL_GetHistoryCommand(shell_context_handle_t *shellContextHandle, uint8_t hist_pos) -{ - uint32_t i; - uint32_t tmp; - - if (shellContextHandle->hist_buf[0][0] == '\0') - { - shellContextHandle->hist_current = 0; - return; - } - -#if 0 /*hist_pos is passed from hist_current. And hist_current is only changed in case 'A'/'B',as hist_count is 3 \ - most, it can't be more than 3 */ - if (hist_pos >= SHELL_HISTORY_COUNT) - { - hist_pos = SHELL_HISTORY_COUNT - 1U; - } -#endif - - tmp = strlen(shellContextHandle->line); - /* Clear current if have */ - if (tmp > 0U) - { - (void)memset(shellContextHandle->line, (int)'\0', tmp); - for (i = 0U; i < tmp; i++) - { - (void)SHELL_Write(shellContextHandle, "\b \b", 3); - } - } - - shellContextHandle->l_pos = (uint8_t)strlen(shellContextHandle->hist_buf[hist_pos]); - shellContextHandle->c_pos = shellContextHandle->l_pos; - (void)memcpy(shellContextHandle->line, shellContextHandle->hist_buf[hist_pos], shellContextHandle->l_pos); - (void)SHELL_Write(shellContextHandle, shellContextHandle->hist_buf[hist_pos], - strlen(shellContextHandle->hist_buf[hist_pos])); -} - -static void SHELL_AutoComplete(shell_context_handle_t *shellContextHandle) -{ - int32_t minLen; - list_element_handle_t p; - shell_command_t *tmpCommand = NULL; - const char *namePtr; - const char *cmdName; - - minLen = (int32_t)SHELL_BUFFER_SIZE; - namePtr = NULL; - - /* Empty tab, list all commands */ - if (shellContextHandle->line[0] == '\0') - { - (void)SHELL_HelpCommand(shellContextHandle, 0, NULL); - return; - } - - (void)SHELL_Write(shellContextHandle, "\r\n", 2); - - /* Do auto complete */ - p = LIST_GetHead(&shellContextHandle->commandContextListHead); - while (p != NULL) - { - tmpCommand = SHEEL_COMMAND_POINTER(p); - cmdName = tmpCommand->pcCommand; - if (SHELL_StringCompare(shellContextHandle->line, cmdName, (int32_t)strlen(shellContextHandle->line)) == 0) - { - /* Show possible matches */ - (void)SHELL_Printf(shellContextHandle, "%s ", cmdName); - if (minLen > ((int32_t)strlen(cmdName))) - { - namePtr = cmdName; - minLen = (int32_t)strlen(namePtr); - } - } - p = LIST_GetNext(p); - } - /* Auto complete string */ - if (namePtr != NULL) - { - (void)memcpy(shellContextHandle->line, namePtr, (uint32_t)minLen); - } - SHELL_PrintPrompt(shellContextHandle); - (void)SHELL_Write(shellContextHandle, shellContextHandle->line, strlen(shellContextHandle->line)); - return; -} - -static int32_t SHELL_StringCompare(const char *str1, const char *str2, int32_t count) -{ - while ((bool)(count--)) - { - if (*str1++ != *str2++) - { - return (int32_t)(*(str1 - 1) - *(str2 - 1)); - } - } - return 0; -} - -static int32_t SHELL_ParseLine(const char *cmd, uint32_t len, char *argv[]) -{ - uint32_t argc; - char *p; - uint32_t position; - - /* Init params */ - (void)memset(s_paramBuffer, (int)'\0', len + 1U); - (void)memcpy(s_paramBuffer, cmd, len); - - p = s_paramBuffer; - position = 0; - argc = 0; - - while (position < len) - { - /* Skip all blanks */ - while ((position < len) && ((char)(*p) == ' ')) - { - *p = '\0'; - p++; - position++; - } - - if (position >= len) - { - break; - } - - /* Process begin of a string */ - if (*p == '"') - { - p++; - position++; - argv[argc] = p; - argc++; - /* Skip this string */ - while ((*p != '"') && (position < len)) - { - p++; - position++; - } - /* Skip '"' */ - *p = '\0'; - p++; - position++; - } - else /* Normal char */ - { - argv[argc] = p; - argc++; - while (((char)*p != ' ') && (position < len)) - { - p++; - position++; - } - } - } - return (int32_t)argc; -} - -static shell_status_t SHELL_GetChar(shell_context_handle_t *shellContextHandle, uint8_t *ch) -{ - shell_status_t status; - -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == shellContextHandle->serialHandle) - { - int ret; - ret = getchar(); - if (ret > 0) - { - *ch = (uint8_t)ret; - status = kStatus_SHELL_Success; - } - else - { - status = kStatus_SHELL_Error; - } - } - else -#endif - { -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - uint32_t length = 0; - - (void)SerialManager_TryRead(shellContextHandle->serialReadHandle, ch, 1, &length); - - if (length > 0U) - { - status = kStatus_SHELL_Success; - } - else - { - status = kStatus_SHELL_Error; - } -#else - status = (shell_status_t)SerialManager_ReadBlocking(shellContextHandle->serialReadHandle, ch, 1); -#endif - } - - return status; -} - -shell_status_t SHELL_Init(shell_handle_t shellHandle, serial_handle_t serialHandle, char *prompt) -{ - shell_context_handle_t *shellContextHandle; - serial_manager_status_t status = kStatus_SerialManager_Error; - (void)status; - - assert(shellHandle); -#if !(!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - assert(serialHandle); -#endif - assert(prompt); - assert(SHELL_HANDLE_SIZE >= sizeof(shell_context_handle_t)); - - shellContextHandle = (shell_context_handle_t *)shellHandle; - - /* memory set for shellHandle */ - (void)memset(shellHandle, 0, SHELL_HANDLE_SIZE); - -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == serialHandle) - { - } - else -#endif - { -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - -#if defined(OSA_USED) - -#if (defined(SHELL_USE_COMMON_TASK) && (SHELL_USE_COMMON_TASK > 0U)) - (void)COMMON_TASK_init(); -#else - if (KOSA_StatusSuccess != OSA_EventCreate((osa_event_handle_t)shellContextHandle->event, 1U)) - { - return kStatus_SHELL_Error; - } - - if (KOSA_StatusSuccess != - OSA_TaskCreate((osa_task_handle_t)shellContextHandle->taskId, OSA_TASK(SHELL_Task), shellContextHandle)) - { - return kStatus_SHELL_Error; - } -#endif - -#endif - -#endif - } - - shellContextHandle->prompt = prompt; - shellContextHandle->serialHandle = serialHandle; - -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == serialHandle) - { - } - else -#endif - { - shellContextHandle->serialWriteHandle = (serial_write_handle_t)&shellContextHandle->serialWriteHandleBuffer[0]; - status = SerialManager_OpenWriteHandle(shellContextHandle->serialHandle, shellContextHandle->serialWriteHandle); - assert(kStatus_SerialManager_Success == status); - - shellContextHandle->serialReadHandle = (serial_read_handle_t)&shellContextHandle->serialReadHandleBuffer[0]; - status = SerialManager_OpenReadHandle(shellContextHandle->serialHandle, shellContextHandle->serialReadHandle); - assert(kStatus_SerialManager_Success == status); - -#if (defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - status = SerialManager_InstallRxCallback(shellContextHandle->serialReadHandle, SHELL_SerialManagerRxCallback, - shellContextHandle); - assert(kStatus_SerialManager_Success == status); -#endif - (void)status; - } - - (void)SHELL_RegisterCommand(shellContextHandle, SHELL_COMMAND(help)); - (void)SHELL_RegisterCommand(shellContextHandle, SHELL_COMMAND(exit)); - - (void)SHELL_Write(shellContextHandle, "\r\nCopyright 2020 NXP\r\n", strlen("\r\nCopyright 2020 NXP\r\n")); - SHELL_PrintPrompt(shellContextHandle); - - return kStatus_SHELL_Success; -} - -shell_status_t SHELL_RegisterCommand(shell_handle_t shellHandle, shell_command_t *shellCommand) -{ - shell_context_handle_t *shellContextHandle = (shell_context_handle_t *)shellHandle; - assert(shellHandle); - assert(shellCommand); - - /* memory set for shellHandle */ - (void)memset(&shellCommand->link, 0, sizeof(shellCommand->link)); - - (void)LIST_AddTail(&shellContextHandle->commandContextListHead, &shellCommand->link); - - return kStatus_SHELL_Success; -} - -shell_status_t SHELL_UnregisterCommand(shell_command_t *shellCommand) -{ - assert(shellCommand); - - (void)LIST_RemoveElement(&shellCommand->link); - - /* memory set for shellHandle */ - (void)memset(&shellCommand->link, 0, sizeof(shellCommand->link)); - - return kStatus_SHELL_Success; -} - -shell_status_t SHELL_Write(shell_handle_t shellHandle, const char *buffer, uint32_t length) -{ - shell_context_handle_t *shellContextHandle; - uint32_t primask; - shell_status_t status; - - assert(shellHandle); - assert(buffer); - - if (!(bool)length) - { - return kStatus_SHELL_Success; - } - - shellContextHandle = (shell_context_handle_t *)shellHandle; - - primask = DisableGlobalIRQ(); - if ((bool)shellContextHandle->printBusy) - { - EnableGlobalIRQ(primask); - return kStatus_SHELL_Error; - } - shellContextHandle->printBusy = 1U; - EnableGlobalIRQ(primask); -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == shellContextHandle->serialHandle) - { - status = kStatus_SHELL_Success; - for (uint32_t index = 0; index < length; index++) - { - (void)putchar(buffer[index]); - } - } - else -#endif - { - status = (shell_status_t)SerialManager_WriteBlocking(shellContextHandle->serialWriteHandle, (uint8_t *)buffer, - length); - } - - shellContextHandle->printBusy = 0U; - - return status; -} - -int SHELL_Printf(shell_handle_t shellHandle, const char *formatString, ...) -{ - shell_context_handle_t *shellContextHandle; - uint32_t length; - uint32_t primask; - va_list ap; - - assert(shellHandle); - assert(formatString); - - shellContextHandle = (shell_context_handle_t *)shellHandle; - - primask = DisableGlobalIRQ(); - if ((bool)shellContextHandle->printBusy) - { - EnableGlobalIRQ(primask); - return -1; - } - shellContextHandle->printBusy = 1U; - EnableGlobalIRQ(primask); - - va_start(ap, formatString); - - shellContextHandle->printLength = 0U; - length = (uint32_t)SHELL_Sprintf(shellHandle, formatString, ap); -#if (!defined(SDK_DEBUGCONSOLE_UART) && (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE != 1))) - if (NULL == shellContextHandle->serialHandle) - { - for (uint32_t index = 0; index < length; index++) - { - (void)putchar(shellContextHandle->printBuffer[index]); - } - } - else -#endif - { - (void)SerialManager_WriteBlocking(shellContextHandle->serialWriteHandle, - (uint8_t *)shellContextHandle->printBuffer, length); - } - va_end(ap); - - shellContextHandle->printBusy = 0U; - return (int32_t)shellContextHandle->printLength; -} - -void SHELL_ChangePrompt(shell_handle_t shellHandle, char *prompt) -{ - shell_context_handle_t *shellContextHandle; - assert(shellHandle); - assert(prompt); - - shellContextHandle = (shell_context_handle_t *)shellHandle; - - shellContextHandle->prompt = prompt; - SHELL_PrintPrompt(shellContextHandle); -} - -void SHELL_PrintPrompt(shell_handle_t shellHandle) -{ - shell_context_handle_t *shellContextHandle; - assert(shellHandle); - - shellContextHandle = (shell_context_handle_t *)shellHandle; - - (void)SHELL_Write(shellContextHandle, "\r\n", 2U); - (void)SHELL_Write(shellContextHandle, shellContextHandle->prompt, strlen(shellContextHandle->prompt)); -} diff --git a/devices/MIMXRT1052/utilities/fsl_shell.h b/devices/MIMXRT1052/utilities/fsl_shell.h deleted file mode 100644 index 513d366..0000000 --- a/devices/MIMXRT1052/utilities/fsl_shell.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (c) 2015, Freescale Semiconductor, Inc. - * Copyright 2016-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef __FSL_SHELL_H__ -#define __FSL_SHELL_H__ - -/*! - * @addtogroup SHELL - * @{ - */ - -#include "fsl_common.h" -#include "fsl_component_serial_manager.h" -#include "fsl_component_generic_list.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @brief Whether use non-blocking mode. */ -#ifndef SHELL_NON_BLOCKING_MODE -#define SHELL_NON_BLOCKING_MODE SERIAL_MANAGER_NON_BLOCKING_MODE -#endif - -/*! @brief Macro to set on/off auto-complete feature. */ -#define SHELL_AUTO_COMPLETE (1U) - -/*! @brief Macro to set console buffer size. */ -#ifndef SHELL_BUFFER_SIZE -#define SHELL_BUFFER_SIZE (64U) -#endif - -/*! @brief Macro to set maximum arguments in command. */ -#define SHELL_MAX_ARGS (8U) - -/*! @brief Macro to set maximum count of history commands. */ -#ifndef SHELL_HISTORY_COUNT -#define SHELL_HISTORY_COUNT (3U) -#endif - -/*! @brief Macro to bypass arguments check */ -#define SHELL_IGNORE_PARAMETER_COUNT (0xFF) - -/*! @brief The handle size of the shell module. It is the sum of the SHELL_HISTORY_COUNT * SHELL_BUFFER_SIZE + - * SHELL_BUFFER_SIZE + SERIAL_MANAGER_READ_HANDLE_SIZE + SERIAL_MANAGER_WRITE_HANDLE_SIZE*/ -#define SHELL_HANDLE_SIZE \ - (160U + SHELL_HISTORY_COUNT * SHELL_BUFFER_SIZE + SHELL_BUFFER_SIZE + SERIAL_MANAGER_READ_HANDLE_SIZE + \ - SERIAL_MANAGER_WRITE_HANDLE_SIZE) - -/*! @brief Macro to determine whether use common task. */ -#ifndef SHELL_USE_COMMON_TASK -#define SHELL_USE_COMMON_TASK (0U) -#endif - -/*! @brief Macro to set shell task priority. */ -#ifndef SHELL_TASK_PRIORITY -#define SHELL_TASK_PRIORITY (2U) -#endif - -/*! @brief Macro to set shell task stack size. */ -#ifndef SHELL_TASK_STACK_SIZE -#define SHELL_TASK_STACK_SIZE (1000U) -#endif - -/*! @brief Shell status */ -typedef enum _shell_status -{ - kStatus_SHELL_Success = kStatus_Success, /*!< Success */ - kStatus_SHELL_Error = MAKE_STATUS(kStatusGroup_SHELL, 1), /*!< Failed */ - kStatus_SHELL_OpenWriteHandleFailed = MAKE_STATUS(kStatusGroup_SHELL, 2), /*!< Open write handle failed */ - kStatus_SHELL_OpenReadHandleFailed = MAKE_STATUS(kStatusGroup_SHELL, 3), /*!< Open read handle failed */ -} shell_status_t; - -/*! @brief The handle of the shell module */ -typedef void *shell_handle_t; - -/*! @brief User command function prototype. */ -typedef shell_status_t (*cmd_function_t)(shell_handle_t shellHandle, int32_t argc, char **argv); - -/*! @brief User command data configuration structure. */ -typedef struct _shell_command -{ - const char *pcCommand; /*!< The command that is executed. For example "help". It must be all lower case. */ - char *pcHelpString; /*!< String that describes how to use the command. It should start with the command itself, - and end with "\r\n". For example "help: Returns a list of all the commands\r\n". */ - const cmd_function_t - pFuncCallBack; /*!< A pointer to the callback function that returns the output generated by the command. */ - uint8_t cExpectedNumberOfParameters; /*!< Commands expect a fixed number of parameters, which may be zero. */ - list_element_t link; /*!< link of the element */ -} shell_command_t; - -/*! - * @brief Defines the shell handle - * - * This macro is used to define a 4 byte aligned shell handle. - * Then use "(shell_handle_t)name" to get the shell handle. - * - * The macro should be global and could be optional. You could also define shell handle by yourself. - * - * This is an example, - * @code - * SHELL_HANDLE_DEFINE(shellHandle); - * @endcode - * - * @param name The name string of the shell handle. - */ -#define SHELL_HANDLE_DEFINE(name) uint32_t name[((SHELL_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))] - -#if defined(__ICCARM__) -/* disable misra 19.13 */ -_Pragma("diag_suppress=Pm120") -#endif -/*! - * @brief Defines the shell command structure - * - * This macro is used to define the shell command structure #shell_command_t. - * And then uses the macro SHELL_COMMAND to get the command structure pointer. - * The macro should not be used in any function. - * - * This is a example, - * @code - * SHELL_COMMAND_DEFINE(exit, "\r\n\"exit\": Exit program\r\n", SHELL_ExitCommand, 0); - * SHELL_RegisterCommand(s_shellHandle, SHELL_COMMAND(exit)); - * @endcode - * - * @param command The command string of the command. The double quotes do not need. Such as exit for "exit", - * help for "Help", read for "read". - * @param descriptor The description of the command is used for showing the command usage when "help" is typing. - * @param callback The callback of the command is used to handle the command line when the input command is matched. - * @param paramCount The max parameter count of the current command. - */ -#define SHELL_COMMAND_DEFINE(command, descriptor, callback, paramCount) \ - \ - shell_command_t g_shellCommand##command = { \ - (#command), (descriptor), (callback), (paramCount), {0}, \ - } - -/*! - * @brief Gets the shell command pointer - * - * This macro is used to get the shell command pointer. The macro should not be used before the macro - * SHELL_COMMAND_DEFINE is used. - * - * @param command The command string of the command. The double quotes do not need. Such as exit for "exit", - * help for "Help", read for "read". - */ -#define SHELL_COMMAND(command) &g_shellCommand##command - -#if defined(__ICCARM__) - _Pragma("diag_default=Pm120") -#endif - -/******************************************************************************* - * API - ******************************************************************************/ - -#if defined(__cplusplus) - extern "C" -{ -#endif /* _cplusplus */ - - /*! - * @name Shell functional operation - * @{ - */ - - /*! - * @brief Initializes the shell module - * - * This function must be called before calling all other Shell functions. - * Call operation the Shell commands with user-defined settings. - * The example below shows how to set up the Shell and - * how to call the SHELL_Init function by passing in these parameters. - * This is an example. - * @code - * static SHELL_HANDLE_DEFINE(s_shellHandle); - * SHELL_Init((shell_handle_t)s_shellHandle, (serial_handle_t)s_serialHandle, "Test@SHELL>"); - * @endcode - * @param shellHandle Pointer to point to a memory space of size #SHELL_HANDLE_SIZE allocated by the caller. - * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices. - * You can define the handle in the following two ways: - * #SHELL_HANDLE_DEFINE(shellHandle); - * or - * uint32_t shellHandle[((SHELL_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]; - * @param serialHandle The serial manager module handle pointer. - * @param prompt The string prompt pointer of Shell. Only the global variable can be passed. - * @retval kStatus_SHELL_Success The shell initialization succeed. - * @retval kStatus_SHELL_Error An error occurred when the shell is initialized. - * @retval kStatus_SHELL_OpenWriteHandleFailed Open the write handle failed. - * @retval kStatus_SHELL_OpenReadHandleFailed Open the read handle failed. - */ - shell_status_t SHELL_Init(shell_handle_t shellHandle, serial_handle_t serialHandle, char *prompt); - - /*! - * @brief Registers the shell command - * - * This function is used to register the shell command by using the command configuration shell_command_config_t. - * This is a example, - * @code - * SHELL_COMMAND_DEFINE(exit, "\r\n\"exit\": Exit program\r\n", SHELL_ExitCommand, 0); - * SHELL_RegisterCommand(s_shellHandle, SHELL_COMMAND(exit)); - * @endcode - * @param shellHandle The shell module handle pointer. - * @param shellCommand The command element. - * @retval kStatus_SHELL_Success Successfully register the command. - * @retval kStatus_SHELL_Error An error occurred. - */ - shell_status_t SHELL_RegisterCommand(shell_handle_t shellHandle, shell_command_t * shellCommand); - - /*! - * @brief Unregisters the shell command - * - * This function is used to unregister the shell command. - * - * @param shellCommand The command element. - * @retval kStatus_SHELL_Success Successfully unregister the command. - */ - shell_status_t SHELL_UnregisterCommand(shell_command_t * shellCommand); - - /*! - * @brief Sends data to the shell output stream. - * - * This function is used to send data to the shell output stream. - * - * @param shellHandle The shell module handle pointer. - * @param buffer Start address of the data to write. - * @param length Length of the data to write. - * @retval kStatus_SHELL_Success Successfully send data. - * @retval kStatus_SHELL_Error An error occurred. - */ - shell_status_t SHELL_Write(shell_handle_t shellHandle, const char *buffer, uint32_t length); - - /*! - * @brief Writes formatted output to the shell output stream. - * - * Call this function to write a formatted output to the shell output stream. - * - * @param shellHandle The shell module handle pointer. - * - * @param formatString Format string. - * @return Returns the number of characters printed or a negative value if an error occurs. - */ - int SHELL_Printf(shell_handle_t shellHandle, const char *formatString, ...); - - /*! - * @brief Change shell prompt. - * - * Call this function to change shell prompt. - * - * @param shellHandle The shell module handle pointer. - * - * @param prompt The string which will be used for command prompt - * @return NULL. - */ - void SHELL_ChangePrompt(shell_handle_t shellHandle, char *prompt); - - /*! - * @brief Print shell prompt. - * - * Call this function to print shell prompt. - * - * @param shellHandle The shell module handle pointer. - * - * @return NULL. - */ - void SHELL_PrintPrompt(shell_handle_t shellHandle); - -/*! - * @brief The task function for Shell. - * The task function for Shell; The function should be polled by upper layer. - * This function does not return until Shell command exit was called. - * - * @param shellHandle The shell module handle pointer. - */ -#if !(defined(SHELL_NON_BLOCKING_MODE) && (SHELL_NON_BLOCKING_MODE > 0U)) - void SHELL_Task(shell_handle_t shellHandle); -#endif - - /* @} */ - -#if defined(__cplusplus) -} -#endif - -/*! @}*/ - -#endif /* __FSL_SHELL_H__ */ diff --git a/devices/MIMXRT1052/utilities/str/fsl_str.c b/devices/MIMXRT1052/utilities/str/fsl_str.c deleted file mode 100644 index c03ef83..0000000 --- a/devices/MIMXRT1052/utilities/str/fsl_str.c +++ /dev/null @@ -1,1554 +0,0 @@ -/* - * Copyright 2017, 2020 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ -#include -#include -#include -#include /* MISRA C-2012 Rule 22.9 */ -#include "fsl_str.h" -#include "fsl_debug_console_conf.h" - -/******************************************************************************* - * Definitions - ******************************************************************************/ - -/*! @brief The overflow value.*/ -#ifndef HUGE_VAL -#define HUGE_VAL (99.e99) -#endif /* HUGE_VAL */ - -#ifndef MAX_FIELD_WIDTH -#define MAX_FIELD_WIDTH 99U -#endif - -#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 /*PRINTF_FLOAT_ENABLE */ - kSCANF_TypeSinged = 0x2000U, /*!< TypeSinged Flag. */ -}; - -/*! @brief Keil: suppress ellipsis warning in va_arg usage below. */ -#if defined(__CC_ARM) -#pragma diag_suppress 1256 -#endif /* __CC_ARM */ - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -/*! - * @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 ScanIgnoreWhiteSpace(const char **s); - -/*! - * @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 ConvertRadixNumToString(char *numstr, void *nump, int32_t neg, int32_t radix, bool use_caps); - -#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 ConvertFloatRadixNumToString(char *numstr, void *nump, int32_t radix, uint32_t precision_width); - -#endif /* PRINTF_FLOAT_ENABLE */ - -/*************Code for process formatted data*******************************/ -#if PRINTF_ADVANCED_ENABLE -static uint8_t PrintGetSignChar(int64_t ival, uint32_t flags_used, char *schar) -{ - uint8_t len = 1U; - if (ival < 0) - { - *schar = '-'; - } - else - { - if (0U != (flags_used & (uint32_t)kPRINTF_Plus)) - { - *schar = '+'; - } - else if (0U != (flags_used & (uint32_t)kPRINTF_Space)) - { - *schar = ' '; - } - else - { - *schar = '\0'; - len = 0U; - } - } - return len; -} -#endif - -static uint32_t PrintGetWidth(const char **p, va_list *ap) -{ - uint32_t field_width = 0; - uint8_t done = 0U; - char c; - - while (0U == 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, uint32_t); - } -#endif /* PRINTF_ADVANCED_ENABLE */ - else - { - /* We've gone one char too far. */ - --(*p); - done = 1U; - } - } - return field_width; -} - -static uint32_t PrintGetPrecision(const char **s, va_list *ap, bool *valid_precision_width) -{ - const char *p = *s; - uint32_t precision_width = 6U; - uint8_t done = 0U; - -#if PRINTF_ADVANCED_ENABLE - if (NULL != valid_precision_width) - { - *valid_precision_width = false; - } -#endif /* PRINTF_ADVANCED_ENABLE */ - if (*++p == '.') - { - /* Must get precision field width, if present. */ - precision_width = 0U; - done = 0U; - while (0U == done) - { - char c = *++p; - if ((c >= '0') && (c <= '9')) - { - precision_width = (precision_width * 10U) + ((uint32_t)c - (uint32_t)'0'); -#if PRINTF_ADVANCED_ENABLE - if (NULL != valid_precision_width) - { - *valid_precision_width = true; - } -#endif /* PRINTF_ADVANCED_ENABLE */ - } -#if PRINTF_ADVANCED_ENABLE - else if (c == '*') - { - precision_width = (uint32_t)va_arg(*ap, uint32_t); - if (NULL != valid_precision_width) - { - *valid_precision_width = true; - } - } -#endif /* PRINTF_ADVANCED_ENABLE */ - else - { - /* We've gone one char too far. */ - --p; - done = 1U; - } - } - } - else - { - /* We've gone one char too far. */ - --p; - } - *s = p; - return precision_width; -} - -static uint32_t PrintIsobpu(const char c) -{ - uint32_t ret = 0U; - if ((c == 'o') || (c == 'b') || (c == 'p') || (c == 'u')) - { - ret = 1U; - } - return ret; -} - -static uint32_t PrintIsdi(const char c) -{ - uint32_t ret = 0U; - if ((c == 'd') || (c == 'i')) - { - ret = 1U; - } - return ret; -} - -static void PrintOutputdifFobpu(uint32_t flags_used, - uint32_t field_width, - uint32_t vlen, - char schar, - char *vstrp, - printfCb cb, - char *buf, - int32_t *count) -{ -#if PRINTF_ADVANCED_ENABLE - /* Do the ZERO pad. */ - if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) - { - if ('\0' != schar) - { - cb(buf, count, schar, 1); - schar = '\0'; - } - cb(buf, count, '0', (int)field_width - (int)vlen); - vlen = field_width; - } - else - { - if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) - { - cb(buf, count, ' ', (int)field_width - (int)vlen); - if ('\0' != schar) - { - cb(buf, count, schar, 1); - schar = '\0'; - } - } - } - /* The string was built in reverse order, now display in correct order. */ - if ('\0' != schar) - { - cb(buf, count, schar, 1); - } -#else - cb(buf, count, ' ', (int)field_width - (int)vlen); -#endif /* PRINTF_ADVANCED_ENABLE */ - while ('\0' != (*vstrp)) - { - cb(buf, count, *vstrp--, 1); - } -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_Minus)) - { - cb(buf, count, ' ', (int)field_width - (int)vlen); - } -#endif /* PRINTF_ADVANCED_ENABLE */ -} - -static void PrintOutputxX(uint32_t flags_used, - uint32_t field_width, - uint32_t vlen, - bool use_caps, - char *vstrp, - printfCb cb, - char *buf, - int32_t *count) -{ -#if PRINTF_ADVANCED_ENABLE - uint8_t dschar = 0; - if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) - { - if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) - { - cb(buf, count, '0', 1); - cb(buf, count, (use_caps ? 'X' : 'x'), 1); - dschar = 1U; - } - cb(buf, count, '0', (int)field_width - (int)vlen); - vlen = field_width; - } - else - { - if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) - { - if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) - { - vlen += 2U; - } - cb(buf, count, ' ', (int)field_width - (int)vlen); - if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) - { - cb(buf, count, '0', 1); - cb(buf, count, (use_caps ? 'X' : 'x'), 1); - dschar = 1U; - } - } - } - - if ((0U != (flags_used & (uint32_t)kPRINTF_Pound)) && (0U == dschar)) - { - cb(buf, count, '0', 1); - cb(buf, count, (use_caps ? 'X' : 'x'), 1); - vlen += 2U; - } -#else - cb(buf, count, ' ', (int)field_width - (int)vlen); -#endif /* PRINTF_ADVANCED_ENABLE */ - while ('\0' != (*vstrp)) - { - cb(buf, count, *vstrp--, 1); - } -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_Minus)) - { - cb(buf, count, ' ', (int)field_width - (int)vlen); - } -#endif /* PRINTF_ADVANCED_ENABLE */ -} - -static uint32_t PrintIsfF(const char c) -{ - uint32_t ret = 0U; - if ((c == 'f') || (c == 'F')) - { - ret = 1U; - } - return ret; -} - -static uint32_t PrintIsxX(const char c) -{ - uint32_t ret = 0U; - if ((c == 'x') || (c == 'X')) - { - ret = 1U; - } - return ret; -} - -#if PRINTF_ADVANCED_ENABLE -static uint32_t PrintCheckFlags(const char **s) -{ - const char *p = *s; - /* First check for specification modifier flags. */ - uint32_t flags_used = 0U; - bool done = false; - while (false == 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; - } - } - *s = p; - return flags_used; -} -#endif /* PRINTF_ADVANCED_ENABLE */ - -#if PRINTF_ADVANCED_ENABLE -/* - * Check for the length modifier. - */ -static uint32_t PrintGetLengthFlag(const char **s) -{ - const char *p = *s; - /* First check for specification modifier flags. */ - uint32_t flags_used = 0U; - - 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; - } - *s = p; - return flags_used; -} -#else -static void PrintFilterLengthFlag(const char **s) -{ - const char *p = *s; - char ch; - - do - { - ch = *++p; - } while ((ch == 'h') || (ch == 'l')); - - *s = --p; -} -#endif /* PRINTF_ADVANCED_ENABLE */ - -static uint8_t PrintGetRadixFromobpu(const char c) -{ - uint8_t radix; - - if (c == 'o') - { - radix = 8U; - } - else if (c == 'b') - { - radix = 2U; - } - else if (c == 'p') - { - radix = 16U; - } - else - { - radix = 10U; - } - return radix; -} - -static uint32_t ScanIsWhiteSpace(const char c) -{ - uint32_t ret = 0U; - if ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r') || (c == '\v') || (c == '\f')) - { - ret = 1U; - } - return ret; -} - -static uint32_t ScanIgnoreWhiteSpace(const char **s) -{ - uint32_t count = 0U; - char c; - - c = **s; - while (1U == ScanIsWhiteSpace(c)) - { - count++; - (*s)++; - c = **s; - } - return count; -} - -static int32_t ConvertRadixNumToString(char *numstr, void *nump, int32_t neg, int32_t radix, bool use_caps) -{ -#if PRINTF_ADVANCED_ENABLE - int64_t a; - int64_t b; - int64_t c; - - uint64_t ua; - uint64_t ub; - uint64_t uc; -#else - int32_t a; - int32_t b; - int32_t c; - - uint32_t ua; - uint32_t ub; - uint32_t uc; -#endif /* PRINTF_ADVANCED_ENABLE */ - - int32_t nlen; - char *nstrp; - - nlen = 0; - nstrp = numstr; - *nstrp++ = '\0'; - -#if !(PRINTF_ADVANCED_ENABLE > 0) - neg = 0; -#endif - - if (0 != neg) - { -#if PRINTF_ADVANCED_ENABLE - a = *(int64_t *)nump; -#else - a = *(int32_t *)nump; -#endif /* PRINTF_ADVANCED_ENABLE */ - if (a == 0) - { - *nstrp = '0'; - ++nlen; - return nlen; - } - while (a != 0) - { -#if PRINTF_ADVANCED_ENABLE - b = (int64_t)a / (int64_t)radix; - c = (int64_t)a - ((int64_t)b * (int64_t)radix); - if (c < 0) - { - c = (int64_t)'0' - c; - } -#else - b = a / radix; - c = a - (b * radix); - if (c < 0) - { - c = (int32_t)'0' - c; - } -#endif /* PRINTF_ADVANCED_ENABLE */ - else - { - c = c + (int32_t)'0'; - } - a = b; - *nstrp++ = (char)c; - ++nlen; - } - } - else - { -#if PRINTF_ADVANCED_ENABLE - ua = *(uint64_t *)nump; -#else - ua = *(uint32_t *)nump; -#endif /* PRINTF_ADVANCED_ENABLE */ - if (ua == 0U) - { - *nstrp = '0'; - ++nlen; - return nlen; - } - while (ua != 0U) - { -#if PRINTF_ADVANCED_ENABLE - ub = (uint64_t)ua / (uint64_t)radix; - uc = (uint64_t)ua - ((uint64_t)ub * (uint64_t)radix); -#else - ub = ua / (uint32_t)radix; - uc = ua - (ub * (uint32_t)radix); -#endif /* PRINTF_ADVANCED_ENABLE */ - - if (uc < 10U) - { - uc = uc + (uint32_t)'0'; - } - else - { - uc = uc - 10U + (uint32_t)(use_caps ? 'A' : 'a'); - } - ua = ub; - *nstrp++ = (char)uc; - ++nlen; - } - } - return nlen; -} - -#if PRINTF_FLOAT_ENABLE -static int32_t ConvertFloatRadixNumToString(char *numstr, void *nump, int32_t radix, uint32_t precision_width) -{ - int32_t a; - int32_t b; - int32_t c; - int32_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 < (int32_t)precision_width; i++) - { - fractpart *= (double)radix; - } - if (r >= (double)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 < (int32_t)precision_width; i++) - { - fb = fa / (double)radix; - dc = (fa - (double)(int64_t)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] fmt_ptr Format string for printf. - * param[in] args_ptr Arguments to printf. - * param[in] buf pointer to the buffer - * param cb print callback function pointer - * - * return Number of characters to be print - */ -int StrFormatPrintf(const char *fmt, va_list ap, char *buf, printfCb cb) -{ - /* va_list ap; */ - const char *p; - char c; - - char vstr[33]; - char *vstrp = NULL; - int32_t vlen = 0; - - 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; - int64_t ival; - uint64_t uval = 0; - bool valid_precision_width; -#else - int32_t ival; - uint32_t 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 != '%') - { - cb(buf, &count, c, 1); - 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 = PrintCheckFlags(&p); -#endif /* PRINTF_ADVANCED_ENABLE */ - - /* Next check for minimum field width. */ - field_width = PrintGetWidth(&p, &ap); - - /* Next check for the width and precision field separator. */ -#if PRINTF_ADVANCED_ENABLE - precision_width = PrintGetPrecision(&p, &ap, &valid_precision_width); -#else - precision_width = PrintGetPrecision(&p, &ap, NULL); - (void)precision_width; -#endif - -#if PRINTF_ADVANCED_ENABLE - /* Check for the length modifier. */ - flags_used |= PrintGetLengthFlag(&p); -#else - /* Filter length modifier. */ - PrintFilterLengthFlag(&p); -#endif - - /* Now we're ready to examine the format. */ - c = *++p; - { - if (1U == PrintIsdi(c)) - { -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) - { - ival = (int64_t)va_arg(ap, int64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - ival = (int32_t)va_arg(ap, int32_t); - } - vlen = ConvertRadixNumToString(vstr, (void *)&ival, 1, 10, use_caps); - vstrp = &vstr[vlen]; -#if PRINTF_ADVANCED_ENABLE - vlen += (int32_t)PrintGetSignChar(ival, flags_used, &schar); - PrintOutputdifFobpu(flags_used, field_width, (uint32_t)vlen, schar, vstrp, cb, buf, &count); -#else - PrintOutputdifFobpu(0U, field_width, (uint32_t)vlen, '\0', vstrp, cb, buf, &count); -#endif - } - else if (1U == PrintIsfF(c)) - { -#if PRINTF_FLOAT_ENABLE - fval = (double)va_arg(ap, double); - vlen = ConvertFloatRadixNumToString(vstr, &fval, 10, precision_width); - vstrp = &vstr[vlen]; - -#if PRINTF_ADVANCED_ENABLE - vlen += (int32_t)PrintGetSignChar(((fval < 0.0) ? ((int64_t)-1) : ((int64_t)fval)), flags_used, &schar); - PrintOutputdifFobpu(flags_used, field_width, (uint32_t)vlen, schar, vstrp, cb, buf, &count); -#else - PrintOutputdifFobpu(0, field_width, (uint32_t)vlen, '\0', vstrp, cb, buf, &count); -#endif - -#else - (void)va_arg(ap, double); -#endif /* PRINTF_FLOAT_ENABLE */ - } - else if (1U == PrintIsxX(c)) - { - if (c == 'x') - { - use_caps = false; - } -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) - { - uval = (uint64_t)va_arg(ap, uint64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - uval = (uint32_t)va_arg(ap, uint32_t); - } - vlen = ConvertRadixNumToString(vstr, &uval, 0, 16, use_caps); - vstrp = &vstr[vlen]; -#if PRINTF_ADVANCED_ENABLE - PrintOutputxX(flags_used, field_width, (uint32_t)vlen, use_caps, vstrp, cb, buf, &count); -#else - PrintOutputxX(0U, field_width, (uint32_t)vlen, use_caps, vstrp, cb, buf, &count); -#endif - } - else if (1U == PrintIsobpu(c)) - { -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) - { - uval = (uint64_t)va_arg(ap, uint64_t); - } - else -#endif /* PRINTF_ADVANCED_ENABLE */ - { - uval = (uint32_t)va_arg(ap, uint32_t); - } - - radix = PrintGetRadixFromobpu(c); - - vlen = ConvertRadixNumToString(vstr, &uval, 0, (int32_t)radix, use_caps); - vstrp = &vstr[vlen]; -#if PRINTF_ADVANCED_ENABLE - PrintOutputdifFobpu(flags_used, field_width, (uint32_t)vlen, '\0', vstrp, cb, buf, &count); -#else - PrintOutputdifFobpu(0U, field_width, (uint32_t)vlen, '\0', vstrp, cb, buf, &count); -#endif - } - else if (c == 'c') - { - cval = (int32_t)va_arg(ap, uint32_t); - cb(buf, &count, cval, 1); - } - 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 */ - { - cb(buf, &count, ' ', (int)field_width - (int)vlen); - } - -#if PRINTF_ADVANCED_ENABLE - if (valid_precision_width) - { - while (('\0' != *sval) && (vlen > 0)) - { - cb(buf, &count, *sval++, 1); - vlen--; - } - /* In case that vlen sval is shorter than vlen */ - vlen = (int32_t)precision_width - vlen; - } - else - { -#endif /* PRINTF_ADVANCED_ENABLE */ - while ('\0' != (*sval)) - { - cb(buf, &count, *sval++, 1); - } -#if PRINTF_ADVANCED_ENABLE - } -#endif /* PRINTF_ADVANCED_ENABLE */ - -#if PRINTF_ADVANCED_ENABLE - if (0U != (flags_used & (uint32_t)kPRINTF_Minus)) - { - cb(buf, &count, ' ', (int32_t)field_width - vlen); - } -#endif /* PRINTF_ADVANCED_ENABLE */ - } - } - else - { - cb(buf, &count, c, 1); - } - } - p++; - } - - return count; -} - -#if SCANF_FLOAT_ENABLE -static uint8_t StrFormatScanIsFloat(char *c) -{ - uint8_t ret = 0U; - if (('a' == (*c)) || ('A' == (*c)) || ('e' == (*c)) || ('E' == (*c)) || ('f' == (*c)) || ('F' == (*c)) || - ('g' == (*c)) || ('G' == (*c))) - { - ret = 1U; - } - return ret; -} -#endif - -static uint8_t StrFormatScanIsFormatStarting(char *c) -{ - uint8_t ret = 1U; - if ((*c != '%')) - { - ret = 0U; - } - else if (*(c + 1) == '%') - { - ret = 0U; - } - else - { - /*MISRA rule 15.7*/ - } - - return ret; -} - -static uint8_t StrFormatScanGetBase(uint8_t base, const char *s) -{ - if (base == 0U) - { - if (s[0] == '0') - { - if ((s[1] == 'x') || (s[1] == 'X')) - { - base = 16; - } - else - { - base = 8; - } - } - else - { - base = 10; - } - } - return base; -} - -static uint8_t StrFormatScanCheckSymbol(const char *p, int8_t *neg) -{ - uint8_t len; - switch (*p) - { - case '-': - *neg = -1; - len = 1; - break; - case '+': - *neg = 1; - len = 1; - break; - default: - *neg = 1; - len = 0; - break; - } - return len; -} - -static uint8_t StrFormatScanFillInteger(uint32_t flag, va_list *args_ptr, int32_t val) -{ -#if SCANF_ADVANCED_ENABLE - if (0U != (flag & (uint32_t)kSCANF_Suppress)) - { - return 0u; - } - - 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 */ - - return 1u; -} - -#if SCANF_FLOAT_ENABLE -static uint8_t StrFormatScanFillFloat(uint32_t flag, va_list *args_ptr, double fnum) -{ -#if SCANF_ADVANCED_ENABLE - if (0U != (flag & (uint32_t)kSCANF_Suppress)) - { - return 0u; - } - else -#endif /* SCANF_ADVANCED_ENABLE */ - { - if (0U != (flag & (uint32_t)kSCANF_LengthLongLongDouble)) - { - *va_arg(*args_ptr, double *) = fnum; - } - else - { - *va_arg(*args_ptr, float *) = (float)fnum; - } - return 1u; - } -} -#endif /* SCANF_FLOAT_ENABLE */ - -static uint8_t StrFormatScanfStringHandling(char **str, uint32_t *flag, uint32_t *field_width, uint8_t *base) -{ - uint8_t exitPending = 0U; - char *c = *str; - - /* Loop to get full conversion specification. */ - while (('\0' != (*c)) && (0U == (*flag & (uint32_t)kSCANF_DestMask))) - { -#if SCANF_ADVANCED_ENABLE - if ('*' == (*c)) - { - if (0U != ((*flag) & (uint32_t)kSCANF_Suppress)) - { - /* Match failure. */ - exitPending = 1U; - } - else - { - (*flag) |= (uint32_t)kSCANF_Suppress; - } - } - else if ('h' == (*c)) - { - if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask)) - { - /* Match failure. */ - exitPending = 1U; - } - else - { - if (c[1] == 'h') - { - (*flag) |= (uint32_t)kSCANF_LengthChar; - c++; - } - else - { - (*flag) |= (uint32_t)kSCANF_LengthShortInt; - } - } - } - else if ('l' == (*c)) - { - if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask)) - { - /* Match failure. */ - exitPending = 1U; - } - else - { - if (c[1] == 'l') - { - (*flag) |= (uint32_t)kSCANF_LengthLongLongInt; - c++; - } - else - { - (*flag) |= (uint32_t)kSCANF_LengthLongInt; - } - } - } - else -#endif /* SCANF_ADVANCED_ENABLE */ -#if SCANF_FLOAT_ENABLE - if ('L' == (*c)) - { - if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask)) - { - /* Match failure. */ - exitPending = 1U; - } - else - { - (*flag) |= (uint32_t)kSCANF_LengthLongLongDouble; - } - } - else -#endif /* SCANF_FLOAT_ENABLE */ - if (((*c) >= '0') && ((*c) <= '9')) - { - { - char *p; - errno = 0; - (*field_width) = strtoul(c, &p, 10); - if (0 != errno) - { - *field_width = 0U; - } - c = p - 1; - } - } - else if ('d' == (*c)) - { - (*base) = 10U; - (*flag) |= (uint32_t)kSCANF_TypeSinged; - (*flag) |= (uint32_t)kSCANF_DestInt; - } - else if ('u' == (*c)) - { - (*base) = 10U; - (*flag) |= (uint32_t)kSCANF_DestInt; - } - else if ('o' == (*c)) - { - (*base) = 8U; - (*flag) |= (uint32_t)kSCANF_DestInt; - } - else if (('x' == (*c))) - { - (*base) = 16U; - (*flag) |= (uint32_t)kSCANF_DestInt; - } - else if ('X' == (*c)) - { - (*base) = 16U; - (*flag) |= (uint32_t)kSCANF_DestInt; - } - else if ('i' == (*c)) - { - (*base) = 0U; - (*flag) |= (uint32_t)kSCANF_DestInt; - } -#if SCANF_FLOAT_ENABLE - else if (1U == StrFormatScanIsFloat(c)) - { - (*flag) |= (uint32_t)kSCANF_DestFloat; - } -#endif /* SCANF_FLOAT_ENABLE */ - else if ('c' == (*c)) - { - (*flag) |= (uint32_t)kSCANF_DestChar; - if (MAX_FIELD_WIDTH == (*field_width)) - { - (*field_width) = 1; - } - } - else if ('s' == (*c)) - { - (*flag) |= (uint32_t)kSCANF_DestString; - } - else - { - exitPending = 1U; - } - - if (1U == exitPending) - { - break; - } - else - { - c++; - } - } - *str = c; - return exitPending; -} - -/*! - * 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 "". - */ -int StrFormatScanf(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 *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; - /* How many characters are read from the input streams. */ - uint32_t n_decode = 0; - - int32_t val; - - uint8_t added; - - uint8_t exitPending = 0; - - const char *s; -#if SCANF_FLOAT_ENABLE - char *s_temp; /* MISRA C-2012 Rule 11.3 */ -#endif - - /* 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 != ScanIgnoreWhiteSpace((const char **)((void *)&c))) - { - n_decode += ScanIgnoreWhiteSpace(&p); - } - else if (0U == StrFormatScanIsFormatStarting(c)) - { - /* 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 = MAX_FIELD_WIDTH; - base = 0; - added = 0U; - - exitPending = StrFormatScanfStringHandling(&c, &flag, &field_width, &base); - - if (1U == exitPending) - { - /* Format strings are exhausted. */ - break; - } - - /* Matching strings in input streams and assign to argument. */ - if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestChar) - { - s = (const char *)p; - buf = va_arg(args_ptr, char *); - while ((0U != (field_width--)) -#if SCANF_ADVANCED_ENABLE - && ('\0' != (*p)) -#endif - ) - { -#if SCANF_ADVANCED_ENABLE - if (0U != (flag & (uint32_t)kSCANF_Suppress)) - { - p++; - } - else -#endif - { - *buf++ = *p++; -#if SCANF_ADVANCED_ENABLE - added = 1u; -#endif - } - n_decode++; - } - -#if SCANF_ADVANCED_ENABLE - if (1u == added) -#endif - { - nassigned++; - } - } - else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestString) - { - n_decode += ScanIgnoreWhiteSpace(&p); - s = p; - buf = va_arg(args_ptr, char *); - while ((0U != (field_width--)) && (*p != '\0') && (0U == ScanIsWhiteSpace(*p))) - { -#if SCANF_ADVANCED_ENABLE - if (0U != (flag & (uint32_t)kSCANF_Suppress)) - { - p++; - } - else -#endif - { - *buf++ = *p++; -#if SCANF_ADVANCED_ENABLE - added = 1u; -#endif - } - n_decode++; - } - -#if SCANF_ADVANCED_ENABLE - if (1u == added) -#endif - { - /* Add NULL to end of string. */ - *buf = '\0'; - nassigned++; - } - } - else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestInt) - { - n_decode += ScanIgnoreWhiteSpace(&p); - s = p; - val = 0; - base = StrFormatScanGetBase(base, s); - - added = StrFormatScanCheckSymbol(p, &neg); - n_decode += added; - p += added; - field_width -= added; - - s = p; - if (strlen(p) > field_width) - { - char temp[12]; - char *tempEnd; - (void)memcpy(temp, p, sizeof(temp) - 1U); - temp[sizeof(temp) - 1U] = '\0'; - errno = 0; - val = (int32_t)strtoul(temp, &tempEnd, (int)base); - if (0 != errno) - { - break; - } - p = p + (tempEnd - temp); - } - else - { - char *tempEnd; - val = 0; - errno = 0; - val = (int32_t)strtoul(p, &tempEnd, (int)base); - if (0 != errno) - { - break; - } - p = tempEnd; - } - n_decode += (uint32_t)p - (uint32_t)s; - - val *= neg; - - nassigned += StrFormatScanFillInteger(flag, &args_ptr, val); - } -#if SCANF_FLOAT_ENABLE - else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestFloat) - { - n_decode += ScanIgnoreWhiteSpace(&p); - fnum = 0.0; - errno = 0; - - fnum = strtod(p, (char **)&s_temp); - s = s_temp; /* MISRA C-2012 Rule 11.3 */ - - /* MISRA C-2012 Rule 22.9 */ - if (0 != errno) - { - break; - } - - if ((fnum < HUGE_VAL) && (fnum > -HUGE_VAL)) - { - n_decode = (uint32_t)n_decode + (uint32_t)s - (uint32_t)p; - p = s; - nassigned += StrFormatScanFillFloat(flag, &args_ptr, fnum); - } - } -#endif /* SCANF_FLOAT_ENABLE */ - else - { - break; - } - } - } - return (int)nassigned; -} diff --git a/devices/MIMXRT1052/utilities/str/fsl_str.h b/devices/MIMXRT1052/utilities/str/fsl_str.h deleted file mode 100644 index bf7adcc..0000000 --- a/devices/MIMXRT1052/utilities/str/fsl_str.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2017 NXP - * All rights reserved. - * - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#ifndef _FSL_STR_H -#define _FSL_STR_H - -#include "fsl_common.h" - -/*! - * @addtogroup debugconsole - * @{ - */ - -/******************************************************************************* - * Prototypes - ******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -/*! - * @brief A function pointer which is used when format printf log. - */ -typedef void (*printfCb)(char *buf, int32_t *indicator, char val, int len); - -/*! - * @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] fmt Format string for printf. - * @param[in] ap Arguments to printf. - * @param[in] buf pointer to the buffer - * @param cb print callbck function pointer - * - * @return Number of characters to be print - */ -int StrFormatPrintf(const char *fmt, va_list ap, char *buf, printfCb cb); - -/*! - * @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 "". - */ -int StrFormatScanf(const char *line_ptr, char *format, va_list args_ptr); - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -/*! @} */ - -#endif /* _FSL_STR_H */ diff --git a/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c b/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c deleted file mode 100644 index 2b52e5a..0000000 --- a/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "fsl_flexspi_nor_boot.h" - -/* Component ID definition, used by tools. */ -#ifndef FSL_COMPONENT_ID -#define FSL_COMPONENT_ID "platform.drivers.xip_device" -#endif - -#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1) -#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__) -__attribute__((section(".boot_hdr.ivt"), used)) -#elif defined(__ICCARM__) -#pragma location = ".boot_hdr.ivt" -#endif -/************************************* - * IVT Data - *************************************/ -const ivt image_vector_table = { - IVT_HEADER, /* IVT Header */ - IMAGE_ENTRY_ADDRESS, /* Image Entry Function */ - IVT_RSVD, /* Reserved = 0 */ - (uint32_t)DCD_ADDRESS, /* Address where DCD information is stored */ - (uint32_t)BOOT_DATA_ADDRESS, /* Address where BOOT Data Structure is stored */ - (uint32_t)&image_vector_table, /* Pointer to IVT Self (absolute address */ - (uint32_t)CSF_ADDRESS, /* Address where CSF file is stored */ - IVT_RSVD /* Reserved = 0 */ -}; - -#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__) -__attribute__((section(".boot_hdr.boot_data"), used)) -#elif defined(__ICCARM__) -#pragma location = ".boot_hdr.boot_data" -#endif -/************************************* - * Boot Data - *************************************/ -const BOOT_DATA_T boot_data = { - FLASH_BASE, /* boot start location */ - FLASH_SIZE, /* size */ - PLUGIN_FLAG, /* Plugin flag*/ - 0xFFFFFFFFU /* empty - extra data word */ -}; -#endif diff --git a/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.h b/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.h deleted file mode 100644 index a83e062..0000000 --- a/devices/MIMXRT1052/xip/fsl_flexspi_nor_boot.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2017-2020 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef __FLEXSPI_NOR_BOOT_H__ -#define __FLEXSPI_NOR_BOOT_H__ - -#include -#include "board.h" -#include "fsl_common.h" - -/*! @name Driver version */ -/*@{*/ -/*! @brief XIP_DEVICE driver version 2.0.2. */ -#define FSL_XIP_DEVICE_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) -/*@}*/ - -/************************************* - * IVT Data - *************************************/ -typedef struct _ivt_ -{ - /** @ref hdr with tag #HAB_TAG_IVT, length and HAB version fields - * (see @ref data) - */ - uint32_t hdr; - /** Absolute address of the first instruction to execute from the - * image - */ - uint32_t entry; - /** Reserved in this version of HAB: should be NULL. */ - uint32_t reserved1; - /** Absolute address of the image DCD: may be NULL. */ - uint32_t dcd; - /** Absolute address of the Boot Data: may be NULL, but not interpreted - * any further by HAB - */ - uint32_t boot_data; - /** Absolute address of the IVT.*/ - uint32_t self; - /** Absolute address of the image CSF.*/ - uint32_t csf; - /** Reserved in this version of HAB: should be zero. */ - uint32_t reserved2; -} ivt; - -#define IVT_MAJOR_VERSION 0x4 -#define IVT_MAJOR_VERSION_SHIFT 0x4 -#define IVT_MAJOR_VERSION_MASK 0xF -#define IVT_MINOR_VERSION 0x1 -#define IVT_MINOR_VERSION_SHIFT 0x0 -#define IVT_MINOR_VERSION_MASK 0xF - -#define IVT_VERSION(major, minor) \ - ((((major)&IVT_MAJOR_VERSION_MASK) << IVT_MAJOR_VERSION_SHIFT) | \ - (((minor)&IVT_MINOR_VERSION_MASK) << IVT_MINOR_VERSION_SHIFT)) - -/* IVT header */ -#define IVT_TAG_HEADER 0xD1 /**< Image Vector Table */ -#define IVT_SIZE 0x2000 -#define IVT_PAR IVT_VERSION(IVT_MAJOR_VERSION, IVT_MINOR_VERSION) -#define IVT_HEADER (IVT_TAG_HEADER | (IVT_SIZE << 8) | (IVT_PAR << 24)) - -/* Set resume entry */ -#if defined(__CC_ARM) || defined(__ARMCC_VERSION) -extern uint32_t __Vectors[]; -#define IMAGE_ENTRY_ADDRESS ((uint32_t)__Vectors) -#elif defined(__MCUXPRESSO) -extern uint32_t __Vectors[]; -#define IMAGE_ENTRY_ADDRESS ((uint32_t)__Vectors) -#elif defined(__ICCARM__) -extern uint32_t __VECTOR_TABLE[]; -#define IMAGE_ENTRY_ADDRESS ((uint32_t)__VECTOR_TABLE) -#elif defined(__GNUC__) -extern uint32_t __VECTOR_TABLE[]; -#define IMAGE_ENTRY_ADDRESS ((uint32_t)__VECTOR_TABLE) -#endif - -#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (1 == XIP_BOOT_HEADER_DCD_ENABLE) -#define DCD_ADDRESS dcd_data -#else -#define DCD_ADDRESS 0 -#endif - -#define BOOT_DATA_ADDRESS &boot_data -#define CSF_ADDRESS 0 -#define IVT_RSVD (uint32_t)(0x00000000) - -/************************************* - * Boot Data - *************************************/ -typedef struct _boot_data_ -{ - uint32_t start; /* boot start location */ - uint32_t size; /* size */ - uint32_t plugin; /* plugin flag - 1 if downloaded application is plugin */ - uint32_t placeholder; /* placehoder to make even 0x10 size */ -} BOOT_DATA_T; - -#define FLASH_BASE FlexSPI_AMBA_BASE -#if defined(BOARD_FLASH_SIZE) -#define FLASH_SIZE BOARD_FLASH_SIZE -#else -#error "Please define macro BOARD_FLASH_SIZE" -#endif -#define PLUGIN_FLAG (uint32_t)0 - -/* External Variables */ -const BOOT_DATA_T boot_data; -#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (1 == XIP_BOOT_HEADER_DCD_ENABLE) -extern const uint8_t dcd_data[]; -#endif - -#endif /* __FLEXSPI_NOR_BOOT_H__ */ diff --git a/components/.gitkeep b/lib/.gitkeep similarity index 100% rename from components/.gitkeep rename to lib/.gitkeep diff --git a/source/main.c b/source/main.c deleted file mode 100644 index 2f8dae3..0000000 --- a/source/main.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -#include "board.h" -#include "pin_mux.h" -#include "peripherals.h" - -int main(void) { - BOARD_BootClockRUN(); - BOARD_InitBootPins(); - BOARD_InitBootPeripherals(); - - BOARD_ConfigMPU(); - - for(;;) { - // - } - - return 0; -} \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..adf6a3b --- /dev/null +++ b/src/main.c @@ -0,0 +1,29 @@ +#include "board.h" +#include "clock_config.h" +#include "peripherals.h" +#include "pin_mux.h" + +/* Debug console */ +#include "fsl_debug_console.h" + +int main(void) { + BOARD_InitBootPins(); + BOARD_InitBootClocks(); + BOARD_InitBootPeripherals(); + BOARD_ConfigMPU(); + + BOARD_InitDebugConsole(); + + CLOCK_SetMode(kCLOCK_ModeRun); + + GPIO_WritePinOutput(BOARD_INITLEDPINS_LED_R_GPIO, BOARD_INITLEDPINS_LED_R_PIN, 1U); + GPIO_WritePinOutput(BOARD_INITLEDPINS_LED_G_GPIO, BOARD_INITLEDPINS_LED_G_PIN, 1U); + GPIO_WritePinOutput(BOARD_INITLEDPINS_LED_B_GPIO, BOARD_INITLEDPINS_LED_B_PIN, 1U); + + PRINTF("SmartCar!\r\n"); + PRINTF("CPU frequency: %d\r\n", CLOCK_GetCoreSysClkFreq()); + + for (;;) { + __WFI(); + } +} diff --git a/xip/fire_rt1052_pro_flexspi_nor_config.c b/xip/fire_rt1052_pro_flexspi_nor_config.c new file mode 100644 index 0000000..150fdc7 --- /dev/null +++ b/xip/fire_rt1052_pro_flexspi_nor_config.c @@ -0,0 +1,66 @@ +/* + * Copyright 2017-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fire_rt1052_pro_flexspi_nor_config.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.xip_board" +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1) +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__) +__attribute__((section(".boot_hdr.conf"), used)) +#elif defined(__ICCARM__) +#pragma location = ".boot_hdr.conf" +#endif + +const flexspi_nor_config_t spiflash_config = { + .memConfig = { + .tag = FLEXSPI_CFG_BLK_TAG, + .version = FLEXSPI_CFG_BLK_VERSION, + .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally, + .csHoldTime = 3U, + .csSetupTime = 3U, + .columnAddressWidth = 0U, + .deviceType = kFlexSpiDeviceType_SerialNOR, + .sflashPadType = kSerialFlash_4Pads, + .serialClkFreq = kFlexSpiSerialClk_133MHz, + .sflashA1Size = 16U * 1024U * 1024U, + .busyOffset = 0U, + .busyBitPolarity = 1U, + .lookupTable = { + // Fast read quad IO (EBh) [NOR_CMD_LUT_SEQ_IDX_READ] + [4U * 0 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18), + [4U * 0 + 1U] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04), + [4U * 0 + 2U] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x00, STOP, FLEXSPI_1PAD, 0x00), + + // Read SR1 (05h) [NOR_CMD_LUT_SEQ_IDX_READSTATUS] + [4U * 1 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x00), + + // Write enable (06h) [NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] + [4U * 3 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x00), + + // Page program () [NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM] + [4U * 4 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_4PAD, 0x18), + [4U * 4 + 1U] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x00, STOP, FLEXSPI_1PAD, 0x00), + + // Erase sector (20h) [NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] + [4U * 5 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18), + + // Erase block 32kB (52h) [NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK] + [4U * 8 + 0U] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x52, RADDR_SDR, FLEXSPI_1PAD, 0x18), + }, + }, + .pageSize = 256u, + .sectorSize = 4u * 1024u, + .blockSize = 32u * 1024u, +}; +#endif /* XIP_BOOT_HEADER_ENABLE */ diff --git a/xip/fire_rt1052_pro_flexspi_nor_config.h b/xip/fire_rt1052_pro_flexspi_nor_config.h new file mode 100644 index 0000000..cde0c9b --- /dev/null +++ b/xip/fire_rt1052_pro_flexspi_nor_config.h @@ -0,0 +1,267 @@ +/* + * Copyright 2017-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef __FIRE_RT1052_PRO_FLEXSPI_NOR_CONFIG__ +#define __FIRE_RT1052_PRO_FLEXSPI_NOR_CONFIG__ + +#include +#include +#include "fsl_common.h" + +/*! @name Driver version */ +/*@{*/ +/*! @brief XIP_BOARD driver version 2.0.1. */ +#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) +/*@}*/ + +/* FLEXSPI memory config block related defintions */ +#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian +#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0 +#define FLEXSPI_CFG_BLK_SIZE (512) + +/* FLEXSPI Feature related definitions */ +#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1 + +/* Lookup table related defintions */ +#define CMD_INDEX_READ 0 +#define CMD_INDEX_READSTATUS 1 +#define CMD_INDEX_WRITEENABLE 2 +#define CMD_INDEX_WRITE 4 + +#define CMD_LUT_SEQ_IDX_READ 0 +#define CMD_LUT_SEQ_IDX_READSTATUS 1 +#define CMD_LUT_SEQ_IDX_WRITEENABLE 3 +#define CMD_LUT_SEQ_IDX_WRITE 9 + +#define CMD_SDR 0x01 +#define CMD_DDR 0x21 +#define RADDR_SDR 0x02 +#define RADDR_DDR 0x22 +#define CADDR_SDR 0x03 +#define CADDR_DDR 0x23 +#define MODE1_SDR 0x04 +#define MODE1_DDR 0x24 +#define MODE2_SDR 0x05 +#define MODE2_DDR 0x25 +#define MODE4_SDR 0x06 +#define MODE4_DDR 0x26 +#define MODE8_SDR 0x07 +#define MODE8_DDR 0x27 +#define WRITE_SDR 0x08 +#define WRITE_DDR 0x28 +#define READ_SDR 0x09 +#define READ_DDR 0x29 +#define LEARN_SDR 0x0A +#define LEARN_DDR 0x2A +#define DATSZ_SDR 0x0B +#define DATSZ_DDR 0x2B +#define DUMMY_SDR 0x0C +#define DUMMY_DDR 0x2C +#define DUMMY_RWDS_SDR 0x0D +#define DUMMY_RWDS_DDR 0x2D +#define JMP_ON_CS 0x1F +#define STOP 0 + +#define FLEXSPI_1PAD 0 +#define FLEXSPI_2PAD 1 +#define FLEXSPI_4PAD 2 +#define FLEXSPI_8PAD 3 + +#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ + (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \ + FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1)) + +//!@brief Definitions for FlexSPI Serial Clock Frequency +typedef enum _FlexSpiSerialClockFreq +{ + kFlexSpiSerialClk_30MHz = 1, + kFlexSpiSerialClk_50MHz = 2, + kFlexSpiSerialClk_60MHz = 3, + kFlexSpiSerialClk_75MHz = 4, + kFlexSpiSerialClk_80MHz = 5, + kFlexSpiSerialClk_100MHz = 6, + kFlexSpiSerialClk_133MHz = 7, + kFlexSpiSerialClk_166MHz = 8, +} flexspi_serial_clk_freq_t; + +//!@brief FlexSPI clock configuration type +enum +{ + kFlexSpiClk_SDR, //!< Clock configure for SDR mode + kFlexSpiClk_DDR, //!< Clock configurat for DDR mode +}; + +//!@brief FlexSPI Read Sample Clock Source definition +typedef enum _FlashReadSampleClkSource +{ + kFlexSPIReadSampleClk_LoopbackInternally = 0, + kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1, + kFlexSPIReadSampleClk_LoopbackFromSckPad = 2, + kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3, +} flexspi_read_sample_clk_t; + +//!@brief Misc feature bit definitions +enum +{ + kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable + kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable + kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable + kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable + kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable + kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable + kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication. +}; + +//!@brief Flash Type Definition +enum +{ + kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR + kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND + kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH + kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND + kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs +}; + +//!@brief Flash Pad Definitions +enum +{ + kSerialFlash_1Pad = 1, + kSerialFlash_2Pads = 2, + kSerialFlash_4Pads = 4, + kSerialFlash_8Pads = 8, +}; + +//!@brief FlexSPI LUT Sequence structure +typedef struct _lut_sequence +{ + uint8_t seqNum; //!< Sequence Number, valid number: 1-16 + uint8_t seqId; //!< Sequence Index, valid number: 0-15 + uint16_t reserved; +} flexspi_lut_seq_t; + +//!@brief Flash Configuration Command Type +enum +{ + kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc + kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command + kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode + kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode + kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode + kDeviceConfigCmdType_Reset, //!< Reset device command +}; + +//!@brief FlexSPI Memory Configuration Block +typedef struct _FlexSPIConfig +{ + uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL + uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use + uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 + uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3 + uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3 + uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For + //! Serial NAND, need to refer to datasheet + uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable + uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch, + //! Generic configuration, etc. + uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for + //! DPI/QPI/OPI switch or reset command + flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt + //! sequence number, [31:16] Reserved + uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration + uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable + uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe + flexspi_lut_seq_t + configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq + uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use + uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands + uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use + uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more + //! details + uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details + uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal + uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot + //! Chapter for more details + uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot + //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH + uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use + uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1 + uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2 + uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1 + uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2 + uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value + uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value + uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value + uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value + uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command + uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands + uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns + uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31 + uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - + //! busy flag is 0 when flash device is busy + uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences + flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences + uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use +} flexspi_mem_config_t; + +/* */ +#define NOR_CMD_INDEX_READ CMD_INDEX_READ //!< 0 +#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS //!< 1 +#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2 +#define NOR_CMD_INDEX_ERASESECTOR 3 //!< 3 +#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE //!< 4 +#define NOR_CMD_INDEX_CHIPERASE 5 //!< 5 +#define NOR_CMD_INDEX_DUMMY 6 //!< 6 +#define NOR_CMD_INDEX_ERASEBLOCK 7 //!< 7 + +#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0 READ LUT sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \ + CMD_LUT_SEQ_IDX_READSTATUS //!< 1 Read Status LUT sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \ + 2 //!< 2 Read status DPI/QPI/OPI sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \ + CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3 Write Enable sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \ + 4 //!< 4 Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5 Erase Sector sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8 //!< 8 Erase Block sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \ + CMD_LUT_SEQ_IDX_WRITE //!< 9 Program sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block +#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block +#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \ + 14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block +#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \ + 15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk + +/* + * Serial NOR configuration block + */ +typedef struct _flexspi_nor_config +{ + flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI + uint32_t pageSize; //!< Page size of Serial NOR + uint32_t sectorSize; //!< Sector size of Serial NOR + uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command + uint8_t isUniformBlockSize; //!< Sector/Block size is the same + uint8_t reserved0[2]; //!< Reserved for future use + uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3 + uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command + uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false + uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution + uint32_t blockSize; //!< Block size + uint32_t reserve2[11]; //!< Reserved for future use +} flexspi_nor_config_t; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif +#endif /* __LQ_VA1_FLEXSPI_NOR_CONFIG__ */

-rf?1s}W_B)^-T7jM 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